121 POINTER :: particle_set
123 POINTER :: qs_kind_set
124 TYPE(cp_gauxc_status_type),
INTENT(inout) :: status
132 status%status%code = 0
138 cache%molecule = gauxc_create_molecule( &
141 IF (status%status%code /= 0)
THEN
142 CALL cleanup_after_molecule()
146 cache%basisset = gauxc_create_basisset( &
150 IF (status%status%code /= 0)
THEN
151 CALL cleanup_after_basisset()
155 params%use_fd_gradient = &
156 params%use_fd_gradient .AND. (cache%max_l() > 3)
157 params%use_gradient_mpi_runtime = &
158 params%use_gradient_mpi_runtime .AND. .NOT. params%use_fd_gradient
159 params%use_gradient_self_runtime = &
160 params%use_gradient_self_runtime .AND. .NOT. params%use_gradient_mpi_runtime
162 IF (params%use_fd_gradient .AND. para_env%mepos == 0)
THEN
165 "Using finite-difference GauXC XC gradients for METHOD GAPW/GAPW_XC with "// &
166 "basis functions beyond f shells. The upstream analytical GauXC gradient path is "// &
167 "not yet reliable for this case.")
169 IF (params%use_self_runtime .OR. .NOT. params%use_gauxc_model)
THEN
174 cache%grid = gauxc_create_grid( &
178 params%radial_quadrature, &
179 params%pruning_scheme, &
180 params%lb_exec_space, &
182 params%device_runtime_fill_fraction, &
185 force_new_runtime=.true.)
191 cache%grid = gauxc_create_grid( &
195 params%radial_quadrature, &
196 params%pruning_scheme, &
197 params%lb_exec_space, &
199 params%device_runtime_fill_fraction, &
201 mpi_comm=para_env%get_handle())
203 IF (status%status%code /= 0)
THEN
204 CALL cleanup_after_grid()
208 cache%integrator = gauxc_create_integrator( &
209 trim(params%xc_fun_name), &
211 params%int_exec_space, &
215 IF (status%status%code /= 0)
THEN
216 CALL cleanup_after_integrator()
220 IF (params%use_gradient_self_runtime)
THEN
224 cache%gradient_grid = gauxc_create_grid( &
228 params%radial_quadrature, &
229 params%pruning_scheme, &
230 params%lb_exec_space, &
232 params%device_runtime_fill_fraction, &
235 force_new_runtime=.true.)
236 IF (status%status%code /= 0)
THEN
237 CALL cleanup_after_gradient_grid()
240 cache%gradient_integrator = gauxc_create_integrator( &
241 trim(params%xc_fun_name), &
242 cache%gradient_grid, &
243 params%int_exec_space, &
247 IF (status%status%code /= 0)
THEN
248 CALL cleanup_after_gradient_integrator()
253 cache%natom = params%natom
254 cache%nspins = params%nspins
255 cache%batch_size = params%batch_size
256 cache%device_runtime_fill_fraction = real(params%device_runtime_fill_fraction, c_double)
257 cache%xc_fun_name = trim(params%xc_fun_name)
258 cache%grid_type = trim(params%grid_type)
259 cache%radial_quadrature = trim(params%radial_quadrature)
260 cache%pruning_scheme = trim(params%pruning_scheme)
261 cache%lb_exec_space = trim(params%lb_exec_space)
262 cache%int_exec_space = trim(params%int_exec_space)
263 cache%model_eval_name = trim(params%model_eval_name)
264 cache%lwd_kernel = trim(params%lwd_kernel)
265 cache%use_gradient_mpi_runtime = params%use_gradient_mpi_runtime
266 cache%use_mpi_runtime = params%use_mpi_runtime
267 cache%use_gradient_self_runtime = params%use_gradient_self_runtime
268 cache%use_self_runtime = params%use_self_runtime
269 cache%use_fd_gradient = params%use_fd_gradient
270 IF (
ALLOCATED(cache%last_positions))
THEN
271 DEALLOCATE (cache%last_positions)
273 ALLOCATE (cache%last_positions(3, params%natom))
277 DO iatom = 1, params%natom
278 cache%last_positions(:, iatom) = real(particle_set(iatom)%r(:), c_double)
282 cache%mpi_comm = para_env%get_handle()
283 cache%is_init = .true.
288 mark_used(particle_set)
289 mark_used(qs_kind_set)
291 cache%is_init = .false.
298 SUBROUTINE cleanup_after_gradient_integrator()
299 CALL gauxc_destroy_integrator(cache%gradient_integrator, status)
300 CALL gauxc_check_status(status)
301 CALL cleanup_after_gradient_grid()
302 END SUBROUTINE cleanup_after_gradient_integrator
307 SUBROUTINE cleanup_after_gradient_grid()
308 CALL gauxc_destroy_grid(cache%gradient_grid, status)
309 CALL gauxc_check_status(status)
310 CALL cleanup_after_integrator()
311 END SUBROUTINE cleanup_after_gradient_grid
316 SUBROUTINE cleanup_after_integrator()
317 CALL gauxc_destroy_integrator(cache%integrator, status)
318 CALL gauxc_check_status(status)
319 CALL cleanup_after_grid()
320 END SUBROUTINE cleanup_after_integrator
325 SUBROUTINE cleanup_after_grid()
326 CALL gauxc_destroy_grid(cache%grid, status)
327 CALL gauxc_check_status(status)
328 CALL cleanup_after_basisset()
329 END SUBROUTINE cleanup_after_grid
334 SUBROUTINE cleanup_after_basisset()
335 CALL gauxc_destroy_basisset(cache%basisset, status)
336 CALL gauxc_check_status(status)
337 CALL cleanup_after_molecule()
338 END SUBROUTINE cleanup_after_basisset
343 SUBROUTINE cleanup_after_molecule()
344 CALL gauxc_destroy_molecule(cache%molecule, status)
345 CALL gauxc_check_status(status)
347 END SUBROUTINE cleanup_after_molecule
352 SUBROUTINE cleanup_final()
353 IF (
ALLOCATED(cache%last_positions))
DEALLOCATE (cache%last_positions)
354 cache%is_init = .false.
355 END SUBROUTINE cleanup_final
367 TYPE(cp_gauxc_status_type) :: status
369 IF (cache%is_init)
THEN
370 IF (cache%needs_gradient_grid())
THEN
371 CALL gauxc_destroy_integrator(cache%gradient_integrator, status)
372 CALL gauxc_check_status(status)
373 CALL gauxc_destroy_grid(cache%gradient_grid, status)
374 CALL gauxc_check_status(status)
376 CALL gauxc_destroy_integrator(cache%integrator, status)
377 CALL gauxc_check_status(status)
378 CALL gauxc_destroy_grid(cache%grid, status)
379 CALL gauxc_check_status(status)
380 CALL gauxc_destroy_basisset(cache%basisset, status)
381 CALL gauxc_check_status(status)
382 CALL gauxc_destroy_molecule(cache%molecule, status)
383 CALL gauxc_check_status(status)
385 IF (
ALLOCATED(cache%last_positions))
DEALLOCATE (cache%last_positions)
386 cache%is_init = .false.
389 IF (
ALLOCATED(cache%last_positions))
DEALLOCATE (cache%last_positions)
390 cache%is_init = .false.
412 TYPE(mp_para_env_type),
INTENT(in),
POINTER :: para_env
413 TYPE(particle_type),
DIMENSION(:),
POINTER :: particle_set
414 LOGICAL :: use_gradient_self_runtime, use_gradient_mpi_runtime, use_fd_gradient
415 LOGICAL :: cache_valid
419 REAL(c_double),
PARAMETER :: pos_tol = 1.0e-8_c_double
421 cache_valid = .false.
422 IF (.NOT. cache%is_init)
RETURN
423 IF (cache%natom /= params%natom)
RETURN
424 IF (cache%nspins /= params%nspins)
RETURN
425 IF (cache%batch_size /= params%batch_size)
RETURN
426 IF (abs(cache%device_runtime_fill_fraction - real(params%device_runtime_fill_fraction, c_double)) > &
427 1.0e-10_c_double)
RETURN
428 IF (trim(cache%xc_fun_name) /= trim(params%xc_fun_name))
RETURN
429 IF (trim(cache%grid_type) /= trim(params%grid_type))
RETURN
430 IF (trim(cache%radial_quadrature) /= trim(params%radial_quadrature))
RETURN
431 IF (trim(cache%pruning_scheme) /= trim(params%pruning_scheme))
RETURN
432 IF (trim(cache%lb_exec_space) /= trim(params%lb_exec_space))
RETURN
433 IF (trim(cache%int_exec_space) /= trim(params%int_exec_space))
RETURN
434 IF (trim(cache%model_eval_name) /= trim(params%model_eval_name))
RETURN
435 IF (trim(cache%lwd_kernel) /= trim(params%lwd_kernel))
RETURN
436 IF (cache%use_self_runtime .NEQV. params%use_self_runtime)
RETURN
437 IF (cache%use_mpi_runtime .NEQV. params%use_mpi_runtime)
RETURN
440 use_gradient_self_runtime = params%use_gradient_self_runtime
441 use_gradient_mpi_runtime = params%use_gradient_mpi_runtime
442 use_fd_gradient = params%use_fd_gradient
445 use_fd_gradient .AND. (cache%max_l() > 3)
446 use_gradient_mpi_runtime = &
447 use_gradient_mpi_runtime .AND. .NOT. use_fd_gradient
448 use_gradient_self_runtime = &
449 use_gradient_self_runtime .AND. .NOT. use_gradient_mpi_runtime
451 IF (cache%use_gradient_mpi_runtime .NEQV. use_gradient_mpi_runtime)
RETURN
452 IF (cache%use_fd_gradient .NEQV. use_fd_gradient)
RETURN
453 IF (cache%use_gradient_self_runtime .NEQV. use_gradient_self_runtime)
RETURN
454 IF (cache%mpi_comm /= para_env%get_handle())
RETURN
456 IF (.NOT.
ALLOCATED(cache%last_positions))
RETURN
457 IF (
SIZE(cache%last_positions, 2) /= params%natom)
RETURN
458 DO iatom = 1, params%natom
459 IF (any(abs(cache%last_positions(:, iatom) - &
460 REAL(particle_set(iatom)%r(:), c_double)) > pos_tol)) return
465 mark_used(particle_set)
467 mark_used(use_gradient_self_runtime)
468 mark_used(use_gradient_mpi_runtime)
469 mark_used(use_fd_gradient)
471 cache_valid = .false.
Define the data structure for the particle information.