193 INTEGER,
DIMENSION(2),
INTENT(IN),
OPTIONAL :: nmosub
195 CHARACTER(len=*),
PARAMETER :: routinen =
'mpools_rebuild_fm_pools'
197 INTEGER :: handle, ispin, max_nmo, min_nmo, nao, &
198 ncg, nmo, nrg, nspins
199 LOGICAL :: prepare_subset, should_rebuild
203 CALL timeset(routinen, handle)
205 NULLIFY (fmstruct, p_att)
206 prepare_subset = .false.
207 IF (
PRESENT(nmosub))
THEN
208 IF (nmosub(1) > 0) prepare_subset = .true.
211 IF (.NOT.
ASSOCIATED(mpools))
THEN
216 IF (
ASSOCIATED(mpools%ao_mo_fm_pools))
THEN
217 IF (nspins /=
SIZE(mpools%ao_mo_fm_pools))
THEN
221 IF (.NOT.
ASSOCIATED(mpools%ao_mo_fm_pools))
THEN
222 ALLOCATE (mpools%ao_mo_fm_pools(nspins))
224 NULLIFY (mpools%ao_mo_fm_pools(ispin)%pool)
228 IF (
ASSOCIATED(mpools%ao_ao_fm_pool))
THEN
231 IF (.NOT.
ASSOCIATED(mpools%ao_ao_fm_pool))
THEN
232 NULLIFY (mpools%ao_ao_fm_pool)
235 IF (
ASSOCIATED(mpools%mo_mo_fm_pools))
THEN
236 IF (nspins /=
SIZE(mpools%mo_mo_fm_pools))
THEN
240 IF (.NOT.
ASSOCIATED(mpools%mo_mo_fm_pools))
THEN
241 ALLOCATE (mpools%mo_mo_fm_pools(nspins))
243 NULLIFY (mpools%mo_mo_fm_pools(ispin)%pool)
247 IF (prepare_subset)
THEN
249 IF (
ASSOCIATED(mpools%ao_mosub_fm_pools))
THEN
250 IF (nspins /=
SIZE(mpools%ao_mosub_fm_pools))
THEN
254 IF (.NOT.
ASSOCIATED(mpools%ao_mosub_fm_pools))
THEN
255 ALLOCATE (mpools%ao_mosub_fm_pools(nspins))
257 NULLIFY (mpools%ao_mosub_fm_pools(ispin)%pool)
261 IF (
ASSOCIATED(mpools%mosub_mosub_fm_pools))
THEN
262 IF (nspins /=
SIZE(mpools%mosub_mosub_fm_pools))
THEN
266 IF (.NOT.
ASSOCIATED(mpools%mosub_mosub_fm_pools))
THEN
267 ALLOCATE (mpools%mosub_mosub_fm_pools(nspins))
269 NULLIFY (mpools%mosub_mosub_fm_pools(ispin)%pool)
277 DO ispin = 2,
SIZE(mos)
279 IF (max_nmo < nmo)
THEN
280 cpabort(
"the mo with the most orbitals must be the first ")
282 min_nmo = min(min_nmo, nmo)
286 should_rebuild = .false.
288 p_att => mpools%ao_ao_fm_pool
289 should_rebuild = (should_rebuild .OR. (.NOT.
ASSOCIATED(p_att)))
290 IF (.NOT. should_rebuild)
THEN
294 should_rebuild = nao /= nrg .OR. nao /= ncg
297 IF (should_rebuild)
THEN
301 ncol_global=nao, para_env=para_env, &
308 should_rebuild = .false.
310 p_att => mpools%ao_mo_fm_pools(ispin)%pool
311 should_rebuild = (should_rebuild .OR. (.NOT.
ASSOCIATED(p_att)))
312 IF (.NOT. should_rebuild)
THEN
317 should_rebuild = nao /= nrg .OR. nmo /= ncg
320 IF (should_rebuild)
THEN
325 IF (max_nmo == min_nmo)
THEN
327 ncol_global=max_nmo, para_env=para_env, &
329 DO ispin = 1,
SIZE(mos)
334 DO ispin = 1,
SIZE(mos)
337 ncol_global=nmo, para_env=para_env, &
347 should_rebuild = .false.
349 p_att => mpools%mo_mo_fm_pools(ispin)%pool
350 should_rebuild = (should_rebuild .OR. (.NOT.
ASSOCIATED(p_att)))
351 IF (.NOT. should_rebuild)
THEN
356 should_rebuild = nmo /= nrg .OR. nmo /= ncg
359 IF (should_rebuild)
THEN
364 IF (max_nmo == min_nmo)
THEN
366 ncol_global=max_nmo, para_env=para_env, &
368 DO ispin = 1,
SIZE(mos)
374 DO ispin = 1,
SIZE(mos)
375 NULLIFY (mpools%mo_mo_fm_pools(ispin)%pool)
378 ncol_global=nmo, para_env=para_env, &
387 IF (prepare_subset)
THEN
389 should_rebuild = .false.
391 p_att => mpools%ao_mosub_fm_pools(ispin)%pool
392 should_rebuild = (should_rebuild .OR. (.NOT.
ASSOCIATED(p_att)))
393 IF (.NOT. should_rebuild)
THEN
399 should_rebuild = nao /= nrg .OR. nmosub(ispin) /= ncg
402 IF (should_rebuild)
THEN
407 IF (nspins == 1 .OR. nmosub(1) == nmosub(2))
THEN
409 ncol_global=nmosub(1), para_env=para_env, &
411 DO ispin = 1,
SIZE(mos)
412 CALL fm_pool_create(mpools%ao_mosub_fm_pools(ispin)%pool, fmstruct)
416 DO ispin = 1,
SIZE(mos)
419 ncol_global=nmosub(1), para_env=para_env, &
429 should_rebuild = .false.
431 p_att => mpools%mosub_mosub_fm_pools(ispin)%pool
432 should_rebuild = (should_rebuild .OR. (.NOT.
ASSOCIATED(p_att)))
433 IF (.NOT. should_rebuild)
THEN
437 should_rebuild = nmosub(ispin) /= nrg .OR. nmosub(ispin) /= ncg
440 IF (should_rebuild)
THEN
445 IF (nspins == 1 .OR. nmosub(1) == nmosub(2))
THEN
447 ncol_global=nmosub(1), para_env=para_env, &
449 DO ispin = 1,
SIZE(mos)
455 DO ispin = 1,
SIZE(mos)
456 NULLIFY (mpools%mosub_mosub_fm_pools(ispin)%pool)
458 ncol_global=nmosub(ispin), para_env=para_env, &
468 CALL timestop(handle)