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
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)