LCOV - code coverage report
Current view: top level - src - fist_nonbond_env_types.F (source / functions) Hit Total Coverage
Test: CP2K Regtests (git:32ddf85) Lines: 220 233 94.4 %
Date: 2025-05-17 08:08:58 Functions: 5 14 35.7 %

          Line data    Source code
       1             : !--------------------------------------------------------------------------------------------------!
       2             : !   CP2K: A general program to perform molecular dynamics simulations                              !
       3             : !   Copyright 2000-2025 CP2K developers group <https://cp2k.org>                                   !
       4             : !                                                                                                  !
       5             : !   SPDX-License-Identifier: GPL-2.0-or-later                                                      !
       6             : !--------------------------------------------------------------------------------------------------!
       7             : 
       8             : ! **************************************************************************************************
       9             : !> \par History
      10             : !>      none
      11             : !> \author HAF
      12             : ! **************************************************************************************************
      13             : MODULE fist_nonbond_env_types
      14             :    USE ace_wrapper,                     ONLY: ace_model_release,&
      15             :                                               ace_model_type
      16             :    USE atomic_kind_types,               ONLY: atomic_kind_type
      17             :    USE cell_types,                      ONLY: cell_release,&
      18             :                                               cell_type
      19             :    USE deepmd_wrapper,                  ONLY: deepmd_model_release,&
      20             :                                               deepmd_model_type
      21             :    USE fist_neighbor_list_types,        ONLY: fist_neighbor_deallocate,&
      22             :                                               fist_neighbor_type
      23             :    USE kinds,                           ONLY: default_string_length,&
      24             :                                               dp
      25             :    USE pair_potential_types,            ONLY: ace_type,&
      26             :                                               gal21_type,&
      27             :                                               gal_type,&
      28             :                                               nequip_type,&
      29             :                                               pair_potential_pp_release,&
      30             :                                               pair_potential_pp_type,&
      31             :                                               siepmann_type,&
      32             :                                               tersoff_type
      33             :    USE torch_api,                       ONLY: torch_model_release,&
      34             :                                               torch_model_type
      35             : #include "./base/base_uses.f90"
      36             : 
      37             :    IMPLICIT NONE
      38             :    PRIVATE
      39             : 
      40             :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'fist_nonbond_env_types'
      41             :    PUBLIC :: fist_nonbond_env_type, fist_nonbond_env_set, &
      42             :              fist_nonbond_env_get, fist_nonbond_env_create, &
      43             :              fist_nonbond_env_release, pos_type, eam_type, &
      44             :              quip_data_type, nequip_data_type, allegro_data_type, &
      45             :              deepmd_data_type, ace_data_type
      46             : 
      47             : ! **************************************************************************************************
      48             :    TYPE pos_type
      49             :       REAL(KIND=dp) :: r(3) = 0.0_dp
      50             :    END TYPE
      51             : 
      52             :    TYPE eam_type
      53             :       REAL(KIND=dp) :: f_embed = 0.0_dp
      54             :       REAL(KIND=dp) :: rho = 0.0_dp
      55             :    END TYPE
      56             : 
      57             :    TYPE quip_data_type
      58             :       INTEGER, POINTER        :: use_indices(:) => NULL()
      59             :       REAL(KIND=dp), POINTER  :: force(:, :) => NULL()
      60             :       REAL(KIND=dp)           :: virial(3, 3) = 0.0_dp
      61             :    END TYPE
      62             : 
      63             :    TYPE nequip_data_type
      64             :       INTEGER, POINTER        :: use_indices(:) => NULL()
      65             :       REAL(KIND=dp), POINTER  :: force(:, :) => NULL()
      66             :       REAL(KIND=dp)           :: virial(3, 3) = 0.0_dp
      67             :       TYPE(torch_model_type)  :: model
      68             :    END TYPE
      69             : 
      70             :    TYPE allegro_data_type
      71             :       INTEGER, POINTER        :: use_indices(:) => NULL()
      72             :       REAL(KIND=dp), POINTER  :: force(:, :) => NULL()
      73             :       REAL(KIND=dp)           :: virial(3, 3) = 0.0_dp
      74             :       TYPE(torch_model_type)  :: model
      75             :    END TYPE
      76             : 
      77             :    TYPE deepmd_data_type
      78             :       INTEGER, POINTER        :: use_indices(:) => NULL()
      79             :       REAL(KIND=dp), POINTER  :: force(:, :) => NULL()
      80             :       REAL(KIND=dp)           :: virial(3, 3) = 0.0_dp
      81             :       TYPE(deepmd_model_type) :: model
      82             :    END TYPE
      83             : 
      84             :    TYPE ace_data_type
      85             :       INTEGER, ALLOCATABLE    :: use_indices(:)
      86             :       INTEGER, ALLOCATABLE    :: inverse_index_map(:)
      87             :       INTEGER                 :: natom = 0
      88             :       INTEGER                 :: nghost = 0
      89             :       INTEGER                 :: refupdate = 0
      90             :       INTEGER                 :: nei = 0
      91             :       INTEGER, ALLOCATABLE    :: uctype(:)
      92             :       INTEGER, ALLOCATABLE    :: attype(:)
      93             :       INTEGER, ALLOCATABLE    :: origin(:)
      94             :       INTEGER, ALLOCATABLE    :: shift(:, :)
      95             :       INTEGER, ALLOCATABLE    :: neiat(:)
      96             :       INTEGER, ALLOCATABLE    :: nlist(:)
      97             :       REAL(KIND=dp), ALLOCATABLE  :: force(:, :)
      98             :       REAL(KIND=dp), ALLOCATABLE  :: atpos(:, :)
      99             :       REAL(KIND=dp)           :: virial(3, 3) = 0.0_dp
     100             :       TYPE(ace_model_type)    :: model
     101             :    END TYPE
     102             : 
     103             : ! **************************************************************************************************
     104             :    TYPE fist_nonbond_env_type
     105             :       INTEGER                                    :: natom_types = -1
     106             :       INTEGER                                    :: counter = -1
     107             :       INTEGER                                    :: last_update = -1
     108             :       INTEGER                                    :: num_update = -1
     109             :       LOGICAL                                    :: do_nonbonded = .FALSE.
     110             :       LOGICAL                                    :: do_electrostatics = .FALSE.
     111             :       LOGICAL                                    :: shift_cutoff = .FALSE.
     112             :       CHARACTER(len=default_string_length)       :: unit_type = ""
     113             :       REAL(KIND=dp)                              :: lup = 0.0_dp
     114             :       REAL(KIND=dp)                              :: aup = 0.0_dp
     115             :       REAL(KIND=dp)                              :: ei_scale14 = 0.0_dp
     116             :       REAL(KIND=dp)                              :: vdw_scale14 = 0.0_dp
     117             :       REAL(KIND=dp)                              :: long_range_correction = 0.0_dp
     118             :       REAL(KIND=dp), DIMENSION(:, :), POINTER    :: rlist_cut => NULL()
     119             :       REAL(KIND=dp), DIMENSION(:, :), POINTER    :: rlist_lowsq => NULL()
     120             :       REAL(KIND=dp), DIMENSION(:, :), POINTER    :: ij_kind_full_fac => NULL()
     121             :       REAL(KIND=dp), DIMENSION(:), POINTER       :: charges => NULL()
     122             :       TYPE(fist_neighbor_type), POINTER          :: nonbonded => NULL()
     123             :       TYPE(pair_potential_pp_type), POINTER      :: potparm14 => NULL()
     124             :       TYPE(pair_potential_pp_type), POINTER      :: potparm => NULL()
     125             :       TYPE(cell_type), POINTER                   :: cell_last_update => NULL()
     126             :       TYPE(pos_type), DIMENSION(:), POINTER      :: r_last_update => NULL()
     127             :       TYPE(pos_type), DIMENSION(:), POINTER      :: r_last_update_pbc => NULL()
     128             :       TYPE(pos_type), DIMENSION(:), POINTER      :: rshell_last_update_pbc => NULL()
     129             :       TYPE(pos_type), DIMENSION(:), POINTER      :: rcore_last_update_pbc => NULL()
     130             :       TYPE(eam_type), DIMENSION(:), POINTER      :: eam_data => NULL()
     131             :       TYPE(quip_data_type), POINTER              :: quip_data => NULL()
     132             :       TYPE(deepmd_data_type), POINTER            :: deepmd_data => NULL()
     133             :       TYPE(ace_data_type), POINTER               :: ace_data => NULL()
     134             :       TYPE(nequip_data_type), POINTER            :: nequip_data => NULL()
     135             :       TYPE(allegro_data_type), POINTER           :: allegro_data => NULL()
     136             :    END TYPE fist_nonbond_env_type
     137             : 
     138             : CONTAINS
     139             : 
     140             : ! **************************************************************************************************
     141             : !> \brief sets a fist_nonbond_env
     142             : !> \param fist_nonbond_env the object to create
     143             : !> \param potparm14 ...
     144             : !> \param potparm ...
     145             : !> \param nonbonded ...
     146             : !> \param rlist_cut ...
     147             : !> \param rlist_lowsq ...
     148             : !> \param aup ...
     149             : !> \param lup ...
     150             : !> \param ei_scale14 ...
     151             : !> \param vdw_scale14 ...
     152             : !> \param shift_cutoff ...
     153             : !> \param do_electrostatics ...
     154             : !> \param r_last_update ...
     155             : !> \param r_last_update_pbc ...
     156             : !> \param rshell_last_update_pbc ...
     157             : !> \param rcore_last_update_pbc ...
     158             : !> \param cell_last_update ...
     159             : !> \param num_update ...
     160             : !> \param last_update ...
     161             : !> \param counter ...
     162             : !> \param natom_types ...
     163             : !> \param long_range_correction ...
     164             : !> \param ij_kind_full_fac ...
     165             : !> \param eam_data ...
     166             : !> \param quip_data ...
     167             : !> \param nequip_data ...
     168             : !> \param allegro_data ...
     169             : !> \param deepmd_data ...
     170             : !> \param ace_data ...
     171             : !> \param charges ...
     172             : !> \par History
     173             : !>      12.2002 created [fawzi]
     174             : !> \author Fawzi Mohamed
     175             : ! **************************************************************************************************
     176      546670 :    SUBROUTINE fist_nonbond_env_get(fist_nonbond_env, potparm14, potparm, &
     177             :                                    nonbonded, rlist_cut, rlist_lowsq, aup, lup, ei_scale14, vdw_scale14, &
     178             :                                    shift_cutoff, do_electrostatics, r_last_update, r_last_update_pbc, rshell_last_update_pbc, &
     179             :                                    rcore_last_update_pbc, cell_last_update, num_update, last_update, &
     180             :                                    counter, natom_types, long_range_correction, ij_kind_full_fac, eam_data, &
     181             :                                    quip_data, nequip_data, allegro_data, deepmd_data, ace_data, charges)
     182             : 
     183             :       TYPE(fist_nonbond_env_type), INTENT(IN)            :: fist_nonbond_env
     184             :       TYPE(pair_potential_pp_type), OPTIONAL, POINTER    :: potparm14, potparm
     185             :       TYPE(fist_neighbor_type), OPTIONAL, POINTER        :: nonbonded
     186             :       REAL(KIND=dp), DIMENSION(:, :), OPTIONAL, POINTER  :: rlist_cut, rlist_lowsq
     187             :       REAL(KIND=dp), OPTIONAL                            :: aup, lup, ei_scale14, vdw_scale14
     188             :       LOGICAL, INTENT(OUT), OPTIONAL                     :: shift_cutoff, do_electrostatics
     189             :       TYPE(pos_type), DIMENSION(:), OPTIONAL, POINTER    :: r_last_update, r_last_update_pbc, &
     190             :                                                             rshell_last_update_pbc, &
     191             :                                                             rcore_last_update_pbc
     192             :       TYPE(cell_type), OPTIONAL, POINTER                 :: cell_last_update
     193             :       INTEGER, OPTIONAL                                  :: num_update, last_update, counter, &
     194             :                                                             natom_types
     195             :       REAL(KIND=dp), OPTIONAL                            :: long_range_correction
     196             :       REAL(KIND=dp), DIMENSION(:, :), OPTIONAL, POINTER  :: ij_kind_full_fac
     197             :       TYPE(eam_type), DIMENSION(:), OPTIONAL, POINTER    :: eam_data
     198             :       TYPE(quip_data_type), OPTIONAL, POINTER            :: quip_data
     199             :       TYPE(nequip_data_type), OPTIONAL, POINTER          :: nequip_data
     200             :       TYPE(allegro_data_type), OPTIONAL, POINTER         :: allegro_data
     201             :       TYPE(deepmd_data_type), OPTIONAL, POINTER          :: deepmd_data
     202             :       TYPE(ace_data_type), OPTIONAL, POINTER             :: ace_data
     203             :       REAL(KIND=dp), DIMENSION(:), OPTIONAL, POINTER     :: charges
     204             : 
     205      546670 :       IF (PRESENT(charges)) charges => fist_nonbond_env%charges
     206      546670 :       IF (PRESENT(potparm14)) potparm14 => fist_nonbond_env%potparm14
     207      546670 :       IF (PRESENT(eam_data)) eam_data => fist_nonbond_env%eam_data
     208      546670 :       IF (PRESENT(quip_data)) quip_data => fist_nonbond_env%quip_data
     209      546670 :       IF (PRESENT(nequip_data)) nequip_data => fist_nonbond_env%nequip_data
     210      546670 :       IF (PRESENT(allegro_data)) allegro_data => fist_nonbond_env%allegro_data
     211      546670 :       IF (PRESENT(deepmd_data)) deepmd_data => fist_nonbond_env%deepmd_data
     212      546670 :       IF (PRESENT(ace_data)) ace_data => fist_nonbond_env%ace_data
     213      546670 :       IF (PRESENT(potparm)) potparm => fist_nonbond_env%potparm
     214      546670 :       IF (PRESENT(rlist_cut)) rlist_cut => fist_nonbond_env%rlist_cut
     215      546670 :       IF (PRESENT(rlist_lowsq)) rlist_lowsq => fist_nonbond_env%rlist_lowsq
     216      546670 :       IF (PRESENT(ij_kind_full_fac)) ij_kind_full_fac => fist_nonbond_env%ij_kind_full_fac
     217      546670 :       IF (PRESENT(nonbonded)) nonbonded => fist_nonbond_env%nonbonded
     218      546670 :       IF (PRESENT(r_last_update)) &
     219      249398 :          r_last_update => fist_nonbond_env%r_last_update
     220      546670 :       IF (PRESENT(r_last_update_pbc)) &
     221      402954 :          r_last_update_pbc => fist_nonbond_env%r_last_update_pbc
     222      546670 :       IF (PRESENT(rshell_last_update_pbc)) &
     223      164396 :          rshell_last_update_pbc => fist_nonbond_env%rshell_last_update_pbc
     224      546670 :       IF (PRESENT(rcore_last_update_pbc)) &
     225      164396 :          rcore_last_update_pbc => fist_nonbond_env%rcore_last_update_pbc
     226      546670 :       IF (PRESENT(cell_last_update)) &
     227       83106 :          cell_last_update => fist_nonbond_env%cell_last_update
     228      546670 :       IF (PRESENT(lup)) lup = fist_nonbond_env%lup
     229      546670 :       IF (PRESENT(aup)) aup = fist_nonbond_env%aup
     230      546670 :       IF (PRESENT(ei_scale14)) ei_scale14 = fist_nonbond_env%ei_scale14
     231      546670 :       IF (PRESENT(vdw_scale14)) vdw_scale14 = fist_nonbond_env%vdw_scale14
     232      546670 :       IF (PRESENT(shift_cutoff)) &
     233           0 :          shift_cutoff = fist_nonbond_env%shift_cutoff
     234      546670 :       IF (PRESENT(do_electrostatics)) do_electrostatics = fist_nonbond_env%do_electrostatics
     235      546670 :       IF (PRESENT(natom_types)) natom_types = fist_nonbond_env%natom_types
     236      546670 :       IF (PRESENT(counter)) counter = fist_nonbond_env%counter
     237      546670 :       IF (PRESENT(last_update)) last_update = fist_nonbond_env%last_update
     238      546670 :       IF (PRESENT(num_update)) num_update = fist_nonbond_env%num_update
     239      546670 :       IF (PRESENT(long_range_correction)) &
     240           0 :          long_range_correction = fist_nonbond_env%long_range_correction
     241      546670 :    END SUBROUTINE fist_nonbond_env_get
     242             : 
     243             : ! **************************************************************************************************
     244             : !> \brief sets a fist_nonbond_env
     245             : !> \param fist_nonbond_env the object to create
     246             : !> \param potparm14 ...
     247             : !> \param potparm ...
     248             : !> \param rlist_cut ...
     249             : !> \param rlist_lowsq ...
     250             : !> \param nonbonded ...
     251             : !> \param aup ...
     252             : !> \param lup ...
     253             : !> \param ei_scale14 ...
     254             : !> \param vdw_scale14 ...
     255             : !> \param shift_cutoff ...
     256             : !> \param do_electrostatics ...
     257             : !> \param r_last_update ...
     258             : !> \param r_last_update_pbc ...
     259             : !> \param rshell_last_update_pbc ...
     260             : !> \param rcore_last_update_pbc ...
     261             : !> \param cell_last_update ...
     262             : !> \param num_update ...
     263             : !> \param last_update ...
     264             : !> \param counter ...
     265             : !> \param natom_types ...
     266             : !> \param long_range_correction ...
     267             : !> \param eam_data ...
     268             : !> \param quip_data ...
     269             : !> \param nequip_data ...
     270             : !> \param allegro_data ...
     271             : !> \param deepmd_data ...
     272             : !> \param ace_data ...
     273             : !> \param charges ...
     274             : !> \par History
     275             : !>      12.2002 created [fawzi]
     276             : !> \author Fawzi Mohamed
     277             : ! **************************************************************************************************
     278       97019 :    SUBROUTINE fist_nonbond_env_set(fist_nonbond_env, potparm14, potparm, &
     279             :                                    rlist_cut, rlist_lowsq, nonbonded, aup, lup, ei_scale14, vdw_scale14, &
     280             :                                    shift_cutoff, do_electrostatics, r_last_update, r_last_update_pbc, rshell_last_update_pbc, &
     281             :                                    rcore_last_update_pbc, cell_last_update, num_update, last_update, &
     282             :                                    counter, natom_types, long_range_correction, eam_data, quip_data, &
     283             :                                    nequip_data, allegro_data, deepmd_data, ace_data, charges)
     284             : 
     285             :       TYPE(fist_nonbond_env_type), INTENT(INOUT)         :: fist_nonbond_env
     286             :       TYPE(pair_potential_pp_type), OPTIONAL, POINTER    :: potparm14, potparm
     287             :       REAL(KIND=dp), DIMENSION(:, :), OPTIONAL, POINTER  :: rlist_cut, rlist_lowsq
     288             :       TYPE(fist_neighbor_type), OPTIONAL, POINTER        :: nonbonded
     289             :       REAL(KIND=dp), OPTIONAL                            :: aup, lup, ei_scale14, vdw_scale14
     290             :       LOGICAL, INTENT(IN), OPTIONAL                      :: shift_cutoff, do_electrostatics
     291             :       TYPE(pos_type), DIMENSION(:), OPTIONAL, POINTER    :: r_last_update, r_last_update_pbc, &
     292             :                                                             rshell_last_update_pbc, &
     293             :                                                             rcore_last_update_pbc
     294             :       TYPE(cell_type), OPTIONAL, POINTER                 :: cell_last_update
     295             :       INTEGER, OPTIONAL                                  :: num_update, last_update, counter, &
     296             :                                                             natom_types
     297             :       REAL(KIND=dp), OPTIONAL                            :: long_range_correction
     298             :       TYPE(eam_type), DIMENSION(:), OPTIONAL, POINTER    :: eam_data
     299             :       TYPE(quip_data_type), OPTIONAL, POINTER            :: quip_data
     300             :       TYPE(nequip_data_type), OPTIONAL, POINTER          :: nequip_data
     301             :       TYPE(allegro_data_type), OPTIONAL, POINTER         :: allegro_data
     302             :       TYPE(deepmd_data_type), OPTIONAL, POINTER          :: deepmd_data
     303             :       TYPE(ace_data_type), OPTIONAL, POINTER             :: ace_data
     304             :       REAL(KIND=dp), DIMENSION(:), OPTIONAL, POINTER     :: charges
     305             : 
     306       97019 :       IF (PRESENT(potparm14)) fist_nonbond_env%potparm14 => potparm14
     307       97019 :       IF (PRESENT(eam_data)) fist_nonbond_env%eam_data => eam_data
     308       97019 :       IF (PRESENT(quip_data)) fist_nonbond_env%quip_data => quip_data
     309       97019 :       IF (PRESENT(nequip_data)) fist_nonbond_env%nequip_data => nequip_data
     310       97019 :       IF (PRESENT(allegro_data)) fist_nonbond_env%allegro_data => allegro_data
     311       97019 :       IF (PRESENT(deepmd_data)) fist_nonbond_env%deepmd_data => deepmd_data
     312       97019 :       IF (PRESENT(ace_data)) fist_nonbond_env%ace_data => ace_data
     313       97019 :       IF (PRESENT(potparm)) fist_nonbond_env%potparm => potparm
     314       97019 :       IF (PRESENT(rlist_cut)) fist_nonbond_env%rlist_cut => rlist_cut
     315       97019 :       IF (PRESENT(charges)) fist_nonbond_env%charges => charges
     316       97019 :       IF (PRESENT(rlist_lowsq)) fist_nonbond_env%rlist_lowsq => rlist_lowsq
     317       97019 :       IF (PRESENT(nonbonded)) fist_nonbond_env%nonbonded => nonbonded
     318       97019 :       IF (PRESENT(r_last_update)) &
     319       11242 :          fist_nonbond_env%r_last_update => r_last_update
     320       97019 :       IF (PRESENT(r_last_update_pbc)) &
     321       11242 :          fist_nonbond_env%r_last_update_pbc => r_last_update_pbc
     322       97019 :       IF (PRESENT(rshell_last_update_pbc)) &
     323       11242 :          fist_nonbond_env%rshell_last_update_pbc => rshell_last_update_pbc
     324       97019 :       IF (PRESENT(rcore_last_update_pbc)) &
     325       11242 :          fist_nonbond_env%rcore_last_update_pbc => rcore_last_update_pbc
     326       97019 :       IF (PRESENT(cell_last_update)) &
     327       11242 :          fist_nonbond_env%cell_last_update => cell_last_update
     328       97019 :       IF (PRESENT(lup)) fist_nonbond_env%lup = lup
     329       97019 :       IF (PRESENT(aup)) fist_nonbond_env%aup = aup
     330       97019 :       IF (PRESENT(ei_scale14)) fist_nonbond_env%ei_scale14 = ei_scale14
     331       97019 :       IF (PRESENT(vdw_scale14)) fist_nonbond_env%vdw_scale14 = vdw_scale14
     332       97019 :       IF (PRESENT(shift_cutoff)) &
     333           0 :          fist_nonbond_env%shift_cutoff = shift_cutoff
     334       97019 :       IF (PRESENT(do_electrostatics)) fist_nonbond_env%do_electrostatics = do_electrostatics
     335       97019 :       IF (PRESENT(natom_types)) fist_nonbond_env%natom_types = natom_types
     336       97019 :       IF (PRESENT(counter)) fist_nonbond_env%counter = counter
     337       97019 :       IF (PRESENT(last_update)) fist_nonbond_env%last_update = last_update
     338       97019 :       IF (PRESENT(num_update)) fist_nonbond_env%num_update = num_update
     339       97019 :       IF (PRESENT(long_range_correction)) &
     340           0 :          fist_nonbond_env%long_range_correction = long_range_correction
     341       97019 :    END SUBROUTINE fist_nonbond_env_set
     342             : 
     343             : ! **************************************************************************************************
     344             : !> \brief allocates and intitializes a fist_nonbond_env
     345             : !> \param fist_nonbond_env the object to create
     346             : !> \param atomic_kind_set ...
     347             : !> \param potparm14 ...
     348             : !> \param potparm ...
     349             : !> \param do_nonbonded ...
     350             : !> \param do_electrostatics ...
     351             : !> \param verlet_skin ...
     352             : !> \param ewald_rcut ...
     353             : !> \param ei_scale14 ...
     354             : !> \param vdw_scale14 ...
     355             : !> \param shift_cutoff ...
     356             : !> \par History
     357             : !>      12.2002 created [fawzi]
     358             : !> \author Fawzi Mohamed
     359             : ! **************************************************************************************************
     360        2675 :    SUBROUTINE fist_nonbond_env_create(fist_nonbond_env, atomic_kind_set, &
     361             :                                       potparm14, potparm, do_nonbonded, do_electrostatics, verlet_skin, ewald_rcut, &
     362             :                                       ei_scale14, vdw_scale14, shift_cutoff)
     363             :       TYPE(fist_nonbond_env_type), INTENT(OUT)           :: fist_nonbond_env
     364             :       TYPE(atomic_kind_type), DIMENSION(:), POINTER      :: atomic_kind_set
     365             :       TYPE(pair_potential_pp_type), OPTIONAL, POINTER    :: potparm14, potparm
     366             :       LOGICAL, INTENT(IN)                                :: do_nonbonded, do_electrostatics
     367             :       REAL(KIND=dp), INTENT(IN)                          :: verlet_skin, ewald_rcut, ei_scale14, &
     368             :                                                             vdw_scale14
     369             :       LOGICAL, INTENT(IN)                                :: shift_cutoff
     370             : 
     371             :       NULLIFY (fist_nonbond_env%potparm14)
     372             :       NULLIFY (fist_nonbond_env%potparm)
     373             :       NULLIFY (fist_nonbond_env%rlist_cut)
     374             :       NULLIFY (fist_nonbond_env%rlist_lowsq)
     375             :       NULLIFY (fist_nonbond_env%ij_kind_full_fac)
     376             :       NULLIFY (fist_nonbond_env%nonbonded)
     377             :       NULLIFY (fist_nonbond_env%cell_last_update)
     378             :       NULLIFY (fist_nonbond_env%r_last_update)
     379             :       NULLIFY (fist_nonbond_env%r_last_update_pbc)
     380             :       NULLIFY (fist_nonbond_env%rshell_last_update_pbc)
     381             :       NULLIFY (fist_nonbond_env%rcore_last_update_pbc)
     382             :       NULLIFY (fist_nonbond_env%eam_data)
     383             :       NULLIFY (fist_nonbond_env%quip_data)
     384             :       NULLIFY (fist_nonbond_env%nequip_data)
     385             :       NULLIFY (fist_nonbond_env%allegro_data)
     386             :       NULLIFY (fist_nonbond_env%deepmd_data)
     387             :       NULLIFY (fist_nonbond_env%ace_data)
     388             :       NULLIFY (fist_nonbond_env%charges)
     389             :       CALL init_fist_nonbond_env(fist_nonbond_env, atomic_kind_set, potparm14, &
     390             :                                  potparm, do_nonbonded, do_electrostatics, verlet_skin, ewald_rcut, ei_scale14, &
     391        2675 :                                  vdw_scale14, shift_cutoff)
     392        2675 :    END SUBROUTINE fist_nonbond_env_create
     393             : 
     394             : ! **************************************************************************************************
     395             : !> \brief Purpose: Initialise the FIST nonbond environment.
     396             : !> \param fist_nonbond_env the object to create
     397             : !> \param atomic_kind_set ...
     398             : !> \param potparm14 ...
     399             : !> \param potparm ...
     400             : !> \param do_nonbonded ...
     401             : !> \param do_electrostatics ...
     402             : !> \param verlet_skin ...
     403             : !> \param ewald_rcut ...
     404             : !> \param ei_scale14 ...
     405             : !> \param vdw_scale14 ...
     406             : !> \param shift_cutoff ...
     407             : ! **************************************************************************************************
     408        2675 :    SUBROUTINE init_fist_nonbond_env(fist_nonbond_env, atomic_kind_set, &
     409             :                                     potparm14, potparm, do_nonbonded, do_electrostatics, verlet_skin, ewald_rcut, ei_scale14, &
     410             :                                     vdw_scale14, shift_cutoff)
     411             : 
     412             :       TYPE(fist_nonbond_env_type), INTENT(INOUT)         :: fist_nonbond_env
     413             :       TYPE(atomic_kind_type), DIMENSION(:), POINTER      :: atomic_kind_set
     414             :       TYPE(pair_potential_pp_type), OPTIONAL, POINTER    :: potparm14, potparm
     415             :       LOGICAL, INTENT(IN)                                :: do_nonbonded, do_electrostatics
     416             :       REAL(KIND=dp), INTENT(IN)                          :: verlet_skin, ewald_rcut, ei_scale14, &
     417             :                                                             vdw_scale14
     418             :       LOGICAL, INTENT(IN)                                :: shift_cutoff
     419             : 
     420             :       INTEGER                                            :: idim, jdim, natom_types
     421             :       LOGICAL                                            :: check, use_potparm, use_potparm14
     422             :       REAL(KIND=dp)                                      :: fac, rcut, rlow
     423             : 
     424        2675 :       use_potparm14 = PRESENT(potparm14)
     425        2675 :       IF (use_potparm14) use_potparm14 = use_potparm14 .OR. ASSOCIATED(potparm14)
     426        2675 :       use_potparm = PRESENT(potparm)
     427        2675 :       IF (use_potparm) use_potparm = use_potparm .OR. ASSOCIATED(potparm)
     428        2675 :       NULLIFY (fist_nonbond_env%nonbonded)
     429        2675 :       NULLIFY (fist_nonbond_env%r_last_update)
     430        2675 :       NULLIFY (fist_nonbond_env%r_last_update_pbc)
     431        2675 :       NULLIFY (fist_nonbond_env%rshell_last_update_pbc)
     432        2675 :       NULLIFY (fist_nonbond_env%rcore_last_update_pbc)
     433        2675 :       NULLIFY (fist_nonbond_env%cell_last_update)
     434        2675 :       NULLIFY (fist_nonbond_env%rlist_cut)
     435        2675 :       NULLIFY (fist_nonbond_env%rlist_lowsq)
     436        2675 :       NULLIFY (fist_nonbond_env%ij_kind_full_fac)
     437        2675 :       fist_nonbond_env%unit_type = "ANGSTROM"
     438        2675 :       fist_nonbond_env%do_nonbonded = do_nonbonded
     439        2675 :       fist_nonbond_env%do_electrostatics = do_electrostatics
     440        2675 :       fist_nonbond_env%lup = 0
     441        2675 :       fist_nonbond_env%aup = 0
     442        2675 :       fist_nonbond_env%ei_scale14 = ei_scale14
     443        2675 :       fist_nonbond_env%vdw_scale14 = vdw_scale14
     444        2675 :       fist_nonbond_env%shift_cutoff = shift_cutoff
     445        2675 :       fist_nonbond_env%counter = 0
     446        2675 :       fist_nonbond_env%last_update = 0
     447        2675 :       fist_nonbond_env%num_update = 0
     448        2675 :       fist_nonbond_env%long_range_correction = 0
     449        2675 :       IF (do_nonbonded) THEN
     450        2659 :          natom_types = 1
     451             :          ! Determine size of kind arrays
     452        2659 :          natom_types = SIZE(atomic_kind_set)
     453        2659 :          IF (use_potparm14) THEN
     454        2627 :             check = (SIZE(potparm14%pot, 1) == natom_types)
     455        2627 :             CPASSERT(check)
     456             :          END IF
     457        2659 :          IF (use_potparm) THEN
     458        2627 :             check = (SIZE(potparm%pot, 1) == natom_types)
     459        2627 :             CPASSERT(check)
     460             :          END IF
     461       10636 :          ALLOCATE (fist_nonbond_env%rlist_cut(natom_types, natom_types))
     462        7977 :          ALLOCATE (fist_nonbond_env%rlist_lowsq(natom_types, natom_types))
     463        7977 :          ALLOCATE (fist_nonbond_env%ij_kind_full_fac(natom_types, natom_types))
     464      518247 :          fist_nonbond_env%ij_kind_full_fac = 1.0_dp
     465       13920 :          DO idim = 1, natom_types
     466      271714 :             DO jdim = idim, natom_types
     467      269055 :                IF ((use_potparm) .OR. (use_potparm14)) THEN
     468      257714 :                   IF (use_potparm) THEN
     469      257714 :                      rcut = SQRT(potparm%pot(idim, jdim)%pot%rcutsq)
     470      257714 :                      fac = potparm%pot(idim, jdim)%pot%spl_f%rscale(1)
     471      257714 :                      rlow = fac/(potparm%pot(idim, jdim)%pot%pair_spline_data(1)%spline_data%xn)
     472             :                   ELSE
     473           0 :                      rcut = SQRT(potparm14%pot(idim, jdim)%pot%rcutsq)
     474           0 :                      fac = potparm14%pot(idim, jdim)%pot%spl_f%rscale(1)
     475           0 :                      rlow = fac/(potparm14%pot(idim, jdim)%pot%pair_spline_data(1)%spline_data%xn)
     476             :                   END IF
     477             :                   ! Warning: rlist_rcut should only be used by the neighbor list
     478             :                   ! algorithm. It is not the cutoff for the evaluation of the
     479             :                   ! interactions because rlist_rcut includes the Verlet skin.
     480      257714 :                   rcut = MAX(rcut, ewald_rcut) + verlet_skin
     481      257714 :                   fist_nonbond_env%rlist_cut(idim, jdim) = rcut
     482      257714 :                   fist_nonbond_env%rlist_cut(jdim, idim) = rcut
     483      257714 :                   rlow = rlow*(1.06_dp)**2 ! 1.06_dp in order to have 1/2 Emax_spline
     484      257714 :                   fist_nonbond_env%rlist_lowsq(idim, jdim) = rlow
     485      257714 :                   fist_nonbond_env%rlist_lowsq(jdim, idim) = rlow
     486             :                   ! In case of manybody potential the neighbor list will be full.
     487             :                   ! This means that for each atom pair (a,b) of the current types,
     488             :                   ! atom a is in the neighbor list of b and b is in the neighbor
     489             :                   ! list of a. ij_kind_full_fac is used to correct for the double
     490             :                   ! counting in the conventional pair potentials cause by this
     491             :                   ! situation.
     492      515318 :                   IF (ANY(potparm%pot(idim, jdim)%pot%type == tersoff_type)) THEN
     493             :                      ! TODO: what if 14 is not of tersoff type while the normal
     494             :                      ! nonbond is? (or the reverse). We'd better impose
     495             :                      ! consistency.
     496         118 :                      fist_nonbond_env%ij_kind_full_fac(idim, jdim) = 0.5_dp
     497             :                      fist_nonbond_env%ij_kind_full_fac(idim, jdim) = 0.5_dp
     498             :                   END IF
     499      515431 :                   IF (ANY(potparm%pot(idim, jdim)%pot%type == siepmann_type)) THEN
     500             :                      ! TODO:see tersoff_type
     501           5 :                      fist_nonbond_env%ij_kind_full_fac(idim, jdim) = 0.5_dp
     502             :                      fist_nonbond_env%ij_kind_full_fac(idim, jdim) = 0.5_dp
     503             :                   END IF
     504      515418 :                   IF (ANY(potparm%pot(idim, jdim)%pot%type == ace_type)) THEN
     505          18 :                      fist_nonbond_env%ij_kind_full_fac(idim, jdim) = 0.5_dp
     506          18 :                      fist_nonbond_env%ij_kind_full_fac(jdim, idim) = 0.5_dp
     507             :                   END IF
     508      515435 :                   IF (ANY(potparm%pot(idim, jdim)%pot%type == gal_type)) THEN
     509           1 :                      fist_nonbond_env%ij_kind_full_fac(idim, jdim) = 0.5_dp
     510             :                      fist_nonbond_env%ij_kind_full_fac(idim, jdim) = 0.5_dp
     511             :                   END IF
     512      515435 :                   IF (ANY(potparm%pot(idim, jdim)%pot%type == gal21_type)) THEN
     513           1 :                      fist_nonbond_env%ij_kind_full_fac(idim, jdim) = 0.5_dp
     514             :                      fist_nonbond_env%ij_kind_full_fac(idim, jdim) = 0.5_dp
     515             :                   END IF
     516      515424 :                   IF (ANY(potparm%pot(idim, jdim)%pot%type == nequip_type)) THEN
     517          12 :                      fist_nonbond_env%ij_kind_full_fac(idim, jdim) = 0.5_dp
     518             :                      fist_nonbond_env%ij_kind_full_fac(idim, jdim) = 0.5_dp
     519             :                   END IF
     520             :                ELSE
     521             :                   ! In case we don't use potparm for initialization let's account
     522             :                   ! only for the real-space part of the Ewald sum.
     523          80 :                   fist_nonbond_env%rlist_cut(idim, jdim) = ewald_rcut
     524          80 :                   fist_nonbond_env%rlist_cut(jdim, idim) = ewald_rcut
     525          80 :                   fist_nonbond_env%rlist_lowsq(idim, jdim) = 0.0_dp
     526          80 :                   fist_nonbond_env%rlist_lowsq(jdim, idim) = 0.0_dp
     527             :                END IF
     528             :             END DO
     529             :          END DO
     530        2659 :          IF (use_potparm14) fist_nonbond_env%potparm14 => potparm14
     531        2659 :          IF (use_potparm) fist_nonbond_env%potparm => potparm
     532        2659 :          fist_nonbond_env%natom_types = natom_types
     533             :       ELSE
     534          16 :          NULLIFY (fist_nonbond_env%potparm)
     535          16 :          NULLIFY (fist_nonbond_env%potparm14)
     536             :       END IF
     537        2675 :    END SUBROUTINE init_fist_nonbond_env
     538             : 
     539             : ! **************************************************************************************************
     540             : !> \brief releases the given fist_nonbond_env (see doc/ReferenceCounting.html)
     541             : !> \param fist_nonbond_env the object to release
     542             : !> \par History
     543             : !>      12.2002 created [fawzi]
     544             : !> \author Fawzi Mohamed
     545             : ! **************************************************************************************************
     546        2675 :    SUBROUTINE fist_nonbond_env_release(fist_nonbond_env)
     547             :       TYPE(fist_nonbond_env_type), INTENT(INOUT)         :: fist_nonbond_env
     548             : 
     549        2675 :       IF (ASSOCIATED(fist_nonbond_env%nonbonded)) THEN
     550        2505 :          CALL fist_neighbor_deallocate(fist_nonbond_env%nonbonded)
     551             :       END IF
     552             :       ! Release potparm
     553        2675 :       CALL pair_potential_pp_release(fist_nonbond_env%potparm)
     554             :       ! Release potparm14
     555        2675 :       CALL pair_potential_pp_release(fist_nonbond_env%potparm14)
     556        2675 :       IF (ASSOCIATED(fist_nonbond_env%r_last_update)) THEN
     557        2505 :          DEALLOCATE (fist_nonbond_env%r_last_update)
     558             :       END IF
     559        2675 :       IF (ASSOCIATED(fist_nonbond_env%r_last_update_pbc)) THEN
     560        2505 :          DEALLOCATE (fist_nonbond_env%r_last_update_pbc)
     561             :       END IF
     562        2675 :       IF (ASSOCIATED(fist_nonbond_env%charges)) THEN
     563           8 :          DEALLOCATE (fist_nonbond_env%charges)
     564             :       END IF
     565        2675 :       IF (ASSOCIATED(fist_nonbond_env%eam_data)) THEN
     566          12 :          DEALLOCATE (fist_nonbond_env%eam_data)
     567             :       END IF
     568        2675 :       IF (ASSOCIATED(fist_nonbond_env%quip_data)) THEN
     569           0 :          IF (ASSOCIATED(fist_nonbond_env%quip_data%force)) THEN
     570           0 :             DEALLOCATE (fist_nonbond_env%quip_data%force)
     571             :          END IF
     572           0 :          IF (ASSOCIATED(fist_nonbond_env%quip_data%use_indices)) THEN
     573           0 :             DEALLOCATE (fist_nonbond_env%quip_data%use_indices)
     574             :          END IF
     575           0 :          DEALLOCATE (fist_nonbond_env%quip_data)
     576             :       END IF
     577        2675 :       IF (ASSOCIATED(fist_nonbond_env%nequip_data)) THEN
     578           4 :          IF (ASSOCIATED(fist_nonbond_env%nequip_data%force)) THEN
     579           4 :             DEALLOCATE (fist_nonbond_env%nequip_data%force)
     580             :          END IF
     581           4 :          IF (ASSOCIATED(fist_nonbond_env%nequip_data%use_indices)) THEN
     582           4 :             DEALLOCATE (fist_nonbond_env%nequip_data%use_indices)
     583             :          END IF
     584           4 :          CALL torch_model_release(fist_nonbond_env%nequip_data%model)
     585           4 :          DEALLOCATE (fist_nonbond_env%nequip_data)
     586             :       END IF
     587        2675 :       IF (ASSOCIATED(fist_nonbond_env%allegro_data)) THEN
     588           4 :          IF (ASSOCIATED(fist_nonbond_env%allegro_data%force)) THEN
     589           4 :             DEALLOCATE (fist_nonbond_env%allegro_data%force)
     590             :          END IF
     591           4 :          IF (ASSOCIATED(fist_nonbond_env%allegro_data%use_indices)) THEN
     592           4 :             DEALLOCATE (fist_nonbond_env%allegro_data%use_indices)
     593             :          END IF
     594           4 :          CALL torch_model_release(fist_nonbond_env%allegro_data%model)
     595           4 :          DEALLOCATE (fist_nonbond_env%allegro_data)
     596             :       END IF
     597        2675 :       IF (ASSOCIATED(fist_nonbond_env%deepmd_data)) THEN
     598           2 :          IF (ASSOCIATED(fist_nonbond_env%deepmd_data%force)) THEN
     599           2 :             DEALLOCATE (fist_nonbond_env%deepmd_data%force)
     600             :          END IF
     601           2 :          IF (ASSOCIATED(fist_nonbond_env%deepmd_data%use_indices)) THEN
     602           2 :             DEALLOCATE (fist_nonbond_env%deepmd_data%use_indices)
     603             :          END IF
     604           2 :          CALL deepmd_model_release(fist_nonbond_env%deepmd_data%model)
     605           2 :          DEALLOCATE (fist_nonbond_env%deepmd_data)
     606             :       END IF
     607        2675 :       IF (ASSOCIATED(fist_nonbond_env%ace_data)) THEN
     608           6 :          IF (ALLOCATED(fist_nonbond_env%ace_data%use_indices)) THEN
     609           6 :             DEALLOCATE (fist_nonbond_env%ace_data%use_indices)
     610             :          END IF
     611           6 :          IF (ALLOCATED(fist_nonbond_env%ace_data%inverse_index_map)) THEN
     612           6 :             DEALLOCATE (fist_nonbond_env%ace_data%inverse_index_map)
     613             :          END IF
     614           6 :          IF (ALLOCATED(fist_nonbond_env%ace_data%force)) THEN
     615           6 :             DEALLOCATE (fist_nonbond_env%ace_data%force)
     616             :          END IF
     617           6 :          IF (ALLOCATED(fist_nonbond_env%ace_data%atpos)) THEN
     618           6 :             DEALLOCATE (fist_nonbond_env%ace_data%atpos)
     619             :          END IF
     620           6 :          IF (ALLOCATED(fist_nonbond_env%ace_data%uctype)) THEN
     621           6 :             DEALLOCATE (fist_nonbond_env%ace_data%uctype)
     622             :          END IF
     623           6 :          IF (ALLOCATED(fist_nonbond_env%ace_data%attype)) THEN
     624           6 :             DEALLOCATE (fist_nonbond_env%ace_data%attype)
     625             :          END IF
     626           6 :          IF (ALLOCATED(fist_nonbond_env%ace_data%origin)) THEN
     627           6 :             DEALLOCATE (fist_nonbond_env%ace_data%origin)
     628             :          END IF
     629           6 :          IF (ALLOCATED(fist_nonbond_env%ace_data%shift)) THEN
     630           6 :             DEALLOCATE (fist_nonbond_env%ace_data%shift)
     631             :          END IF
     632           6 :          IF (ALLOCATED(fist_nonbond_env%ace_data%neiat)) THEN
     633           6 :             DEALLOCATE (fist_nonbond_env%ace_data%neiat)
     634             :          END IF
     635           6 :          IF (ALLOCATED(fist_nonbond_env%ace_data%nlist)) THEN
     636           6 :             DEALLOCATE (fist_nonbond_env%ace_data%nlist)
     637             :          END IF
     638           6 :          CALL ace_model_release(fist_nonbond_env%ace_data%model)
     639           6 :          DEALLOCATE (fist_nonbond_env%ace_data)
     640             :       END IF
     641        2675 :       IF (ASSOCIATED(fist_nonbond_env%rshell_last_update_pbc)) THEN
     642         242 :          DEALLOCATE (fist_nonbond_env%rshell_last_update_pbc)
     643             :       END IF
     644        2675 :       IF (ASSOCIATED(fist_nonbond_env%rcore_last_update_pbc)) THEN
     645         242 :          DEALLOCATE (fist_nonbond_env%rcore_last_update_pbc)
     646             :       END IF
     647        2675 :       IF (ASSOCIATED(fist_nonbond_env%cell_last_update)) THEN
     648        2505 :          CALL cell_release(fist_nonbond_env%cell_last_update)
     649             :       END IF
     650        2675 :       IF (ASSOCIATED(fist_nonbond_env%ij_kind_full_fac)) THEN
     651        2659 :          DEALLOCATE (fist_nonbond_env%ij_kind_full_fac)
     652             :       END IF
     653        2675 :       IF (ASSOCIATED(fist_nonbond_env%rlist_cut)) THEN
     654        2659 :          DEALLOCATE (fist_nonbond_env%rlist_cut)
     655             :       END IF
     656        2675 :       IF (ASSOCIATED(fist_nonbond_env%rlist_lowsq)) THEN
     657        2659 :          DEALLOCATE (fist_nonbond_env%rlist_lowsq)
     658             :       END IF
     659        2675 :    END SUBROUTINE fist_nonbond_env_release
     660             : 
     661           0 : END MODULE fist_nonbond_env_types

Generated by: LCOV version 1.15