LCOV - code coverage report
Current view: top level - src/subsys - virial_types.F (source / functions) Hit Total Coverage
Test: CP2K Regtests (git:d1f8d1b) Lines: 91 96 94.8 %
Date: 2024-11-29 06:42:44 Functions: 3 5 60.0 %

          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             : !> \par History
      10             : !>      - Refactoring (4.4.2007, JGH)
      11             : !>      - Revise virial components (16.10.2020, MK)
      12             : ! **************************************************************************************************
      13             : MODULE virial_types
      14             : 
      15             :    USE kinds,                           ONLY: dp
      16             : #include "../base/base_uses.f90"
      17             : 
      18             :    IMPLICIT NONE
      19             : 
      20             :    PRIVATE
      21             : 
      22             :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'virial_types'
      23             : 
      24             :    PUBLIC :: virial_type, virial_p_type
      25             : 
      26             :    TYPE virial_type
      27             :       REAL(KIND=dp), DIMENSION(3, 3) :: pv_total = 0.0_dp, &
      28             :                                         pv_kinetic = 0.0_dp, &
      29             :                                         pv_virial = 0.0_dp, &
      30             :                                         pv_xc = 0.0_dp, &
      31             :                                         pv_fock_4c = 0.0_dp, &
      32             :                                         pv_constraint = 0.0_dp
      33             :       REAL(KIND=dp), DIMENSION(3, 3) :: pv_overlap = 0.0_dp, &
      34             :                                         pv_ekinetic = 0.0_dp, &
      35             :                                         pv_ppl = 0.0_dp, &
      36             :                                         pv_ppnl = 0.0_dp, &
      37             :                                         pv_ecore_overlap = 0.0_dp, &
      38             :                                         pv_ehartree = 0.0_dp, &
      39             :                                         pv_exc = 0.0_dp, &
      40             :                                         pv_exx = 0.0_dp, &
      41             :                                         pv_vdw = 0.0_dp, &
      42             :                                         pv_mp2 = 0.0_dp, &
      43             :                                         pv_nlcc = 0.0_dp, &
      44             :                                         pv_gapw = 0.0_dp, &
      45             :                                         pv_lrigpw = 0.0_dp
      46             :       LOGICAL                        :: pv_availability = .FALSE., &
      47             :                                         pv_calculate = .FALSE., &
      48             :                                         pv_numer = .FALSE., &
      49             :                                         pv_diagonal = .FALSE.
      50             :    END TYPE virial_type
      51             : 
      52             :    TYPE virial_p_type
      53             :       TYPE(virial_type), POINTER     :: virial => NULL()
      54             :    END TYPE virial_p_type
      55             : 
      56             :    PUBLIC :: virial_set, &
      57             :              symmetrize_virial, zero_virial
      58             : 
      59             : CONTAINS
      60             : 
      61             : ! **************************************************************************************************
      62             : !> \brief   Symmetrize the virial components
      63             : !> \param virial ...
      64             : !> \version 1.0
      65             : ! **************************************************************************************************
      66       18130 :    SUBROUTINE symmetrize_virial(virial)
      67             :       TYPE(virial_type), INTENT(INOUT)                   :: virial
      68             : 
      69             :       INTEGER                                            :: i, j
      70             : 
      71       72520 :       DO i = 1, 3
      72      126910 :          DO j = 1, i - 1
      73       54390 :             virial%pv_total(j, i) = 0.5_dp*(virial%pv_total(i, j) + virial%pv_total(j, i))
      74       54390 :             virial%pv_total(i, j) = virial%pv_total(j, i)
      75       54390 :             virial%pv_kinetic(j, i) = 0.5_dp*(virial%pv_kinetic(i, j) + virial%pv_kinetic(j, i))
      76       54390 :             virial%pv_kinetic(i, j) = virial%pv_kinetic(j, i)
      77       54390 :             virial%pv_virial(j, i) = 0.5_dp*(virial%pv_virial(i, j) + virial%pv_virial(j, i))
      78       54390 :             virial%pv_virial(i, j) = virial%pv_virial(j, i)
      79       54390 :             virial%pv_xc(j, i) = 0.5_dp*(virial%pv_xc(i, j) + virial%pv_xc(j, i))
      80       54390 :             virial%pv_xc(i, j) = virial%pv_xc(j, i)
      81       54390 :             virial%pv_fock_4c(j, i) = 0.5_dp*(virial%pv_fock_4c(i, j) + virial%pv_fock_4c(j, i))
      82       54390 :             virial%pv_fock_4c(i, j) = virial%pv_fock_4c(j, i)
      83       54390 :             virial%pv_constraint(j, i) = 0.5_dp*(virial%pv_constraint(i, j) + virial%pv_constraint(j, i))
      84       54390 :             virial%pv_constraint(i, j) = virial%pv_constraint(j, i)
      85             :             ! Virial components
      86       54390 :             virial%pv_overlap(j, i) = 0.5_dp*(virial%pv_overlap(i, j) + virial%pv_overlap(j, i))
      87       54390 :             virial%pv_overlap(i, j) = virial%pv_overlap(j, i)
      88       54390 :             virial%pv_ekinetic(j, i) = 0.5_dp*(virial%pv_ekinetic(i, j) + virial%pv_ekinetic(j, i))
      89       54390 :             virial%pv_ekinetic(i, j) = virial%pv_ekinetic(j, i)
      90       54390 :             virial%pv_ppl(j, i) = 0.5_dp*(virial%pv_ppl(i, j) + virial%pv_ppl(j, i))
      91       54390 :             virial%pv_ppl(i, j) = virial%pv_ppl(j, i)
      92       54390 :             virial%pv_ppnl(j, i) = 0.5_dp*(virial%pv_ppnl(i, j) + virial%pv_ppnl(j, i))
      93       54390 :             virial%pv_ppnl(i, j) = virial%pv_ppnl(j, i)
      94       54390 :             virial%pv_ecore_overlap(j, i) = 0.5_dp*(virial%pv_ecore_overlap(i, j) + virial%pv_ecore_overlap(j, i))
      95       54390 :             virial%pv_ecore_overlap(i, j) = virial%pv_ecore_overlap(j, i)
      96       54390 :             virial%pv_ehartree(j, i) = 0.5_dp*(virial%pv_ehartree(i, j) + virial%pv_ehartree(j, i))
      97       54390 :             virial%pv_ehartree(i, j) = virial%pv_ehartree(j, i)
      98       54390 :             virial%pv_exc(j, i) = 0.5_dp*(virial%pv_exc(i, j) + virial%pv_exc(j, i))
      99       54390 :             virial%pv_exc(i, j) = virial%pv_exc(j, i)
     100       54390 :             virial%pv_exx(j, i) = 0.5_dp*(virial%pv_exx(i, j) + virial%pv_exx(j, i))
     101       54390 :             virial%pv_exx(i, j) = virial%pv_exx(j, i)
     102       54390 :             virial%pv_vdw(j, i) = 0.5_dp*(virial%pv_vdw(i, j) + virial%pv_vdw(j, i))
     103       54390 :             virial%pv_vdw(i, j) = virial%pv_vdw(j, i)
     104       54390 :             virial%pv_mp2(j, i) = 0.5_dp*(virial%pv_mp2(i, j) + virial%pv_mp2(j, i))
     105       54390 :             virial%pv_mp2(i, j) = virial%pv_mp2(j, i)
     106       54390 :             virial%pv_nlcc(j, i) = 0.5_dp*(virial%pv_nlcc(i, j) + virial%pv_nlcc(j, i))
     107       54390 :             virial%pv_nlcc(i, j) = virial%pv_nlcc(j, i)
     108       54390 :             virial%pv_gapw(j, i) = 0.5_dp*(virial%pv_gapw(i, j) + virial%pv_gapw(j, i))
     109       54390 :             virial%pv_gapw(i, j) = virial%pv_gapw(j, i)
     110       54390 :             virial%pv_lrigpw(j, i) = 0.5_dp*(virial%pv_lrigpw(i, j) + virial%pv_lrigpw(j, i))
     111      108780 :             virial%pv_lrigpw(i, j) = virial%pv_lrigpw(j, i)
     112             :          END DO
     113             :       END DO
     114             : 
     115       18130 :    END SUBROUTINE symmetrize_virial
     116             : 
     117             : ! **************************************************************************************************
     118             : !> \brief ...
     119             : !> \param virial ...
     120             : !> \param reset ...
     121             : ! **************************************************************************************************
     122       23654 :    SUBROUTINE zero_virial(virial, reset)
     123             :       TYPE(virial_type), INTENT(INOUT)                   :: virial
     124             :       LOGICAL, INTENT(IN), OPTIONAL                      :: reset
     125             : 
     126             :       LOGICAL                                            :: my_reset
     127             : 
     128       23654 :       my_reset = .TRUE.
     129       23654 :       IF (PRESENT(reset)) my_reset = reset
     130             : 
     131      307502 :       virial%pv_total = 0.0_dp
     132      307502 :       virial%pv_kinetic = 0.0_dp
     133      307502 :       virial%pv_virial = 0.0_dp
     134      307502 :       virial%pv_xc = 0.0_dp
     135      307502 :       virial%pv_fock_4c = 0.0_dp
     136      307502 :       virial%pv_constraint = 0.0_dp
     137             : 
     138      307502 :       virial%pv_overlap = 0.0_dp
     139      307502 :       virial%pv_ekinetic = 0.0_dp
     140      307502 :       virial%pv_ppl = 0.0_dp
     141      307502 :       virial%pv_ppnl = 0.0_dp
     142      307502 :       virial%pv_ecore_overlap = 0.0_dp
     143      307502 :       virial%pv_ehartree = 0.0_dp
     144      307502 :       virial%pv_exc = 0.0_dp
     145      307502 :       virial%pv_exx = 0.0_dp
     146      307502 :       virial%pv_vdw = 0.0_dp
     147      307502 :       virial%pv_mp2 = 0.0_dp
     148      307502 :       virial%pv_nlcc = 0.0_dp
     149      307502 :       virial%pv_gapw = 0.0_dp
     150      307502 :       virial%pv_lrigpw = 0.0_dp
     151             : 
     152       23654 :       IF (my_reset) THEN
     153           0 :          virial%pv_availability = .FALSE.
     154           0 :          virial%pv_calculate = .FALSE.
     155           0 :          virial%pv_numer = .FALSE.
     156           0 :          virial%pv_diagonal = .FALSE.
     157             :       END IF
     158             : 
     159       23654 :    END SUBROUTINE zero_virial
     160             : 
     161             : ! **************************************************************************************************
     162             : !> \brief ...
     163             : !> \param virial ...
     164             : !> \param pv_total ...
     165             : !> \param pv_kinetic ...
     166             : !> \param pv_virial ...
     167             : !> \param pv_xc ...
     168             : !> \param pv_fock_4c ...
     169             : !> \param pv_constraint ...
     170             : !> \param pv_overlap ...
     171             : !> \param pv_ekinetic ...
     172             : !> \param pv_ppl ...
     173             : !> \param pv_ppnl ...
     174             : !> \param pv_ecore_overlap ...
     175             : !> \param pv_ehartree ...
     176             : !> \param pv_exc ...
     177             : !> \param pv_exx ...
     178             : !> \param pv_vdw ...
     179             : !> \param pv_mp2 ...
     180             : !> \param pv_nlcc ...
     181             : !> \param pv_gapw ...
     182             : !> \param pv_lrigpw ...
     183             : !> \param pv_availability ...
     184             : !> \param pv_calculate ...
     185             : !> \param pv_numer ...
     186             : !> \param pv_diagonal ...
     187             : ! **************************************************************************************************
     188        9093 :    SUBROUTINE virial_set(virial, pv_total, pv_kinetic, pv_virial, pv_xc, pv_fock_4c, pv_constraint, &
     189             :                          pv_overlap, pv_ekinetic, pv_ppl, pv_ppnl, pv_ecore_overlap, pv_ehartree, &
     190             :                          pv_exc, pv_exx, pv_vdw, pv_mp2, pv_nlcc, pv_gapw, pv_lrigpw, &
     191             :                          pv_availability, pv_calculate, pv_numer, pv_diagonal)
     192             : 
     193             :       TYPE(virial_type), INTENT(INOUT)                   :: virial
     194             :       REAL(KIND=dp), DIMENSION(3, 3), OPTIONAL :: pv_total, pv_kinetic, pv_virial, pv_xc, &
     195             :          pv_fock_4c, pv_constraint, pv_overlap, pv_ekinetic, pv_ppl, pv_ppnl, pv_ecore_overlap, &
     196             :          pv_ehartree, pv_exc, pv_exx, pv_vdw, pv_mp2, pv_nlcc, pv_gapw, pv_lrigpw
     197             :       LOGICAL, OPTIONAL                                  :: pv_availability, pv_calculate, pv_numer, &
     198             :                                                             pv_diagonal
     199             : 
     200        9093 :       IF (PRESENT(pv_total)) virial%pv_total = pv_total
     201        9093 :       IF (PRESENT(pv_kinetic)) virial%pv_kinetic = pv_kinetic
     202        9093 :       IF (PRESENT(pv_virial)) virial%pv_virial = pv_virial
     203        9093 :       IF (PRESENT(pv_xc)) virial%pv_xc = pv_xc
     204        9093 :       IF (PRESENT(pv_fock_4c)) virial%pv_fock_4c = pv_fock_4c
     205        9093 :       IF (PRESENT(pv_constraint)) virial%pv_constraint = pv_constraint
     206             : 
     207        9093 :       IF (PRESENT(pv_overlap)) virial%pv_overlap = pv_overlap
     208        9093 :       IF (PRESENT(pv_ekinetic)) virial%pv_ekinetic = pv_ekinetic
     209        9093 :       IF (PRESENT(pv_ppl)) virial%pv_ppl = pv_ppl
     210        9093 :       IF (PRESENT(pv_ppnl)) virial%pv_ppnl = pv_ppnl
     211        9093 :       IF (PRESENT(pv_ecore_overlap)) virial%pv_ecore_overlap = pv_ecore_overlap
     212        9093 :       IF (PRESENT(pv_ehartree)) virial%pv_ehartree = pv_ehartree
     213        9093 :       IF (PRESENT(pv_exc)) virial%pv_exc = pv_exc
     214        9093 :       IF (PRESENT(pv_exx)) virial%pv_exx = pv_exx
     215        9093 :       IF (PRESENT(pv_vdw)) virial%pv_vdw = pv_vdw
     216        9093 :       IF (PRESENT(pv_mp2)) virial%pv_mp2 = pv_mp2
     217        9093 :       IF (PRESENT(pv_nlcc)) virial%pv_nlcc = pv_nlcc
     218        9093 :       IF (PRESENT(pv_gapw)) virial%pv_gapw = pv_gapw
     219        9093 :       IF (PRESENT(pv_lrigpw)) virial%pv_lrigpw = pv_lrigpw
     220             : 
     221        9093 :       IF (PRESENT(pv_availability)) virial%pv_availability = pv_availability
     222        9093 :       IF (PRESENT(pv_calculate)) virial%pv_calculate = pv_calculate
     223        9093 :       IF (PRESENT(pv_numer)) virial%pv_numer = pv_numer
     224        9093 :       IF (PRESENT(pv_diagonal)) virial%pv_diagonal = pv_diagonal
     225             : 
     226        9093 :    END SUBROUTINE virial_set
     227             : 
     228           0 : END MODULE virial_types

Generated by: LCOV version 1.15