47 integer :: jacobi_ndiis
62 real(
dp),
allocatable :: csph(:, :)
64 real(
dp),
allocatable :: rsph(:)
66 real(
dp) :: epsp = 1.0_dp
71 character(len=255) :: output_filename
73 integer :: len_output_filename
123subroutine params_init(model, force, eps, kappa, eta, se, lmax, ngrid, &
124 & matvecmem, maxiter, jacobi_ndiis, fmm, pm, pl, nproc, nsph, &
125 & csph, rsph, output_filename, switching, params, ddx_error)
128 integer,
intent(in) :: model
130 integer,
intent(in) :: force
132 real(dp),
intent(in) :: eps
134 real(dp),
intent(in) :: kappa
136 real(dp),
intent(in) :: eta
139 real(dp),
intent(in) :: se
141 integer,
intent(in) :: lmax
143 integer,
intent(in) :: ngrid
146 integer,
intent(in) :: matvecmem
148 integer,
intent(in) :: maxiter
151 integer,
intent(in) :: jacobi_ndiis
153 integer,
intent(in) :: fmm
157 integer,
intent(in) :: pm
161 integer,
intent(in) :: pl
163 integer,
intent(in) :: nproc
165 integer,
intent(in) :: nsph
167 real(dp),
intent(in) :: csph(3, nsph)
169 real(dp),
intent(in) :: rsph(nsph)
171 character(len=255) :: output_filename
173 integer,
intent(in) :: switching
178 integer :: igrid, i, info
180 if (ddx_error % flag .ne. 0)
then
181 call update_error(ddx_error,
"params_init received input in ddx_error " // &
185 if (len(trim(output_filename)) .ne. 0)
then
186 params % output_filename = output_filename
187 params % verbose = .true.
188 params % len_output_filename = len(trim(output_filename))
190 params % output_filename =
''
191 params % verbose = .false.
192 params % len_output_filename = 0
195 if ((model .lt. 1) .or. (model .gt. 3))
then
196 call update_error(ddx_error,
"params_init: invalid value of `model`")
198 params % model = model
200 if ((force .lt. 0) .or. (force .gt. 1))
then
201 call update_error(ddx_error,
"params_init: invalid value of `force`")
203 params % force = force
205 if (eps .le. one)
then
206 call update_error(ddx_error,
"params_init: invalid value of `eps`")
210 if ((model .eq. 3) .and. (kappa .le. zero))
then
211 call update_error(ddx_error,
"params_init: invalid value of `kappa`")
213 params % kappa = kappa
215 if ((eta .lt. zero) .or. (eta .gt. one))
then
216 call update_error(ddx_error,
"params_init: invalid value of `eta`")
220 if ((se .lt. -one) .or. (se .gt. one))
then
221 call update_error(ddx_error,
"params_init: invalid value of `se`")
225 if (lmax .lt. 0)
then
226 call update_error(ddx_error,
"params_init: invalid value of `lmax`")
232 if (
ng0(i) .eq. ngrid)
then
237 if (igrid .eq. 0)
then
238 call update_error(ddx_error,
"params_init: Unsupported value of `ngrid`")
240 params % ngrid = ngrid
242 if (maxiter .le. 0)
then
243 call update_error(ddx_error,
"params_init: invalid value of `maxiter`")
245 params % maxiter = maxiter
247 if (jacobi_ndiis .lt. 0)
then
248 call update_error(ddx_error,
"params_init: invalid value of `jacobi_ndiis`")
250 params % jacobi_ndiis = jacobi_ndiis
252 if ((fmm .lt. 0) .or. (fmm .gt. 1))
then
253 call update_error(ddx_error,
"params_init: invalid value of `fmm`")
262 call update_error(ddx_error,
"params_init: invalid value of `pm`")
268 call update_error(ddx_error,
"params_init: invalid value of `pl`")
271 if ((pl .eq. -1) .or. (pm .eq. -1))
then
286 if (nproc .lt. 0)
then
287 call update_error(ddx_error,
"params_init: invalid value of `nproc`")
289 else if (nproc .eq. 0)
then
292 params % nproc = nproc
294 call omp_set_num_threads(params % nproc)
296 if (nsph .le. 0)
then
297 call update_error(ddx_error,
"params_init: invalid value of `nsph`")
300 allocate(params % csph(3, nsph), params % rsph(nsph), stat=info)
301 if (info .ne. 0)
then
302 call update_error(ddx_error,
"params_init: `csph` and `rsph` " // &
303 &
"allocations failed")
308 if (matvecmem.eq.0 .or. matvecmem.eq.1)
then
309 params % matvecmem = matvecmem
311 call update_error(ddx_error,
"params_init: invalid value of `matvecmem`")
314 if (switching.eq.0 .or. switching.eq.1)
then
315 params % switching = switching
317 call update_error(ddx_error,
"params_init: invalid value of `switching`")
320 if (ddx_error % flag .ne. 0)
return
324 if (ddx_error % flag .ne. 0)
then
325 call update_error(ddx_error,
"init_printing returned an error, exiting")
335 integer,
intent(inout) :: ngrid
336 integer :: igrid, i, inear, jnear
341 jnear = abs(
ng0(i) - ngrid)
342 if (jnear .lt. inear)
then
363 if (
allocated(params % csph))
then
364 deallocate(params % csph, stat=istat)
365 if (istat .ne. 0)
then
366 call update_error(ddx_error,
"params_free: `csph` deallocation failed")
369 if (
allocated(params % rsph))
then
370 deallocate(params % rsph, stat=istat)
371 if (istat .ne. 0)
then
372 call update_error(ddx_error,
"params_free: `rsph` deallocation failed")
383 if (.not.params % verbose)
return
384 inquire(file=params % output_filename(1:params % len_output_filename), &
387 call update_error(ddx_error,
'Log file already present')
391 open(params % iunit, &
392 & file=params % output_filename(1: params % len_output_filename), &
401 if (.not.params % verbose)
return
402 close(params % iunit)
403 params % verbose = .false.
404 params % output_filename =
''
405 params % len_output_filename = 0
Compile-time constants and definitions.
integer, dimension(nllg), parameter ng0
Number of grid points of each Lebedev grid.
integer, parameter dp
Kind of double precision.
integer, parameter nllg
Number of supported Lebedev grids.
Module to treat properly user input parameters.
subroutine closest_supported_lebedev_grid(ngrid)
Adjust a guess for the number of Lebedev grid points.
subroutine init_printing(params, ddx_error)
Open the log file.
subroutine finalize_printing(params)
Close the log file.
subroutine params_free(params, ddx_error)
Deallocate the parameter object.
subroutine params_init(model, force, eps, kappa, eta, se, lmax, ngrid, matvecmem, maxiter, jacobi_ndiis, fmm, pm, pl, nproc, nsph, csph, rsph, output_filename, switching, params, ddx_error)
Initialize and check input parameters.
ddX type for containing ddx_error information
Type to check and store user input parameters.