LCOV - code coverage report
Current view: top level - src - pair_potential_types.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:ca6acae) Lines: 92.0 % 1114 1025
Test Date: 2026-01-02 06:29:53 Functions: 74.4 % 117 87

            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              : !>      Teodoro Laino [Teo] 11.2005 : Reorganizing the structures to optimize
      11              : !>                                    memory management
      12              : !> \author CJM
      13              : ! **************************************************************************************************
      14              : MODULE pair_potential_types
      15              : 
      16              :    USE ace_wrapper,                     ONLY: ace_model_type
      17              :    USE kinds,                           ONLY: default_path_length,&
      18              :                                               default_string_length,&
      19              :                                               dp
      20              :    USE memory_utilities,                ONLY: reallocate
      21              :    USE splines_types,                   ONLY: spline_data_p_copy,&
      22              :                                               spline_data_p_release,&
      23              :                                               spline_data_p_type,&
      24              :                                               spline_factor_copy,&
      25              :                                               spline_factor_release,&
      26              :                                               spline_factor_type
      27              : #include "./base/base_uses.f90"
      28              : 
      29              :    IMPLICIT NONE
      30              : 
      31              :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'pair_potential_types'
      32              : 
      33              :    PRIVATE
      34              :    ! when adding a new nonbonded potential please update also the list_pot
      35              :    ! used for the linear scaling screening of potential calculation
      36              :    INTEGER, PUBLIC, PARAMETER :: multi_type = -1, &
      37              :                                  nn_type = 0, &
      38              :                                  lj_type = 1, &
      39              :                                  lj_charmm_type = 2, &
      40              :                                  ft_type = 3, &
      41              :                                  wl_type = 4, &
      42              :                                  gw_type = 5, &
      43              :                                  ip_type = 6, &
      44              :                                  ea_type = 7, &
      45              :                                  b4_type = 8, &
      46              :                                  bm_type = 9, &
      47              :                                  gp_type = 10, &
      48              :                                  tersoff_type = 11, &
      49              :                                  ftd_type = 12, &
      50              :                                  siepmann_type = 13, &
      51              :                                  gal_type = 14, &
      52              :                                  nequip_type = 16, &
      53              :                                  allegro_type = 17, &
      54              :                                  gal21_type = 18, &
      55              :                                  tab_type = 19, &
      56              :                                  deepmd_type = 20, &
      57              :                                  ace_type = 21
      58              : 
      59              :    INTEGER, PUBLIC, PARAMETER, DIMENSION(21) :: list_pot = [nn_type, &
      60              :                                                             lj_type, &
      61              :                                                             lj_charmm_type, &
      62              :                                                             ft_type, &
      63              :                                                             wl_type, &
      64              :                                                             gw_type, &
      65              :                                                             ip_type, &
      66              :                                                             ea_type, &
      67              :                                                             b4_type, &
      68              :                                                             bm_type, &
      69              :                                                             gp_type, &
      70              :                                                             tersoff_type, &
      71              :                                                             ftd_type, &
      72              :                                                             siepmann_type, &
      73              :                                                             gal_type, &
      74              :                                                             nequip_type, &
      75              :                                                             allegro_type, &
      76              :                                                             gal21_type, &
      77              :                                                             tab_type, &
      78              :                                                             deepmd_type, &
      79              :                                                             ace_type]
      80              : 
      81              :    ! Shell model
      82              :    INTEGER, PUBLIC, PARAMETER :: nosh_nosh = 0, &
      83              :                                  nosh_sh = 1, &
      84              :                                  sh_sh = 2
      85              : 
      86              :    INTEGER, PUBLIC, PARAMETER, DIMENSION(3) :: list_sh_type = [nosh_nosh, nosh_sh, sh_sh]
      87              : 
      88              :    ! Single Spline generation info
      89              :    REAL(KIND=dp), PARAMETER, PUBLIC         :: not_initialized = -HUGE(0.0_dp)
      90              :    INTEGER, PARAMETER, DIMENSION(2), PUBLIC :: do_potential_single_allocation = [lj_type, lj_charmm_type]
      91              :    INTEGER, PARAMETER, DIMENSION(2), PUBLIC :: no_potential_single_allocation = [-HUGE(0), -HUGE(0)]
      92              :    INTEGER, DIMENSION(2), PUBLIC            :: potential_single_allocation
      93              : 
      94              :    PUBLIC :: pair_potential_reallocate
      95              : 
      96              :    PUBLIC :: pair_potential_single_copy, &
      97              :              pair_potential_single_add, &
      98              :              pair_potential_single_clean, &
      99              :              pair_potential_single_type
     100              : 
     101              :    PUBLIC :: pair_potential_pp_create, &
     102              :              pair_potential_pp_release, &
     103              :              pair_potential_pp_type
     104              : 
     105              :    PUBLIC :: pair_potential_p_type, &
     106              :              pair_potential_p_release
     107              : 
     108              :    PUBLIC :: ft_pot_type, &
     109              :              ipbv_pot_type, &
     110              :              eam_pot_type, &
     111              :              nequip_pot_type, &
     112              :              allegro_pot_type, &
     113              :              deepmd_pot_type, &
     114              :              ace_pot_type, &
     115              :              tersoff_pot_type, &
     116              :              siepmann_pot_type, &
     117              :              gal_pot_type, &
     118              :              gal21_pot_type, &
     119              :              tab_pot_type
     120              : 
     121              :    PUBLIC :: pair_potential_lj_create
     122              :    PUBLIC :: compare_pot
     123              : 
     124              : ! **************************************************************************************************
     125              :    TYPE ipbv_pot_type
     126              :       REAL(KIND=dp), DIMENSION(2:15) :: a = 0.0_dp
     127              :       REAL(KIND=dp) :: rcore = 0.0_dp
     128              :       REAL(KIND=dp) :: m = 0.0_dp
     129              :       REAL(KIND=dp) :: b = 0.0_dp
     130              :    END TYPE ipbv_pot_type
     131              : 
     132              : ! **************************************************************************************************
     133              :    TYPE lj_pot_type
     134              :       REAL(KIND=dp) :: epsilon = 0.0_dp
     135              :       REAL(KIND=dp) :: sigma6 = 0.0_dp
     136              :       REAL(KIND=dp) :: sigma12 = 0.0_dp
     137              :    END TYPE Lj_pot_type
     138              : 
     139              : ! **************************************************************************************************
     140              :    TYPE ft_pot_type
     141              :       REAL(KIND=dp) :: A = 0.0_dp
     142              :       REAL(KIND=dp) :: B = 0.0_dp
     143              :       REAL(KIND=dp) :: C = 0.0_dp
     144              :       REAL(KIND=dp) :: D = 0.0_dp
     145              :    END TYPE ft_pot_type
     146              : 
     147              : ! **************************************************************************************************
     148              :    TYPE ftd_pot_type
     149              :       REAL(KIND=dp) :: A = 0.0_dp
     150              :       REAL(KIND=dp) :: B = 0.0_dp
     151              :       REAL(KIND=dp) :: C = 0.0_dp
     152              :       REAL(KIND=dp) :: D = 0.0_dp
     153              :       REAL(KIND=dp), DIMENSION(2) :: BD = 0.0_dp
     154              :    END TYPE ftd_pot_type
     155              : 
     156              : ! **************************************************************************************************
     157              :    TYPE williams_pot_type
     158              :       REAL(KIND=dp) :: a = 0.0_dp
     159              :       REAL(KIND=dp) :: b = 0.0_dp
     160              :       REAL(KIND=dp) :: c = 0.0_dp
     161              :    END TYPE williams_pot_type
     162              : 
     163              : ! **************************************************************************************************
     164              :    TYPE goodwin_pot_type
     165              :       REAL(KIND=dp) :: vr0 = 0.0_dp
     166              :       REAL(KIND=dp) :: m = 0.0_dp, mc = 0.0_dp
     167              :       REAL(KIND=dp) :: d = 0.0_dp, dc = 0.0_dp
     168              :    END TYPE goodwin_pot_type
     169              : 
     170              : ! **************************************************************************************************
     171              :    TYPE eam_pot_type
     172              :       CHARACTER(LEN=default_path_length)     :: eam_file_name = ""
     173              :       INTEGER                                 :: npoints = 0
     174              :       REAL(KIND=dp)                          :: drar = 0.0_dp, drhoar = 0.0_dp, acutal = 0.0_dp
     175              :       REAL(KIND=dp), POINTER, DIMENSION(:)    :: rho => NULL(), phi => NULL(), frho => NULL(), rhoval => NULL(), rval => NULL()
     176              :       REAL(KIND=dp), POINTER, DIMENSION(:)    :: rhop => NULL(), phip => NULL(), frhop => NULL()
     177              :    END TYPE eam_pot_type
     178              : 
     179              : ! **************************************************************************************************
     180              :    TYPE ace_pot_type
     181              :       CHARACTER(LEN=default_path_length)     :: ace_file_name = 'NULL'
     182              :       INTEGER                                :: atom_ace_type = 0
     183              :       TYPE(ace_model_type)                   :: model = ace_model_type()
     184              :    END TYPE ace_pot_type
     185              : 
     186              : !     **************************************************************************************************
     187              :    TYPE deepmd_pot_type
     188              :       CHARACTER(LEN=default_path_length)     :: deepmd_file_name = 'NULL'
     189              :       INTEGER                                :: atom_deepmd_type = 0
     190              :    END TYPE deepmd_pot_type
     191              : 
     192              : ! **************************************************************************************************
     193              :    TYPE nequip_pot_type
     194              :       CHARACTER(LEN=default_path_length)     :: nequip_file_name = 'NULL', nequip_version = 'NULL', &
     195              :                                                 unit_coords = 'NULL', unit_forces = 'NULL', &
     196              :                                                 unit_energy = 'NULL', unit_cell = 'NULL'
     197              :       CHARACTER(LEN=100), DIMENSION(:), ALLOCATABLE      :: type_names_torch
     198              :       REAL(KIND=dp)                          :: rcutsq = 0.0_dp, unit_coords_val = 1.0_dp, &
     199              :                                                 unit_forces_val = 1.0_dp, unit_energy_val = 1.0_dp, &
     200              :                                                 unit_cell_val = 1.0_dp
     201              :       LOGICAL                                :: do_nequip_sp = .FALSE.
     202              :    END TYPE nequip_pot_type
     203              : 
     204              : ! **************************************************************************************************
     205              :    TYPE allegro_pot_type
     206              :       CHARACTER(LEN=default_path_length)     :: allegro_file_name = 'NULL', unit_cell = 'NULL', &
     207              :                                                 nequip_version = 'NULL', unit_coords = 'NULL', &
     208              :                                                 unit_forces = 'NULL', unit_energy = 'NULL'
     209              : 
     210              :       CHARACTER(LEN=100), DIMENSION(:), ALLOCATABLE      :: type_names_torch
     211              : 
     212              :       REAL(KIND=dp)                          :: rcutsq = 0.0_dp, unit_coords_val = 1.0_dp, &
     213              :                                                 unit_forces_val = 1.0_dp, unit_cell_val = 1.0_dp, &
     214              :                                                 unit_energy_val = 1.0_dp
     215              :       LOGICAL                                :: do_allegro_sp = .FALSE.
     216              :    END TYPE allegro_pot_type
     217              : 
     218              : ! **************************************************************************************************
     219              :    TYPE buck4ran_pot_type
     220              :       REAL(KIND=dp) :: a = 0.0_dp
     221              :       REAL(KIND=dp) :: b = 0.0_dp
     222              :       REAL(KIND=dp) :: c = 0.0_dp
     223              :       REAL(KIND=dp) :: r1 = 0.0_dp
     224              :       REAL(KIND=dp) :: r2 = 0.0_dp
     225              :       REAL(KIND=dp) :: r3 = 0.0_dp
     226              :       INTEGER :: npoly1 = 0, npoly2 = 0
     227              :       REAL(KIND=dp), DIMENSION(0:10) :: poly1 = 0.0_dp
     228              :       REAL(KIND=dp), DIMENSION(0:10) :: poly2 = 0.0_dp
     229              :    END TYPE buck4ran_pot_type
     230              : 
     231              : ! **************************************************************************************************
     232              :    TYPE buckmorse_pot_type
     233              :       REAL(KIND=dp) :: f0 = 0.0_dp
     234              :       REAL(KIND=dp) :: a1 = 0.0_dp
     235              :       REAL(KIND=dp) :: a2 = 0.0_dp
     236              :       REAL(KIND=dp) :: b1 = 0.0_dp
     237              :       REAL(KIND=dp) :: b2 = 0.0_dp
     238              :       REAL(KIND=dp) :: c = 0.0_dp
     239              :       REAL(KIND=dp) :: d = 0.0_dp
     240              :       REAL(KIND=dp) :: r0 = 0.0_dp
     241              :       REAL(KIND=dp) :: beta = 0.0_dp
     242              :    END TYPE buckmorse_pot_type
     243              : 
     244              : ! **************************************************************************************************
     245              :    TYPE gp_pot_type
     246              :       INTEGER                                   :: myid = 0
     247              :       CHARACTER(LEN=default_path_length)       :: potential = ""
     248              :       CHARACTER(LEN=default_string_length), &
     249              :          POINTER, DIMENSION(:)                   :: parameters => NULL(), units => NULL()
     250              :       CHARACTER(LEN=default_string_length)     :: variables = ""
     251              :       REAL(KIND=dp), DIMENSION(:), POINTER      :: values => NULL()
     252              :    END TYPE gp_pot_type
     253              : 
     254              : ! **************************************************************************************************
     255              :    TYPE tersoff_pot_type
     256              :       ! Get this stuff from the PRB V38, N14 9902 (1988) by Tersoff
     257              :       REAL(KIND=dp) :: A = 0.0_dp
     258              :       REAL(KIND=dp) :: B = 0.0_dp
     259              :       REAL(KIND=dp) :: lambda1 = 0.0_dp
     260              :       REAL(KIND=dp) :: lambda2 = 0.0_dp
     261              :       REAL(KIND=dp) :: alpha = 0.0_dp
     262              :       REAL(KIND=dp) :: beta = 0.0_dp
     263              :       REAL(KIND=dp) :: n = 0.0_dp
     264              :       REAL(KIND=dp) :: c = 0.0_dp
     265              :       REAL(KIND=dp) :: d = 0.0_dp
     266              :       REAL(KIND=dp) :: h = 0.0_dp
     267              :       REAL(KIND=dp) :: lambda3 = 0.0_dp
     268              :       REAL(KIND=dp) :: bigR = 0.0_dp ! Used to be R = Rij + D
     269              :       REAL(KIND=dp) :: bigD = 0.0_dp ! Used to be D = Rij - D
     270              :       REAL(KIND=dp) :: rcutsq = 0.0_dp ! Always set to (bigR+bigD)^2
     271              :    END TYPE tersoff_pot_type
     272              : 
     273              : ! **************************************************************************************************
     274              :    TYPE siepmann_pot_type
     275              :       REAL(KIND=dp) :: B = 0.0_dp
     276              :       REAL(KIND=dp) :: D = 0.0_dp
     277              :       REAL(KIND=dp) :: E = 0.0_dp
     278              :       REAL(KIND=dp) :: F = 0.0_dp
     279              :       REAL(KIND=dp) :: beta = 0.0_dp
     280              :       REAL(KIND=dp) :: rcutsq = 0.0_dp
     281              :       LOGICAL        :: allow_oh_formation = .FALSE.
     282              :       LOGICAL        :: allow_h3o_formation = .FALSE.
     283              :       LOGICAL        :: allow_o_formation = .FALSE.
     284              :    END TYPE siepmann_pot_type
     285              : 
     286              : ! **************************************************************************************************
     287              :    TYPE gal_pot_type
     288              :       CHARACTER(LEN=2) :: met1 = ""
     289              :       CHARACTER(LEN=2) :: met2 = ""
     290              :       REAL(KIND=dp) :: epsilon = 0.0_dp
     291              :       REAL(KIND=dp) :: bxy = 0.0_dp
     292              :       REAL(KIND=dp) :: bz = 0.0_dp
     293              :       REAL(KIND=dp) :: r1 = 0.0_dp
     294              :       REAL(KIND=dp) :: r2 = 0.0_dp
     295              :       REAL(KIND=dp) :: a1 = 0.0_dp
     296              :       REAL(KIND=dp) :: a2 = 0.0_dp
     297              :       REAL(KIND=dp) :: a3 = 0.0_dp
     298              :       REAL(KIND=dp) :: a4 = 0.0_dp
     299              :       REAL(KIND=dp) :: a = 0.0_dp
     300              :       REAL(KIND=dp) :: b = 0.0_dp
     301              :       REAL(KIND=dp) :: c = 0.0_dp
     302              :       REAL(KIND=dp), POINTER, DIMENSION(:) :: gcn => NULL()
     303              :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :)    :: n_vectors
     304              :       REAL(KIND=dp)  :: rcutsq = 0.0_dp
     305              :       LOGICAL        :: express = .FALSE.
     306              :    END TYPE gal_pot_type
     307              : 
     308              : ! **************************************************************************************************
     309              : 
     310              :    TYPE gal21_pot_type
     311              :       CHARACTER(LEN=2) :: met1 = ""
     312              :       CHARACTER(LEN=2) :: met2 = ""
     313              :       REAL(KIND=dp) :: epsilon1 = 0.0_dp
     314              :       REAL(KIND=dp) :: epsilon2 = 0.0_dp
     315              :       REAL(KIND=dp) :: epsilon3 = 0.0_dp
     316              :       REAL(KIND=dp) :: bxy1 = 0.0_dp
     317              :       REAL(KIND=dp) :: bxy2 = 0.0_dp
     318              :       REAL(KIND=dp) :: bz1 = 0.0_dp
     319              :       REAL(KIND=dp) :: bz2 = 0.0_dp
     320              :       REAL(KIND=dp) :: r1 = 0.0_dp
     321              :       REAL(KIND=dp) :: r2 = 0.0_dp
     322              :       REAL(KIND=dp) :: a11 = 0.0_dp
     323              :       REAL(KIND=dp) :: a12 = 0.0_dp
     324              :       REAL(KIND=dp) :: a13 = 0.0_dp
     325              :       REAL(KIND=dp) :: a21 = 0.0_dp
     326              :       REAL(KIND=dp) :: a22 = 0.0_dp
     327              :       REAL(KIND=dp) :: a23 = 0.0_dp
     328              :       REAL(KIND=dp) :: a31 = 0.0_dp
     329              :       REAL(KIND=dp) :: a32 = 0.0_dp
     330              :       REAL(KIND=dp) :: a33 = 0.0_dp
     331              :       REAL(KIND=dp) :: a41 = 0.0_dp
     332              :       REAL(KIND=dp) :: a42 = 0.0_dp
     333              :       REAL(KIND=dp) :: a43 = 0.0_dp
     334              :       REAL(KIND=dp) :: AO1 = 0.0_dp
     335              :       REAL(KIND=dp) :: AO2 = 0.0_dp
     336              :       REAL(KIND=dp) :: BO1 = 0.0_dp
     337              :       REAL(KIND=dp) :: BO2 = 0.0_dp
     338              :       REAL(KIND=dp) :: c = 0.0_dp
     339              :       REAL(KIND=dp) :: AH1 = 0.0_dp
     340              :       REAL(KIND=dp) :: AH2 = 0.0_dp
     341              :       REAL(KIND=dp) :: BH1 = 0.0_dp
     342              :       REAL(KIND=dp) :: BH2 = 0.0_dp
     343              :       REAL(KIND=dp), POINTER, DIMENSION(:) :: gcn => NULL()
     344              :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :)    :: n_vectors
     345              :       REAL(KIND=dp)  :: rcutsq = 0.0_dp
     346              :       LOGICAL        :: express = .FALSE.
     347              :    END TYPE gal21_pot_type
     348              : 
     349              : ! **************************************************************************************************
     350              : 
     351              :    TYPE tab_pot_type
     352              :       CHARACTER(LEN=default_path_length)      :: tabpot_file_name = ""
     353              :       INTEGER                                 :: npoints = 0, index = 0
     354              :       REAL(KIND=dp)                           :: dr = 0.0_dp, rcut = 0.0_dp
     355              :       REAL(KIND=dp), POINTER, DIMENSION(:)    :: r => NULL(), e => NULL(), f => NULL()
     356              :    END TYPE tab_pot_type
     357              : 
     358              : ! **************************************************************************************************
     359              : 
     360              :    TYPE pot_set_type
     361              :       REAL(KIND=dp)                      :: rmin = 0.0_dp, rmax = 0.0_dp
     362              :       TYPE(ipbv_pot_type), POINTER :: ipbv => NULL()
     363              :       TYPE(gp_pot_type), POINTER :: gp => NULL()
     364              :       TYPE(lj_pot_type), POINTER :: lj => NULL()
     365              :       TYPE(ft_pot_type), POINTER :: ft => NULL()
     366              :       TYPE(williams_pot_type), POINTER :: willis => NULL()
     367              :       TYPE(goodwin_pot_type), POINTER :: goodwin => NULL()
     368              :       TYPE(eam_pot_type), POINTER :: eam => NULL()
     369              :       TYPE(nequip_pot_type), POINTER :: nequip => NULL()
     370              :       TYPE(allegro_pot_type), POINTER :: allegro => NULL()
     371              :       TYPE(ace_pot_type), POINTER :: ace => NULL()
     372              :       TYPE(deepmd_pot_type), POINTER :: deepmd => NULL()
     373              :       TYPE(buck4ran_pot_type), POINTER :: buck4r => NULL()
     374              :       TYPE(buckmorse_pot_type), POINTER :: buckmo => NULL()
     375              :       TYPE(tersoff_pot_type), POINTER :: tersoff => NULL()
     376              :       TYPE(siepmann_pot_type), POINTER :: siepmann => NULL()
     377              :       TYPE(gal_pot_type), POINTER :: gal => NULL()
     378              :       TYPE(gal21_pot_type), POINTER :: gal21 => NULL()
     379              :       TYPE(ftd_pot_type), POINTER :: ftd => NULL()
     380              :       TYPE(tab_pot_type), POINTER :: tab => NULL()
     381              :    END TYPE pot_set_type
     382              : 
     383              : ! **************************************************************************************************
     384              :    TYPE pair_potential_single_type
     385              :       REAL(KIND=dp) :: rcutsq = 0.0_dp
     386              :       REAL(KIND=dp) :: e_fac = 0.0_dp
     387              :       REAL(KIND=dp) :: e_fcc = 0.0_dp
     388              :       REAL(KIND=dp) :: e_fcs = 0.0_dp
     389              :       REAL(KIND=dp) :: e_fsc = 0.0_dp
     390              :       REAL(KIND=dp) :: z1 = 0.0_dp
     391              :       REAL(KIND=dp) :: z2 = 0.0_dp
     392              :       REAL(KIND=dp), DIMENSION(0:5) :: zbl_poly = 0.0_dp
     393              :       REAL(KIND=dp), DIMENSION(2) :: zbl_rcut = 0.0_dp
     394              :       LOGICAL        :: undef = .FALSE., & ! non-bonding interaction not defined
     395              :                         no_mb = .FALSE., & ! no many-body potential
     396              :                         no_pp = .FALSE. ! no pair (=two-body) potential
     397              :       INTEGER        :: shell_type = 0
     398              :       CHARACTER(LEN=default_string_length)   :: at1 = ""
     399              :       CHARACTER(LEN=default_string_length)   :: at2 = ""
     400              :       INTEGER, POINTER, DIMENSION(:)              :: TYPE => NULL()
     401              :       TYPE(pot_set_type), POINTER, DIMENSION(:) :: set => NULL()
     402              :       TYPE(spline_data_p_type), POINTER, DIMENSION(:) :: pair_spline_data => NULL()
     403              :       TYPE(spline_factor_type), POINTER :: spl_f => NULL()
     404              :    END TYPE pair_potential_single_type
     405              : 
     406              : ! **************************************************************************************************
     407              :    TYPE pair_potential_type
     408              :       TYPE(pair_potential_single_type), POINTER :: pot => NULL()
     409              :    END TYPE pair_potential_type
     410              : 
     411              : ! **************************************************************************************************
     412              :    TYPE pair_potential_p_type
     413              :       TYPE(pair_potential_type), DIMENSION(:), POINTER :: pot => NULL()
     414              :    END TYPE pair_potential_p_type
     415              : 
     416              : ! **************************************************************************************************
     417              :    TYPE pair_potential_pp_type
     418              :       TYPE(pair_potential_type), DIMENSION(:, :), POINTER :: pot => NULL()
     419              :    END TYPE pair_potential_pp_type
     420              : 
     421              : CONTAINS
     422              : 
     423              : ! **************************************************************************************************
     424              : !> \brief compare two different potentials
     425              : !> \param pot1 ...
     426              : !> \param pot2 ...
     427              : !> \param compare ...
     428              : !> \author Teodoro Laino [teo] 05.2006
     429              : ! **************************************************************************************************
     430           68 :    SUBROUTINE compare_pot(pot1, pot2, compare)
     431              :       TYPE(pair_potential_single_type), POINTER          :: pot1, pot2
     432              :       LOGICAL, INTENT(OUT)                               :: compare
     433              : 
     434              :       INTEGER                                            :: i
     435              :       LOGICAL                                            :: mycompare
     436              : 
     437           68 :       compare = .FALSE.
     438              :       ! Preliminary checks
     439              : 
     440           68 :       CPASSERT(ASSOCIATED(pot1%type))
     441           68 :       CPASSERT(ASSOCIATED(pot2%type))
     442           68 :       IF (SIZE(pot1%type) /= SIZE(pot2%type)) RETURN
     443          136 :       IF (ANY(pot1%type /= pot2%type)) RETURN
     444              : 
     445              :       ! Checking the real values of parameters
     446           68 :       CPASSERT(ASSOCIATED(pot1%set))
     447           68 :       CPASSERT(ASSOCIATED(pot2%set))
     448          136 :       DO i = 1, SIZE(pot1%type)
     449           68 :          mycompare = .FALSE.
     450           68 :          SELECT CASE (pot1%type(i))
     451              :          CASE (lj_type, lj_charmm_type)
     452              :             IF ((pot1%set(i)%lj%epsilon == pot2%set(i)%lj%epsilon) .AND. &
     453            0 :                 (pot1%set(i)%lj%sigma6 == pot2%set(i)%lj%sigma6) .AND. &
     454            0 :                 (pot1%set(i)%lj%sigma12 == pot2%set(i)%lj%sigma12)) mycompare = .TRUE.
     455              :          CASE (wl_type)
     456              :             IF ((pot1%set(i)%willis%a == pot2%set(i)%willis%a) .AND. &
     457            0 :                 (pot1%set(i)%willis%b == pot2%set(i)%willis%b) .AND. &
     458            0 :                 (pot1%set(i)%willis%c == pot2%set(i)%willis%c)) mycompare = .TRUE.
     459              :          CASE (gw_type)
     460              :             IF ((pot1%set(i)%goodwin%vr0 == pot2%set(i)%goodwin%vr0) .AND. &
     461              :                 (pot1%set(i)%goodwin%m == pot2%set(i)%goodwin%m) .AND. &
     462              :                 (pot1%set(i)%goodwin%mc == pot2%set(i)%goodwin%mc) .AND. &
     463            0 :                 (pot1%set(i)%goodwin%d == pot2%set(i)%goodwin%d) .AND. &
     464            0 :                 (pot1%set(i)%goodwin%dc == pot2%set(i)%goodwin%dc)) mycompare = .TRUE.
     465              :          CASE (ea_type)
     466              :             ! Compare only if EAM have the same number of points
     467           20 :             IF (pot1%set(i)%eam%npoints == pot2%set(i)%eam%npoints) THEN
     468              :                IF ((pot1%set(i)%eam%drar == pot2%set(i)%eam%drar) .AND. &
     469              :                    (pot1%set(i)%eam%drhoar == pot2%set(i)%eam%drhoar) .AND. &
     470              :                    (pot1%set(i)%eam%acutal == pot2%set(i)%eam%acutal) .AND. &
     471              :                    (SUM(ABS(pot1%set(i)%eam%rho - pot2%set(i)%eam%rho)) == 0.0_dp) .AND. &
     472              :                    (SUM(ABS(pot1%set(i)%eam%phi - pot2%set(i)%eam%phi)) == 0.0_dp) .AND. &
     473              :                    (SUM(ABS(pot1%set(i)%eam%frho - pot2%set(i)%eam%frho)) == 0.0_dp) .AND. &
     474              :                    (SUM(ABS(pot1%set(i)%eam%rhoval - pot2%set(i)%eam%rhoval)) == 0.0_dp) .AND. &
     475              :                    (SUM(ABS(pot1%set(i)%eam%rval - pot2%set(i)%eam%rval)) == 0.0_dp) .AND. &
     476              :                    (SUM(ABS(pot1%set(i)%eam%rhop - pot2%set(i)%eam%rhop)) == 0.0_dp) .AND. &
     477       512020 :                    (SUM(ABS(pot1%set(i)%eam%phip - pot2%set(i)%eam%phip)) == 0.0_dp) .AND. &
     478           16 :                    (SUM(ABS(pot1%set(i)%eam%frhop - pot2%set(i)%eam%frhop)) == 0.0_dp)) mycompare = .TRUE.
     479              :             END IF
     480              :          CASE (ace_type)
     481            0 :             IF ((pot1%set(i)%ace%ace_file_name == pot2%set(i)%ace%ace_file_name) .AND. &
     482            0 :                 (pot1%set(i)%ace%atom_ace_type == pot2%set(i)%ace%atom_ace_type)) mycompare = .TRUE.
     483              :          CASE (deepmd_type)
     484            0 :             IF ((pot1%set(i)%deepmd%deepmd_file_name == pot2%set(i)%deepmd%deepmd_file_name) .AND. &
     485            0 :                 (pot1%set(i)%deepmd%atom_deepmd_type == pot2%set(i)%deepmd%atom_deepmd_type)) mycompare = .TRUE.
     486              :          CASE (nequip_type)
     487              :             IF ((pot1%set(i)%nequip%nequip_file_name == pot2%set(i)%nequip%nequip_file_name) .AND. &
     488              :                 (pot1%set(i)%nequip%unit_coords == pot2%set(i)%nequip%unit_coords) .AND. &
     489              :                 (pot1%set(i)%nequip%unit_forces == pot2%set(i)%nequip%unit_forces) .AND. &
     490            0 :                 (pot1%set(i)%nequip%unit_energy == pot2%set(i)%nequip%unit_energy) .AND. &
     491            0 :                 (pot1%set(i)%nequip%unit_cell == pot2%set(i)%nequip%unit_cell)) mycompare = .TRUE.
     492              :          CASE (allegro_type)
     493              :             IF ((pot1%set(i)%allegro%allegro_file_name == pot2%set(i)%allegro%allegro_file_name) .AND. &
     494              :                 (pot1%set(i)%allegro%unit_coords == pot2%set(i)%allegro%unit_coords) .AND. &
     495              :                 (pot1%set(i)%allegro%unit_forces == pot2%set(i)%allegro%unit_forces) .AND. &
     496            0 :                 (pot1%set(i)%allegro%unit_energy == pot2%set(i)%allegro%unit_energy) .AND. &
     497            0 :                 (pot1%set(i)%allegro%unit_cell == pot2%set(i)%allegro%unit_cell)) mycompare = .TRUE.
     498              :          CASE (ft_type)
     499              :             IF ((pot1%set(i)%ft%A == pot2%set(i)%ft%A) .AND. &
     500              :                 (pot1%set(i)%ft%B == pot2%set(i)%ft%B) .AND. &
     501            0 :                 (pot1%set(i)%ft%C == pot2%set(i)%ft%C) .AND. &
     502            0 :                 (pot1%set(i)%ft%D == pot2%set(i)%ft%D)) mycompare = .TRUE.
     503              :          CASE (ftd_type)
     504              :             IF ((pot1%set(i)%ftd%A == pot2%set(i)%ftd%A) .AND. &
     505              :                 (pot1%set(i)%ftd%B == pot2%set(i)%ftd%B) .AND. &
     506              :                 (pot1%set(i)%ftd%C == pot2%set(i)%ftd%C) .AND. &
     507            0 :                 (pot1%set(i)%ftd%D == pot2%set(i)%ftd%D) .AND. &
     508            0 :                 (ALL(pot1%set(i)%ftd%BD(:) == pot2%set(i)%ftd%BD(:)))) mycompare = .TRUE.
     509              :          CASE (ip_type)
     510              :             IF ((SUM(ABS(pot1%set(i)%ipbv%a - pot2%set(i)%ipbv%a)) == 0.0_dp) .AND. &
     511              :                 (pot1%set(i)%ipbv%rcore == pot2%set(i)%ipbv%rcore) .AND. &
     512          720 :                 (pot1%set(i)%ipbv%m == pot2%set(i)%ipbv%m) .AND. &
     513           16 :                 (pot1%set(i)%ipbv%b == pot2%set(i)%ipbv%b)) mycompare = .TRUE.
     514              :          CASE (tersoff_type)
     515              :             IF ((pot1%set(i)%tersoff%A == pot2%set(i)%tersoff%A) .AND. &
     516              :                 (pot1%set(i)%tersoff%B == pot2%set(i)%tersoff%B) .AND. &
     517              :                 (pot1%set(i)%tersoff%lambda1 == pot2%set(i)%tersoff%lambda1) .AND. &
     518              :                 (pot1%set(i)%tersoff%lambda2 == pot2%set(i)%tersoff%lambda2) .AND. &
     519              :                 (pot1%set(i)%tersoff%alpha == pot2%set(i)%tersoff%alpha) .AND. &
     520              :                 (pot1%set(i)%tersoff%beta == pot2%set(i)%tersoff%beta) .AND. &
     521              :                 (pot1%set(i)%tersoff%n == pot2%set(i)%tersoff%n) .AND. &
     522              :                 (pot1%set(i)%tersoff%c == pot2%set(i)%tersoff%c) .AND. &
     523              :                 (pot1%set(i)%tersoff%d == pot2%set(i)%tersoff%d) .AND. &
     524              :                 (pot1%set(i)%tersoff%h == pot2%set(i)%tersoff%h) .AND. &
     525              :                 (pot1%set(i)%tersoff%lambda3 == pot2%set(i)%tersoff%lambda3) .AND. &
     526              :                 (pot1%set(i)%tersoff%rcutsq == pot2%set(i)%tersoff%rcutsq) .AND. &
     527            0 :                 (pot1%set(i)%tersoff%bigR == pot2%set(i)%tersoff%bigR) .AND. &
     528            0 :                 (pot1%set(i)%tersoff%bigD == pot2%set(i)%tersoff%bigD)) mycompare = .TRUE.
     529              :          CASE (siepmann_type)
     530              :             IF ((pot1%set(i)%siepmann%B == pot2%set(i)%siepmann%B) .AND. &
     531              :                 (pot1%set(i)%siepmann%D == pot2%set(i)%siepmann%D) .AND. &
     532              :                 (pot1%set(i)%siepmann%E == pot2%set(i)%siepmann%E) .AND. &
     533              :                 (pot1%set(i)%siepmann%F == pot2%set(i)%siepmann%F) .AND. &
     534              :                 (pot1%set(i)%siepmann%beta == pot2%set(i)%siepmann%beta) .AND. &
     535              :                 (pot1%set(i)%siepmann%rcutsq == pot2%set(i)%siepmann%rcutsq) .AND. &
     536              :                 (pot1%set(i)%siepmann%allow_oh_formation .EQV. &
     537              :                  pot2%set(i)%siepmann%allow_oh_formation) .AND. &
     538              :                 (pot1%set(i)%siepmann%allow_o_formation .EQV. &
     539            0 :                  pot2%set(i)%siepmann%allow_o_formation) .AND. &
     540              :                 (pot1%set(i)%siepmann%allow_h3o_formation .EQV. &
     541            0 :                  pot2%set(i)%siepmann%allow_h3o_formation)) mycompare = .TRUE.
     542              :          CASE (gal_type)
     543              :             IF ((pot1%set(i)%gal%epsilon == pot2%set(i)%gal%epsilon) .AND. &
     544              :                 (pot1%set(i)%gal%bxy == pot2%set(i)%gal%bxy) .AND. &
     545              :                 (pot1%set(i)%gal%bz == pot2%set(i)%gal%bz) .AND. &
     546              :                 (pot1%set(i)%gal%r1 == pot2%set(i)%gal%r1) .AND. &
     547              :                 (pot1%set(i)%gal%r2 == pot2%set(i)%gal%r2) .AND. &
     548              :                 (pot1%set(i)%gal%a1 == pot2%set(i)%gal%a1) .AND. &
     549              :                 (pot1%set(i)%gal%a2 == pot2%set(i)%gal%a2) .AND. &
     550              :                 (pot1%set(i)%gal%a3 == pot2%set(i)%gal%a3) .AND. &
     551              :                 (pot1%set(i)%gal%a4 == pot2%set(i)%gal%a4) .AND. &
     552              :                 (pot1%set(i)%gal%a == pot2%set(i)%gal%a) .AND. &
     553              :                 (pot1%set(i)%gal%b == pot2%set(i)%gal%b) .AND. &
     554              :                 (pot1%set(i)%gal%c == pot2%set(i)%gal%c) .AND. &
     555              :                 (pot1%set(i)%gal%express .EQV. &
     556            0 :                  pot2%set(i)%gal%express) .AND. &
     557            0 :                 (pot1%set(i)%gal%rcutsq == pot2%set(i)%gal%rcutsq)) mycompare = .TRUE.
     558              :          CASE (gal21_type)
     559              :             IF ((pot1%set(i)%gal21%epsilon1 == pot2%set(i)%gal21%epsilon1) .AND. &
     560              :                 (pot1%set(i)%gal21%epsilon2 == pot2%set(i)%gal21%epsilon2) .AND. &
     561              :                 (pot1%set(i)%gal21%epsilon3 == pot2%set(i)%gal21%epsilon3) .AND. &
     562              :                 (pot1%set(i)%gal21%bxy1 == pot2%set(i)%gal21%bxy1) .AND. &
     563              :                 (pot1%set(i)%gal21%bxy2 == pot2%set(i)%gal21%bxy1) .AND. &
     564              :                 (pot1%set(i)%gal21%bz1 == pot2%set(i)%gal21%bz1) .AND. &
     565              :                 (pot1%set(i)%gal21%bz2 == pot2%set(i)%gal21%bz2) .AND. &
     566              :                 (pot1%set(i)%gal21%r1 == pot2%set(i)%gal21%r1) .AND. &
     567              :                 (pot1%set(i)%gal21%r2 == pot2%set(i)%gal21%r2) .AND. &
     568              :                 (pot1%set(i)%gal21%a11 == pot2%set(i)%gal21%a11) .AND. &
     569              :                 (pot1%set(i)%gal21%a12 == pot2%set(i)%gal21%a12) .AND. &
     570              :                 (pot1%set(i)%gal21%a13 == pot2%set(i)%gal21%a13) .AND. &
     571              :                 (pot1%set(i)%gal21%a21 == pot2%set(i)%gal21%a21) .AND. &
     572              :                 (pot1%set(i)%gal21%a22 == pot2%set(i)%gal21%a22) .AND. &
     573              :                 (pot1%set(i)%gal21%a23 == pot2%set(i)%gal21%a23) .AND. &
     574              :                 (pot1%set(i)%gal21%a31 == pot2%set(i)%gal21%a31) .AND. &
     575              :                 (pot1%set(i)%gal21%a32 == pot2%set(i)%gal21%a32) .AND. &
     576              :                 (pot1%set(i)%gal21%a33 == pot2%set(i)%gal21%a33) .AND. &
     577              :                 (pot1%set(i)%gal21%a41 == pot2%set(i)%gal21%a41) .AND. &
     578              :                 (pot1%set(i)%gal21%a42 == pot2%set(i)%gal21%a42) .AND. &
     579              :                 (pot1%set(i)%gal21%a43 == pot2%set(i)%gal21%a43) .AND. &
     580              :                 (pot1%set(i)%gal21%AO1 == pot2%set(i)%gal21%AO1) .AND. &
     581              :                 (pot1%set(i)%gal21%AO2 == pot2%set(i)%gal21%AO2) .AND. &
     582              :                 (pot1%set(i)%gal21%BO1 == pot2%set(i)%gal21%BO1) .AND. &
     583              :                 (pot1%set(i)%gal21%BO2 == pot2%set(i)%gal21%BO2) .AND. &
     584              :                 (pot1%set(i)%gal21%c == pot2%set(i)%gal21%c) .AND. &
     585              :                 (pot1%set(i)%gal21%AH1 == pot2%set(i)%gal21%AH1) .AND. &
     586              :                 (pot1%set(i)%gal21%AH2 == pot2%set(i)%gal21%AH2) .AND. &
     587              :                 (pot1%set(i)%gal21%BH1 == pot2%set(i)%gal21%BH1) .AND. &
     588              :                 (pot1%set(i)%gal21%BH2 == pot2%set(i)%gal21%BH2) .AND. &
     589              :                 (pot1%set(i)%gal21%express .EQV. &
     590            0 :                  pot2%set(i)%gal21%express) .AND. &
     591           68 :                 (pot1%set(i)%gal21%rcutsq == pot2%set(i)%gal21%rcutsq)) mycompare = .TRUE.
     592              : 
     593              :          END SELECT
     594              :          mycompare = mycompare .AND. &
     595           68 :                      (pot1%set(i)%rmin == pot2%set(i)%rmin) .AND. (pot1%set(i)%rmax == pot2%set(i)%rmax)
     596           68 :          IF ((mycompare) .AND. (i == 1)) compare = .TRUE.
     597          172 :          compare = compare .AND. mycompare
     598              :       END DO
     599              : 
     600              :    END SUBROUTINE compare_pot
     601              : 
     602              : ! **************************************************************************************************
     603              : !> \brief Creates the potential parameter type
     604              : !> \param potparm ...
     605              : !> \param nset ...
     606              : !> \author Teodoro Laino [teo] 11.2005
     607              : ! **************************************************************************************************
     608       525734 :    SUBROUTINE pair_potential_single_create(potparm, nset)
     609              :       TYPE(pair_potential_single_type), POINTER          :: potparm
     610              :       INTEGER, INTENT(IN), OPTIONAL                      :: nset
     611              : 
     612              :       INTEGER                                            :: i, lnset
     613              : 
     614       525734 :       CPASSERT(.NOT. ASSOCIATED(potparm))
     615      5783074 :       ALLOCATE (potparm)
     616       525734 :       lnset = 1
     617       525734 :       IF (PRESENT(nset)) lnset = nset
     618              :       ! Standard allocation to size 1
     619      1577202 :       ALLOCATE (potparm%type(lnset))
     620      2102944 :       ALLOCATE (potparm%set(lnset))
     621              :       NULLIFY (potparm%spl_f, &
     622       525734 :                potparm%pair_spline_data)
     623      1051476 :       DO i = 1, lnset
     624       525742 :          potparm%set(i)%rmin = not_initialized
     625       525742 :          potparm%set(i)%rmax = not_initialized
     626              :          NULLIFY (potparm%set(i)%ipbv, &
     627       525742 :                   potparm%set(i)%lj, &
     628       525742 :                   potparm%set(i)%gp, &
     629       525742 :                   potparm%set(i)%ft, &
     630       525742 :                   potparm%set(i)%willis, &
     631       525742 :                   potparm%set(i)%goodwin, &
     632       525742 :                   potparm%set(i)%eam, &
     633       525742 :                   potparm%set(i)%nequip, &
     634       525742 :                   potparm%set(i)%allegro, &
     635       525742 :                   potparm%set(i)%ace, &
     636       525742 :                   potparm%set(i)%deepmd, &
     637       525742 :                   potparm%set(i)%buck4r, &
     638       525742 :                   potparm%set(i)%buckmo, &
     639       525742 :                   potparm%set(i)%tersoff, &
     640       525742 :                   potparm%set(i)%siepmann, &
     641       525742 :                   potparm%set(i)%gal, &
     642       525742 :                   potparm%set(i)%gal21, &
     643       525742 :                   potparm%set(i)%ftd, &
     644      1051476 :                   potparm%set(i)%tab)
     645              :       END DO
     646       525734 :       CALL pair_potential_single_clean(potparm)
     647       525734 :    END SUBROUTINE pair_potential_single_create
     648              : 
     649              : ! **************************************************************************************************
     650              : !> \brief Cleans the potential parameter type
     651              : !> \param potparm ...
     652              : !> \author unknown
     653              : ! **************************************************************************************************
     654       570025 :    SUBROUTINE pair_potential_single_clean(potparm)
     655              :       TYPE(pair_potential_single_type), POINTER          :: potparm
     656              : 
     657              :       INTEGER                                            :: i
     658              : 
     659      1140058 :       potparm%type = nn_type
     660       570025 :       potparm%shell_type = nosh_nosh
     661       570025 :       potparm%undef = .TRUE.
     662       570025 :       potparm%no_pp = .FALSE.
     663       570025 :       potparm%no_mb = .FALSE.
     664       570025 :       potparm%at1 = 'NULL'
     665       570025 :       potparm%at2 = 'NULL'
     666       570025 :       potparm%rcutsq = 0.0_dp
     667       570025 :       IF (ASSOCIATED(potparm%pair_spline_data)) &
     668            0 :          CALL spline_data_p_release(potparm%pair_spline_data)
     669       570025 :       IF (ASSOCIATED(potparm%spl_f)) &
     670            0 :          CALL spline_factor_release(potparm%spl_f)
     671              : 
     672      1140058 :       DO i = 1, SIZE(potparm%type)
     673       570033 :          potparm%set(i)%rmin = not_initialized
     674       570033 :          potparm%set(i)%rmax = not_initialized
     675       570033 :          CALL pair_potential_lj_clean(potparm%set(i)%lj)
     676       570033 :          CALL pair_potential_williams_clean(potparm%set(i)%willis)
     677       570033 :          CALL pair_potential_goodwin_clean(potparm%set(i)%goodwin)
     678       570033 :          CALL pair_potential_eam_clean(potparm%set(i)%eam)
     679       570033 :          CALL pair_potential_nequip_clean(potparm%set(i)%nequip)
     680       570033 :          CALL pair_potential_allegro_clean(potparm%set(i)%allegro)
     681       570033 :          CALL pair_potential_ace_clean(potparm%set(i)%ace)
     682       570033 :          CALL pair_potential_deepmd_clean(potparm%set(i)%deepmd)
     683       570033 :          CALL pair_potential_buck4r_clean(potparm%set(i)%buck4r)
     684       570033 :          CALL pair_potential_buckmo_clean(potparm%set(i)%buckmo)
     685       570033 :          CALL pair_potential_bmhft_clean(potparm%set(i)%ft)
     686       570033 :          CALL pair_potential_bmhftd_clean(potparm%set(i)%ftd)
     687       570033 :          CALL pair_potential_ipbv_clean(potparm%set(i)%ipbv)
     688       570033 :          CALL pair_potential_gp_clean(potparm%set(i)%gp)
     689       570033 :          CALL pair_potential_tersoff_clean(potparm%set(i)%tersoff)
     690       570033 :          CALL pair_potential_siepmann_clean(potparm%set(i)%siepmann)
     691       570033 :          CALL pair_potential_gal_clean(potparm%set(i)%gal)
     692       570033 :          CALL pair_potential_gal21_clean(potparm%set(i)%gal21)
     693      1140058 :          CALL pair_potential_tab_clean(potparm%set(i)%tab)
     694              :       END DO
     695       570025 :    END SUBROUTINE pair_potential_single_clean
     696              : 
     697              : ! **************************************************************************************************
     698              : !> \brief Copy two potential parameter type
     699              : !> \param potparm_source ...
     700              : !> \param potparm_dest ...
     701              : !> \author Teodoro Laino [teo] 11.2005
     702              : ! **************************************************************************************************
     703        12492 :    SUBROUTINE pair_potential_single_copy(potparm_source, potparm_dest)
     704              :       TYPE(pair_potential_single_type), POINTER          :: potparm_source, potparm_dest
     705              : 
     706              :       INTEGER                                            :: i
     707              : 
     708        12492 :       CPASSERT(ASSOCIATED(potparm_source))
     709        12492 :       IF (.NOT. ASSOCIATED(potparm_dest)) THEN
     710            8 :          CALL pair_potential_single_create(potparm_dest, SIZE(potparm_source%type))
     711              :       ELSE
     712        12484 :          CALL pair_potential_single_clean(potparm_dest)
     713              :       END IF
     714        49968 :       potparm_dest%type = potparm_source%type
     715        12492 :       potparm_dest%shell_type = potparm_source%shell_type
     716        12492 :       potparm_dest%undef = potparm_source%undef
     717        12492 :       potparm_dest%no_mb = potparm_source%no_mb
     718        12492 :       potparm_dest%no_pp = potparm_source%no_pp
     719        12492 :       potparm_dest%at1 = potparm_source%at1
     720        12492 :       potparm_dest%at2 = potparm_source%at2
     721        12492 :       potparm_dest%rcutsq = potparm_source%rcutsq
     722        12492 :       IF (ASSOCIATED(potparm_source%pair_spline_data)) THEN
     723            0 :          CALL spline_data_p_copy(potparm_source%pair_spline_data, potparm_dest%pair_spline_data)
     724              :       END IF
     725              : 
     726        12492 :       IF (ASSOCIATED(potparm_source%spl_f)) THEN
     727            0 :          CALL spline_factor_copy(potparm_source%spl_f, potparm_dest%spl_f)
     728              :       END IF
     729              : 
     730        24984 :       DO i = 1, SIZE(potparm_source%type)
     731        12492 :          potparm_dest%set(i)%rmin = potparm_source%set(i)%rmin
     732        12492 :          potparm_dest%set(i)%rmax = potparm_source%set(i)%rmax
     733        12492 :          CALL pair_potential_lj_copy(potparm_source%set(i)%lj, potparm_dest%set(i)%lj)
     734        12492 :          CALL pair_potential_williams_copy(potparm_source%set(i)%willis, potparm_dest%set(i)%willis)
     735        12492 :          CALL pair_potential_goodwin_copy(potparm_source%set(i)%goodwin, potparm_dest%set(i)%goodwin)
     736        12492 :          CALL pair_potential_eam_copy(potparm_source%set(i)%eam, potparm_dest%set(i)%eam)
     737        12492 :          CALL pair_potential_nequip_copy(potparm_source%set(i)%nequip, potparm_dest%set(i)%nequip)
     738        12492 :          CALL pair_potential_allegro_copy(potparm_source%set(i)%allegro, potparm_dest%set(i)%allegro)
     739        12492 :          CALL pair_potential_ace_copy(potparm_source%set(i)%ace, potparm_dest%set(i)%ace)
     740        12492 :          CALL pair_potential_deepmd_copy(potparm_source%set(i)%deepmd, potparm_dest%set(i)%deepmd)
     741        12492 :          CALL pair_potential_bmhft_copy(potparm_source%set(i)%ft, potparm_dest%set(i)%ft)
     742        12492 :          CALL pair_potential_bmhftd_copy(potparm_source%set(i)%ftd, potparm_dest%set(i)%ftd)
     743        12492 :          CALL pair_potential_ipbv_copy(potparm_source%set(i)%ipbv, potparm_dest%set(i)%ipbv)
     744        12492 :          CALL pair_potential_buck4r_copy(potparm_source%set(i)%buck4r, potparm_dest%set(i)%buck4r)
     745        12492 :          CALL pair_potential_buckmo_copy(potparm_source%set(i)%buckmo, potparm_dest%set(i)%buckmo)
     746        12492 :          CALL pair_potential_gp_copy(potparm_source%set(i)%gp, potparm_dest%set(i)%gp)
     747        12492 :          CALL pair_potential_tersoff_copy(potparm_source%set(i)%tersoff, potparm_dest%set(i)%tersoff)
     748        12492 :          CALL pair_potential_siepmann_copy(potparm_source%set(i)%siepmann, potparm_dest%set(i)%siepmann)
     749        12492 :          CALL pair_potential_gal_copy(potparm_source%set(i)%gal, potparm_dest%set(i)%gal)
     750        12492 :          CALL pair_potential_gal21_copy(potparm_source%set(i)%gal21, potparm_dest%set(i)%gal21)
     751        24984 :          CALL pair_potential_tab_copy(potparm_source%set(i)%tab, potparm_dest%set(i)%tab)
     752              :       END DO
     753        12492 :    END SUBROUTINE pair_potential_single_copy
     754              : 
     755              : ! **************************************************************************************************
     756              : !> \brief Add potential parameter type to an existing potential parameter type
     757              : !>      Used in case of multiple_potential definition
     758              : !> \param potparm_source ...
     759              : !> \param potparm_dest ...
     760              : !> \author Teodoro Laino [teo] 11.2005
     761              : ! **************************************************************************************************
     762           38 :    SUBROUTINE pair_potential_single_add(potparm_source, potparm_dest)
     763              :       TYPE(pair_potential_single_type), POINTER          :: potparm_source, potparm_dest
     764              : 
     765              :       INTEGER                                            :: i, j, size_dest, size_source
     766              :       LOGICAL                                            :: allocate_new, check
     767              :       TYPE(pair_potential_single_type), POINTER          :: potparm_tmp
     768              : 
     769           38 :       CPASSERT(ASSOCIATED(potparm_source))
     770              :       ! At this level we expect all splines types
     771              :       ! be not allocated.. No sense add splines at this level.. in case fail!
     772              :       check = (.NOT. ASSOCIATED(potparm_source%pair_spline_data)) .AND. &
     773           38 :               (.NOT. ASSOCIATED(potparm_source%spl_f))
     774            0 :       CPASSERT(check)
     775              :       check = (.NOT. ASSOCIATED(potparm_dest%pair_spline_data)) .AND. &
     776           38 :               (.NOT. ASSOCIATED(potparm_dest%spl_f))
     777            0 :       CPASSERT(check)
     778              :       ! Increase the size of the destination potparm (in case) and copy the new data
     779           38 :       size_source = SIZE(potparm_source%type)
     780           38 :       allocate_new = .NOT. ASSOCIATED(potparm_dest)
     781           38 :       IF (.NOT. allocate_new) THEN
     782           38 :          size_dest = SIZE(potparm_dest%type)
     783           38 :          IF (size_dest == 1) THEN
     784              :             check = (ASSOCIATED(potparm_dest%set(1)%lj)) .OR. &
     785              :                     (ASSOCIATED(potparm_dest%set(1)%willis)) .OR. &
     786              :                     (ASSOCIATED(potparm_dest%set(1)%goodwin)) .OR. &
     787              :                     (ASSOCIATED(potparm_dest%set(1)%eam)) .OR. &
     788              :                     (ASSOCIATED(potparm_dest%set(1)%nequip)) .OR. &
     789              :                     (ASSOCIATED(potparm_dest%set(1)%allegro)) .OR. &
     790              :                     (ASSOCIATED(potparm_dest%set(1)%ace)) .OR. &
     791              :                     (ASSOCIATED(potparm_dest%set(1)%deepmd)) .OR. &
     792              :                     (ASSOCIATED(potparm_dest%set(1)%ft)) .OR. &
     793              :                     (ASSOCIATED(potparm_dest%set(1)%ftd)) .OR. &
     794              :                     (ASSOCIATED(potparm_dest%set(1)%ipbv)) .OR. &
     795              :                     (ASSOCIATED(potparm_dest%set(1)%buck4r)) .OR. &
     796              :                     (ASSOCIATED(potparm_dest%set(1)%buckmo)) .OR. &
     797              :                     (ASSOCIATED(potparm_dest%set(1)%gp)) .OR. &
     798              :                     (ASSOCIATED(potparm_dest%set(1)%tersoff)) .OR. &
     799              :                     (ASSOCIATED(potparm_dest%set(1)%siepmann)) .OR. &
     800              :                     (ASSOCIATED(potparm_dest%set(1)%gal)) .OR. &
     801              :                     (ASSOCIATED(potparm_dest%set(1)%gal)) .OR. &
     802           38 :                     (ASSOCIATED(potparm_dest%set(1)%tab))
     803              :             IF (.NOT. check) THEN
     804           30 :                allocate_new = .TRUE.
     805           30 :                CALL pair_potential_single_release(potparm_dest)
     806              :             END IF
     807              :          END IF
     808              :       END IF
     809            8 :       IF (allocate_new) THEN
     810           30 :          size_dest = 0
     811           30 :          CALL pair_potential_single_create(potparm_dest, size_source)
     812           30 :          potparm_dest%shell_type = potparm_source%shell_type
     813           30 :          potparm_dest%undef = potparm_source%undef
     814           30 :          potparm_dest%no_mb = potparm_source%no_mb
     815           30 :          potparm_dest%no_pp = potparm_source%no_pp
     816           30 :          potparm_dest%at1 = potparm_source%at1
     817           30 :          potparm_dest%at2 = potparm_source%at2
     818           30 :          potparm_dest%rcutsq = potparm_source%rcutsq
     819              :       ELSE
     820            8 :          size_dest = SIZE(potparm_dest%type)
     821            8 :          NULLIFY (potparm_tmp)
     822            8 :          CALL pair_potential_single_copy(potparm_dest, potparm_tmp)
     823            8 :          CALL pair_potential_single_release(potparm_dest)
     824            8 :          CALL pair_potential_single_create(potparm_dest, size_dest + size_source)
     825              :          ! Copy back original informations..
     826            8 :          potparm_dest%shell_type = potparm_tmp%shell_type
     827            8 :          potparm_dest%undef = potparm_tmp%undef
     828            8 :          potparm_dest%no_mb = potparm_tmp%no_mb
     829            8 :          potparm_dest%no_pp = potparm_tmp%no_pp
     830            8 :          potparm_dest%at1 = potparm_tmp%at1
     831            8 :          potparm_dest%at2 = potparm_tmp%at2
     832            8 :          potparm_dest%rcutsq = potparm_tmp%rcutsq
     833           16 :          DO i = 1, size_dest
     834            8 :             potparm_dest%type(i) = potparm_tmp%type(i)
     835            8 :             potparm_dest%set(i)%rmin = potparm_tmp%set(i)%rmin
     836            8 :             potparm_dest%set(i)%rmax = potparm_tmp%set(i)%rmax
     837            8 :             CALL pair_potential_lj_copy(potparm_tmp%set(i)%lj, potparm_dest%set(i)%lj)
     838            8 :             CALL pair_potential_williams_copy(potparm_tmp%set(i)%willis, potparm_dest%set(i)%willis)
     839            8 :             CALL pair_potential_goodwin_copy(potparm_tmp%set(i)%goodwin, potparm_dest%set(i)%goodwin)
     840            8 :             CALL pair_potential_eam_copy(potparm_tmp%set(i)%eam, potparm_dest%set(i)%eam)
     841            8 :             CALL pair_potential_nequip_copy(potparm_tmp%set(i)%nequip, potparm_dest%set(i)%nequip)
     842            8 :             CALL pair_potential_allegro_copy(potparm_tmp%set(i)%allegro, potparm_dest%set(i)%allegro)
     843            8 :             CALL pair_potential_ace_copy(potparm_tmp%set(i)%ace, potparm_dest%set(i)%ace)
     844            8 :             CALL pair_potential_deepmd_copy(potparm_tmp%set(i)%deepmd, potparm_dest%set(i)%deepmd)
     845            8 :             CALL pair_potential_bmhft_copy(potparm_tmp%set(i)%ft, potparm_dest%set(i)%ft)
     846            8 :             CALL pair_potential_bmhftd_copy(potparm_tmp%set(i)%ftd, potparm_dest%set(i)%ftd)
     847            8 :             CALL pair_potential_ipbv_copy(potparm_tmp%set(i)%ipbv, potparm_dest%set(i)%ipbv)
     848            8 :             CALL pair_potential_buck4r_copy(potparm_tmp%set(i)%buck4r, potparm_dest%set(i)%buck4r)
     849            8 :             CALL pair_potential_buckmo_copy(potparm_tmp%set(i)%buckmo, potparm_dest%set(i)%buckmo)
     850            8 :             CALL pair_potential_gp_copy(potparm_tmp%set(i)%gp, potparm_dest%set(i)%gp)
     851            8 :             CALL pair_potential_tersoff_copy(potparm_tmp%set(i)%tersoff, potparm_dest%set(i)%tersoff)
     852            8 :             CALL pair_potential_siepmann_copy(potparm_tmp%set(i)%siepmann, potparm_dest%set(i)%siepmann)
     853            8 :             CALL pair_potential_gal_copy(potparm_tmp%set(i)%gal, potparm_dest%set(i)%gal)
     854            8 :             CALL pair_potential_gal21_copy(potparm_tmp%set(i)%gal21, potparm_dest%set(i)%gal21)
     855           16 :             CALL pair_potential_tab_copy(potparm_tmp%set(i)%tab, potparm_dest%set(i)%tab)
     856              :          END DO
     857            8 :          CALL pair_potential_single_release(potparm_tmp)
     858              :       END IF
     859              :       ! Further check with main option with source and dest (already filled with few informations)
     860              :       check = (potparm_dest%shell_type == potparm_source%shell_type) .AND. &
     861              :               (potparm_dest%undef .EQV. potparm_source%undef) .AND. &
     862              :               (potparm_dest%no_mb .EQV. potparm_source%no_mb) .AND. &
     863              :               (potparm_dest%no_pp .EQV. potparm_source%no_pp) .AND. &
     864              :               (potparm_dest%at1 == potparm_source%at1) .AND. &
     865              :               (potparm_dest%at2 == potparm_source%at2) .AND. &
     866           38 :               (potparm_dest%rcutsq == potparm_source%rcutsq)
     867            0 :       CPASSERT(check)
     868              :       ! Now copy the new pair_potential type
     869           76 :       DO i = size_dest + 1, size_dest + size_source
     870           38 :          j = i - size_dest
     871           38 :          potparm_dest%type(i) = potparm_source%type(j)
     872           38 :          potparm_dest%set(i)%rmin = potparm_source%set(j)%rmin
     873           38 :          potparm_dest%set(i)%rmax = potparm_source%set(j)%rmax
     874           38 :          CALL pair_potential_lj_copy(potparm_source%set(j)%lj, potparm_dest%set(i)%lj)
     875           38 :          CALL pair_potential_williams_copy(potparm_source%set(j)%willis, potparm_dest%set(i)%willis)
     876           38 :          CALL pair_potential_goodwin_copy(potparm_source%set(j)%goodwin, potparm_dest%set(i)%goodwin)
     877           38 :          CALL pair_potential_eam_copy(potparm_source%set(j)%eam, potparm_dest%set(i)%eam)
     878           38 :          CALL pair_potential_nequip_copy(potparm_source%set(j)%nequip, potparm_dest%set(i)%nequip)
     879           38 :          CALL pair_potential_allegro_copy(potparm_source%set(j)%allegro, potparm_dest%set(i)%allegro)
     880           38 :          CALL pair_potential_ace_copy(potparm_source%set(j)%ace, potparm_dest%set(i)%ace)
     881           38 :          CALL pair_potential_deepmd_copy(potparm_source%set(j)%deepmd, potparm_dest%set(i)%deepmd)
     882           38 :          CALL pair_potential_bmhft_copy(potparm_source%set(j)%ft, potparm_dest%set(i)%ft)
     883           38 :          CALL pair_potential_bmhftd_copy(potparm_source%set(j)%ftd, potparm_dest%set(i)%ftd)
     884           38 :          CALL pair_potential_ipbv_copy(potparm_source%set(j)%ipbv, potparm_dest%set(i)%ipbv)
     885           38 :          CALL pair_potential_buck4r_copy(potparm_source%set(j)%buck4r, potparm_dest%set(i)%buck4r)
     886           38 :          CALL pair_potential_buckmo_copy(potparm_source%set(j)%buckmo, potparm_dest%set(i)%buckmo)
     887           38 :          CALL pair_potential_gp_copy(potparm_source%set(j)%gp, potparm_dest%set(i)%gp)
     888           38 :          CALL pair_potential_tersoff_copy(potparm_source%set(j)%tersoff, potparm_dest%set(i)%tersoff)
     889           38 :          CALL pair_potential_siepmann_copy(potparm_source%set(j)%siepmann, potparm_dest%set(i)%siepmann)
     890           38 :          CALL pair_potential_gal_copy(potparm_source%set(j)%gal, potparm_dest%set(i)%gal)
     891           38 :          CALL pair_potential_gal21_copy(potparm_source%set(j)%gal21, potparm_dest%set(i)%gal21)
     892           76 :          CALL pair_potential_tab_copy(potparm_source%set(j)%tab, potparm_dest%set(i)%tab)
     893              :       END DO
     894           38 :    END SUBROUTINE pair_potential_single_add
     895              : 
     896              : ! **************************************************************************************************
     897              : !> \brief Release Data-structure that constains potential parameters of a single pair
     898              : !> \param potparm ...
     899              : !> \author Teodoro Laino [Teo] 11.2005
     900              : ! **************************************************************************************************
     901       525734 :    SUBROUTINE pair_potential_single_release(potparm)
     902              :       TYPE(pair_potential_single_type), POINTER          :: potparm
     903              : 
     904              :       INTEGER                                            :: i
     905              : 
     906       525734 :       CPASSERT(ASSOCIATED(potparm))
     907       525734 :       CALL spline_data_p_release(potparm%pair_spline_data)
     908       525734 :       CALL spline_factor_release(potparm%spl_f)
     909      1051476 :       DO i = 1, SIZE(potparm%type)
     910       525742 :          CALL pair_potential_ipbv_release(potparm%set(i)%ipbv)
     911       525742 :          CALL pair_potential_lj_release(potparm%set(i)%lj)
     912       525742 :          CALL pair_potential_bmhft_release(potparm%set(i)%ft)
     913       525742 :          CALL pair_potential_bmhftd_release(potparm%set(i)%ftd)
     914       525742 :          CALL pair_potential_williams_release(potparm%set(i)%willis)
     915       525742 :          CALL pair_potential_goodwin_release(potparm%set(i)%goodwin)
     916       525742 :          CALL pair_potential_eam_release(potparm%set(i)%eam)
     917       525742 :          CALL pair_potential_nequip_release(potparm%set(i)%nequip)
     918       525742 :          CALL pair_potential_allegro_release(potparm%set(i)%allegro)
     919       525742 :          CALL pair_potential_ace_release(potparm%set(i)%ace)
     920       525742 :          CALL pair_potential_deepmd_release(potparm%set(i)%deepmd)
     921       525742 :          CALL pair_potential_buck4r_release(potparm%set(i)%buck4r)
     922       525742 :          CALL pair_potential_buckmo_release(potparm%set(i)%buckmo)
     923       525742 :          CALL pair_potential_gp_release(potparm%set(i)%gp)
     924       525742 :          CALL pair_potential_tersoff_release(potparm%set(i)%tersoff)
     925       525742 :          CALL pair_potential_siepmann_release(potparm%set(i)%siepmann)
     926       525742 :          CALL pair_potential_gal_release(potparm%set(i)%gal)
     927       525742 :          CALL pair_potential_gal21_release(potparm%set(i)%gal21)
     928      1051476 :          CALL pair_potential_tab_release(potparm%set(i)%tab)
     929              :       END DO
     930       525734 :       DEALLOCATE (potparm%type)
     931       525734 :       DEALLOCATE (potparm%set)
     932       525734 :       DEALLOCATE (potparm)
     933       525734 :    END SUBROUTINE pair_potential_single_release
     934              : 
     935              : ! **************************************************************************************************
     936              : !> \brief Data-structure that constains potential parameters
     937              : !> \param potparm ...
     938              : !> \param nkinds ...
     939              : !> \author unknown
     940              : ! **************************************************************************************************
     941         5292 :    SUBROUTINE pair_potential_pp_create(potparm, nkinds)
     942              :       TYPE(pair_potential_pp_type), POINTER              :: potparm
     943              :       INTEGER, INTENT(IN)                                :: nkinds
     944              : 
     945              :       INTEGER                                            :: i, j
     946              : 
     947         5292 :       CPASSERT(.NOT. ASSOCIATED(potparm))
     948         5292 :       ALLOCATE (potparm)
     949      1052728 :       ALLOCATE (potparm%pot(nkinds, nkinds))
     950        27846 :       DO i = 1, nkinds
     951      1036852 :          DO j = 1, nkinds
     952      1031560 :             NULLIFY (potparm%pot(i, j)%pot)
     953              :          END DO
     954              :       END DO
     955              :       ! Use no-redundancy in the potential definition
     956        27846 :       DO i = 1, nkinds
     957       543626 :          DO j = i, nkinds
     958       515780 :             CALL pair_potential_single_create(potparm%pot(i, j)%pot)
     959       538334 :             potparm%pot(j, i)%pot => potparm%pot(i, j)%pot
     960              :          END DO
     961              :       END DO
     962         5292 :    END SUBROUTINE pair_potential_pp_create
     963              : 
     964              : ! **************************************************************************************************
     965              : !> \brief Release Data-structure that constains potential parameters
     966              : !> \param potparm ...
     967              : !> \par History
     968              : !>      Teodoro Laino [Teo] 11.2005 : Reorganizing the structures to optimize
     969              : !>                                    memory management
     970              : !> \author unknown
     971              : ! **************************************************************************************************
     972         5388 :    SUBROUTINE pair_potential_pp_release(potparm)
     973              :       TYPE(pair_potential_pp_type), POINTER              :: potparm
     974              : 
     975              :       INTEGER                                            :: i, j
     976              : 
     977         5388 :       IF (ASSOCIATED(potparm)) THEN
     978         5292 :          IF (ASSOCIATED(potparm%pot)) THEN
     979        27846 :             DO i = 1, SIZE(potparm%pot, 1)
     980       543626 :                DO j = i, SIZE(potparm%pot, 2)
     981       515780 :                   CALL pair_potential_single_release(potparm%pot(i, j)%pot)
     982       538334 :                   NULLIFY (potparm%pot(j, i)%pot)
     983              :                END DO
     984              :             END DO
     985         5292 :             DEALLOCATE (potparm%pot)
     986              :          END IF
     987         5292 :          DEALLOCATE (potparm)
     988              :       END IF
     989         5388 :       NULLIFY (potparm)
     990         5388 :    END SUBROUTINE pair_potential_pp_release
     991              : 
     992              : ! **************************************************************************************************
     993              : !> \brief Data-structure that constains potential parameters
     994              : !> \param potparm ...
     995              : !> \param ndim ...
     996              : !> \param ub ...
     997              : !> \param lb ...
     998              : !> \author unknown
     999              : ! **************************************************************************************************
    1000         2653 :    SUBROUTINE pair_potential_p_create(potparm, ndim, ub, lb)
    1001              :       TYPE(pair_potential_p_type), POINTER               :: potparm
    1002              :       INTEGER, INTENT(IN), OPTIONAL                      :: ndim, ub, lb
    1003              : 
    1004              :       INTEGER                                            :: i, loc_lb, loc_ub
    1005              : 
    1006         2653 :       CPASSERT(.NOT. ASSOCIATED(potparm))
    1007         2653 :       ALLOCATE (potparm)
    1008         2653 :       IF (PRESENT(ndim)) THEN
    1009            0 :          loc_lb = 1
    1010            0 :          loc_ub = ndim
    1011            0 :          ALLOCATE (potparm%pot(loc_lb:loc_ub))
    1012            0 :          IF (PRESENT(lb) .OR. PRESENT(ub)) THEN
    1013            0 :             CPABORT("")
    1014              :          END IF
    1015         2653 :       ELSE IF (PRESENT(lb) .AND. PRESENT(ub)) THEN
    1016         2653 :          loc_lb = lb
    1017         2653 :          loc_ub = ub
    1018        17867 :          ALLOCATE (potparm%pot(loc_lb:loc_ub))
    1019              :          IF (PRESENT(ndim)) THEN
    1020              :             CPABORT("")
    1021              :          END IF
    1022              :       ELSE
    1023            0 :          CPABORT("")
    1024              :       END IF
    1025        12561 :       DO i = loc_lb, loc_ub
    1026         9908 :          NULLIFY (potparm%pot(i)%pot)
    1027        12561 :          CALL pair_potential_single_create(potparm%pot(i)%pot)
    1028              :       END DO
    1029         2653 :    END SUBROUTINE pair_potential_p_create
    1030              : 
    1031              : ! **************************************************************************************************
    1032              : !> \brief Release Data-structure that constains potential parameters
    1033              : !> \param potparm ...
    1034              : !> \par History
    1035              : !>      Teodoro Laino [Teo] 11.2005 : Reorganizing the structures to optimize
    1036              : !>                                    memory management
    1037              : !> \author unknown
    1038              : ! **************************************************************************************************
    1039         2653 :    SUBROUTINE pair_potential_p_release(potparm)
    1040              :       TYPE(pair_potential_p_type), POINTER               :: potparm
    1041              : 
    1042              :       INTEGER                                            :: i
    1043              : 
    1044         2653 :       IF (ASSOCIATED(potparm)) THEN
    1045         2653 :          IF (ASSOCIATED(potparm%pot)) THEN
    1046        12561 :             DO i = 1, SIZE(potparm%pot)
    1047        12561 :                CALL pair_potential_single_release(potparm%pot(i)%pot)
    1048              :             END DO
    1049         2653 :             DEALLOCATE (potparm%pot)
    1050              :          END IF
    1051         2653 :          DEALLOCATE (potparm)
    1052              :       END IF
    1053         2653 :       NULLIFY (potparm)
    1054         2653 :    END SUBROUTINE pair_potential_p_release
    1055              : 
    1056              : ! **************************************************************************************************
    1057              : !> \brief Copy structures between two pair_potential_p_type
    1058              : !> \param source ...
    1059              : !> \param dest ...
    1060              : !> \param istart ...
    1061              : !> \param iend ...
    1062              : !> \author Teodoro Laino [Teo] 11.2005
    1063              : ! **************************************************************************************************
    1064          614 :    SUBROUTINE pair_potential_p_copy(source, dest, istart, iend)
    1065              :       TYPE(pair_potential_p_type), POINTER               :: source, dest
    1066              :       INTEGER, INTENT(IN), OPTIONAL                      :: istart, iend
    1067              : 
    1068              :       INTEGER                                            :: i, l_end, l_start
    1069              : 
    1070          614 :       CPASSERT(ASSOCIATED(source))
    1071          614 :       CPASSERT(ASSOCIATED(dest))
    1072          614 :       l_start = LBOUND(source%pot, 1)
    1073          614 :       l_end = UBOUND(source%pot, 1)
    1074          614 :       IF (PRESENT(istart)) l_start = istart
    1075          614 :       IF (PRESENT(iend)) l_end = iend
    1076         1960 :       DO i = l_start, l_end
    1077         1346 :          IF (.NOT. ASSOCIATED(source%pot(i)%pot)) &
    1078            0 :             CALL pair_potential_single_create(source%pot(i)%pot)
    1079         1960 :          CALL pair_potential_single_copy(source%pot(i)%pot, dest%pot(i)%pot)
    1080              :       END DO
    1081          614 :    END SUBROUTINE pair_potential_p_copy
    1082              : 
    1083              : ! **************************************************************************************************
    1084              : !> \brief Cleans the potential parameter type
    1085              : !> \param p ...
    1086              : !> \param lb1_new ...
    1087              : !> \param ub1_new ...
    1088              : !> \param lj ...
    1089              : !> \param lj_charmm ...
    1090              : !> \param williams ...
    1091              : !> \param goodwin ...
    1092              : !> \param eam ...
    1093              : !> \param nequip ...
    1094              : !> \param allegro ...
    1095              : !> \param bmhft ...
    1096              : !> \param bmhftd ...
    1097              : !> \param ipbv ...
    1098              : !> \param buck4r ...
    1099              : !> \param buckmo ...
    1100              : !> \param gp ...
    1101              : !> \param tersoff ...
    1102              : !> \param siepmann ...
    1103              : !> \param gal ...
    1104              : !> \param gal21 ...
    1105              : !> \param tab ...
    1106              : !> \param deepmd ...
    1107              : !> \param ace ...
    1108              : !> \author Teodoro Laino [Teo] 11.2005
    1109              : ! **************************************************************************************************
    1110         2346 :    SUBROUTINE pair_potential_reallocate(p, lb1_new, ub1_new, lj, lj_charmm, williams, goodwin, eam, &
    1111              :                                         nequip, allegro, bmhft, bmhftd, ipbv, buck4r, buckmo, &
    1112              :                                         gp, tersoff, siepmann, gal, gal21, tab, deepmd, ace)
    1113              :       TYPE(pair_potential_p_type), POINTER               :: p
    1114              :       INTEGER, INTENT(IN)                                :: lb1_new, ub1_new
    1115              :       LOGICAL, INTENT(IN), OPTIONAL :: lj, lj_charmm, williams, goodwin, eam, nequip, allegro, &
    1116              :          bmhft, bmhftd, ipbv, buck4r, buckmo, gp, tersoff, siepmann, gal, gal21, tab, deepmd, ace
    1117              : 
    1118              :       INTEGER                                            :: i, ipot, lb1_old, std_dim, ub1_old
    1119              :       LOGICAL :: check, lace, lallegro, lbmhft, lbmhftd, lbuck4r, lbuckmo, ldeepmd, leam, lgal, &
    1120              :          lgal21, lgoodwin, lgp, lipbv, llj, llj_charmm, lnequip, lsiepmann, ltab, ltersoff, &
    1121              :          lwilliams
    1122              :       TYPE(pair_potential_p_type), POINTER               :: work
    1123              : 
    1124         2346 :       NULLIFY (work)
    1125         2346 :       ipot = 0
    1126         2346 :       llj = .FALSE.; IF (PRESENT(lj)) llj = lj
    1127         2346 :       llj_charmm = .FALSE.; IF (PRESENT(lj_charmm)) llj_charmm = lj_charmm
    1128         2346 :       lwilliams = .FALSE.; IF (PRESENT(williams)) lwilliams = williams
    1129         2346 :       lgoodwin = .FALSE.; IF (PRESENT(goodwin)) lgoodwin = goodwin
    1130         2346 :       leam = .FALSE.; IF (PRESENT(eam)) leam = eam
    1131         2346 :       lnequip = .FALSE.; IF (PRESENT(nequip)) lnequip = nequip
    1132         2346 :       lallegro = .FALSE.; IF (PRESENT(allegro)) lallegro = allegro
    1133         2346 :       lace = .FALSE.; IF (PRESENT(ace)) lace = ace
    1134         2346 :       ldeepmd = .FALSE.; IF (PRESENT(deepmd)) ldeepmd = deepmd
    1135         2346 :       lbmhft = .FALSE.; IF (PRESENT(bmhft)) lbmhft = bmhft
    1136         2346 :       lbmhftd = .FALSE.; IF (PRESENT(bmhftd)) lbmhftd = bmhftd
    1137         2346 :       lipbv = .FALSE.; IF (PRESENT(ipbv)) lipbv = ipbv
    1138         2346 :       lbuck4r = .FALSE.; IF (PRESENT(buck4r)) lbuck4r = buck4r
    1139         2346 :       lbuckmo = .FALSE.; IF (PRESENT(buckmo)) lbuckmo = buckmo
    1140         2346 :       lgp = .FALSE.; IF (PRESENT(gp)) lgp = gp
    1141         2346 :       ltersoff = .FALSE.; IF (PRESENT(tersoff)) ltersoff = tersoff
    1142         2346 :       lsiepmann = .FALSE.; IF (PRESENT(siepmann)) lsiepmann = siepmann
    1143         2346 :       lgal = .FALSE.; IF (PRESENT(gal)) lgal = gal
    1144         2346 :       lgal21 = .FALSE.; IF (PRESENT(gal21)) lgal21 = gal21
    1145         2346 :       ltab = .FALSE.; IF (PRESENT(tab)) ltab = tab
    1146              : 
    1147         2346 :       IF (llj) THEN
    1148            0 :          ipot = lj_type
    1149              :          check = .NOT. (llj_charmm .OR. lwilliams .OR. lgoodwin .OR. leam .OR. lnequip .OR. lallegro &
    1150              :                         .OR. lbmhft .OR. lbmhftd .OR. lipbv .OR. lbuck4r .OR. lbuckmo .OR. lgp .OR. ltersoff &
    1151            0 :                         .OR. lsiepmann .OR. lgal .OR. lgal21 .OR. ltab .OR. ldeepmd .OR. lace)
    1152            0 :          CPASSERT(check)
    1153              :       END IF
    1154         2346 :       IF (llj_charmm) THEN
    1155         1004 :          ipot = lj_charmm_type
    1156              :          check = .NOT. (llj .OR. lwilliams .OR. lgoodwin .OR. leam .OR. lnequip .OR. lallegro &
    1157              :                         .OR. lbmhft .OR. lbmhftd .OR. lipbv .OR. lbuck4r .OR. lbuckmo .OR. lgp .OR. ltersoff &
    1158         1004 :                         .OR. lsiepmann .OR. lgal .OR. lgal21 .OR. ltab .OR. ldeepmd .OR. lace)
    1159            0 :          CPASSERT(check)
    1160              :       END IF
    1161         2346 :       IF (lwilliams) THEN
    1162          375 :          ipot = wl_type
    1163              :          check = .NOT. (llj .OR. llj_charmm .OR. lgoodwin .OR. leam .OR. lnequip .OR. lallegro &
    1164              :                         .OR. lbmhft .OR. lbmhftd .OR. lipbv .OR. lbuck4r .OR. lbuckmo .OR. lgp .OR. ltersoff &
    1165          375 :                         .OR. lsiepmann .OR. lgal .OR. lgal21 .OR. ltab .OR. ldeepmd .OR. lace)
    1166            0 :          CPASSERT(check)
    1167              :       END IF
    1168         2346 :       IF (lgoodwin) THEN
    1169            0 :          ipot = gw_type
    1170              :          check = .NOT. (llj .OR. llj_charmm .OR. lwilliams .OR. leam .OR. lnequip .OR. lallegro &
    1171              :                         .OR. lbmhft .OR. lbmhftd .OR. lipbv .OR. lbuck4r .OR. lbuckmo .OR. lgp .OR. ltersoff &
    1172            0 :                         .OR. lsiepmann .OR. lgal .OR. lgal21 .OR. ltab .OR. ldeepmd .OR. lace)
    1173            0 :          CPASSERT(check)
    1174              :       END IF
    1175         2346 :       IF (leam) THEN
    1176           12 :          ipot = ea_type
    1177              :          check = .NOT. (llj .OR. llj_charmm .OR. lgoodwin .OR. lwilliams .OR. lnequip .OR. lallegro &
    1178              :                         .OR. lbmhft .OR. lbmhftd .OR. lipbv .OR. lbuck4r .OR. lbuckmo .OR. lgp .OR. ltersoff &
    1179           12 :                         .OR. lsiepmann .OR. lgal .OR. lgal21 .OR. ltab .OR. ldeepmd .OR. lace)
    1180            0 :          CPASSERT(check)
    1181              :       END IF
    1182         2346 :       IF (lnequip) THEN
    1183            4 :          ipot = nequip_type
    1184              :          check = .NOT. (llj .OR. llj_charmm .OR. lgoodwin .OR. lwilliams .OR. leam .OR. lallegro &
    1185              :                         .OR. lbmhft .OR. lbmhftd .OR. lipbv .OR. lbuck4r .OR. lbuckmo .OR. lgp .OR. ltersoff &
    1186            4 :                         .OR. lsiepmann .OR. lgal .OR. lgal21 .OR. ltab .OR. ldeepmd .OR. lace)
    1187            0 :          CPASSERT(check)
    1188              :       END IF
    1189         2346 :       IF (lallegro) THEN
    1190            4 :          ipot = allegro_type
    1191              :          check = .NOT. (llj .OR. llj_charmm .OR. lgoodwin .OR. lwilliams .OR. leam .OR. lnequip &
    1192              :                         .OR. lbmhft .OR. lbmhftd .OR. lipbv .OR. lbuck4r .OR. lbuckmo .OR. lgp .OR. ltersoff &
    1193            4 :                         .OR. lsiepmann .OR. lgal .OR. lgal21 .OR. ltab .OR. ldeepmd .OR. lace)
    1194            0 :          CPASSERT(check)
    1195              :       END IF
    1196         2346 :       IF (lace) THEN
    1197            6 :          ipot = ace_type
    1198              :          check = .NOT. (llj .OR. llj_charmm .OR. lgoodwin .OR. lwilliams .OR. leam .OR. lnequip &
    1199              :                         .OR. lallegro .OR. lbmhft .OR. lbmhftd .OR. lipbv .OR. lbuck4r .OR. lbuckmo .OR. lgp &
    1200            6 :                         .OR. ltersoff .OR. lsiepmann .OR. lgal .OR. lgal21 .OR. ltab .OR. ldeepmd)
    1201            0 :          CPASSERT(check)
    1202              :       END IF
    1203         2346 :       IF (ldeepmd) THEN
    1204            2 :          ipot = deepmd_type
    1205              :          check = .NOT. (llj .OR. llj_charmm .OR. lgoodwin .OR. lwilliams .OR. leam .OR. lnequip &
    1206              :                         .OR. lallegro .OR. lbmhft .OR. lbmhftd .OR. lipbv .OR. lbuck4r .OR. lbuckmo .OR. lgp &
    1207            2 :                         .OR. ltersoff .OR. lsiepmann .OR. lgal .OR. lgal21 .OR. ltab .OR. lace)
    1208            0 :          CPASSERT(check)
    1209              :       END IF
    1210         2346 :       IF (lbmhft) THEN
    1211            4 :          ipot = ft_type
    1212              :          check = .NOT. (llj .OR. llj_charmm .OR. lgoodwin .OR. lwilliams .OR. leam .OR. lnequip &
    1213              :                         .OR. lallegro .OR. lbmhftd .OR. lipbv .OR. lbuck4r .OR. lbuckmo .OR. lgp .OR. ltersoff &
    1214            4 :                         .OR. lsiepmann .OR. lgal .OR. lgal21 .OR. ltab .OR. ldeepmd .OR. lace)
    1215            0 :          CPASSERT(check)
    1216              :       END IF
    1217         2346 :       IF (lbmhftd) THEN
    1218           18 :          ipot = ftd_type
    1219              :          check = .NOT. (llj .OR. llj_charmm .OR. lgoodwin .OR. lwilliams .OR. leam .OR. lnequip &
    1220              :                         .OR. lallegro .OR. lbmhft .OR. lipbv .OR. lbuck4r .OR. lbuckmo .OR. lgp .OR. ltersoff &
    1221           18 :                         .OR. lsiepmann .OR. lgal .OR. lgal21 .OR. ltab .OR. ldeepmd .OR. lace)
    1222            0 :          CPASSERT(check)
    1223              :       END IF
    1224         2346 :       IF (lipbv) THEN
    1225           16 :          ipot = ip_type
    1226              :          check = .NOT. (llj .OR. llj_charmm .OR. lgoodwin .OR. lwilliams .OR. leam .OR. lnequip &
    1227              :                         .OR. lallegro .OR. lbmhft .OR. lbmhftd .OR. lbuck4r .OR. lbuckmo .OR. lgp .OR. ltersoff &
    1228           16 :                         .OR. lsiepmann .OR. lgal .OR. lgal21 .OR. ltab .OR. ldeepmd .OR. lace)
    1229            0 :          CPASSERT(check)
    1230              :       END IF
    1231         2346 :       IF (lbuck4r) THEN
    1232          262 :          ipot = b4_type
    1233              :          check = .NOT. (llj .OR. llj_charmm .OR. lgoodwin .OR. lwilliams .OR. leam .OR. lnequip &
    1234              :                         .OR. lallegro .OR. lbmhft .OR. lbmhftd .OR. lipbv .OR. lbuckmo .OR. lgp .OR. ltersoff &
    1235          262 :                         .OR. lsiepmann .OR. lgal .OR. lgal21 .OR. ltab .OR. ldeepmd .OR. lace)
    1236            0 :          CPASSERT(check)
    1237              :       END IF
    1238         2346 :       IF (lbuckmo) THEN
    1239            6 :          ipot = bm_type
    1240              :          check = .NOT. (llj .OR. llj_charmm .OR. lgoodwin .OR. lwilliams .OR. leam .OR. lnequip &
    1241              :                         .OR. lbmhft .OR. lbmhftd .OR. lipbv .OR. lbuck4r .OR. lgp .OR. ltersoff &
    1242            6 :                         .OR. lsiepmann .OR. lgal .OR. lgal21 .OR. ltab .OR. ldeepmd .OR. lace)
    1243            0 :          CPASSERT(check)
    1244              :       END IF
    1245         2346 :       IF (ltersoff) THEN
    1246           40 :          ipot = tersoff_type
    1247              :          check = .NOT. (llj .OR. llj_charmm .OR. lgoodwin .OR. lwilliams .OR. leam .OR. lnequip &
    1248              :                         .OR. lallegro .OR. lbmhft .OR. lbmhftd .OR. lipbv .OR. lbuck4r .OR. lgp .OR. lbuckmo &
    1249           40 :                         .OR. lsiepmann .OR. lgal .OR. lgal21 .OR. ltab .OR. ldeepmd .OR. lace)
    1250            0 :          CPASSERT(check)
    1251              :       END IF
    1252         2346 :       IF (lsiepmann) THEN
    1253            5 :          ipot = siepmann_type
    1254              :          check = .NOT. (llj .OR. llj_charmm .OR. lgoodwin .OR. lwilliams .OR. leam .OR. lnequip &
    1255              :                         .OR. lallegro .OR. lbmhft .OR. lbmhftd .OR. lipbv .OR. lbuck4r .OR. lgp .OR. lbuckmo &
    1256            5 :                         .OR. ltersoff .OR. lgal .OR. lgal21 .OR. ltab .OR. ldeepmd .OR. lace)
    1257            0 :          CPASSERT(check)
    1258              :       END IF
    1259         2346 :       IF (lgal) THEN
    1260            1 :          ipot = gal_type
    1261              :          check = .NOT. (llj .OR. llj_charmm .OR. lgoodwin .OR. lwilliams .OR. leam .OR. lnequip &
    1262              :                         .OR. lallegro .OR. lbmhft .OR. lbmhftd .OR. lipbv .OR. lbuck4r .OR. lgp .OR. lbuckmo &
    1263            1 :                         .OR. ltersoff .OR. lsiepmann .OR. lgal21 .OR. ltab .OR. ldeepmd .OR. lace)
    1264            0 :          CPASSERT(check)
    1265              :       END IF
    1266         2346 :       IF (lgal21) THEN
    1267            1 :          ipot = gal21_type
    1268              :          check = .NOT. (llj .OR. llj_charmm .OR. lgoodwin .OR. lwilliams .OR. leam .OR. lnequip &
    1269              :                         .OR. lallegro .OR. lbmhft .OR. lbmhftd .OR. lipbv .OR. lbuck4r .OR. lgp .OR. lbuckmo &
    1270            1 :                         .OR. ltersoff .OR. lsiepmann .OR. lgal .OR. ltab .OR. ldeepmd .OR. lace)
    1271            0 :          CPASSERT(check)
    1272              :       END IF
    1273         2346 :       IF (lgp) THEN
    1274          578 :          ipot = gp_type
    1275              :          check = .NOT. (llj .OR. llj_charmm .OR. lgoodwin .OR. lwilliams .OR. leam .OR. lnequip &
    1276              :                         .OR. lallegro .OR. lbmhft .OR. lbmhftd .OR. lipbv .OR. lbuck4r .OR. lgal21 .OR. lbuckmo &
    1277          578 :                         .OR. ltersoff .OR. lsiepmann .OR. lgal .OR. ltab .OR. ldeepmd .OR. lace)
    1278            0 :          CPASSERT(check)
    1279              :       END IF
    1280         2346 :       IF (ltab) THEN
    1281            8 :          ipot = tab_type
    1282              :          check = .NOT. (llj .OR. llj_charmm .OR. lgoodwin .OR. lwilliams .OR. leam .OR. lnequip &
    1283              :                         .OR. lallegro .OR. lbmhft .OR. lbmhftd .OR. lipbv .OR. lbuck4r .OR. lgp .OR. lgal21 &
    1284            8 :                         .OR. lbuckmo .OR. ltersoff .OR. lsiepmann .OR. lgal .OR. lace)
    1285            0 :          CPASSERT(check)
    1286              :       END IF
    1287              : 
    1288         2346 :       lb1_old = 0
    1289         2346 :       ub1_old = 0
    1290         2346 :       IF (ASSOCIATED(p)) THEN
    1291          307 :          lb1_old = LBOUND(p%pot, 1)
    1292          307 :          ub1_old = UBOUND(p%pot, 1)
    1293          307 :          CALL pair_potential_p_create(work, lb=lb1_old, ub=ub1_old)
    1294          307 :          CALL pair_potential_p_copy(p, work)
    1295          307 :          CALL pair_potential_p_release(p)
    1296              :       END IF
    1297              : 
    1298         2346 :       CALL pair_potential_p_create(p, lb=lb1_new, ub=ub1_new)
    1299         2346 :       IF (ASSOCIATED(work)) THEN
    1300          307 :          CALL pair_potential_p_copy(work, p, istart=lb1_old, iend=ub1_old)
    1301              :       END IF
    1302         2346 :       std_dim = 1
    1303        10908 :       DO i = ub1_old + 1, ub1_new
    1304         8562 :          check = (SIZE(p%pot(i)%pot%type) == std_dim) .AND. (SIZE(p%pot(i)%pot%type) == std_dim)
    1305         8562 :          CPASSERT(check)
    1306        17124 :          p%pot(i)%pot%type = nn_type
    1307         8562 :          p%pot(i)%pot%shell_type = nosh_nosh
    1308         8562 :          p%pot(i)%pot%undef = .TRUE.
    1309         8562 :          p%pot(i)%pot%no_mb = .FALSE.
    1310         8562 :          p%pot(i)%pot%no_pp = .FALSE.
    1311         8562 :          p%pot(i)%pot%at1 = 'NULL'
    1312         8562 :          p%pot(i)%pot%at2 = 'NULL'
    1313         8562 :          p%pot(i)%pot%set(std_dim)%rmin = not_initialized
    1314         8562 :          p%pot(i)%pot%set(std_dim)%rmax = not_initialized
    1315         3786 :          SELECT CASE (ipot)
    1316              :          CASE (lj_type, lj_charmm_type)
    1317         3786 :             CALL pair_potential_lj_create(p%pot(i)%pot%set(std_dim)%lj)
    1318              :          CASE (wl_type)
    1319         1011 :             CALL pair_potential_williams_create(p%pot(i)%pot%set(std_dim)%willis)
    1320              :          CASE (gw_type)
    1321            0 :             CALL pair_potential_goodwin_create(p%pot(i)%pot%set(std_dim)%goodwin)
    1322              :          CASE (ea_type)
    1323           20 :             CALL pair_potential_eam_create(p%pot(i)%pot%set(std_dim)%eam)
    1324              :          CASE (nequip_type)
    1325           12 :             CALL pair_potential_nequip_create(p%pot(i)%pot%set(std_dim)%nequip)
    1326              :          CASE (allegro_type)
    1327            8 :             CALL pair_potential_allegro_create(p%pot(i)%pot%set(std_dim)%allegro)
    1328              :          CASE (ace_type)
    1329           18 :             CALL pair_potential_ace_create(p%pot(i)%pot%set(std_dim)%ace)
    1330              :          CASE (deepmd_type)
    1331            6 :             CALL pair_potential_deepmd_create(p%pot(i)%pot%set(std_dim)%deepmd)
    1332              :          CASE (ft_type)
    1333           12 :             CALL pair_potential_bmhft_create(p%pot(i)%pot%set(std_dim)%ft)
    1334              :          CASE (ftd_type)
    1335           66 :             CALL pair_potential_bmhftd_create(p%pot(i)%pot%set(std_dim)%ftd)
    1336              :          CASE (ip_type)
    1337           48 :             CALL pair_potential_ipbv_create(p%pot(i)%pot%set(std_dim)%ipbv)
    1338              :          CASE (b4_type)
    1339          262 :             CALL pair_potential_buck4r_create(p%pot(i)%pot%set(std_dim)%buck4r)
    1340              :          CASE (bm_type)
    1341           14 :             CALL pair_potential_buckmo_create(p%pot(i)%pot%set(std_dim)%buckmo)
    1342              :          CASE (gp_type)
    1343         3224 :             CALL pair_potential_gp_create(p%pot(i)%pot%set(std_dim)%gp)
    1344              :          CASE (tersoff_type)
    1345           44 :             CALL pair_potential_tersoff_create(p%pot(i)%pot%set(std_dim)%tersoff)
    1346              :          CASE (siepmann_type)
    1347            5 :             CALL pair_potential_siepmann_create(p%pot(i)%pot%set(std_dim)%siepmann)
    1348              :          CASE (gal_type)
    1349            1 :             CALL pair_potential_gal_create(p%pot(i)%pot%set(std_dim)%gal)
    1350              :          CASE (gal21_type)
    1351            1 :             CALL pair_potential_gal21_create(p%pot(i)%pot%set(std_dim)%gal21)
    1352              :          CASE (tab_type)
    1353         8562 :             CALL pair_potential_tab_create(p%pot(i)%pot%set(std_dim)%tab)
    1354              :          END SELECT
    1355         8562 :          NULLIFY (p%pot(i)%pot%spl_f)
    1356        10908 :          NULLIFY (p%pot(i)%pot%pair_spline_data)
    1357              :       END DO
    1358              : 
    1359         2346 :       IF (ASSOCIATED(work)) CALL pair_potential_p_release(work)
    1360         2346 :    END SUBROUTINE pair_potential_reallocate
    1361              : 
    1362              : ! **************************************************************************************************
    1363              : !> \brief Creates the generic potential type
    1364              : !> \param gp ...
    1365              : !> \author Teodoro Laino [teo] 11.2005
    1366              : ! **************************************************************************************************
    1367         6480 :    SUBROUTINE pair_potential_gp_create(gp)
    1368              :       TYPE(gp_pot_type), POINTER                         :: gp
    1369              : 
    1370         6480 :       CPASSERT(.NOT. ASSOCIATED(gp))
    1371         6480 :       ALLOCATE (gp)
    1372              :       NULLIFY (gp%parameters)
    1373              :       NULLIFY (gp%values)
    1374         6480 :       CALL pair_potential_gp_clean(gp)
    1375         6480 :    END SUBROUTINE pair_potential_gp_create
    1376              : 
    1377              : ! **************************************************************************************************
    1378              : !> \brief Copy two generic potential type
    1379              : !> \param gp_source ...
    1380              : !> \param gp_dest ...
    1381              : !> \author Teodoro Laino [teo] 11.2005
    1382              : ! **************************************************************************************************
    1383        12538 :    SUBROUTINE pair_potential_gp_copy(gp_source, gp_dest)
    1384              :       TYPE(gp_pot_type), POINTER                         :: gp_source, gp_dest
    1385              : 
    1386              :       INTEGER                                            :: idim
    1387              : 
    1388        12538 :       IF (.NOT. ASSOCIATED(gp_source)) RETURN
    1389         3256 :       IF (ASSOCIATED(gp_dest)) CALL pair_potential_gp_release(gp_dest)
    1390         3256 :       CALL pair_potential_gp_create(gp_dest)
    1391         3256 :       gp_dest%myid = gp_source%myid
    1392         3256 :       gp_dest%potential = gp_source%potential
    1393         3256 :       gp_dest%variables = gp_source%variables
    1394         3256 :       IF (ASSOCIATED(gp_source%parameters)) THEN
    1395         3256 :          idim = SIZE(gp_source%parameters)
    1396         9768 :          ALLOCATE (gp_dest%parameters(idim))
    1397        22904 :          gp_dest%parameters = gp_source%parameters
    1398              :       END IF
    1399         3256 :       IF (ASSOCIATED(gp_source%values)) THEN
    1400         3256 :          idim = SIZE(gp_source%values)
    1401         9768 :          ALLOCATE (gp_dest%values(idim))
    1402        22904 :          gp_dest%values = gp_source%values
    1403              :       END IF
    1404              :    END SUBROUTINE pair_potential_gp_copy
    1405              : 
    1406              : ! **************************************************************************************************
    1407              : !> \brief Cleans the generic potential type
    1408              : !> \param gp ...
    1409              : !> \author Teodoro Laino [teo] 11.2005
    1410              : ! **************************************************************************************************
    1411       576513 :    SUBROUTINE pair_potential_gp_clean(gp)
    1412              :       TYPE(gp_pot_type), POINTER                         :: gp
    1413              : 
    1414       576513 :       IF (.NOT. ASSOCIATED(gp)) RETURN
    1415         6480 :       gp%myid = 0
    1416         6480 :       gp%potential = ""
    1417         6480 :       gp%variables = ""
    1418         6480 :       IF (ASSOCIATED(gp%values)) THEN
    1419            0 :          DEALLOCATE (gp%values)
    1420              :       END IF
    1421         6480 :       IF (ASSOCIATED(gp%parameters)) THEN
    1422            0 :          DEALLOCATE (gp%parameters)
    1423              :       END IF
    1424              :    END SUBROUTINE pair_potential_gp_clean
    1425              : 
    1426              : ! **************************************************************************************************
    1427              : !> \brief Destroys the generic potential type
    1428              : !> \param gp ...
    1429              : !> \author Teodoro Laino [teo] 11.2005
    1430              : ! **************************************************************************************************
    1431       525742 :    SUBROUTINE pair_potential_gp_release(gp)
    1432              :       TYPE(gp_pot_type), POINTER                         :: gp
    1433              : 
    1434       525742 :       IF (ASSOCIATED(gp)) THEN
    1435         6480 :          IF (ASSOCIATED(gp%parameters)) THEN
    1436         6480 :             DEALLOCATE (gp%parameters)
    1437              :          END IF
    1438         6480 :          IF (ASSOCIATED(gp%values)) THEN
    1439         6480 :             DEALLOCATE (gp%values)
    1440              :          END IF
    1441         6480 :          DEALLOCATE (gp)
    1442              :       END IF
    1443       525742 :       NULLIFY (gp)
    1444       525742 :    END SUBROUTINE pair_potential_gp_release
    1445              : 
    1446              : ! **************************************************************************************************
    1447              : !> \brief Cleans the LJ potential type
    1448              : !> \param lj ...
    1449              : !> \author Teodoro Laino [teo] 11.2005
    1450              : ! **************************************************************************************************
    1451       505146 :    SUBROUTINE pair_potential_lj_create(lj)
    1452              :       TYPE(lj_pot_type), POINTER                         :: lj
    1453              : 
    1454       505146 :       CPASSERT(.NOT. ASSOCIATED(lj))
    1455       505146 :       ALLOCATE (lj)
    1456       505146 :       CALL pair_potential_lj_clean(lj)
    1457       505146 :    END SUBROUTINE pair_potential_lj_create
    1458              : 
    1459              : ! **************************************************************************************************
    1460              : !> \brief Copy two LJ potential type
    1461              : !> \param lj_source ...
    1462              : !> \param lj_dest ...
    1463              : !> \author Teodoro Laino [teo] 11.2005
    1464              : ! **************************************************************************************************
    1465        12538 :    SUBROUTINE pair_potential_lj_copy(lj_source, lj_dest)
    1466              :       TYPE(lj_pot_type), POINTER                         :: lj_source, lj_dest
    1467              : 
    1468        12538 :       IF (.NOT. ASSOCIATED(lj_source)) RETURN
    1469         5110 :       IF (ASSOCIATED(lj_dest)) CALL pair_potential_lj_release(lj_dest)
    1470         5110 :       CALL pair_potential_lj_create(lj_dest)
    1471         5110 :       lj_dest%epsilon = lj_source%epsilon
    1472         5110 :       lj_dest%sigma6 = lj_source%sigma6
    1473         5110 :       lj_dest%sigma12 = lj_source%sigma12
    1474              :    END SUBROUTINE pair_potential_lj_copy
    1475              : 
    1476              : ! **************************************************************************************************
    1477              : !> \brief Creates the LJ potential type
    1478              : !> \param lj ...
    1479              : !> \author Teodoro Laino [teo] 11.2005
    1480              : ! **************************************************************************************************
    1481      1075179 :    SUBROUTINE pair_potential_lj_clean(lj)
    1482              :       TYPE(lj_pot_type), POINTER                         :: lj
    1483              : 
    1484      1075179 :       IF (.NOT. ASSOCIATED(lj)) RETURN
    1485       525240 :       lj%epsilon = 0.0_dp
    1486       525240 :       lj%sigma6 = 0.0_dp
    1487       525240 :       lj%sigma12 = 0.0_dp
    1488              :    END SUBROUTINE pair_potential_lj_clean
    1489              : 
    1490              : ! **************************************************************************************************
    1491              : !> \brief Destroys the LJ potential type
    1492              : !> \param lj ...
    1493              : !> \author Teodoro Laino [teo] 11.2005
    1494              : ! **************************************************************************************************
    1495       525744 :    SUBROUTINE pair_potential_lj_release(lj)
    1496              :       TYPE(lj_pot_type), POINTER                         :: lj
    1497              : 
    1498       525744 :       IF (ASSOCIATED(lj)) THEN
    1499       505146 :          DEALLOCATE (lj)
    1500              :       END IF
    1501       525744 :       NULLIFY (lj)
    1502       525744 :    END SUBROUTINE pair_potential_lj_release
    1503              : 
    1504              : ! **************************************************************************************************
    1505              : !> \brief Creates the WILLIAMS potential type
    1506              : !> \param willis ...
    1507              : !> \author Teodoro Laino [teo] 11.2005
    1508              : ! **************************************************************************************************
    1509         3160 :    SUBROUTINE pair_potential_williams_create(willis)
    1510              :       TYPE(williams_pot_type), POINTER                   :: willis
    1511              : 
    1512         3160 :       CPASSERT(.NOT. ASSOCIATED(willis))
    1513         3160 :       ALLOCATE (willis)
    1514         3160 :       CALL pair_potential_williams_clean(willis)
    1515         3160 :    END SUBROUTINE pair_potential_williams_create
    1516              : 
    1517              : ! **************************************************************************************************
    1518              : !> \brief Copy two WILLIAMS potential type
    1519              : !> \param willis_source ...
    1520              : !> \param willis_dest ...
    1521              : !> \author Teodoro Laino [teo] 11.2005
    1522              : ! **************************************************************************************************
    1523        12538 :    SUBROUTINE pair_potential_williams_copy(willis_source, willis_dest)
    1524              :       TYPE(williams_pot_type), POINTER                   :: willis_source, willis_dest
    1525              : 
    1526        12538 :       IF (.NOT. ASSOCIATED(willis_source)) RETURN
    1527         2149 :       IF (ASSOCIATED(willis_dest)) CALL pair_potential_williams_release(willis_dest)
    1528         2149 :       CALL pair_potential_williams_create(willis_dest)
    1529         2149 :       willis_dest%a = willis_source%a
    1530         2149 :       willis_dest%b = willis_source%b
    1531         2149 :       willis_dest%c = willis_source%c
    1532              :    END SUBROUTINE pair_potential_williams_copy
    1533              : 
    1534              : ! **************************************************************************************************
    1535              : !> \brief Creates the WILLIAMS potential type
    1536              : !> \param willis ...
    1537              : !> \author Teodoro Laino [teo] 11.2005
    1538              : ! **************************************************************************************************
    1539       573193 :    SUBROUTINE pair_potential_williams_clean(willis)
    1540              :       TYPE(williams_pot_type), POINTER                   :: willis
    1541              : 
    1542       573193 :       IF (.NOT. ASSOCIATED(willis)) RETURN
    1543         3210 :       willis%a = 0.0_dp
    1544         3210 :       willis%b = 0.0_dp
    1545         3210 :       willis%c = 0.0_dp
    1546              :    END SUBROUTINE pair_potential_williams_clean
    1547              : 
    1548              : ! **************************************************************************************************
    1549              : !> \brief Destroys the WILLIAMS potential type
    1550              : !> \param willis ...
    1551              : !> \author Teodoro Laino [teo] 11.2005
    1552              : ! **************************************************************************************************
    1553       525744 :    SUBROUTINE pair_potential_williams_release(willis)
    1554              :       TYPE(williams_pot_type), POINTER                   :: willis
    1555              : 
    1556       525744 :       IF (ASSOCIATED(willis)) THEN
    1557         3160 :          DEALLOCATE (willis)
    1558              :       END IF
    1559       525744 :       NULLIFY (willis)
    1560       525744 :    END SUBROUTINE pair_potential_williams_release
    1561              : 
    1562              : ! **************************************************************************************************
    1563              : !> \brief Creates the GOODWIN potential type
    1564              : !> \param goodwin ...
    1565              : !> \author Teodoro Laino [teo] 11.2005
    1566              : ! **************************************************************************************************
    1567            0 :    SUBROUTINE pair_potential_goodwin_create(goodwin)
    1568              :       TYPE(goodwin_pot_type), POINTER                    :: goodwin
    1569              : 
    1570            0 :       CPASSERT(.NOT. ASSOCIATED(goodwin))
    1571            0 :       ALLOCATE (goodwin)
    1572            0 :       CALL pair_potential_goodwin_clean(goodwin)
    1573            0 :    END SUBROUTINE pair_potential_goodwin_create
    1574              : 
    1575              : ! **************************************************************************************************
    1576              : !> \brief Copy two GOODWIN potential type
    1577              : !> \param goodwin_source ...
    1578              : !> \param goodwin_dest ...
    1579              : !> \author Teodoro Laino [teo] 11.2005
    1580              : ! **************************************************************************************************
    1581        12538 :    SUBROUTINE pair_potential_goodwin_copy(goodwin_source, goodwin_dest)
    1582              :       TYPE(goodwin_pot_type), POINTER                    :: goodwin_source, goodwin_dest
    1583              : 
    1584        12538 :       IF (.NOT. ASSOCIATED(goodwin_source)) RETURN
    1585            0 :       IF (ASSOCIATED(goodwin_dest)) CALL pair_potential_goodwin_release(goodwin_dest)
    1586            0 :       CALL pair_potential_goodwin_create(goodwin_dest)
    1587            0 :       goodwin_dest%vr0 = goodwin_source%vr0
    1588            0 :       goodwin_dest%d = goodwin_source%d
    1589            0 :       goodwin_dest%dc = goodwin_source%dc
    1590            0 :       goodwin_dest%m = goodwin_source%m
    1591            0 :       goodwin_dest%mc = goodwin_source%mc
    1592              :    END SUBROUTINE pair_potential_goodwin_copy
    1593              : 
    1594              : ! **************************************************************************************************
    1595              : !> \brief Creates the GOODWIN potential type
    1596              : !> \param goodwin ...
    1597              : !> \author Teodoro Laino [teo] 11.2005
    1598              : ! **************************************************************************************************
    1599       570033 :    SUBROUTINE pair_potential_goodwin_clean(goodwin)
    1600              :       TYPE(goodwin_pot_type), POINTER                    :: goodwin
    1601              : 
    1602       570033 :       IF (.NOT. ASSOCIATED(goodwin)) RETURN
    1603            0 :       goodwin%vr0 = 0.0_dp
    1604            0 :       goodwin%d = 0.0_dp
    1605            0 :       goodwin%dc = 0.0_dp
    1606            0 :       goodwin%m = 0.0_dp
    1607            0 :       goodwin%mc = 0.0_dp
    1608              :    END SUBROUTINE pair_potential_goodwin_clean
    1609              : 
    1610              : ! **************************************************************************************************
    1611              : !> \brief Destroys the GOODWIN potential type
    1612              : !> \param goodwin ...
    1613              : !> \author Teodoro Laino [teo] 11.2005
    1614              : ! **************************************************************************************************
    1615       525742 :    SUBROUTINE pair_potential_goodwin_release(goodwin)
    1616              :       TYPE(goodwin_pot_type), POINTER                    :: goodwin
    1617              : 
    1618       525742 :       IF (ASSOCIATED(goodwin)) THEN
    1619            0 :          DEALLOCATE (goodwin)
    1620              :       END IF
    1621       525742 :       NULLIFY (goodwin)
    1622       525742 :    END SUBROUTINE pair_potential_goodwin_release
    1623              : 
    1624              : ! **************************************************************************************************
    1625              : !> \brief Creates the EAM potential type
    1626              : !> \param eam ...
    1627              : !> \author Teodoro Laino [teo] 11.2005
    1628              : ! **************************************************************************************************
    1629           44 :    SUBROUTINE pair_potential_eam_create(eam)
    1630              :       TYPE(eam_pot_type), POINTER                        :: eam
    1631              : 
    1632           44 :       CPASSERT(.NOT. ASSOCIATED(eam))
    1633           44 :       ALLOCATE (eam)
    1634              :       NULLIFY (eam%rho, eam%phi, eam%frho, eam%rhoval, eam%rval, &
    1635              :                eam%rhop, eam%phip, eam%frhop)
    1636           44 :       CALL pair_potential_eam_clean(eam)
    1637           44 :    END SUBROUTINE pair_potential_eam_create
    1638              : 
    1639              : ! **************************************************************************************************
    1640              : !> \brief Copy two EAM potential type
    1641              : !> \param eam_source ...
    1642              : !> \param eam_dest ...
    1643              : !> \author Teodoro Laino [teo] 11.2005
    1644              : ! **************************************************************************************************
    1645        12538 :    SUBROUTINE pair_potential_eam_copy(eam_source, eam_dest)
    1646              :       TYPE(eam_pot_type), POINTER                        :: eam_source, eam_dest
    1647              : 
    1648        12538 :       IF (.NOT. ASSOCIATED(eam_source)) RETURN
    1649           24 :       IF (ASSOCIATED(eam_dest)) CALL pair_potential_eam_release(eam_dest)
    1650           24 :       CALL pair_potential_eam_create(eam_dest)
    1651           24 :       eam_dest%eam_file_name = eam_source%eam_file_name
    1652           24 :       eam_dest%drar = eam_source%drar
    1653           24 :       eam_dest%drhoar = eam_source%drhoar
    1654           24 :       eam_dest%acutal = eam_source%acutal
    1655           24 :       eam_dest%npoints = eam_source%npoints
    1656              :       ! Allocate arrays with the proper size
    1657           24 :       CALL reallocate(eam_dest%rho, 1, eam_dest%npoints)
    1658           24 :       CALL reallocate(eam_dest%rhop, 1, eam_dest%npoints)
    1659           24 :       CALL reallocate(eam_dest%phi, 1, eam_dest%npoints)
    1660           24 :       CALL reallocate(eam_dest%phip, 1, eam_dest%npoints)
    1661           24 :       CALL reallocate(eam_dest%frho, 1, eam_dest%npoints)
    1662           24 :       CALL reallocate(eam_dest%frhop, 1, eam_dest%npoints)
    1663           24 :       CALL reallocate(eam_dest%rval, 1, eam_dest%npoints)
    1664           24 :       CALL reallocate(eam_dest%rhoval, 1, eam_dest%npoints)
    1665       132024 :       eam_dest%rho = eam_source%rho
    1666       132024 :       eam_dest%phi = eam_source%phi
    1667       132024 :       eam_dest%frho = eam_source%frho
    1668       132024 :       eam_dest%rhoval = eam_source%rhoval
    1669       132024 :       eam_dest%rval = eam_source%rval
    1670       132024 :       eam_dest%rhop = eam_source%rhop
    1671       132024 :       eam_dest%phip = eam_source%phip
    1672       132024 :       eam_dest%frhop = eam_source%frhop
    1673              :    END SUBROUTINE pair_potential_eam_copy
    1674              : 
    1675              : ! **************************************************************************************************
    1676              : !> \brief Creates the EAM potential type
    1677              : !> \param eam ...
    1678              : !> \author Teodoro Laino [teo] 11.2005
    1679              : ! **************************************************************************************************
    1680       570077 :    SUBROUTINE pair_potential_eam_clean(eam)
    1681              :       TYPE(eam_pot_type), POINTER                        :: eam
    1682              : 
    1683       570077 :       IF (.NOT. ASSOCIATED(eam)) RETURN
    1684           44 :       eam%eam_file_name = 'NULL'
    1685           44 :       eam%drar = 0.0_dp
    1686           44 :       eam%drhoar = 0.0_dp
    1687           44 :       eam%acutal = 0.0_dp
    1688           44 :       eam%npoints = 0
    1689           44 :       CALL reallocate(eam%rho, 1, eam%npoints)
    1690           44 :       CALL reallocate(eam%rhop, 1, eam%npoints)
    1691           44 :       CALL reallocate(eam%phi, 1, eam%npoints)
    1692           44 :       CALL reallocate(eam%phip, 1, eam%npoints)
    1693           44 :       CALL reallocate(eam%frho, 1, eam%npoints)
    1694           44 :       CALL reallocate(eam%frhop, 1, eam%npoints)
    1695           44 :       CALL reallocate(eam%rval, 1, eam%npoints)
    1696           44 :       CALL reallocate(eam%rhoval, 1, eam%npoints)
    1697              :    END SUBROUTINE pair_potential_eam_clean
    1698              : 
    1699              : ! **************************************************************************************************
    1700              : !> \brief Destroys the EAM potential type
    1701              : !> \param eam ...
    1702              : !> \author Teodoro Laino [teo] 11.2005
    1703              : ! **************************************************************************************************
    1704       525742 :    SUBROUTINE pair_potential_eam_release(eam)
    1705              :       TYPE(eam_pot_type), POINTER                        :: eam
    1706              : 
    1707       525742 :       IF (ASSOCIATED(eam)) THEN
    1708           44 :          IF (ASSOCIATED(eam%rho)) THEN
    1709           44 :             DEALLOCATE (eam%rho)
    1710              :          END IF
    1711           44 :          IF (ASSOCIATED(eam%rhop)) THEN
    1712           44 :             DEALLOCATE (eam%rhop)
    1713              :          END IF
    1714           44 :          IF (ASSOCIATED(eam%phi)) THEN
    1715           44 :             DEALLOCATE (eam%phi)
    1716              :          END IF
    1717           44 :          IF (ASSOCIATED(eam%phip)) THEN
    1718           44 :             DEALLOCATE (eam%phip)
    1719              :          END IF
    1720           44 :          IF (ASSOCIATED(eam%frho)) THEN
    1721           44 :             DEALLOCATE (eam%frho)
    1722              :          END IF
    1723           44 :          IF (ASSOCIATED(eam%frhop)) THEN
    1724           44 :             DEALLOCATE (eam%frhop)
    1725              :          END IF
    1726           44 :          IF (ASSOCIATED(eam%rval)) THEN
    1727           44 :             DEALLOCATE (eam%rval)
    1728              :          END IF
    1729           44 :          IF (ASSOCIATED(eam%rhoval)) THEN
    1730           44 :             DEALLOCATE (eam%rhoval)
    1731              :          END IF
    1732           44 :          DEALLOCATE (eam)
    1733              :       END IF
    1734       525742 :    END SUBROUTINE pair_potential_eam_release
    1735              : 
    1736              : ! **************************************************************************************************
    1737              : !> \brief Creates the ACE potential type
    1738              : !> \param ace ...
    1739              : !> \author
    1740              : ! **************************************************************************************************
    1741           36 :    SUBROUTINE pair_potential_ace_create(ace)
    1742              :       TYPE(ace_pot_type), POINTER                        :: ace
    1743              : 
    1744           36 :       CPASSERT(.NOT. ASSOCIATED(ace))
    1745           36 :       ALLOCATE (ace)
    1746           36 :    END SUBROUTINE pair_potential_ace_create
    1747              : 
    1748              : ! **************************************************************************************************
    1749              : !> \brief Copy two ACE potential type
    1750              : !> \param ace_source ...
    1751              : !> \param ace_dest ...
    1752              : !> \author
    1753              : ! **************************************************************************************************
    1754        12538 :    SUBROUTINE pair_potential_ace_copy(ace_source, ace_dest)
    1755              :       TYPE(ace_pot_type), POINTER                        :: ace_source, ace_dest
    1756              : 
    1757        12538 :       IF (.NOT. ASSOCIATED(ace_source)) RETURN
    1758           18 :       NULLIFY (ace_dest)
    1759              :       IF (ASSOCIATED(ace_dest)) CALL pair_potential_ace_release(ace_dest)
    1760           18 :       CALL pair_potential_ace_create(ace_dest)
    1761           18 :       ace_dest = ace_source
    1762              :    END SUBROUTINE pair_potential_ace_copy
    1763              : 
    1764              : ! **************************************************************************************************
    1765              : !> \brief CLEAN the ACE potential type
    1766              : !> \param ace ...
    1767              : !> \author
    1768              : ! **************************************************************************************************
    1769       570033 :    SUBROUTINE pair_potential_ace_clean(ace)
    1770              :       TYPE(ace_pot_type), POINTER                        :: ace
    1771              : 
    1772       570033 :       IF (.NOT. ASSOCIATED(ace)) RETURN
    1773            0 :       ace = ace_pot_type()
    1774              :    END SUBROUTINE pair_potential_ace_clean
    1775              : 
    1776              : ! **************************************************************************************************
    1777              : !> \brief Destroys the ACE potential type
    1778              : !> \param ace ...
    1779              : !> \author
    1780              : ! **************************************************************************************************
    1781       525742 :    SUBROUTINE pair_potential_ace_release(ace)
    1782              :       TYPE(ace_pot_type), POINTER                        :: ace
    1783              : 
    1784       525742 :       IF (ASSOCIATED(ace)) THEN
    1785           36 :          DEALLOCATE (ace)
    1786              :       END IF
    1787       525742 :    END SUBROUTINE pair_potential_ace_release
    1788              : 
    1789              : ! **************************************************************************************************
    1790              : !> \brief Creates the DEEPMD potential type
    1791              : !> \param deepmd ...
    1792              : !> \author Yongbin Zhuang 07.2019
    1793              : ! **************************************************************************************************
    1794           12 :    SUBROUTINE pair_potential_deepmd_create(deepmd)
    1795              :       TYPE(deepmd_pot_type), POINTER                     :: deepmd
    1796              : 
    1797           12 :       CPASSERT(.NOT. ASSOCIATED(deepmd))
    1798           12 :       ALLOCATE (deepmd)
    1799           12 :    END SUBROUTINE pair_potential_deepmd_create
    1800              : 
    1801              : ! **************************************************************************************************
    1802              : !> \brief Copy two DEEPMD potential type
    1803              : !> \param deepmd_source ...
    1804              : !> \param deepmd_dest ...
    1805              : !> \author Yongbin Zhuang 07.2019
    1806              : ! **************************************************************************************************
    1807        12538 :    SUBROUTINE pair_potential_deepmd_copy(deepmd_source, deepmd_dest)
    1808              :       TYPE(deepmd_pot_type), POINTER                     :: deepmd_source, deepmd_dest
    1809              : 
    1810        12538 :       IF (.NOT. ASSOCIATED(deepmd_source)) RETURN
    1811            6 :       NULLIFY (deepmd_dest)
    1812              :       IF (ASSOCIATED(deepmd_dest)) CALL pair_potential_deepmd_release(deepmd_dest)
    1813            6 :       CALL pair_potential_deepmd_create(deepmd_dest)
    1814            6 :       deepmd_dest = deepmd_source
    1815              :    END SUBROUTINE pair_potential_deepmd_copy
    1816              : 
    1817              : ! **************************************************************************************************
    1818              : !> \brief CLEAN the DEEPMD potential type
    1819              : !> \param deepmd ...
    1820              : !> \author Yongbin Zhuang 07.2019
    1821              : ! **************************************************************************************************
    1822       570033 :    SUBROUTINE pair_potential_deepmd_clean(deepmd)
    1823              :       TYPE(deepmd_pot_type), POINTER                     :: deepmd
    1824              : 
    1825       570033 :       IF (.NOT. ASSOCIATED(deepmd)) RETURN
    1826            0 :       deepmd = deepmd_pot_type()
    1827              :    END SUBROUTINE pair_potential_deepmd_clean
    1828              : 
    1829              : ! **************************************************************************************************
    1830              : !> \brief Destroys the DEEPMD potential type
    1831              : !> \param deepmd ...
    1832              : !> \author Yongbin Zhuang 07.2019
    1833              : ! **************************************************************************************************
    1834       525742 :    SUBROUTINE pair_potential_deepmd_release(deepmd)
    1835              :       TYPE(deepmd_pot_type), POINTER                     :: deepmd
    1836              : 
    1837       525742 :       IF (ASSOCIATED(deepmd)) THEN
    1838           12 :          DEALLOCATE (deepmd)
    1839              :       END IF
    1840       525742 :    END SUBROUTINE pair_potential_deepmd_release
    1841              : 
    1842              : ! **************************************************************************************************
    1843              : !> \brief Creates the NEQUIP potential type
    1844              : !> \param nequip ...
    1845              : !> \author Gabriele Tocci 2023
    1846              : ! **************************************************************************************************
    1847           24 :    SUBROUTINE pair_potential_nequip_create(nequip)
    1848              :       TYPE(nequip_pot_type), POINTER                     :: nequip
    1849              : 
    1850           24 :       CPASSERT(.NOT. ASSOCIATED(nequip))
    1851           24 :       ALLOCATE (nequip)
    1852           24 :    END SUBROUTINE pair_potential_nequip_create
    1853              : 
    1854              : ! **************************************************************************************************
    1855              : !> \brief Copy two NEQUIP potential type
    1856              : !> \param nequip_source ...
    1857              : !> \param nequip_dest ...
    1858              : !> \author Gabriele Tocci 2023
    1859              : ! **************************************************************************************************
    1860        12538 :    SUBROUTINE pair_potential_nequip_copy(nequip_source, nequip_dest)
    1861              :       TYPE(nequip_pot_type), POINTER                     :: nequip_source, nequip_dest
    1862              : 
    1863        12538 :       IF (.NOT. ASSOCIATED(nequip_source)) RETURN
    1864           12 :       IF (ASSOCIATED(nequip_dest)) CALL pair_potential_nequip_release(nequip_dest)
    1865           12 :       CALL pair_potential_nequip_create(nequip_dest)
    1866           12 :       nequip_dest = nequip_source
    1867              : 
    1868              :    END SUBROUTINE pair_potential_nequip_copy
    1869              : 
    1870              : ! **************************************************************************************************
    1871              : !> \brief Creates the NEQUIP potential type
    1872              : !> \param nequip ...
    1873              : !> \author Gabriele Tocci 2023
    1874              : ! **************************************************************************************************
    1875       570033 :    SUBROUTINE pair_potential_nequip_clean(nequip)
    1876              :       TYPE(nequip_pot_type), POINTER                     :: nequip
    1877              : 
    1878       570033 :       IF (.NOT. ASSOCIATED(nequip)) RETURN
    1879            0 :       nequip = nequip_pot_type()
    1880              : 
    1881              :    END SUBROUTINE pair_potential_nequip_clean
    1882              : 
    1883              : ! **************************************************************************************************
    1884              : !> \brief Destroys the NEQUIP potential type
    1885              : !> \param nequip ...
    1886              : !> \author Gabriele Tocci 2023
    1887              : ! **************************************************************************************************
    1888       525742 :    SUBROUTINE pair_potential_nequip_release(nequip)
    1889              :       TYPE(nequip_pot_type), POINTER                     :: nequip
    1890              : 
    1891       525742 :       IF (ASSOCIATED(nequip)) THEN
    1892           24 :          DEALLOCATE (nequip)
    1893              :       END IF
    1894       525742 :    END SUBROUTINE pair_potential_nequip_release
    1895              : 
    1896              : ! **************************************************************************************************
    1897              : !> \brief Creates the ALLEGRO potential type
    1898              : !> \param allegro ...
    1899              : !> \author Gabriele Tocci 2023
    1900              : ! **************************************************************************************************
    1901           16 :    SUBROUTINE pair_potential_allegro_create(allegro)
    1902              :       TYPE(allegro_pot_type), POINTER                    :: allegro
    1903              : 
    1904           16 :       CPASSERT(.NOT. ASSOCIATED(allegro))
    1905           16 :       ALLOCATE (allegro)
    1906           16 :    END SUBROUTINE pair_potential_allegro_create
    1907              : 
    1908              : ! **************************************************************************************************
    1909              : !> \brief Copy two ALLEGRO potential type
    1910              : !> \param allegro_source ...
    1911              : !> \param allegro_dest ...
    1912              : !> \author Gabriele Tocci 2023
    1913              : ! **************************************************************************************************
    1914        12538 :    SUBROUTINE pair_potential_allegro_copy(allegro_source, allegro_dest)
    1915              :       TYPE(allegro_pot_type), POINTER                    :: allegro_source, allegro_dest
    1916              : 
    1917        12538 :       IF (.NOT. ASSOCIATED(allegro_source)) RETURN
    1918            8 :       IF (ASSOCIATED(allegro_dest)) CALL pair_potential_allegro_release(allegro_dest)
    1919            8 :       CALL pair_potential_allegro_create(allegro_dest)
    1920            8 :       allegro_dest = allegro_source
    1921              :    END SUBROUTINE pair_potential_allegro_copy
    1922              : 
    1923              : ! **************************************************************************************************
    1924              : !> \brief Creates the ALLEGRO potential type
    1925              : !> \param allegro ...
    1926              : !> \author Gabriele Tocci 2023
    1927              : ! **************************************************************************************************
    1928       570033 :    SUBROUTINE pair_potential_allegro_clean(allegro)
    1929              :       TYPE(allegro_pot_type), POINTER                    :: allegro
    1930              : 
    1931       570033 :       IF (.NOT. ASSOCIATED(allegro)) RETURN
    1932            0 :       allegro = allegro_pot_type()
    1933              : 
    1934              :    END SUBROUTINE pair_potential_allegro_clean
    1935              : 
    1936              : ! **************************************************************************************************
    1937              : !> \brief Destroys the ALLEGRO potential type
    1938              : !> \param allegro ...
    1939              : !> \author Gabriele Tocci 2023
    1940              : ! **************************************************************************************************
    1941       525742 :    SUBROUTINE pair_potential_allegro_release(allegro)
    1942              :       TYPE(allegro_pot_type), POINTER                    :: allegro
    1943              : 
    1944       525742 :       IF (ASSOCIATED(allegro)) THEN
    1945           16 :          DEALLOCATE (allegro)
    1946              :       END IF
    1947       525742 :    END SUBROUTINE pair_potential_allegro_release
    1948              : 
    1949              : ! **************************************************************************************************
    1950              : !> \brief Creates the BMHFT (TOSI-FUMI) potential type
    1951              : !> \param ft ...
    1952              : !> \author Teodoro Laino [teo] 11.2005
    1953              : ! **************************************************************************************************
    1954           24 :    SUBROUTINE pair_potential_bmhft_create(ft)
    1955              :       TYPE(ft_pot_type), POINTER                         :: ft
    1956              : 
    1957           24 :       CPASSERT(.NOT. ASSOCIATED(ft))
    1958           24 :       ALLOCATE (ft)
    1959           24 :       CALL pair_potential_bmhft_clean(ft)
    1960           24 :    END SUBROUTINE pair_potential_bmhft_create
    1961              : 
    1962              : ! **************************************************************************************************
    1963              : !> \brief Copy two BMHFT (TOSI-FUMI) potential type
    1964              : !> \param ft_source ...
    1965              : !> \param ft_dest ...
    1966              : !> \author Teodoro Laino [teo] 11.2005
    1967              : ! **************************************************************************************************
    1968        12538 :    SUBROUTINE pair_potential_bmhft_copy(ft_source, ft_dest)
    1969              :       TYPE(ft_pot_type), POINTER                         :: ft_source, ft_dest
    1970              : 
    1971        12538 :       IF (.NOT. ASSOCIATED(ft_source)) RETURN
    1972           12 :       IF (ASSOCIATED(ft_dest)) CALL pair_potential_bmhft_release(ft_dest)
    1973           12 :       CALL pair_potential_bmhft_create(ft_dest)
    1974           12 :       ft_dest%A = ft_source%A
    1975           12 :       ft_dest%B = ft_source%B
    1976           12 :       ft_dest%C = ft_source%C
    1977           12 :       ft_dest%D = ft_source%D
    1978              :    END SUBROUTINE pair_potential_bmhft_copy
    1979              : 
    1980              : ! **************************************************************************************************
    1981              : !> \brief Creates the BMHFT (TOSI-FUMI) potential type
    1982              : !> \param ft ...
    1983              : !> \author Teodoro Laino [teo] 11.2005
    1984              : ! **************************************************************************************************
    1985       570057 :    SUBROUTINE pair_potential_bmhft_clean(ft)
    1986              :       TYPE(ft_pot_type), POINTER                         :: ft
    1987              : 
    1988       570057 :       IF (.NOT. ASSOCIATED(ft)) RETURN
    1989           24 :       ft%A = 0.0_dp
    1990           24 :       ft%B = 0.0_dp
    1991           24 :       ft%C = 0.0_dp
    1992           24 :       ft%D = 0.0_dp
    1993              :    END SUBROUTINE pair_potential_bmhft_clean
    1994              : 
    1995              : ! **************************************************************************************************
    1996              : !> \brief Destroys the BMHFT potential type
    1997              : !> \param ft ...
    1998              : !> \author Teodoro Laino [teo] 11.2005
    1999              : ! **************************************************************************************************
    2000       525742 :    SUBROUTINE pair_potential_bmhft_release(ft)
    2001              :       TYPE(ft_pot_type), POINTER                         :: ft
    2002              : 
    2003       525742 :       IF (ASSOCIATED(ft)) THEN
    2004           24 :          DEALLOCATE (ft)
    2005              :       END IF
    2006       525742 :       NULLIFY (ft)
    2007       525742 :    END SUBROUTINE pair_potential_bmhft_release
    2008              : 
    2009              : ! **************************************************************************************************
    2010              : !> \brief Creates the BMHFTD (damped TOSI-FUMI) potential type
    2011              : !> \param ftd ...
    2012              : !> \author Mathieu Salanne 05.2010
    2013              : ! **************************************************************************************************
    2014          132 :    SUBROUTINE pair_potential_bmhftd_create(ftd)
    2015              :       TYPE(ftd_pot_type), POINTER                        :: ftd
    2016              : 
    2017          132 :       CPASSERT(.NOT. ASSOCIATED(ftd))
    2018          528 :       ALLOCATE (ftd)
    2019          132 :       CALL pair_potential_bmhftd_clean(ftd)
    2020          132 :    END SUBROUTINE pair_potential_bmhftd_create
    2021              : 
    2022              : ! **************************************************************************************************
    2023              : !> \brief Copy two BMHFTD (Damped TOSI-FUMI) potential type
    2024              : !> \param ftd_source ...
    2025              : !> \param ftd_dest ...
    2026              : !> \author Mathieu Salanne 05.2010
    2027              : ! **************************************************************************************************
    2028        12538 :    SUBROUTINE pair_potential_bmhftd_copy(ftd_source, ftd_dest)
    2029              :       TYPE(ftd_pot_type), POINTER                        :: ftd_source, ftd_dest
    2030              : 
    2031        12538 :       IF (.NOT. ASSOCIATED(ftd_source)) RETURN
    2032           66 :       IF (ASSOCIATED(ftd_dest)) CALL pair_potential_bmhftd_release(ftd_dest)
    2033           66 :       CALL pair_potential_bmhftd_create(ftd_dest)
    2034           66 :       ftd_dest%A = ftd_source%A
    2035           66 :       ftd_dest%B = ftd_source%B
    2036           66 :       ftd_dest%C = ftd_source%C
    2037           66 :       ftd_dest%D = ftd_source%D
    2038          330 :       ftd_dest%BD = ftd_source%BD
    2039              :    END SUBROUTINE pair_potential_bmhftd_copy
    2040              : 
    2041              : ! **************************************************************************************************
    2042              : !> \brief Cleans the BMHFTD (damped TOSI-FUMI) potential type
    2043              : !> \param ftd ...
    2044              : !> \author Mathieu Salanne
    2045              : ! **************************************************************************************************
    2046       570165 :    SUBROUTINE pair_potential_bmhftd_clean(ftd)
    2047              :       TYPE(ftd_pot_type), POINTER                        :: ftd
    2048              : 
    2049       570165 :       IF (.NOT. ASSOCIATED(ftd)) RETURN
    2050          132 :       ftd%A = 0.0_dp
    2051          132 :       ftd%B = 0.0_dp
    2052          132 :       ftd%C = 0.0_dp
    2053          132 :       ftd%D = 0.0_dp
    2054          396 :       ftd%BD = 0.0_dp
    2055              :    END SUBROUTINE pair_potential_bmhftd_clean
    2056              : 
    2057              : ! **************************************************************************************************
    2058              : !> \brief Destroys the BMHFTD potential type
    2059              : !> \param ftd ...
    2060              : !> \author Mathieu Salanne 05.2010
    2061              : ! **************************************************************************************************
    2062       525742 :    SUBROUTINE pair_potential_bmhftd_release(ftd)
    2063              :       TYPE(ftd_pot_type), POINTER                        :: ftd
    2064              : 
    2065       525742 :       IF (ASSOCIATED(ftd)) THEN
    2066          132 :          DEALLOCATE (ftd)
    2067              :       END IF
    2068       525742 :       NULLIFY (ftd)
    2069       525742 :    END SUBROUTINE pair_potential_bmhftd_release
    2070              : 
    2071              : ! **************************************************************************************************
    2072              : !> \brief Creates the IPBV potential type
    2073              : !> \param ipbv ...
    2074              : !> \author Teodoro Laino [teo] 11.2005
    2075              : ! **************************************************************************************************
    2076           96 :    SUBROUTINE pair_potential_ipbv_create(ipbv)
    2077              :       TYPE(ipbv_pot_type), POINTER                       :: ipbv
    2078              : 
    2079           96 :       CPASSERT(.NOT. ASSOCIATED(ipbv))
    2080         1536 :       ALLOCATE (ipbv)
    2081           96 :       CALL pair_potential_ipbv_clean(ipbv)
    2082           96 :    END SUBROUTINE pair_potential_ipbv_create
    2083              : 
    2084              : ! **************************************************************************************************
    2085              : !> \brief Copy two IPBV potential type
    2086              : !> \param ipbv_source ...
    2087              : !> \param ipbv_dest ...
    2088              : !> \author Teodoro Laino [teo] 11.2005
    2089              : ! **************************************************************************************************
    2090        12538 :    SUBROUTINE pair_potential_ipbv_copy(ipbv_source, ipbv_dest)
    2091              :       TYPE(ipbv_pot_type), POINTER                       :: ipbv_source, ipbv_dest
    2092              : 
    2093        12538 :       IF (.NOT. ASSOCIATED(ipbv_source)) RETURN
    2094           48 :       IF (ASSOCIATED(ipbv_dest)) CALL pair_potential_ipbv_release(ipbv_dest)
    2095           48 :       CALL pair_potential_ipbv_create(ipbv_dest)
    2096         1392 :       ipbv_dest%a = ipbv_source%a
    2097           48 :       ipbv_dest%rcore = ipbv_source%rcore
    2098           48 :       ipbv_dest%b = ipbv_source%b
    2099           48 :       ipbv_dest%m = ipbv_source%m
    2100              :    END SUBROUTINE pair_potential_ipbv_copy
    2101              : 
    2102              : ! **************************************************************************************************
    2103              : !> \brief Creates the IPBV potential type
    2104              : !> \param ipbv ...
    2105              : !> \author Teodoro Laino [teo] 11.2005
    2106              : ! **************************************************************************************************
    2107       570129 :    SUBROUTINE pair_potential_ipbv_clean(ipbv)
    2108              :       TYPE(ipbv_pot_type), POINTER                       :: ipbv
    2109              : 
    2110       570129 :       IF (.NOT. ASSOCIATED(ipbv)) RETURN
    2111         1440 :       ipbv%a = 0.0_dp
    2112           96 :       ipbv%rcore = 0.0_dp
    2113           96 :       ipbv%b = 0.0_dp
    2114           96 :       ipbv%m = 0.0_dp
    2115              :    END SUBROUTINE pair_potential_ipbv_clean
    2116              : 
    2117              : ! **************************************************************************************************
    2118              : !> \brief Destroys the IPBV potential type
    2119              : !> \param ipbv ...
    2120              : !> \author Teodoro Laino [teo] 11.2005
    2121              : ! **************************************************************************************************
    2122       525742 :    SUBROUTINE pair_potential_ipbv_release(ipbv)
    2123              :       TYPE(ipbv_pot_type), POINTER                       :: ipbv
    2124              : 
    2125       525742 :       IF (ASSOCIATED(ipbv)) THEN
    2126           96 :          DEALLOCATE (ipbv)
    2127              :       END IF
    2128       525742 :       NULLIFY (ipbv)
    2129       525742 :    END SUBROUTINE pair_potential_ipbv_release
    2130              : 
    2131              : ! **************************************************************************************************
    2132              : !> \brief Creates the Buckingham 4 ranges  potential type
    2133              : !> \param buck4r ...
    2134              : !> \author MI 10.2006
    2135              : ! **************************************************************************************************
    2136          526 :    SUBROUTINE pair_potential_buck4r_create(buck4r)
    2137              :       TYPE(buck4ran_pot_type), POINTER                   :: buck4r
    2138              : 
    2139          526 :       CPASSERT(.NOT. ASSOCIATED(buck4r))
    2140        13150 :       ALLOCATE (buck4r)
    2141          526 :       CALL pair_potential_buck4r_clean(buck4r)
    2142          526 :    END SUBROUTINE pair_potential_buck4r_create
    2143              : 
    2144              : ! **************************************************************************************************
    2145              : !> \brief Copy two Buckingham 4 ranges  potential type
    2146              : !> \param buck4r_source ...
    2147              : !> \param buck4r_dest ...
    2148              : !> \author MI 10.2006
    2149              : ! **************************************************************************************************
    2150        12538 :    SUBROUTINE pair_potential_buck4r_copy(buck4r_source, buck4r_dest)
    2151              :       TYPE(buck4ran_pot_type), POINTER                   :: buck4r_source, buck4r_dest
    2152              : 
    2153        12538 :       IF (.NOT. ASSOCIATED(buck4r_source)) RETURN
    2154          264 :       IF (ASSOCIATED(buck4r_dest)) CALL pair_potential_buck4r_release(buck4r_dest)
    2155          264 :       CALL pair_potential_buck4r_create(buck4r_dest)
    2156          264 :       buck4r_dest%a = buck4r_source%a
    2157          264 :       buck4r_dest%b = buck4r_source%b
    2158          264 :       buck4r_dest%c = buck4r_source%c
    2159          264 :       buck4r_dest%r1 = buck4r_source%r1
    2160          264 :       buck4r_dest%r2 = buck4r_source%r2
    2161          264 :       buck4r_dest%r3 = buck4r_source%r3
    2162         6072 :       buck4r_dest%poly1 = buck4r_source%poly1
    2163         6072 :       buck4r_dest%poly2 = buck4r_source%poly2
    2164          264 :       buck4r_dest%npoly1 = buck4r_source%npoly1
    2165          264 :       buck4r_dest%npoly2 = buck4r_source%npoly2
    2166              :    END SUBROUTINE pair_potential_buck4r_copy
    2167              : 
    2168              : ! **************************************************************************************************
    2169              : !> \brief Creates the Buckingham 4 ranges  potential type
    2170              : !> \param buck4r ...
    2171              : !> \author MI 10.2006
    2172              : ! **************************************************************************************************
    2173       570559 :    SUBROUTINE pair_potential_buck4r_clean(buck4r)
    2174              :       TYPE(buck4ran_pot_type), POINTER                   :: buck4r
    2175              : 
    2176       570559 :       IF (.NOT. ASSOCIATED(buck4r)) RETURN
    2177          526 :       buck4r%a = 0.0_dp
    2178          526 :       buck4r%b = 0.0_dp
    2179          526 :       buck4r%c = 0.0_dp
    2180          526 :       buck4r%r1 = 0.0_dp
    2181          526 :       buck4r%r2 = 0.0_dp
    2182          526 :       buck4r%r3 = 0.0_dp
    2183         6312 :       buck4r%poly1 = 0.0_dp
    2184          526 :       buck4r%npoly1 = 0
    2185         6312 :       buck4r%poly2 = 0.0_dp
    2186          526 :       buck4r%npoly2 = 0
    2187              :    END SUBROUTINE pair_potential_buck4r_clean
    2188              : 
    2189              : ! **************************************************************************************************
    2190              : !> \brief Destroys the Buckingham 4 ranges potential type
    2191              : !> \param buck4r ...
    2192              : !> \author MI  10.2006
    2193              : ! **************************************************************************************************
    2194       525742 :    SUBROUTINE pair_potential_buck4r_release(buck4r)
    2195              :       TYPE(buck4ran_pot_type), POINTER                   :: buck4r
    2196              : 
    2197       525742 :       IF (ASSOCIATED(buck4r)) THEN
    2198          526 :          DEALLOCATE (buck4r)
    2199              :       END IF
    2200       525742 :       NULLIFY (buck4r)
    2201       525742 :    END SUBROUTINE pair_potential_buck4r_release
    2202              : 
    2203              : ! **************************************************************************************************
    2204              : !> \brief Creates the Buckingham plus Morse potential type
    2205              : !> \param buckmo ...
    2206              : !> \author MI 10.2006
    2207              : ! **************************************************************************************************
    2208           24 :    SUBROUTINE pair_potential_buckmo_create(buckmo)
    2209              :       TYPE(buckmorse_pot_type), POINTER                  :: buckmo
    2210              : 
    2211           24 :       CPASSERT(.NOT. ASSOCIATED(buckmo))
    2212           24 :       ALLOCATE (buckmo)
    2213           24 :       CALL pair_potential_buckmo_clean(buckmo)
    2214           24 :    END SUBROUTINE pair_potential_buckmo_create
    2215              : 
    2216              : ! **************************************************************************************************
    2217              : !> \brief Copy two Buckingham plus Morse  potential type
    2218              : !> \param buckmo_source ...
    2219              : !> \param buckmo_dest ...
    2220              : !> \author MI 10.2006
    2221              : ! **************************************************************************************************
    2222        12538 :    SUBROUTINE pair_potential_buckmo_copy(buckmo_source, buckmo_dest)
    2223              :       TYPE(buckmorse_pot_type), POINTER                  :: buckmo_source, buckmo_dest
    2224              : 
    2225        12538 :       IF (.NOT. ASSOCIATED(buckmo_source)) RETURN
    2226           10 :       IF (ASSOCIATED(buckmo_dest)) CALL pair_potential_buckmo_release(buckmo_dest)
    2227           10 :       CALL pair_potential_buckmo_create(buckmo_dest)
    2228           10 :       buckmo_dest%f0 = buckmo_source%f0
    2229           10 :       buckmo_dest%a1 = buckmo_source%a1
    2230           10 :       buckmo_dest%a2 = buckmo_source%a2
    2231           10 :       buckmo_dest%b1 = buckmo_source%b1
    2232           10 :       buckmo_dest%b2 = buckmo_source%b2
    2233           10 :       buckmo_dest%c = buckmo_source%c
    2234           10 :       buckmo_dest%d = buckmo_source%d
    2235           10 :       buckmo_dest%r0 = buckmo_source%r0
    2236           10 :       buckmo_dest%beta = buckmo_source%beta
    2237              :    END SUBROUTINE pair_potential_buckmo_copy
    2238              : 
    2239              : ! **************************************************************************************************
    2240              : !> \brief Creates the Buckingham plus Morse  potential type
    2241              : !> \param buckmo ...
    2242              : !> \author MI 10.2006
    2243              : ! **************************************************************************************************
    2244       570057 :    SUBROUTINE pair_potential_buckmo_clean(buckmo)
    2245              :       TYPE(buckmorse_pot_type), POINTER                  :: buckmo
    2246              : 
    2247       570057 :       IF (.NOT. ASSOCIATED(buckmo)) RETURN
    2248           24 :       buckmo%f0 = 0.0_dp
    2249           24 :       buckmo%a1 = 0.0_dp
    2250           24 :       buckmo%a2 = 0.0_dp
    2251           24 :       buckmo%b1 = 0.0_dp
    2252           24 :       buckmo%b2 = 0.0_dp
    2253           24 :       buckmo%c = 0.0_dp
    2254           24 :       buckmo%d = 0.0_dp
    2255           24 :       buckmo%r0 = 0.0_dp
    2256           24 :       buckmo%beta = 0.0_dp
    2257              :    END SUBROUTINE pair_potential_buckmo_clean
    2258              : 
    2259              : ! **************************************************************************************************
    2260              : !> \brief Destroys the Buckingham plus Morse potential type
    2261              : !> \param buckmo ...
    2262              : !> \author MI  10.2006
    2263              : ! **************************************************************************************************
    2264       525742 :    SUBROUTINE pair_potential_buckmo_release(buckmo)
    2265              :       TYPE(buckmorse_pot_type), POINTER                  :: buckmo
    2266              : 
    2267       525742 :       IF (ASSOCIATED(buckmo)) THEN
    2268           24 :          DEALLOCATE (buckmo)
    2269              :       END IF
    2270       525742 :       NULLIFY (buckmo)
    2271       525742 :    END SUBROUTINE pair_potential_buckmo_release
    2272              : 
    2273              : ! **************************************************************************************************
    2274              : !> \brief Creates the Tersoff potential type
    2275              : !>      (Tersoff, J. PRB 39(8), 5566, 1989)
    2276              : !> \param tersoff ...
    2277              : ! **************************************************************************************************
    2278         1568 :    SUBROUTINE pair_potential_tersoff_create(tersoff)
    2279              :       TYPE(tersoff_pot_type), POINTER                    :: tersoff
    2280              : 
    2281         1568 :       CPASSERT(.NOT. ASSOCIATED(tersoff))
    2282         1568 :       ALLOCATE (tersoff)
    2283         1568 :       CALL pair_potential_tersoff_clean(tersoff)
    2284         1568 :    END SUBROUTINE pair_potential_tersoff_create
    2285              : 
    2286              : ! **************************************************************************************************
    2287              : !> \brief Copy two Tersoff potential type
    2288              : !>      (Tersoff, J. PRB 39(8), 5566, 1989)
    2289              : !> \param tersoff_source ...
    2290              : !> \param tersoff_dest ...
    2291              : ! **************************************************************************************************
    2292        12538 :    SUBROUTINE pair_potential_tersoff_copy(tersoff_source, tersoff_dest)
    2293              :       TYPE(tersoff_pot_type), POINTER                    :: tersoff_source, tersoff_dest
    2294              : 
    2295        12538 :       IF (.NOT. ASSOCIATED(tersoff_source)) RETURN
    2296         1524 :       IF (ASSOCIATED(tersoff_dest)) CALL pair_potential_tersoff_release(tersoff_dest)
    2297         1524 :       CALL pair_potential_tersoff_create(tersoff_dest)
    2298         1524 :       tersoff_dest%A = tersoff_source%A
    2299         1524 :       tersoff_dest%B = tersoff_source%B
    2300         1524 :       tersoff_dest%lambda1 = tersoff_source%lambda1
    2301         1524 :       tersoff_dest%lambda2 = tersoff_source%lambda2
    2302         1524 :       tersoff_dest%alpha = tersoff_source%alpha
    2303         1524 :       tersoff_dest%beta = tersoff_source%beta
    2304         1524 :       tersoff_dest%n = tersoff_source%n
    2305         1524 :       tersoff_dest%c = tersoff_source%c
    2306         1524 :       tersoff_dest%d = tersoff_source%d
    2307         1524 :       tersoff_dest%h = tersoff_source%h
    2308         1524 :       tersoff_dest%lambda3 = tersoff_source%lambda3
    2309         1524 :       tersoff_dest%bigR = tersoff_source%bigR
    2310         1524 :       tersoff_dest%bigD = tersoff_source%bigD
    2311         1524 :       tersoff_dest%rcutsq = tersoff_source%rcutsq
    2312              :    END SUBROUTINE pair_potential_tersoff_copy
    2313              : 
    2314              : ! **************************************************************************************************
    2315              : !> \brief Creates the Tersoff potential type
    2316              : !>      (Tersoff, J. PRB 39(8), 5566, 1989)
    2317              : !> \param tersoff ...
    2318              : ! **************************************************************************************************
    2319       571601 :    SUBROUTINE pair_potential_tersoff_clean(tersoff)
    2320              :       TYPE(tersoff_pot_type), POINTER                    :: tersoff
    2321              : 
    2322       571601 :       IF (.NOT. ASSOCIATED(tersoff)) RETURN
    2323         2974 :       tersoff%A = 0.0_dp
    2324         2974 :       tersoff%B = 0.0_dp
    2325         2974 :       tersoff%lambda1 = 0.0_dp
    2326         2974 :       tersoff%lambda2 = 0.0_dp
    2327         2974 :       tersoff%alpha = 0.0_dp
    2328         2974 :       tersoff%beta = 0.0_dp
    2329         2974 :       tersoff%n = 0.0_dp
    2330         2974 :       tersoff%c = 0.0_dp
    2331         2974 :       tersoff%d = 0.0_dp
    2332         2974 :       tersoff%h = 0.0_dp
    2333         2974 :       tersoff%lambda3 = 0.0_dp
    2334         2974 :       tersoff%bigR = 0.0_dp
    2335         2974 :       tersoff%bigD = 0.0_dp
    2336         2974 :       tersoff%rcutsq = 0.0_dp
    2337              :    END SUBROUTINE pair_potential_tersoff_clean
    2338              : 
    2339              : ! **************************************************************************************************
    2340              : !> \brief Destroys the Tersoff
    2341              : !>      (Tersoff, J. PRB 39(8), 5566, 1989)
    2342              : !> \param tersoff ...
    2343              : ! **************************************************************************************************
    2344       525742 :    SUBROUTINE pair_potential_tersoff_release(tersoff)
    2345              :       TYPE(tersoff_pot_type), POINTER                    :: tersoff
    2346              : 
    2347       525742 :       IF (ASSOCIATED(tersoff)) THEN
    2348         1568 :          DEALLOCATE (tersoff)
    2349              :       END IF
    2350       525742 :       NULLIFY (tersoff)
    2351       525742 :    END SUBROUTINE pair_potential_tersoff_release
    2352              : 
    2353              : ! **************************************************************************************************
    2354              : !> \brief Creates the Siepmann-Sprik potential type
    2355              : !>      (Siepmann and Sprik, J. Chem. Phys. 102(1) 511, 1995)
    2356              : !> \param siepmann ...
    2357              : ! **************************************************************************************************
    2358           10 :    SUBROUTINE pair_potential_siepmann_create(siepmann)
    2359              :       TYPE(siepmann_pot_type), POINTER                   :: siepmann
    2360              : 
    2361           10 :       CPASSERT(.NOT. ASSOCIATED(siepmann))
    2362           10 :       ALLOCATE (siepmann)
    2363           10 :       CALL pair_potential_siepmann_clean(siepmann)
    2364           10 :    END SUBROUTINE pair_potential_siepmann_create
    2365              : ! **************************************************************************************************
    2366              : !> \brief Copy two Siepmann potential type
    2367              : !>      (Siepmann and Sprik, J. Chem. Phys. 102(1) 511, 1995)
    2368              : !> \param siepmann_source ...
    2369              : !> \param siepmann_dest ...
    2370              : ! **************************************************************************************************
    2371        12538 :    SUBROUTINE pair_potential_siepmann_copy(siepmann_source, siepmann_dest)
    2372              :       TYPE(siepmann_pot_type), POINTER                   :: siepmann_source, siepmann_dest
    2373              : 
    2374        12538 :       IF (.NOT. ASSOCIATED(siepmann_source)) RETURN
    2375            5 :       IF (ASSOCIATED(siepmann_dest)) CALL pair_potential_siepmann_release(siepmann_dest)
    2376            5 :       CALL pair_potential_siepmann_create(siepmann_dest)
    2377            5 :       siepmann_dest%B = siepmann_source%B
    2378            5 :       siepmann_dest%D = siepmann_source%D
    2379            5 :       siepmann_dest%E = siepmann_source%E
    2380            5 :       siepmann_dest%F = siepmann_source%F
    2381            5 :       siepmann_dest%beta = siepmann_source%beta
    2382            5 :       siepmann_dest%rcutsq = siepmann_source%rcutsq
    2383            5 :       siepmann_dest%allow_oh_formation = siepmann_source%allow_oh_formation
    2384            5 :       siepmann_dest%allow_h3o_formation = siepmann_source%allow_h3o_formation
    2385            5 :       siepmann_dest%allow_o_formation = siepmann_source%allow_o_formation
    2386              : 
    2387              :    END SUBROUTINE pair_potential_siepmann_copy
    2388              : 
    2389              : ! **************************************************************************************************
    2390              : !> \brief Creates the Siepmann-Sprik potential type
    2391              : !>      (Siepmann and Sprik, J. Chem. Phys. 102(1) 511, 1995)
    2392              : !> \param siepmann ...
    2393              : ! **************************************************************************************************
    2394       570043 :    SUBROUTINE pair_potential_siepmann_clean(siepmann)
    2395              :       TYPE(siepmann_pot_type), POINTER                   :: siepmann
    2396              : 
    2397       570043 :       IF (.NOT. ASSOCIATED(siepmann)) RETURN
    2398           10 :       siepmann%B = 0.0_dp
    2399           10 :       siepmann%D = 0.0_dp
    2400           10 :       siepmann%E = 0.0_dp
    2401           10 :       siepmann%F = 0.0_dp
    2402           10 :       siepmann%beta = 0.0_dp
    2403           10 :       siepmann%rcutsq = 0.0_dp
    2404           10 :       siepmann%allow_oh_formation = .FALSE.
    2405           10 :       siepmann%allow_h3o_formation = .FALSE.
    2406           10 :       siepmann%allow_o_formation = .FALSE.
    2407              : 
    2408              :    END SUBROUTINE pair_potential_siepmann_clean
    2409              : 
    2410              : ! **************************************************************************************************
    2411              : !> \brief Destroys the Siepmann-Sprik potential
    2412              : !>      (Siepmann and Sprik, J. Chem. Phys. 102(1) 511, 1995)
    2413              : !> \param siepmann ...
    2414              : ! **************************************************************************************************
    2415       525742 :    SUBROUTINE pair_potential_siepmann_release(siepmann)
    2416              :       TYPE(siepmann_pot_type), POINTER                   :: siepmann
    2417              : 
    2418       525742 :       IF (ASSOCIATED(siepmann)) THEN
    2419           10 :          DEALLOCATE (siepmann)
    2420              :       END IF
    2421       525742 :       NULLIFY (siepmann)
    2422       525742 :    END SUBROUTINE pair_potential_siepmann_release
    2423              : 
    2424              : ! **************************************************************************************************
    2425              : !> \brief Creates the GAL19 potential type
    2426              : !>      (??)
    2427              : !> \param gal ...
    2428              : ! **************************************************************************************************
    2429            2 :    SUBROUTINE pair_potential_gal_create(gal)
    2430              :       TYPE(gal_pot_type), POINTER                        :: gal
    2431              : 
    2432            2 :       CPASSERT(.NOT. ASSOCIATED(gal))
    2433            2 :       ALLOCATE (gal)
    2434            2 :       CALL pair_potential_gal_clean(gal)
    2435            2 :    END SUBROUTINE pair_potential_gal_create
    2436              : 
    2437              : ! **************************************************************************************************
    2438              : !> \brief Copy two GAL potential type
    2439              : !>      (??)
    2440              : !> \param gal_source ...
    2441              : !> \param gal_dest ...
    2442              : ! **************************************************************************************************
    2443        12538 :    SUBROUTINE pair_potential_gal_copy(gal_source, gal_dest)
    2444              :       TYPE(gal_pot_type), POINTER                        :: gal_source, gal_dest
    2445              : 
    2446        12538 :       IF (.NOT. ASSOCIATED(gal_source)) RETURN
    2447            1 :       IF (ASSOCIATED(gal_dest)) CALL pair_potential_gal_release(gal_dest)
    2448            1 :       CALL pair_potential_gal_create(gal_dest)
    2449            1 :       gal_dest%met1 = gal_source%met1
    2450            1 :       gal_dest%met2 = gal_source%met2
    2451            1 :       gal_dest%epsilon = gal_source%epsilon
    2452            1 :       gal_dest%bxy = gal_source%bxy
    2453            1 :       gal_dest%bz = gal_source%bz
    2454            1 :       gal_dest%r1 = gal_source%r1
    2455            1 :       gal_dest%r2 = gal_source%r2
    2456            1 :       gal_dest%a1 = gal_source%a1
    2457            1 :       gal_dest%a2 = gal_source%a2
    2458            1 :       gal_dest%a3 = gal_source%a3
    2459            1 :       gal_dest%a4 = gal_source%a4
    2460            1 :       gal_dest%a = gal_source%a
    2461            1 :       gal_dest%b = gal_source%b
    2462            1 :       gal_dest%c = gal_source%c
    2463            3 :       ALLOCATE (gal_dest%gcn(SIZE(gal_source%gcn)))
    2464         1741 :       gal_dest%gcn = gal_source%gcn
    2465            1 :       gal_dest%express = gal_source%express
    2466            1 :       gal_dest%rcutsq = gal_source%rcutsq
    2467              : 
    2468              :    END SUBROUTINE pair_potential_gal_copy
    2469              : 
    2470              : ! **************************************************************************************************
    2471              : !> \brief Creates the GAL19 potential type
    2472              : !>      (??)
    2473              : !> \param gal ...
    2474              : ! **************************************************************************************************
    2475       570035 :    SUBROUTINE pair_potential_gal_clean(gal)
    2476              :       TYPE(gal_pot_type), POINTER                        :: gal
    2477              : 
    2478       570035 :       IF (.NOT. ASSOCIATED(gal)) RETURN
    2479            2 :       gal%epsilon = 0.0_dp
    2480            2 :       gal%bxy = 0.0_dp
    2481            2 :       gal%bz = 0.0_dp
    2482            2 :       gal%r1 = 0.0_dp
    2483            2 :       gal%r2 = 0.0_dp
    2484            2 :       gal%a1 = 0.0_dp
    2485            2 :       gal%a2 = 0.0_dp
    2486            2 :       gal%a3 = 0.0_dp
    2487            2 :       gal%a4 = 0.0_dp
    2488            2 :       gal%a = 0.0_dp
    2489            2 :       gal%b = 0.0_dp
    2490            2 :       gal%c = 0.0_dp
    2491            2 :       gal%rcutsq = 0.0_dp
    2492            2 :       gal%express = .FALSE.
    2493              : 
    2494              :    END SUBROUTINE pair_potential_gal_clean
    2495              : 
    2496              : ! **************************************************************************************************
    2497              : !> \brief Destroys the GAL19 potential
    2498              : !>      (??)
    2499              : !> \param gal ...
    2500              : ! **************************************************************************************************
    2501       525742 :    SUBROUTINE pair_potential_gal_release(gal)
    2502              :       TYPE(gal_pot_type), POINTER                        :: gal
    2503              : 
    2504       525742 :       IF (ASSOCIATED(gal)) THEN
    2505            2 :          DEALLOCATE (gal%gcn)
    2506            2 :          DEALLOCATE (gal)
    2507              :       END IF
    2508       525742 :       NULLIFY (gal)
    2509       525742 :    END SUBROUTINE pair_potential_gal_release
    2510              : 
    2511              : ! **************************************************************************************************
    2512              : !> \brief Creates the GAL21 potential type
    2513              : !>      (??)
    2514              : !> \param gal21 ...
    2515              : ! **************************************************************************************************
    2516            2 :    SUBROUTINE pair_potential_gal21_create(gal21)
    2517              :       TYPE(gal21_pot_type), POINTER                      :: gal21
    2518              : 
    2519            2 :       CPASSERT(.NOT. ASSOCIATED(gal21))
    2520            2 :       ALLOCATE (gal21)
    2521            2 :       CALL pair_potential_gal21_clean(gal21)
    2522            2 :    END SUBROUTINE pair_potential_gal21_create
    2523              : 
    2524              : ! **************************************************************************************************
    2525              : !> \brief Copy two GAL21 potential type
    2526              : !>      (??)
    2527              : !> \param gal21_source ...
    2528              : !> \param gal21_dest ...
    2529              : ! **************************************************************************************************
    2530        12538 :    SUBROUTINE pair_potential_gal21_copy(gal21_source, gal21_dest)
    2531              :       TYPE(gal21_pot_type), POINTER                      :: gal21_source, gal21_dest
    2532              : 
    2533        12538 :       IF (.NOT. ASSOCIATED(gal21_source)) RETURN
    2534            1 :       IF (ASSOCIATED(gal21_dest)) CALL pair_potential_gal21_release(gal21_dest)
    2535            1 :       CALL pair_potential_gal21_create(gal21_dest)
    2536            1 :       gal21_dest%met1 = gal21_source%met1
    2537            1 :       gal21_dest%met2 = gal21_source%met2
    2538            1 :       gal21_dest%epsilon1 = gal21_source%epsilon1
    2539            1 :       gal21_dest%epsilon2 = gal21_source%epsilon2
    2540            1 :       gal21_dest%epsilon3 = gal21_source%epsilon3
    2541            1 :       gal21_dest%bxy1 = gal21_source%bxy1
    2542            1 :       gal21_dest%bxy2 = gal21_source%bxy2
    2543            1 :       gal21_dest%bz1 = gal21_source%bz1
    2544            1 :       gal21_dest%bz2 = gal21_source%bz2
    2545            1 :       gal21_dest%r1 = gal21_source%r1
    2546            1 :       gal21_dest%r2 = gal21_source%r2
    2547            1 :       gal21_dest%a11 = gal21_source%a11
    2548            1 :       gal21_dest%a12 = gal21_source%a12
    2549            1 :       gal21_dest%a13 = gal21_source%a13
    2550            1 :       gal21_dest%a21 = gal21_source%a21
    2551            1 :       gal21_dest%a22 = gal21_source%a22
    2552            1 :       gal21_dest%a23 = gal21_source%a23
    2553            1 :       gal21_dest%a31 = gal21_source%a31
    2554            1 :       gal21_dest%a32 = gal21_source%a32
    2555            1 :       gal21_dest%a33 = gal21_source%a33
    2556            1 :       gal21_dest%a41 = gal21_source%a41
    2557            1 :       gal21_dest%a42 = gal21_source%a42
    2558            1 :       gal21_dest%a43 = gal21_source%a43
    2559            1 :       gal21_dest%AO1 = gal21_source%AO1
    2560            1 :       gal21_dest%AO2 = gal21_source%AO2
    2561            1 :       gal21_dest%BO1 = gal21_source%BO1
    2562            1 :       gal21_dest%BO2 = gal21_source%BO2
    2563            1 :       gal21_dest%c = gal21_source%c
    2564            1 :       gal21_dest%AH1 = gal21_source%AH1
    2565            1 :       gal21_dest%AH2 = gal21_source%AH2
    2566            1 :       gal21_dest%BH1 = gal21_source%BH1
    2567            1 :       gal21_dest%BH2 = gal21_source%BH2
    2568            3 :       ALLOCATE (gal21_dest%gcn(SIZE(gal21_source%gcn)))
    2569         1741 :       gal21_dest%gcn = gal21_source%gcn
    2570            1 :       gal21_dest%express = gal21_source%express
    2571            1 :       gal21_dest%rcutsq = gal21_source%rcutsq
    2572              : 
    2573              :    END SUBROUTINE pair_potential_gal21_copy
    2574              : 
    2575              : ! **************************************************************************************************
    2576              : !> \brief Creates the GAL21 potential type
    2577              : !>      (??)
    2578              : !> \param gal21 ...
    2579              : ! **************************************************************************************************
    2580       570035 :    SUBROUTINE pair_potential_gal21_clean(gal21)
    2581              :       TYPE(gal21_pot_type), POINTER                      :: gal21
    2582              : 
    2583       570035 :       IF (.NOT. ASSOCIATED(gal21)) RETURN
    2584            2 :       gal21%epsilon1 = 0.0_dp
    2585            2 :       gal21%epsilon2 = 0.0_dp
    2586            2 :       gal21%epsilon3 = 0.0_dp
    2587            2 :       gal21%bxy1 = 0.0_dp
    2588            2 :       gal21%bxy2 = 0.0_dp
    2589            2 :       gal21%bz1 = 0.0_dp
    2590            2 :       gal21%bz2 = 0.0_dp
    2591            2 :       gal21%r1 = 0.0_dp
    2592            2 :       gal21%r2 = 0.0_dp
    2593            2 :       gal21%a11 = 0.0_dp
    2594            2 :       gal21%a12 = 0.0_dp
    2595            2 :       gal21%a13 = 0.0_dp
    2596            2 :       gal21%a21 = 0.0_dp
    2597            2 :       gal21%a22 = 0.0_dp
    2598            2 :       gal21%a23 = 0.0_dp
    2599            2 :       gal21%a31 = 0.0_dp
    2600            2 :       gal21%a32 = 0.0_dp
    2601            2 :       gal21%a33 = 0.0_dp
    2602            2 :       gal21%a41 = 0.0_dp
    2603            2 :       gal21%a42 = 0.0_dp
    2604            2 :       gal21%a43 = 0.0_dp
    2605            2 :       gal21%AO1 = 0.0_dp
    2606            2 :       gal21%AO2 = 0.0_dp
    2607            2 :       gal21%BO1 = 0.0_dp
    2608            2 :       gal21%BO2 = 0.0_dp
    2609            2 :       gal21%c = 0.0_dp
    2610            2 :       gal21%AH1 = 0.0_dp
    2611            2 :       gal21%AH2 = 0.0_dp
    2612            2 :       gal21%BH1 = 0.0_dp
    2613            2 :       gal21%BH2 = 0.0_dp
    2614            2 :       gal21%rcutsq = 0.0_dp
    2615            2 :       gal21%express = .FALSE.
    2616              : 
    2617              :    END SUBROUTINE pair_potential_gal21_clean
    2618              : 
    2619              : ! **************************************************************************************************
    2620              : !> \brief Destroys the GAL21 potential
    2621              : !>      (??)
    2622              : !> \param gal21 ...
    2623              : ! **************************************************************************************************
    2624       525742 :    SUBROUTINE pair_potential_gal21_release(gal21)
    2625              :       TYPE(gal21_pot_type), POINTER                      :: gal21
    2626              : 
    2627       525742 :       IF (ASSOCIATED(gal21)) THEN
    2628            2 :          DEALLOCATE (gal21%gcn)
    2629            2 :          DEALLOCATE (gal21)
    2630              :       END IF
    2631       525742 :       NULLIFY (gal21)
    2632       525742 :    END SUBROUTINE pair_potential_gal21_release
    2633              : 
    2634              : ! **************************************************************************************************
    2635              : !> \brief Creates the TABPOT potential type
    2636              : !> \param tab ...
    2637              : !> \author Alex Mironenko, Da Teng 2019-2022
    2638              : ! **************************************************************************************************
    2639           48 :    SUBROUTINE pair_potential_tab_create(tab)
    2640              :       TYPE(tab_pot_type), POINTER                        :: tab
    2641              : 
    2642           48 :       CPASSERT(.NOT. ASSOCIATED(tab))
    2643           48 :       ALLOCATE (tab)
    2644              :       NULLIFY (tab%r, tab%e, tab%f)
    2645           48 :       CALL pair_potential_tab_clean(tab)
    2646           48 :    END SUBROUTINE pair_potential_tab_create
    2647              : 
    2648              : ! **************************************************************************************************
    2649              : !> \brief Copy two TABPOT potential type
    2650              : !> \param tab_source ...
    2651              : !> \param tab_dest ...
    2652              : ! **************************************************************************************************
    2653        12538 :    SUBROUTINE pair_potential_tab_copy(tab_source, tab_dest)
    2654              :       TYPE(tab_pot_type), POINTER                        :: tab_source, tab_dest
    2655              : 
    2656        12538 :       IF (.NOT. ASSOCIATED(tab_source)) RETURN
    2657           24 :       IF (ASSOCIATED(tab_dest)) CALL pair_potential_tab_release(tab_dest)
    2658           24 :       CALL pair_potential_tab_create(tab_dest)
    2659           24 :       tab_dest%tabpot_file_name = tab_source%tabpot_file_name
    2660           24 :       tab_dest%dr = tab_source%dr
    2661           24 :       tab_dest%rcut = tab_source%rcut
    2662           24 :       tab_dest%npoints = tab_source%npoints
    2663           24 :       tab_dest%index = tab_source%index
    2664              :       ! Allocate arrays with the proper size
    2665           24 :       CALL reallocate(tab_dest%r, 1, tab_dest%npoints)
    2666           24 :       CALL reallocate(tab_dest%e, 1, tab_dest%npoints)
    2667           24 :       CALL reallocate(tab_dest%f, 1, tab_dest%npoints)
    2668        43800 :       tab_dest%r = tab_source%r
    2669        43800 :       tab_dest%e = tab_source%e
    2670        43800 :       tab_dest%f = tab_source%f
    2671              :    END SUBROUTINE pair_potential_tab_copy
    2672              : 
    2673              : ! **************************************************************************************************
    2674              : !> \brief Creates the TABPOT potential type
    2675              : !> \param tab ...
    2676              : ! **************************************************************************************************
    2677       570081 :    SUBROUTINE pair_potential_tab_clean(tab)
    2678              :       TYPE(tab_pot_type), POINTER                        :: tab
    2679              : 
    2680       570081 :       IF (.NOT. ASSOCIATED(tab)) RETURN
    2681           48 :       tab%tabpot_file_name = 'NULL'
    2682           48 :       tab%dr = 0.0_dp
    2683           48 :       tab%rcut = 0.0_dp
    2684           48 :       tab%npoints = 0
    2685           48 :       tab%index = 0
    2686           48 :       CALL reallocate(tab%r, 1, tab%npoints)
    2687           48 :       CALL reallocate(tab%e, 1, tab%npoints)
    2688           48 :       CALL reallocate(tab%f, 1, tab%npoints)
    2689              : 
    2690              :    END SUBROUTINE pair_potential_tab_clean
    2691              : 
    2692              : ! **************************************************************************************************
    2693              : !> \brief Destroys the TABPOT potential type
    2694              : !> \param tab ...
    2695              : ! **************************************************************************************************
    2696       525742 :    SUBROUTINE pair_potential_tab_release(tab)
    2697              :       TYPE(tab_pot_type), POINTER                        :: tab
    2698              : 
    2699       525742 :       IF (ASSOCIATED(tab)) THEN
    2700           48 :          IF (ASSOCIATED(tab%r)) THEN
    2701           48 :             DEALLOCATE (tab%r)
    2702              :          END IF
    2703           48 :          IF (ASSOCIATED(tab%e)) THEN
    2704           48 :             DEALLOCATE (tab%e)
    2705              :          END IF
    2706           48 :          IF (ASSOCIATED(tab%f)) THEN
    2707           48 :             DEALLOCATE (tab%f)
    2708              :          END IF
    2709           48 :          DEALLOCATE (tab)
    2710              :       END IF
    2711       525742 :    END SUBROUTINE pair_potential_tab_release
    2712              : 
    2713            0 : END MODULE pair_potential_types
    2714              : 
        

Generated by: LCOV version 2.0-1