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) :: softening2
76
77 contains
78 procedure :: get_softening2 => soft_coulomb_softening2
79 procedure :: set_softening2 => soft_coulomb_set_softening2
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
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%softening2 = -m_one
147 end function soft_coulomb_constructor
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
168 pop_sub(full_anc_constructor)
169 end function full_anc_constructor
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
178
179 push_sub(full_delta_constructor)
181 safe_allocate(spec)
182
183 call species_init(spec, label, index)
184 spec%sigma = sigma
185 spec%omega = m_zero
188 end function full_delta_constructor
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
217
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
224
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_softening2(spec)
253 class(soft_coulomb_t), intent(in) :: spec
254 soft_coulomb_softening2 = spec%softening2
255 end function soft_coulomb_softening2
256
257 ! ---------------------------------------------------------
259 pure subroutine soft_coulomb_set_softening2(spec, a2)
260 class(soft_coulomb_t), intent(inout) :: spec
261 real(real64), intent(in) :: a2
262 spec%softening2 = a2
263 end subroutine soft_coulomb_set_softening2
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
322 n1 = n1 + 1; n2 = n2 + 1
323 end do
324 end do
325
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-10_real64)
462 call droot_solver_run(rs, func_anc, bb, conv, startval=startval)
463
464 if (.not. conv) then
465 write(message(1),'(a)') 'Root finding in allelectron_init_potential did not converge.'
466 call messages_fatal(1, namespace=namespace)
467 end if
468
469 this%bb = bb(1)
470
471 write(message(1),'(3a, f12.6)') 'Info: species_full_anc species ', trim(this%get_label()), &
472 ': optimized value of b = ', this%bb
473 call messages_info(1, namespace=namespace)
474 call logrid_end(grid_p)
475 safe_deallocate_p(grid_p)
476 end select
477
479 end subroutine allelectron_init_potential
480 ! ---------------------------------------------------------
482 ! ---------------------------------------------------------
483 ! In order to use the root finder, we need an auxiliary function
484 ! that returns the value of the function to minimize and its Jacobian matrix
485 ! given a value of the parameters.
486 ! This routine does it for the ANC potential, where xin corresponds to the value b
487 subroutine func_anc(xin, ff, jacobian)
488 real(real64), intent(in) :: xin(:)
489 real(real64), intent(out) :: ff(:), jacobian(:,:)
490
491 real(real64), allocatable :: rho(:)
492 real(real64) :: norm
493 integer :: ip
494
495 push_sub(func_anc)
496
497 safe_allocate(rho(1:grid_p%nrval))
498 norm = m_one/sqrt(m_pi)
499 do ip = 1, grid_p%nrval
500 rho(ip) = -grid_p%rofi(ip) * erf(grid_p%rofi(ip)*alpha_p) + xin(1)*exp(-alpha_p**2*grid_p%r2ofi(ip))
501 rho(ip) = norm * exp(rho(ip))
502 end do
503
504 ! First, we calculate the function to be minimized
505 ff(1) = sum(grid_p%drdi*rho**2*grid_p%r2ofi) - m_one/m_four/m_pi
506
507 ! Now the jacobian.
508 do ip = 1, grid_p%nrval
509 rho(ip) = m_two*rho(ip)**2*exp(-alpha_p**2*grid_p%r2ofi(ip))
510 end do
511 jacobian(1,1) = sum(grid_p%drdi*rho*grid_p%r2ofi)
512
513 safe_deallocate_a(rho)
514 pop_sub(func_anc)
515 end subroutine func_anc
516 ! ---------------------------------------------------------
517
518 ! ---------------------------------------------------------
519 subroutine allelectron_debug(spec, dir, namespace, gmax)
520 class(allelectron_t), intent(in) :: spec
521 character(len=*), intent(in) :: dir
522 type(namespace_t), intent(in) :: namespace
523 real(real64), intent(in) :: gmax
524
525 character(len=256) :: dirname
526 integer :: iunit
527
528 if (.not. mpi_world%is_root()) then
529 return
530 end if
531
532 push_sub(allelectron_debug)
533
534 dirname = trim(dir)//'/'//trim(spec%get_label())
535
536 call io_mkdir(dirname, namespace)
537
538 iunit = io_open(trim(dirname)//'/info', namespace, action='write')
539
540 write(iunit, '(a,i3)') 'Index = ', spec%get_index()
541 write(iunit, '(2a)') 'Label = ', trim(spec%get_label())
542 write(iunit, '(a,f15.2)') 'z = ', spec%get_z()
543 write(iunit, '(a,f15.2)') 'z_val = ', spec%get_zval()
544 write(iunit, '(a,f15.2)') 'mass = ', spec%get_mass()
545 write(iunit, '(a,f15.2)') 'vdw_radius = ', spec%get_vdw_radius()
546 write(iunit, '(a,l1)') 'local = ', spec%is_local()
547 write(iunit, '(a,i3)') 'hubbard_l = ', spec%get_hubbard_l()
548 write(iunit, '(a,f15.2)') 'hubbard_U = ', spec%get_hubbard_U()
549 write(iunit, '(a,f15.2)') 'hubbard_j = ', spec%get_hubbard_j()
550 write(iunit, '(a,f15.2)') 'hubbard_alpha = ', spec%get_hubbard_alpha()
551
552 call io_close(iunit)
553 pop_sub(allelectron_debug)
554 end subroutine allelectron_debug
555
556 ! ---------------------------------------------------------
557 subroutine allelectron_build(spec, namespace, ispin, dim, print_info)
558 class(allelectron_t), intent(inout) :: spec
559 type(namespace_t), intent(in) :: namespace
560 integer, intent(in) :: ispin
561 integer, intent(in) :: dim
562 logical, optional, intent(in) :: print_info
563
564 logical :: print_info_
565
566 push_sub(allelectron_build)
567
568 print_info_ = optional_default(print_info, .true.)
569
570 ! masses are always in amu, so convert them to a.u.
571 call spec%set_mass(units_to_atomic(unit_amu, spec%get_mass()))
572
573 spec%has_density = .false.
574
575 select type (spec)
576 type is (soft_coulomb_t)
577 if (print_info_) then
578 write(message(1),'(a,a,a)') 'Species "',trim(spec%get_label()),'" is a soft-Coulomb potential.'
579 call messages_info(1, namespace=namespace)
580 end if
581
582 type is (full_delta_t)
583 spec%has_density = .true.
584 if (print_info_) then
585 write(message(1),'(a,a,a)') 'Species "',trim(spec%get_label()),'" is an all-electron atom.'
586 write(message(2),'(a,f11.6)') ' Z = ', spec%get_z()
587 write(message(3),'(a)') ' Potential will be calculated solving the Poisson equation'
588 write(message(4),'(a)') ' for a delta density distribution.'
589 call messages_info(4, namespace=namespace)
590 end if
591
592 type is (full_gaussian_t)
593 spec%has_density = .true.
594 if (print_info_) then
595 write(message(1),'(a,a,a)') 'Species "',trim(spec%get_label()),'" is an all-electron atom.'
596 write(message(2),'(a,f11.6)') ' Z = ', spec%get_z()
597 write(message(3),'(a)') ' Potential will be calculated solving the Poisson equation'
598 write(message(4),'(a)') ' for a Gaussian density distribution.'
599 write(message(5),'(a,f11.6)') ' sigma = ', spec%sigma
600 call messages_info(5, namespace=namespace)
601 end if
602 assert(spec%sigma > 0)
603
604 type is (full_anc_t)
605 spec%has_density = .false.
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 is an analytical norm-conserving regularized potential'
610 write(message(4),'(a,f11.6)') ' a = ', spec%aa
611 write(message(5),'(a,f11.6,a)') ' regularization length 1/(a Z) = ', &
612 m_one/(spec%aa*spec%get_z()), ' [bohr]'
613 call messages_info(5, namespace=namespace)
614 end if
615 assert(spec%aa > 0)
616
617 class default
618 call messages_input_error(namespace, 'Species', 'Unknown species type')
619 end select
620
621 spec%niwfs = species_closed_shell_size(floor(m_half*spec%get_zval()+m_half))
622 ! We add one more shell because heavier elements might have not complete shells
623 ! An example is Ag with 5s1 electrons but no 4f electrons
624 ! We correct this number later
625 spec%niwfs = species_closed_shell_size(spec%niwfs+1)
626 spec%omega = spec%get_z()
627
628 safe_allocate(spec%iwf_n(1:spec%niwfs, 1:ispin))
629 safe_allocate(spec%iwf_l(1:spec%niwfs, 1:ispin))
630 safe_allocate(spec%iwf_m(1:spec%niwfs, 1:ispin))
631 safe_allocate(spec%iwf_i(1:spec%niwfs, 1:ispin))
632 safe_allocate(spec%iwf_j(1:spec%niwfs))
633
634 call spec%iwf_fix_qn(namespace, ispin, dim)
635
636 write(message(1),'(a,i6)') 'Number of orbitals: ', spec%niwfs
637 if (print_info_) call messages_info(1, namespace=namespace)
638
639 pop_sub(allelectron_build)
640 end subroutine allelectron_build
641
642 ! ---------------------------------------------------------
644 logical pure function allelectron_is_full(this)
645 class(allelectron_t), intent(in) :: this
646
647 select type (this)
648 class is (soft_coulomb_t)
649 allelectron_is_full = .false.
650 class default
652 end select
653 end function allelectron_is_full
654
655 ! ---------------------------------------------------------
657 logical pure function allelectron_represents_real_atom(spec)
658 class(allelectron_t), intent(in) :: spec
659
662
663
664
665end module allelectron_oct_m
666
667!! Local Variables:
668!! mode: f90
669!! coding: utf-8
670!! End:
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)
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)
real(real64) pure function soft_coulomb_softening2(spec)
Get the square of the softening parameter 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
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)
pure subroutine soft_coulomb_set_softening2(spec, a2)
Set the square of the softening parameter a.
subroutine func_anc(xin, ff, jacobian)
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:200
real(real64), parameter, public m_one
Definition: global.F90:201
Definition: io.F90:116
This module is intended to contain "only mathematical" functions and procedures.
Definition: math.F90:117
Definition: ps.F90:116
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:291
brief This module defines the class unit_t which is used by the unit_systems_oct_m module.
Definition: unit.F90:134
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:147
int true(void)