33#include "./base/base_uses.f90"
38 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_active_space_types'
49 LOGICAL :: redo_poisson = .false.
50 LOGICAL :: store_wfn = .false.
51 REAL(KIND=
dp) :: cutoff = 0.0_dp
52 REAL(KIND=
dp) :: rel_cutoff = 0.0_dp
53 REAL(KIND=
dp) :: eps_grid = 0.0_dp
54 REAL(KIND=
dp) :: eps_filter = 0.0_dp
55 INTEGER :: print_level = 0
56 INTEGER :: group_size = 0
61 INTEGER :: operator = 0
62 LOGICAL :: enlarge_cell = .false.
63 REAL(kind=
dp) :: omega = 0.0_dp
64 INTEGER,
DIMENSION(3) :: periodicity = 0
65 REAL(kind=
dp),
DIMENSION(3) :: eri_cell = 0
66 REAL(kind=
dp),
DIMENSION(3) :: eri_cell_angles = 0
67 REAL(kind=
dp) :: cutoff_radius = 0.0_dp
68 REAL(kind=
dp) :: eps_integral = 0.0_dp
69 TYPE(eri_gpw_type) :: eri_gpw = eri_gpw_type()
70 TYPE(dbcsr_csr_p_type), &
71 DIMENSION(:),
POINTER :: eri => null()
76 PROCEDURE :: eri_foreach => eri_type_eri_foreach
88 INTEGER :: nelec_active = 0
89 INTEGER :: nelec_inactive = 0
90 INTEGER :: nelec_total = 0
91 INTEGER,
POINTER,
DIMENSION(:, :) :: active_orbitals => null()
92 INTEGER,
POINTER,
DIMENSION(:, :) :: inactive_orbitals => null()
93 INTEGER :: nmo_active = 0
94 INTEGER :: nmo_inactive = 0
95 INTEGER :: multiplicity = 0
97 LOGICAL :: restricted_orbitals = .false.
98 LOGICAL :: molecule = .false.
100 REAL(kind=
dp) :: energy_total = 0.0_dp
101 REAL(kind=
dp) :: energy_ref = 0.0_dp
102 REAL(kind=
dp) :: energy_inactive = 0.0_dp
103 REAL(kind=
dp) :: energy_active = 0.0_dp
104 REAL(kind=
dp) :: eps_fci = 0.0_dp
105 REAL(kind=
dp) :: alpha = 0.0_dp
107 INTEGER :: as_mixing_iter = 0
108 INTEGER :: as_mixing_dim = 0
109 LOGICAL :: do_scf_embedding = .false.
111 LOGICAL :: fcidump = .false.
112 CHARACTER(LEN=default_path_length) :: qcschema_filename =
''
114 REAL(kind=
dp),
DIMENSION(:),
POINTER :: as_mix_r_old => null()
115 REAL(kind=
dp),
DIMENSION(:),
POINTER :: as_mix_weight => null()
116 REAL(kind=
dp),
DIMENSION(:),
POINTER :: as_mix_x_old => null()
117 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: as_mix_r_buffer => null()
118 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: as_mix_x_buffer => null()
121 TYPE(
mo_set_type),
DIMENSION(:),
POINTER :: mos_inactive => null()
122 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: p_active => null()
126 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: fock_sub => null()
146 INTEGER,
INTENT(in) :: i, j, k, l
147 REAL(kind=
dp),
INTENT(in) :: val
162 IF (
ASSOCIATED(active_space_env))
THEN
166 ALLOCATE (active_space_env)
167 NULLIFY (active_space_env%active_orbitals, active_space_env%inactive_orbitals)
168 NULLIFY (active_space_env%mos_active, active_space_env%mos_inactive)
169 NULLIFY (active_space_env%ks_sub, active_space_env%p_active)
170 NULLIFY (active_space_env%vxc_sub, active_space_env%h_sub)
171 NULLIFY (active_space_env%fock_sub, active_space_env%pmat_inactive)
172 NULLIFY (active_space_env%as_mixing_store)
173 NULLIFY (active_space_env%as_mix_r_old, active_space_env%as_mix_weight)
174 NULLIFY (active_space_env%as_mix_x_old)
175 NULLIFY (active_space_env%as_mix_r_buffer, active_space_env%as_mix_x_buffer)
188 IF (
ASSOCIATED(active_space_env))
THEN
190 IF (
ASSOCIATED(active_space_env%active_orbitals))
THEN
191 DEALLOCATE (active_space_env%active_orbitals)
194 IF (
ASSOCIATED(active_space_env%inactive_orbitals))
THEN
195 DEALLOCATE (active_space_env%inactive_orbitals)
198 IF (
ASSOCIATED(active_space_env%mos_active))
THEN
199 DO imo = 1,
SIZE(active_space_env%mos_active)
202 DEALLOCATE (active_space_env%mos_active)
205 IF (
ASSOCIATED(active_space_env%mos_inactive))
THEN
206 DO imo = 1,
SIZE(active_space_env%mos_inactive)
209 DEALLOCATE (active_space_env%mos_inactive)
212 CALL release_eri_type(active_space_env%eri)
221 IF (
ASSOCIATED(active_space_env%as_mixing_store))
THEN
223 DEALLOCATE (active_space_env%as_mixing_store)
225 IF (
ASSOCIATED(active_space_env%as_mix_r_old))
THEN
226 DEALLOCATE (active_space_env%as_mix_r_old)
228 IF (
ASSOCIATED(active_space_env%as_mix_weight))
THEN
229 DEALLOCATE (active_space_env%as_mix_weight)
231 IF (
ASSOCIATED(active_space_env%as_mix_x_old))
THEN
232 DEALLOCATE (active_space_env%as_mix_x_old)
234 IF (
ASSOCIATED(active_space_env%as_mix_r_buffer))
THEN
235 DEALLOCATE (active_space_env%as_mix_r_buffer)
237 IF (
ASSOCIATED(active_space_env%as_mix_x_buffer))
THEN
238 DEALLOCATE (active_space_env%as_mix_x_buffer)
241 IF (
ASSOCIATED(active_space_env%pmat_inactive))
THEN
245 DEALLOCATE (active_space_env)
254 SUBROUTINE release_eri_type(eri_env)
259 IF (
ASSOCIATED(eri_env%eri))
THEN
261 DO i = 1,
SIZE(eri_env%eri)
262 CALL dbcsr_csr_destroy(eri_env%eri(i)%csr_mat)
263 DEALLOCATE (eri_env%eri(i)%csr_mat)
266 CALL eri_env%comm_exchange%free()
267 DEALLOCATE (eri_env%eri)
271 END SUBROUTINE release_eri_type
283 INTEGER,
INTENT(IN) :: i, j, n
289 ij = (i - 1)*n - ((i - 1)*(i - 2))/2 + (j - i + 1)
291 cpassert(ij <= (n*(n + 1))/2 .AND. 0 <= ij)
305 INTEGER,
INTENT(IN) :: ij, n
306 INTEGER,
INTENT(OUT) :: i, j
312 m0 = (i - 1)*n - ((i - 1)*(i - 2))/2
317 cpassert(i > 0 .AND. i <= n)
318 cpassert(j > 0 .AND. j <= n)
336 SUBROUTINE eri_type_eri_foreach(this, nspin, active_orbitals, fobj, spin1, spin2)
339 INTEGER,
DIMENSION(:, :),
INTENT(IN) :: active_orbitals
340 INTEGER,
OPTIONAL :: spin1, spin2
342 CHARACTER(LEN=*),
PARAMETER :: routinen =
"eri_type_eri_foreach"
344 INTEGER :: i1, i12, i12l, i2, i3, i34, i34l, i4, m1, m2, m3, m4, &
345 irptr, nspin, nindex, nmo, proc, nonzero_elements_local, handle, dummy_int(1)
346 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: colind, offsets, nonzero_elements_global
347 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: erival
348 REAL(kind=
dp) :: erint, dummy_real(1)
351 CALL timeset(routinen, handle)
353 IF (.NOT.
PRESENT(spin1))
THEN
356 IF (.NOT.
PRESENT(spin2))
THEN
363 associate(eri => this%eri(nspin)%csr_mat, norb => this%norb)
364 nindex = (norb*(norb + 1))/2
365 CALL mp_group%set_handle(eri%mp_group%get_handle())
366 nmo =
SIZE(active_orbitals, 1)
368 ALLOCATE (erival(nindex), colind(nindex))
369 ALLOCATE (offsets(0:mp_group%num_pe - 1), &
370 nonzero_elements_global(0:mp_group%num_pe - 1))
373 i1 = active_orbitals(m1, spin1)
375 i2 = active_orbitals(m2, spin1)
377 i12l = (i12 - 1)/this%comm_exchange%num_pe + 1
384 nonzero_elements_local = 0
385 IF (mod(i12 - 1, this%comm_exchange%num_pe) == this%comm_exchange%mepos)
THEN
386 nonzero_elements_local = eri%nzerow_local(i12l)
388 CALL mp_group%allgather(nonzero_elements_local, nonzero_elements_global)
392 DO proc = 1, mp_group%num_pe - 1
393 offsets(proc) = offsets(proc - 1) + nonzero_elements_global(proc - 1)
395 nindex = offsets(mp_group%num_pe - 1) + nonzero_elements_global(mp_group%num_pe - 1)
397 IF (mod(i12 - 1, this%comm_exchange%num_pe) == this%comm_exchange%mepos)
THEN
398 irptr = eri%rowptr_local(i12l)
401 CALL mp_group%allgatherv(eri%colind_local(irptr:irptr + nonzero_elements_local - 1), &
402 colind(1:nindex), nonzero_elements_global, offsets)
403 CALL mp_group%allgatherv(eri%nzval_local%r_dp(irptr:irptr + nonzero_elements_local - 1), &
404 erival(1:nindex), nonzero_elements_global, offsets)
406 CALL mp_group%allgatherv(dummy_int(1:0), colind(1:nindex), nonzero_elements_global, offsets)
407 CALL mp_group%allgatherv(dummy_real(1:0), erival(1:nindex), nonzero_elements_global, offsets)
416 IF (active_orbitals(m3, spin2) == i3)
THEN
422 IF (active_orbitals(m4, spin2) == i4)
THEN
428 IF (.NOT. fobj%func(m1, m2, m3, m4, erint))
RETURN
435 CALL timestop(handle)
436 END SUBROUTINE eri_type_eri_foreach
The function signature to be implemented by a child of eri_type_eri_element_func.
DBCSR operations in CP2K.
represent a full matrix distributed on many processors
Defines the basic variable types.
integer, parameter, public dp
integer, parameter, public default_path_length
Interface to the message passing library MPI.
type(mp_comm_type), parameter, public mp_comm_null
subroutine, public mp_para_env_release(para_env)
releases the para object (to be called when you don't want anymore the shared copy of this object)
The module to read/write QCSchema HDF5 files for interfacing CP2K with other programs.
The types needed for the calculation of active space Hamiltonians.
subroutine, public release_active_space_type(active_space_env)
Releases all quantities in the active space environment.
subroutine, public csr_idx_from_combined(ij, n, i, j)
extracts indices i and j from combined index ij
integer function, public csr_idx_to_combined(i, j, n)
calculates combined index (ij)
subroutine, public create_active_space_type(active_space_env)
Creates an active space environment type, nullifying all quantities.
module that contains the definitions of the scf types
subroutine, public mixing_storage_release(mixing_store)
releases a mixing_storage
integer, parameter, public direct_mixing_nr
Definition and initialisation of the mo data type.
subroutine, public deallocate_mo_set(mo_set)
Deallocate a wavefunction data structure.
stores all the informations relevant to an mpi environment
Abstract function object for the eri_type_eri_foreach method.