46 integer,
public,
parameter :: &
47 SPECIES_JELLIUM = 3, & !< jellium sphere.
73 real(real64) :: jradius
84 real(real64) :: jthick
96 character(len=200),
public :: density_formula
113 character(len=1024),
public :: potential_formula
122 character(len=200),
public :: density_formula
129 procedure jellium_sphere_constructor
133 procedure jellium_slab_constructor
137 procedure jellium_charge_constructor
149 procedure species_charge_density_constructor
159 character(len=*),
intent(in) :: label
160 integer,
intent(in) :: index
176 type(jellium_slab_t),
intent(inout) :: this
188 character(len=*),
intent(in) :: label
189 integer,
intent(in) :: index
206 type(jellium_sphere_t),
intent(inout) :: this
218 character(len=*),
intent(in) :: label
219 integer,
intent(in) :: index
228 spec%density_formula =
""
249 character(len=*),
intent(in) :: label
250 integer,
intent(in) :: index
278 character(len=*),
intent(in) :: label
279 integer,
intent(in) :: index
287 spec%potential_formula =
""
309 character(len=*),
intent(in) :: label
310 integer,
intent(in) :: index
319 spec%density_formula =
""
337 real(real64)
pure function jellium_get_omega(spec)
339 jellium_get_omega = spec%omega
352 real(real64),
intent(in) :: radius
353 spec%jradius = radius
365 real(real64),
intent(in) :: thick
370 character(len=200) pure function jellium_rho_string(spec)
385 integer,
intent(in) :: dim
386 real(real64),
intent(in) :: xx(:)
387 real(real64),
intent(in) :: r
389 real(real64) :: pot_re, pot_im
393 call parse_expression(pot_re, pot_im, dim, xx, r, m_zero, spec%potential_formula)
405 real(real64) function jellium_userdef_omega(spec, dim) result(omega)
407 integer,
intent(in) :: dim
409 real(real64),
parameter :: delta = 0.01_real64
410 real(real64),
parameter :: omega_default = 0.1_real64
411 real(real64) :: xx(dim), vv(3), curvature, dv2
412 integer :: idir, ii, ndir
421 xx(idir) = ii * delta
426 dv2 = (vv(3) - m_two*vv(2) + vv(1)) / delta**2
427 if (dv2 > m_zero)
then
428 curvature = curvature + dv2
434 omega =
sqrt(curvature / ndir)
438 omega = omega_default
448 type(namespace_t),
intent(in) :: namespace
449 integer,
intent(in) :: nspin
450 integer,
intent(in) :: dim
452 integer :: is, i, n1, n2, n3
460 spec%iwf_i(i, is) = i
461 spec%iwf_n(i, is) = 0
462 spec%iwf_l(i, is) = 0
463 spec%iwf_m(i, is) = 0
464 spec%iwf_j(i) = m_zero
474 spec%iwf_i(i, is) = n1
475 spec%iwf_n(i, is) = 1
476 spec%iwf_l(i, is) = n2
477 spec%iwf_m(i, is) = 0
478 spec%iwf_j(i) = m_zero
480 if (i>spec%niwfs)
exit
482 spec%iwf_i(i, is) = n1+1
483 spec%iwf_n(i, is) = 1
484 spec%iwf_l(i, is) = n2
485 spec%iwf_m(i, is) = 0
486 spec%iwf_j(i) = m_zero
488 if (i>spec%niwfs)
exit
490 spec%iwf_i(i, is) = n1
491 spec%iwf_n(i, is) = 1
492 spec%iwf_l(i, is) = n2+1
493 spec%iwf_m(i, is) = 0
494 spec%iwf_j(i) = m_zero
496 if (i>spec%niwfs)
exit
498 n1 = n1 + 1; n2 = n2 + 1
509 spec%iwf_i(i, is) = n1
510 spec%iwf_n(i, is) = 1
511 spec%iwf_l(i, is) = n2
512 spec%iwf_m(i, is) = n3
513 spec%iwf_j(i) = m_zero
515 if (i>spec%niwfs)
exit
517 spec%iwf_i(i, is) = n1+1
518 spec%iwf_n(i, is) = 1
519 spec%iwf_l(i, is) = n2
520 spec%iwf_m(i, is) = n3
521 spec%iwf_j(i) = m_zero
523 if (i>spec%niwfs)
exit
525 spec%iwf_i(i, is) = n1
526 spec%iwf_n(i, is) = 1
527 spec%iwf_l(i, is) = n2+1
528 spec%iwf_m(i, is) = 0
529 spec%iwf_j(i) = m_zero
531 if (i>spec%niwfs)
exit
533 spec%iwf_i(i, is) = n1
534 spec%iwf_n(i, is) = 1
535 spec%iwf_l(i, is) = n2
536 spec%iwf_m(i, is) = n3+1
537 spec%iwf_j(i) = m_zero
539 if (i>spec%niwfs)
exit
541 spec%iwf_i(i, is) = n1+1
542 spec%iwf_n(i, is) = 1
543 spec%iwf_l(i, is) = n2+1
544 spec%iwf_m(i, is) = n3
545 spec%iwf_j(i) = m_zero
547 if (i>spec%niwfs)
exit
549 spec%iwf_i(i, is) = n1+1
550 spec%iwf_n(i, is) = 1
551 spec%iwf_l(i, is) = n2
552 spec%iwf_m(i, is) = n3+1
553 spec%iwf_j(i) = m_zero
555 if (i>spec%niwfs)
exit
557 spec%iwf_i(i, is) = n1
558 spec%iwf_n(i, is) = 1
559 spec%iwf_l(i, is) = n2+1
560 spec%iwf_m(i, is) = n3+1
561 spec%iwf_j(i) = m_zero
563 if (i>spec%niwfs)
exit
579 real(real64)
pure function jellium_get_iwf_radius(spec, ii, is, threshold) result(radius)
581 integer,
intent(in) :: ii
582 integer,
intent(in) :: is
583 real(real64),
optional,
intent(in) :: threshold
587 real(real64) threshold_
589 threshold_ = optional_default(threshold, 0.001_real64)
594 nmax = max(
floor(spec%get_zval()/ m_two - m_one), 1)
595 radius =
sqrt(-m_two*
log(threshold_)/spec%omega) *
sqrt(nmax + m_half)
604 logical pure function jellium_is_local(spec) result(is_local)
615 type(namespace_t),
intent(in) :: namespace
616 real(real64),
intent(in) :: grid_cutoff
617 integer,
intent(in) :: filter
619 real(real64) :: spacing
625 spacing = m_pi / grid_cutoff
626 this%omega = min(this%omega, m_one/spacing**2)
634 character(len=*),
intent(in) :: dir
635 type(namespace_t),
intent(in) :: namespace
636 real(real64),
intent(in) :: gmax
638 character(len=256) :: dirname
641 if (.not. mpi_world%is_root())
then
647 dirname = trim(dir)//
'/'//trim(spec%get_label())
649 call io_mkdir(dirname, namespace)
651 iunit = io_open(trim(dirname)//
'/info', namespace, action=
'write')
653 write(iunit,
'(a,i3)')
'Index = ', spec%get_index()
654 write(iunit,
'(2a)')
'Label = ', trim(spec%get_label())
655 write(iunit,
'(a,f15.2)')
'z_val = ', spec%get_zval()
656 write(iunit,
'(a,f15.2)')
'mass = ', spec%get_mass()
657 write(iunit,
'(a,f15.2)')
'vdw_radius = ', spec%get_vdw_radius()
658 write(iunit,
'(a,l1)')
'local = ', spec%is_local()
662 write(iunit,
'(a,f15.2)')
'z = ', spec%get_z()
663 write(iunit,
'(a)')
'Species read from file "'//trim(spec%get_filename())//
'".'
665 write(iunit,
'(a,f15.2)')
'z = ', spec%get_z()
666 write(iunit,
'(a,f15.2)')
'jradius= ', spec%radius()
668 write(iunit,
'(a,f15.2)')
'z = ', spec%get_z()
669 write(iunit,
'(a,f15.2)')
'jthick= ', spec%thickness()
671 write(iunit,
'(2a)')
'usdef = ', trim(spec%potential_formula)
674 write(iunit,
'(a,i3)')
'hubbard_l = ', spec%get_hubbard_l()
675 write(iunit,
'(a,f15.2)')
'hubbard_U = ', spec%get_hubbard_U()
676 write(iunit,
'(a,f15.2)')
'hubbard_j = ', spec%get_hubbard_j()
677 write(iunit,
'(a,f15.2)')
'hubbard_alpha = ', spec%get_hubbard_alpha()
684 subroutine jellium_build(spec, namespace, ispin, dim, print_info)
686 type(namespace_t),
intent(in) :: namespace
687 integer,
intent(in) :: ispin
688 integer,
intent(in) :: dim
689 logical,
optional,
intent(in) :: print_info
691 logical :: print_info_
696 print_info_ = optional_default(print_info, .
true.)
699 call spec%set_mass(units_to_atomic(unit_amu, spec%get_mass()))
701 spec%has_density = .false.
705 if (print_info_)
then
706 write(message(1),
'(a,a,a)')
'Species "',trim(spec%get_label()),
'" is a user-defined potential.'
707 i = min(237, len_trim(spec%potential_formula)-1)
708 write(message(2),
'(a,a)')
' Potential = ', trim(spec%potential_formula(1:i))
709 if (len(trim(spec%potential_formula)) > 237)
then
710 message(2) = trim(message(2))//
'...'
712 call messages_info(2, namespace=namespace)
714 spec%niwfs = int(max(2*spec%get_zval(), m_one))
722 if (print_info_)
then
723 write(message(1),
'(a)')
'Species read from file "'//trim(spec%get_filename())//
'".'
724 call messages_info(1, namespace=namespace)
726 spec%niwfs = 2*nint(spec%get_zval()+m_half)
727 spec%omega = 0.1_real64
730 if (print_info_)
then
731 write(message(1),
'(a,a,a)')
'Species "', trim(spec%get_label()), &
732 '" is a jellium sphere / approximated point particle.'
733 write(message(2),
'(a,f11.6)')
' Valence charge = ', spec%get_zval()
734 write(message(3),
'(a,f11.6)')
' Radius [a.u] = ', spec%jradius
735 write(message(4),
'(a,f11.6)')
' Rs [a.u] = ', spec%jradius * spec%get_zval() ** (-m_one/m_three)
736 call messages_info(4, namespace=namespace)
738 spec%niwfs = species_closed_shell_size(2*nint(spec%get_zval()+m_half))
739 spec%omega = 0.1_real64
742 if (print_info_)
then
743 write(message(1),
'(a,a,a)')
'Species "',trim(spec%get_label()),
'" is a jellium slab.'
744 write(message(2),
'(a,f11.6)')
' Valence charge = ', spec%get_zval()
745 write(message(3),
'(a,f11.6)')
' Thickness [a.u] = ', spec%jthick
748 call messages_info(3, namespace=namespace)
750 spec%niwfs = 2*nint(spec%get_zval()+m_half)
751 spec%omega = 0.1_real64
754 spec%niwfs = int(max(2*spec%get_zval(), m_one))
755 spec%omega = spec%get_zval()
756 spec%has_density = .
true.
757 if (print_info_)
then
758 write(message(1),
'(a,a,a)')
'Species "', trim(spec%get_label()),
'" is a distribution of charge:'
759 write(message(2),
'(a,a,a)')
' rho is enclosed in volume defined by the "', &
760 trim(spec%density_formula),
'" block'
761 write(message(3),
'(a,f11.6)')
' Z = ', spec%get_zval()
762 call messages_info(3, namespace=namespace)
766 spec%niwfs = int(max(2*spec%get_zval(), m_one))
767 spec%omega = spec%get_zval()
768 spec%has_density = .
true.
769 if (print_info_)
then
770 write(message(1),
'(a,a,a)')
'Species "', trim(spec%get_label()),
'" is a distribution of charge:'
771 write(message(2),
'(a,a)')
' rho = ', trim(spec%density_formula)
772 write(message(3),
'(a,f11.6)')
' Z = ', spec%get_zval()
773 call messages_info(3, namespace=namespace)
776 call messages_input_error(namespace,
'Species',
'Unknown species type')
780 spec%niwfs = max(5, spec%niwfs)
782 safe_allocate(spec%iwf_n(1:spec%niwfs, 1:ispin))
783 safe_allocate(spec%iwf_l(1:spec%niwfs, 1:ispin))
784 safe_allocate(spec%iwf_m(1:spec%niwfs, 1:ispin))
785 safe_allocate(spec%iwf_i(1:spec%niwfs, 1:ispin))
786 safe_allocate(spec%iwf_j(1:spec%niwfs))
788 call spec%iwf_fix_qn(namespace, ispin, dim)
790 write(message(1),
'(a,i6,a,i6)')
'Number of orbitals: ', spec%niwfs
791 if (print_info_)
call messages_info(1, namespace=namespace)
798 logical pure function jellium_user_defined(spec)
816 real(real64)
pure function jellium_slab_density(slab, box_dim) result(density)
818 real(real64),
intent(in) :: box_dim(:)
821 density = slab%get_zval() / (box_dim(1) * box_dim(2) * m_four * slab%jthick)
double log(double __x) __attribute__((__nothrow__
double sqrt(double __x) __attribute__((__nothrow__
double floor(double __x) __attribute__((__nothrow__
real(real64), parameter, public m_zero
real(real64), parameter, public m_half
real(real64), parameter, public m_one
subroutine species_user_defined_finalize(this)
real(real64) pure function jellium_get_omega(spec)
real(real64) pure function jellium_radius(spec)
logical pure function jellium_user_defined(spec)
Is the species user-defined or not.
logical pure function jellium_is_local(spec)
pure subroutine jellium_set_thickness(spec, thick)
subroutine jellium_iwf_fix_qn(spec, namespace, nspin, dim)
set up quantum numbers of orbitals
integer, parameter, public species_charge_density
user-defined function for charge density
integer, parameter, public species_jellium_charge_density
jellium volume read from file
real(real64) function jellium_userdef_omega(spec, dim)
Estimate the frequency of the Gaussian envelope, exp(-omega*r^2/2), used to build the guess orbitals ...
subroutine jellium_charge_finalize(this)
class(jellium_slab_t) function, pointer jellium_slab_constructor(label, index)
class(species_user_defined_t) function, pointer species_user_defined_constructor(label, index)
subroutine jellium_slab_finalize(this)
subroutine jellium_build(spec, namespace, ispin, dim, print_info)
real(real64) pure function jellium_get_iwf_radius(spec, ii, is, threshold)
Return radius outside which orbital is less than threshold value 0.001.
class(jellium_charge_t) function, pointer jellium_charge_constructor(label, index)
class(jellium_sphere_t) function, pointer jellium_sphere_constructor(label, index)
pure subroutine jellium_set_radius(spec, radius)
subroutine species_charge_density_finalize(this)
character(len=200) pure function jellium_rho_string(spec)
subroutine species_from_file_finalize(this)
real(real64) pure function jellium_thick(spec)
real(real64) pure function jellium_slab_density(slab, box_dim)
Returns the electron density of a jellium slab.
complex(real64) function jellium_userdef_pot(spec, dim, xx, r)
integer, parameter, public species_from_file
class(species_from_file_t) function, pointer species_from_file_constructor(label, index)
integer, parameter, public species_usdef
user-defined function for local potential
subroutine jellium_sphere_finalize(this)
class(species_charge_density_t) function, pointer species_charge_density_constructor(label, index)
integer, parameter, public species_jellium_slab
jellium slab.
subroutine jellium_init_potential(this, namespace, grid_cutoff, filter)
Some operations like filtering of the potentials.
character(len=200) pure function species_rho_string(spec)
subroutine jellium_debug(spec, dir, namespace, gmax)
subroutine, public species_end(species)
subroutine, public species_init(this, label, index)
Initializes a species object. This should be the first routine to be called (before species_read and ...
brief This module defines the class unit_t which is used by the unit_systems_oct_m module.
This module defines the unit system, used for input and output.
An abstract class for species. Derived classes include jellium, all electron, and pseudopotential spe...