LCOV - code coverage report
Current view: top level - src - qs_matrix_pools.F (source / functions) Hit Total Coverage
Test: CP2K Regtests (git:b8e0b09) Lines: 132 209 63.2 %
Date: 2024-08-31 06:31:37 Functions: 4 6 66.7 %

          Line data    Source code
       1             : !--------------------------------------------------------------------------------------------------!
       2             : !   CP2K: A general program to perform molecular dynamics simulations                              !
       3             : !   Copyright 2000-2024 CP2K developers group <https://cp2k.org>                                   !
       4             : !                                                                                                  !
       5             : !   SPDX-License-Identifier: GPL-2.0-or-later                                                      !
       6             : !--------------------------------------------------------------------------------------------------!
       7             : 
       8             : ! **************************************************************************************************
       9             : !> \brief wrapper for the pools of matrixes
      10             : !> \par History
      11             : !>      05.2003 created [fawzi]
      12             : !> \author fawzi
      13             : ! **************************************************************************************************
      14             : MODULE qs_matrix_pools
      15             :    USE cp_blacs_env,                    ONLY: cp_blacs_env_type
      16             :    USE cp_fm_pool_types,                ONLY: cp_fm_pool_p_type,&
      17             :                                               cp_fm_pool_type,&
      18             :                                               fm_pool_create,&
      19             :                                               fm_pool_get_el_struct,&
      20             :                                               fm_pool_release,&
      21             :                                               fm_pool_retain,&
      22             :                                               fm_pools_dealloc
      23             :    USE cp_fm_struct,                    ONLY: cp_fm_struct_create,&
      24             :                                               cp_fm_struct_get,&
      25             :                                               cp_fm_struct_release,&
      26             :                                               cp_fm_struct_type
      27             :    USE message_passing,                 ONLY: mp_para_env_type
      28             :    USE qs_mo_types,                     ONLY: get_mo_set,&
      29             :                                               mo_set_type
      30             : #include "./base/base_uses.f90"
      31             : 
      32             :    IMPLICIT NONE
      33             :    PRIVATE
      34             : 
      35             :    LOGICAL, PRIVATE, PARAMETER :: debug_this_module = .TRUE.
      36             :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_matrix_pools'
      37             : 
      38             :    PUBLIC :: qs_matrix_pools_type
      39             :    PUBLIC :: mpools_retain, mpools_release, mpools_get, &
      40             :              mpools_create, mpools_rebuild_fm_pools
      41             : 
      42             : ! **************************************************************************************************
      43             : !> \brief container for the pools of matrixes used by qs
      44             : !> \param ref_count reference count (see doc/ReferenceCounting.html)
      45             : !> \param ao_mo_fm_pools pools with (ao x mo) full matrixes (same order as
      46             : !>        c).
      47             : !> \param ao_ao_fm_pools pools with (ao x ao) full matrixes (same order as
      48             : !>        c).
      49             : !> \param mo_mo_fm_pools pools with (mo x mo) full matrixes (same
      50             : !>        order as c).
      51             : !> \param ao_mosub_fm_pools pools with (ao x mosub) full matrixes, where mosub
      52             : !>        are a subset of the mos
      53             : !> \param mosub_mosub_fm_pools pools with (mosub x mosub) full matrixes, where mosub
      54             : !>        are a subset of the mos
      55             : !>
      56             : !> \param maxao_maxao_fm_pools pool of matrixes big enough to accommodate any
      57             : !>        aoxao matrix (useful for temp matrixes)
      58             : !> \param maxao_maxmo_fm_pools pool of matrixes big enough to accommodate any
      59             : !>        aoxmo matrix (useful for temp matrixes)
      60             : !> \param maxmo_maxmo_fm_pools pool of matrixes big enough to accommodate any
      61             : !>        moxmo matrix (useful for temp matrixes)
      62             : !> \par History
      63             : !>      04.2003 created [fawzi]
      64             : !> \author fawzi
      65             : ! **************************************************************************************************
      66             :    TYPE qs_matrix_pools_type
      67             :       INTEGER :: ref_count = -1
      68             :       TYPE(cp_fm_pool_p_type), DIMENSION(:), POINTER        :: ao_mo_fm_pools => NULL(), &
      69             :                                                                ao_ao_fm_pools => NULL(), mo_mo_fm_pools => NULL()
      70             :       TYPE(cp_fm_pool_p_type), DIMENSION(:), POINTER        :: ao_mosub_fm_pools => NULL(), &
      71             :                                                                mosub_mosub_fm_pools => NULL()
      72             :    END TYPE qs_matrix_pools_type
      73             : 
      74             : CONTAINS
      75             : 
      76             : ! **************************************************************************************************
      77             : !> \brief retains the given qs_matrix_pools_type
      78             : !> \param mpools the matrix pools type to retain
      79             : !> \par History
      80             : !>      04.2003 created [fawzi]
      81             : !> \author fawzi
      82             : ! **************************************************************************************************
      83           0 :    SUBROUTINE mpools_retain(mpools)
      84             :       TYPE(qs_matrix_pools_type), POINTER                :: mpools
      85             : 
      86           0 :       CPASSERT(ASSOCIATED(mpools))
      87           0 :       CPASSERT(mpools%ref_count > 0)
      88           0 :       mpools%ref_count = mpools%ref_count + 1
      89           0 :    END SUBROUTINE mpools_retain
      90             : 
      91             : ! **************************************************************************************************
      92             : !> \brief releases the given mpools
      93             : !> \param mpools the matrix pools type to retain
      94             : !> \par History
      95             : !>      04.2003 created [fawzi]
      96             : !> \author fawzi
      97             : ! **************************************************************************************************
      98       20016 :    SUBROUTINE mpools_release(mpools)
      99             :       TYPE(qs_matrix_pools_type), POINTER                :: mpools
     100             : 
     101       20016 :       IF (ASSOCIATED(mpools)) THEN
     102        6502 :          CPASSERT(mpools%ref_count > 0)
     103        6502 :          mpools%ref_count = mpools%ref_count - 1
     104        6502 :          IF (mpools%ref_count == 0) THEN
     105        6502 :             CALL fm_pools_dealloc(mpools%ao_mo_fm_pools)
     106        6502 :             CALL fm_pools_dealloc(mpools%ao_ao_fm_pools)
     107        6502 :             CALL fm_pools_dealloc(mpools%mo_mo_fm_pools)
     108        6502 :             IF (ASSOCIATED(mpools%ao_mosub_fm_pools)) THEN
     109           0 :                CALL fm_pools_dealloc(mpools%ao_mosub_fm_pools)
     110             :             END IF
     111        6502 :             IF (ASSOCIATED(mpools%mosub_mosub_fm_pools)) THEN
     112           0 :                CALL fm_pools_dealloc(mpools%mosub_mosub_fm_pools)
     113             :             END IF
     114        6502 :             DEALLOCATE (mpools)
     115             :          END IF
     116             :       END IF
     117       20016 :       NULLIFY (mpools)
     118       20016 :    END SUBROUTINE mpools_release
     119             : 
     120             : ! **************************************************************************************************
     121             : !> \brief returns various attributes of the mpools (notably the pools
     122             : !>      contained in it)
     123             : !> \param mpools the matrix pools object you want info about
     124             : !> \param ao_mo_fm_pools ...
     125             : !> \param ao_ao_fm_pools ...
     126             : !> \param mo_mo_fm_pools ...
     127             : !> \param ao_mosub_fm_pools ...
     128             : !> \param mosub_mosub_fm_pools ...
     129             : !> \param maxao_maxmo_fm_pool ...
     130             : !> \param maxao_maxao_fm_pool ...
     131             : !> \param maxmo_maxmo_fm_pool ...
     132             : !> \par History
     133             : !>      04.2003 created [fawzi]
     134             : !> \author fawzi
     135             : ! **************************************************************************************************
     136       93935 :    SUBROUTINE mpools_get(mpools, ao_mo_fm_pools, ao_ao_fm_pools, &
     137             :                          mo_mo_fm_pools, ao_mosub_fm_pools, mosub_mosub_fm_pools, &
     138             :                          maxao_maxmo_fm_pool, maxao_maxao_fm_pool, maxmo_maxmo_fm_pool)
     139             :       TYPE(qs_matrix_pools_type), INTENT(IN)             :: mpools
     140             :       TYPE(cp_fm_pool_p_type), DIMENSION(:), OPTIONAL, &
     141             :          POINTER                                         :: ao_mo_fm_pools, ao_ao_fm_pools, &
     142             :                                                             mo_mo_fm_pools, ao_mosub_fm_pools, &
     143             :                                                             mosub_mosub_fm_pools
     144             :       TYPE(cp_fm_pool_type), OPTIONAL, POINTER           :: maxao_maxmo_fm_pool, &
     145             :                                                             maxao_maxao_fm_pool, &
     146             :                                                             maxmo_maxmo_fm_pool
     147             : 
     148       93935 :       IF (PRESENT(ao_mo_fm_pools)) ao_mo_fm_pools => mpools%ao_mo_fm_pools
     149       93935 :       IF (PRESENT(maxao_maxmo_fm_pool)) THEN
     150       11731 :          IF (ASSOCIATED(mpools%ao_mo_fm_pools)) THEN
     151       11731 :             maxao_maxmo_fm_pool => mpools%ao_mo_fm_pools(1)%pool
     152             :          ELSE
     153           0 :             NULLIFY (maxao_maxmo_fm_pool) ! raise an error?
     154             :          END IF
     155             :       END IF
     156       93935 :       IF (PRESENT(ao_ao_fm_pools)) ao_ao_fm_pools => mpools%ao_ao_fm_pools
     157       93935 :       IF (PRESENT(maxao_maxao_fm_pool)) THEN
     158           0 :          IF (ASSOCIATED(mpools%ao_ao_fm_pools)) THEN
     159           0 :             maxao_maxao_fm_pool => mpools%ao_ao_fm_pools(1)%pool
     160             :          ELSE
     161           0 :             NULLIFY (maxao_maxao_fm_pool) ! raise an error?
     162             :          END IF
     163             :       END IF
     164       93935 :       IF (PRESENT(mo_mo_fm_pools)) mo_mo_fm_pools => mpools%mo_mo_fm_pools
     165       93935 :       IF (PRESENT(maxmo_maxmo_fm_pool)) THEN
     166        1092 :          IF (ASSOCIATED(mpools%mo_mo_fm_pools)) THEN
     167        1092 :             maxmo_maxmo_fm_pool => mpools%mo_mo_fm_pools(1)%pool
     168             :          ELSE
     169           0 :             NULLIFY (maxmo_maxmo_fm_pool) ! raise an error?
     170             :          END IF
     171             :       END IF
     172       93935 :       IF (PRESENT(ao_mosub_fm_pools)) ao_mosub_fm_pools => mpools%ao_mosub_fm_pools
     173       93935 :       IF (PRESENT(mosub_mosub_fm_pools)) mosub_mosub_fm_pools => mpools%mosub_mosub_fm_pools
     174       93935 :    END SUBROUTINE mpools_get
     175             : 
     176             : ! **************************************************************************************************
     177             : !> \brief creates a mpools
     178             : !> \param mpools the mpools to create
     179             : !> \par History
     180             : !>      04.2003 created [fawzi]
     181             : !> \author fawzi
     182             : ! **************************************************************************************************
     183        6502 :    SUBROUTINE mpools_create(mpools)
     184             :       TYPE(qs_matrix_pools_type), POINTER                :: mpools
     185             : 
     186        6502 :       ALLOCATE (mpools)
     187             :       NULLIFY (mpools%ao_ao_fm_pools, mpools%ao_mo_fm_pools, &
     188             :                mpools%mo_mo_fm_pools, mpools%ao_mosub_fm_pools, &
     189             :                mpools%mosub_mosub_fm_pools)
     190        6502 :       mpools%ref_count = 1
     191        6502 :    END SUBROUTINE mpools_create
     192             : 
     193             : ! **************************************************************************************************
     194             : !> \brief rebuilds the pools of the (ao x mo, ao x ao , mo x mo) full matrixes
     195             : !> \param mpools the environment where the pools should be rebuilt
     196             : !> \param mos the molecular orbitals (qs_env%c), must contain up to
     197             : !>        date nmo and nao
     198             : !> \param blacs_env the blacs environment of the full matrixes
     199             : !> \param para_env the parallel environment of the matrixes
     200             : !> \param nmosub number of the orbitals for the creation
     201             : !>        of the pools containing only a subset of mos (OPTIONAL)
     202             : !> \par History
     203             : !>      08.2002 created [fawzi]
     204             : !>      04.2005 added pools for a subset of mos [MI]
     205             : !> \author Fawzi Mohamed
     206             : ! **************************************************************************************************
     207        6506 :    SUBROUTINE mpools_rebuild_fm_pools(mpools, mos, blacs_env, para_env, &
     208             :                                       nmosub)
     209             :       TYPE(qs_matrix_pools_type), POINTER                :: mpools
     210             :       TYPE(mo_set_type), DIMENSION(:), INTENT(IN)        :: mos
     211             :       TYPE(cp_blacs_env_type), POINTER                   :: blacs_env
     212             :       TYPE(mp_para_env_type), POINTER                    :: para_env
     213             :       INTEGER, DIMENSION(2), INTENT(IN), OPTIONAL        :: nmosub
     214             : 
     215             :       CHARACTER(len=*), PARAMETER :: routineN = 'mpools_rebuild_fm_pools'
     216             : 
     217             :       INTEGER                                            :: handle, ispin, max_nmo, min_nmo, nao, &
     218             :                                                             ncg, nmo, nrg, nspins
     219             :       LOGICAL                                            :: prepare_subset, should_rebuild
     220             :       TYPE(cp_fm_pool_type), POINTER                     :: p_att
     221             :       TYPE(cp_fm_struct_type), POINTER                   :: fmstruct
     222             : 
     223        6506 :       CALL timeset(routineN, handle)
     224             : 
     225        6506 :       NULLIFY (fmstruct, p_att)
     226        6506 :       prepare_subset = .FALSE.
     227        6506 :       IF (PRESENT(nmosub)) THEN
     228           0 :          IF (nmosub(1) > 0) prepare_subset = .TRUE.
     229             :       END IF
     230             : 
     231        6506 :       IF (.NOT. ASSOCIATED(mpools)) THEN
     232        6256 :          CALL mpools_create(mpools)
     233             :       END IF
     234        6506 :       nspins = SIZE(mos)
     235             : 
     236        6506 :       IF (ASSOCIATED(mpools%ao_mo_fm_pools)) THEN
     237           4 :          IF (nspins /= SIZE(mpools%ao_mo_fm_pools)) THEN
     238           0 :             CALL fm_pools_dealloc(mpools%ao_mo_fm_pools)
     239             :          END IF
     240             :       END IF
     241        6506 :       IF (.NOT. ASSOCIATED(mpools%ao_mo_fm_pools)) THEN
     242       27505 :          ALLOCATE (mpools%ao_mo_fm_pools(nspins))
     243       14501 :          DO ispin = 1, nspins
     244       14501 :             NULLIFY (mpools%ao_mo_fm_pools(ispin)%pool)
     245             :          END DO
     246             :       END IF
     247             : 
     248        6506 :       IF (ASSOCIATED(mpools%ao_ao_fm_pools)) THEN
     249           4 :          IF (nspins /= SIZE(mpools%ao_ao_fm_pools)) THEN
     250           0 :             CALL fm_pools_dealloc(mpools%ao_ao_fm_pools)
     251             :          END IF
     252             :       END IF
     253        6506 :       IF (.NOT. ASSOCIATED(mpools%ao_ao_fm_pools)) THEN
     254       27505 :          ALLOCATE (mpools%ao_ao_fm_pools(nspins))
     255       14501 :          DO ispin = 1, nspins
     256       14501 :             NULLIFY (mpools%ao_ao_fm_pools(ispin)%pool)
     257             :          END DO
     258             :       END IF
     259             : 
     260        6506 :       IF (ASSOCIATED(mpools%mo_mo_fm_pools)) THEN
     261           4 :          IF (nspins /= SIZE(mpools%mo_mo_fm_pools)) THEN
     262           0 :             CALL fm_pools_dealloc(mpools%mo_mo_fm_pools)
     263             :          END IF
     264             :       END IF
     265        6506 :       IF (.NOT. ASSOCIATED(mpools%mo_mo_fm_pools)) THEN
     266       27505 :          ALLOCATE (mpools%mo_mo_fm_pools(nspins))
     267       14501 :          DO ispin = 1, nspins
     268       14501 :             NULLIFY (mpools%mo_mo_fm_pools(ispin)%pool)
     269             :          END DO
     270             :       END IF
     271             : 
     272        6506 :       IF (prepare_subset) THEN
     273             : 
     274           0 :          IF (ASSOCIATED(mpools%ao_mosub_fm_pools)) THEN
     275           0 :             IF (nspins /= SIZE(mpools%ao_mosub_fm_pools)) THEN
     276           0 :                CALL fm_pools_dealloc(mpools%ao_mosub_fm_pools)
     277             :             END IF
     278             :          END IF
     279           0 :          IF (.NOT. ASSOCIATED(mpools%ao_mosub_fm_pools)) THEN
     280           0 :             ALLOCATE (mpools%ao_mosub_fm_pools(nspins))
     281           0 :             DO ispin = 1, nspins
     282           0 :                NULLIFY (mpools%ao_mosub_fm_pools(ispin)%pool)
     283             :             END DO
     284             :          END IF
     285             : 
     286           0 :          IF (ASSOCIATED(mpools%mosub_mosub_fm_pools)) THEN
     287           0 :             IF (nspins /= SIZE(mpools%mosub_mosub_fm_pools)) THEN
     288           0 :                CALL fm_pools_dealloc(mpools%mosub_mosub_fm_pools)
     289             :             END IF
     290             :          END IF
     291           0 :          IF (.NOT. ASSOCIATED(mpools%mosub_mosub_fm_pools)) THEN
     292           0 :             ALLOCATE (mpools%mosub_mosub_fm_pools(nspins))
     293           0 :             DO ispin = 1, nspins
     294           0 :                NULLIFY (mpools%mosub_mosub_fm_pools(ispin)%pool)
     295             :             END DO
     296             :          END IF
     297             : 
     298             :       END IF ! prepare_subset
     299             : 
     300        6506 :       CALL get_mo_set(mos(1), nao=nao, nmo=min_nmo)
     301        6506 :       max_nmo = min_nmo
     302        8003 :       DO ispin = 2, SIZE(mos)
     303        1497 :          CALL get_mo_set(mos(ispin), nmo=nmo)
     304        1497 :          IF (max_nmo < nmo) THEN
     305           0 :             CPABORT("the mo with the most orbitals must be the first ")
     306             :          END IF
     307        9500 :          min_nmo = MIN(min_nmo, nmo)
     308             :       END DO
     309             : 
     310             :       ! aoao pools
     311        6506 :       should_rebuild = .FALSE.
     312       14509 :       DO ispin = 1, nspins
     313        8003 :          p_att => mpools%ao_ao_fm_pools(ispin)%pool
     314        8003 :          should_rebuild = (should_rebuild .OR. (.NOT. ASSOCIATED(p_att)))
     315       14509 :          IF (.NOT. should_rebuild) THEN
     316           4 :             fmstruct => fm_pool_get_el_struct(mpools%ao_ao_fm_pools(ispin)%pool)
     317           4 :             CALL cp_fm_struct_get(fmstruct, nrow_global=nrg, ncol_global=ncg)
     318           4 :             CALL get_mo_set(mos(1), nao=nao, nmo=nmo)
     319           4 :             should_rebuild = nao /= nrg .OR. nao /= ncg
     320             :          END IF
     321             :       END DO
     322        6506 :       IF (should_rebuild) THEN
     323       14501 :          DO ispin = 1, nspins
     324       14501 :             CALL fm_pool_release(mpools%ao_ao_fm_pools(ispin)%pool)
     325             :          END DO
     326             : 
     327             :          CALL cp_fm_struct_create(fmstruct, nrow_global=nao, &
     328             :                                   ncol_global=nao, para_env=para_env, &
     329        6502 :                                   context=blacs_env)
     330        6502 :          CALL fm_pool_create(mpools%ao_ao_fm_pools(1)%pool, fmstruct)
     331        6502 :          CALL cp_fm_struct_release(fmstruct)
     332        7999 :          DO ispin = 2, SIZE(mos)
     333        1497 :             mpools%ao_ao_fm_pools(ispin)%pool => mpools%ao_ao_fm_pools(1)%pool
     334        7999 :             CALL fm_pool_retain(mpools%ao_ao_fm_pools(1)%pool)
     335             :          END DO
     336             :       END IF
     337             : 
     338             :       ! aomo pools
     339             :       should_rebuild = .FALSE.
     340       14509 :       DO ispin = 1, nspins
     341        8003 :          p_att => mpools%ao_mo_fm_pools(ispin)%pool
     342        8003 :          should_rebuild = (should_rebuild .OR. (.NOT. ASSOCIATED(p_att)))
     343       14509 :          IF (.NOT. should_rebuild) THEN
     344             :             fmstruct => fm_pool_get_el_struct(mpools%ao_mo_fm_pools(ispin) &
     345           4 :                                               %pool)
     346           4 :             CALL cp_fm_struct_get(fmstruct, nrow_global=nrg, ncol_global=ncg)
     347           4 :             CALL get_mo_set(mos(1), nao=nao, nmo=nmo)
     348           4 :             should_rebuild = nao /= nrg .OR. nmo /= ncg
     349             :          END IF
     350             :       END DO
     351        6506 :       IF (should_rebuild) THEN
     352       14501 :          DO ispin = 1, nspins
     353       14501 :             CALL fm_pool_release(mpools%ao_mo_fm_pools(ispin)%pool)
     354             :          END DO
     355             : 
     356        6502 :          IF (max_nmo == min_nmo) THEN
     357             :             CALL cp_fm_struct_create(fmstruct, nrow_global=nao, &
     358             :                                      ncol_global=max_nmo, para_env=para_env, &
     359        5677 :                                      context=blacs_env)
     360        5677 :             CALL fm_pool_create(mpools%ao_mo_fm_pools(1)%pool, fmstruct)
     361        5677 :             CALL cp_fm_struct_release(fmstruct)
     362        6349 :             DO ispin = 2, SIZE(mos)
     363         672 :                mpools%ao_mo_fm_pools(ispin)%pool => mpools%ao_mo_fm_pools(1)%pool
     364        6349 :                CALL fm_pool_retain(mpools%ao_mo_fm_pools(1)%pool)
     365             :             END DO
     366             :          ELSE
     367        2475 :             DO ispin = 1, SIZE(mos)
     368        1650 :                CALL get_mo_set(mos(ispin), nmo=nmo, nao=nao)
     369             :                CALL cp_fm_struct_create(fmstruct, nrow_global=nao, &
     370             :                                         ncol_global=nmo, para_env=para_env, &
     371        1650 :                                         context=blacs_env)
     372             :                CALL fm_pool_create(mpools%ao_mo_fm_pools(ispin)%pool, &
     373        1650 :                                    fmstruct)
     374        4125 :                CALL cp_fm_struct_release(fmstruct)
     375             :             END DO
     376             :          END IF
     377             :       END IF
     378             : 
     379             :       ! momo pools
     380             :       should_rebuild = .FALSE.
     381       14509 :       DO ispin = 1, nspins
     382        8003 :          p_att => mpools%mo_mo_fm_pools(ispin)%pool
     383        8003 :          should_rebuild = (should_rebuild .OR. (.NOT. ASSOCIATED(p_att)))
     384       14509 :          IF (.NOT. should_rebuild) THEN
     385           4 :             fmstruct => fm_pool_get_el_struct(p_att)
     386             :             CALL cp_fm_struct_get(fmstruct, nrow_global=nrg, &
     387           4 :                                   ncol_global=ncg)
     388           4 :             CALL get_mo_set(mos(1), nao=nao, nmo=nmo)
     389           4 :             should_rebuild = nmo /= nrg .OR. nmo /= ncg
     390             :          END IF
     391             :       END DO
     392        6506 :       IF (should_rebuild) THEN
     393       14501 :          DO ispin = 1, nspins
     394       14501 :             CALL fm_pool_release(mpools%mo_mo_fm_pools(ispin)%pool)
     395             :          END DO
     396             : 
     397        6502 :          IF (max_nmo == min_nmo) THEN
     398             :             CALL cp_fm_struct_create(fmstruct, nrow_global=max_nmo, &
     399             :                                      ncol_global=max_nmo, para_env=para_env, &
     400        5677 :                                      context=blacs_env)
     401             :             CALL fm_pool_create(mpools%mo_mo_fm_pools(1)%pool, &
     402        5677 :                                 fmstruct)
     403        5677 :             CALL cp_fm_struct_release(fmstruct)
     404        6349 :             DO ispin = 2, SIZE(mos)
     405         672 :                mpools%mo_mo_fm_pools(ispin)%pool => mpools%mo_mo_fm_pools(1)%pool
     406        6349 :                CALL fm_pool_retain(mpools%mo_mo_fm_pools(1)%pool)
     407             :             END DO
     408             :          ELSE
     409        2475 :             DO ispin = 1, SIZE(mos)
     410        1650 :                NULLIFY (mpools%mo_mo_fm_pools(ispin)%pool)
     411        1650 :                CALL get_mo_set(mos(ispin), nmo=nmo, nao=nao)
     412             :                CALL cp_fm_struct_create(fmstruct, nrow_global=nmo, &
     413             :                                         ncol_global=nmo, para_env=para_env, &
     414        1650 :                                         context=blacs_env)
     415             :                CALL fm_pool_create(mpools%mo_mo_fm_pools(ispin)%pool, &
     416        1650 :                                    fmstruct)
     417        4125 :                CALL cp_fm_struct_release(fmstruct)
     418             :             END DO
     419             :          END IF
     420             :       END IF
     421             : 
     422        6506 :       IF (prepare_subset) THEN
     423             :          ! aomosub pools
     424             :          should_rebuild = .FALSE.
     425           0 :          DO ispin = 1, nspins
     426           0 :             p_att => mpools%ao_mosub_fm_pools(ispin)%pool
     427           0 :             should_rebuild = (should_rebuild .OR. (.NOT. ASSOCIATED(p_att)))
     428           0 :             IF (.NOT. should_rebuild) THEN
     429             :                fmstruct => fm_pool_get_el_struct(mpools%ao_mosub_fm_pools(ispin) &
     430           0 :                                                  %pool)
     431             :                CALL cp_fm_struct_get(fmstruct, nrow_global=nrg, &
     432           0 :                                      ncol_global=ncg)
     433           0 :                CALL get_mo_set(mos(1), nao=nao)
     434           0 :                should_rebuild = nao /= nrg .OR. nmosub(ispin) /= ncg
     435             :             END IF
     436             :          END DO
     437           0 :          IF (should_rebuild) THEN
     438           0 :             DO ispin = 1, nspins
     439           0 :                CALL fm_pool_release(mpools%ao_mosub_fm_pools(ispin)%pool)
     440             :             END DO
     441             : 
     442           0 :             IF (nspins == 1 .OR. nmosub(1) == nmosub(2)) THEN
     443             :                CALL cp_fm_struct_create(fmstruct, nrow_global=nao, &
     444             :                                         ncol_global=nmosub(1), para_env=para_env, &
     445           0 :                                         context=blacs_env)
     446           0 :                CALL fm_pool_create(mpools%ao_mosub_fm_pools(1)%pool, fmstruct)
     447           0 :                CALL cp_fm_struct_release(fmstruct)
     448           0 :                DO ispin = 2, SIZE(mos)
     449           0 :                   mpools%ao_mosub_fm_pools(ispin)%pool => mpools%ao_mosub_fm_pools(1)%pool
     450           0 :                   CALL fm_pool_retain(mpools%ao_mosub_fm_pools(1)%pool)
     451             :                END DO
     452             :             ELSE
     453           0 :                DO ispin = 1, SIZE(mos)
     454           0 :                   CALL get_mo_set(mos(ispin), nao=nao)
     455             :                   CALL cp_fm_struct_create(fmstruct, nrow_global=nao, &
     456             :                                            ncol_global=nmosub(1), para_env=para_env, &
     457           0 :                                            context=blacs_env)
     458             :                   CALL fm_pool_create(mpools%ao_mosub_fm_pools(ispin)%pool, &
     459           0 :                                       fmstruct)
     460           0 :                   CALL cp_fm_struct_release(fmstruct)
     461             :                END DO
     462             :             END IF
     463             :          END IF ! should_rebuild
     464             : 
     465             :          ! mosubmosub pools
     466             :          should_rebuild = .FALSE.
     467           0 :          DO ispin = 1, nspins
     468           0 :             p_att => mpools%mosub_mosub_fm_pools(ispin)%pool
     469           0 :             should_rebuild = (should_rebuild .OR. (.NOT. ASSOCIATED(p_att)))
     470           0 :             IF (.NOT. should_rebuild) THEN
     471           0 :                fmstruct => fm_pool_get_el_struct(p_att)
     472             :                CALL cp_fm_struct_get(fmstruct, nrow_global=nrg, &
     473           0 :                                      ncol_global=ncg)
     474           0 :                should_rebuild = nmosub(ispin) /= nrg .OR. nmosub(ispin) /= ncg
     475             :             END IF
     476             :          END DO
     477           0 :          IF (should_rebuild) THEN
     478           0 :             DO ispin = 1, nspins
     479           0 :                CALL fm_pool_release(mpools%mosub_mosub_fm_pools(ispin)%pool)
     480             :             END DO
     481             : 
     482           0 :             IF (nspins == 1 .OR. nmosub(1) == nmosub(2)) THEN
     483             :                CALL cp_fm_struct_create(fmstruct, nrow_global=nmosub(1), &
     484             :                                         ncol_global=nmosub(1), para_env=para_env, &
     485           0 :                                         context=blacs_env)
     486             :                CALL fm_pool_create(mpools%mosub_mosub_fm_pools(1)%pool, &
     487           0 :                                    fmstruct)
     488           0 :                CALL cp_fm_struct_release(fmstruct)
     489           0 :                DO ispin = 2, SIZE(mos)
     490           0 :                   mpools%mosub_mosub_fm_pools(ispin)%pool => mpools%mosub_mosub_fm_pools(1)%pool
     491           0 :                   CALL fm_pool_retain(mpools%mosub_mosub_fm_pools(1)%pool)
     492             :                END DO
     493             :             ELSE
     494           0 :                DO ispin = 1, SIZE(mos)
     495           0 :                   NULLIFY (mpools%mosub_mosub_fm_pools(ispin)%pool)
     496             :                   CALL cp_fm_struct_create(fmstruct, nrow_global=nmosub(ispin), &
     497             :                                            ncol_global=nmosub(ispin), para_env=para_env, &
     498           0 :                                            context=blacs_env)
     499             :                   CALL fm_pool_create(mpools%mosub_mosub_fm_pools(ispin)%pool, &
     500           0 :                                       fmstruct)
     501           0 :                   CALL cp_fm_struct_release(fmstruct)
     502             :                END DO
     503             :             END IF
     504             :          END IF ! should_rebuild
     505             :       END IF ! prepare_subset
     506             : 
     507        6506 :       CALL timestop(handle)
     508        6506 :    END SUBROUTINE mpools_rebuild_fm_pools
     509             : 
     510             : ! **************************************************************************************************
     511             : 
     512           0 : END MODULE qs_matrix_pools

Generated by: LCOV version 1.15