CP2K 2.4 (Revision 12889)

virial_methods.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 ! *****************************************************************************
00010 MODULE virial_methods
00011 
00012   USE atomic_kind_list_types,          ONLY: atomic_kind_list_type
00013   USE atomic_kind_types,               ONLY: atomic_kind_type,&
00014                                              get_atomic_kind
00015   USE cp_para_types,                   ONLY: cp_para_env_type
00016   USE cp_subsys_types,                 ONLY: cp_subsys_get,&
00017                                              cp_subsys_type
00018   USE distribution_1d_types,           ONLY: distribution_1d_type
00019   USE f77_blas
00020   USE kinds,                           ONLY: dp
00021   USE message_passing,                 ONLY: mp_sum
00022   USE particle_list_types,             ONLY: particle_list_type
00023   USE particle_types,                  ONLY: particle_type
00024   USE timings,                         ONLY: timeset,&
00025                                              timestop
00026   USE virial_types,                    ONLY: virial_type
00027 #include "cp_common_uses.h"
00028 
00029   IMPLICIT NONE
00030 
00031   PRIVATE
00032   PUBLIC:: virial_evaluate, virial_pair_force, virial_update
00033 
00034   CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'virial_methods'
00035 
00036 CONTAINS
00037 ! *****************************************************************************
00043   SUBROUTINE virial_update(virial, subsys, para_env, error)
00044     TYPE(virial_type), INTENT(INOUT)         :: virial
00045     TYPE(cp_subsys_type), POINTER            :: subsys
00046     TYPE(cp_para_env_type), POINTER          :: para_env
00047     TYPE(cp_error_type), INTENT(inout)       :: error
00048 
00049     CHARACTER(LEN=*), PARAMETER :: routineN = 'virial_update', 
00050       routineP = moduleN//':'//routineN
00051 
00052     TYPE(atomic_kind_list_type), POINTER     :: atomic_kinds
00053     TYPE(distribution_1d_type), POINTER      :: local_particles
00054     TYPE(particle_list_type), POINTER        :: particles
00055 
00056     CALL cp_subsys_get(subsys, local_particles=local_particles, atomic_kinds=atomic_kinds,&
00057          particles=particles, error=error)
00058 
00059     CALL virial_evaluate(atomic_kinds%els, particles%els, local_particles,&
00060          virial, para_env%group, error)
00061 
00062   END SUBROUTINE virial_update
00063 
00064 ! *****************************************************************************
00071   SUBROUTINE virial_evaluate ( atomic_kind_set, particle_set, local_particles,&
00072        virial, igroup, error)
00073 
00074     TYPE(atomic_kind_type), DIMENSION(:), 
00075       POINTER                                :: atomic_kind_set
00076     TYPE(particle_type), DIMENSION(:), 
00077       POINTER                                :: particle_set
00078     TYPE(distribution_1d_type), POINTER      :: local_particles
00079     TYPE(virial_type), INTENT(INOUT)         :: virial
00080     INTEGER, INTENT(IN)                      :: igroup
00081     TYPE(cp_error_type), INTENT(inout)       :: error
00082 
00083     CHARACTER(LEN=*), PARAMETER :: routineN = 'virial_evaluate', 
00084       routineP = moduleN//':'//routineN
00085 
00086     INTEGER :: handle, i, iparticle, iparticle_kind, iparticle_local, j, 
00087       nnodes, nparticle_kind, nparticle_local
00088     REAL(KIND=dp)                            :: mass, mfl
00089     TYPE(atomic_kind_type), POINTER          :: atomic_kind
00090 
00091     IF ( virial%pv_availability ) THEN
00092        CALL timeset(routineN,handle)
00093        NULLIFY(atomic_kind)
00094        mfl = 0.0_dp
00095        nparticle_kind = SIZE ( atomic_kind_set )
00096        virial%pv_kinetic = 0.0_dp
00097        DO i = 1, 3
00098           DO j = 1, i
00099              nnodes = 0
00100              DO iparticle_kind=1,nparticle_kind
00101                 atomic_kind => atomic_kind_set(iparticle_kind)
00102                 CALL get_atomic_kind(atomic_kind=atomic_kind,mass=mass )
00103                 nparticle_local = local_particles%n_el(iparticle_kind)
00104                 DO iparticle_local=1,nparticle_local
00105                    nnodes = nnodes + 1
00106                    iparticle = local_particles%list(iparticle_kind)%array(iparticle_local)
00107                    virial%pv_kinetic(i,j) = virial%pv_kinetic(i,j) + &
00108                         mass * particle_set(iparticle)%v(i)*particle_set(iparticle)%v(j)
00109                 END DO
00110              END DO
00111              virial%pv_kinetic(j,i) = virial%pv_kinetic(i,j)
00112           END DO
00113        END DO
00114        mfl = REAL( 9 * nnodes, KIND=dp) * 2.0_dp * 1.e-6_dp
00115 
00116        CALL mp_sum(virial%pv_kinetic,igroup)
00117 
00118        ! total virial
00119        virial%pv_total = virial%pv_virial + virial%pv_kinetic + virial%pv_constraint
00120 
00121        CALL timestop(handle)
00122     ENDIF
00123 
00124   END SUBROUTINE virial_evaluate
00125 
00126 ! *****************************************************************************
00133   SUBROUTINE virial_pair_force ( pv_virial, f0, force, rab, error)
00134 
00135     REAL(KIND=dp), DIMENSION(3, 3)           :: pv_virial
00136     REAL(KIND=dp)                            :: f0
00137     REAL(KIND=dp), DIMENSION(3)              :: force, rab
00138     TYPE(cp_error_type), INTENT(inout)       :: error
00139 
00140     CHARACTER(LEN=*), PARAMETER :: routineN = 'virial_pair_force', 
00141       routineP = moduleN//':'//routineN
00142 
00143     INTEGER                                  :: i, j
00144 
00145     DO i=1,3
00146        DO j=1,3
00147           pv_virial(i,j) = pv_virial(i,j) + f0 * force(i) * rab(j)
00148        END DO
00149     END DO
00150 
00151   END SUBROUTINE virial_pair_force
00152 
00153 END MODULE virial_methods
00154