LCOV - code coverage report
Current view: top level - src - qs_force_types.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:936074a) Lines: 75.7 % 259 196
Test Date: 2025-12-04 06:27:48 Functions: 63.6 % 11 7

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

Generated by: LCOV version 2.0-1