Octopus
allelectron.F90
Go to the documentation of this file.
1!! Copyright (C) 2002-2006 M. Marques, A. Castro, A. Rubio, G. Bertsch
2!! Copyright (C) 2023-2024 N. Tancogne-Dejean
3!!
4!! This program is free software; you can redistribute it and/or modify
5!! it under the terms of the GNU General Public License as published by
6!! the Free Software Foundation; either version 2, or (at your option)
7!! any later version.
8!!
9!! This program is distributed in the hope that it will be useful,
10!! but WITHOUT ANY WARRANTY; without even the implied warranty of
11!! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12!! GNU General Public License for more details.
13!!
14!! You should have received a copy of the GNU General Public License
15!! along with this program; if not, write to the Free Software
16!! Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
17!! 02110-1301, USA.
18!!
19#include "global.h"
20
22 use atomic_oct_m
23 use debug_oct_m
24 use global_oct_m
25 use io_oct_m
27 use logrid_oct_m
28 use math_oct_m
30 use mpi_oct_m
33 use ps_oct_m
36 use unit_oct_m
38
39 implicit none
40
41 private
42 public :: &
48
50 type, abstract, extends(species_t) :: allelectron_t
51 private
52
53 real(real64) :: omega
54 real(real64) :: sigma = -m_one
55
56 type(valconf_t), public :: conf
57
58 contains
59 procedure :: get_sigma => allelectron_sigma
60 procedure :: get_omega => allelectron_omega
61 procedure :: set_sigma => allelectron_set_sigma
62 procedure :: iwf_fix_qn => allelectron_iwf_fix_qn
63 procedure :: get_iwf_radius => allelectron_get_iwf_radius
64 procedure :: is_local => allelectron_is_local
65 procedure :: init_potential => allelectron_init_potential
66 procedure :: debug => allelectron_debug
67 procedure :: build => allelectron_build
68 procedure :: is_full => allelectron_is_full
69 procedure :: represents_real_atom => allelectron_represents_real_atom
70 end type allelectron_t
71
72 type, extends(allelectron_t) :: soft_coulomb_t
73 private
74
75 real(real64) :: softening
76
77 contains
78 procedure :: get_softening => soft_coulomb_softening
79 procedure :: set_softening => soft_coulomb_set_softening
80 end type soft_coulomb_t
81
82 type, extends(allelectron_t) :: full_anc_t
83 private
84
85 real(real64) :: aa = -m_one
86 real(real64) :: bb = m_zero
87
88 contains
89 procedure :: a => full_anc_a
90 procedure :: b => full_anc_b
91 procedure :: set_a => full_anc_set_a
92 end type full_anc_t
93
94 type, extends(allelectron_t) :: full_delta_t
95 private
96
97 contains
98 end type full_delta_t
99
100
101 type, extends(allelectron_t) :: full_gaussian_t
102 private
103
104 contains
105 end type full_gaussian_t
106
107
108 interface soft_coulomb_t
109 procedure soft_coulomb_constructor
110 end interface soft_coulomb_t
111
112 interface full_delta_t
113 procedure full_delta_constructor
114 end interface full_delta_t
115
116 interface full_gaussian_t
117 procedure full_gaussian_constructor
118 end interface full_gaussian_t
119
120 interface full_anc_t
121 procedure full_anc_constructor
122 end interface full_anc_t
123
124 real(real64) :: alpha_p
125 type(logrid_t), pointer :: grid_p
126
127contains
128
129
130 ! ---------------------------------------------------------
131 function soft_coulomb_constructor(label, index) result(spec)
132 class(soft_coulomb_t), pointer :: spec
133 character(len=*), intent(in) :: label
134 integer, intent(in) :: index
135
137
138 safe_allocate(spec)
139
140 call species_init(spec, label, index)
141
142 spec%sigma = -m_one
143 spec%omega = m_zero
144 spec%softening = -m_one
145
148
149 ! ---------------------------------------------------------
151 function full_anc_constructor(label, index, a) result(spec)
152 class(full_anc_t), pointer :: spec
153 character(len=*), intent(in) :: label
154 integer, intent(in) :: index
155 real(real64), intent(in) :: a
159 safe_allocate(spec)
161 call species_init(spec, label, index)
163 spec%sigma = -m_one
164 spec%omega = m_zero
165 spec%aa = a
166 spec%bb = m_zero ! determined later by the code
167
169 end function full_anc_constructor
170
171 ! ---------------------------------------------------------
173 function full_delta_constructor(label, index, sigma) result(spec)
174 class(full_delta_t), pointer :: spec
175 character(len=*), intent(in) :: label
176 integer, intent(in) :: index
177 real(real64), intent(in) :: sigma
180
181 safe_allocate(spec)
183 call species_init(spec, label, index)
184 spec%sigma = sigma
185 spec%omega = m_zero
186
188 end function full_delta_constructor
189
190
191 ! ---------------------------------------------------------
193 function full_gaussian_constructor(label, index, sigma) result(spec)
194 class(full_gaussian_t), pointer :: spec
195 character(len=*), intent(in) :: label
196 integer, intent(in) :: index
197 real(real64), intent(in) :: sigma
198
200
201 safe_allocate(spec)
202
203 call species_init(spec, label, index)
204
205 spec%sigma = sigma
206 spec%omega = m_zero
207
209 end function full_gaussian_constructor
210
211
212 ! ---------------------------------------------------------
213 real(real64) pure function allelectron_sigma(spec)
214 class(allelectron_t), intent(in) :: spec
215 allelectron_sigma = spec%sigma
216 end function allelectron_sigma
218 ! ---------------------------------------------------------
219 pure subroutine allelectron_set_sigma(spec, sigma)
220 class(allelectron_t), intent(inout) :: spec
221 real(real64), intent(in) :: sigma
222 spec%sigma = sigma
223 end subroutine allelectron_set_sigma
225 ! ---------------------------------------------------------
226 real(real64) pure function allelectron_omega(spec)
227 class(allelectron_t), intent(in) :: spec
228 allelectron_omega = spec%omega
229 end function allelectron_omega
230
231 ! ---------------------------------------------------------
232 real(real64) pure function full_anc_a(spec)
233 class(full_anc_t), intent(in) :: spec
234 full_anc_a = spec%aa
235 end function full_anc_a
236
237 ! ---------------------------------------------------------
238 real(real64) pure function full_anc_b(spec)
239 class(full_anc_t), intent(in) :: spec
240 full_anc_b = spec%bb
241 end function full_anc_b
242
243 ! ---------------------------------------------------------
244 pure subroutine full_anc_set_a(spec, a)
245 class(full_anc_t), intent(inout) :: spec
246 real(real64), intent(in) :: a
247 spec%aa = a
248 end subroutine full_anc_set_a
249
250 ! ---------------------------------------------------------
252 real(real64) pure function soft_coulomb_softening(spec)
253 class(soft_coulomb_t), intent(in) :: spec
254 soft_coulomb_softening = spec%softening
255 end function soft_coulomb_softening
256
257 ! ---------------------------------------------------------
259 pure subroutine soft_coulomb_set_softening(spec, soft)
260 class(soft_coulomb_t), intent(inout) :: spec
261 real(real64), intent(in) :: soft
262 spec%softening = soft
263 end subroutine soft_coulomb_set_softening
264
265
266 ! ---------------------------------------------------------
268 subroutine allelectron_iwf_fix_qn(spec, namespace, nspin, dim)
269 class(allelectron_t), intent(inout) :: spec
270 type(namespace_t), intent(in) :: namespace
271 integer, intent(in) :: nspin
272 integer, intent(in) :: dim
273
274 integer :: is, n, i, l, m, n1, n2, ii, nn
275 push_sub(allelectron_iwf_fix_qn)
276
277
278 select type(spec)
279 type is (soft_coulomb_t)
280 select case (dim)
281 case (1)
282 do is = 1, nspin
283 do i = 1, spec%niwfs
284 spec%iwf_i(i, is) = i
285 spec%iwf_n(i, is) = 0
286 spec%iwf_l(i, is) = 0
287 spec%iwf_m(i, is) = 0
288 spec%iwf_j(i) = m_zero
289 end do
290 end do
291
292 case (2)
293 do is = 1, nspin
294 i = 1
295 n1 = 1
296 n2 = 1
297 do
298 spec%iwf_i(i, is) = n1
299 spec%iwf_n(i, is) = 1
300 spec%iwf_l(i, is) = n2
301 spec%iwf_m(i, is) = 0
302 spec%iwf_j(i) = m_zero
303 i = i + 1
304 if (i>spec%niwfs) exit
305
306 spec%iwf_i(i, is) = n1+1
307 spec%iwf_n(i, is) = 1
308 spec%iwf_l(i, is) = n2
309 spec%iwf_m(i, is) = 0
310 spec%iwf_j(i) = m_zero
311 i = i + 1
312 if (i>spec%niwfs) exit
313
314 spec%iwf_i(i, is) = n1
315 spec%iwf_n(i, is) = 1
316 spec%iwf_l(i, is) = n2+1
317 spec%iwf_m(i, is) = 0
318 spec%iwf_j(i) = m_zero
319 i = i + 1
320 if (i>spec%niwfs) exit
321
322 n1 = n1 + 1; n2 = n2 + 1
323 end do
324 end do
326 case (3)
327 do is = 1, nspin
328 n = 1
329 nn = 1
330 ii = 1
331 ! just up to the highest principal quantum number, actually
332 do i = 1, spec%niwfs
333 if (n > spec%niwfs) exit
334 do l = 0, i-1
335 do m = -l, l
336 spec%iwf_i(n, is) = ii
337 spec%iwf_n(n, is) = nn
338 spec%iwf_l(n, is) = l
339 spec%iwf_m(n, is) = m
340 spec%iwf_j(n) = m_zero
341 n = n + 1
342 end do
343 ii = ii + 1
344 end do
345 nn = nn + 1
346 end do
347 end do
348
349 end select
350
351 class default
352 ! We need to find the occupations of the atomic wavefunctions to be able to get the atomic density
353 ! Note that here we store the configuration is spec%ps%conf, even if we do not have a pseudo
354 ! Not so clean...
355 spec%conf%symbol = species_label_short(spec)
356 call ps_guess_atomic_occupations(namespace, spec%get_z(), spec%get_zval(), nspin, spec%conf)
357
358 ! Now that we have the occupations and the correct quantum numbers, we can attribute them
359 do is = 1, nspin
360 n = 1
361 do i = 1, spec%conf%p
362 if (n > spec%niwfs) exit
363 l = spec%conf%l(i)
364
365 do m = -l, l
366 spec%iwf_i(n, is) = i
367 spec%iwf_n(n, is) = spec%conf%n(i)
368 spec%iwf_l(n, is) = l
369 spec%iwf_m(n, is) = m
370 spec%iwf_j(n) = spec%conf%j(i)
371 n = n + 1
372 end do
373 end do
374 end do
375
376 ! We now overwrite spec%niwfs because we know now the number of orbitals
377 spec%niwfs = n-1
378
379 end select
380
382 end subroutine allelectron_iwf_fix_qn
383
384 ! ---------------------------------------------------------
386 real(real64) function allelectron_get_iwf_radius(spec, ii, is, threshold) result(radius)
387 class(allelectron_t), intent(in) :: spec
388 integer, intent(in) :: ii
389 integer, intent(in) :: is
390 real(real64), optional, intent(in) :: threshold
391
392 real(real64) threshold_
393
395
396 threshold_ = optional_default(threshold, 0.001_real64)
397
398 select type(spec)
399 type is(soft_coulomb_t)
400 radius = -ii*log(threshold_)/spec%get_zval()
401 class default ! full species
402 ! For n=1, we use the direct analytical expression
403 radius = -log(threshold_*sqrt(m_pi/(spec%get_zval()**3)))/spec%get_zval()
404
405 ! For higher orbitals, we could use the first moment of the hydrogenic wavefunction
406 ! See Physics of atoms and molecules, Bransden and Joachain
407 ! Eq. 3.68
408 ! radius = (real(ii, real64) **2/spec%get_z())*(M_ONE + M_HALF*(M_ONE-real(ll*(ll+1), real64)/(spec%get_z()**2)))
409 ! However, these values are too small and leads to unbound orbitals.
410 ! Hence, we use the scaling of the first moment, that goes as n^2 to scale the n=1 radius
411 radius = radius * ii**2
412 end select
413
414 ! The values for hydrogenic and harmonic-oscillator wavefunctions
415 ! come from taking the exponential part (i.e. the one that controls
416 ! the asymptotic behavior at large r), and setting it equal to
417 ! the threshold.
418
420 end function allelectron_get_iwf_radius
421
422 ! ---------------------------------------------------------
423 logical pure function allelectron_is_local(spec) result(is_local)
424 class(allelectron_t), intent(in) :: spec
425
426 is_local = .true.
427 end function allelectron_is_local
428
429 ! ---------------------------------------------------------
433 ! ---------------------------------------------------------
434 subroutine allelectron_init_potential(this, namespace, grid_cutoff, filter)
435 class(allelectron_t), intent(inout) :: this
436 type(namespace_t), intent(in) :: namespace
437 real(real64), intent(in) :: grid_cutoff
438 integer, intent(in) :: filter
439
440 real(real64) :: grid_aa, grid_bb, bb(1), startval(1)
441 integer :: grid_np
442 logical :: conv
443 type(root_solver_t) :: rs
444
446
447 select type(this)
448 type is(full_anc_t)
449 ! We first construct a logarithmic grid
450 ! Then we find the value of b on this grid
451 ! Finally, we evaluate the scaled potential following Eq. 19
452 call logrid_find_parameters(namespace, int(this%get_z()), grid_aa, grid_bb, grid_np)
453 safe_allocate(grid_p)
454 call logrid_init(grid_p, logrid_psf, grid_aa, grid_bb, grid_np)
455
456 alpha_p = this%aa
457 ! We start from b=-0.1, which is close to the solution for a=4
458 startval(1) = -0.1_real64
459
460 ! solve equation
461 call root_solver_init(rs, namespace, 1, solver_type=root_newton, maxiter=500, abs_tolerance=1.0e-20_real64)
462 call droot_solver_run(rs, func_anc, bb, conv, startval=startval)
463
464 this%bb = bb(1)
465
466 if (.not. conv) then
467 write(message(1),'(a)') 'Root finding in species_pot did not converge/'
468 call messages_fatal(1, namespace=namespace)
469 end if
470
471 if(debug%info) then
472 write(message(1),'(a, f12.6)') 'Debug: Optimized value of b for the ANC potential = ', this%bb
473 call messages_info(1, namespace=namespace)
474 end if
475 call logrid_end(grid_p)
476 safe_deallocate_p(grid_p)
477 end select
478
480 contains
481 ! ---------------------------------------------------------
482 ! In order to use the root finder, we need an auxiliary function
483 ! that returns the value of the function to minimize and its Jacobian matrix
484 ! given a value of the parameters.
485 ! This routine does it for the ANC potential, where xin corresponds to the value b
486 subroutine func_anc(xin, ff, jacobian)
487 real(real64), intent(in) :: xin(:)
488 real(real64), intent(out) :: ff(:), jacobian(:,:)
489
490 real(real64), allocatable :: rho(:)
491 real(real64) :: norm
492 integer :: ip
493
494 push_sub(func_anc)
495
496 safe_allocate(rho(1:grid_p%nrval))
497 norm = m_one/sqrt(m_pi)
498 do ip = 1, grid_p%nrval
499 rho(ip) = -grid_p%rofi(ip) * loct_erf(grid_p%rofi(ip)*alpha_p) + xin(1)*exp(-alpha_p**2*grid_p%r2ofi(ip))
500 rho(ip) = norm * exp(rho(ip))
501 end do
502
503 ! First, we calculate the function to be minimized
504 ff(1) = sum(grid_p%drdi*rho**2*grid_p%r2ofi) - m_one/m_four/m_pi
505
506 ! Now the jacobian.
507 do ip = 1, grid_p%nrval
508 rho(ip) = m_two*rho(ip)**2*exp(-alpha_p**2*grid_p%r2ofi(ip))
509 end do
510 jacobian(1,1) = sum(grid_p%drdi*rho*grid_p%r2ofi)
511
512 safe_deallocate_a(rho)
513 pop_sub(func_anc)
514 end subroutine func_anc
515
517 ! ---------------------------------------------------------
518
519 ! ---------------------------------------------------------
520 subroutine allelectron_debug(spec, dir, namespace, gmax)
521 class(allelectron_t), intent(in) :: spec
522 character(len=*), intent(in) :: dir
523 type(namespace_t), intent(in) :: namespace
524 real(real64), intent(in) :: gmax
525
526 character(len=256) :: dirname
527 integer :: iunit
528
529 if (.not. mpi_grp_is_root(mpi_world)) then
530 return
531 end if
532
533 push_sub(allelectron_debug)
534
535 dirname = trim(dir)//'/'//trim(spec%get_label())
536
537 call io_mkdir(dirname, namespace)
538
539 iunit = io_open(trim(dirname)//'/info', namespace, action='write')
540
541 write(iunit, '(a,i3)') 'Index = ', spec%get_index()
542 write(iunit, '(2a)') 'Label = ', trim(spec%get_label())
543 write(iunit, '(a,f15.2)') 'z = ', spec%get_z()
544 write(iunit, '(a,f15.2)') 'z_val = ', spec%get_zval()
545 write(iunit, '(a,f15.2)') 'mass = ', spec%get_mass()
546 write(iunit, '(a,f15.2)') 'vdw_radius = ', spec%get_vdw_radius()
547 write(iunit, '(a,l1)') 'local = ', spec%is_local()
548 write(iunit, '(a,i3)') 'hubbard_l = ', spec%get_hubbard_l()
549 write(iunit, '(a,f15.2)') 'hubbard_U = ', spec%get_hubbard_U()
550 write(iunit, '(a,f15.2)') 'hubbard_j = ', spec%get_hubbard_j()
551 write(iunit, '(a,f15.2)') 'hubbard_alpha = ', spec%get_hubbard_alpha()
552
553 call io_close(iunit)
554 pop_sub(allelectron_debug)
555 end subroutine allelectron_debug
556
557 ! ---------------------------------------------------------
558 subroutine allelectron_build(spec, namespace, ispin, dim, print_info)
559 class(allelectron_t), intent(inout) :: spec
560 type(namespace_t), intent(in) :: namespace
561 integer, intent(in) :: ispin
562 integer, intent(in) :: dim
563 logical, optional, intent(in) :: print_info
564
565 logical :: print_info_
566
567 push_sub(allelectron_build)
568
569 print_info_ = optional_default(print_info, .true.)
570
571 ! masses are always in amu, so convert them to a.u.
572 call spec%set_mass(units_to_atomic(unit_amu, spec%get_mass()))
573
574 spec%has_density = .false.
575
576 select type (spec)
577 type is (soft_coulomb_t)
578 if (print_info_) then
579 write(message(1),'(a,a,a)') 'Species "',trim(spec%get_label()),'" is a soft-Coulomb potential.'
580 call messages_info(1, namespace=namespace)
581 end if
582 spec%niwfs = species_closed_shell_size(2*nint(spec%get_zval()+m_half))
583 spec%omega = 0.1_real64
584
585 ! since there is no real cap, make sure there are at least a few available
586 spec%niwfs = max(5, spec%niwfs)
587
588 type is (full_delta_t)
589 spec%has_density = .true.
590 if (print_info_) then
591 write(message(1),'(a,a,a)') 'Species "',trim(spec%get_label()),'" is an all-electron atom.'
592 write(message(2),'(a,f11.6)') ' Z = ', spec%get_z()
593 write(message(3),'(a)') ' Potential will be calculated solving the Poisson equation'
594 write(message(4),'(a)') ' for a delta density distribution.'
595 call messages_info(4, namespace=namespace)
596 end if
597 spec%niwfs = species_closed_shell_size(floor(m_half*spec%get_zval()+m_half))
598 ! We add one more shell because heavier elements might have not complete shells
599 ! An example is Ag with 5s1 electrons but no 4f electrons
600 ! We correct this number later
601 spec%niwfs = species_closed_shell_size(spec%niwfs+1)
602 spec%omega = spec%get_z()
603
604 type is (full_gaussian_t)
605 spec%has_density = .true.
606 if (print_info_) then
607 write(message(1),'(a,a,a)') 'Species "',trim(spec%get_label()),'" is an all-electron atom.'
608 write(message(2),'(a,f11.6)') ' Z = ', spec%get_z()
609 write(message(3),'(a)') ' Potential will be calculated solving the Poisson equation'
610 write(message(4),'(a)') ' for a Gaussian density distribution.'
611 call messages_info(4, namespace=namespace)
612 end if
613 spec%niwfs = species_closed_shell_size(floor(m_half*spec%get_zval()+m_half))
614 ! We add one more shell because heavier elements might have not complete shells
615 ! An example is Ag with 5s1 electrons but no 4f electrons
616 ! We correct this number later
617 spec%niwfs = species_closed_shell_size(spec%niwfs+1)
618 spec%omega = spec%get_z()
619 assert(spec%sigma > 0)
620
621 type is (full_anc_t)
622 spec%has_density = .false.
623 if (print_info_) then
624 write(message(1),'(a,a,a)') 'Species "',trim(spec%get_label()),'" is an all-electron atom.'
625 write(message(2),'(a,f11.6)') ' Z = ', spec%get_z()
626 write(message(3),'(a)') ' Potential is an analytical norm-conserving regularized potential'
627 call messages_info(3, namespace=namespace)
628 end if
629 spec%niwfs = species_closed_shell_size(floor(m_half*spec%get_zval()+m_half))
630 ! We add one more shell because heavier elements might have not complete shells
631 ! An example is Ag with 5s2 electrons but no 4f electrons
632 ! We correct this number later
633 spec%niwfs = species_closed_shell_size(spec%niwfs+1)
634 spec%omega = spec%get_z()
635 assert(spec%aa > 0)
636
637 class default
638 call messages_input_error(namespace, 'Species', 'Unknown species type')
639 end select
640
641 safe_allocate(spec%iwf_n(1:spec%niwfs, 1:ispin))
642 safe_allocate(spec%iwf_l(1:spec%niwfs, 1:ispin))
643 safe_allocate(spec%iwf_m(1:spec%niwfs, 1:ispin))
644 safe_allocate(spec%iwf_i(1:spec%niwfs, 1:ispin))
645 safe_allocate(spec%iwf_j(1:spec%niwfs))
646
647 call spec%iwf_fix_qn(namespace, ispin, dim)
648
649 write(message(1),'(a,i6,a,i6)') 'Number of orbitals: ', spec%niwfs
650 if (print_info_) call messages_info(1, namespace=namespace)
652 pop_sub(allelectron_build)
653 end subroutine allelectron_build
654
655 ! ---------------------------------------------------------
657 logical pure function allelectron_is_full(this)
658 class(allelectron_t), intent(in) :: this
659
660 select type (this)
661 class is (soft_coulomb_t)
662 allelectron_is_full = .false.
663 class default
665 end select
666 end function allelectron_is_full
667
668 ! ---------------------------------------------------------
670 logical pure function allelectron_represents_real_atom(spec)
671 class(allelectron_t), intent(in) :: spec
672
675
676
677
678end module allelectron_oct_m
679
680!! Local Variables:
681!! mode: f90
682!! coding: utf-8
683!! End:
subroutine func_anc(xin, ff, jacobian)
double log(double __x) __attribute__((__nothrow__
double exp(double __x) __attribute__((__nothrow__
double sqrt(double __x) __attribute__((__nothrow__
double floor(double __x) __attribute__((__nothrow__
pure subroutine allelectron_set_sigma(spec, sigma)
pure subroutine soft_coulomb_set_softening(spec, soft)
Set the softening parameter.
type(logrid_t), pointer grid_p
logical pure function allelectron_represents_real_atom(spec)
Is the species representing an atomic species or not.
real(real64) function allelectron_get_iwf_radius(spec, ii, is, threshold)
Return radius outside which orbital is less than threshold value 0.001.
class(full_gaussian_t) function, pointer full_gaussian_constructor(label, index, sigma)
Constructor for full_gaussian_t.
pure subroutine full_anc_set_a(spec, a)
class(soft_coulomb_t) function, pointer soft_coulomb_constructor(label, index)
real(real64) pure function full_anc_b(spec)
real(real64) pure function allelectron_sigma(spec)
subroutine allelectron_iwf_fix_qn(spec, namespace, nspin, dim)
set up quantum numbers of orbitals
real(real64) pure function full_anc_a(spec)
class(full_anc_t) function, pointer full_anc_constructor(label, index, a)
Constructor for full_anc_t.
subroutine allelectron_build(spec, namespace, ispin, dim, print_info)
real(real64) alpha_p
real(real64) pure function soft_coulomb_softening(spec)
Get the softening parameter.
subroutine allelectron_debug(spec, dir, namespace, gmax)
subroutine allelectron_init_potential(this, namespace, grid_cutoff, filter)
This routine performs some operations on the pseudopotential functions (filtering,...
real(real64) pure function allelectron_omega(spec)
class(full_delta_t) function, pointer full_delta_constructor(label, index, sigma)
Constructor for full_delta_t.
logical pure function allelectron_is_local(spec)
logical pure function allelectron_is_full(this)
Is the species an all-electron derived class or not.
real(real64), parameter, public m_zero
Definition: global.F90:187
real(real64), parameter, public m_one
Definition: global.F90:188
Definition: io.F90:114
This module is intended to contain "only mathematical" functions and procedures.
Definition: math.F90:115
Definition: ps.F90:114
subroutine, public species_init(this, label, index)
Initializes a species object. This should be the first routine to be called (before species_read and ...
Definition: species.F90:287
brief This module defines the class unit_t which is used by the unit_systems_oct_m module.
Definition: unit.F90:132
This module defines the unit system, used for input and output.
An abstract type for all electron species.
An abstract class for species. Derived classes include jellium, all electron, and pseudopotential spe...
Definition: species.F90:143
int true(void)