LCOV - code coverage report
Current view: top level - src - qs_loc_types.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:06f838d) Lines: 95.2 % 105 100
Test Date: 2026-06-05 07:04:50 Functions: 77.8 % 9 7

            Line data    Source code
       1              : !--------------------------------------------------------------------------------------------------!
       2              : !   CP2K: A general program to perform molecular dynamics simulations                              !
       3              : !   Copyright 2000-2026 CP2K developers group <https://cp2k.org>                                   !
       4              : !                                                                                                  !
       5              : !   SPDX-License-Identifier: GPL-2.0-or-later                                                      !
       6              : !--------------------------------------------------------------------------------------------------!
       7              : 
       8              : ! **************************************************************************************************
       9              : !> \brief New version of the module for the localization of the molecular orbitals
      10              : !>      This should be able to use different definition of the spread functional
      11              : !>      It should also calculate the integrals analytically so that it can be
      12              : !>      used irrespective of the pw_env and the collocation of wfn on the grids
      13              : !>      It should also work with a selected set of states, instead than all of them,
      14              : !>      in this case one should check that the selected states have the same occupation number
      15              : !>      The spread functional can be only estimated, or also optimized by minimization
      16              : !>      and in principle also maximization should be available.
      17              : !>      This operations can be required irrespective of the printing requirements
      18              : !>      It would be highly desirable to do all this along a MD run every N steps,
      19              : !>      and have a trajectory of the centeroids of the localized wfn
      20              : !>      In addition these functions can be used for properties calculations
      21              : !>      like NMR and XAS. Therefore it is necessary that the rotated wfn are then copied
      22              : !>      in the mos fm matrix to be available for next use.
      23              : !> \author MI (05-2005)
      24              : ! **************************************************************************************************
      25              : MODULE qs_loc_types
      26              : 
      27              :    USE cell_types,                      ONLY: cell_release,&
      28              :                                               cell_retain,&
      29              :                                               cell_type
      30              :    USE cp_array_utils,                  ONLY: cp_2d_r_p_type
      31              :    USE cp_dbcsr_api,                    ONLY: dbcsr_deallocate_matrix,&
      32              :                                               dbcsr_p_type
      33              :    USE cp_fm_types,                     ONLY: cp_fm_release,&
      34              :                                               cp_fm_type
      35              :    USE distribution_1d_types,           ONLY: distribution_1d_release,&
      36              :                                               distribution_1d_retain,&
      37              :                                               distribution_1d_type
      38              :    USE kinds,                           ONLY: default_string_length,&
      39              :                                               dp
      40              :    USE message_passing,                 ONLY: mp_para_env_release,&
      41              :                                               mp_para_env_type
      42              :    USE particle_types,                  ONLY: particle_type
      43              : #include "./base/base_uses.f90"
      44              : 
      45              :    IMPLICIT NONE
      46              : 
      47              :    PRIVATE
      48              : 
      49              : ! *** Global parameters ***
      50              : 
      51              :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_loc_types'
      52              : 
      53              : ! **************************************************************************************************
      54              : !> \brief contains all the info needed by quickstep to calculate
      55              : !>      the spread of a selected set of orbitals and if required
      56              : !>      to minimize or maximize the spread by rotation of the orbitals
      57              : !> \param para_env info for the distribution of the calculations
      58              : !> \param mo_coeff full matrix containing only the selected subset of real orbitals
      59              : !> \param complex_mo_coeff full matrix containing only the selected subset of complex orbitals
      60              : !> \param local_molecules molecules distributed
      61              : !> \param cell box that contains the system
      62              : !> \param localized_wfn_control variables and parameter that define the spread
      63              : !>                             functional and the optimization algorithm
      64              : !> \param particle_set position, type, ao_indexes etc for each atom
      65              : !> \param op_sm_set set of sparse matrices used to define the spread operator
      66              : !>                  when the functional is defined by the use operator acting on the
      67              : !>                  basis functions, e.g. the Berry phase definition
      68              : !>                  The matrix element of the type <a|O|b> are computed in initialization
      69              : !>                  of qs_loc_env
      70              : !> \param op_fm_set set of full matrices used to define the spread operator
      71              : !>                 when the functional has to be defined directly using the products of MOS
      72              : !>                 as in the case of the Pipek-Mezek definition.
      73              : !> \param weights for a spread defined as extension of the orbitral in the box, these
      74              : !>               factors renormalize with respect to the box size
      75              : !> \note
      76              : !>      this type should replace the previous set up for the localization of the wfn
      77              : !> \par History
      78              : !>      04-05 created
      79              : !> \author MI
      80              : ! **************************************************************************************************
      81              :    TYPE qs_loc_env_type
      82              :       LOGICAL                                     :: do_localize = .FALSE., first_time = .FALSE.
      83              :       LOGICAL                                     :: molecular_states = .FALSE.
      84              :       LOGICAL                                     :: wannier_states = .FALSE.
      85              :       CHARACTER(LEN=default_string_length)        :: tag_mo = ""
      86              :       TYPE(mp_para_env_type), POINTER             :: para_env => NULL()
      87              :       TYPE(cp_fm_type), DIMENSION(:), &
      88              :          POINTER                                  :: moloc_coeff => NULL()
      89              :       TYPE(cp_fm_type), DIMENSION(:, :), &
      90              :          POINTER                                  :: op_fm_set => NULL()
      91              :       TYPE(distribution_1d_type), POINTER         :: local_molecules => NULL()
      92              :       TYPE(cell_type), POINTER                    :: cell => NULL()
      93              :       TYPE(localized_wfn_control_type), &
      94              :          POINTER                                  :: localized_wfn_control => NULL()
      95              :       TYPE(particle_type), DIMENSION(:), &
      96              :          POINTER                                  :: particle_set => NULL()
      97              :       TYPE(dbcsr_p_type), DIMENSION(:, :), &
      98              :          POINTER                                  :: op_sm_set => NULL()
      99              :       REAL(KIND=dp)                               :: start_time = -1.0_dp, target_time = -1.0_dp
     100              :       REAL(KIND=dp)                               :: weights(6) = -1.0_dp
     101              :       INTEGER                                     :: dim_op = -1
     102              :    END TYPE qs_loc_env_type
     103              : 
     104              : ! **************************************************************************************************
     105              : !> \brief A type that holds controlling information for the
     106              : !>    calculation of the spread of wfn and the optimization of
     107              : !>    the spread functional
     108              : !> \param ref_count ...
     109              : !> \param localization_method which algorithm is used for the optimization
     110              : !> \param operator_type how the spread is defined
     111              : !> \param nloc_states number of states on which the spread is computed
     112              : !> \param set_of_states how to choose the states
     113              : !> \param lu_bound_states lower and upper bounds of the set of states
     114              : !>    print_cubes:
     115              : !>    print_centers:
     116              : !>    print_spreads:
     117              : !> \param loc_states list of states on which the spread is computed
     118              : !> \param centers_set arrais containing centers and spreads of the selected wfn
     119              : !> \param centers_file_name output file names
     120              : !> \param spreads_file_name output file names
     121              : ! **************************************************************************************************
     122              :    TYPE localized_wfn_control_type
     123              :       INTEGER                              :: ref_count = -1
     124              :       INTEGER                              :: min_or_max = -1
     125              :       INTEGER                              :: localization_method = -1
     126              :       INTEGER                              :: operator_type = -1
     127              :       INTEGER, DIMENSION(2)                :: nloc_states = -1, nguess = -1
     128              :       INTEGER                              :: set_of_states = -1
     129              :       INTEGER, DIMENSION(2, 2)             :: lu_bound_states = -1
     130              :       INTEGER                              :: max_iter = -1
     131              :       INTEGER                              :: out_each = -1
     132              :       INTEGER                              :: nextra = -1
     133              :       INTEGER                              :: coeff_po_guess = -1, coeff_po_guess_mo_space = -1
     134              :       REAL(KIND=dp)                        :: eps_localization = -1.0_dp
     135              :       REAL(KIND=dp)                        :: max_crazy_angle = -1.0_dp
     136              :       REAL(KIND=dp)                        :: crazy_scale = -1.0_dp
     137              :       REAL(KIND=dp)                        :: eps_occ = -1.0_dp
     138              :       REAL(KIND=dp), DIMENSION(2)          :: lu_ene_bound = -1.0_dp
     139              :       LOGICAL                              :: crazy_use_diag = .FALSE.
     140              :       LOGICAL                              :: print_cubes = .FALSE., jacobi_fallback = .FALSE., jacobi_refinement = .FALSE.
     141              :       LOGICAL                              :: print_centers = .FALSE.
     142              :       LOGICAL                              :: print_spreads = .FALSE.
     143              :       LOGICAL                              :: do_homo = .FALSE.
     144              :       LOGICAL                              :: do_mixed = .FALSE., do_cg_po = .FALSE.
     145              :       LOGICAL                              :: loc_restart = .FALSE.
     146              :       LOGICAL                              :: use_history = .FALSE.
     147              :       INTEGER, POINTER, DIMENSION(:, :)    :: loc_states => NULL()
     148              :       TYPE(cp_2d_r_p_type), DIMENSION(2)   :: centers_set = cp_2d_r_p_type()
     149              :    END TYPE localized_wfn_control_type
     150              : 
     151              : ! *** Public ***
     152              :    PUBLIC :: qs_loc_env_create, qs_loc_env_release, &
     153              :              get_qs_loc_env, set_qs_loc_env, &
     154              :              localized_wfn_control_create, localized_wfn_control_release
     155              :    PUBLIC :: qs_loc_env_type, localized_wfn_control_type
     156              : 
     157              : CONTAINS
     158              : 
     159              : ! **************************************************************************************************
     160              : !> \brief ...
     161              : !> \param qs_loc_env ...
     162              : !> \par History
     163              : !>      04-05 created
     164              : !> \author MI
     165              : ! **************************************************************************************************
     166         3724 :    SUBROUTINE qs_loc_env_create(qs_loc_env)
     167              : 
     168              :       TYPE(qs_loc_env_type), INTENT(OUT)                 :: qs_loc_env
     169              : 
     170          532 :       qs_loc_env%tag_mo = ""
     171              :       NULLIFY (qs_loc_env%para_env)
     172              :       NULLIFY (qs_loc_env%cell)
     173              :       NULLIFY (qs_loc_env%op_sm_set)
     174              :       NULLIFY (qs_loc_env%op_fm_set)
     175              :       NULLIFY (qs_loc_env%local_molecules)
     176              :       NULLIFY (qs_loc_env%moloc_coeff)
     177              :       NULLIFY (qs_loc_env%particle_set)
     178              :       NULLIFY (qs_loc_env%localized_wfn_control)
     179         3724 :       qs_loc_env%weights = 0.0_dp
     180              : 
     181          532 :    END SUBROUTINE qs_loc_env_create
     182              : 
     183              : !****f* qs_loc_types/qs_loc_env_release [1.0] *
     184              : 
     185              : ! **************************************************************************************************
     186              : !> \brief ...
     187              : !> \param qs_loc_env ...
     188              : !> \par History
     189              : !>      04-05 created
     190              : !> \author MI
     191              : ! **************************************************************************************************
     192          532 :    SUBROUTINE qs_loc_env_release(qs_loc_env)
     193              : 
     194              :       TYPE(qs_loc_env_type), INTENT(INOUT)               :: qs_loc_env
     195              : 
     196              :       INTEGER                                            :: i, ii, j
     197              : 
     198          532 :       IF (ASSOCIATED(qs_loc_env%cell)) CALL cell_release(qs_loc_env%cell)
     199          532 :       IF (ASSOCIATED(qs_loc_env%local_molecules)) &
     200          484 :          CALL distribution_1d_release(qs_loc_env%local_molecules)
     201          532 :       IF (ASSOCIATED(qs_loc_env%localized_wfn_control)) THEN
     202          532 :          CALL localized_wfn_control_release(qs_loc_env%localized_wfn_control)
     203              :       END IF
     204          532 :       IF (ASSOCIATED(qs_loc_env%para_env)) CALL mp_para_env_release(qs_loc_env%para_env)
     205          532 :       IF (ASSOCIATED(qs_loc_env%particle_set)) NULLIFY (qs_loc_env%particle_set)
     206              : 
     207          532 :       IF (ASSOCIATED(qs_loc_env%moloc_coeff)) THEN
     208         1146 :          DO i = 1, SIZE(qs_loc_env%moloc_coeff, 1)
     209          662 :             ii = LBOUND(qs_loc_env%moloc_coeff, 1) + i - 1
     210         1146 :             CALL cp_fm_release(qs_loc_env%moloc_coeff(ii))
     211              :          END DO
     212          484 :          DEALLOCATE (qs_loc_env%moloc_coeff)
     213              :       END IF
     214              : 
     215          532 :       CALL cp_fm_release(qs_loc_env%op_fm_set)
     216              : 
     217          532 :       IF (ASSOCIATED(qs_loc_env%op_sm_set)) THEN
     218         1948 :          DO i = 1, SIZE(qs_loc_env%op_sm_set, 2)
     219         4888 :             DO j = 1, SIZE(qs_loc_env%op_sm_set, 1)
     220         4410 :                CALL dbcsr_deallocate_matrix(qs_loc_env%op_sm_set(j, i)%matrix)
     221              :             END DO
     222              :          END DO
     223          478 :          DEALLOCATE (qs_loc_env%op_sm_set)
     224              :       END IF
     225              : 
     226          532 :    END SUBROUTINE qs_loc_env_release
     227              : 
     228              : ! **************************************************************************************************
     229              : !> \brief create the localized_wfn_control_type
     230              : !> \param localized_wfn_control ...
     231              : !> \par History
     232              : !>      04.2005 created [MI]
     233              : ! **************************************************************************************************
     234          532 :    SUBROUTINE localized_wfn_control_create(localized_wfn_control)
     235              :       TYPE(localized_wfn_control_type), POINTER          :: localized_wfn_control
     236              : 
     237          532 :       CPASSERT(.NOT. ASSOCIATED(localized_wfn_control))
     238        10640 :       ALLOCATE (localized_wfn_control)
     239              : 
     240          532 :       localized_wfn_control%ref_count = 1
     241         1596 :       localized_wfn_control%nloc_states = 0
     242          532 :       localized_wfn_control%nextra = 0
     243         1596 :       localized_wfn_control%nguess = 0
     244         3724 :       localized_wfn_control%lu_bound_states = 0
     245         1596 :       localized_wfn_control%lu_ene_bound = 0.0_dp
     246          532 :       localized_wfn_control%print_cubes = .FALSE.
     247          532 :       localized_wfn_control%print_centers = .FALSE.
     248          532 :       localized_wfn_control%print_spreads = .FALSE.
     249          532 :       localized_wfn_control%do_homo = .TRUE.
     250          532 :       localized_wfn_control%use_history = .FALSE.
     251          532 :       NULLIFY (localized_wfn_control%loc_states)
     252          532 :       NULLIFY (localized_wfn_control%centers_set(1)%array)
     253          532 :       NULLIFY (localized_wfn_control%centers_set(2)%array)
     254          532 :    END SUBROUTINE localized_wfn_control_create
     255              : 
     256              : ! **************************************************************************************************
     257              : !> \brief release the localized_wfn_control_type
     258              : !> \param localized_wfn_control ...
     259              : !> \par History
     260              : !>      04.2005 created [MI]
     261              : ! **************************************************************************************************
     262         1880 :    SUBROUTINE localized_wfn_control_release(localized_wfn_control)
     263              : 
     264              :       TYPE(localized_wfn_control_type), POINTER          :: localized_wfn_control
     265              : 
     266         1880 :       IF (ASSOCIATED(localized_wfn_control)) THEN
     267         1448 :          CPASSERT(localized_wfn_control%ref_count > 0)
     268         1448 :          localized_wfn_control%ref_count = localized_wfn_control%ref_count - 1
     269         1448 :          IF (localized_wfn_control%ref_count == 0) THEN
     270          532 :             IF (ASSOCIATED(localized_wfn_control%loc_states)) THEN
     271          450 :                DEALLOCATE (localized_wfn_control%loc_states)
     272              :             END IF
     273          532 :             IF (ASSOCIATED(localized_wfn_control%centers_set(1)%array)) THEN
     274          484 :                DEALLOCATE (localized_wfn_control%centers_set(1)%array)
     275              :             END IF
     276          532 :             IF (ASSOCIATED(localized_wfn_control%centers_set(2)%array)) THEN
     277          176 :                DEALLOCATE (localized_wfn_control%centers_set(2)%array)
     278              :             END IF
     279          532 :             localized_wfn_control%ref_count = 0
     280          532 :             DEALLOCATE (localized_wfn_control)
     281              :          END IF
     282              :       END IF
     283         1880 :    END SUBROUTINE localized_wfn_control_release
     284              : 
     285              : ! **************************************************************************************************
     286              : !> \brief retain the localized_wfn_control_type
     287              : !> \param localized_wfn_control ...
     288              : !> \par History
     289              : !>      04.2005 created [MI]
     290              : ! **************************************************************************************************
     291          916 :    SUBROUTINE localized_wfn_control_retain(localized_wfn_control)
     292              :       TYPE(localized_wfn_control_type), POINTER          :: localized_wfn_control
     293              : 
     294          916 :       CPASSERT(ASSOCIATED(localized_wfn_control))
     295              : 
     296          916 :       localized_wfn_control%ref_count = localized_wfn_control%ref_count + 1
     297          916 :    END SUBROUTINE localized_wfn_control_retain
     298              : 
     299              : ! **************************************************************************************************
     300              : !> \brief ...
     301              : !> \param qs_loc_env ...
     302              : !> \param cell ...
     303              : !> \param local_molecules ...
     304              : !> \param localized_wfn_control ...
     305              : !> \param moloc_coeff ...
     306              : !> \param op_sm_set ...
     307              : !> \param op_fm_set ...
     308              : !> \param para_env ...
     309              : !> \param particle_set ...
     310              : !> \param weights ...
     311              : !> \param dim_op ...
     312              : !> \par History
     313              : !>      04-05 created
     314              : !> \author MI
     315              : ! **************************************************************************************************
     316         2200 :    SUBROUTINE get_qs_loc_env(qs_loc_env, cell, local_molecules, localized_wfn_control, &
     317              :                              moloc_coeff, op_sm_set, op_fm_set, para_env, &
     318              :                              particle_set, weights, dim_op)
     319              : 
     320              :       TYPE(qs_loc_env_type), INTENT(IN)                  :: qs_loc_env
     321              :       TYPE(cell_type), OPTIONAL, POINTER                 :: cell
     322              :       TYPE(distribution_1d_type), OPTIONAL, POINTER      :: local_molecules
     323              :       TYPE(localized_wfn_control_type), OPTIONAL, &
     324              :          POINTER                                         :: localized_wfn_control
     325              :       TYPE(cp_fm_type), DIMENSION(:), OPTIONAL, POINTER  :: moloc_coeff
     326              :       TYPE(dbcsr_p_type), DIMENSION(:, :), OPTIONAL, &
     327              :          POINTER                                         :: op_sm_set
     328              :       TYPE(cp_fm_type), DIMENSION(:, :), OPTIONAL, &
     329              :          POINTER                                         :: op_fm_set
     330              :       TYPE(mp_para_env_type), OPTIONAL, POINTER          :: para_env
     331              :       TYPE(particle_type), DIMENSION(:), OPTIONAL, &
     332              :          POINTER                                         :: particle_set
     333              :       REAL(dp), DIMENSION(6), OPTIONAL                   :: weights
     334              :       INTEGER, OPTIONAL                                  :: dim_op
     335              : 
     336         2200 :       IF (PRESENT(cell)) cell => qs_loc_env%cell
     337         2200 :       IF (PRESENT(moloc_coeff)) moloc_coeff => qs_loc_env%moloc_coeff
     338         2200 :       IF (PRESENT(local_molecules)) local_molecules => qs_loc_env%local_molecules
     339         2200 :       IF (PRESENT(localized_wfn_control)) &
     340         1622 :          localized_wfn_control => qs_loc_env%localized_wfn_control
     341         2200 :       IF (PRESENT(op_sm_set)) op_sm_set => qs_loc_env%op_sm_set
     342         2200 :       IF (PRESENT(op_fm_set)) op_fm_set => qs_loc_env%op_fm_set
     343         2200 :       IF (PRESENT(para_env)) para_env => qs_loc_env%para_env
     344         2200 :       IF (PRESENT(particle_set)) particle_set => qs_loc_env%particle_set
     345         6456 :       IF (PRESENT(weights)) weights(1:6) = qs_loc_env%weights(1:6)
     346         2200 :       IF (PRESENT(dim_op)) dim_op = qs_loc_env%dim_op
     347              : 
     348         2200 :    END SUBROUTINE get_qs_loc_env
     349              : 
     350              : ! **************************************************************************************************
     351              : !> \brief ...
     352              : !> \param qs_loc_env ...
     353              : !> \param cell ...
     354              : !> \param local_molecules ...
     355              : !> \param localized_wfn_control ...
     356              : !> \param moloc_coeff ...
     357              : !> \param op_sm_set ...
     358              : !> \param op_fm_set ...
     359              : !> \param para_env ...
     360              : !> \param particle_set ...
     361              : !> \param weights ...
     362              : !> \param dim_op ...
     363              : !> \par History
     364              : !>      04-05 created
     365              : !> \author MI
     366              : ! **************************************************************************************************
     367         1400 :    SUBROUTINE set_qs_loc_env(qs_loc_env, cell, local_molecules, localized_wfn_control, &
     368              :                              moloc_coeff, op_sm_set, op_fm_set, para_env, &
     369              :                              particle_set, weights, dim_op)
     370              : 
     371              :       TYPE(qs_loc_env_type), INTENT(INOUT)               :: qs_loc_env
     372              :       TYPE(cell_type), OPTIONAL, POINTER                 :: cell
     373              :       TYPE(distribution_1d_type), OPTIONAL, POINTER      :: local_molecules
     374              :       TYPE(localized_wfn_control_type), OPTIONAL, &
     375              :          POINTER                                         :: localized_wfn_control
     376              :       TYPE(cp_fm_type), DIMENSION(:), OPTIONAL, POINTER  :: moloc_coeff
     377              :       TYPE(dbcsr_p_type), DIMENSION(:, :), OPTIONAL, &
     378              :          POINTER                                         :: op_sm_set
     379              :       TYPE(cp_fm_type), DIMENSION(:, :), OPTIONAL, &
     380              :          POINTER                                         :: op_fm_set
     381              :       TYPE(mp_para_env_type), OPTIONAL, POINTER          :: para_env
     382              :       TYPE(particle_type), DIMENSION(:), OPTIONAL, &
     383              :          POINTER                                         :: particle_set
     384              :       REAL(dp), DIMENSION(6), OPTIONAL                   :: weights
     385              :       INTEGER, OPTIONAL                                  :: dim_op
     386              : 
     387         1400 :       IF (PRESENT(cell)) THEN
     388          484 :          CALL cell_retain(cell)
     389          484 :          CALL cell_release(qs_loc_env%cell)
     390          484 :          qs_loc_env%cell => cell
     391              :       END IF
     392              : 
     393         1400 :       IF (PRESENT(local_molecules)) THEN
     394          484 :          CALL distribution_1d_retain(local_molecules)
     395          484 :          IF (ASSOCIATED(qs_loc_env%local_molecules)) &
     396            0 :             CALL distribution_1d_release(qs_loc_env%local_molecules)
     397          484 :          qs_loc_env%local_molecules => local_molecules
     398              :       END IF
     399              : 
     400         1400 :       IF (PRESENT(localized_wfn_control)) THEN
     401          916 :          CALL localized_wfn_control_retain(localized_wfn_control)
     402          916 :          CALL localized_wfn_control_release(qs_loc_env%localized_wfn_control)
     403          916 :          qs_loc_env%localized_wfn_control => localized_wfn_control
     404              :       END IF
     405         1400 :       IF (PRESENT(para_env)) THEN
     406          484 :          CALL para_env%retain()
     407          484 :          CALL mp_para_env_release(qs_loc_env%para_env)
     408          484 :          qs_loc_env%para_env => para_env
     409              :       END IF
     410         1400 :       IF (PRESENT(particle_set)) qs_loc_env%particle_set => particle_set
     411         1400 :       IF (PRESENT(moloc_coeff)) THEN
     412          484 :          CALL cp_fm_release(qs_loc_env%moloc_coeff)
     413          484 :          qs_loc_env%moloc_coeff => moloc_coeff
     414              :       END IF
     415         1400 :       IF (PRESENT(op_sm_set)) THEN
     416            0 :          qs_loc_env%op_sm_set => op_sm_set
     417              :       END IF
     418         1400 :       IF (PRESENT(op_fm_set)) THEN
     419            0 :          qs_loc_env%op_fm_set => op_fm_set
     420              :       END IF
     421         1400 :       IF (PRESENT(weights)) THEN
     422            0 :          qs_loc_env%weights = weights
     423              :       END IF
     424         1400 :       IF (PRESENT(dim_op)) THEN
     425          484 :          qs_loc_env%dim_op = dim_op
     426              :       END IF
     427              : 
     428         1400 :    END SUBROUTINE set_qs_loc_env
     429              : 
     430            0 : END MODULE qs_loc_types
     431              : 
        

Generated by: LCOV version 2.0-1