48 USE dbcsr_api,
ONLY: dbcsr_desymmetrize,&
111#include "./base/base_uses.f90"
125 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'mixed_cdft_utils'
147 INTEGER :: i, iatom, iforce_eval, igroup, &
149 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: constraint_type
150 INTEGER,
ALLOCATABLE,
DIMENSION(:, :, :) :: array_sizes
162 NULLIFY (dft_control, qs_env, pw_env, auxbas_pw_pool, force_env_qs, &
165 settings%max_nkinds = 30
166 nforce_eval =
SIZE(force_env%sub_force_env)
167 ALLOCATE (settings%grid_span(nforce_eval))
168 ALLOCATE (settings%npts(3, nforce_eval))
169 ALLOCATE (settings%cutoff(nforce_eval))
170 ALLOCATE (settings%rel_cutoff(nforce_eval))
171 ALLOCATE (settings%spherical(nforce_eval))
172 ALLOCATE (settings%rs_dims(2, nforce_eval))
173 ALLOCATE (settings%odd(nforce_eval))
174 ALLOCATE (settings%atoms(natom, nforce_eval))
176 ALLOCATE (settings%coeffs(natom, nforce_eval))
177 settings%coeffs = 0.0_dp
182 ALLOCATE (settings%si(6, nforce_eval))
183 ALLOCATE (settings%sb(8, nforce_eval))
184 ALLOCATE (settings%sr(5, nforce_eval))
185 ALLOCATE (settings%cutoffs(settings%max_nkinds, nforce_eval))
186 ALLOCATE (settings%radii(settings%max_nkinds, nforce_eval))
187 settings%grid_span = 0
189 settings%cutoff = 0.0_dp
190 settings%rel_cutoff = 0.0_dp
191 settings%spherical = 0
192 settings%is_spherical = .false.
195 settings%is_odd = .false.
199 settings%sb = .false.
200 settings%cutoffs = 0.0_dp
201 settings%radii = 0.0_dp
203 DO iforce_eval = 1, nforce_eval
204 IF (.NOT.
ASSOCIATED(force_env%sub_force_env(iforce_eval)%force_env)) cycle
205 force_env_qs => force_env%sub_force_env(iforce_eval)%force_env
206 IF (mixed_env%do_mixed_qmmm_cdft)
THEN
207 qs_env => force_env_qs%qmmm_env%qs_env
211 CALL get_qs_env(qs_env, pw_env=pw_env, dft_control=dft_control)
212 IF (.NOT. dft_control%qs_control%cdft) &
213 CALL cp_abort(__location__, &
214 "A mixed CDFT simulation with multiple force_evals was requested, "// &
215 "but CDFT constraints were not active in the QS section of all force_evals!")
216 cdft_control => dft_control%qs_control%cdft_control
217 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
218 settings%bo = auxbas_pw_pool%pw_grid%bounds_local
220 IF (force_env_qs%para_env%is_source())
THEN
222 settings%grid_span(iforce_eval) = auxbas_pw_pool%pw_grid%grid_span
223 settings%npts(:, iforce_eval) = auxbas_pw_pool%pw_grid%npts
224 settings%cutoff(iforce_eval) = auxbas_pw_pool%pw_grid%cutoff
225 settings%rel_cutoff(iforce_eval) = dft_control%qs_control%relative_cutoff
226 IF (auxbas_pw_pool%pw_grid%spherical) settings%spherical(iforce_eval) = 1
227 settings%rs_dims(:, iforce_eval) = auxbas_pw_pool%pw_grid%para%rs_dims
228 IF (auxbas_pw_pool%pw_grid%grid_span ==
halfspace) settings%odd(iforce_eval) = 1
230 IF (cdft_control%natoms .GT.
SIZE(settings%atoms, 1)) &
231 CALL cp_abort(__location__, &
232 "More CDFT constraint atoms than defined in mixed section. "// &
233 "Use default values for MIXED\MAPPING.")
234 settings%atoms(1:cdft_control%natoms, iforce_eval) = cdft_control%atoms
236 settings%coeffs(1:cdft_control%natoms, iforce_eval) = cdft_control%group(1)%coeff
239 settings%si(1, iforce_eval) = cdft_control%becke_control%cutoff_type
240 settings%si(2, iforce_eval) = cdft_control%becke_control%cavity_shape
242 settings%si(3, iforce_eval) = dft_control%multiplicity
243 settings%si(4, iforce_eval) =
SIZE(cdft_control%group)
244 settings%si(5, iforce_eval) = cdft_control%type
246 settings%si(6, iforce_eval) = cdft_control%hirshfeld_control%shape_function
247 settings%si(6, iforce_eval) = cdft_control%hirshfeld_control%gaussian_shape
251 settings%sb(1, iforce_eval) = cdft_control%becke_control%cavity_confine
252 settings%sb(2, iforce_eval) = cdft_control%becke_control%should_skip
253 settings%sb(3, iforce_eval) = cdft_control%becke_control%print_cavity
254 settings%sb(4, iforce_eval) = cdft_control%becke_control%in_memory
255 settings%sb(5, iforce_eval) = cdft_control%becke_control%adjust
256 settings%sb(8, iforce_eval) = cdft_control%becke_control%use_bohr
259 settings%sb(8, iforce_eval) = cdft_control%hirshfeld_control%use_bohr
261 settings%sb(6, iforce_eval) = cdft_control%atomic_charges
262 settings%sb(7, iforce_eval) = qs_env%has_unit_metric
265 settings%sr(1, iforce_eval) = cdft_control%becke_control%rcavity
266 settings%sr(2, iforce_eval) = cdft_control%becke_control%rglobal
267 settings%sr(3, iforce_eval) = cdft_control%becke_control%eps_cavity
270 settings%sr(2, iforce_eval) = cdft_control%hirshfeld_control%radius
272 settings%sr(4, iforce_eval) = dft_control%qs_control%eps_rho_rspace
273 settings%sr(5, iforce_eval) = pw_env%cube_info(pw_env%auxbas_grid)%max_rad_ga
276 nkinds =
SIZE(cdft_control%becke_control%cutoffs_tmp)
277 IF (nkinds .GT. settings%max_nkinds) &
278 CALL cp_abort(__location__, &
279 "More than "//trim(
cp_to_string(settings%max_nkinds))// &
280 " unique elements were defined in BECKE_CONSTRAINT\ELEMENT_CUTOFF. Are you sure"// &
281 " your input is correct? If yes, please increase max_nkinds and recompile.")
282 settings%cutoffs(1:nkinds, iforce_eval) = cdft_control%becke_control%cutoffs_tmp(:)
284 IF (cdft_control%becke_control%adjust)
THEN
285 CALL get_qs_env(qs_env, atomic_kind_set=atomic_kind_set)
286 IF (.NOT.
SIZE(atomic_kind_set) ==
SIZE(cdft_control%becke_control%radii_tmp)) &
287 CALL cp_abort(__location__, &
288 "Length of keyword BECKE_CONSTRAINT\ATOMIC_RADII does not "// &
289 "match number of atomic kinds in the input coordinate file.")
290 nkinds =
SIZE(cdft_control%becke_control%radii_tmp)
291 IF (nkinds .GT. settings%max_nkinds) &
292 CALL cp_abort(__location__, &
293 "More than "//trim(
cp_to_string(settings%max_nkinds))// &
294 " unique elements were defined in BECKE_CONSTRAINT\ATOMIC_RADII. Are you sure"// &
295 " your input is correct? If yes, please increase max_nkinds and recompile.")
296 settings%radii(1:nkinds, iforce_eval) = cdft_control%becke_control%radii_tmp(:)
300 IF (
ASSOCIATED(cdft_control%hirshfeld_control%radii))
THEN
301 CALL get_qs_env(qs_env, atomic_kind_set=atomic_kind_set)
302 IF (.NOT.
SIZE(atomic_kind_set) ==
SIZE(cdft_control%hirshfeld_control%radii)) &
303 CALL cp_abort(__location__, &
304 "Length of keyword HIRSHFELD_CONSTRAINT&RADII does not "// &
305 "match number of atomic kinds in the input coordinate file.")
306 nkinds =
SIZE(cdft_control%hirshfeld_control%radii)
307 IF (nkinds .GT. settings%max_nkinds) &
308 CALL cp_abort(__location__, &
309 "More than "//trim(
cp_to_string(settings%max_nkinds))// &
310 " unique elements were defined in HIRSHFELD_CONSTRAINT&RADII. Are you sure"// &
311 " your input is correct? If yes, please increase max_nkinds and recompile.")
312 settings%radii(1:nkinds, iforce_eval) = cdft_control%hirshfeld_control%radii(:)
318 CALL force_env%para_env%sum(settings%grid_span)
319 CALL force_env%para_env%sum(settings%npts)
320 CALL force_env%para_env%sum(settings%cutoff)
321 CALL force_env%para_env%sum(settings%rel_cutoff)
322 CALL force_env%para_env%sum(settings%spherical)
323 CALL force_env%para_env%sum(settings%rs_dims)
324 CALL force_env%para_env%sum(settings%odd)
326 DO iforce_eval = 2, nforce_eval
327 is_match = is_match .AND. (settings%grid_span(1) == settings%grid_span(iforce_eval))
328 is_match = is_match .AND. (settings%npts(1, 1) == settings%npts(1, iforce_eval))
329 is_match = is_match .AND. (settings%cutoff(1) == settings%cutoff(iforce_eval))
330 is_match = is_match .AND. (settings%rel_cutoff(1) == settings%rel_cutoff(iforce_eval))
331 is_match = is_match .AND. (settings%spherical(1) == settings%spherical(iforce_eval))
332 is_match = is_match .AND. (settings%rs_dims(1, 1) == settings%rs_dims(1, iforce_eval))
333 is_match = is_match .AND. (settings%rs_dims(2, 1) == settings%rs_dims(2, iforce_eval))
334 is_match = is_match .AND. (settings%odd(1) == settings%odd(iforce_eval))
336 IF (.NOT. is_match) &
337 CALL cp_abort(__location__, &
338 "Mismatch detected in the &MGRID settings of the CDFT force_evals.")
339 IF (settings%spherical(1) == 1) settings%is_spherical = .true.
340 IF (settings%odd(1) == 1) settings%is_odd = .true.
342 CALL force_env%para_env%sum(settings%atoms)
344 CALL force_env%para_env%sum(settings%coeffs)
346 DO i = 1,
SIZE(settings%atoms, 1)
347 DO iforce_eval = 2, nforce_eval
349 IF (settings%atoms(i, 1) /= settings%atoms(i, iforce_eval)) is_match = .false.
350 IF (settings%coeffs(i, 1) /= settings%coeffs(i, iforce_eval)) is_match = .false.
353 IF (settings%atoms(i, 1) /= 0) settings%ncdft = settings%ncdft + 1
356 CALL cp_abort(__location__, &
357 "Mismatch detected in the &CDFT section of the CDFT force_evals. "// &
358 "Parallel mode mixed CDFT requires identical constraint definitions in both CDFT states. "// &
359 "Switch to serial mode or disable keyword PARALLEL_BUILD if you "// &
360 "want to use nonidentical constraint definitions.")
361 CALL force_env%para_env%sum(settings%si)
362 CALL force_env%para_env%sum(settings%sr)
363 DO i = 1,
SIZE(settings%sb, 1)
364 CALL force_env%para_env%sum(settings%sb(i, 1))
365 DO iforce_eval = 2, nforce_eval
366 CALL force_env%para_env%sum(settings%sb(i, iforce_eval))
367 IF (settings%sb(i, 1) .NEQV. settings%sb(i, iforce_eval)) is_match = .false.
370 DO i = 1,
SIZE(settings%si, 1)
371 DO iforce_eval = 2, nforce_eval
372 IF (settings%si(i, 1) /= settings%si(i, iforce_eval)) is_match = .false.
375 DO i = 1,
SIZE(settings%sr, 1)
376 DO iforce_eval = 2, nforce_eval
377 IF (settings%sr(i, 1) /= settings%sr(i, iforce_eval)) is_match = .false.
380 IF (.NOT. is_match) &
381 CALL cp_abort(__location__, &
382 "Mismatch detected in the &CDFT settings of the CDFT force_evals.")
384 IF (mixed_cdft%dlb .AND. .NOT. settings%sb(1, 1)) &
385 CALL cp_abort(__location__, &
386 "Parallel mode mixed CDFT load balancing requires Gaussian cavity confinement.")
390 ALLOCATE (array_sizes(nforce_eval, settings%si(4, 1), 2))
391 array_sizes(:, :, :) = 0
392 DO iforce_eval = 1, nforce_eval
393 IF (.NOT.
ASSOCIATED(force_env%sub_force_env(iforce_eval)%force_env)) cycle
394 force_env_qs => force_env%sub_force_env(iforce_eval)%force_env
395 IF (mixed_env%do_mixed_qmmm_cdft)
THEN
396 qs_env => force_env_qs%qmmm_env%qs_env
400 CALL get_qs_env(qs_env, dft_control=dft_control)
401 cdft_control => dft_control%qs_control%cdft_control
402 IF (force_env_qs%para_env%is_source())
THEN
403 DO igroup = 1,
SIZE(cdft_control%group)
404 array_sizes(iforce_eval, igroup, 1) =
SIZE(cdft_control%group(igroup)%atoms)
405 array_sizes(iforce_eval, igroup, 2) =
SIZE(cdft_control%group(igroup)%coeff)
410 CALL force_env%para_env%sum(array_sizes)
411 IF (any(array_sizes(:, :, 1) /= array_sizes(1, 1, 1)) .OR. &
412 any(array_sizes(:, :, 2) /= array_sizes(1, 1, 2))) &
413 mixed_cdft%identical_constraints = .false.
415 IF (mixed_cdft%identical_constraints)
THEN
417 ALLOCATE (atoms(nforce_eval, settings%si(4, 1)))
418 ALLOCATE (coeff(nforce_eval, settings%si(4, 1)))
419 ALLOCATE (constraint_type(nforce_eval, settings%si(4, 1)))
420 constraint_type(:, :) = 0
421 DO iforce_eval = 1, nforce_eval
422 DO i = 1, settings%si(4, 1)
423 NULLIFY (atoms(iforce_eval, i)%array)
424 NULLIFY (coeff(iforce_eval, i)%array)
425 ALLOCATE (atoms(iforce_eval, i)%array(array_sizes(iforce_eval, i, 1)))
426 ALLOCATE (coeff(iforce_eval, i)%array(array_sizes(iforce_eval, i, 1)))
427 atoms(iforce_eval, i)%array(:) = 0
428 coeff(iforce_eval, i)%array(:) = 0
431 IF (.NOT.
ASSOCIATED(force_env%sub_force_env(iforce_eval)%force_env)) cycle
432 force_env_qs => force_env%sub_force_env(iforce_eval)%force_env
433 IF (mixed_env%do_mixed_qmmm_cdft)
THEN
434 qs_env => force_env_qs%qmmm_env%qs_env
438 CALL get_qs_env(qs_env, dft_control=dft_control)
439 cdft_control => dft_control%qs_control%cdft_control
440 IF (force_env_qs%para_env%is_source())
THEN
441 DO i = 1, settings%si(4, 1)
442 atoms(iforce_eval, i)%array(:) = cdft_control%group(i)%atoms
443 coeff(iforce_eval, i)%array(:) = cdft_control%group(i)%coeff
444 constraint_type(iforce_eval, i) = cdft_control%group(i)%constraint_type
449 DO i = 1, settings%si(4, 1)
450 DO iforce_eval = 1, nforce_eval
451 CALL force_env%para_env%sum(atoms(iforce_eval, i)%array)
452 CALL force_env%para_env%sum(coeff(iforce_eval, i)%array)
453 CALL force_env%para_env%sum(constraint_type(iforce_eval, i))
455 DO iforce_eval = 2, nforce_eval
456 DO iatom = 1,
SIZE(atoms(1, i)%array)
457 IF (atoms(1, i)%array(iatom) /= atoms(iforce_eval, i)%array(iatom)) &
458 mixed_cdft%identical_constraints = .false.
459 IF (coeff(1, i)%array(iatom) /= coeff(iforce_eval, i)%array(iatom)) &
460 mixed_cdft%identical_constraints = .false.
461 IF (.NOT. mixed_cdft%identical_constraints)
EXIT
463 IF (constraint_type(1, i) /= constraint_type(iforce_eval, i)) &
464 mixed_cdft%identical_constraints = .false.
465 IF (.NOT. mixed_cdft%identical_constraints)
EXIT
467 IF (.NOT. mixed_cdft%identical_constraints)
EXIT
470 DO iforce_eval = 1, nforce_eval
471 DO i = 1, settings%si(4, 1)
472 DEALLOCATE (atoms(iforce_eval, i)%array)
473 DEALLOCATE (coeff(iforce_eval, i)%array)
478 DEALLOCATE (constraint_type)
480 DEALLOCATE (array_sizes)
484 DO iforce_eval = 1, nforce_eval
485 IF (.NOT.
ASSOCIATED(force_env%sub_force_env(iforce_eval)%force_env)) cycle
486 force_env_qs => force_env%sub_force_env(iforce_eval)%force_env
487 IF (mixed_env%do_mixed_qmmm_cdft)
THEN
488 qs_env => force_env_qs%qmmm_env%qs_env
492 CALL get_qs_env(qs_env, dft_control=dft_control)
493 cdft_control => dft_control%qs_control%cdft_control
495 IF (.NOT. dft_control%qs_control%gapw)
THEN
496 DO i = 1,
SIZE(cdft_control%group)
497 DEALLOCATE (cdft_control%group(i)%coeff)
498 DEALLOCATE (cdft_control%group(i)%atoms)
500 IF (.NOT. cdft_control%atomic_charges)
DEALLOCATE (cdft_control%atoms)
503 IF (iforce_eval == 1) cycle
504 DO igroup = 1,
SIZE(cdft_control%group)
505 IF (.NOT. dft_control%qs_control%gapw)
THEN
506 DEALLOCATE (cdft_control%group(igroup)%coeff)
507 DEALLOCATE (cdft_control%group(igroup)%atoms)
511 IF (.NOT. cdft_control%atomic_charges)
DEALLOCATE (cdft_control%atoms)
512 IF (cdft_control%becke_control%cavity_confine) &
515 DEALLOCATE (cdft_control%becke_control%cutoffs_tmp)
516 IF (cdft_control%becke_control%adjust) &
517 DEALLOCATE (cdft_control%becke_control%radii_tmp)
542 NULLIFY (cdft_control)
545 mixed_cdft%multiplicity = settings%si(3, 1)
546 mixed_cdft%has_unit_metric = settings%sb(7, 1)
547 mixed_cdft%eps_rho_rspace = settings%sr(4, 1)
548 mixed_cdft%nconstraint = settings%si(4, 1)
549 settings%radius = settings%sr(5, 1)
552 IF (settings%sb(6, 1)) &
553 CALL cp_abort(__location__, &
554 "Calculation of atomic Becke charges not supported with parallel mode mixed CDFT")
555 IF (mixed_cdft%nconstraint /= 1) &
556 CALL cp_abort(__location__, &
557 "Parallel mode mixed CDFT does not yet support multiple constraints.")
560 CALL cp_abort(__location__, &
561 "Parallel mode mixed CDFT does not support Hirshfeld constraints.")
563 ALLOCATE (mixed_cdft%cdft_control)
565 cdft_control => mixed_cdft%cdft_control
566 ALLOCATE (cdft_control%atoms(settings%ncdft))
567 cdft_control%atoms = settings%atoms(1:settings%ncdft, 1)
568 ALLOCATE (cdft_control%group(1))
569 ALLOCATE (cdft_control%group(1)%atoms(settings%ncdft))
570 ALLOCATE (cdft_control%group(1)%coeff(settings%ncdft))
571 NULLIFY (cdft_control%group(1)%weight)
572 NULLIFY (cdft_control%group(1)%gradients)
573 NULLIFY (cdft_control%group(1)%integrated)
574 cdft_control%group(1)%atoms = cdft_control%atoms
575 cdft_control%group(1)%coeff = settings%coeffs(1:settings%ncdft, 1)
576 cdft_control%natoms = settings%ncdft
577 cdft_control%atomic_charges = settings%sb(6, 1)
578 cdft_control%becke_control%cutoff_type = settings%si(1, 1)
579 cdft_control%becke_control%cavity_confine = settings%sb(1, 1)
580 cdft_control%becke_control%should_skip = settings%sb(2, 1)
581 cdft_control%becke_control%print_cavity = settings%sb(3, 1)
582 cdft_control%becke_control%in_memory = settings%sb(4, 1)
583 cdft_control%becke_control%adjust = settings%sb(5, 1)
584 cdft_control%becke_control%cavity_shape = settings%si(2, 1)
585 cdft_control%becke_control%use_bohr = settings%sb(8, 1)
586 cdft_control%becke_control%rcavity = settings%sr(1, 1)
587 cdft_control%becke_control%rglobal = settings%sr(2, 1)
588 cdft_control%becke_control%eps_cavity = settings%sr(3, 1)
591 CALL force_env%para_env%sum(settings%cutoffs)
592 DO i = 1,
SIZE(settings%cutoffs, 1)
593 IF (settings%cutoffs(i, 1) /= settings%cutoffs(i, 2)) is_match = .false.
594 IF (settings%cutoffs(i, 1) /= 0.0_dp) nkinds = nkinds + 1
596 IF (.NOT. is_match) &
597 CALL cp_abort(__location__, &
598 "Mismatch detected in the &BECKE_CONSTRAINT "// &
599 "&ELEMENT_CUTOFF settings of the two force_evals.")
600 ALLOCATE (cdft_control%becke_control%cutoffs_tmp(nkinds))
601 cdft_control%becke_control%cutoffs_tmp = settings%cutoffs(1:nkinds, 1)
604 IF (cdft_control%becke_control%adjust)
THEN
605 CALL force_env%para_env%sum(settings%radii)
606 DO i = 1,
SIZE(settings%radii, 1)
607 IF (settings%radii(i, 1) /= settings%radii(i, 2)) is_match = .false.
608 IF (settings%radii(i, 1) /= 0.0_dp) nkinds = nkinds + 1
610 IF (.NOT. is_match) &
611 CALL cp_abort(__location__, &
612 "Mismatch detected in the &BECKE_CONSTRAINT "// &
613 "&ATOMIC_RADII settings of the two force_evals.")
614 ALLOCATE (cdft_control%becke_control%radii(nkinds))
615 cdft_control%becke_control%radii = settings%radii(1:nkinds, 1)
637 CHARACTER(len=default_path_length) :: c_val, input_file_path, output_file_path
638 INTEGER :: i, imap, iounit, j, lp, n_force_eval, &
639 ncpu, nforce_eval, ntargets, offset, &
641 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: bounds
642 INTEGER,
DIMENSION(2, 3) :: bo, bo_mixed
643 INTEGER,
DIMENSION(3) :: higher_grid_layout
644 INTEGER,
DIMENSION(:),
POINTER :: i_force_eval, mixed_rs_dims, recvbuffer, &
645 recvbuffer2, sendbuffer
658 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
663 TYPE(
section_vals_type),
POINTER :: force_env_section, force_env_sections, kind_section, &
664 print_section, root_section, rs_grid_section, subsys_section
666 NULLIFY (cell_mix, subsys_mix, force_env_section, subsys_section, &
667 print_section, root_section, kind_section, force_env_sections, &
668 rs_grid_section, auxbas_pw_pool, pw_env, pw_pools, pw_grid, &
669 sendbuffer, qs_env, mixed_rs_dims, i_force_eval, recvbuffer, &
670 recvbuffer2, globenv, atomic_kind_set, qs_kind_set, rs_descs, &
674 CALL force_env_get(force_env=force_env, force_env_section=force_env_section)
678 nforce_eval =
SIZE(force_env%sub_force_env)
679 ncpu = force_env%para_env%num_pe
681 IF (.NOT. mixed_env%do_mixed_qmmm_cdft)
THEN
685 CALL get_qs_env(force_env_qs%qmmm_env%qs_env, &
686 cp_subsys=subsys_mix)
706 mixed_cdft%is_pencil = .false.
707 mixed_cdft%is_special = .false.
710 IF (ncpu/2 .GT. settings%npts(1, 1)) &
711 cpabort(
"ncpu/2 => nx: decrease ncpu or disable xc_smoothing")
713 ALLOCATE (mixed_rs_dims(2))
714 IF (settings%rs_dims(2, 1) /= 1) mixed_cdft%is_pencil = .true.
715 IF (.NOT. mixed_cdft%is_pencil .AND. ncpu .GT. settings%npts(1, 1)) mixed_cdft%is_special = .true.
716 IF (mixed_cdft%is_special)
THEN
717 mixed_rs_dims = (/-1, -1/)
718 ELSE IF (mixed_cdft%is_pencil)
THEN
719 mixed_rs_dims = (/settings%rs_dims(1, 1), 2*settings%rs_dims(2, 1)/)
721 mixed_rs_dims = (/2*settings%rs_dims(1, 1), 1/)
723 IF (.NOT. mixed_env%do_mixed_qmmm_cdft)
THEN
727 CALL get_qs_env(force_env_qs%qmmm_env%qs_env, &
730 CALL pw_grid_setup(cell_mix%hmat, pw_grid, grid_span=settings%grid_span(1), &
731 npts=settings%npts(:, 1), cutoff=settings%cutoff(1), &
732 spherical=settings%is_spherical, odd=settings%is_odd, &
733 fft_usage=.true., ncommensurate=0, icommensurate=1, &
737 IF (mixed_cdft%is_special)
THEN
738 IF (.NOT. pw_grid%para%rs_dims(2) /= 1) is_match = .false.
739 ELSE IF (mixed_cdft%is_pencil)
THEN
740 IF (.NOT. pw_grid%para%rs_dims(1) == mixed_rs_dims(1)) is_match = .false.
742 IF (.NOT. pw_grid%para%rs_dims(2) == 1) is_match = .false.
744 IF (.NOT. is_match) &
745 CALL cp_abort(__location__, &
746 "Unable to create a suitable grid distribution "// &
747 "for mixed CDFT calculations. Try decreasing the total number "// &
748 "of processors or disabling xc_smoothing.")
749 DEALLOCATE (mixed_rs_dims)
751 bo_mixed = pw_grid%bounds_local
752 ALLOCATE (pw_pools(1))
753 NULLIFY (pw_pools(1)%pool)
756 IF (mixed_cdft%cdft_control%becke_control%cavity_confine)
THEN
760 radius_type=mixed_cdft%cdft_control%becke_control%cavity_shape, &
761 use_bohr=mixed_cdft%cdft_control%becke_control%use_bohr)
765 IF (mixed_cdft%cdft_control%becke_control%cavity_confine .OR. &
766 mixed_cdft%wfn_overlap_method)
THEN
768 "PRINT%GRID_INFORMATION")
769 ALLOCATE (mixed_cdft%pw_env%gridlevel_info)
771 ngrid_levels=1, cutoff=settings%cutoff, &
772 rel_cutoff=settings%rel_cutoff(1), &
773 print_section=print_section)
774 ALLOCATE (rs_descs(1))
775 ALLOCATE (rs_grids(1))
776 ALLOCATE (mixed_cdft%pw_env%cube_info(1))
777 higher_grid_layout = (/-1, -1, -1/)
780 pw_grid%dr(:), pw_grid%dh(:, :), &
781 pw_grid%dh_inv(:, :), &
782 pw_grid%orthorhombic, settings%radius)
783 NULLIFY (root_section, force_env_section, force_env_sections, rs_grid_section)
786 CALL multiple_fe_list(force_env_sections, root_section, i_force_eval, n_force_eval)
788 i_force_eval(2), i_force_eval(2))
792 rs_grid_section=rs_grid_section, ilevel=1, &
793 higher_grid_layout=higher_grid_layout)
794 NULLIFY (rs_descs(1)%rs_desc)
796 IF (rs_descs(1)%rs_desc%distributed) higher_grid_layout = rs_descs(1)%rs_desc%group_dim
799 mixed_cdft%pw_env%rs_descs => rs_descs
800 mixed_cdft%pw_env%rs_grids => rs_grids
803 i_rep_section=i_force_eval(1))
805 NULLIFY (qs_kind_set)
806 CALL cp_subsys_get(subsys_mix, atomic_kind_set=atomic_kind_set)
808 force_env%para_env, force_env_section)
809 mixed_cdft%qs_kind_set => qs_kind_set
810 DEALLOCATE (i_force_eval)
814 force_env_section=force_env_section)
816 mixed_cdft%pw_env%auxbas_grid = 1
817 NULLIFY (mixed_cdft%pw_env%pw_pools)
818 mixed_cdft%pw_env%pw_pools => pw_pools
821 IF (.NOT. mixed_cdft%is_special)
THEN
822 ALLOCATE (mixed_cdft%dest_list(2))
823 ALLOCATE (mixed_cdft%source_list(2))
824 imap = force_env%para_env%mepos/2
825 mixed_cdft%dest_list = (/imap, imap + force_env%para_env%num_pe/2/)
826 imap = mod(force_env%para_env%mepos, force_env%para_env%num_pe/2) + &
827 modulo(force_env%para_env%mepos, force_env%para_env%num_pe/2)
828 mixed_cdft%source_list = (/imap, imap + 1/)
830 ALLOCATE (mixed_cdft%recv_bo(4))
831 ALLOCATE (sendbuffer(2), recvbuffer(2), recvbuffer2(2))
832 IF (mixed_cdft%is_pencil)
THEN
833 sendbuffer = (/bo_mixed(1, 2), bo_mixed(2, 2)/)
835 sendbuffer = (/bo_mixed(1, 1), bo_mixed(2, 1)/)
838 CALL force_env%para_env%isend(msgin=sendbuffer, dest=mixed_cdft%dest_list(1), &
840 CALL force_env%para_env%irecv(msgout=recvbuffer, source=mixed_cdft%source_list(1), &
842 CALL force_env%para_env%irecv(msgout=recvbuffer2, source=mixed_cdft%source_list(2), &
845 CALL force_env%para_env%isend(msgin=sendbuffer, dest=mixed_cdft%dest_list(2), &
848 mixed_cdft%recv_bo(1:2) = recvbuffer
849 mixed_cdft%recv_bo(3:4) = recvbuffer2
850 DEALLOCATE (sendbuffer, recvbuffer, recvbuffer2)
852 IF (mixed_env%do_mixed_qmmm_cdft)
THEN
853 qs_env => force_env_qs%qmmm_env%qs_env
858 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
861 ALLOCATE (bounds(0:auxbas_pw_pool%pw_grid%para%group_size - 1, 1:2))
862 DO i = 0, auxbas_pw_pool%pw_grid%para%group_size - 1
863 bounds(i, 1:2) = auxbas_pw_pool%pw_grid%para%bo(1:2, 1, i, 1)
864 bounds(i, 1:2) = bounds(i, 1:2) - auxbas_pw_pool%pw_grid%npts(1)/2 - 1
870 DO i = 0, auxbas_pw_pool%pw_grid%para%group_size - 1
871 IF ((bounds(i, 1) .GE. bo_mixed(1, 1) .AND. bounds(i, 1) .LE. bo_mixed(2, 1)) .OR. &
872 (bounds(i, 2) .GE. bo_mixed(1, 1) .AND. bounds(i, 2) .LE. bo_mixed(2, 1)))
THEN
873 ntargets = ntargets + 1
874 IF (offset == -1) offset = i
875 ELSE IF (bounds(i, 2) .GT. bo_mixed(2, 1))
THEN
881 ALLOCATE (mixed_cdft%dest_list(ntargets))
882 ALLOCATE (mixed_cdft%dest_list_bo(2, ntargets))
885 DO i = offset, offset + ntargets - 1
886 mixed_cdft%dest_list(j) = i
887 mixed_cdft%dest_list_bo(:, j) = (/bo_mixed(1, 1) + (bounds(i, 1) - bo_mixed(1, 1)), &
888 bo_mixed(2, 1) + (bounds(i, 2) - bo_mixed(2, 1))/)
891 ALLOCATE (mixed_cdft%dest_list_save(ntargets), mixed_cdft%dest_bo_save(2, ntargets))
893 mixed_cdft%dest_list_save = mixed_cdft%dest_list
894 mixed_cdft%dest_bo_save = mixed_cdft%dest_list_bo
898 ALLOCATE (bounds(0:pw_pools(1)%pool%pw_grid%para%group_size - 1, 1:4))
899 DO i = 0, pw_pools(1)%pool%pw_grid%para%group_size - 1
900 bounds(i, 1:2) = pw_pools(1)%pool%pw_grid%para%bo(1:2, 1, i, 1)
901 bounds(i, 3:4) = pw_pools(1)%pool%pw_grid%para%bo(1:2, 2, i, 1)
902 bounds(i, 1:2) = bounds(i, 1:2) - pw_pools(1)%pool%pw_grid%npts(1)/2 - 1
903 bounds(i, 3:4) = bounds(i, 3:4) - pw_pools(1)%pool%pw_grid%npts(2)/2 - 1
907 DO i = 0, pw_pools(1)%pool%pw_grid%para%group_size - 1
908 IF ((bo(1, 1) .GE. bounds(i, 1) .AND. bo(1, 1) .LE. bounds(i, 2)) .OR. &
909 (bo(2, 1) .GE. bounds(i, 1) .AND. bo(2, 1) .LE. bounds(i, 2)))
THEN
910 ntargets = ntargets + 1
911 IF (offset == -1) offset = i
912 ELSE IF (bo(2, 1) .LT. bounds(i, 1))
THEN
918 ALLOCATE (mixed_cdft%source_list(ntargets))
919 ALLOCATE (mixed_cdft%source_list_bo(4, ntargets))
921 DO i = offset, offset + ntargets - 1
922 mixed_cdft%source_list(j) = i
923 IF (bo(1, 1) .GE. bounds(i, 1) .AND. bo(2, 1) .LE. bounds(i, 2))
THEN
924 mixed_cdft%source_list_bo(:, j) = (/bo(1, 1), bo(2, 1), &
925 bounds(i, 3), bounds(i, 4)/)
926 ELSE IF (bo(1, 1) .GE. bounds(i, 1) .AND. bo(1, 1) .LE. bounds(i, 2))
THEN
927 mixed_cdft%source_list_bo(:, j) = (/bo(1, 1), bounds(i, 2), &
928 bounds(i, 3), bounds(i, 4)/)
930 mixed_cdft%source_list_bo(:, j) = (/bounds(i, 1), bo(2, 1), &
931 bounds(i, 3), bounds(i, 4)/)
935 ALLOCATE (mixed_cdft%source_list_save(ntargets), mixed_cdft%source_bo_save(4, ntargets))
937 mixed_cdft%source_list_save = mixed_cdft%source_list
938 mixed_cdft%source_bo_save = mixed_cdft%source_list_bo
946 ALLOCATE (mixed_cdft%sub_logger(nforce_eval - 1))
947 DO i = 1, nforce_eval - 1
948 IF (force_env%para_env%is_source())
THEN
950 c_val=input_file_path)
951 lp = len_trim(input_file_path)
952 input_file_path(lp + 1:len(input_file_path)) =
"-r-"//adjustl(
cp_to_string(i + 1))
953 lp = len_trim(input_file_path)
954 output_file_path = input_file_path(1:lp)//
".out"
955 CALL open_file(file_name=output_file_path, file_status=
"UNKNOWN", &
956 file_action=
"WRITE", file_position=
"APPEND", &
962 para_env=force_env%para_env, &
963 default_global_unit_nr=unit_nr, &
964 close_global_unit_on_dealloc=.false.)
968 IF (c_val /=
"")
THEN
970 local_filename=trim(c_val)//
"_localLog")
973 IF (c_val /=
"")
THEN
975 local_filename=trim(c_val)//
"_localLog")
977 mixed_cdft%sub_logger(i)%p%iter_info%project_name = c_val
979 i_val=mixed_cdft%sub_logger(i)%p%iter_info%print_level)
981 IF (mixed_cdft%wfn_overlap_method)
THEN
983 NULLIFY (root_section, force_env_section, force_env_sections, rs_grid_section)
986 CALL multiple_fe_list(force_env_sections, root_section, i_force_eval, n_force_eval)
988 i_force_eval(2), i_force_eval(2))
990 i_rep_section=i_force_eval(1))
992 NULLIFY (qs_kind_set)
993 CALL cp_subsys_get(subsys_mix, atomic_kind_set=atomic_kind_set)
995 force_env%para_env, force_env_section)
996 mixed_cdft%qs_kind_set => qs_kind_set
997 DEALLOCATE (i_force_eval)
999 mixed_cdft%qs_kind_set => qs_kind_set
1002 force_env_section=force_env_section)
1005 DEALLOCATE (settings%grid_span)
1006 DEALLOCATE (settings%npts)
1007 DEALLOCATE (settings%spherical)
1008 DEALLOCATE (settings%rs_dims)
1009 DEALLOCATE (settings%odd)
1010 DEALLOCATE (settings%atoms)
1012 DEALLOCATE (settings%coeffs)
1013 DEALLOCATE (settings%cutoffs)
1014 DEALLOCATE (settings%radii)
1015 DEALLOCATE (settings%si)
1016 DEALLOCATE (settings%sr)
1017 DEALLOCATE (settings%sb)
1018 DEALLOCATE (settings%cutoff)
1019 DEALLOCATE (settings%rel_cutoff)
1021 IF (mixed_env%do_mixed_et)
THEN
1022 NULLIFY (root_section)
1023 CALL force_env_get(force_env, globenv=globenv, root_section=root_section)
1024 CALL cp_blacs_env_create(mixed_cdft%blacs_env, force_env%para_env, globenv%blacs_grid_layout, &
1025 globenv%blacs_repeatable)
1028 "MIXED%MIXED_CDFT%PRINT%PROGRAM_RUN_INFO")
1043 INTEGER :: iforce_eval, ispin, ivar, ncol_overlap, &
1044 ncol_wmat, nforce_eval, nrow_overlap, &
1045 nrow_wmat, nspins, nvar
1046 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: ncol_mo, nrow_mo
1047 LOGICAL :: uniform_occupation
1048 LOGICAL,
ALLOCATABLE,
DIMENSION(:) :: has_occupation_numbers
1052 fm_struct_tmp, fm_struct_wmat
1053 TYPE(
cp_fm_type) :: matrix_s_tmp, mixed_matrix_s_tmp
1054 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: matrix_p_tmp, mixed_matrix_p_tmp, &
1055 mixed_wmat_tmp, mo_coeff_tmp, wmat_tmp
1056 TYPE(
cp_fm_type),
DIMENSION(:, :),
POINTER :: mixed_mo_coeff
1057 TYPE(dbcsr_p_type),
DIMENSION(:, :),
POINTER :: density_matrix, w_matrix
1058 TYPE(dbcsr_type) :: desymm_tmp
1059 TYPE(dbcsr_type),
POINTER :: mixed_matrix_s
1066 NULLIFY (mixed_env, mixed_cdft, qs_env, dft_control, fm_struct_mo, &
1067 fm_struct_wmat, fm_struct_overlap, fm_struct_tmp, &
1068 mixed_mo_coeff, mixed_matrix_s, density_matrix, blacs_env, w_matrix, force_env_qs)
1069 cpassert(
ASSOCIATED(force_env))
1070 mixed_env => force_env%mixed_env
1071 nforce_eval =
SIZE(force_env%sub_force_env)
1073 cpassert(
ASSOCIATED(mixed_cdft))
1076 ALLOCATE (has_occupation_numbers(nforce_eval))
1077 has_occupation_numbers = .false.
1078 DO iforce_eval = 1, nforce_eval
1079 IF (.NOT.
ASSOCIATED(force_env%sub_force_env(iforce_eval)%force_env)) cycle
1080 force_env_qs => force_env%sub_force_env(iforce_eval)%force_env
1081 IF (force_env%mixed_env%do_mixed_qmmm_cdft)
THEN
1082 qs_env => force_env_qs%qmmm_env%qs_env
1086 CALL get_qs_env(qs_env, dft_control=dft_control)
1087 cpassert(
ASSOCIATED(dft_control))
1088 nspins = dft_control%nspins
1089 IF (force_env_qs%para_env%is_source()) &
1090 has_occupation_numbers(iforce_eval) =
ALLOCATED(dft_control%qs_control%cdft_control%occupations)
1092 CALL force_env%para_env%sum(has_occupation_numbers(1))
1093 DO iforce_eval = 2, nforce_eval
1094 CALL force_env%para_env%sum(has_occupation_numbers(iforce_eval))
1095 IF (has_occupation_numbers(1) .NEQV. has_occupation_numbers(iforce_eval)) &
1096 CALL cp_abort(__location__, &
1097 "Mixing of uniform and non-uniform occupations is not allowed.")
1099 uniform_occupation = .NOT. has_occupation_numbers(1)
1100 DEALLOCATE (has_occupation_numbers)
1102 nvar =
SIZE(dft_control%qs_control%cdft_control%target)
1103 IF (.NOT.
ALLOCATED(mixed_cdft%constraint_type))
THEN
1104 ALLOCATE (mixed_cdft%constraint_type(nvar, nforce_eval))
1105 mixed_cdft%constraint_type(:, :) = 0
1106 IF (mixed_cdft%identical_constraints)
THEN
1108 mixed_cdft%constraint_type(ivar, :) = &
1109 dft_control%qs_control%cdft_control%group(ivar)%constraint_type
1113 DO iforce_eval = 1, nforce_eval
1114 IF (.NOT.
ASSOCIATED(force_env%sub_force_env(iforce_eval)%force_env)) cycle
1115 IF (force_env%mixed_env%do_mixed_qmmm_cdft)
THEN
1116 qs_env => force_env%sub_force_env(iforce_eval)%force_env%qmmm_env%qs_env
1118 CALL force_env_get(force_env%sub_force_env(iforce_eval)%force_env, qs_env=qs_env)
1120 CALL get_qs_env(qs_env, dft_control=dft_control)
1121 IF (force_env%sub_force_env(iforce_eval)%force_env%para_env%is_source())
THEN
1123 mixed_cdft%constraint_type(ivar, iforce_eval) = &
1124 dft_control%qs_control%cdft_control%group(ivar)%constraint_type
1128 CALL force_env%para_env%sum(mixed_cdft%constraint_type)
1132 ALLOCATE (mixed_cdft%matrix%mixed_mo_coeff(nforce_eval, nspins))
1133 mixed_mo_coeff => mixed_cdft%matrix%mixed_mo_coeff
1134 ALLOCATE (mixed_cdft%matrix%w_matrix(nforce_eval, nvar))
1135 w_matrix => mixed_cdft%matrix%w_matrix
1136 CALL dbcsr_init_p(mixed_cdft%matrix%mixed_matrix_s)
1137 mixed_matrix_s => mixed_cdft%matrix%mixed_matrix_s
1138 IF (mixed_cdft%calculate_metric)
THEN
1139 ALLOCATE (mixed_cdft%matrix%density_matrix(nforce_eval, nspins))
1140 density_matrix => mixed_cdft%matrix%density_matrix
1142 ALLOCATE (mo_coeff_tmp(nforce_eval, nspins), wmat_tmp(nforce_eval, nvar))
1143 ALLOCATE (nrow_mo(nspins), ncol_mo(nspins))
1144 IF (mixed_cdft%calculate_metric)
ALLOCATE (matrix_p_tmp(nforce_eval, nspins))
1145 IF (.NOT. uniform_occupation)
THEN
1146 ALLOCATE (mixed_cdft%occupations(nforce_eval, nspins))
1147 ALLOCATE (occno_tmp(nforce_eval, nspins))
1149 DO iforce_eval = 1, nforce_eval
1151 DO ispin = 1, nspins
1155 IF (.NOT. uniform_occupation) &
1156 NULLIFY (occno_tmp(iforce_eval, ispin)%array)
1158 IF (.NOT.
ASSOCIATED(force_env%sub_force_env(iforce_eval)%force_env)) cycle
1161 force_env_qs => force_env%sub_force_env(iforce_eval)%force_env
1162 IF (force_env%mixed_env%do_mixed_qmmm_cdft)
THEN
1163 qs_env => force_env_qs%qmmm_env%qs_env
1167 CALL get_qs_env(qs_env, dft_control=dft_control, blacs_env=blacs_env)
1169 CALL dbcsr_get_info(dft_control%qs_control%cdft_control%matrix_s%matrix, &
1170 nfullrows_total=nrow_overlap, nfullcols_total=ncol_overlap)
1171 CALL dbcsr_get_info(dft_control%qs_control%cdft_control%wmat(1)%matrix, &
1172 nfullrows_total=nrow_wmat, nfullcols_total=ncol_wmat)
1174 DO ispin = 1, nspins
1175 CALL cp_fm_get_info(dft_control%qs_control%cdft_control%mo_coeff(ispin), &
1176 ncol_global=ncol_mo(ispin), nrow_global=nrow_mo(ispin))
1177 CALL cp_fm_create(matrix=mo_coeff_tmp(iforce_eval, ispin), &
1178 matrix_struct=dft_control%qs_control%cdft_control%mo_coeff(ispin)%matrix_struct, &
1179 name=
"MO_COEFF_"//trim(adjustl(
cp_to_string(iforce_eval)))//
"_" &
1181 CALL cp_fm_to_fm(dft_control%qs_control%cdft_control%mo_coeff(ispin), &
1182 mo_coeff_tmp(iforce_eval, ispin))
1184 CALL cp_fm_release(dft_control%qs_control%cdft_control%mo_coeff)
1186 CALL cp_fm_struct_create(fm_struct_tmp, nrow_global=nrow_wmat, ncol_global=ncol_wmat, context=blacs_env, &
1187 para_env=force_env%sub_force_env(iforce_eval)%force_env%para_env, &
1188 square_blocks=.true.)
1190 CALL cp_fm_create(wmat_tmp(iforce_eval, ivar), fm_struct_tmp, name=
"w_matrix")
1191 CALL dbcsr_desymmetrize(dft_control%qs_control%cdft_control%wmat(ivar)%matrix, desymm_tmp)
1193 CALL dbcsr_release(desymm_tmp)
1194 CALL dbcsr_release_p(dft_control%qs_control%cdft_control%wmat(ivar)%matrix)
1196 DEALLOCATE (dft_control%qs_control%cdft_control%wmat)
1199 IF (iforce_eval == 1)
THEN
1201 ncol_global=ncol_overlap, context=blacs_env, &
1202 para_env=force_env%sub_force_env(iforce_eval)%force_env%para_env)
1203 CALL cp_fm_create(matrix_s_tmp, fm_struct_tmp, name=
"s_matrix")
1205 CALL dbcsr_desymmetrize(dft_control%qs_control%cdft_control%matrix_s%matrix, desymm_tmp)
1207 CALL dbcsr_release(desymm_tmp)
1209 CALL dbcsr_release_p(dft_control%qs_control%cdft_control%matrix_s%matrix)
1211 IF (mixed_cdft%calculate_metric)
THEN
1212 DO ispin = 1, nspins
1215 ncol_global=ncol_overlap, context=blacs_env, &
1216 para_env=force_env%sub_force_env(iforce_eval)%force_env%para_env)
1217 CALL cp_fm_create(matrix_p_tmp(iforce_eval, ispin), fm_struct_tmp, name=
"dm_matrix")
1219 CALL dbcsr_desymmetrize(dft_control%qs_control%cdft_control%matrix_p(ispin)%matrix, desymm_tmp)
1221 CALL dbcsr_release(desymm_tmp)
1222 CALL dbcsr_release_p(dft_control%qs_control%cdft_control%matrix_p(ispin)%matrix)
1224 DEALLOCATE (dft_control%qs_control%cdft_control%matrix_p)
1227 IF (.NOT. uniform_occupation)
THEN
1228 DO ispin = 1, nspins
1229 IF (ncol_mo(ispin) /=
SIZE(dft_control%qs_control%cdft_control%occupations(ispin)%array)) &
1230 cpabort(
"Array dimensions dont match.")
1231 IF (force_env_qs%para_env%is_source())
THEN
1232 ALLOCATE (occno_tmp(iforce_eval, ispin)%array(ncol_mo(ispin)))
1233 occno_tmp(iforce_eval, ispin)%array = dft_control%qs_control%cdft_control%occupations(ispin)%array
1235 DEALLOCATE (dft_control%qs_control%cdft_control%occupations(ispin)%array)
1237 DEALLOCATE (dft_control%qs_control%cdft_control%occupations)
1242 context=mixed_cdft%blacs_env, para_env=force_env%para_env)
1243 CALL cp_fm_struct_create(fm_struct_overlap, nrow_global=nrow_overlap, ncol_global=ncol_overlap, &
1244 context=mixed_cdft%blacs_env, para_env=force_env%para_env)
1248 ALLOCATE (mixed_wmat_tmp(nforce_eval, nvar))
1249 IF (mixed_cdft%calculate_metric) &
1250 ALLOCATE (mixed_matrix_p_tmp(nforce_eval, nspins))
1251 DO iforce_eval = 1, nforce_eval
1253 DO ispin = 1, nspins
1254 NULLIFY (fm_struct_mo)
1255 CALL cp_fm_struct_create(fm_struct_mo, nrow_global=nrow_mo(ispin), ncol_global=ncol_mo(ispin), &
1256 context=mixed_cdft%blacs_env, para_env=force_env%para_env)
1257 CALL cp_fm_create(matrix=mixed_mo_coeff(iforce_eval, ispin), &
1258 matrix_struct=fm_struct_mo, &
1259 name=
"MO_COEFF_"//trim(adjustl(
cp_to_string(iforce_eval)))//
"_" &
1262 mixed_mo_coeff(iforce_eval, ispin), &
1263 mixed_cdft%blacs_env%para_env)
1269 NULLIFY (w_matrix(iforce_eval, ivar)%matrix)
1270 CALL dbcsr_init_p(w_matrix(iforce_eval, ivar)%matrix)
1271 CALL cp_fm_create(matrix=mixed_wmat_tmp(iforce_eval, ivar), &
1272 matrix_struct=fm_struct_wmat, &
1273 name=
"WEIGHT_"//trim(adjustl(
cp_to_string(iforce_eval)))//
"_MATRIX")
1275 mixed_wmat_tmp(iforce_eval, ivar), &
1276 mixed_cdft%blacs_env%para_env)
1280 w_matrix(iforce_eval, ivar)%matrix)
1284 IF (mixed_cdft%calculate_metric)
THEN
1285 DO ispin = 1, nspins
1286 NULLIFY (density_matrix(iforce_eval, ispin)%matrix)
1287 CALL dbcsr_init_p(density_matrix(iforce_eval, ispin)%matrix)
1288 CALL cp_fm_create(matrix=mixed_matrix_p_tmp(iforce_eval, ispin), &
1289 matrix_struct=fm_struct_overlap, &
1290 name=
"DENSITY_"//trim(adjustl(
cp_to_string(iforce_eval)))//
"_"// &
1293 mixed_matrix_p_tmp(iforce_eval, ispin), &
1294 mixed_cdft%blacs_env%para_env)
1297 density_matrix(iforce_eval, ispin)%matrix)
1303 DEALLOCATE (mo_coeff_tmp, wmat_tmp, mixed_wmat_tmp)
1304 IF (mixed_cdft%calculate_metric)
THEN
1305 DEALLOCATE (matrix_p_tmp)
1306 DEALLOCATE (mixed_matrix_p_tmp)
1310 matrix_struct=fm_struct_overlap, &
1311 name=
"OVERLAP_MATRIX")
1314 mixed_matrix_s_tmp, &
1315 mixed_cdft%blacs_env%para_env)
1320 IF (.NOT. uniform_occupation)
THEN
1321 DO iforce_eval = 1, nforce_eval
1322 DO ispin = 1, nspins
1323 ALLOCATE (mixed_cdft%occupations(iforce_eval, ispin)%array(ncol_mo(ispin)))
1324 mixed_cdft%occupations(iforce_eval, ispin)%array = 0.0_dp
1325 IF (
ASSOCIATED(occno_tmp(iforce_eval, ispin)%array))
THEN
1326 mixed_cdft%occupations(iforce_eval, ispin)%array = occno_tmp(iforce_eval, ispin)%array
1327 DEALLOCATE (occno_tmp(iforce_eval, ispin)%array)
1329 CALL force_env%para_env%sum(mixed_cdft%occupations(iforce_eval, ispin)%array)
1332 DEALLOCATE (occno_tmp)
1334 DEALLOCATE (ncol_mo, nrow_mo)
1346 INTEGER :: iounit, ipermutation, istate, ivar, &
1347 jstate, nforce_eval, npermutations, &
1353 NULLIFY (print_section, mixed_cdft)
1356 cpassert(
ASSOCIATED(force_env))
1358 force_env_section=force_env_section)
1359 CALL get_mixed_env(force_env%mixed_env, cdft_control=mixed_cdft)
1360 cpassert(
ASSOCIATED(mixed_cdft))
1364 cpassert(
ALLOCATED(mixed_cdft%results%strength))
1365 cpassert(
ALLOCATED(mixed_cdft%results%W_diagonal))
1366 cpassert(
ALLOCATED(mixed_cdft%results%S))
1367 cpassert(
ALLOCATED(mixed_cdft%results%energy))
1368 nforce_eval =
SIZE(force_env%sub_force_env)
1369 nvar =
SIZE(mixed_cdft%results%strength, 1)
1370 npermutations = nforce_eval*(nforce_eval - 1)/2
1371 IF (iounit > 0)
THEN
1372 WRITE (iounit,
'(/,T3,A,T66)') &
1373 '------------------------- CDFT coupling information --------------------------'
1374 WRITE (iounit,
'(T3,A,T66,(3X,F12.2))') &
1375 'Information at step (fs):', mixed_cdft%sim_step*mixed_cdft%sim_dt
1376 DO ipermutation = 1, npermutations
1378 WRITE (iounit,
'(/,T3,A)') repeat(
'#', 44)
1379 WRITE (iounit,
'(T3,A,I3,A,I3,A)')
'###### CDFT states I =', istate,
' and J = ', jstate,
' ######'
1380 WRITE (iounit,
'(T3,A)') repeat(
'#', 44)
1383 WRITE (iounit,
'(A)')
''
1384 WRITE (iounit,
'(T3,A,T60,(3X,I18))')
'Atomic group:', ivar
1385 WRITE (iounit,
'(T3,A,T60,(3X,F18.12))') &
1386 'Strength of constraint I:', mixed_cdft%results%strength(ivar, istate)
1387 WRITE (iounit,
'(T3,A,T60,(3X,F18.12))') &
1388 'Strength of constraint J:', mixed_cdft%results%strength(ivar, jstate)
1389 WRITE (iounit,
'(T3,A,T60,(3X,F18.12))') &
1390 'Final value of constraint I:', mixed_cdft%results%W_diagonal(ivar, istate)
1391 WRITE (iounit,
'(T3,A,T60,(3X,F18.12))') &
1392 'Final value of constraint J:', mixed_cdft%results%W_diagonal(ivar, jstate)
1394 WRITE (iounit,
'(/,T3,A,T60,(3X,F18.12))') &
1395 'Overlap between states I and J:', mixed_cdft%results%S(istate, jstate)
1396 WRITE (iounit,
'(T3,A,T60,(3X,F18.12))') &
1397 'Charge transfer energy (J-I) (Hartree):', (mixed_cdft%results%energy(jstate) - mixed_cdft%results%energy(istate))
1399 IF (
ALLOCATED(mixed_cdft%results%rotation))
THEN
1400 IF (abs(mixed_cdft%results%rotation(ipermutation))*1.0e3_dp .GE. 0.1_dp)
THEN
1401 WRITE (iounit,
'(T3,A,T60,(3X,F18.12))') &
1402 'Diabatic electronic coupling (rotation, mHartree):', &
1403 abs(mixed_cdft%results%rotation(ipermutation)*1.0e3_dp)
1405 WRITE (iounit,
'(T3,A,T60,(3X,F18.12))') &
1406 'Diabatic electronic coupling (rotation, microHartree):', &
1407 abs(mixed_cdft%results%rotation(ipermutation)*1.0e6_dp)
1410 IF (
ALLOCATED(mixed_cdft%results%lowdin))
THEN
1411 IF (abs(mixed_cdft%results%lowdin(ipermutation))*1.0e3_dp .GE. 0.1_dp)
THEN
1412 WRITE (iounit,
'(T3,A,T60,(3X,F18.12))') &
1413 'Diabatic electronic coupling (Lowdin, mHartree):', &
1414 abs(mixed_cdft%results%lowdin(ipermutation)*1.0e3_dp)
1416 WRITE (iounit,
'(T3,A,T60,(3X,F18.12))') &
1417 'Diabatic electronic coupling (Lowdin, microHartree):', &
1418 abs(mixed_cdft%results%lowdin(ipermutation)*1.0e6_dp)
1421 IF (
ALLOCATED(mixed_cdft%results%wfn))
THEN
1422 IF (mixed_cdft%results%wfn(ipermutation)*1.0e3_dp .GE. 0.1_dp)
THEN
1423 WRITE (iounit,
'(T3,A,T60,(3X,F18.12))') &
1424 'Diabatic electronic coupling (wfn overlap, mHartree):', &
1425 abs(mixed_cdft%results%wfn(ipermutation)*1.0e3_dp)
1427 WRITE (iounit,
'(T3,A,T60,(3X,F18.12))') &
1428 'Diabatic electronic coupling (wfn overlap, microHartree):', &
1429 abs(mixed_cdft%results%wfn(ipermutation)*1.0e6_dp)
1432 IF (
ALLOCATED(mixed_cdft%results%nonortho))
THEN
1433 WRITE (iounit,
'(T3,A,T60,(3X,F18.12))') &
1434 'Diabatic electronic coupling (nonorthogonal, Hartree):', mixed_cdft%results%nonortho(ipermutation)
1436 IF (
ALLOCATED(mixed_cdft%results%metric))
THEN
1438 IF (
SIZE(mixed_cdft%results%metric, 2) == 1)
THEN
1439 WRITE (iounit,
'(T3,A,T66,(3X,F12.6))') &
1440 'Coupling reliability metric (0 is ideal):', mixed_cdft%results%metric(ipermutation, 1)
1442 WRITE (iounit,
'(T3,A,T54,(3X,2F12.6))') &
1443 'Coupling reliability metric (0 is ideal):', &
1444 mixed_cdft%results%metric(ipermutation, 1), mixed_cdft%results%metric(ipermutation, 2)
1448 WRITE (iounit,
'(T3,A)') &
1449 '------------------------------------------------------------------------------'
1452 "MIXED%MIXED_CDFT%PRINT%PROGRAM_RUN_INFO")
1467 NULLIFY (mixed_cdft)
1469 cpassert(
ASSOCIATED(force_env))
1470 CALL get_mixed_env(force_env%mixed_env, cdft_control=mixed_cdft)
1471 cpassert(
ASSOCIATED(mixed_cdft))
1486 INTEGER,
INTENT(IN) :: n, ipermutation
1487 INTEGER,
INTENT(OUT) :: i, j
1489 INTEGER :: kcol, kpermutation, krow, npermutations
1491 npermutations = n*(n - 1)/2
1492 IF (ipermutation > npermutations) &
1493 cpabort(
"Permutation index out of bounds")
1496 DO kcol = krow + 1, n
1497 kpermutation = kpermutation + 1
1498 IF (kpermutation == ipermutation)
THEN
1519 REAL(kind=
dp),
DIMENSION(:, :, :),
INTENT(INOUT) :: fun
1520 REAL(kind=
dp),
INTENT(IN) :: th
1521 LOGICAL :: just_zero
1522 INTEGER,
OPTIONAL :: bounds(2), work
1524 INTEGER :: i1, i2, i3, lb, n1, n2, n3, nzeroed, &
1526 LOGICAL :: lb_final, ub_final
1532 IF (.NOT. just_zero)
THEN
1533 cpassert(
PRESENT(bounds))
1534 cpassert(
PRESENT(work))
1540 IF (.NOT. just_zero) nzeroed = 0
1543 IF (fun(i1, i2, i3) < th)
THEN
1544 IF (.NOT. just_zero)
THEN
1545 nzeroed = nzeroed + 1
1546 nzeroed_total = nzeroed_total + 1
1548 fun(i1, i2, i3) = 0.0_dp
1553 IF (.NOT. just_zero)
THEN
1554 IF (nzeroed == (n2*n1))
THEN
1555 IF (.NOT. lb_final)
THEN
1557 ELSE IF (.NOT. ub_final)
THEN
1562 IF (.NOT. lb_final) lb_final = .true.
1563 IF (ub_final) ub_final = .false.
1567 IF (.NOT. just_zero)
THEN
1568 IF (.NOT. ub_final) ub = n3
1571 bounds = bounds - (n3/2) - 1
1572 work = n3*n2*n1 - nzeroed_total
1591 INTENT(OUT) :: blocks
1592 LOGICAL,
INTENT(OUT) :: ignore_excited
1593 INTEGER,
INTENT(OUT) :: nrecursion
1595 INTEGER :: i, j, k, l, nblk, nforce_eval
1596 INTEGER,
DIMENSION(:),
POINTER :: tmplist
1597 LOGICAL :: do_recursive, explicit, has_duplicates
1602 NULLIFY (force_env_section, block_section)
1603 cpassert(
ASSOCIATED(force_env))
1604 nforce_eval =
SIZE(force_env%sub_force_env)
1607 force_env_section=force_env_section)
1611 IF (.NOT. explicit) &
1612 CALL cp_abort(__location__, &
1613 "Block diagonalization of CDFT Hamiltonian was requested, but the "// &
1614 "corresponding input section is missing!")
1617 ALLOCATE (blocks(nblk))
1619 NULLIFY (blocks(i)%array)
1621 IF (
SIZE(tmplist) < 1) &
1622 cpabort(
"Each BLOCK must contain at least 1 state.")
1623 ALLOCATE (blocks(i)%array(
SIZE(tmplist)))
1624 blocks(i)%array(:) = tmplist(:)
1630 DO j = 1,
SIZE(blocks(i)%array)
1631 IF (blocks(i)%array(j) < 1 .OR. blocks(i)%array(j) > nforce_eval) &
1632 cpabort(
"Requested state does not exist.")
1636 has_duplicates = .false.
1639 DO j = 1,
SIZE(blocks(i)%array)
1640 DO k = j + 1,
SIZE(blocks(i)%array)
1641 IF (blocks(i)%array(j) == blocks(i)%array(k)) has_duplicates = .true.
1646 DO k = 1,
SIZE(blocks(i)%array)
1647 DO l = 1,
SIZE(blocks(j)%array)
1648 IF (blocks(i)%array(k) == blocks(j)%array(l)) has_duplicates = .true.
1653 IF (has_duplicates) cpabort(
"Duplicate states are not allowed.")
1655 IF (do_recursive)
THEN
1656 IF (
modulo(nblk, 2) /= 0)
THEN
1657 CALL cp_warn(__location__, &
1658 "Number of blocks not divisible with 2. Recursive diagonalization not possible. "// &
1659 "Calculation proceeds without.")
1664 IF (nrecursion /= 1 .AND. .NOT. ignore_excited) &
1665 CALL cp_abort(__location__, &
1666 "Keyword IGNORE_EXCITED must be active for recursive diagonalization.")
1684 INTENT(OUT) :: h_block, s_block
1686 INTEGER :: i, icol, irow, j, k, nblk
1690 cpassert(
ASSOCIATED(mixed_cdft))
1693 ALLOCATE (h_block(nblk), s_block(nblk))
1695 NULLIFY (h_block(i)%array)
1696 NULLIFY (s_block(i)%array)
1697 ALLOCATE (h_block(i)%array(
SIZE(blocks(i)%array),
SIZE(blocks(i)%array)))
1698 ALLOCATE (s_block(i)%array(
SIZE(blocks(i)%array),
SIZE(blocks(i)%array)))
1700 DO j = 1,
SIZE(blocks(i)%array)
1703 DO k = 1,
SIZE(blocks(i)%array)
1705 h_block(i)%array(irow, icol) = mixed_cdft%results%H(blocks(i)%array(k), blocks(i)%array(j))
1706 s_block(i)%array(irow, icol) = mixed_cdft%results%S(blocks(i)%array(k), blocks(i)%array(j))
1710 IF (any(h_block(i)%array .GE. 0.0_dp)) &
1711 CALL cp_abort(__location__, &
1712 "At least one of the interaction energies within block "//trim(adjustl(
cp_to_string(i)))// &
1729 TYPE(
cp_2d_r_p_type),
ALLOCATABLE,
DIMENSION(:) :: h_block, s_block
1731 INTENT(OUT) :: eigenvalues
1733 INTEGER :: i, info, nblk, work_array_size
1734 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: work
1735 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: h_mat_copy, s_mat_copy
1740 ALLOCATE (eigenvalues(nblk))
1742 NULLIFY (eigenvalues(i)%array)
1743 ALLOCATE (eigenvalues(i)%array(
SIZE(blocks(i)%array)))
1744 eigenvalues(i)%array = 0.0_dp
1748 ALLOCATE (h_mat_copy(
SIZE(blocks(i)%array),
SIZE(blocks(i)%array)))
1749 ALLOCATE (s_mat_copy(
SIZE(blocks(i)%array),
SIZE(blocks(i)%array)))
1750 h_mat_copy(:, :) = h_block(i)%array(:, :)
1751 s_mat_copy(:, :) = s_block(i)%array(:, :)
1752 CALL dsygv(1,
'V',
'U',
SIZE(blocks(i)%array), h_mat_copy,
SIZE(blocks(i)%array), &
1753 s_mat_copy,
SIZE(blocks(i)%array), eigenvalues(i)%array, work, -1, info)
1754 work_array_size = nint(work(1))
1755 DEALLOCATE (h_mat_copy, s_mat_copy)
1758 ALLOCATE (work(work_array_size))
1762 CALL dsygv(1,
'V',
'U',
SIZE(blocks(i)%array), h_block(i)%array,
SIZE(blocks(i)%array), &
1763 s_block(i)%array,
SIZE(blocks(i)%array), eigenvalues(i)%array, work, work_array_size, info)
1765 IF (info >
SIZE(blocks(i)%array))
THEN
1766 cpabort(
"Matrix S is not positive definite")
1768 cpabort(
"Diagonalization of H matrix failed.")
1793 INTEGER :: n, iounit
1795 CHARACTER(LEN=20) :: ilabel, jlabel
1796 CHARACTER(LEN=3) :: tmp
1797 INTEGER :: i, icol, ipermutation, irow, j, k, l, &
1799 LOGICAL :: ignore_excited
1800 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: h_mat, h_offdiag, s_mat, s_offdiag
1804 ALLOCATE (h_mat(n, n), s_mat(n, n))
1806 ignore_excited = (nblk == n)
1808 IF (iounit > 0)
WRITE (iounit,
'(/,T3,A)')
"Eigenvalues of the block diagonalized states"
1809 h_mat(:, :) = 0.0_dp
1810 s_mat(:, :) = 0.0_dp
1813 IF (iounit > 0)
WRITE (iounit,
'(T6,A,I3)')
"Block", i
1814 DO j = 1,
SIZE(eigenvalues(i)%array)
1815 h_mat(k, k) = eigenvalues(i)%array(j)
1816 s_mat(k, k) = 1.0_dp
1818 IF (iounit > 0)
THEN
1820 WRITE (iounit,
'(T9,A,T58,(3X,F20.14))')
'Ground state energy:', eigenvalues(i)%array(j)
1822 WRITE (iounit,
'(T9,A,I2,A,T58,(3X,F20.14))') &
1823 'Excited state (', j - 1,
' ) energy:', eigenvalues(i)%array(j)
1826 IF (ignore_excited .AND. j == 1)
EXIT
1830 npermutations = nblk*(nblk - 1)/2
1831 IF (iounit > 0)
WRITE (iounit,
'(/,T3,A)')
"Interactions between block diagonalized states"
1832 DO ipermutation = 1, npermutations
1835 ALLOCATE (h_offdiag(
SIZE(blocks(i)%array),
SIZE(blocks(j)%array)))
1836 ALLOCATE (s_offdiag(
SIZE(blocks(i)%array),
SIZE(blocks(j)%array)))
1838 DO k = 1,
SIZE(blocks(j)%array)
1841 DO l = 1,
SIZE(blocks(i)%array)
1843 h_offdiag(irow, icol) = mixed_cdft%results%H(blocks(i)%array(l), blocks(j)%array(k))
1844 s_offdiag(irow, icol) = mixed_cdft%results%S(blocks(i)%array(l), blocks(j)%array(k))
1848 IF (any(h_offdiag .GE. 0.0_dp)) &
1849 CALL cp_abort(__location__, &
1850 "At least one of the interaction energies between blocks "//trim(adjustl(
cp_to_string(i)))// &
1851 " and "//trim(adjustl(
cp_to_string(j)))//
" is repulsive.")
1853 h_offdiag(:, :) = matmul(h_offdiag, h_block(j)%array)
1854 h_offdiag(:, :) = matmul(transpose(h_block(i)%array), h_offdiag)
1855 s_offdiag(:, :) = matmul(s_offdiag, h_block(j)%array)
1856 s_offdiag(:, :) = matmul(transpose(h_block(i)%array), s_offdiag)
1861 IF (any(s_offdiag .LT. 0.0_dp))
THEN
1862 DO l = 1,
SIZE(s_offdiag, 2)
1863 DO k = 1,
SIZE(s_offdiag, 1)
1864 IF (s_offdiag(k, l) .LT. 0.0_dp)
THEN
1865 s_offdiag(k, l) = -1.0_dp*s_offdiag(k, l)
1866 h_offdiag(k, l) = -1.0_dp*h_offdiag(k, l)
1871 IF (ignore_excited)
THEN
1872 h_mat(i, j) = h_offdiag(1, 1)
1873 h_mat(j, i) = h_mat(i, j)
1874 s_mat(i, j) = s_offdiag(1, 1)
1875 s_mat(j, i) = s_mat(i, j)
1880 irow = irow +
SIZE(blocks(k)%array)
1883 icol = icol +
SIZE(blocks(k)%array)
1885 h_mat(irow:irow +
SIZE(h_offdiag, 1) - 1, icol:icol +
SIZE(h_offdiag, 2) - 1) = h_offdiag(:, :)
1886 h_mat(icol:icol +
SIZE(h_offdiag, 2) - 1, irow:irow +
SIZE(h_offdiag, 1) - 1) = transpose(h_offdiag)
1887 s_mat(irow:irow +
SIZE(h_offdiag, 1) - 1, icol:icol +
SIZE(h_offdiag, 2) - 1) = s_offdiag(:, :)
1888 s_mat(icol:icol +
SIZE(h_offdiag, 2) - 1, irow:irow +
SIZE(h_offdiag, 1) - 1) = transpose(s_offdiag)
1890 IF (iounit > 0)
THEN
1891 WRITE (iounit,
'(/,T3,A)') repeat(
'#', 39)
1892 WRITE (iounit,
'(T3,A,I3,A,I3,A)')
'###### Blocks I =', i,
' and J = ', j,
' ######'
1893 WRITE (iounit,
'(T3,A)') repeat(
'#', 39)
1894 WRITE (iounit,
'(T3,A)')
'Interaction energies'
1895 DO irow = 1,
SIZE(h_offdiag, 1)
1896 ilabel =
"(ground state)"
1898 IF (ignore_excited)
EXIT
1899 WRITE (tmp,
'(I3)') irow - 1
1900 ilabel =
"(excited state "//trim(adjustl(tmp))//
")"
1902 DO icol = 1,
SIZE(h_offdiag, 2)
1903 jlabel =
"(ground state)"
1905 IF (ignore_excited)
EXIT
1906 WRITE (tmp,
'(I3)') icol - 1
1907 jlabel =
"(excited state "//trim(adjustl(tmp))//
")"
1909 WRITE (iounit,
'(T6,A,T58,(3X,F20.14))') trim(ilabel)//
'-'//trim(jlabel)//
':', h_offdiag(irow, icol)
1912 WRITE (iounit,
'(T3,A)')
'Overlaps'
1913 DO irow = 1,
SIZE(h_offdiag, 1)
1914 ilabel =
"(ground state)"
1916 IF (ignore_excited)
EXIT
1917 ilabel =
"(excited state)"
1918 WRITE (tmp,
'(I3)') irow - 1
1919 ilabel =
"(excited state "//trim(adjustl(tmp))//
")"
1921 DO icol = 1,
SIZE(h_offdiag, 2)
1922 jlabel =
"(ground state)"
1924 IF (ignore_excited)
EXIT
1925 WRITE (tmp,
'(I3)') icol - 1
1926 jlabel =
"(excited state "//trim(adjustl(tmp))//
")"
1928 WRITE (iounit,
'(T6,A,T58,(3X,F20.14))') trim(ilabel)//
'-'//trim(jlabel)//
':', s_offdiag(irow, icol)
1932 DEALLOCATE (h_offdiag, s_offdiag)
1936 DEALLOCATE (h_mat, s_mat)
static GRID_HOST_DEVICE int modulo(int a, int m)
Equivalent of Fortran's MODULO, which always return a positive number. https://gcc....
Define the atomic kind types and their sub types.
Handles all functions related to the CELL.
various utilities that regard array of different kinds: output, allocation,... maybe it is not a good...
methods related to the blacs parallel environment
subroutine, public cp_blacs_env_create(blacs_env, para_env, blacs_grid_layout, blacs_repeatable, row_major, grid_2d)
allocates and initializes a type that represent a blacs context
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
DBCSR operations in CP2K.
subroutine, public copy_dbcsr_to_fm(matrix, fm)
Copy a DBCSR matrix to a BLACS matrix.
subroutine, public copy_fm_to_dbcsr_bc(fm, bc_mat)
Copy a BLACS matrix to a dbcsr matrix with a special block-cyclic distribution, which requires no com...
Utility routines to open and close files. Tracking of preconnections.
subroutine, public open_file(file_name, file_status, file_form, file_action, file_position, file_pad, unit_number, debug, skip_get_unit_number, file_access)
Opens the requested file using a free unit number.
represent the structure of a full matrix
subroutine, public cp_fm_struct_create(fmstruct, para_env, context, nrow_global, ncol_global, nrow_block, ncol_block, descriptor, first_p_pos, local_leading_dimension, template_fmstruct, square_blocks, force_block)
allocates and initializes a full matrix structure
subroutine, public cp_fm_struct_release(fmstruct)
releases a full matrix structure
represent a full matrix distributed on many processors
subroutine, public cp_fm_copy_general(source, destination, para_env)
General copy of a fm matrix to another fm matrix. Uses non-blocking MPI rather than ScaLAPACK.
subroutine, public cp_fm_get_info(matrix, name, nrow_global, ncol_global, nrow_block, ncol_block, nrow_local, ncol_local, row_indices, col_indices, local_data, context, nrow_locals, ncol_locals, matrix_struct, para_env)
returns all kind of information about the full matrix
subroutine, public cp_fm_create(matrix, matrix_struct, name, use_sp)
creates a new full matrix with the given structure
various routines to log and control the output. The idea is that decisions about where to log should ...
subroutine, public cp_logger_set(logger, local_filename, global_filename)
sets various attributes of the given logger
subroutine, public cp_logger_create(logger, para_env, print_level, default_global_unit_nr, default_local_unit_nr, global_filename, local_filename, close_global_unit_on_dealloc, iter_info, close_local_unit_on_dealloc, suffix, template_logger)
initializes a logger
type(cp_logger_type) function, pointer, public cp_get_default_logger()
returns the default logger
routines to handle the output, The idea is to remove the decision of wheter to output and what to out...
integer function, public cp_print_key_unit_nr(logger, basis_section, print_key_path, extension, middle_name, local, log_filename, ignore_should_output, file_form, file_position, file_action, file_status, do_backup, on_file, is_new_file, mpi_io, fout)
...
subroutine, public cp_print_key_finished_output(unit_nr, logger, basis_section, print_key_path, local, ignore_should_output, on_file, mpi_io)
should be called after you finish working with a unit obtained with cp_print_key_unit_nr,...
subroutine, public init_input_type(input_settings, nsmax, rs_grid_section, ilevel, higher_grid_layout)
parses an input section to assign the proper values to the input type
types that represent a subsys, i.e. a part of the system
subroutine, public cp_subsys_get(subsys, ref_count, atomic_kinds, atomic_kind_set, particles, particle_set, local_particles, molecules, molecule_set, molecule_kinds, molecule_kind_set, local_molecules, para_env, colvar_p, shell_particles, core_particles, gci, multipoles, natom, nparticle, ncore, nshell, nkind, atprop, virial, results, cell)
returns information about various attributes of the given subsys
for a given dr()/dh(r) this will provide the bounds to be used if one wants to go over a sphere-subre...
integer function, public return_cube_max_iradius(info)
...
subroutine, public init_cube_info(info, dr, dh, dh_inv, ortho, max_radius)
...
Routines to efficiently handle dense polynomial in 3 variables up to a given degree....
subroutine, public init_d3_poly_module()
initialization of the cache, is called by functions in this module that use cached values
Interface for the force calculations.
subroutine, public multiple_fe_list(force_env_sections, root_section, i_force_eval, nforce_eval)
returns the order of the multiple force_env
recursive subroutine, public force_env_get(force_env, in_use, fist_env, qs_env, meta_env, fp_env, subsys, para_env, potential_energy, additional_potential, kinetic_energy, harmonic_shell, kinetic_shell, cell, sub_force_env, qmmm_env, qmmmx_env, eip_env, pwdft_env, globenv, input, force_env_section, method_name_id, root_section, mixed_env, nnp_env, embed_env)
returns various attributes about the force environment
subroutine, public init_gaussian_gridlevel(gridlevel_info, ngrid_levels, cutoff, rel_cutoff, print_section)
...
Define type storing the global information of a run. Keep the amount of stored data small....
The types needed for the calculation of Hirshfeld charges and related functions.
subroutine, public create_hirshfeld_type(hirshfeld_env)
...
subroutine, public set_hirshfeld_info(hirshfeld_env, shape_function_type, iterative, ref_charge, fnorm, radius_type, use_bohr)
Set values of a Hirshfeld env.
subroutine, public release_hirshfeld_type(hirshfeld_env)
...
Defines the basic variable types.
integer, parameter, public dp
integer, parameter, public default_path_length
Interface to the message passing library MPI.
Types for mixed CDFT calculations.
subroutine, public mixed_cdft_result_type_set(results, lowdin, wfn, nonortho, metric, rotation, h, s, wad, wda, w_diagonal, energy, strength, s_minushalf)
Updates arrays within the mixed CDFT result container.
subroutine, public mixed_cdft_result_type_release(results)
Releases all arrays within the mixed CDFT result container.
subroutine, public mixed_cdft_work_type_init(matrix)
Initializes the mixed_cdft_work_type.
Utility subroutines for mixed CDFT calculations.
subroutine, public map_permutation_to_states(n, ipermutation, i, j)
Given the size of a symmetric matrix and a permutation index, returns indices (i, j) of the off-diago...
subroutine, public mixed_cdft_init_structures(force_env, force_env_qs, mixed_env, mixed_cdft, settings)
Initialize all the structures needed for a mixed CDFT calculation.
subroutine, public mixed_cdft_transfer_settings(force_env, mixed_cdft, settings)
Transfer settings to mixed_cdft.
subroutine, public mixed_cdft_diagonalize_blocks(blocks, h_block, s_block, eigenvalues)
Diagonalizes each of the matrix blocks.
subroutine, public mixed_cdft_print_couplings(force_env)
Routine to print out the electronic coupling(s) between CDFT states.
subroutine, public mixed_cdft_read_block_diag(force_env, blocks, ignore_excited, nrecursion)
Read input section related to block diagonalization of the mixed CDFT Hamiltonian matrix.
subroutine, public mixed_cdft_redistribute_arrays(force_env)
Redistribute arrays needed for an ET coupling calculation from individual CDFT states to the mixed CD...
subroutine, public mixed_cdft_assemble_block_diag(mixed_cdft, blocks, h_block, eigenvalues, n, iounit)
Assembles the new block diagonalized mixed CDFT Hamiltonian and overlap matrices.
subroutine, public hfun_zero(fun, th, just_zero, bounds, work)
Determine confinement bounds along confinement dir (hardcoded to be z) and determine the number of no...
subroutine, public mixed_cdft_get_blocks(mixed_cdft, blocks, h_block, s_block)
Assembles the matrix blocks from the mixed CDFT Hamiltonian.
subroutine, public mixed_cdft_release_work(force_env)
Release storage reserved for mixed CDFT matrices.
subroutine, public mixed_cdft_parse_settings(force_env, mixed_env, mixed_cdft, settings, natom)
Parse settings for mixed cdft calculation and check their consistency.
subroutine, public get_mixed_env(mixed_env, atomic_kind_set, particle_set, local_particles, local_molecules, molecule_kind_set, molecule_set, cell, cell_ref, mixed_energy, para_env, sub_para_env, subsys, input, results, cdft_control)
Get the MIXED environment.
methods of pw_env that have dependence on qs_env
subroutine, public pw_env_create(pw_env)
creates a pw_env, if qs_env is given calls pw_env_rebuild
container for various plainwaves related things
subroutine, public pw_env_get(pw_env, pw_pools, cube_info, gridlevel_info, auxbas_pw_pool, auxbas_grid, auxbas_rs_desc, auxbas_rs_grid, rs_descs, rs_grids, xc_pw_pool, vdw_pw_pool, poisson_env, interp_section)
returns the various attributes of the pw env
integer, parameter, public halfspace
This module defines the grid data type and some basic operations on it.
integer, parameter, public do_pw_grid_blocked_false
subroutine, public pw_grid_release(pw_grid)
releases the given pw grid
subroutine, public pw_grid_setup(cell_hmat, pw_grid, grid_span, cutoff, bounds, bounds_local, npts, spherical, odd, fft_usage, ncommensurate, icommensurate, blocked, ref_grid, rs_dims, iounit)
sets up a pw_grid
subroutine, public pw_grid_create(pw_grid, pe_group, local)
Initialize a PW grid with all defaults.
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
subroutine, public pw_pool_create(pool, pw_grid, max_cache)
creates a pool for pw
Defines CDFT control structures.
subroutine, public cdft_control_create(cdft_control)
create the cdft_control_type
subroutine, public get_qs_env(qs_env, atomic_kind_set, qs_kind_set, cell, super_cell, cell_ref, use_ref_cell, kpoints, dft_control, mos, sab_orb, sab_all, qmmm, qmmm_periodic, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, ecoul_1c, rho0_s_rs, rho0_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, dispersion_env, gcp_env, vee, rho_external, external_vxc, mask, mp2_env, bs_env, kg_env, wanniercentres, atprop, ls_scf_env, do_transport, transport_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, mscfg_env, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, rhs)
Get the QUICKSTEP environment.
Define the quickstep kind type and their sub types.
subroutine, public create_qs_kind_set(qs_kind_set, atomic_kind_set, kind_section, para_env, force_env_section)
Read an atomic kind set data set from the input file.
subroutine, public rs_grid_print(rs, iounit)
Print information on grids to output.
subroutine, public rs_grid_create(rs, desc)
...
subroutine, public rs_grid_create_descriptor(desc, pw_grid, input_settings, border_points)
Determine the setup of real space grids - this is divided up into the creation of a descriptor and th...
Provides all information about an atomic kind.
Type defining parameters related to the simulation cell.
represent a pointer to a 1d array
represent a pointer to a 1d array
represent a pointer to a 2d array
represent a blacs multidimensional parallel environment (for the mpi corrispective see cp_paratypes/m...
keeps the information about the structure of a full matrix
type of a logger, at the moment it contains just a print level starting at which level it should be l...
represents a system: atoms, molecules, their pos,vel,...
wrapper to abstract the force evaluation of the various methods
contains the initially parsed file and the initial parallel environment
Container for constraint settings to check consistency of force_evals.
Main mixed CDFT control type.
contained for different pw related things
to create arrays of pools
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
Provides all information about a quickstep kind.