46 integer,
public,
parameter :: &
47 SPECIES_JELLIUM = 3, & !< jellium sphere.
73 real(real64) :: jradius
84 real(real64) :: jthick
95 character(len=200),
public :: density_formula
112 character(len=1024),
public :: potential_formula
121 character(len=200),
public :: density_formula
128 procedure jellium_sphere_constructor
132 procedure jellium_slab_constructor
136 procedure jellium_charge_constructor
148 procedure species_charge_density_constructor
158 character(len=*),
intent(in) :: label
159 integer,
intent(in) :: index
175 type(jellium_slab_t),
intent(inout) :: this
186 class(jellium_sphere_t),
pointer :: spec
187 character(len=*),
intent(in) :: label
188 integer,
intent(in) :: index
217 character(len=*),
intent(in) :: label
218 integer,
intent(in) :: index
227 spec%density_formula =
""
248 character(len=*),
intent(in) :: label
249 integer,
intent(in) :: index
277 character(len=*),
intent(in) :: label
278 integer,
intent(in) :: index
286 spec%potential_formula =
""
308 character(len=*),
intent(in) :: label
309 integer,
intent(in) :: index
318 spec%density_formula =
""
336 real(real64)
pure function jellium_get_omega(spec)
338 jellium_get_omega = spec%omega
351 real(real64),
intent(in) :: radius
352 spec%jradius = radius
356 real(real64)
pure function jellium_thick(spec)
364 real(real64),
intent(in) :: thick
384 integer,
intent(in) :: dim
385 real(real64),
intent(in) :: xx(:)
386 real(real64),
intent(in) :: r
388 real(real64) :: pot_re, pot_im
392 call parse_expression(pot_re, pot_im, dim, xx, r, m_zero, spec%potential_formula)
402 type(namespace_t),
intent(in) :: namespace
403 integer,
intent(in) :: nspin
404 integer,
intent(in) :: dim
406 integer :: is, i, n1, n2, n3
414 spec%iwf_i(i, is) = i
415 spec%iwf_n(i, is) = 0
416 spec%iwf_l(i, is) = 0
417 spec%iwf_m(i, is) = 0
418 spec%iwf_j(i) = m_zero
428 spec%iwf_i(i, is) = n1
429 spec%iwf_n(i, is) = 1
430 spec%iwf_l(i, is) = n2
431 spec%iwf_m(i, is) = 0
432 spec%iwf_j(i) = m_zero
434 if (i>spec%niwfs)
exit
436 spec%iwf_i(i, is) = n1+1
437 spec%iwf_n(i, is) = 1
438 spec%iwf_l(i, is) = n2
439 spec%iwf_m(i, is) = 0
440 spec%iwf_j(i) = m_zero
442 if (i>spec%niwfs)
exit
444 spec%iwf_i(i, is) = n1
445 spec%iwf_n(i, is) = 1
446 spec%iwf_l(i, is) = n2+1
447 spec%iwf_m(i, is) = 0
448 spec%iwf_j(i) = m_zero
450 if (i>spec%niwfs)
exit
452 n1 = n1 + 1; n2 = n2 + 1
463 spec%iwf_i(i, is) = n1
464 spec%iwf_n(i, is) = 1
465 spec%iwf_l(i, is) = n2
466 spec%iwf_m(i, is) = n3
467 spec%iwf_j(i) = m_zero
469 if (i>spec%niwfs)
exit
471 spec%iwf_i(i, is) = n1+1
472 spec%iwf_n(i, is) = 1
473 spec%iwf_l(i, is) = n2
474 spec%iwf_m(i, is) = n3
475 spec%iwf_j(i) = m_zero
477 if (i>spec%niwfs)
exit
479 spec%iwf_i(i, is) = n1
480 spec%iwf_n(i, is) = 1
481 spec%iwf_l(i, is) = n2+1
482 spec%iwf_m(i, is) = 0
483 spec%iwf_j(i) = m_zero
485 if (i>spec%niwfs)
exit
487 spec%iwf_i(i, is) = n1
488 spec%iwf_n(i, is) = 1
489 spec%iwf_l(i, is) = n2
490 spec%iwf_m(i, is) = n3+1
491 spec%iwf_j(i) = m_zero
493 if (i>spec%niwfs)
exit
495 spec%iwf_i(i, is) = n1+1
496 spec%iwf_n(i, is) = 1
497 spec%iwf_l(i, is) = n2+1
498 spec%iwf_m(i, is) = n3
499 spec%iwf_j(i) = m_zero
501 if (i>spec%niwfs)
exit
503 spec%iwf_i(i, is) = n1+1
504 spec%iwf_n(i, is) = 1
505 spec%iwf_l(i, is) = n2
506 spec%iwf_m(i, is) = n3+1
507 spec%iwf_j(i) = m_zero
509 if (i>spec%niwfs)
exit
511 spec%iwf_i(i, is) = n1
512 spec%iwf_n(i, is) = 1
513 spec%iwf_l(i, is) = n2+1
514 spec%iwf_m(i, is) = n3+1
515 spec%iwf_j(i) = m_zero
517 if (i>spec%niwfs)
exit
533 real(real64)
pure function jellium_get_iwf_radius(spec, ii, is, threshold) result(radius)
535 integer,
intent(in) :: ii
536 integer,
intent(in) :: is
537 real(real64),
optional,
intent(in) :: threshold
539 real(real64) threshold_
541 threshold_ = optional_default(threshold, 0.001_real64)
543 radius =
sqrt(-m_two*
log(threshold_)/spec%omega)
552 logical pure function jellium_is_local(spec) result(is_local)
563 type(namespace_t),
intent(in) :: namespace
564 real(real64),
intent(in) :: grid_cutoff
565 integer,
intent(in) :: filter
576 character(len=*),
intent(in) :: dir
577 type(namespace_t),
intent(in) :: namespace
578 real(real64),
intent(in) :: gmax
580 character(len=256) :: dirname
583 if (.not. mpi_grp_is_root(mpi_world))
then
589 dirname = trim(dir)//
'/'//trim(spec%get_label())
591 call io_mkdir(dirname, namespace)
593 iunit = io_open(trim(dirname)//
'/info', namespace, action=
'write')
595 write(iunit,
'(a,i3)')
'Index = ', spec%get_index()
596 write(iunit,
'(2a)')
'Label = ', trim(spec%get_label())
597 write(iunit,
'(a,f15.2)')
'z_val = ', spec%get_zval()
598 write(iunit,
'(a,f15.2)')
'mass = ', spec%get_mass()
599 write(iunit,
'(a,f15.2)')
'vdw_radius = ', spec%get_vdw_radius()
600 write(iunit,
'(a,l1)')
'local = ', spec%is_local()
604 write(iunit,
'(a,f15.2)')
'z = ', spec%get_z()
605 write(iunit,
'(a)')
'Species read from file "'//trim(spec%get_filename())//
'".'
607 write(iunit,
'(a,f15.2)')
'z = ', spec%get_z()
608 write(iunit,
'(a,f15.2)')
'jradius= ', spec%radius()
610 write(iunit,
'(a,f15.2)')
'z = ', spec%get_z()
611 write(iunit,
'(a,f15.2)')
'jthick= ', spec%thickness()
613 write(iunit,
'(2a)')
'usdef = ', trim(spec%potential_formula)
616 write(iunit,
'(a,i3)')
'hubbard_l = ', spec%get_hubbard_l()
617 write(iunit,
'(a,f15.2)')
'hubbard_U = ', spec%get_hubbard_U()
618 write(iunit,
'(a,f15.2)')
'hubbard_j = ', spec%get_hubbard_j()
619 write(iunit,
'(a,f15.2)')
'hubbard_alpha = ', spec%get_hubbard_alpha()
628 type(namespace_t),
intent(in) :: namespace
629 integer,
intent(in) :: ispin
630 integer,
intent(in) :: dim
631 logical,
optional,
intent(in) :: print_info
633 logical :: print_info_
635 real(real64) :: pot_re, pot_im, xx(dim), rr
639 print_info_ = optional_default(print_info, .
true.)
642 call spec%set_mass(units_to_atomic(unit_amu, spec%get_mass()))
644 spec%has_density = .false.
648 if (print_info_)
then
649 write(message(1),
'(a,a,a)')
'Species "',trim(spec%get_label()),
'" is a user-defined potential.'
650 i = min(237, len_trim(spec%potential_formula)-1)
651 write(message(2),
'(a,a)')
' Potential = ', trim(spec%potential_formula(1:i))
652 if (len(trim(spec%potential_formula)) > 237)
then
653 message(2) = trim(message(2))//
'...'
655 call messages_info(2, namespace=namespace)
657 spec%niwfs = int(max(2*spec%get_zval(), m_one))
662 call parse_expression(pot_re, pot_im, dim, xx, rr, m_zero, spec%potential_formula)
663 spec%omega =
sqrt(abs(m_two / 1.0e-4_real64 * pot_re))
665 if (spec%omega <= m_zero) spec%omega = 0.1_real64
668 if (print_info_)
then
669 write(message(1),
'(a)')
'Species read from file "'//trim(spec%get_filename())//
'".'
670 call messages_info(1, namespace=namespace)
672 spec%niwfs = 2*nint(spec%get_zval()+m_half)
673 spec%omega = 0.1_real64
676 if (print_info_)
then
677 write(message(1),
'(a,a,a)')
'Species "', trim(spec%get_label()), &
678 '" is a jellium sphere / approximated point particle.'
679 write(message(2),
'(a,f11.6)')
' Valence charge = ', spec%get_zval()
680 write(message(3),
'(a,f11.6)')
' Radius [a.u] = ', spec%jradius
681 write(message(4),
'(a,f11.6)')
' Rs [a.u] = ', spec%jradius * spec%get_zval() ** (-m_one/m_three)
682 call messages_info(4, namespace=namespace)
684 spec%niwfs = species_closed_shell_size(2*nint(spec%get_zval()+m_half))
685 spec%omega = 0.1_real64
688 if (print_info_)
then
689 write(message(1),
'(a,a,a)')
'Species "',trim(spec%get_label()),
'" is a jellium slab.'
690 write(message(2),
'(a,f11.6)')
' Valence charge = ', spec%get_zval()
691 write(message(3),
'(a,f11.6)')
' Thickness [a.u] = ', spec%jthick
694 call messages_info(3, namespace=namespace)
696 spec%niwfs = 2*nint(spec%get_zval()+m_half)
697 spec%omega = 0.1_real64
700 spec%niwfs = int(max(2*spec%get_zval(), m_one))
701 spec%omega = spec%get_zval()
702 spec%has_density = .
true.
703 if (print_info_)
then
704 write(message(1),
'(a,a,a)')
'Species "', trim(spec%get_label()),
'" is a distribution of charge:'
705 write(message(2),
'(a,a,a)')
' rho is enclosed in volume defined by the "', &
706 trim(spec%density_formula),
'" block'
707 write(message(3),
'(a,f11.6)')
' Z = ', spec%get_zval()
708 call messages_info(3, namespace=namespace)
712 spec%niwfs = int(max(2*spec%get_zval(), m_one))
713 spec%omega = spec%get_zval()
714 spec%has_density = .
true.
715 if (print_info_)
then
716 write(message(1),
'(a,a,a)')
'Species "', trim(spec%get_label()),
'" is a distribution of charge:'
717 write(message(2),
'(a,a)')
' rho = ', trim(spec%density_formula)
718 write(message(3),
'(a,f11.6)')
' Z = ', spec%get_zval()
719 call messages_info(3, namespace=namespace)
722 call messages_input_error(namespace,
'Species',
'Unknown species type')
726 spec%niwfs = max(5, spec%niwfs)
728 safe_allocate(spec%iwf_n(1:spec%niwfs, 1:ispin))
729 safe_allocate(spec%iwf_l(1:spec%niwfs, 1:ispin))
730 safe_allocate(spec%iwf_m(1:spec%niwfs, 1:ispin))
731 safe_allocate(spec%iwf_i(1:spec%niwfs, 1:ispin))
732 safe_allocate(spec%iwf_j(1:spec%niwfs))
734 call spec%iwf_fix_qn(namespace, ispin, dim)
736 write(message(1),
'(a,i6,a,i6)')
'Number of orbitals: ', spec%niwfs
737 if (print_info_)
call messages_info(1, namespace=namespace)
744 logical pure function jellium_user_defined(spec)
double log(double __x) __attribute__((__nothrow__
double sqrt(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
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)
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...