LCOV - code coverage report
Current view: top level - src - force_env_types.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:42dac4a) Lines: 89.7 % 233 209
Test Date: 2025-07-25 12:55:17 Functions: 75.0 % 12 9

            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              : !> \brief Interface for the force calculations
      10              : !> \par History
      11              : !>      cjm, FEB-20-2001: pass variable box_ref
      12              : !>      cjm, SEPT-12-2002: major reorganization
      13              : !>      fawzi, APR-12-2003: introduced force_env
      14              : !>      cjm, FEB-27-2006: no more box_change
      15              : !>      MK, Nov. 2010: new interfaces added and others were updated
      16              : !> \author CJM & JGH
      17              : ! **************************************************************************************************
      18              : MODULE force_env_types
      19              :    USE cell_types,                      ONLY: cell_type
      20              :    USE cp_log_handling,                 ONLY: cp_add_default_logger,&
      21              :                                               cp_logger_type,&
      22              :                                               cp_rm_default_logger
      23              :    USE cp_subsys_types,                 ONLY: cp_subsys_get,&
      24              :                                               cp_subsys_type,&
      25              :                                               pack_subsys_particles
      26              :    USE eip_environment_types,           ONLY: eip_env_get,&
      27              :                                               eip_env_release,&
      28              :                                               eip_environment_type
      29              :    USE embed_types,                     ONLY: embed_env_release,&
      30              :                                               embed_env_type,&
      31              :                                               get_embed_env
      32              :    USE fist_energy_types,               ONLY: fist_energy_type
      33              :    USE fist_environment_types,          ONLY: fist_env_get,&
      34              :                                               fist_env_release,&
      35              :                                               fist_environment_type
      36              :    USE fp_types,                        ONLY: fp_env_release,&
      37              :                                               fp_type
      38              :    USE global_types,                    ONLY: global_environment_type,&
      39              :                                               globenv_release
      40              :    USE input_section_types,             ONLY: section_vals_get,&
      41              :                                               section_vals_release,&
      42              :                                               section_vals_retain,&
      43              :                                               section_vals_type,&
      44              :                                               section_vals_val_get
      45              :    USE ipi_environment_types,           ONLY: ipi_env_get,&
      46              :                                               ipi_env_release,&
      47              :                                               ipi_environment_type
      48              :    USE ipi_server,                      ONLY: shutdown_server
      49              :    USE kinds,                           ONLY: dp
      50              :    USE message_passing,                 ONLY: mp_para_env_release,&
      51              :                                               mp_para_env_type
      52              :    USE metadynamics_types,              ONLY: meta_env_release,&
      53              :                                               meta_env_type
      54              :    USE mixed_energy_types,              ONLY: mixed_energy_type
      55              :    USE mixed_environment_types,         ONLY: get_mixed_env,&
      56              :                                               mixed_env_release,&
      57              :                                               mixed_environment_type
      58              :    USE nnp_environment_types,           ONLY: nnp_env_get,&
      59              :                                               nnp_env_release,&
      60              :                                               nnp_type
      61              :    USE pwdft_environment_types,         ONLY: pwdft_energy_type,&
      62              :                                               pwdft_env_get,&
      63              :                                               pwdft_env_release,&
      64              :                                               pwdft_environment_type
      65              :    USE qmmm_types,                      ONLY: qmmm_env_get,&
      66              :                                               qmmm_env_release,&
      67              :                                               qmmm_env_type
      68              :    USE qmmmx_types,                     ONLY: qmmmx_env_get,&
      69              :                                               qmmmx_env_release,&
      70              :                                               qmmmx_env_type
      71              :    USE qs_energy_types,                 ONLY: qs_energy_type
      72              :    USE qs_environment_types,            ONLY: get_qs_env,&
      73              :                                               qs_env_release,&
      74              :                                               qs_environment_type
      75              : #include "./base/base_uses.f90"
      76              : 
      77              :    IMPLICIT NONE
      78              : 
      79              :    PRIVATE
      80              : 
      81              :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'force_env_types'
      82              : 
      83              :    INTEGER, PARAMETER, PUBLIC :: use_fist_force = 501, &
      84              :                                  use_qs_force = 502, &
      85              :                                  use_qmmm = 503, &
      86              :                                  use_qmmmx = 504, &
      87              :                                  use_eip_force = 505, &
      88              :                                  use_mixed_force = 506, &
      89              :                                  use_embed = 507, &
      90              :                                  use_pwdft_force = 508, &
      91              :                                  use_nnp_force = 509, &
      92              :                                  use_ipi = 510
      93              : 
      94              :    CHARACTER(LEN=10), DIMENSION(501:510), PARAMETER, PUBLIC :: &
      95              :       use_prog_name = (/ &
      96              :       "FIST  ", &
      97              :       "QS    ", &
      98              :       "QMMM  ", &
      99              :       "QMMMX ", &
     100              :       "EIP   ", &
     101              :       "MIXED ", &
     102              :       "EMBED ", &
     103              :       "SIRIUS", &
     104              :       "NNP   ", &
     105              :       "IPI   "/)
     106              : 
     107              :    PUBLIC :: force_env_type, &
     108              :              force_env_p_type
     109              : 
     110              :    PUBLIC :: force_env_retain, &
     111              :              force_env_release, &
     112              :              force_env_get, &
     113              :              force_env_get_natom, &
     114              :              force_env_get_nparticle, &
     115              :              force_env_get_frc, &
     116              :              force_env_get_pos, &
     117              :              force_env_get_vel, &
     118              :              force_env_set, &
     119              :              multiple_fe_list
     120              : 
     121              : ! **************************************************************************************************
     122              : !> \brief wrapper to abstract the force evaluation of the various methods
     123              : !> \param ref_count reference count (see doc/ReferenceCounting.html)
     124              : !> \param in_use which method is in use
     125              : !> \param fist_env the fist environment (allocated only if fist is in use)
     126              : !> \param qs_env qs_env (activated only if quickstep is in use)
     127              : !> \param globenv the globenv to have the input that generated this force_env
     128              : !> \param para_env the parallel environment that contains all the parallel
     129              : !>        environment of the fragments
     130              : !> \param meta_env the metadynamics environment, allocated if there is
     131              : !>        metadynamics
     132              : !> \param fp_env the flexible partitioning environment
     133              : !>      read-only attributes (get them *only* through force_env_get):
     134              : !> \param subsys the fragments that build up the actual system.
     135              : !> \param cell the cell of the actual system
     136              : !> \note
     137              : !>      as always direct manipulation of these attributes can have very
     138              : !>      bad effects. In this case it can be quite bad and the variables
     139              : !>      might not be up to date. You are warned, use only the get method...
     140              : !> \par History
     141              : !>      04.2003 created [fawzi]
     142              : !>      07.2003 tried to adapt to multiple mpi groups
     143              : !> \author fawzi
     144              : ! **************************************************************************************************
     145              :    TYPE force_env_type
     146              :       INTEGER :: ref_count = 0, in_use = 0, method_name_id = 0
     147              :       REAL(KIND=dp)                                    :: additional_potential = 0.0_dp
     148              :       TYPE(fist_environment_type), POINTER             :: fist_env => NULL()
     149              :       TYPE(meta_env_type), POINTER                     :: meta_env => NULL()
     150              :       TYPE(fp_type), POINTER                           :: fp_env => NULL()
     151              :       TYPE(qs_environment_type), POINTER               :: qs_env => NULL()
     152              :       TYPE(eip_environment_type), POINTER              :: eip_env => NULL()
     153              :       TYPE(pwdft_environment_type), POINTER            :: pwdft_env => NULL()
     154              :       TYPE(global_environment_type), POINTER           :: globenv => NULL()
     155              :       TYPE(mp_para_env_type), POINTER                  :: para_env => NULL()
     156              :       TYPE(force_env_p_type), DIMENSION(:), POINTER    :: sub_force_env => NULL()
     157              :       TYPE(qmmm_env_type), POINTER                     :: qmmm_env => NULL()
     158              :       TYPE(qmmmx_env_type), POINTER                    :: qmmmx_env => NULL()
     159              :       TYPE(mixed_environment_type), POINTER            :: mixed_env => NULL()
     160              :       TYPE(nnp_type), POINTER                          :: nnp_env => NULL()
     161              :       TYPE(embed_env_type), POINTER                    :: embed_env => NULL()
     162              :       TYPE(ipi_environment_type), POINTER              :: ipi_env => NULL()
     163              :       TYPE(section_vals_type), POINTER                 :: force_env_section => NULL()
     164              :       TYPE(section_vals_type), POINTER                 :: root_section => NULL()
     165              :    END TYPE force_env_type
     166              : 
     167              : ! **************************************************************************************************
     168              : !> \brief allows for the creation of an array of force_env
     169              : !> \param force_env a force environment (see above)
     170              : !> \note
     171              : !>      added by MJM for MC swap moves
     172              : !> \author MJM
     173              : ! **************************************************************************************************
     174              :    TYPE force_env_p_type
     175              :       TYPE(force_env_type), POINTER :: force_env => NULL()
     176              :    END TYPE force_env_p_type
     177              : 
     178              : CONTAINS
     179              : 
     180              : ! **************************************************************************************************
     181              : !> \brief retains the given force env
     182              : !> \param force_env the force environment to retain
     183              : !> \par History
     184              : !>      04.2003 created [fawzi]
     185              : !> \author fawzi
     186              : !> \note
     187              : !>      see doc/ReferenceCounting.html
     188              : ! **************************************************************************************************
     189        13325 :    SUBROUTINE force_env_retain(force_env)
     190              :       TYPE(force_env_type), POINTER                      :: force_env
     191              : 
     192        13325 :       CPASSERT(ASSOCIATED(force_env))
     193        13325 :       CPASSERT(force_env%ref_count > 0)
     194        13325 :       force_env%ref_count = force_env%ref_count + 1
     195        13325 :    END SUBROUTINE force_env_retain
     196              : 
     197              : ! **************************************************************************************************
     198              : !> \brief releases the given force env
     199              : !> \param force_env the force environment to release
     200              : !> \par History
     201              : !>      04.2003 created [fawzi]
     202              : !> \author fawzi
     203              : !> \note
     204              : !>      see doc/ReferenceCounting.html
     205              : ! **************************************************************************************************
     206        22954 :    RECURSIVE SUBROUTINE force_env_release(force_env)
     207              :       TYPE(force_env_type), POINTER                      :: force_env
     208              : 
     209              :       INTEGER                                            :: i, my_group
     210              :       TYPE(cp_logger_type), POINTER                      :: my_logger
     211              : 
     212        22954 :       IF (ASSOCIATED(force_env)) THEN
     213        22954 :          CPASSERT(force_env%ref_count > 0)
     214        22954 :          force_env%ref_count = force_env%ref_count - 1
     215        22954 :          IF (force_env%ref_count == 0) THEN
     216              :             ! Deallocate SUB_FORCE_ENV
     217         9629 :             IF (ASSOCIATED(force_env%sub_force_env)) THEN
     218          560 :                DO i = 1, SIZE(force_env%sub_force_env)
     219          398 :                   IF (.NOT. ASSOCIATED(force_env%sub_force_env(i)%force_env)) CYCLE
     220              :                   ! Use the proper logger to deallocate..
     221          314 :                   IF (force_env%in_use == use_mixed_force) THEN
     222          208 :                      my_group = force_env%mixed_env%group_distribution(force_env%para_env%mepos)
     223          208 :                      my_logger => force_env%mixed_env%sub_logger(my_group + 1)%p
     224          208 :                      CALL cp_add_default_logger(my_logger)
     225              :                   END IF
     226              :                   ! The same for embedding
     227          314 :                   IF (force_env%in_use == use_embed) THEN
     228           96 :                      my_group = force_env%embed_env%group_distribution(force_env%para_env%mepos)
     229           96 :                      my_logger => force_env%embed_env%sub_logger(my_group + 1)%p
     230           96 :                      CALL cp_add_default_logger(my_logger)
     231              :                   END IF
     232          314 :                   CALL force_env_release(force_env%sub_force_env(i)%force_env)
     233          314 :                   IF (force_env%in_use == use_mixed_force) &
     234          208 :                      CALL cp_rm_default_logger()
     235          314 :                   IF (force_env%in_use == use_embed) &
     236          258 :                      CALL cp_rm_default_logger()
     237              :                END DO
     238          162 :                DEALLOCATE (force_env%sub_force_env)
     239              :             END IF
     240              : 
     241        11878 :             SELECT CASE (force_env%in_use)
     242              :             CASE (use_fist_force)
     243         2249 :                CALL fist_env_release(force_env%fist_env)
     244         2249 :                DEALLOCATE (force_env%fist_env)
     245              :             CASE (use_qs_force)
     246         6860 :                CALL qs_env_release(force_env%qs_env)
     247         6860 :                DEALLOCATE (force_env%qs_env)
     248              :             CASE (use_eip_force)
     249            2 :                CALL eip_env_release(force_env%eip_env)
     250            2 :                DEALLOCATE (force_env%eip_env)
     251              :             CASE (use_pwdft_force)
     252           16 :                CALL pwdft_env_release(force_env%pwdft_env)
     253           16 :                DEALLOCATE (force_env%pwdft_env)
     254              :             CASE (use_mixed_force)
     255          130 :                CALL mixed_env_release(force_env%mixed_env)
     256          130 :                DEALLOCATE (force_env%mixed_env)
     257              :             CASE (use_nnp_force)
     258           14 :                CALL nnp_env_release(force_env%nnp_env)
     259           14 :                DEALLOCATE (force_env%nnp_env)
     260              :             CASE (use_embed)
     261           24 :                CALL embed_env_release(force_env%embed_env)
     262           24 :                DEALLOCATE (force_env%embed_env)
     263              :             CASE (use_ipi)
     264            0 :                CALL shutdown_server(force_env%ipi_env)
     265            0 :                CALL ipi_env_release(force_env%ipi_env)
     266         9629 :                DEALLOCATE (force_env%ipi_env)
     267              :             END SELECT
     268         9629 :             CALL globenv_release(force_env%globenv)
     269         9629 :             CALL mp_para_env_release(force_env%para_env)
     270              :             ! Not deallocated
     271         9629 :             CPASSERT(.NOT. ASSOCIATED(force_env%fist_env))
     272         9629 :             CPASSERT(.NOT. ASSOCIATED(force_env%qs_env))
     273         9629 :             CPASSERT(.NOT. ASSOCIATED(force_env%eip_env))
     274         9629 :             CPASSERT(.NOT. ASSOCIATED(force_env%pwdft_env))
     275         9629 :             CPASSERT(.NOT. ASSOCIATED(force_env%mixed_env))
     276         9629 :             CPASSERT(.NOT. ASSOCIATED(force_env%nnp_env))
     277         9629 :             CPASSERT(.NOT. ASSOCIATED(force_env%embed_env))
     278         9629 :             CPASSERT(.NOT. ASSOCIATED(force_env%ipi_env))
     279         9629 :             IF (ASSOCIATED(force_env%meta_env)) THEN
     280          152 :                CALL meta_env_release(force_env%meta_env)
     281          152 :                DEALLOCATE (force_env%meta_env)
     282              :             END IF
     283         9629 :             IF (ASSOCIATED(force_env%fp_env)) THEN
     284         9315 :                CALL fp_env_release(force_env%fp_env)
     285         9315 :                DEALLOCATE (force_env%fp_env)
     286              :             END IF
     287         9629 :             IF (ASSOCIATED(force_env%qmmm_env)) THEN
     288          326 :                CALL qmmm_env_release(force_env%qmmm_env)
     289          326 :                DEALLOCATE (force_env%qmmm_env)
     290              :             END IF
     291         9629 :             IF (ASSOCIATED(force_env%qmmmx_env)) THEN
     292            8 :                CALL qmmmx_env_release(force_env%qmmmx_env)
     293            8 :                DEALLOCATE (force_env%qmmmx_env)
     294              :             END IF
     295         9629 :             CALL section_vals_release(force_env%force_env_section)
     296         9629 :             CALL section_vals_release(force_env%root_section)
     297         9629 :             DEALLOCATE (force_env)
     298              :          END IF
     299              :       END IF
     300        22954 :       NULLIFY (force_env)
     301        22954 :    END SUBROUTINE force_env_release
     302              : 
     303              : ! **************************************************************************************************
     304              : !> \brief returns various attributes about the force environment
     305              : !> \param force_env the force environment you what informations about
     306              : !> \param in_use ...
     307              : !> \param fist_env ...
     308              : !> \param qs_env ...
     309              : !> \param meta_env ...
     310              : !> \param fp_env ...
     311              : !> \param subsys ...
     312              : !> \param para_env ...
     313              : !> \param potential_energy ...
     314              : !> \param additional_potential ...
     315              : !> \param kinetic_energy ...
     316              : !> \param harmonic_shell ...
     317              : !> \param kinetic_shell ...
     318              : !> \param cell ...
     319              : !> \param sub_force_env ...
     320              : !> \param qmmm_env ...
     321              : !> \param qmmmx_env ...
     322              : !> \param eip_env ...
     323              : !> \param pwdft_env ...
     324              : !> \param globenv ...
     325              : !> \param input ...
     326              : !> \param force_env_section ...
     327              : !> \param method_name_id ...
     328              : !> \param root_section ...
     329              : !> \param mixed_env ...
     330              : !> \param nnp_env ...
     331              : !> \param embed_env ...
     332              : !> \param ipi_env ...
     333              : !> \par History
     334              : !>      04.2003 created [fawzi]
     335              : !> \author fawzi
     336              : ! **************************************************************************************************
     337      2140920 :    RECURSIVE SUBROUTINE force_env_get(force_env, in_use, fist_env, qs_env, &
     338              :                                       meta_env, fp_env, subsys, para_env, potential_energy, additional_potential, &
     339              :                                       kinetic_energy, harmonic_shell, kinetic_shell, cell, sub_force_env, &
     340              :                                       qmmm_env, qmmmx_env, eip_env, pwdft_env, globenv, input, force_env_section, &
     341              :                                       method_name_id, root_section, mixed_env, nnp_env, embed_env, ipi_env)
     342              :       TYPE(force_env_type), INTENT(IN)                   :: force_env
     343              :       INTEGER, INTENT(out), OPTIONAL                     :: in_use
     344              :       TYPE(fist_environment_type), OPTIONAL, POINTER     :: fist_env
     345              :       TYPE(qs_environment_type), OPTIONAL, POINTER       :: qs_env
     346              :       TYPE(meta_env_type), OPTIONAL, POINTER             :: meta_env
     347              :       TYPE(fp_type), OPTIONAL, POINTER                   :: fp_env
     348              :       TYPE(cp_subsys_type), OPTIONAL, POINTER            :: subsys
     349              :       TYPE(mp_para_env_type), OPTIONAL, POINTER          :: para_env
     350              :       REAL(KIND=dp), INTENT(OUT), OPTIONAL               :: potential_energy, additional_potential, &
     351              :                                                             kinetic_energy, harmonic_shell, &
     352              :                                                             kinetic_shell
     353              :       TYPE(cell_type), OPTIONAL, POINTER                 :: cell
     354              :       TYPE(force_env_p_type), DIMENSION(:), OPTIONAL, &
     355              :          POINTER                                         :: sub_force_env
     356              :       TYPE(qmmm_env_type), OPTIONAL, POINTER             :: qmmm_env
     357              :       TYPE(qmmmx_env_type), OPTIONAL, POINTER            :: qmmmx_env
     358              :       TYPE(eip_environment_type), OPTIONAL, POINTER      :: eip_env
     359              :       TYPE(pwdft_environment_type), OPTIONAL, POINTER    :: pwdft_env
     360              :       TYPE(global_environment_type), OPTIONAL, POINTER   :: globenv
     361              :       TYPE(section_vals_type), OPTIONAL, POINTER         :: input, force_env_section
     362              :       INTEGER, INTENT(out), OPTIONAL                     :: method_name_id
     363              :       TYPE(section_vals_type), OPTIONAL, POINTER         :: root_section
     364              :       TYPE(mixed_environment_type), OPTIONAL, POINTER    :: mixed_env
     365              :       TYPE(nnp_type), OPTIONAL, POINTER                  :: nnp_env
     366              :       TYPE(embed_env_type), OPTIONAL, POINTER            :: embed_env
     367              :       TYPE(ipi_environment_type), OPTIONAL, POINTER      :: ipi_env
     368              : 
     369              :       REAL(KIND=dp)                                      :: eip_kinetic_energy, eip_potential_energy
     370              :       TYPE(cp_subsys_type), POINTER                      :: subsys_tmp
     371              :       TYPE(fist_energy_type), POINTER                    :: thermo
     372              :       TYPE(mixed_energy_type), POINTER                   :: mixed_energy
     373              :       TYPE(pwdft_energy_type), POINTER                   :: pwdft_energy
     374              :       TYPE(qs_energy_type), POINTER                      :: qs_energy
     375              : 
     376      2140920 :       NULLIFY (subsys_tmp)
     377              : 
     378      2140920 :       CPASSERT(force_env%ref_count > 0)
     379              : 
     380      2451078 :       SELECT CASE (force_env%in_use)
     381              :       CASE (use_qs_force)
     382       310158 :          CPASSERT(ASSOCIATED(force_env%qs_env))
     383       310158 :          CPASSERT(.NOT. PRESENT(fist_env))
     384       310158 :          CPASSERT(.NOT. PRESENT(eip_env))
     385       310158 :          CPASSERT(.NOT. PRESENT(pwdft_env))
     386       310158 :          CPASSERT(.NOT. PRESENT(ipi_env))
     387              :          CALL get_qs_env(force_env%qs_env, &
     388              :                          energy=qs_energy, &
     389              :                          input=input, &
     390       310158 :                          cp_subsys=subsys)
     391       310158 :          IF (PRESENT(potential_energy)) potential_energy = qs_energy%total
     392       310158 :          CPASSERT(.NOT. PRESENT(kinetic_energy))
     393              :       CASE (use_fist_force)
     394      1745983 :          CPASSERT(ASSOCIATED(force_env%fist_env))
     395      1745983 :          CPASSERT(.NOT. PRESENT(input))
     396              :          CALL fist_env_get(force_env%fist_env, &
     397              :                            thermo=thermo, &
     398      1745983 :                            subsys=subsys)
     399      1745983 :          IF (PRESENT(potential_energy)) potential_energy = thermo%pot
     400      1745983 :          IF (PRESENT(kinetic_energy)) kinetic_energy = thermo%kin
     401      1745983 :          IF (PRESENT(kinetic_shell)) kinetic_shell = thermo%kin_shell
     402      1745983 :          IF (PRESENT(harmonic_shell)) harmonic_shell = thermo%harm_shell
     403              :       CASE (use_eip_force)
     404          600 :          CPASSERT(ASSOCIATED(force_env%eip_env))
     405          600 :          CPASSERT(.NOT. PRESENT(qs_env))
     406          600 :          CPASSERT(.NOT. PRESENT(fist_env))
     407          600 :          CPASSERT(.NOT. PRESENT(ipi_env))
     408              :          CALL eip_env_get(force_env%eip_env, &
     409              :                           eip_potential_energy=eip_potential_energy, &
     410              :                           eip_kinetic_energy=eip_kinetic_energy, &
     411          600 :                           subsys=subsys)
     412          600 :          IF (PRESENT(potential_energy)) THEN
     413           44 :             potential_energy = eip_potential_energy
     414              :          END IF
     415          600 :          IF (PRESENT(kinetic_energy)) kinetic_energy = eip_kinetic_energy
     416            0 :          CPASSERT(.NOT. PRESENT(kinetic_energy))
     417              :       CASE (use_pwdft_force)
     418          176 :          CPASSERT(ASSOCIATED(force_env%pwdft_env))
     419          176 :          CPASSERT(.NOT. PRESENT(qs_env))
     420          176 :          CPASSERT(.NOT. PRESENT(fist_env))
     421          176 :          CPASSERT(.NOT. PRESENT(ipi_env))
     422          176 :          CALL pwdft_env_get(force_env%pwdft_env, energy=pwdft_energy)
     423          176 :          CALL pwdft_env_get(force_env%pwdft_env, cp_subsys=subsys)
     424          176 :          IF (PRESENT(potential_energy)) potential_energy = pwdft_energy%etotal
     425          176 :          CPASSERT(.NOT. PRESENT(kinetic_energy))
     426              :       CASE (use_qmmm)
     427              :          CALL qmmm_env_get(force_env%qmmm_env, &
     428              :                            subsys=subsys, &
     429              :                            potential_energy=potential_energy, &
     430        62932 :                            kinetic_energy=kinetic_energy)
     431              :       CASE (use_qmmmx)
     432              :          CALL qmmmx_env_get(force_env%qmmmx_env, &
     433              :                             subsys=subsys, &
     434              :                             potential_energy=potential_energy, &
     435        16497 :                             kinetic_energy=kinetic_energy)
     436              :       CASE (use_mixed_force)
     437        14955 :          CPASSERT(ASSOCIATED(force_env%mixed_env))
     438        14955 :          CPASSERT(.NOT. PRESENT(input))
     439              :          CALL get_mixed_env(force_env%mixed_env, &
     440              :                             mixed_energy=mixed_energy, &
     441        14955 :                             subsys=subsys)
     442        14955 :          IF (PRESENT(potential_energy)) potential_energy = mixed_energy%pot
     443        14955 :          IF (PRESENT(kinetic_energy)) kinetic_energy = mixed_energy%kin
     444              :          ! In embedding we only have potential energies (electronic energies)
     445              :       CASE (use_embed)
     446          338 :          CPASSERT(ASSOCIATED(force_env%embed_env))
     447          338 :          CPASSERT(.NOT. PRESENT(input))
     448              :          CALL get_embed_env(force_env%embed_env, &
     449              :                             pot_energy=potential_energy, &
     450          338 :                             subsys=subsys)
     451              :       CASE (use_nnp_force)
     452         5778 :          CPASSERT(ASSOCIATED(force_env%nnp_env))
     453         5778 :          CPASSERT(.NOT. PRESENT(ipi_env))
     454              :          CALL nnp_env_get(force_env%nnp_env, &
     455              :                           nnp_potential_energy=potential_energy, &
     456         5778 :                           subsys=subsys)
     457         5778 :          CPASSERT(.NOT. PRESENT(kinetic_energy))
     458              :       CASE (use_ipi)
     459              :          CALL ipi_env_get(force_env%ipi_env, &
     460              :                           ipi_energy=potential_energy, &
     461            0 :                           subsys=subsys)
     462              :       CASE DEFAULT
     463      2147298 :          CPABORT("unknown in_use flag value ")
     464              :       END SELECT
     465              : 
     466      2140920 :       IF (PRESENT(force_env_section)) force_env_section => force_env%force_env_section
     467      2140920 :       IF (PRESENT(in_use)) in_use = force_env%in_use
     468      2140920 :       IF (PRESENT(method_name_id)) method_name_id = force_env%method_name_id
     469      2140920 :       IF (PRESENT(fist_env)) THEN
     470           14 :          fist_env => force_env%fist_env
     471              :       END IF
     472      2140920 :       IF (PRESENT(qs_env)) THEN
     473        25375 :          qs_env => force_env%qs_env
     474              :       END IF
     475      2140920 :       IF (PRESENT(eip_env)) THEN
     476            0 :          eip_env => force_env%eip_env
     477              :       END IF
     478      2140920 :       IF (PRESENT(pwdft_env)) THEN
     479            0 :          pwdft_env => force_env%pwdft_env
     480              :       END IF
     481      2140920 :       IF (PRESENT(nnp_env)) THEN
     482            0 :          nnp_env => force_env%nnp_env
     483              :       END IF
     484      2140920 :       IF (PRESENT(ipi_env)) THEN
     485            0 :          ipi_env => force_env%ipi_env
     486              :       END IF
     487      2140920 :       IF (PRESENT(para_env)) para_env => force_env%para_env
     488              :       ! adjust the total energy for the metadynamics
     489      2140920 :       IF (ASSOCIATED(force_env%meta_env)) THEN
     490       428646 :          IF (PRESENT(potential_energy)) THEN
     491              :             potential_energy = potential_energy + &
     492              :                                force_env%meta_env%epot_s + &
     493              :                                force_env%meta_env%epot_walls + &
     494        27780 :                                force_env%meta_env%hills_env%energy
     495              :          END IF
     496       428646 :          IF (PRESENT(kinetic_energy)) THEN
     497            0 :             kinetic_energy = kinetic_energy + force_env%meta_env%ekin_s
     498              :          END IF
     499              :       END IF
     500              :       ! adjust the total energy for the flexible partitioning
     501      2140920 :       IF (ASSOCIATED(force_env%fp_env) .AND. PRESENT(potential_energy)) THEN
     502       195464 :          IF (force_env%fp_env%use_fp) THEN
     503          244 :             potential_energy = potential_energy + force_env%fp_env%energy
     504              :          END IF
     505              :       END IF
     506       201333 :       IF (PRESENT(potential_energy)) THEN
     507       196992 :          potential_energy = potential_energy + force_env%additional_potential
     508              :       END IF
     509      2140920 :       IF (PRESENT(additional_potential)) THEN
     510        98585 :          additional_potential = force_env%additional_potential
     511              :       END IF
     512      2140920 :       IF (PRESENT(cell)) THEN
     513       519846 :          CALL force_env_get(force_env, subsys=subsys_tmp)
     514       519846 :          CALL cp_subsys_get(subsys_tmp, cell=cell)
     515              :       END IF
     516      2140920 :       IF (PRESENT(fp_env)) fp_env => force_env%fp_env
     517      2140920 :       IF (PRESENT(meta_env)) meta_env => force_env%meta_env
     518      2140920 :       IF (PRESENT(sub_force_env)) sub_force_env => force_env%sub_force_env
     519      2140920 :       IF (PRESENT(qmmm_env)) qmmm_env => force_env%qmmm_env
     520      2140920 :       IF (PRESENT(qmmmx_env)) qmmmx_env => force_env%qmmmx_env
     521      2140920 :       IF (PRESENT(mixed_env)) mixed_env => force_env%mixed_env
     522      2140920 :       IF (PRESENT(embed_env)) embed_env => force_env%embed_env
     523      2140920 :       IF (PRESENT(ipi_env)) ipi_env => force_env%ipi_env
     524      2140920 :       IF (PRESENT(globenv)) globenv => force_env%globenv
     525      2140920 :       IF (PRESENT(root_section)) root_section => force_env%root_section
     526              : 
     527      2140920 :    END SUBROUTINE force_env_get
     528              : 
     529              : ! **************************************************************************************************
     530              : !> \brief returns the number of atoms
     531              : !> \param force_env the force_env you what information about
     532              : !> \return the number of atoms
     533              : !> \date   22.11.2010 updated (MK)
     534              : !> \author fawzi
     535              : ! **************************************************************************************************
     536       216896 :    FUNCTION force_env_get_natom(force_env) RESULT(n_atom)
     537              : 
     538              :       TYPE(force_env_type), INTENT(IN)                   :: force_env
     539              :       INTEGER                                            :: n_atom
     540              : 
     541              :       TYPE(cp_subsys_type), POINTER                      :: subsys
     542              : 
     543              :       n_atom = 0
     544       108448 :       NULLIFY (subsys)
     545       108448 :       CALL force_env_get(force_env, subsys=subsys)
     546       108448 :       CALL cp_subsys_get(subsys, natom=n_atom)
     547              : 
     548       108448 :    END FUNCTION force_env_get_natom
     549              : 
     550              : ! **************************************************************************************************
     551              : !> \brief returns the number of particles in a force environment
     552              : !> \param force_env the force_env you what information about
     553              : !> \return the number of particles
     554              : !> \date   22.11.2010 (MK)
     555              : !> \author Matthias Krack
     556              : ! **************************************************************************************************
     557        29078 :    FUNCTION force_env_get_nparticle(force_env) RESULT(n_particle)
     558              : 
     559              :       TYPE(force_env_type), INTENT(IN)                   :: force_env
     560              :       INTEGER                                            :: n_particle
     561              : 
     562              :       TYPE(cp_subsys_type), POINTER                      :: subsys
     563              : 
     564              :       n_particle = 0
     565        14539 :       NULLIFY (subsys)
     566        14539 :       CALL force_env_get(force_env, subsys=subsys)
     567        14539 :       CALL cp_subsys_get(subsys, nparticle=n_particle)
     568              : 
     569        14539 :    END FUNCTION force_env_get_nparticle
     570              : 
     571              : ! **************************************************************************************************
     572              : !> \brief returns the particle forces in a dimension(*) array
     573              : !> \param force_env the force_env you want to get the forces
     574              : !> \param frc the array of the forces
     575              : !> \param n ...
     576              : !> \date   22.11.2010 Creation
     577              : !> \author Matthias Krack
     578              : ! **************************************************************************************************
     579         9238 :    SUBROUTINE force_env_get_frc(force_env, frc, n)
     580              : 
     581              :       TYPE(force_env_type), INTENT(IN)                   :: force_env
     582              :       REAL(KIND=dp), DIMENSION(*), INTENT(OUT)           :: frc
     583              :       INTEGER, INTENT(IN)                                :: n
     584              : 
     585              :       CHARACTER(LEN=*), PARAMETER                        :: routineN = 'force_env_get_frc'
     586              : 
     587              :       INTEGER                                            :: handle
     588              :       TYPE(cp_subsys_type), POINTER                      :: subsys
     589              : 
     590         9238 :       CALL timeset(routineN, handle)
     591         9238 :       CPASSERT(force_env%ref_count > 0)
     592         9238 :       CALL force_env_get(force_env, subsys=subsys)
     593         9238 :       CALL pack_subsys_particles(subsys=subsys, f=frc(1:n))
     594         9238 :       CALL timestop(handle)
     595              : 
     596         9238 :    END SUBROUTINE force_env_get_frc
     597              : 
     598              : ! **************************************************************************************************
     599              : !> \brief returns the particle positions in a dimension(*) array
     600              : !> \param force_env the force_env you want to get the positions
     601              : !> \param pos the array of the positions
     602              : !> \param n ...
     603              : !> \date   22.11.2010 updated (MK)
     604              : !> \author fawzi
     605              : ! **************************************************************************************************
     606          340 :    SUBROUTINE force_env_get_pos(force_env, pos, n)
     607              : 
     608              :       TYPE(force_env_type), INTENT(IN)                   :: force_env
     609              :       REAL(kind=dp), DIMENSION(*), INTENT(OUT)           :: pos
     610              :       INTEGER, INTENT(IN)                                :: n
     611              : 
     612              :       CHARACTER(LEN=*), PARAMETER                        :: routineN = 'force_env_get_pos'
     613              : 
     614              :       INTEGER                                            :: handle
     615              :       TYPE(cp_subsys_type), POINTER                      :: subsys
     616              : 
     617          340 :       CALL timeset(routineN, handle)
     618          340 :       CPASSERT(force_env%ref_count > 0)
     619          340 :       CALL force_env_get(force_env, subsys=subsys)
     620          340 :       CALL pack_subsys_particles(subsys=subsys, r=pos(1:n))
     621          340 :       CALL timestop(handle)
     622              : 
     623          340 :    END SUBROUTINE force_env_get_pos
     624              : 
     625              : ! **************************************************************************************************
     626              : !> \brief returns the particle velocities in a dimension(*) array
     627              : !> \param force_env the force_env you want to get the velocities
     628              : !> \param vel the array of the velocities
     629              : !> \param n ...
     630              : !> \date   22.11.2010 Creation (MK)
     631              : !> \author Matthias Krack
     632              : ! **************************************************************************************************
     633            0 :    SUBROUTINE force_env_get_vel(force_env, vel, n)
     634              : 
     635              :       TYPE(force_env_type), INTENT(IN)                   :: force_env
     636              :       REAL(KIND=dp), DIMENSION(*), INTENT(OUT)           :: vel
     637              :       INTEGER, INTENT(IN)                                :: n
     638              : 
     639              :       CHARACTER(LEN=*), PARAMETER                        :: routineN = 'force_env_get_vel'
     640              : 
     641              :       INTEGER                                            :: handle
     642              :       TYPE(cp_subsys_type), POINTER                      :: subsys
     643              : 
     644            0 :       CALL timeset(routineN, handle)
     645            0 :       CPASSERT(force_env%ref_count > 0)
     646            0 :       CALL force_env_get(force_env, subsys=subsys)
     647            0 :       CALL pack_subsys_particles(subsys=subsys, v=vel(1:n))
     648            0 :       CALL timestop(handle)
     649              : 
     650            0 :    END SUBROUTINE force_env_get_vel
     651              : 
     652              : ! **************************************************************************************************
     653              : !> \brief changes some attributes of the force_env
     654              : !> \param force_env the force environment where the cell should be changed
     655              : !> \param meta_env the new meta environment
     656              : !> \param fp_env ...
     657              : !> \param force_env_section ...
     658              : !> \param method_name_id ...
     659              : !> \param additional_potential ...
     660              : !> \par History
     661              : !>      09.2003 created [fawzi]
     662              : !> \author Fawzi Mohamed
     663              : ! **************************************************************************************************
     664       216300 :    SUBROUTINE force_env_set(force_env, meta_env, fp_env, force_env_section, &
     665              :                             method_name_id, additional_potential)
     666              : 
     667              :       TYPE(force_env_type), INTENT(INOUT)                :: force_env
     668              :       TYPE(meta_env_type), OPTIONAL, POINTER             :: meta_env
     669              :       TYPE(fp_type), OPTIONAL, POINTER                   :: fp_env
     670              :       TYPE(section_vals_type), OPTIONAL, POINTER         :: force_env_section
     671              :       INTEGER, OPTIONAL                                  :: method_name_id
     672              :       REAL(KIND=dp), INTENT(IN), OPTIONAL                :: additional_potential
     673              : 
     674       216300 :       CPASSERT(force_env%ref_count > 0)
     675       216300 :       IF (PRESENT(meta_env)) THEN
     676         9315 :          IF (ASSOCIATED(force_env%meta_env)) THEN
     677            0 :             CALL meta_env_release(force_env%meta_env)
     678            0 :             DEALLOCATE (force_env%meta_env)
     679              :          END IF
     680         9315 :          force_env%meta_env => meta_env
     681              :       END IF
     682       216300 :       IF (PRESENT(fp_env)) THEN
     683         9315 :          IF (ASSOCIATED(force_env%fp_env)) CALL fp_env_release(force_env%fp_env)
     684         9315 :          force_env%fp_env => fp_env
     685              :       END IF
     686       216300 :       IF (PRESENT(force_env_section)) THEN
     687            0 :          IF (ASSOCIATED(force_env_section)) THEN
     688            0 :             CALL section_vals_retain(force_env_section)
     689            0 :             CALL section_vals_release(force_env%force_env_section)
     690            0 :             force_env%force_env_section => force_env_section
     691              :          END IF
     692              :       END IF
     693       216300 :       IF (PRESENT(additional_potential)) THEN
     694       197670 :          force_env%additional_potential = additional_potential
     695              :       END IF
     696       216300 :       IF (PRESENT(method_name_id)) THEN
     697            0 :          force_env%method_name_id = method_name_id
     698              :       END IF
     699              : 
     700       216300 :    END SUBROUTINE force_env_set
     701              : 
     702              : ! **************************************************************************************************
     703              : !> \brief returns the order of the multiple force_env
     704              : !> \param force_env_sections ...
     705              : !> \param root_section ...
     706              : !> \param i_force_eval ...
     707              : !> \param nforce_eval ...
     708              : !> \author teo
     709              : ! **************************************************************************************************
     710        28776 :    SUBROUTINE multiple_fe_list(force_env_sections, root_section, i_force_eval, nforce_eval)
     711              : 
     712              :       TYPE(section_vals_type), INTENT(IN)                :: force_env_sections, root_section
     713              :       INTEGER, DIMENSION(:), POINTER                     :: i_force_eval
     714              :       INTEGER                                            :: nforce_eval
     715              : 
     716              :       INTEGER                                            :: iforce_eval, main_force_eval
     717        28776 :       INTEGER, DIMENSION(:), POINTER                     :: my_i_force_eval
     718              : 
     719              : ! Let's treat the case of Multiple force_eval
     720              : 
     721        28776 :       CALL section_vals_get(force_env_sections, n_repetition=nforce_eval)
     722              :       CALL section_vals_val_get(root_section, "MULTIPLE_FORCE_EVALS%FORCE_EVAL_ORDER", &
     723        28776 :                                 i_vals=my_i_force_eval)
     724        86071 :       ALLOCATE (i_force_eval(nforce_eval))
     725        28776 :       IF (nforce_eval > 0) THEN
     726        28519 :          IF (nforce_eval == SIZE(my_i_force_eval)) THEN
     727       113298 :             i_force_eval = my_i_force_eval
     728              :          ELSE
     729              :             ! The difference in the amount of defined force_env MUST be one..
     730          261 :             CPASSERT(nforce_eval - SIZE(my_i_force_eval) == 1)
     731          271 :             DO iforce_eval = 1, nforce_eval
     732          928 :                IF (ANY(my_i_force_eval == iforce_eval)) CYCLE
     733              :                main_force_eval = iforce_eval
     734           10 :                EXIT
     735              :             END DO
     736          261 :             i_force_eval(1) = main_force_eval
     737         1826 :             i_force_eval(2:nforce_eval) = my_i_force_eval
     738              :          END IF
     739              :       END IF
     740              : 
     741        28776 :    END SUBROUTINE multiple_fe_list
     742              : 
     743            0 : END MODULE force_env_types
        

Generated by: LCOV version 2.0-1