|
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 ! ***************************************************************************** 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
1.7.3