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 write(message(1),'(a, f12.6)') 'Debug: Optimized value of b for the ANC potential = ', this%bb
472 call messages_info(1, namespace=namespace, debug_only=.true.)
473 call logrid_end(grid_p)
474 safe_deallocate_p(grid_p)
475 end select
476
478 contains
479 ! ---------------------------------------------------------
480 ! In order to use the root finder, we need an auxiliary function
481 ! that returns the value of the function to minimize and its Jacobian matrix
482 ! given a value of the parameters.
483 ! This routine does it for the ANC potential, where xin corresponds to the value b
484 subroutine func_anc(xin, ff, jacobian)
485 real(real64), intent(in) :: xin(:)
486 real(real64), intent(out) :: ff(:), jacobian(:,:)
487
488 real(real64), allocatable :: rho(:)
489 real(real64) :: norm
490 integer :: ip
491
492 push_sub(func_anc)
493
494 safe_allocate(rho(1:grid_p%nrval))
495 norm = m_one/sqrt(m_pi)
496 do ip = 1, grid_p%nrval
497 rho(ip) = -grid_p%rofi(ip) * loct_erf(grid_p%rofi(ip)*alpha_p) + xin(1)*exp(-alpha_p**2*grid_p%r2ofi(ip))
498 rho(ip) = norm * exp(rho(ip))
499 end do
500
501 ! First, we calculate the function to be minimized
502 ff(1) = sum(grid_p%drdi*rho**2*grid_p%r2ofi) - m_one/m_four/m_pi
503
504 ! Now the jacobian.
505 do ip = 1, grid_p%nrval
506 rho(ip) = m_two*rho(ip)**2*exp(-alpha_p**2*grid_p%r2ofi(ip))
507 end do
508 jacobian(1,1) = sum(grid_p%drdi*rho*grid_p%r2ofi)
509
510 safe_deallocate_a(rho)
511 pop_sub(func_anc)
512 end subroutine func_anc
513
514 end subroutine allelectron_init_potential
515 ! ---------------------------------------------------------
517 ! ---------------------------------------------------------
518 subroutine allelectron_debug(spec, dir, namespace, gmax)
519 class(allelectron_t), intent(in) :: spec
520 character(len=*), intent(in) :: dir
521 type(namespace_t), intent(in) :: namespace
522 real(real64), intent(in) :: gmax
523
524 character(len=256) :: dirname
525 integer :: iunit
526
527 if (.not. mpi_grp_is_root(mpi_world)) then
528 return
529 end if
530
531 push_sub(allelectron_debug)
532
533 dirname = trim(dir)//'/'//trim(spec%get_label())
534
535 call io_mkdir(dirname, namespace)
536
537 iunit = io_open(trim(dirname)//'/info', namespace, action='write')
538
539 write(iunit, '(a,i3)') 'Index = ', spec%get_index()
540 write(iunit, '(2a)') 'Label = ', trim(spec%get_label())
541 write(iunit, '(a,f15.2)') 'z = ', spec%get_z()
542 write(iunit, '(a,f15.2)') 'z_val = ', spec%get_zval()
543 write(iunit, '(a,f15.2)') 'mass = ', spec%get_mass()
544 write(iunit, '(a,f15.2)') 'vdw_radius = ', spec%get_vdw_radius()
545 write(iunit, '(a,l1)') 'local = ', spec%is_local()
546 write(iunit, '(a,i3)') 'hubbard_l = ', spec%get_hubbard_l()
547 write(iunit, '(a,f15.2)') 'hubbard_U = ', spec%get_hubbard_U()
548 write(iunit, '(a,f15.2)') 'hubbard_j = ', spec%get_hubbard_j()
549 write(iunit, '(a,f15.2)') 'hubbard_alpha = ', spec%get_hubbard_alpha()
550
551 call io_close(iunit)
552 pop_sub(allelectron_debug)
553 end subroutine allelectron_debug
554
555 ! ---------------------------------------------------------
556 subroutine allelectron_build(spec, namespace, ispin, dim, print_info)
557 class(allelectron_t), intent(inout) :: spec
558 type(namespace_t), intent(in) :: namespace
559 integer, intent(in) :: ispin
560 integer, intent(in) :: dim
561 logical, optional, intent(in) :: print_info
562
563 logical :: print_info_
564
565 push_sub(allelectron_build)
566
567 print_info_ = optional_default(print_info, .true.)
568
569 ! masses are always in amu, so convert them to a.u.
570 call spec%set_mass(units_to_atomic(unit_amu, spec%get_mass()))
571
572 spec%has_density = .false.
573
574 select type (spec)
575 type is (soft_coulomb_t)
576 if (print_info_) then
577 write(message(1),'(a,a,a)') 'Species "',trim(spec%get_label()),'" is a soft-Coulomb potential.'
578 call messages_info(1, namespace=namespace)
579 end if
580 spec%niwfs = species_closed_shell_size(2*nint(spec%get_zval()+m_half))
581 spec%omega = 0.1_real64
582
583 ! since there is no real cap, make sure there are at least a few available
584 spec%niwfs = max(5, spec%niwfs)
585
586 type is (full_delta_t)
587 spec%has_density = .true.
588 if (print_info_) then
589 write(message(1),'(a,a,a)') 'Species "',trim(spec%get_label()),'" is an all-electron atom.'
590 write(message(2),'(a,f11.6)') ' Z = ', spec%get_z()
591 write(message(3),'(a)') ' Potential will be calculated solving the Poisson equation'
592 write(message(4),'(a)') ' for a delta density distribution.'
593 call messages_info(4, namespace=namespace)
594 end if
595 spec%niwfs = species_closed_shell_size(floor(m_half*spec%get_zval()+m_half))
596 ! We add one more shell because heavier elements might have not complete shells
597 ! An example is Ag with 5s1 electrons but no 4f electrons
598 ! We correct this number later
599 spec%niwfs = species_closed_shell_size(spec%niwfs+1)
600 spec%omega = spec%get_z()
601
602 type is (full_gaussian_t)
603 spec%has_density = .true.
604 if (print_info_) then
605 write(message(1),'(a,a,a)') 'Species "',trim(spec%get_label()),'" is an all-electron atom.'
606 write(message(2),'(a,f11.6)') ' Z = ', spec%get_z()
607 write(message(3),'(a)') ' Potential will be calculated solving the Poisson equation'
608 write(message(4),'(a)') ' for a Gaussian density distribution.'
609 call messages_info(4, namespace=namespace)
610 end if
611 spec%niwfs = species_closed_shell_size(floor(m_half*spec%get_zval()+m_half))
612 ! We add one more shell because heavier elements might have not complete shells
613 ! An example is Ag with 5s1 electrons but no 4f electrons
614 ! We correct this number later
615 spec%niwfs = species_closed_shell_size(spec%niwfs+1)
616 spec%omega = spec%get_z()
617 assert(spec%sigma > 0)
618
619 type is (full_anc_t)
620 spec%has_density = .false.
621 if (print_info_) then
622 write(message(1),'(a,a,a)') 'Species "',trim(spec%get_label()),'" is an all-electron atom.'
623 write(message(2),'(a,f11.6)') ' Z = ', spec%get_z()
624 write(message(3),'(a)') ' Potential is an analytical norm-conserving regularized potential'
625 call messages_info(3, namespace=namespace)
626 end if
627 spec%niwfs = species_closed_shell_size(floor(m_half*spec%get_zval()+m_half))
628 ! We add one more shell because heavier elements might have not complete shells
629 ! An example is Ag with 5s2 electrons but no 4f electrons
630 ! We correct this number later
631 spec%niwfs = species_closed_shell_size(spec%niwfs+1)
632 spec%omega = spec%get_z()
633 assert(spec%aa > 0)
634
635 class default
636 call messages_input_error(namespace, 'Species', 'Unknown species type')
637 end select
638
639 safe_allocate(spec%iwf_n(1:spec%niwfs, 1:ispin))
640 safe_allocate(spec%iwf_l(1:spec%niwfs, 1:ispin))
641 safe_allocate(spec%iwf_m(1:spec%niwfs, 1:ispin))
642 safe_allocate(spec%iwf_i(1:spec%niwfs, 1:ispin))
643 safe_allocate(spec%iwf_j(1:spec%niwfs))
644
645 call spec%iwf_fix_qn(namespace, ispin, dim)
646
647 write(message(1),'(a,i6,a,i6)') 'Number of orbitals: ', spec%niwfs
648 if (print_info_) call messages_info(1, namespace=namespace)
650 pop_sub(allelectron_build)
651 end subroutine allelectron_build
652
653 ! ---------------------------------------------------------
655 logical pure function allelectron_is_full(this)
656 class(allelectron_t), intent(in) :: this
657
658 select type (this)
659 class is (soft_coulomb_t)
660 allelectron_is_full = .false.
661 class default
663 end select
664 end function allelectron_is_full
665
666 ! ---------------------------------------------------------
668 logical pure function allelectron_represents_real_atom(spec)
669 class(allelectron_t), intent(in) :: spec
670
673
674
675
676end module allelectron_oct_m
677
678!! Local Variables:
679!! mode: f90
680!! coding: utf-8
681!! 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)