LCOV - code coverage report
Current view: top level - src - qs_force_types.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:21ef868) Lines: 76.1 % 264 201
Test Date: 2026-08-14 07:04:57 Functions: 63.6 % 11 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              : !> \par History
      10              : !>      Add CP2K error reporting, new add_force routine [07.2014,JGH]
      11              : !> \author MK (03.06.2002)
      12              : ! **************************************************************************************************
      13              : MODULE qs_force_types
      14              : 
      15              :    USE atomic_kind_types,               ONLY: atomic_kind_type,&
      16              :                                               get_atomic_kind
      17              :    USE cp_log_handling,                 ONLY: cp_get_default_logger,&
      18              :                                               cp_logger_get_default_io_unit,&
      19              :                                               cp_logger_type
      20              :    USE kinds,                           ONLY: dp
      21              :    USE message_passing,                 ONLY: mp_para_env_type
      22              : #include "./base/base_uses.f90"
      23              : 
      24              :    IMPLICIT NONE
      25              :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_force_types'
      26              :    PRIVATE
      27              : 
      28              :    TYPE qs_force_type
      29              :       REAL(KIND=dp), DIMENSION(:, :), POINTER :: all_potential => NULL(), &
      30              :                                                  cneo_potential => NULL(), &
      31              :                                                  core_overlap => NULL(), &
      32              :                                                  gth_ppl => NULL(), &
      33              :                                                  gth_nlcc => NULL(), &
      34              :                                                  gth_ppnl => NULL(), &
      35              :                                                  kinetic => NULL(), &
      36              :                                                  overlap => NULL(), &
      37              :                                                  overlap_admm => NULL(), &
      38              :                                                  rho_core => NULL(), &
      39              :                                                  rho_elec => NULL(), &
      40              :                                                  rho_lri_elec => NULL(), &
      41              :                                                  rho_cneo_nuc => NULL(), &
      42              :                                                  vhxc_atom => NULL(), &
      43              :                                                  g0s_Vh_elec => NULL(), &
      44              :                                                  repulsive => NULL(), &
      45              :                                                  dispersion => NULL(), &
      46              :                                                  gcp => NULL(), &
      47              :                                                  other => NULL(), &
      48              :                                                  ch_pulay => NULL(), &
      49              :                                                  fock_4c => NULL(), &
      50              :                                                  ehrenfest => NULL(), &
      51              :                                                  efield => NULL(), &
      52              :                                                  eev => NULL(), &
      53              :                                                  mp2_non_sep => NULL(), &
      54              :                                                  tensorial_u => NULL(), &
      55              :                                                  total => NULL()
      56              :    END TYPE qs_force_type
      57              : 
      58              :    PUBLIC :: qs_force_type
      59              : 
      60              :    PUBLIC :: allocate_qs_force, &
      61              :              add_qs_force, &
      62              :              deallocate_qs_force, &
      63              :              replicate_qs_force, &
      64              :              sum_qs_force, &
      65              :              get_qs_force, &
      66              :              put_qs_force, &
      67              :              total_qs_force, &
      68              :              zero_qs_force, &
      69              :              write_forces_debug
      70              : 
      71              : CONTAINS
      72              : 
      73              : ! **************************************************************************************************
      74              : !> \brief   Allocate a Quickstep force data structure.
      75              : !> \param qs_force ...
      76              : !> \param natom_of_kind ...
      77              : !> \date    05.06.2002
      78              : !> \author  MK
      79              : !> \version 1.0
      80              : ! **************************************************************************************************
      81         5159 :    SUBROUTINE allocate_qs_force(qs_force, natom_of_kind)
      82              : 
      83              :       TYPE(qs_force_type), DIMENSION(:), POINTER         :: qs_force
      84              :       INTEGER, DIMENSION(:), INTENT(IN)                  :: natom_of_kind
      85              : 
      86              :       INTEGER                                            :: ikind, n, nkind
      87              : 
      88         5159 :       IF (ASSOCIATED(qs_force)) CALL deallocate_qs_force(qs_force)
      89              : 
      90         5159 :       nkind = SIZE(natom_of_kind)
      91              : 
      92        25399 :       ALLOCATE (qs_force(nkind))
      93              : 
      94        15081 :       DO ikind = 1, nkind
      95         9922 :          n = natom_of_kind(ikind)
      96        29766 :          ALLOCATE (qs_force(ikind)%all_potential(3, n))
      97        19844 :          ALLOCATE (qs_force(ikind)%cneo_potential(3, n))
      98        19844 :          ALLOCATE (qs_force(ikind)%core_overlap(3, n))
      99        19844 :          ALLOCATE (qs_force(ikind)%gth_ppl(3, n))
     100        19844 :          ALLOCATE (qs_force(ikind)%gth_nlcc(3, n))
     101        19844 :          ALLOCATE (qs_force(ikind)%gth_ppnl(3, n))
     102        19844 :          ALLOCATE (qs_force(ikind)%kinetic(3, n))
     103        19844 :          ALLOCATE (qs_force(ikind)%overlap(3, n))
     104        19844 :          ALLOCATE (qs_force(ikind)%overlap_admm(3, n))
     105        19844 :          ALLOCATE (qs_force(ikind)%rho_core(3, n))
     106        19844 :          ALLOCATE (qs_force(ikind)%rho_elec(3, n))
     107        19844 :          ALLOCATE (qs_force(ikind)%rho_lri_elec(3, n))
     108        19844 :          ALLOCATE (qs_force(ikind)%rho_cneo_nuc(3, n))
     109        19844 :          ALLOCATE (qs_force(ikind)%vhxc_atom(3, n))
     110        19844 :          ALLOCATE (qs_force(ikind)%g0s_Vh_elec(3, n))
     111        19844 :          ALLOCATE (qs_force(ikind)%repulsive(3, n))
     112        19844 :          ALLOCATE (qs_force(ikind)%dispersion(3, n))
     113        19844 :          ALLOCATE (qs_force(ikind)%gcp(3, n))
     114        19844 :          ALLOCATE (qs_force(ikind)%other(3, n))
     115        19844 :          ALLOCATE (qs_force(ikind)%ch_pulay(3, n))
     116        19844 :          ALLOCATE (qs_force(ikind)%ehrenfest(3, n))
     117        19844 :          ALLOCATE (qs_force(ikind)%efield(3, n))
     118        19844 :          ALLOCATE (qs_force(ikind)%eev(3, n))
     119              :          ! Always initialize ch_pulay to zero..
     120       114502 :          qs_force(ikind)%ch_pulay = 0.0_dp
     121        19844 :          ALLOCATE (qs_force(ikind)%fock_4c(3, n))
     122        19844 :          ALLOCATE (qs_force(ikind)%mp2_non_sep(3, n))
     123        19844 :          ALLOCATE (qs_force(ikind)%tensorial_u(3, n))
     124        25003 :          ALLOCATE (qs_force(ikind)%total(3, n))
     125              :       END DO
     126              : 
     127         5159 :    END SUBROUTINE allocate_qs_force
     128              : 
     129              : ! **************************************************************************************************
     130              : !> \brief   Deallocate a Quickstep force data structure.
     131              : !> \param qs_force ...
     132              : !> \date    05.06.2002
     133              : !> \author  MK
     134              : !> \version 1.0
     135              : ! **************************************************************************************************
     136         5159 :    SUBROUTINE deallocate_qs_force(qs_force)
     137              : 
     138              :       TYPE(qs_force_type), DIMENSION(:), POINTER         :: qs_force
     139              : 
     140              :       INTEGER                                            :: ikind, nkind
     141              : 
     142         5159 :       CPASSERT(ASSOCIATED(qs_force))
     143              : 
     144         5159 :       nkind = SIZE(qs_force)
     145              : 
     146        15081 :       DO ikind = 1, nkind
     147              : 
     148         9922 :          IF (ASSOCIATED(qs_force(ikind)%all_potential)) THEN
     149         9922 :             DEALLOCATE (qs_force(ikind)%all_potential)
     150              :          END IF
     151              : 
     152         9922 :          IF (ASSOCIATED(qs_force(ikind)%cneo_potential)) THEN
     153         9922 :             DEALLOCATE (qs_force(ikind)%cneo_potential)
     154              :          END IF
     155              : 
     156         9922 :          IF (ASSOCIATED(qs_force(ikind)%core_overlap)) THEN
     157         9922 :             DEALLOCATE (qs_force(ikind)%core_overlap)
     158              :          END IF
     159              : 
     160         9922 :          IF (ASSOCIATED(qs_force(ikind)%gth_ppl)) THEN
     161         9922 :             DEALLOCATE (qs_force(ikind)%gth_ppl)
     162              :          END IF
     163              : 
     164         9922 :          IF (ASSOCIATED(qs_force(ikind)%gth_nlcc)) THEN
     165         9922 :             DEALLOCATE (qs_force(ikind)%gth_nlcc)
     166              :          END IF
     167              : 
     168         9922 :          IF (ASSOCIATED(qs_force(ikind)%gth_ppnl)) THEN
     169         9922 :             DEALLOCATE (qs_force(ikind)%gth_ppnl)
     170              :          END IF
     171              : 
     172         9922 :          IF (ASSOCIATED(qs_force(ikind)%kinetic)) THEN
     173         9922 :             DEALLOCATE (qs_force(ikind)%kinetic)
     174              :          END IF
     175              : 
     176         9922 :          IF (ASSOCIATED(qs_force(ikind)%overlap)) THEN
     177         9922 :             DEALLOCATE (qs_force(ikind)%overlap)
     178              :          END IF
     179              : 
     180         9922 :          IF (ASSOCIATED(qs_force(ikind)%overlap_admm)) THEN
     181         9922 :             DEALLOCATE (qs_force(ikind)%overlap_admm)
     182              :          END IF
     183              : 
     184         9922 :          IF (ASSOCIATED(qs_force(ikind)%rho_core)) THEN
     185         9922 :             DEALLOCATE (qs_force(ikind)%rho_core)
     186              :          END IF
     187              : 
     188         9922 :          IF (ASSOCIATED(qs_force(ikind)%rho_elec)) THEN
     189         9922 :             DEALLOCATE (qs_force(ikind)%rho_elec)
     190              :          END IF
     191         9922 :          IF (ASSOCIATED(qs_force(ikind)%rho_lri_elec)) THEN
     192         9922 :             DEALLOCATE (qs_force(ikind)%rho_lri_elec)
     193              :          END IF
     194              : 
     195         9922 :          IF (ASSOCIATED(qs_force(ikind)%rho_cneo_nuc)) THEN
     196         9922 :             DEALLOCATE (qs_force(ikind)%rho_cneo_nuc)
     197              :          END IF
     198              : 
     199         9922 :          IF (ASSOCIATED(qs_force(ikind)%vhxc_atom)) THEN
     200         9922 :             DEALLOCATE (qs_force(ikind)%vhxc_atom)
     201              :          END IF
     202              : 
     203         9922 :          IF (ASSOCIATED(qs_force(ikind)%g0s_Vh_elec)) THEN
     204         9922 :             DEALLOCATE (qs_force(ikind)%g0s_Vh_elec)
     205              :          END IF
     206              : 
     207         9922 :          IF (ASSOCIATED(qs_force(ikind)%repulsive)) THEN
     208         9922 :             DEALLOCATE (qs_force(ikind)%repulsive)
     209              :          END IF
     210              : 
     211         9922 :          IF (ASSOCIATED(qs_force(ikind)%dispersion)) THEN
     212         9922 :             DEALLOCATE (qs_force(ikind)%dispersion)
     213              :          END IF
     214              : 
     215         9922 :          IF (ASSOCIATED(qs_force(ikind)%gcp)) THEN
     216         9922 :             DEALLOCATE (qs_force(ikind)%gcp)
     217              :          END IF
     218              : 
     219         9922 :          IF (ASSOCIATED(qs_force(ikind)%other)) THEN
     220         9922 :             DEALLOCATE (qs_force(ikind)%other)
     221              :          END IF
     222              : 
     223         9922 :          IF (ASSOCIATED(qs_force(ikind)%total)) THEN
     224         9922 :             DEALLOCATE (qs_force(ikind)%total)
     225              :          END IF
     226              : 
     227         9922 :          IF (ASSOCIATED(qs_force(ikind)%ch_pulay)) THEN
     228         9922 :             DEALLOCATE (qs_force(ikind)%ch_pulay)
     229              :          END IF
     230              : 
     231         9922 :          IF (ASSOCIATED(qs_force(ikind)%fock_4c)) THEN
     232         9922 :             DEALLOCATE (qs_force(ikind)%fock_4c)
     233              :          END IF
     234              : 
     235         9922 :          IF (ASSOCIATED(qs_force(ikind)%mp2_non_sep)) THEN
     236         9922 :             DEALLOCATE (qs_force(ikind)%mp2_non_sep)
     237              :          END IF
     238              : 
     239         9922 :          IF (ASSOCIATED(qs_force(ikind)%tensorial_u)) THEN
     240         9922 :             DEALLOCATE (qs_force(ikind)%tensorial_u)
     241              :          END IF
     242              : 
     243         9922 :          IF (ASSOCIATED(qs_force(ikind)%ehrenfest)) THEN
     244         9922 :             DEALLOCATE (qs_force(ikind)%ehrenfest)
     245              :          END IF
     246              : 
     247         9922 :          IF (ASSOCIATED(qs_force(ikind)%efield)) THEN
     248         9922 :             DEALLOCATE (qs_force(ikind)%efield)
     249              :          END IF
     250              : 
     251        15081 :          IF (ASSOCIATED(qs_force(ikind)%eev)) THEN
     252         9922 :             DEALLOCATE (qs_force(ikind)%eev)
     253              :          END IF
     254              :       END DO
     255              : 
     256         5159 :       DEALLOCATE (qs_force)
     257              : 
     258         5159 :    END SUBROUTINE deallocate_qs_force
     259              : 
     260              : ! **************************************************************************************************
     261              : !> \brief    Initialize a Quickstep force data structure.
     262              : !> \param qs_force ...
     263              : !> \date    15.07.2002
     264              : !> \author  MK
     265              : !> \version 1.0
     266              : ! **************************************************************************************************
     267        13815 :    SUBROUTINE zero_qs_force(qs_force)
     268              : 
     269              :       TYPE(qs_force_type), DIMENSION(:), POINTER         :: qs_force
     270              : 
     271              :       INTEGER                                            :: ikind
     272              : 
     273        13815 :       CPASSERT(ASSOCIATED(qs_force))
     274              : 
     275        40415 :       DO ikind = 1, SIZE(qs_force)
     276       339972 :          qs_force(ikind)%all_potential(:, :) = 0.0_dp
     277       339972 :          qs_force(ikind)%cneo_potential(:, :) = 0.0_dp
     278       339972 :          qs_force(ikind)%core_overlap(:, :) = 0.0_dp
     279       339972 :          qs_force(ikind)%gth_ppl(:, :) = 0.0_dp
     280       339972 :          qs_force(ikind)%gth_nlcc(:, :) = 0.0_dp
     281       339972 :          qs_force(ikind)%gth_ppnl(:, :) = 0.0_dp
     282       339972 :          qs_force(ikind)%kinetic(:, :) = 0.0_dp
     283       339972 :          qs_force(ikind)%overlap(:, :) = 0.0_dp
     284       339972 :          qs_force(ikind)%overlap_admm(:, :) = 0.0_dp
     285       339972 :          qs_force(ikind)%rho_core(:, :) = 0.0_dp
     286       339972 :          qs_force(ikind)%rho_elec(:, :) = 0.0_dp
     287       339972 :          qs_force(ikind)%rho_lri_elec(:, :) = 0.0_dp
     288       339972 :          qs_force(ikind)%rho_cneo_nuc(:, :) = 0.0_dp
     289       339972 :          qs_force(ikind)%vhxc_atom(:, :) = 0.0_dp
     290       339972 :          qs_force(ikind)%g0s_Vh_elec(:, :) = 0.0_dp
     291       339972 :          qs_force(ikind)%repulsive(:, :) = 0.0_dp
     292       339972 :          qs_force(ikind)%dispersion(:, :) = 0.0_dp
     293       339972 :          qs_force(ikind)%gcp(:, :) = 0.0_dp
     294       339972 :          qs_force(ikind)%other(:, :) = 0.0_dp
     295       339972 :          qs_force(ikind)%fock_4c(:, :) = 0.0_dp
     296       339972 :          qs_force(ikind)%ehrenfest(:, :) = 0.0_dp
     297       339972 :          qs_force(ikind)%efield(:, :) = 0.0_dp
     298       339972 :          qs_force(ikind)%eev(:, :) = 0.0_dp
     299       339972 :          qs_force(ikind)%mp2_non_sep(:, :) = 0.0_dp
     300       339972 :          qs_force(ikind)%tensorial_u(:, :) = 0.0_dp
     301       353787 :          qs_force(ikind)%total(:, :) = 0.0_dp
     302              :       END DO
     303              : 
     304        13815 :    END SUBROUTINE zero_qs_force
     305              : 
     306              : ! **************************************************************************************************
     307              : !> \brief    Sum up two qs_force entities qs_force_out = qs_force_out + qs_force_in
     308              : !> \param qs_force_out ...
     309              : !> \param qs_force_in ...
     310              : !> \author  JGH
     311              : ! **************************************************************************************************
     312         1608 :    SUBROUTINE sum_qs_force(qs_force_out, qs_force_in)
     313              : 
     314              :       TYPE(qs_force_type), DIMENSION(:), POINTER         :: qs_force_out, qs_force_in
     315              : 
     316              :       INTEGER                                            :: ikind
     317              : 
     318         1608 :       CPASSERT(ASSOCIATED(qs_force_out))
     319         1608 :       CPASSERT(ASSOCIATED(qs_force_in))
     320              : 
     321         4916 :       DO ikind = 1, SIZE(qs_force_out)
     322              :          qs_force_out(ikind)%all_potential(:, :) = qs_force_out(ikind)%all_potential(:, :) + &
     323        49128 :                                                    qs_force_in(ikind)%all_potential(:, :)
     324              :          qs_force_out(ikind)%cneo_potential(:, :) = qs_force_out(ikind)%cneo_potential(:, :) + &
     325        49128 :                                                     qs_force_in(ikind)%cneo_potential(:, :)
     326              :          qs_force_out(ikind)%core_overlap(:, :) = qs_force_out(ikind)%core_overlap(:, :) + &
     327        49128 :                                                   qs_force_in(ikind)%core_overlap(:, :)
     328              :          qs_force_out(ikind)%gth_ppl(:, :) = qs_force_out(ikind)%gth_ppl(:, :) + &
     329        49128 :                                              qs_force_in(ikind)%gth_ppl(:, :)
     330              :          qs_force_out(ikind)%gth_nlcc(:, :) = qs_force_out(ikind)%gth_nlcc(:, :) + &
     331        49128 :                                               qs_force_in(ikind)%gth_nlcc(:, :)
     332              :          qs_force_out(ikind)%gth_ppnl(:, :) = qs_force_out(ikind)%gth_ppnl(:, :) + &
     333        49128 :                                               qs_force_in(ikind)%gth_ppnl(:, :)
     334              :          qs_force_out(ikind)%kinetic(:, :) = qs_force_out(ikind)%kinetic(:, :) + &
     335        49128 :                                              qs_force_in(ikind)%kinetic(:, :)
     336              :          qs_force_out(ikind)%overlap(:, :) = qs_force_out(ikind)%overlap(:, :) + &
     337        49128 :                                              qs_force_in(ikind)%overlap(:, :)
     338              :          qs_force_out(ikind)%overlap_admm(:, :) = qs_force_out(ikind)%overlap_admm(:, :) + &
     339        49128 :                                                   qs_force_in(ikind)%overlap_admm(:, :)
     340              :          qs_force_out(ikind)%rho_core(:, :) = qs_force_out(ikind)%rho_core(:, :) + &
     341        49128 :                                               qs_force_in(ikind)%rho_core(:, :)
     342              :          qs_force_out(ikind)%rho_elec(:, :) = qs_force_out(ikind)%rho_elec(:, :) + &
     343        49128 :                                               qs_force_in(ikind)%rho_elec(:, :)
     344              :          qs_force_out(ikind)%rho_lri_elec(:, :) = qs_force_out(ikind)%rho_lri_elec(:, :) + &
     345        49128 :                                                   qs_force_in(ikind)%rho_lri_elec(:, :)
     346              :          qs_force_out(ikind)%rho_cneo_nuc(:, :) = qs_force_out(ikind)%rho_cneo_nuc(:, :) + &
     347        49128 :                                                   qs_force_in(ikind)%rho_cneo_nuc(:, :)
     348              :          qs_force_out(ikind)%vhxc_atom(:, :) = qs_force_out(ikind)%vhxc_atom(:, :) + &
     349        49128 :                                                qs_force_in(ikind)%vhxc_atom(:, :)
     350              :          qs_force_out(ikind)%g0s_Vh_elec(:, :) = qs_force_out(ikind)%g0s_Vh_elec(:, :) + &
     351        49128 :                                                  qs_force_in(ikind)%g0s_Vh_elec(:, :)
     352              :          qs_force_out(ikind)%repulsive(:, :) = qs_force_out(ikind)%repulsive(:, :) + &
     353        49128 :                                                qs_force_in(ikind)%repulsive(:, :)
     354              :          qs_force_out(ikind)%dispersion(:, :) = qs_force_out(ikind)%dispersion(:, :) + &
     355        49128 :                                                 qs_force_in(ikind)%dispersion(:, :)
     356              :          qs_force_out(ikind)%gcp(:, :) = qs_force_out(ikind)%gcp(:, :) + &
     357        49128 :                                          qs_force_in(ikind)%gcp(:, :)
     358              :          qs_force_out(ikind)%other(:, :) = qs_force_out(ikind)%other(:, :) + &
     359        49128 :                                            qs_force_in(ikind)%other(:, :)
     360              :          qs_force_out(ikind)%fock_4c(:, :) = qs_force_out(ikind)%fock_4c(:, :) + &
     361        49128 :                                              qs_force_in(ikind)%fock_4c(:, :)
     362              :          qs_force_out(ikind)%ehrenfest(:, :) = qs_force_out(ikind)%ehrenfest(:, :) + &
     363        49128 :                                                qs_force_in(ikind)%ehrenfest(:, :)
     364              :          qs_force_out(ikind)%efield(:, :) = qs_force_out(ikind)%efield(:, :) + &
     365        49128 :                                             qs_force_in(ikind)%efield(:, :)
     366              :          qs_force_out(ikind)%eev(:, :) = qs_force_out(ikind)%eev(:, :) + &
     367        49128 :                                          qs_force_in(ikind)%eev(:, :)
     368              :          qs_force_out(ikind)%mp2_non_sep(:, :) = qs_force_out(ikind)%mp2_non_sep(:, :) + &
     369        49128 :                                                  qs_force_in(ikind)%mp2_non_sep(:, :)
     370              :          qs_force_out(ikind)%tensorial_u(:, :) = qs_force_out(ikind)%tensorial_u(:, :) + &
     371        49128 :                                                  qs_force_in(ikind)%tensorial_u(:, :)
     372              :          qs_force_out(ikind)%total(:, :) = qs_force_out(ikind)%total(:, :) + &
     373        50736 :                                            qs_force_in(ikind)%total(:, :)
     374              :       END DO
     375              : 
     376         1608 :    END SUBROUTINE sum_qs_force
     377              : 
     378              : ! **************************************************************************************************
     379              : !> \brief    Replicate and sum up the force
     380              : !> \param qs_force ...
     381              : !> \param para_env ...
     382              : !> \date    25.05.2016
     383              : !> \author  JHU
     384              : !> \version 1.0
     385              : ! **************************************************************************************************
     386        11445 :    SUBROUTINE replicate_qs_force(qs_force, para_env)
     387              : 
     388              :       TYPE(qs_force_type), DIMENSION(:), POINTER         :: qs_force
     389              :       TYPE(mp_para_env_type), POINTER                    :: para_env
     390              : 
     391              :       INTEGER                                            :: ikind
     392              : 
     393              :       !  *** replicate forces ***
     394        33653 :       DO ikind = 1, SIZE(qs_force)
     395       590760 :          CALL para_env%sum(qs_force(ikind)%overlap)
     396       590760 :          CALL para_env%sum(qs_force(ikind)%overlap_admm)
     397       590760 :          CALL para_env%sum(qs_force(ikind)%kinetic)
     398       590760 :          CALL para_env%sum(qs_force(ikind)%gth_ppl)
     399       590760 :          CALL para_env%sum(qs_force(ikind)%gth_nlcc)
     400       590760 :          CALL para_env%sum(qs_force(ikind)%gth_ppnl)
     401       590760 :          CALL para_env%sum(qs_force(ikind)%all_potential)
     402       590760 :          CALL para_env%sum(qs_force(ikind)%cneo_potential)
     403       590760 :          CALL para_env%sum(qs_force(ikind)%core_overlap)
     404       590760 :          CALL para_env%sum(qs_force(ikind)%rho_core)
     405       590760 :          CALL para_env%sum(qs_force(ikind)%rho_elec)
     406       590760 :          CALL para_env%sum(qs_force(ikind)%rho_lri_elec)
     407       590760 :          CALL para_env%sum(qs_force(ikind)%rho_cneo_nuc)
     408       590760 :          CALL para_env%sum(qs_force(ikind)%vhxc_atom)
     409       590760 :          CALL para_env%sum(qs_force(ikind)%g0s_Vh_elec)
     410       590760 :          CALL para_env%sum(qs_force(ikind)%fock_4c)
     411       590760 :          CALL para_env%sum(qs_force(ikind)%mp2_non_sep)
     412       590760 :          CALL para_env%sum(qs_force(ikind)%repulsive)
     413       590760 :          CALL para_env%sum(qs_force(ikind)%dispersion)
     414       590760 :          CALL para_env%sum(qs_force(ikind)%gcp)
     415       590760 :          CALL para_env%sum(qs_force(ikind)%ehrenfest)
     416              : 
     417              :          qs_force(ikind)%total(:, :) = qs_force(ikind)%total(:, :) + &
     418              :                                        qs_force(ikind)%core_overlap(:, :) + &
     419              :                                        qs_force(ikind)%gth_ppl(:, :) + &
     420              :                                        qs_force(ikind)%gth_nlcc(:, :) + &
     421              :                                        qs_force(ikind)%gth_ppnl(:, :) + &
     422              :                                        qs_force(ikind)%all_potential(:, :) + &
     423              :                                        qs_force(ikind)%cneo_potential(:, :) + &
     424              :                                        qs_force(ikind)%kinetic(:, :) + &
     425              :                                        qs_force(ikind)%overlap(:, :) + &
     426              :                                        qs_force(ikind)%overlap_admm(:, :) + &
     427              :                                        qs_force(ikind)%rho_core(:, :) + &
     428              :                                        qs_force(ikind)%rho_elec(:, :) + &
     429              :                                        qs_force(ikind)%rho_lri_elec(:, :) + &
     430              :                                        qs_force(ikind)%rho_cneo_nuc(:, :) + &
     431              :                                        qs_force(ikind)%vhxc_atom(:, :) + &
     432              :                                        qs_force(ikind)%g0s_Vh_elec(:, :) + &
     433              :                                        qs_force(ikind)%fock_4c(:, :) + &
     434              :                                        qs_force(ikind)%mp2_non_sep(:, :) + &
     435              :                                        qs_force(ikind)%tensorial_u(:, :) + &
     436              :                                        qs_force(ikind)%repulsive(:, :) + &
     437              :                                        qs_force(ikind)%dispersion(:, :) + &
     438              :                                        qs_force(ikind)%gcp(:, :) + &
     439              :                                        qs_force(ikind)%ehrenfest(:, :) + &
     440              :                                        qs_force(ikind)%efield(:, :) + &
     441       317929 :                                        qs_force(ikind)%eev(:, :)
     442              :       END DO
     443              : 
     444        11445 :    END SUBROUTINE replicate_qs_force
     445              : 
     446              : ! **************************************************************************************************
     447              : !> \brief Add force to a force_type  variable.
     448              : !> \param force Input force, dimension (3,natom)
     449              : !> \param qs_force The force type variable to be used
     450              : !> \param forcetype ...
     451              : !> \param atomic_kind_set ...
     452              : !> \par History
     453              : !>      07.2014 JGH
     454              : !> \author JGH
     455              : ! **************************************************************************************************
     456         1248 :    SUBROUTINE add_qs_force(force, qs_force, forcetype, atomic_kind_set)
     457              : 
     458              :       REAL(KIND=dp), DIMENSION(:, :), INTENT(IN)         :: force
     459              :       TYPE(qs_force_type), DIMENSION(:), POINTER         :: qs_force
     460              :       CHARACTER(LEN=*), INTENT(IN)                       :: forcetype
     461              :       TYPE(atomic_kind_type), DIMENSION(:), POINTER      :: atomic_kind_set
     462              : 
     463              :       INTEGER                                            :: ia, iatom, ikind, natom_kind
     464              :       TYPE(atomic_kind_type), POINTER                    :: atomic_kind
     465              : 
     466              : !   ------------------------------------------------------------------------
     467              : 
     468         1248 :       CPASSERT(ASSOCIATED(qs_force))
     469              : 
     470         1248 :       SELECT CASE (forcetype)
     471              :       CASE ("overlap_admm")
     472         3532 :          DO ikind = 1, SIZE(atomic_kind_set, 1)
     473         2284 :             atomic_kind => atomic_kind_set(ikind)
     474         2284 :             CALL get_atomic_kind(atomic_kind=atomic_kind, natom=natom_kind)
     475         7128 :             DO ia = 1, natom_kind
     476         3596 :                iatom = atomic_kind%atom_list(ia)
     477        16668 :                qs_force(ikind)%overlap_admm(:, ia) = qs_force(ikind)%overlap_admm(:, ia) + force(:, iatom)
     478              :             END DO
     479              :          END DO
     480              :       CASE DEFAULT
     481              :          CALL cp_abort(__LOCATION__, &
     482              :                        "<overlap_admm> is supported as the <forcetype> "// &
     483              :                        "for add_qs_force, found unknown option "// &
     484         1248 :                        "<"//TRIM(forcetype)//">")
     485              :       END SELECT
     486              : 
     487         1248 :    END SUBROUTINE add_qs_force
     488              : 
     489              : ! **************************************************************************************************
     490              : !> \brief Put force to a force_type  variable.
     491              : !> \param force Input force, dimension (3,natom)
     492              : !> \param qs_force The force type variable to be used
     493              : !> \param forcetype ...
     494              : !> \param atomic_kind_set ...
     495              : !> \par History
     496              : !>      09.2019 JGH
     497              : !> \author JGH
     498              : ! **************************************************************************************************
     499            0 :    SUBROUTINE put_qs_force(force, qs_force, forcetype, atomic_kind_set)
     500              : 
     501              :       REAL(KIND=dp), DIMENSION(:, :), INTENT(IN)         :: force
     502              :       TYPE(qs_force_type), DIMENSION(:), POINTER         :: qs_force
     503              :       CHARACTER(LEN=*), INTENT(IN)                       :: forcetype
     504              :       TYPE(atomic_kind_type), DIMENSION(:), POINTER      :: atomic_kind_set
     505              : 
     506              :       INTEGER                                            :: ia, iatom, ikind, natom_kind
     507              :       TYPE(atomic_kind_type), POINTER                    :: atomic_kind
     508              : 
     509              : !   ------------------------------------------------------------------------
     510              : 
     511            0 :       SELECT CASE (forcetype)
     512              :       CASE ("dispersion")
     513            0 :          DO ikind = 1, SIZE(atomic_kind_set, 1)
     514            0 :             atomic_kind => atomic_kind_set(ikind)
     515            0 :             CALL get_atomic_kind(atomic_kind=atomic_kind, natom=natom_kind)
     516            0 :             DO ia = 1, natom_kind
     517            0 :                iatom = atomic_kind%atom_list(ia)
     518            0 :                qs_force(ikind)%dispersion(:, ia) = force(:, iatom)
     519              :             END DO
     520              :          END DO
     521              :       CASE DEFAULT
     522              :          CALL cp_abort(__LOCATION__, &
     523              :                        "<dispersion> is supported as the <forcetype> "// &
     524              :                        "for put_qs_force, found unknown option "// &
     525            0 :                        "<"//TRIM(forcetype)//">")
     526              :       END SELECT
     527              : 
     528            0 :    END SUBROUTINE put_qs_force
     529              : 
     530              : ! **************************************************************************************************
     531              : !> \brief Get force from a force_type  variable.
     532              : !> \param force Input force, dimension (3,natom)
     533              : !> \param qs_force The force type variable to be used
     534              : !> \param forcetype ...
     535              : !> \param atomic_kind_set ...
     536              : !> \par History
     537              : !>      09.2019 JGH
     538              : !> \author JGH
     539              : ! **************************************************************************************************
     540            0 :    SUBROUTINE get_qs_force(force, qs_force, forcetype, atomic_kind_set)
     541              : 
     542              :       REAL(KIND=dp), DIMENSION(:, :), INTENT(INOUT)      :: force
     543              :       TYPE(qs_force_type), DIMENSION(:), POINTER         :: qs_force
     544              :       CHARACTER(LEN=*), INTENT(IN)                       :: forcetype
     545              :       TYPE(atomic_kind_type), DIMENSION(:), POINTER      :: atomic_kind_set
     546              : 
     547              :       INTEGER                                            :: ia, iatom, ikind, natom_kind
     548              :       TYPE(atomic_kind_type), POINTER                    :: atomic_kind
     549              : 
     550              : !   ------------------------------------------------------------------------
     551              : 
     552            0 :       SELECT CASE (forcetype)
     553              :       CASE ("dispersion")
     554            0 :          DO ikind = 1, SIZE(atomic_kind_set, 1)
     555            0 :             atomic_kind => atomic_kind_set(ikind)
     556            0 :             CALL get_atomic_kind(atomic_kind=atomic_kind, natom=natom_kind)
     557            0 :             DO ia = 1, natom_kind
     558            0 :                iatom = atomic_kind%atom_list(ia)
     559            0 :                force(:, iatom) = qs_force(ikind)%dispersion(:, ia)
     560              :             END DO
     561              :          END DO
     562              :       CASE DEFAULT
     563              :          CALL cp_abort(__LOCATION__, &
     564              :                        "<dispersion> is supported as the <forcetype> "// &
     565              :                        "for get_qs_force, found unknown option "// &
     566            0 :                        "<"//TRIM(forcetype)//">")
     567              :       END SELECT
     568              : 
     569            0 :    END SUBROUTINE get_qs_force
     570              : 
     571              : ! **************************************************************************************************
     572              : !> \brief Get current total force
     573              : !> \param force Input force, dimension (3,natom)
     574              : !> \param qs_force The force type variable to be used
     575              : !> \param atomic_kind_set ...
     576              : !> \par History
     577              : !>      09.2019 JGH
     578              : !> \author JGH
     579              : ! **************************************************************************************************
     580          998 :    SUBROUTINE total_qs_force(force, qs_force, atomic_kind_set)
     581              : 
     582              :       REAL(KIND=dp), DIMENSION(:, :), INTENT(INOUT)      :: force
     583              :       TYPE(qs_force_type), DIMENSION(:), POINTER         :: qs_force
     584              :       TYPE(atomic_kind_type), DIMENSION(:), POINTER      :: atomic_kind_set
     585              : 
     586              :       INTEGER                                            :: ia, iatom, ikind, natom_kind
     587              :       TYPE(atomic_kind_type), POINTER                    :: atomic_kind
     588              : 
     589              : !   ------------------------------------------------------------------------
     590              : 
     591        13230 :       force(:, :) = 0.0_dp
     592         3062 :       DO ikind = 1, SIZE(atomic_kind_set, 1)
     593         2064 :          atomic_kind => atomic_kind_set(ikind)
     594         2064 :          CALL get_atomic_kind(atomic_kind=atomic_kind, natom=natom_kind)
     595         6120 :          DO ia = 1, natom_kind
     596         3058 :             iatom = atomic_kind%atom_list(ia)
     597              :             force(:, iatom) = qs_force(ikind)%core_overlap(:, ia) + &
     598              :                               qs_force(ikind)%gth_ppl(:, ia) + &
     599              :                               qs_force(ikind)%gth_nlcc(:, ia) + &
     600              :                               qs_force(ikind)%gth_ppnl(:, ia) + &
     601              :                               qs_force(ikind)%all_potential(:, ia) + &
     602              :                               qs_force(ikind)%cneo_potential(:, ia) + &
     603              :                               qs_force(ikind)%kinetic(:, ia) + &
     604              :                               qs_force(ikind)%overlap(:, ia) + &
     605              :                               qs_force(ikind)%overlap_admm(:, ia) + &
     606              :                               qs_force(ikind)%rho_core(:, ia) + &
     607              :                               qs_force(ikind)%rho_elec(:, ia) + &
     608              :                               qs_force(ikind)%rho_lri_elec(:, ia) + &
     609              :                               qs_force(ikind)%rho_cneo_nuc(:, ia) + &
     610              :                               qs_force(ikind)%vhxc_atom(:, ia) + &
     611              :                               qs_force(ikind)%g0s_Vh_elec(:, ia) + &
     612              :                               qs_force(ikind)%fock_4c(:, ia) + &
     613              :                               qs_force(ikind)%mp2_non_sep(:, ia) + &
     614              :                               qs_force(ikind)%tensorial_u(:, ia) + &
     615              :                               qs_force(ikind)%repulsive(:, ia) + &
     616              :                               qs_force(ikind)%dispersion(:, ia) + &
     617              :                               qs_force(ikind)%gcp(:, ia) + &
     618              :                               qs_force(ikind)%ehrenfest(:, ia) + &
     619              :                               qs_force(ikind)%efield(:, ia) + &
     620        14296 :                               qs_force(ikind)%eev(:, ia)
     621              :          END DO
     622              :       END DO
     623              : 
     624          998 :    END SUBROUTINE total_qs_force
     625              : 
     626              : ! **************************************************************************************************
     627              : !> \brief Write a Quickstep force data for 1 atom
     628              : !> \param qs_force ...
     629              : !> \param ikind ...
     630              : !> \param iatom ...
     631              : !> \param iunit ...
     632              : !> \date    05.06.2002
     633              : !> \author  MK/JGH
     634              : !> \version 1.0
     635              : ! **************************************************************************************************
     636            0 :    SUBROUTINE write_forces_debug(qs_force, ikind, iatom, iunit)
     637              : 
     638              :       TYPE(qs_force_type), DIMENSION(:), POINTER         :: qs_force
     639              :       INTEGER, INTENT(IN), OPTIONAL                      :: ikind, iatom, iunit
     640              : 
     641              :       CHARACTER(LEN=35)                                  :: fmtstr2
     642              :       CHARACTER(LEN=48)                                  :: fmtstr1
     643              :       INTEGER                                            :: iounit, jatom, jkind
     644              :       REAL(KIND=dp), DIMENSION(3)                        :: total
     645              :       TYPE(cp_logger_type), POINTER                      :: logger
     646              : 
     647            0 :       IF (PRESENT(iunit)) THEN
     648            0 :          iounit = iunit
     649              :       ELSE
     650            0 :          NULLIFY (logger)
     651            0 :          logger => cp_get_default_logger()
     652            0 :          iounit = cp_logger_get_default_io_unit(logger)
     653              :       END IF
     654            0 :       IF (PRESENT(ikind)) THEN
     655            0 :          jkind = ikind
     656              :       ELSE
     657            0 :          jkind = 1
     658              :       END IF
     659            0 :       IF (PRESENT(iatom)) THEN
     660            0 :          jatom = iatom
     661              :       ELSE
     662            0 :          jatom = 1
     663              :       END IF
     664              : 
     665            0 :       IF (iounit > 0) THEN
     666              : 
     667            0 :          fmtstr1 = "(/,T2,A,/,T3,A,T11,A,T23,A,T40,A1,2(17X,A1))"
     668            0 :          fmtstr2 = "((T2,I5,4X,I4,T18,A,T34,3F18.12))"
     669              : 
     670              :          WRITE (UNIT=iounit, FMT=fmtstr1) &
     671            0 :             "FORCES [a.u.]", "Atom", "Kind", "Component", "X", "Y", "Z"
     672              : 
     673              :          total(1:3) = qs_force(jkind)%overlap(1:3, jatom) &
     674              :                       + qs_force(jkind)%overlap_admm(1:3, jatom) &
     675              :                       + qs_force(jkind)%kinetic(1:3, jatom) &
     676              :                       + qs_force(jkind)%gth_ppl(1:3, jatom) &
     677              :                       + qs_force(jkind)%gth_ppnl(1:3, jatom) &
     678              :                       + qs_force(jkind)%gth_nlcc(1:3, jatom) &
     679              :                       + qs_force(jkind)%all_potential(1:3, jatom) &
     680              :                       + qs_force(jkind)%cneo_potential(1:3, jatom) &
     681              :                       + qs_force(jkind)%rho_cneo_nuc(1:3, jatom) &
     682              :                       + qs_force(jkind)%core_overlap(1:3, jatom) &
     683              :                       + qs_force(jkind)%rho_core(1:3, jatom) &
     684              :                       + qs_force(jkind)%rho_elec(1:3, jatom) &
     685              :                       + qs_force(jkind)%rho_lri_elec(1:3, jatom) &
     686              :                       + qs_force(jkind)%vhxc_atom(1:3, jatom) &
     687              :                       + qs_force(jkind)%g0s_Vh_elec(1:3, jatom) &
     688              :                       + qs_force(jkind)%dispersion(1:3, jatom) &
     689              :                       + qs_force(jkind)%repulsive(1:3, jatom) &
     690              :                       + qs_force(jkind)%gcp(1:3, jatom) &
     691              :                       + qs_force(jkind)%efield(1:3, jatom) &
     692              :                       + qs_force(jkind)%eev(1:3, jatom) &
     693              :                       + qs_force(jkind)%ehrenfest(1:3, jatom) &
     694              :                       + qs_force(jkind)%fock_4c(1:3, jatom) &
     695            0 :                       + qs_force(jkind)%mp2_non_sep(1:3, jatom)
     696              : 
     697              :          WRITE (UNIT=iounit, FMT=fmtstr2) &
     698            0 :             jatom, jkind, "       overlap", qs_force(jkind)%overlap(1:3, jatom), &
     699            0 :             jatom, jkind, "  overlap_admm", qs_force(jkind)%overlap_admm(1:3, jatom), &
     700            0 :             jatom, jkind, "       kinetic", qs_force(jkind)%kinetic(1:3, jatom), &
     701            0 :             jatom, jkind, "       gth_ppl", qs_force(jkind)%gth_ppl(1:3, jatom), &
     702            0 :             jatom, jkind, "      gth_ppnl", qs_force(jkind)%gth_ppnl(1:3, jatom), &
     703            0 :             jatom, jkind, "      gth_nlcc", qs_force(jkind)%gth_nlcc(1:3, jatom), &
     704            0 :             jatom, jkind, " all_potential", qs_force(jkind)%all_potential(1:3, jatom), &
     705            0 :             jatom, jkind, "cneo_potential", qs_force(jkind)%cneo_potential(1:3, jatom), &
     706            0 :             jatom, jkind, "  rho_cneo_nuc", qs_force(jkind)%rho_cneo_nuc(1:3, jatom), &
     707            0 :             jatom, jkind, "  core_overlap", qs_force(jkind)%core_overlap(1:3, jatom), &
     708            0 :             jatom, jkind, "      rho_core", qs_force(jkind)%rho_core(1:3, jatom), &
     709            0 :             jatom, jkind, "      rho_elec", qs_force(jkind)%rho_elec(1:3, jatom), &
     710            0 :             jatom, jkind, "  rho_lri_elec", qs_force(jkind)%rho_lri_elec(1:3, jatom), &
     711            0 :             jatom, jkind, "     vhxc_atom", qs_force(jkind)%vhxc_atom(1:3, jatom), &
     712            0 :             jatom, jkind, "   g0s_Vh_elec", qs_force(jkind)%g0s_Vh_elec(1:3, jatom), &
     713            0 :             jatom, jkind, "    dispersion", qs_force(jkind)%dispersion(1:3, jatom), &
     714            0 :             jatom, jkind, "     repulsive", qs_force(jkind)%repulsive(1:3, jatom), &
     715            0 :             jatom, jkind, "           gcp", qs_force(jkind)%gcp(1:3, jatom), &
     716            0 :             jatom, jkind, "        efield", qs_force(jkind)%efield(1:3, jatom), &
     717            0 :             jatom, jkind, "           eev", qs_force(jkind)%eev(1:3, jatom), &
     718            0 :             jatom, jkind, "     ehrenfest", qs_force(jkind)%ehrenfest(1:3, jatom), &
     719            0 :             jatom, jkind, "       fock_4c", qs_force(jkind)%fock_4c(1:3, jatom), &
     720            0 :             jatom, jkind, "   mp2_non_sep", qs_force(jkind)%mp2_non_sep(1:3, jatom), &
     721            0 :             jatom, jkind, "         total", total(1:3)
     722              : 
     723              :       END IF
     724              : 
     725            0 :    END SUBROUTINE write_forces_debug
     726              : 
     727            0 : END MODULE qs_force_types
        

Generated by: LCOV version 2.0-1