32 #include "./base/base_uses.f90"
37 LOGICAL,
PRIVATE,
PARAMETER :: debug_this_module = .true.
38 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_matrix_pools'
40 PUBLIC :: qs_matrix_pools_type
68 TYPE qs_matrix_pools_type
70 TYPE(cp_fm_pool_p_type),
DIMENSION(:),
POINTER :: ao_mo_fm_pools, &
71 ao_ao_fm_pools, mo_mo_fm_pools
72 TYPE(cp_fm_pool_p_type),
DIMENSION(:),
POINTER :: ao_mosub_fm_pools, &
74 END TYPE qs_matrix_pools_type
86 TYPE(qs_matrix_pools_type),
POINTER :: mpools
88 cpassert(
ASSOCIATED(mpools))
89 cpassert(mpools%ref_count > 0)
90 mpools%ref_count = mpools%ref_count + 1
101 TYPE(qs_matrix_pools_type),
POINTER :: mpools
103 IF (
ASSOCIATED(mpools))
THEN
104 cpassert(mpools%ref_count > 0)
105 mpools%ref_count = mpools%ref_count - 1
106 IF (mpools%ref_count == 0)
THEN
110 IF (
ASSOCIATED(mpools%ao_mosub_fm_pools))
THEN
113 IF (
ASSOCIATED(mpools%mosub_mosub_fm_pools))
THEN
138 SUBROUTINE mpools_get(mpools, ao_mo_fm_pools, ao_ao_fm_pools, &
139 mo_mo_fm_pools, ao_mosub_fm_pools, mosub_mosub_fm_pools, &
140 maxao_maxmo_fm_pool, maxao_maxao_fm_pool, maxmo_maxmo_fm_pool)
141 TYPE(qs_matrix_pools_type),
INTENT(IN) :: mpools
142 TYPE(cp_fm_pool_p_type),
DIMENSION(:),
OPTIONAL, &
143 POINTER :: ao_mo_fm_pools, ao_ao_fm_pools, &
144 mo_mo_fm_pools, ao_mosub_fm_pools, &
146 TYPE(cp_fm_pool_type),
OPTIONAL,
POINTER :: maxao_maxmo_fm_pool, &
147 maxao_maxao_fm_pool, &
150 IF (
PRESENT(ao_mo_fm_pools)) ao_mo_fm_pools => mpools%ao_mo_fm_pools
151 IF (
PRESENT(maxao_maxmo_fm_pool))
THEN
152 IF (
ASSOCIATED(mpools%ao_mo_fm_pools))
THEN
153 maxao_maxmo_fm_pool => mpools%ao_mo_fm_pools(1)%pool
155 NULLIFY (maxao_maxmo_fm_pool)
158 IF (
PRESENT(ao_ao_fm_pools)) ao_ao_fm_pools => mpools%ao_ao_fm_pools
159 IF (
PRESENT(maxao_maxao_fm_pool))
THEN
160 IF (
ASSOCIATED(mpools%ao_ao_fm_pools))
THEN
161 maxao_maxao_fm_pool => mpools%ao_ao_fm_pools(1)%pool
163 NULLIFY (maxao_maxao_fm_pool)
166 IF (
PRESENT(mo_mo_fm_pools)) mo_mo_fm_pools => mpools%mo_mo_fm_pools
167 IF (
PRESENT(maxmo_maxmo_fm_pool))
THEN
168 IF (
ASSOCIATED(mpools%mo_mo_fm_pools))
THEN
169 maxmo_maxmo_fm_pool => mpools%mo_mo_fm_pools(1)%pool
171 NULLIFY (maxmo_maxmo_fm_pool)
174 IF (
PRESENT(ao_mosub_fm_pools)) ao_mosub_fm_pools => mpools%ao_mosub_fm_pools
175 IF (
PRESENT(mosub_mosub_fm_pools)) mosub_mosub_fm_pools => mpools%mosub_mosub_fm_pools
186 TYPE(qs_matrix_pools_type),
POINTER :: mpools
189 NULLIFY (mpools%ao_ao_fm_pools, mpools%ao_mo_fm_pools, &
190 mpools%mo_mo_fm_pools, mpools%ao_mosub_fm_pools, &
191 mpools%mosub_mosub_fm_pools)
211 TYPE(qs_matrix_pools_type),
POINTER :: mpools
212 TYPE(mo_set_type),
DIMENSION(:),
INTENT(IN) :: mos
213 TYPE(cp_blacs_env_type),
POINTER :: blacs_env
214 TYPE(mp_para_env_type),
POINTER :: para_env
215 INTEGER,
DIMENSION(2),
INTENT(IN),
OPTIONAL :: nmosub
217 CHARACTER(len=*),
PARAMETER :: routinen =
'mpools_rebuild_fm_pools'
219 INTEGER :: handle, ispin, max_nmo, min_nmo, nao, &
220 ncg, ncol_block, nmo, nrg, nrow_block, &
222 LOGICAL :: prepare_subset, should_rebuild
223 TYPE(cp_fm_pool_type),
POINTER :: p_att
224 TYPE(cp_fm_struct_type),
POINTER :: fmstruct
226 CALL timeset(routinen, handle)
231 NULLIFY (fmstruct, p_att)
232 prepare_subset = .false.
233 IF (
PRESENT(nmosub))
THEN
234 IF (nmosub(1) > 0) prepare_subset = .true.
237 IF (.NOT.
ASSOCIATED(mpools))
THEN
242 IF (
ASSOCIATED(mpools%ao_mo_fm_pools))
THEN
243 IF (nspins /=
SIZE(mpools%ao_mo_fm_pools))
THEN
247 IF (.NOT.
ASSOCIATED(mpools%ao_mo_fm_pools))
THEN
248 ALLOCATE (mpools%ao_mo_fm_pools(nspins))
250 NULLIFY (mpools%ao_mo_fm_pools(ispin)%pool)
254 IF (
ASSOCIATED(mpools%ao_ao_fm_pools))
THEN
255 IF (nspins /=
SIZE(mpools%ao_ao_fm_pools))
THEN
259 IF (.NOT.
ASSOCIATED(mpools%ao_ao_fm_pools))
THEN
260 ALLOCATE (mpools%ao_ao_fm_pools(nspins))
262 NULLIFY (mpools%ao_ao_fm_pools(ispin)%pool)
266 IF (
ASSOCIATED(mpools%mo_mo_fm_pools))
THEN
267 IF (nspins /=
SIZE(mpools%mo_mo_fm_pools))
THEN
271 IF (.NOT.
ASSOCIATED(mpools%mo_mo_fm_pools))
THEN
272 ALLOCATE (mpools%mo_mo_fm_pools(nspins))
274 NULLIFY (mpools%mo_mo_fm_pools(ispin)%pool)
278 IF (prepare_subset)
THEN
280 IF (
ASSOCIATED(mpools%ao_mosub_fm_pools))
THEN
281 IF (nspins /=
SIZE(mpools%ao_mosub_fm_pools))
THEN
285 IF (.NOT.
ASSOCIATED(mpools%ao_mosub_fm_pools))
THEN
286 ALLOCATE (mpools%ao_mosub_fm_pools(nspins))
288 NULLIFY (mpools%ao_mosub_fm_pools(ispin)%pool)
292 IF (
ASSOCIATED(mpools%mosub_mosub_fm_pools))
THEN
293 IF (nspins /=
SIZE(mpools%mosub_mosub_fm_pools))
THEN
297 IF (.NOT.
ASSOCIATED(mpools%mosub_mosub_fm_pools))
THEN
298 ALLOCATE (mpools%mosub_mosub_fm_pools(nspins))
300 NULLIFY (mpools%mosub_mosub_fm_pools(ispin)%pool)
308 DO ispin = 2,
SIZE(mos)
310 IF (max_nmo < nmo)
THEN
311 cpabort(
"the mo with the most orbitals must be the first ")
313 min_nmo = min(min_nmo, nmo)
317 should_rebuild = .false.
319 p_att => mpools%ao_ao_fm_pools(ispin)%pool
320 should_rebuild = (should_rebuild .OR. (.NOT.
ASSOCIATED(p_att)))
321 IF (.NOT. should_rebuild)
THEN
326 should_rebuild = nao /= nrg .OR. nao /= ncg
329 IF (should_rebuild)
THEN
335 ncol_global=nao, para_env=para_env, &
337 nrow_block=nrow_block, &
338 ncol_block=ncol_block)
341 DO ispin = 2,
SIZE(mos)
342 mpools%ao_ao_fm_pools(ispin)%pool => mpools%ao_ao_fm_pools(1)%pool
348 should_rebuild = .false.
350 p_att => mpools%ao_mo_fm_pools(ispin)%pool
351 should_rebuild = (should_rebuild .OR. (.NOT.
ASSOCIATED(p_att)))
352 IF (.NOT. should_rebuild)
THEN
358 should_rebuild = nao /= nrg .OR. nmo /= ncg
361 IF (should_rebuild)
THEN
366 IF (max_nmo == min_nmo)
THEN
368 ncol_global=max_nmo, para_env=para_env, &
370 nrow_block=nrow_block, &
371 ncol_block=ncol_block)
374 DO ispin = 2,
SIZE(mos)
375 mpools%ao_mo_fm_pools(ispin)%pool => mpools%ao_mo_fm_pools(1)%pool
379 DO ispin = 1,
SIZE(mos)
382 ncol_global=nmo, para_env=para_env, &
384 nrow_block=nrow_block, &
385 ncol_block=ncol_block)
394 should_rebuild = .false.
396 p_att => mpools%mo_mo_fm_pools(ispin)%pool
397 should_rebuild = (should_rebuild .OR. (.NOT.
ASSOCIATED(p_att)))
398 IF (.NOT. should_rebuild)
THEN
403 should_rebuild = nmo /= nrg .OR. nmo /= ncg
406 IF (should_rebuild)
THEN
411 IF (max_nmo == min_nmo)
THEN
413 ncol_global=max_nmo, para_env=para_env, &
415 nrow_block=nrow_block, &
416 ncol_block=ncol_block)
420 DO ispin = 2,
SIZE(mos)
421 mpools%mo_mo_fm_pools(ispin)%pool => mpools%mo_mo_fm_pools(1)%pool
425 DO ispin = 1,
SIZE(mos)
426 NULLIFY (mpools%mo_mo_fm_pools(ispin)%pool)
429 ncol_global=nmo, para_env=para_env, &
431 nrow_block=nrow_block, &
432 ncol_block=ncol_block)
440 IF (prepare_subset)
THEN
442 should_rebuild = .false.
444 p_att => mpools%ao_mosub_fm_pools(ispin)%pool
445 should_rebuild = (should_rebuild .OR. (.NOT.
ASSOCIATED(p_att)))
446 IF (.NOT. should_rebuild)
THEN
452 should_rebuild = nao /= nrg .OR. nmosub(ispin) /= ncg
455 IF (should_rebuild)
THEN
460 IF (nspins == 1 .OR. nmosub(1) == nmosub(2))
THEN
462 ncol_global=nmosub(1), para_env=para_env, &
464 nrow_block=nrow_block, &
465 ncol_block=ncol_block)
468 DO ispin = 2,
SIZE(mos)
469 mpools%ao_mosub_fm_pools(ispin)%pool => mpools%ao_mosub_fm_pools(1)%pool
473 DO ispin = 1,
SIZE(mos)
476 ncol_global=nmosub(1), para_env=para_env, &
478 nrow_block=nrow_block, &
479 ncol_block=ncol_block)
488 should_rebuild = .false.
490 p_att => mpools%mosub_mosub_fm_pools(ispin)%pool
491 should_rebuild = (should_rebuild .OR. (.NOT.
ASSOCIATED(p_att)))
492 IF (.NOT. should_rebuild)
THEN
496 should_rebuild = nmosub(ispin) /= nrg .OR. nmosub(ispin) /= ncg
499 IF (should_rebuild)
THEN
504 IF (nspins == 1 .OR. nmosub(1) == nmosub(2))
THEN
506 ncol_global=nmosub(1), para_env=para_env, &
508 nrow_block=nrow_block, &
509 ncol_block=ncol_block)
513 DO ispin = 2,
SIZE(mos)
514 mpools%mosub_mosub_fm_pools(ispin)%pool => mpools%mosub_mosub_fm_pools(1)%pool
518 DO ispin = 1,
SIZE(mos)
519 NULLIFY (mpools%mosub_mosub_fm_pools(ispin)%pool)
521 ncol_global=nmosub(ispin), para_env=para_env, &
523 nrow_block=nrow_block, &
524 ncol_block=ncol_block)
533 CALL timestop(handle)
methods related to the blacs parallel environment
pool for for elements that are retained and released
subroutine, public fm_pool_create(pool, el_struct)
creates a pool of elements
subroutine, public fm_pool_release(pool)
releases the given pool (see cp2k/doc/ReferenceCounting.html)
subroutine, public fm_pool_retain(pool)
retains the pool (see cp2k/doc/ReferenceCounting.html)
subroutine, public fm_pools_dealloc(pools)
deallocate an array of pools (releasing each pool)
type(cp_fm_struct_type) function, pointer, public fm_pool_get_el_struct(pool)
returns the structure of the elements in this pool
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
integer function, public cp_fm_struct_get_nrow_block()
...
integer function, public cp_fm_struct_get_ncol_block()
...
subroutine, public cp_fm_struct_get(fmstruct, para_env, context, descriptor, ncol_block, nrow_block, nrow_global, ncol_global, first_p_pos, row_indices, col_indices, nrow_local, ncol_local, nrow_locals, ncol_locals, local_leading_dimension)
returns the values of various attributes of the matrix structure
subroutine, public cp_fm_struct_release(fmstruct)
releases a full matrix structure
Interface to the message passing library MPI.
wrapper for the pools of matrixes
subroutine, public mpools_create(mpools)
creates a mpools
subroutine, public mpools_release(mpools)
releases the given mpools
subroutine, public mpools_retain(mpools)
retains the given qs_matrix_pools_type
subroutine, public mpools_rebuild_fm_pools(mpools, mos, blacs_env, para_env, nmosub)
rebuilds the pools of the (ao x mo, ao x ao , mo x mo) full matrixes
subroutine, public mpools_get(mpools, ao_mo_fm_pools, ao_ao_fm_pools, mo_mo_fm_pools, ao_mosub_fm_pools, mosub_mosub_fm_pools, maxao_maxmo_fm_pool, maxao_maxao_fm_pool, maxmo_maxmo_fm_pool)
returns various attributes of the mpools (notably the pools contained in it)
Definition and initialisation of the mo data type.
subroutine, public get_mo_set(mo_set, maxocc, homo, lfomo, nao, nelectron, n_el_f, nmo, eigenvalues, occupation_numbers, mo_coeff, mo_coeff_b, uniform_occupation, kTS, mu, flexible_electron_count)
Get the components of a MO set data structure.