CP2K 2.4 (Revision 12889)

fist_nonbond_env_types.f90

Go to the documentation of this file.
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