213 INTEGER,
DIMENSION(2),
INTENT(IN),
OPTIONAL :: nmosub
215 CHARACTER(len=*),
PARAMETER :: routinen =
'mpools_rebuild_fm_pools'
217 INTEGER :: handle, ispin, max_nmo, min_nmo, nao, &
218 ncg, nmo, nrg, nspins
219 LOGICAL :: prepare_subset, should_rebuild
223 CALL timeset(routinen, handle)
225 NULLIFY (fmstruct, p_att)
226 prepare_subset = .false.
227 IF (
PRESENT(nmosub))
THEN
228 IF (nmosub(1) > 0) prepare_subset = .true.
231 IF (.NOT.
ASSOCIATED(mpools))
THEN
236 IF (
ASSOCIATED(mpools%ao_mo_fm_pools))
THEN
237 IF (nspins /=
SIZE(mpools%ao_mo_fm_pools))
THEN
241 IF (.NOT.
ASSOCIATED(mpools%ao_mo_fm_pools))
THEN
242 ALLOCATE (mpools%ao_mo_fm_pools(nspins))
244 NULLIFY (mpools%ao_mo_fm_pools(ispin)%pool)
248 IF (
ASSOCIATED(mpools%ao_ao_fm_pools))
THEN
249 IF (nspins /=
SIZE(mpools%ao_ao_fm_pools))
THEN
253 IF (.NOT.
ASSOCIATED(mpools%ao_ao_fm_pools))
THEN
254 ALLOCATE (mpools%ao_ao_fm_pools(nspins))
256 NULLIFY (mpools%ao_ao_fm_pools(ispin)%pool)
260 IF (
ASSOCIATED(mpools%mo_mo_fm_pools))
THEN
261 IF (nspins /=
SIZE(mpools%mo_mo_fm_pools))
THEN
265 IF (.NOT.
ASSOCIATED(mpools%mo_mo_fm_pools))
THEN
266 ALLOCATE (mpools%mo_mo_fm_pools(nspins))
268 NULLIFY (mpools%mo_mo_fm_pools(ispin)%pool)
272 IF (prepare_subset)
THEN
274 IF (
ASSOCIATED(mpools%ao_mosub_fm_pools))
THEN
275 IF (nspins /=
SIZE(mpools%ao_mosub_fm_pools))
THEN
279 IF (.NOT.
ASSOCIATED(mpools%ao_mosub_fm_pools))
THEN
280 ALLOCATE (mpools%ao_mosub_fm_pools(nspins))
282 NULLIFY (mpools%ao_mosub_fm_pools(ispin)%pool)
286 IF (
ASSOCIATED(mpools%mosub_mosub_fm_pools))
THEN
287 IF (nspins /=
SIZE(mpools%mosub_mosub_fm_pools))
THEN
291 IF (.NOT.
ASSOCIATED(mpools%mosub_mosub_fm_pools))
THEN
292 ALLOCATE (mpools%mosub_mosub_fm_pools(nspins))
294 NULLIFY (mpools%mosub_mosub_fm_pools(ispin)%pool)
302 DO ispin = 2,
SIZE(mos)
304 IF (max_nmo < nmo)
THEN
305 cpabort(
"the mo with the most orbitals must be the first ")
307 min_nmo = min(min_nmo, nmo)
311 should_rebuild = .false.
313 p_att => mpools%ao_ao_fm_pools(ispin)%pool
314 should_rebuild = (should_rebuild .OR. (.NOT.
ASSOCIATED(p_att)))
315 IF (.NOT. should_rebuild)
THEN
319 should_rebuild = nao /= nrg .OR. nao /= ncg
322 IF (should_rebuild)
THEN
328 ncol_global=nao, para_env=para_env, &
332 DO ispin = 2,
SIZE(mos)
333 mpools%ao_ao_fm_pools(ispin)%pool => mpools%ao_ao_fm_pools(1)%pool
339 should_rebuild = .false.
341 p_att => mpools%ao_mo_fm_pools(ispin)%pool
342 should_rebuild = (should_rebuild .OR. (.NOT.
ASSOCIATED(p_att)))
343 IF (.NOT. should_rebuild)
THEN
348 should_rebuild = nao /= nrg .OR. nmo /= ncg
351 IF (should_rebuild)
THEN
356 IF (max_nmo == min_nmo)
THEN
358 ncol_global=max_nmo, para_env=para_env, &
362 DO ispin = 2,
SIZE(mos)
363 mpools%ao_mo_fm_pools(ispin)%pool => mpools%ao_mo_fm_pools(1)%pool
367 DO ispin = 1,
SIZE(mos)
370 ncol_global=nmo, para_env=para_env, &
380 should_rebuild = .false.
382 p_att => mpools%mo_mo_fm_pools(ispin)%pool
383 should_rebuild = (should_rebuild .OR. (.NOT.
ASSOCIATED(p_att)))
384 IF (.NOT. should_rebuild)
THEN
389 should_rebuild = nmo /= nrg .OR. nmo /= ncg
392 IF (should_rebuild)
THEN
397 IF (max_nmo == min_nmo)
THEN
399 ncol_global=max_nmo, para_env=para_env, &
404 DO ispin = 2,
SIZE(mos)
405 mpools%mo_mo_fm_pools(ispin)%pool => mpools%mo_mo_fm_pools(1)%pool
409 DO ispin = 1,
SIZE(mos)
410 NULLIFY (mpools%mo_mo_fm_pools(ispin)%pool)
413 ncol_global=nmo, para_env=para_env, &
422 IF (prepare_subset)
THEN
424 should_rebuild = .false.
426 p_att => mpools%ao_mosub_fm_pools(ispin)%pool
427 should_rebuild = (should_rebuild .OR. (.NOT.
ASSOCIATED(p_att)))
428 IF (.NOT. should_rebuild)
THEN
434 should_rebuild = nao /= nrg .OR. nmosub(ispin) /= ncg
437 IF (should_rebuild)
THEN
442 IF (nspins == 1 .OR. nmosub(1) == nmosub(2))
THEN
444 ncol_global=nmosub(1), para_env=para_env, &
448 DO ispin = 2,
SIZE(mos)
449 mpools%ao_mosub_fm_pools(ispin)%pool => mpools%ao_mosub_fm_pools(1)%pool
453 DO ispin = 1,
SIZE(mos)
456 ncol_global=nmosub(1), para_env=para_env, &
466 should_rebuild = .false.
468 p_att => mpools%mosub_mosub_fm_pools(ispin)%pool
469 should_rebuild = (should_rebuild .OR. (.NOT.
ASSOCIATED(p_att)))
470 IF (.NOT. should_rebuild)
THEN
474 should_rebuild = nmosub(ispin) /= nrg .OR. nmosub(ispin) /= ncg
477 IF (should_rebuild)
THEN
482 IF (nspins == 1 .OR. nmosub(1) == nmosub(2))
THEN
484 ncol_global=nmosub(1), para_env=para_env, &
489 DO ispin = 2,
SIZE(mos)
490 mpools%mosub_mosub_fm_pools(ispin)%pool => mpools%mosub_mosub_fm_pools(1)%pool
494 DO ispin = 1,
SIZE(mos)
495 NULLIFY (mpools%mosub_mosub_fm_pools(ispin)%pool)
497 ncol_global=nmosub(ispin), para_env=para_env, &
507 CALL timestop(handle)