|
CP2K 2.4 (Revision 12889)
|
00001 !-----------------------------------------------------------------------------! 00002 ! CP2K: A general program to perform molecular dynamics simulations ! 00003 ! Copyright (C) 2000 - 2013 CP2K developers group ! 00004 !-----------------------------------------------------------------------------! 00005 00006 ! ***************************************************************************** 00011 MODULE fist_nonbond_env_types 00012 USE atomic_kind_types, ONLY: atomic_kind_type 00013 USE cell_types, ONLY: cell_release,& 00014 cell_type 00015 USE f77_blas 00016 USE fist_neighbor_list_types, ONLY: fist_neighbor_deallocate,& 00017 fist_neighbor_type 00018 USE kinds, ONLY: default_string_length,& 00019 dp 00020 USE pair_potential_types, ONLY: pair_potential_pp_release,& 00021 pair_potential_pp_type,& 00022 siepmann_type,& 00023 tersoff_type 00024 #include "cp_common_uses.h" 00025 00026 IMPLICIT NONE 00027 PRIVATE 00028 00029 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'fist_nonbond_env_types' 00030 INTEGER, PRIVATE, SAVE :: last_fist_nonbond_env_id_nr=0 00031 PUBLIC :: fist_nonbond_env_type, fist_nonbond_env_set, & 00032 fist_nonbond_env_get, fist_nonbond_env_create, & 00033 fist_nonbond_env_retain, fist_nonbond_env_release, pos_type, eam_type 00034 00035 ! ***************************************************************************** 00036 TYPE pos_type 00037 REAL (KIND=dp) :: r(3) 00038 END TYPE 00039 00040 TYPE eam_type 00041 REAL (KIND=dp) :: f_embed, rho 00042 END TYPE 00043 00044 ! ***************************************************************************** 00045 TYPE fist_nonbond_env_type 00046 INTEGER :: ref_count, id_nr, natom_types 00047 INTEGER :: counter, last_update, num_update 00048 LOGICAL :: do_nonbonded, shift_cutoff 00049 CHARACTER ( len = default_string_length ) :: unit_type 00050 REAL (KIND=dp) :: lup, aup, ei_scale14, 00051 vdw_scale14 00052 REAL (KIND=dp) :: long_range_correction 00053 REAL (KIND=dp), DIMENSION ( :, : ), POINTER :: rlist_cut, rlist_lowsq, ij_kind_full_fac 00054 REAL (KIND=dp), DIMENSION ( : ), POINTER :: charges 00055 TYPE(fist_neighbor_type), POINTER :: nonbonded 00056 TYPE(pair_potential_pp_type), POINTER :: potparm14, potparm 00057 TYPE(cell_type), POINTER :: cell_last_update 00058 TYPE(pos_type), DIMENSION(:), POINTER :: r_last_update, r_last_update_pbc 00059 TYPE(pos_type), DIMENSION(:), POINTER :: rshell_last_update_pbc 00060 TYPE(pos_type), DIMENSION(:), POINTER :: rcore_last_update_pbc 00061 TYPE(eam_type), DIMENSION(:), POINTER :: eam_data 00062 END TYPE fist_nonbond_env_type 00063 00064 CONTAINS 00065 00066 ! ***************************************************************************** 00075 SUBROUTINE fist_nonbond_env_get(fist_nonbond_env, potparm14, potparm, & 00076 nonbonded, rlist_cut, rlist_lowsq, aup, lup, ei_scale14, vdw_scale14, & 00077 shift_cutoff, r_last_update, r_last_update_pbc, rshell_last_update_pbc, & 00078 rcore_last_update_pbc, cell_last_update, num_update, last_update, & 00079 counter, natom_types, long_range_correction, ij_kind_full_fac, eam_data, & 00080 charges, error) 00081 00082 TYPE(fist_nonbond_env_type), POINTER :: fist_nonbond_env 00083 TYPE(pair_potential_pp_type), OPTIONAL, 00084 POINTER :: potparm14, potparm 00085 TYPE(fist_neighbor_type), OPTIONAL, 00086 POINTER :: nonbonded 00087 REAL(KIND=dp), DIMENSION(:, :), 00088 OPTIONAL, POINTER :: rlist_cut, rlist_lowsq 00089 REAL(KIND=dp), OPTIONAL :: aup, lup, ei_scale14, 00090 vdw_scale14 00091 LOGICAL, INTENT(OUT), OPTIONAL :: shift_cutoff 00092 TYPE(pos_type), DIMENSION(:), OPTIONAL, 00093 POINTER :: r_last_update, 00094 r_last_update_pbc, 00095 rshell_last_update_pbc, 00096 rcore_last_update_pbc 00097 TYPE(cell_type), OPTIONAL, POINTER :: cell_last_update 00098 INTEGER, OPTIONAL :: num_update, last_update, 00099 counter, natom_types 00100 REAL(KIND=dp), OPTIONAL :: long_range_correction 00101 REAL(KIND=dp), DIMENSION(:, :), 00102 OPTIONAL, POINTER :: ij_kind_full_fac 00103 TYPE(eam_type), DIMENSION(:), OPTIONAL, 00104 POINTER :: eam_data 00105 REAL(KIND=dp), DIMENSION(:), OPTIONAL, 00106 POINTER :: charges 00107 TYPE(cp_error_type), INTENT(inout) :: error 00108 00109 IF ( PRESENT ( charges ) ) charges => fist_nonbond_env%charges 00110 IF ( PRESENT ( potparm14 ) ) potparm14 => fist_nonbond_env%potparm14 00111 IF ( PRESENT ( eam_data ) ) eam_data => fist_nonbond_env%eam_data 00112 IF ( PRESENT ( potparm ) ) potparm => fist_nonbond_env%potparm 00113 IF ( PRESENT ( rlist_cut ) ) rlist_cut => fist_nonbond_env%rlist_cut 00114 IF ( PRESENT ( rlist_lowsq ) ) rlist_lowsq => fist_nonbond_env%rlist_lowsq 00115 IF ( PRESENT ( ij_kind_full_fac ) ) ij_kind_full_fac => fist_nonbond_env%ij_kind_full_fac 00116 IF ( PRESENT ( nonbonded ) ) nonbonded => fist_nonbond_env%nonbonded 00117 IF ( PRESENT ( r_last_update ) ) & 00118 r_last_update => fist_nonbond_env%r_last_update 00119 IF ( PRESENT ( r_last_update_pbc ) ) & 00120 r_last_update_pbc => fist_nonbond_env%r_last_update_pbc 00121 IF ( PRESENT ( rshell_last_update_pbc ) ) & 00122 rshell_last_update_pbc => fist_nonbond_env%rshell_last_update_pbc 00123 IF ( PRESENT ( rcore_last_update_pbc ) ) & 00124 rcore_last_update_pbc => fist_nonbond_env%rcore_last_update_pbc 00125 IF ( PRESENT ( cell_last_update ) ) & 00126 cell_last_update => fist_nonbond_env%cell_last_update 00127 IF ( PRESENT ( lup ) ) lup = fist_nonbond_env%lup 00128 IF ( PRESENT ( aup ) ) aup = fist_nonbond_env%aup 00129 IF ( PRESENT ( ei_scale14 ) ) ei_scale14 = fist_nonbond_env%ei_scale14 00130 IF ( PRESENT ( vdw_scale14 ) ) vdw_scale14 = fist_nonbond_env%vdw_scale14 00131 IF ( PRESENT ( shift_cutoff ) ) & 00132 shift_cutoff = fist_nonbond_env%shift_cutoff 00133 IF ( PRESENT ( natom_types ) ) natom_types = fist_nonbond_env%natom_types 00134 IF ( PRESENT ( counter ) ) counter = fist_nonbond_env%counter 00135 IF ( PRESENT ( last_update ) ) last_update = fist_nonbond_env%last_update 00136 IF ( PRESENT ( num_update ) ) num_update = fist_nonbond_env%num_update 00137 IF ( PRESENT ( long_range_correction ) ) & 00138 long_range_correction = fist_nonbond_env%long_range_correction 00139 END SUBROUTINE fist_nonbond_env_get 00140 00141 ! ***************************************************************************** 00150 SUBROUTINE fist_nonbond_env_set(fist_nonbond_env, potparm14, potparm, & 00151 rlist_cut, rlist_lowsq, nonbonded, aup, lup, ei_scale14, vdw_scale14, & 00152 shift_cutoff, r_last_update, r_last_update_pbc, rshell_last_update_pbc, & 00153 rcore_last_update_pbc, cell_last_update, num_update, last_update, & 00154 counter, natom_types, long_range_correction, eam_data, charges, error) 00155 00156 TYPE(fist_nonbond_env_type), POINTER :: fist_nonbond_env 00157 TYPE(pair_potential_pp_type), OPTIONAL, 00158 POINTER :: potparm14, potparm 00159 REAL(KIND=dp), DIMENSION(:, :), 00160 OPTIONAL, POINTER :: rlist_cut, rlist_lowsq 00161 TYPE(fist_neighbor_type), OPTIONAL, 00162 POINTER :: nonbonded 00163 REAL(KIND=dp), OPTIONAL :: aup, lup, ei_scale14, 00164 vdw_scale14 00165 LOGICAL, INTENT(IN), OPTIONAL :: shift_cutoff 00166 TYPE(pos_type), DIMENSION(:), OPTIONAL, 00167 POINTER :: r_last_update, 00168 r_last_update_pbc, 00169 rshell_last_update_pbc, 00170 rcore_last_update_pbc 00171 TYPE(cell_type), OPTIONAL, POINTER :: cell_last_update 00172 INTEGER, OPTIONAL :: num_update, last_update, 00173 counter, natom_types 00174 REAL(KIND=dp), OPTIONAL :: long_range_correction 00175 TYPE(eam_type), DIMENSION(:), OPTIONAL, 00176 POINTER :: eam_data 00177 REAL(KIND=dp), DIMENSION(:), OPTIONAL, 00178 POINTER :: charges 00179 TYPE(cp_error_type), INTENT(inout) :: error 00180 00181 IF ( PRESENT ( potparm14 ) ) fist_nonbond_env%potparm14 => potparm14 00182 IF ( PRESENT ( eam_data ) ) fist_nonbond_env%eam_data => eam_data 00183 IF ( PRESENT ( potparm ) ) fist_nonbond_env%potparm => potparm 00184 IF ( PRESENT ( rlist_cut ) ) fist_nonbond_env%rlist_cut => rlist_cut 00185 IF ( PRESENT ( charges ) ) fist_nonbond_env%charges => charges 00186 IF ( PRESENT ( rlist_lowsq ) ) fist_nonbond_env%rlist_lowsq => rlist_lowsq 00187 IF ( PRESENT ( nonbonded ) ) fist_nonbond_env%nonbonded => nonbonded 00188 IF ( PRESENT ( r_last_update ) ) & 00189 fist_nonbond_env%r_last_update => r_last_update 00190 IF ( PRESENT ( r_last_update_pbc ) ) & 00191 fist_nonbond_env%r_last_update_pbc => r_last_update_pbc 00192 IF ( PRESENT ( rshell_last_update_pbc ) ) & 00193 fist_nonbond_env%rshell_last_update_pbc => rshell_last_update_pbc 00194 IF ( PRESENT ( rcore_last_update_pbc ) ) & 00195 fist_nonbond_env%rcore_last_update_pbc => rcore_last_update_pbc 00196 IF ( PRESENT ( cell_last_update ) ) & 00197 fist_nonbond_env%cell_last_update => cell_last_update 00198 IF ( PRESENT ( lup ) ) fist_nonbond_env%lup = lup 00199 IF ( PRESENT ( aup ) ) fist_nonbond_env%aup = aup 00200 IF ( PRESENT ( ei_scale14 ) ) fist_nonbond_env%ei_scale14 = ei_scale14 00201 IF ( PRESENT ( vdw_scale14 ) ) fist_nonbond_env%vdw_scale14 = vdw_scale14 00202 IF ( PRESENT ( shift_cutoff ) ) & 00203 fist_nonbond_env%shift_cutoff = shift_cutoff 00204 IF ( PRESENT ( natom_types ) ) fist_nonbond_env%natom_types = natom_types 00205 IF ( PRESENT ( counter ) ) fist_nonbond_env%counter = counter 00206 IF ( PRESENT ( last_update ) ) fist_nonbond_env%last_update = last_update 00207 IF ( PRESENT ( num_update ) ) fist_nonbond_env%num_update = num_update 00208 IF ( PRESENT ( long_range_correction ) ) & 00209 fist_nonbond_env%long_range_correction = long_range_correction 00210 END SUBROUTINE fist_nonbond_env_set 00211 00212 ! ***************************************************************************** 00221 SUBROUTINE fist_nonbond_env_create(fist_nonbond_env, atomic_kind_set, & 00222 potparm14, potparm, do_nonbonded, verlet_skin, ewald_rcut, ei_scale14, & 00223 vdw_scale14, shift_cutoff, error) 00224 TYPE(fist_nonbond_env_type), POINTER :: fist_nonbond_env 00225 TYPE(atomic_kind_type), DIMENSION(:), 00226 POINTER :: atomic_kind_set 00227 TYPE(pair_potential_pp_type), OPTIONAL, 00228 POINTER :: potparm14, potparm 00229 LOGICAL, INTENT(IN) :: do_nonbonded 00230 REAL(KIND=dp), INTENT(IN) :: verlet_skin, ewald_rcut, 00231 ei_scale14, vdw_scale14 00232 LOGICAL, INTENT(IN) :: shift_cutoff 00233 TYPE(cp_error_type), INTENT(inout) :: error 00234 00235 CHARACTER(len=*), PARAMETER :: routineN = 'fist_nonbond_env_create', 00236 routineP = moduleN//':'//routineN 00237 00238 INTEGER :: stat 00239 LOGICAL :: failure 00240 00241 failure=.FALSE. 00242 ALLOCATE(fist_nonbond_env, stat=stat) 00243 CPPostcondition(stat==0,cp_failure_level,routineP,error,failure) 00244 NULLIFY(fist_nonbond_env%potparm14) 00245 NULLIFY(fist_nonbond_env%potparm) 00246 NULLIFY(fist_nonbond_env%rlist_cut) 00247 NULLIFY(fist_nonbond_env%rlist_lowsq) 00248 NULLIFY(fist_nonbond_env%ij_kind_full_fac) 00249 NULLIFY(fist_nonbond_env%nonbonded) 00250 NULLIFY(fist_nonbond_env%cell_last_update) 00251 NULLIFY(fist_nonbond_env%r_last_update) 00252 NULLIFY(fist_nonbond_env%r_last_update_pbc) 00253 NULLIFY(fist_nonbond_env%rshell_last_update_pbc) 00254 NULLIFY(fist_nonbond_env%rcore_last_update_pbc) 00255 NULLIFY(fist_nonbond_env%eam_data) 00256 NULLIFY(fist_nonbond_env%charges) 00257 CALL init_fist_nonbond_env(fist_nonbond_env, atomic_kind_set, potparm14, & 00258 potparm, do_nonbonded, verlet_skin, ewald_rcut, ei_scale14, vdw_scale14, & 00259 shift_cutoff, error) 00260 END SUBROUTINE fist_nonbond_env_create 00261 00262 ! ***************************************************************************** 00268 SUBROUTINE init_fist_nonbond_env(fist_nonbond_env, atomic_kind_set, & 00269 potparm14, potparm, do_nonbonded, verlet_skin, ewald_rcut, ei_scale14, & 00270 vdw_scale14, shift_cutoff, error) 00271 00272 TYPE(fist_nonbond_env_type), POINTER :: fist_nonbond_env 00273 TYPE(atomic_kind_type), DIMENSION(:), 00274 POINTER :: atomic_kind_set 00275 TYPE(pair_potential_pp_type), OPTIONAL, 00276 POINTER :: potparm14, potparm 00277 LOGICAL, INTENT(IN) :: do_nonbonded 00278 REAL(KIND=dp), INTENT(IN) :: verlet_skin, ewald_rcut, 00279 ei_scale14, vdw_scale14 00280 LOGICAL, INTENT(IN) :: shift_cutoff 00281 TYPE(cp_error_type), INTENT(inout) :: error 00282 00283 CHARACTER(len=*), PARAMETER :: routineN = 'init_fist_nonbond_env', 00284 routineP = moduleN//':'//routineN 00285 00286 INTEGER :: idim, jdim, natom_types, stat 00287 LOGICAL :: check, failure, use_potparm, 00288 use_potparm14 00289 REAL(KIND=dp) :: fac, rcut, rlow 00290 00291 use_potparm14 = PRESENT(potparm14) 00292 IF (use_potparm14) use_potparm14 = use_potparm14.OR.ASSOCIATED(potparm14) 00293 use_potparm = PRESENT(potparm) 00294 IF (use_potparm) use_potparm = use_potparm.OR.ASSOCIATED(potparm) 00295 NULLIFY (fist_nonbond_env%nonbonded) 00296 NULLIFY (fist_nonbond_env%r_last_update) 00297 NULLIFY (fist_nonbond_env%r_last_update_pbc) 00298 NULLIFY (fist_nonbond_env%rshell_last_update_pbc) 00299 NULLIFY (fist_nonbond_env%rcore_last_update_pbc) 00300 NULLIFY (fist_nonbond_env%cell_last_update) 00301 NULLIFY (fist_nonbond_env%rlist_cut) 00302 NULLIFY (fist_nonbond_env%rlist_lowsq) 00303 NULLIFY (fist_nonbond_env%ij_kind_full_fac) 00304 fist_nonbond_env%unit_type = "ANGSTROM" 00305 fist_nonbond_env%do_nonbonded = do_nonbonded 00306 fist_nonbond_env%lup = 0 00307 fist_nonbond_env%aup = 0 00308 fist_nonbond_env%ei_scale14 = ei_scale14 00309 fist_nonbond_env%vdw_scale14 = vdw_scale14 00310 fist_nonbond_env%shift_cutoff = shift_cutoff 00311 fist_nonbond_env%counter = 0 00312 fist_nonbond_env%last_update = 0 00313 fist_nonbond_env%num_update = 0 00314 fist_nonbond_env%long_range_correction = 0 00315 fist_nonbond_env%ref_count=1 00316 fist_nonbond_env%id_nr=last_fist_nonbond_env_id_nr 00317 last_fist_nonbond_env_id_nr=last_fist_nonbond_env_id_nr+1 00318 IF (do_nonbonded) THEN 00319 natom_types = 1 00320 ! Determine size of kind arrays 00321 natom_types = SIZE(atomic_kind_set) 00322 IF (use_potparm14) THEN 00323 check = (SIZE(potparm14%pot,1)==natom_types) 00324 CPPostcondition(check,cp_failure_level,routineP,error,failure) 00325 END IF 00326 IF (use_potparm) THEN 00327 check = (SIZE(potparm%pot,1)==natom_types) 00328 CPPostcondition(check,cp_failure_level,routineP,error,failure) 00329 END IF 00330 ALLOCATE ( fist_nonbond_env%rlist_cut(natom_types, natom_types), stat=stat) 00331 CPPostcondition(stat==0,cp_failure_level,routineP,error,failure) 00332 ALLOCATE ( fist_nonbond_env%rlist_lowsq(natom_types, natom_types), stat=stat) 00333 CPPostcondition(stat==0,cp_failure_level,routineP,error,failure) 00334 ALLOCATE ( fist_nonbond_env%ij_kind_full_fac(natom_types, natom_types), stat=stat) 00335 CPPostcondition(stat==0,cp_failure_level,routineP,error,failure) 00336 fist_nonbond_env%ij_kind_full_fac = 1.0_dp 00337 DO idim = 1, natom_types 00338 DO jdim = idim, natom_types 00339 IF ((use_potparm) .OR. (use_potparm14)) THEN 00340 IF (use_potparm) THEN 00341 rcut = SQRT(potparm%pot(idim,jdim)%pot%rcutsq) 00342 fac = potparm%pot(idim,jdim)%pot%spl_f%rscale(1) 00343 rlow = fac / (potparm%pot(idim,jdim)%pot%pair_spline_data(1)%spline_data%xn) 00344 ELSE 00345 rcut = SQRT(potparm14%pot(idim,jdim)%pot%rcutsq) 00346 fac = potparm14%pot(idim,jdim)%pot%spl_f%rscale(1) 00347 rlow = fac / (potparm14%pot(idim,jdim)%pot%pair_spline_data(1)%spline_data%xn) 00348 END IF 00349 ! Warning: rlist_rcut should only be used by the neighbor list 00350 ! algorithm. It is not the cutoff for the evaluation of the 00351 ! interactions because rlist_rcut includes the Verlet skin. 00352 rcut = MAX(rcut, ewald_rcut) + verlet_skin 00353 fist_nonbond_env%rlist_cut(idim,jdim) = rcut 00354 fist_nonbond_env%rlist_cut(jdim,idim) = rcut 00355 rlow = rlow*(1.06_dp)**2 ! 1.06_dp in order to have 1/2 Emax_spline 00356 fist_nonbond_env%rlist_lowsq(idim,jdim) = rlow 00357 fist_nonbond_env%rlist_lowsq(jdim,idim) = rlow 00358 ! In case of manybody potential the neighbor list will be full. 00359 ! This means that for each atom pair (a,b) of the current types, 00360 ! atom a is in the neighbor list of b and b is in the neighbor 00361 ! list of a. ij_kind_full_fac is used to correct for the double 00362 ! counting in the conventional pair potentials cause by this 00363 ! situation. 00364 IF (ANY(potparm%pot(idim,jdim)%pot%type==tersoff_type)) THEN 00365 ! TODO: what if 14 is not of tersoff type while the normal 00366 ! nonbond is? (or the reverse). We'd better impose 00367 ! consistency. 00368 fist_nonbond_env%ij_kind_full_fac(idim,jdim) = 0.5_dp 00369 fist_nonbond_env%ij_kind_full_fac(idim,jdim) = 0.5_dp 00370 END IF 00371 IF (ANY(potparm%pot(idim,jdim)%pot%type==siepmann_type)) THEN 00372 ! TODO:see tersoff_type 00373 fist_nonbond_env%ij_kind_full_fac(idim,jdim) = 0.5_dp 00374 fist_nonbond_env%ij_kind_full_fac(idim,jdim) = 0.5_dp 00375 END IF 00376 ELSE 00377 ! In case we don't use potparm for initialization let's account 00378 ! only for the real-space part of the Ewald sum. 00379 fist_nonbond_env%rlist_cut(idim,jdim) = ewald_rcut 00380 fist_nonbond_env%rlist_cut(jdim,idim) = ewald_rcut 00381 fist_nonbond_env%rlist_lowsq(idim,jdim) = 0.0_dp 00382 fist_nonbond_env%rlist_lowsq(jdim,idim) = 0.0_dp 00383 END IF 00384 END DO 00385 END DO 00386 IF (use_potparm14) fist_nonbond_env%potparm14 => potparm14 00387 IF (use_potparm) fist_nonbond_env%potparm => potparm 00388 fist_nonbond_env%natom_types = natom_types 00389 ELSE 00390 NULLIFY(fist_nonbond_env%potparm) 00391 NULLIFY(fist_nonbond_env%potparm14) 00392 END IF 00393 END SUBROUTINE init_fist_nonbond_env 00394 00395 ! ***************************************************************************** 00404 SUBROUTINE fist_nonbond_env_retain(fist_nonbond_env,error) 00405 TYPE(fist_nonbond_env_type), POINTER :: fist_nonbond_env 00406 TYPE(cp_error_type), INTENT(inout) :: error 00407 00408 CHARACTER(len=*), PARAMETER :: routineN = 'fist_nonbond_env_retain', 00409 routineP = moduleN//':'//routineN 00410 00411 LOGICAL :: failure 00412 00413 failure=.FALSE. 00414 CPPrecondition(ASSOCIATED(fist_nonbond_env),cp_failure_level,routineP,error,failure) 00415 IF (.NOT. failure) THEN 00416 CPPrecondition(fist_nonbond_env%ref_count>0,cp_failure_level,routineP,error,failure) 00417 fist_nonbond_env%ref_count=fist_nonbond_env%ref_count+1 00418 END IF 00419 END SUBROUTINE fist_nonbond_env_retain 00420 00421 ! ***************************************************************************** 00430 SUBROUTINE fist_nonbond_env_release(fist_nonbond_env,error) 00431 TYPE(fist_nonbond_env_type), POINTER :: fist_nonbond_env 00432 TYPE(cp_error_type), INTENT(inout) :: error 00433 00434 CHARACTER(len=*), PARAMETER :: routineN = 'fist_nonbond_env_release', 00435 routineP = moduleN//':'//routineN 00436 00437 INTEGER :: stat 00438 LOGICAL :: failure 00439 00440 failure=.FALSE. 00441 IF (ASSOCIATED(fist_nonbond_env)) THEN 00442 CPPrecondition(fist_nonbond_env%ref_count>0,cp_failure_level,routineP,error,failure) 00443 fist_nonbond_env%ref_count=fist_nonbond_env%ref_count-1 00444 IF (fist_nonbond_env%ref_count<1) THEN 00445 IF (ASSOCIATED(fist_nonbond_env%nonbonded)) THEN 00446 CALL fist_neighbor_deallocate (fist_nonbond_env%nonbonded, error ) 00447 END IF 00448 ! Release potparm 00449 CALL pair_potential_pp_release ( fist_nonbond_env%potparm, error ) 00450 ! Release potparm14 00451 CALL pair_potential_pp_release ( fist_nonbond_env%potparm14, error ) 00452 IF (ASSOCIATED(fist_nonbond_env%r_last_update)) THEN 00453 DEALLOCATE (fist_nonbond_env%r_last_update,STAT=stat) 00454 CPPostcondition(stat==0,cp_failure_level,routineP,error,failure) 00455 ENDIF 00456 IF (ASSOCIATED(fist_nonbond_env%r_last_update_pbc)) THEN 00457 DEALLOCATE (fist_nonbond_env%r_last_update_pbc,STAT=stat) 00458 CPPostcondition(stat==0,cp_failure_level,routineP,error,failure) 00459 ENDIF 00460 IF (ASSOCIATED(fist_nonbond_env%charges)) THEN 00461 DEALLOCATE (fist_nonbond_env%charges,STAT=stat) 00462 CPPostcondition(stat==0,cp_failure_level,routineP,error,failure) 00463 ENDIF 00464 IF (ASSOCIATED(fist_nonbond_env%eam_data)) THEN 00465 DEALLOCATE (fist_nonbond_env%eam_data,STAT=stat) 00466 CPPostcondition(stat==0,cp_failure_level,routineP,error,failure) 00467 ENDIF 00468 IF (ASSOCIATED(fist_nonbond_env%rshell_last_update_pbc)) THEN 00469 DEALLOCATE (fist_nonbond_env%rshell_last_update_pbc,STAT=stat) 00470 CPPostcondition(stat==0,cp_failure_level,routineP,error,failure) 00471 ENDIF 00472 IF (ASSOCIATED(fist_nonbond_env%rcore_last_update_pbc)) THEN 00473 DEALLOCATE (fist_nonbond_env%rcore_last_update_pbc,STAT=stat) 00474 CPPostcondition(stat==0,cp_failure_level,routineP,error,failure) 00475 ENDIF 00476 IF (ASSOCIATED(fist_nonbond_env%cell_last_update)) THEN 00477 CALL cell_release(fist_nonbond_env%cell_last_update,error) 00478 ENDIF 00479 IF (ASSOCIATED(fist_nonbond_env%ij_kind_full_fac)) THEN 00480 DEALLOCATE (fist_nonbond_env%ij_kind_full_fac,STAT=stat) 00481 CPPostcondition(stat==0,cp_failure_level,routineP,error,failure) 00482 ENDIF 00483 IF (ASSOCIATED(fist_nonbond_env%rlist_cut)) THEN 00484 DEALLOCATE (fist_nonbond_env%rlist_cut,STAT=stat) 00485 CPPostcondition(stat==0,cp_failure_level,routineP,error,failure) 00486 ENDIF 00487 IF (ASSOCIATED(fist_nonbond_env%rlist_lowsq)) THEN 00488 DEALLOCATE (fist_nonbond_env%rlist_lowsq,STAT=stat) 00489 CPPostcondition(stat==0,cp_failure_level,routineP,error,failure) 00490 ENDIF 00491 DEALLOCATE(fist_nonbond_env, STAT=stat) 00492 CPPrecondition(stat==0,cp_warning_level,routineP,error,failure) 00493 END IF 00494 END IF 00495 END SUBROUTINE fist_nonbond_env_release 00496 00497 END MODULE fist_nonbond_env_types
1.7.3