LCOV - code coverage report
Current view: top level - src - fist_nonbond_env_types.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:ca6acae) Lines: 96.4 % 225 217
Test Date: 2026-01-02 06:29:53 Functions: 38.5 % 13 5

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

Generated by: LCOV version 2.0-1