LCOV - code coverage report
Current view: top level - src - pair_potential_types.F (source / functions) Hit Total Coverage
Test: CP2K Regtests (git:dc8eeee) Lines: 1040 1152 90.3 %
Date: 2025-05-15 08:34:30 Functions: 90 122 73.8 %

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

Generated by: LCOV version 1.15