LCOV - code coverage report
Current view: top level - src - fist_nonbond_env_types.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:42dac4a) Lines: 94.4 % 233 220
Test Date: 2025-07-25 12:55:17 Functions: 35.7 % 14 5

            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       532835 :    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       532835 :       IF (PRESENT(charges)) charges => fist_nonbond_env%charges
     206       532835 :       IF (PRESENT(potparm14)) potparm14 => fist_nonbond_env%potparm14
     207       532835 :       IF (PRESENT(eam_data)) eam_data => fist_nonbond_env%eam_data
     208       532835 :       IF (PRESENT(quip_data)) quip_data => fist_nonbond_env%quip_data
     209       532835 :       IF (PRESENT(nequip_data)) nequip_data => fist_nonbond_env%nequip_data
     210       532835 :       IF (PRESENT(allegro_data)) allegro_data => fist_nonbond_env%allegro_data
     211       532835 :       IF (PRESENT(deepmd_data)) deepmd_data => fist_nonbond_env%deepmd_data
     212       532835 :       IF (PRESENT(ace_data)) ace_data => fist_nonbond_env%ace_data
     213       532835 :       IF (PRESENT(potparm)) potparm => fist_nonbond_env%potparm
     214       532835 :       IF (PRESENT(rlist_cut)) rlist_cut => fist_nonbond_env%rlist_cut
     215       532835 :       IF (PRESENT(rlist_lowsq)) rlist_lowsq => fist_nonbond_env%rlist_lowsq
     216       532835 :       IF (PRESENT(ij_kind_full_fac)) ij_kind_full_fac => fist_nonbond_env%ij_kind_full_fac
     217       532835 :       IF (PRESENT(nonbonded)) nonbonded => fist_nonbond_env%nonbonded
     218       532835 :       IF (PRESENT(r_last_update)) &
     219       242480 :          r_last_update => fist_nonbond_env%r_last_update
     220       532835 :       IF (PRESENT(r_last_update_pbc)) &
     221       391306 :          r_last_update_pbc => fist_nonbond_env%r_last_update_pbc
     222       532835 :       IF (PRESENT(rshell_last_update_pbc)) &
     223       159792 :          rshell_last_update_pbc => fist_nonbond_env%rshell_last_update_pbc
     224       532835 :       IF (PRESENT(rcore_last_update_pbc)) &
     225       159792 :          rcore_last_update_pbc => fist_nonbond_env%rcore_last_update_pbc
     226       532835 :       IF (PRESENT(cell_last_update)) &
     227        80792 :          cell_last_update => fist_nonbond_env%cell_last_update
     228       532835 :       IF (PRESENT(lup)) lup = fist_nonbond_env%lup
     229       532835 :       IF (PRESENT(aup)) aup = fist_nonbond_env%aup
     230       532835 :       IF (PRESENT(ei_scale14)) ei_scale14 = fist_nonbond_env%ei_scale14
     231       532835 :       IF (PRESENT(vdw_scale14)) vdw_scale14 = fist_nonbond_env%vdw_scale14
     232       532835 :       IF (PRESENT(shift_cutoff)) &
     233            0 :          shift_cutoff = fist_nonbond_env%shift_cutoff
     234       532835 :       IF (PRESENT(do_electrostatics)) do_electrostatics = fist_nonbond_env%do_electrostatics
     235       532835 :       IF (PRESENT(natom_types)) natom_types = fist_nonbond_env%natom_types
     236       532835 :       IF (PRESENT(counter)) counter = fist_nonbond_env%counter
     237       532835 :       IF (PRESENT(last_update)) last_update = fist_nonbond_env%last_update
     238       532835 :       IF (PRESENT(num_update)) num_update = fist_nonbond_env%num_update
     239       532835 :       IF (PRESENT(long_range_correction)) &
     240            0 :          long_range_correction = fist_nonbond_env%long_range_correction
     241       532835 :    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        94634 :    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        94634 :       IF (PRESENT(potparm14)) fist_nonbond_env%potparm14 => potparm14
     307        94634 :       IF (PRESENT(eam_data)) fist_nonbond_env%eam_data => eam_data
     308        94634 :       IF (PRESENT(quip_data)) fist_nonbond_env%quip_data => quip_data
     309        94634 :       IF (PRESENT(nequip_data)) fist_nonbond_env%nequip_data => nequip_data
     310        94634 :       IF (PRESENT(allegro_data)) fist_nonbond_env%allegro_data => allegro_data
     311        94634 :       IF (PRESENT(deepmd_data)) fist_nonbond_env%deepmd_data => deepmd_data
     312        94634 :       IF (PRESENT(ace_data)) fist_nonbond_env%ace_data => ace_data
     313        94634 :       IF (PRESENT(potparm)) fist_nonbond_env%potparm => potparm
     314        94634 :       IF (PRESENT(rlist_cut)) fist_nonbond_env%rlist_cut => rlist_cut
     315        94634 :       IF (PRESENT(charges)) fist_nonbond_env%charges => charges
     316        94634 :       IF (PRESENT(rlist_lowsq)) fist_nonbond_env%rlist_lowsq => rlist_lowsq
     317        94634 :       IF (PRESENT(nonbonded)) fist_nonbond_env%nonbonded => nonbonded
     318        94634 :       IF (PRESENT(r_last_update)) &
     319        11171 :          fist_nonbond_env%r_last_update => r_last_update
     320        94634 :       IF (PRESENT(r_last_update_pbc)) &
     321        11171 :          fist_nonbond_env%r_last_update_pbc => r_last_update_pbc
     322        94634 :       IF (PRESENT(rshell_last_update_pbc)) &
     323        11171 :          fist_nonbond_env%rshell_last_update_pbc => rshell_last_update_pbc
     324        94634 :       IF (PRESENT(rcore_last_update_pbc)) &
     325        11171 :          fist_nonbond_env%rcore_last_update_pbc => rcore_last_update_pbc
     326        94634 :       IF (PRESENT(cell_last_update)) &
     327        11171 :          fist_nonbond_env%cell_last_update => cell_last_update
     328        94634 :       IF (PRESENT(lup)) fist_nonbond_env%lup = lup
     329        94634 :       IF (PRESENT(aup)) fist_nonbond_env%aup = aup
     330        94634 :       IF (PRESENT(ei_scale14)) fist_nonbond_env%ei_scale14 = ei_scale14
     331        94634 :       IF (PRESENT(vdw_scale14)) fist_nonbond_env%vdw_scale14 = vdw_scale14
     332        94634 :       IF (PRESENT(shift_cutoff)) &
     333            0 :          fist_nonbond_env%shift_cutoff = shift_cutoff
     334        94634 :       IF (PRESENT(do_electrostatics)) fist_nonbond_env%do_electrostatics = do_electrostatics
     335        94634 :       IF (PRESENT(natom_types)) fist_nonbond_env%natom_types = natom_types
     336        94634 :       IF (PRESENT(counter)) fist_nonbond_env%counter = counter
     337        94634 :       IF (PRESENT(last_update)) fist_nonbond_env%last_update = last_update
     338        94634 :       IF (PRESENT(num_update)) fist_nonbond_env%num_update = num_update
     339        94634 :       IF (PRESENT(long_range_correction)) &
     340            0 :          fist_nonbond_env%long_range_correction = long_range_correction
     341        94634 :    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 2.0-1