LCOV - code coverage report
Current view: top level - src - force_env_types.F (source / functions) Hit Total Coverage
Test: CP2K Regtests (git:2fce0f8) Lines: 209 233 89.7 %
Date: 2024-12-21 06:28:57 Functions: 9 12 75.0 %

          Line data    Source code
       1             : !--------------------------------------------------------------------------------------------------!
       2             : !   CP2K: A general program to perform molecular dynamics simulations                              !
       3             : !   Copyright 2000-2024 CP2K developers group <https://cp2k.org>                                   !
       4             : !                                                                                                  !
       5             : !   SPDX-License-Identifier: GPL-2.0-or-later                                                      !
       6             : !--------------------------------------------------------------------------------------------------!
       7             : 
       8             : ! **************************************************************************************************
       9             : !> \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       13273 :    SUBROUTINE force_env_retain(force_env)
     190             :       TYPE(force_env_type), POINTER                      :: force_env
     191             : 
     192       13273 :       CPASSERT(ASSOCIATED(force_env))
     193       13273 :       CPASSERT(force_env%ref_count > 0)
     194       13273 :       force_env%ref_count = force_env%ref_count + 1
     195       13273 :    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       22838 :    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       22838 :       IF (ASSOCIATED(force_env)) THEN
     213       22838 :          CPASSERT(force_env%ref_count > 0)
     214       22838 :          force_env%ref_count = force_env%ref_count - 1
     215       22838 :          IF (force_env%ref_count == 0) THEN
     216             :             ! Deallocate SUB_FORCE_ENV
     217        9565 :             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       11810 :             SELECT CASE (force_env%in_use)
     242             :             CASE (use_fist_force)
     243        2245 :                CALL fist_env_release(force_env%fist_env)
     244        2245 :                DEALLOCATE (force_env%fist_env)
     245             :             CASE (use_qs_force)
     246        6800 :                CALL qs_env_release(force_env%qs_env)
     247        6800 :                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        9565 :                DEALLOCATE (force_env%ipi_env)
     267             :             END SELECT
     268        9565 :             CALL globenv_release(force_env%globenv)
     269        9565 :             CALL mp_para_env_release(force_env%para_env)
     270             :             ! Not deallocated
     271        9565 :             CPASSERT(.NOT. ASSOCIATED(force_env%fist_env))
     272        9565 :             CPASSERT(.NOT. ASSOCIATED(force_env%qs_env))
     273        9565 :             CPASSERT(.NOT. ASSOCIATED(force_env%eip_env))
     274        9565 :             CPASSERT(.NOT. ASSOCIATED(force_env%pwdft_env))
     275        9565 :             CPASSERT(.NOT. ASSOCIATED(force_env%mixed_env))
     276        9565 :             CPASSERT(.NOT. ASSOCIATED(force_env%nnp_env))
     277        9565 :             CPASSERT(.NOT. ASSOCIATED(force_env%embed_env))
     278        9565 :             CPASSERT(.NOT. ASSOCIATED(force_env%ipi_env))
     279        9565 :             IF (ASSOCIATED(force_env%meta_env)) THEN
     280         150 :                CALL meta_env_release(force_env%meta_env)
     281         150 :                DEALLOCATE (force_env%meta_env)
     282             :             END IF
     283        9565 :             IF (ASSOCIATED(force_env%fp_env)) THEN
     284        9251 :                CALL fp_env_release(force_env%fp_env)
     285        9251 :                DEALLOCATE (force_env%fp_env)
     286             :             END IF
     287        9565 :             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        9565 :             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        9565 :             CALL section_vals_release(force_env%force_env_section)
     296        9565 :             CALL section_vals_release(force_env%root_section)
     297        9565 :             DEALLOCATE (force_env)
     298             :          END IF
     299             :       END IF
     300       22838 :       NULLIFY (force_env)
     301       22838 :    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     2165758 :    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     2165758 :       NULLIFY (subsys_tmp)
     377             : 
     378     2165758 :       CPASSERT(force_env%ref_count > 0)
     379             : 
     380     2459574 :       SELECT CASE (force_env%in_use)
     381             :       CASE (use_qs_force)
     382      293816 :          CPASSERT(ASSOCIATED(force_env%qs_env))
     383      293816 :          CPASSERT(.NOT. PRESENT(fist_env))
     384      293816 :          CPASSERT(.NOT. PRESENT(eip_env))
     385      293816 :          CPASSERT(.NOT. PRESENT(pwdft_env))
     386      293816 :          CPASSERT(.NOT. PRESENT(ipi_env))
     387             :          CALL get_qs_env(force_env%qs_env, &
     388             :                          energy=qs_energy, &
     389             :                          input=input, &
     390      293816 :                          cp_subsys=subsys)
     391      293816 :          IF (PRESENT(potential_energy)) potential_energy = qs_energy%total
     392      293816 :          CPASSERT(.NOT. PRESENT(kinetic_energy))
     393             :       CASE (use_fist_force)
     394     1787163 :          CPASSERT(ASSOCIATED(force_env%fist_env))
     395     1787163 :          CPASSERT(.NOT. PRESENT(input))
     396             :          CALL fist_env_get(force_env%fist_env, &
     397             :                            thermo=thermo, &
     398     1787163 :                            subsys=subsys)
     399     1787163 :          IF (PRESENT(potential_energy)) potential_energy = thermo%pot
     400     1787163 :          IF (PRESENT(kinetic_energy)) kinetic_energy = thermo%kin
     401     1787163 :          IF (PRESENT(kinetic_shell)) kinetic_shell = thermo%kin_shell
     402     1787163 :          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     2172136 :          CPABORT("unknown in_use flag value ")
     464             :       END SELECT
     465             : 
     466     2165758 :       IF (PRESENT(force_env_section)) force_env_section => force_env%force_env_section
     467     2165758 :       IF (PRESENT(in_use)) in_use = force_env%in_use
     468     2165758 :       IF (PRESENT(method_name_id)) method_name_id = force_env%method_name_id
     469     2165758 :       IF (PRESENT(fist_env)) THEN
     470          14 :          fist_env => force_env%fist_env
     471             :       END IF
     472     2165758 :       IF (PRESENT(qs_env)) THEN
     473       25145 :          qs_env => force_env%qs_env
     474             :       END IF
     475     2165758 :       IF (PRESENT(eip_env)) THEN
     476           0 :          eip_env => force_env%eip_env
     477             :       END IF
     478     2165758 :       IF (PRESENT(pwdft_env)) THEN
     479           0 :          pwdft_env => force_env%pwdft_env
     480             :       END IF
     481     2165758 :       IF (PRESENT(nnp_env)) THEN
     482           0 :          nnp_env => force_env%nnp_env
     483             :       END IF
     484     2165758 :       IF (PRESENT(ipi_env)) THEN
     485           0 :          ipi_env => force_env%ipi_env
     486             :       END IF
     487     2165758 :       IF (PRESENT(para_env)) para_env => force_env%para_env
     488             :       ! adjust the total energy for the metadynamics
     489     2165758 :       IF (ASSOCIATED(force_env%meta_env)) THEN
     490      425538 :          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       27576 :                                force_env%meta_env%hills_env%energy
     495             :          END IF
     496      425538 :          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     2165758 :       IF (ASSOCIATED(force_env%fp_env) .AND. PRESENT(potential_energy)) THEN
     502      196150 :          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      202017 :       IF (PRESENT(potential_energy)) THEN
     507      197678 :          potential_energy = potential_energy + force_env%additional_potential
     508             :       END IF
     509     2165758 :       IF (PRESENT(additional_potential)) THEN
     510       99252 :          additional_potential = force_env%additional_potential
     511             :       END IF
     512     2165758 :       IF (PRESENT(cell)) THEN
     513      527705 :          CALL force_env_get(force_env, subsys=subsys_tmp)
     514      527705 :          CALL cp_subsys_get(subsys_tmp, cell=cell)
     515             :       END IF
     516     2165758 :       IF (PRESENT(fp_env)) fp_env => force_env%fp_env
     517     2165758 :       IF (PRESENT(meta_env)) meta_env => force_env%meta_env
     518     2165758 :       IF (PRESENT(sub_force_env)) sub_force_env => force_env%sub_force_env
     519     2165758 :       IF (PRESENT(qmmm_env)) qmmm_env => force_env%qmmm_env
     520     2165758 :       IF (PRESENT(qmmmx_env)) qmmmx_env => force_env%qmmmx_env
     521     2165758 :       IF (PRESENT(mixed_env)) mixed_env => force_env%mixed_env
     522     2165758 :       IF (PRESENT(embed_env)) embed_env => force_env%embed_env
     523     2165758 :       IF (PRESENT(ipi_env)) ipi_env => force_env%ipi_env
     524     2165758 :       IF (PRESENT(globenv)) globenv => force_env%globenv
     525     2165758 :       IF (PRESENT(root_section)) root_section => force_env%root_section
     526             : 
     527     2165758 :    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      217416 :    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      108708 :       NULLIFY (subsys)
     545      108708 :       CALL force_env_get(force_env, subsys=subsys)
     546      108708 :       CALL cp_subsys_get(subsys, natom=n_atom)
     547             : 
     548      108708 :    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       27948 :    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       13974 :       NULLIFY (subsys)
     566       13974 :       CALL force_env_get(force_env, subsys=subsys)
     567       13974 :       CALL cp_subsys_get(subsys, nparticle=n_particle)
     568             : 
     569       13974 :    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      217506 :    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      217506 :       CPASSERT(force_env%ref_count > 0)
     675      217506 :       IF (PRESENT(meta_env)) THEN
     676        9251 :          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        9251 :          force_env%meta_env => meta_env
     681             :       END IF
     682      217506 :       IF (PRESENT(fp_env)) THEN
     683        9251 :          IF (ASSOCIATED(force_env%fp_env)) CALL fp_env_release(force_env%fp_env)
     684        9251 :          force_env%fp_env => fp_env
     685             :       END IF
     686      217506 :       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      217506 :       IF (PRESENT(additional_potential)) THEN
     694      199004 :          force_env%additional_potential = additional_potential
     695             :       END IF
     696      217506 :       IF (PRESENT(method_name_id)) THEN
     697           0 :          force_env%method_name_id = method_name_id
     698             :       END IF
     699             : 
     700      217506 :    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       28624 :    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       28624 :       INTEGER, DIMENSION(:), POINTER                     :: my_i_force_eval
     718             : 
     719             : ! Let's treat the case of Multiple force_eval
     720             : 
     721       28624 :       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       28624 :                                 i_vals=my_i_force_eval)
     724       85615 :       ALLOCATE (i_force_eval(nforce_eval))
     725       28624 :       IF (nforce_eval > 0) THEN
     726       28367 :          IF (nforce_eval == SIZE(my_i_force_eval)) THEN
     727      112690 :             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       28624 :    END SUBROUTINE multiple_fe_list
     742             : 
     743           0 : END MODULE force_env_types

Generated by: LCOV version 1.15