24 use,
intrinsic :: iso_fortran_env
41 integer,
parameter,
public :: &
42 LOGRID_PSF = 1, & !< log grid used in Troullier-Martins code
52 real(real64),
allocatable :: rofi(:)
53 real(real64),
allocatable :: r2ofi(:)
54 real(real64),
allocatable :: drdi(:)
55 real(real64),
allocatable :: s(:)
62 type(logrid_t),
intent(out) :: grid
63 integer,
intent(in) :: flavor
64 real(real64),
intent(in) :: aa, bb
65 integer,
intent(in) :: nrval
67 real(real64) :: rpb, ea
72 assert(flavor == logrid_psf .or. flavor ==
logrid_cpi)
79 safe_allocate(grid%rofi(1:nrval))
80 safe_allocate(grid%r2ofi(1:nrval))
81 safe_allocate(grid%drdi(1:nrval))
82 safe_allocate(grid%s(1:nrval))
84 select case (grid%flavor)
89 grid%drdi(ir) = aa*rpb
91 grid%rofi(ir) = bb*
expm1(aa*(ir-1))
100 grid%drdi(2) = bb*rpb
101 do ir = 3, grid%nrval
102 grid%rofi(ir) = grid%rofi(ir-1)*aa
103 grid%drdi(ir) = grid%rofi(ir)*rpb
108 do ir = 1, grid%nrval
109 grid%s(ir) =
sqrt(grid%drdi(ir))
110 grid%r2ofi(ir) = grid%rofi(ir)**2
119 type(logrid_t),
intent(inout) :: grid
123 safe_deallocate_a(grid%rofi)
124 safe_deallocate_a(grid%r2ofi)
125 safe_deallocate_a(grid%drdi)
126 safe_deallocate_a(grid%s)
134 type(logrid_t),
intent(in) :: grid_in
135 type(logrid_t),
intent(inout) :: grid_out
141 grid_out%flavor = grid_in%flavor
142 grid_out%a = grid_in%a
143 grid_out%b = grid_in%b
144 grid_out%nrval = grid_in%nrval
146 safe_allocate(grid_out%rofi (1:grid_out%nrval))
147 safe_allocate(grid_out%r2ofi(1:grid_out%nrval))
148 safe_allocate(grid_out%drdi (1:grid_out%nrval))
149 safe_allocate(grid_out%s (1:grid_out%nrval))
151 grid_out%rofi(:) = grid_in%rofi(:)
152 grid_out%r2ofi(:) = grid_in%r2ofi(:)
153 grid_out%drdi(:) = grid_in%drdi(:)
154 grid_out%s(:) = grid_in%s(:)
163 real(real64),
intent(in) :: rofi
170 do ir = 1, grid%nrval-1
172 if (rofi >= grid%rofi(ir).and.rofi < grid%rofi(ir+1))
then
173 if (abs(rofi-grid%rofi(ir)) < abs(rofi-grid%rofi(ir+1)))
then
189 integer,
intent(in) :: zz
190 real(real64),
intent(out) :: aa, bb
191 integer,
intent(out) :: np
193 real(real64) :: xmin, xmax, a1, a2, f1, fm
202 xmin =
sqrt(real(zz, real64) )*1e-5_real64
203 xmax =
sqrt(real(zz, real64) )*30.0_real64
204 np =
floor(
sqrt(real(zz, real64) )*200_real64)
209 f1 =
func(xmin, xmax, real(np, real64) , a1)
213 fm =
func(xmin, xmax, real(np, real64) , aa)
214 if (
m_half*abs(a1 - a2) < 1.0e-16_real64)
exit
225 write(
message(1),
'(a,es13.6,a,es13.6,a,i4)')
'Debug: Log grid parameters: a = ', aa, &
226 ' b = ', bb,
' np = ', np
231 real(real64) function
func(r1, rn, n, a)
232 real(real64),
intent(in) :: r1, rn, a, n
double log(double __x) __attribute__((__nothrow__
double exp(double __x) __attribute__((__nothrow__
double sqrt(double __x) __attribute__((__nothrow__
double floor(double __x) __attribute__((__nothrow__
real(real64) function func(r1, rn, n, a)
real(real64), parameter, public m_two
real(real64), parameter, public m_max_exp_arg
real(real64), parameter, public m_huge
real(real64), parameter, public m_zero
real(real64), parameter, public m_half
real(real64), parameter, public m_one
subroutine, public logrid_find_parameters(namespace, zz, aa, bb, np)
subroutine, public logrid_copy(grid_in, grid_out)
integer, parameter, public logrid_cpi
log grid used in FHI code
integer function, public logrid_index(grid, rofi)
subroutine, public logrid_end(grid)
subroutine, public logrid_init(grid, flavor, aa, bb, nrval)
This module is intended to contain "only mathematical" functions and procedures.
character(len=256), dimension(max_lines), public message
to be output by fatal, warning
subroutine, public messages_info(no_lines, iunit, debug_only, stress, all_nodes, namespace)