--- trunk/OOPSE/libmdtools/calc_reaction_field.F90 2003/04/09 04:06:43 483 +++ trunk/OOPSE/libmdtools/calc_reaction_field.F90 2003/07/16 21:30:56 626 @@ -9,34 +9,53 @@ module reaction_field #endif implicit none - real(kind=dp), save :: rrf + PRIVATE + + real(kind=dp), save :: rrf = 1.0_dp real(kind=dp), save :: rt - real(kind=dp), save :: dielect - real(kind=dp), save :: rrfsq + real(kind=dp), save :: dielect = 1.0_dp + real(kind=dp), save :: rrfsq = 1.0_dp real(kind=dp), save :: pre - logical, save :: rf_initialized = .false. + logical, save :: rf_initialized = .false., haveCuts = .false. + logical, save :: haveDie = .false. + PUBLIC::initialize_rf + PUBLIC::setCutoffsRF + PUBLIC::accumulate_rf + PUBLIC::accumulate_self_rf + PUBLIC::reaction_field_final + PUBLIC::rf_correct_forces + contains - subroutine initialize_rf(this_rrf, this_rt, this_dielect) - real(kind=dp), intent(in) :: this_rrf, this_rt, this_dielect - - rrf = this_rrf - rt = this_rt + subroutine initialize_rf(this_dielect) + real(kind=dp), intent(in) :: this_dielect + dielect = this_dielect + + pre = 14.38362d0*2.0d0*(dielect-1.0d0)/((2.0d0*dielect+1.0d0)*rrfsq*rrf) + haveDie = .true. + if (haveCuts) rf_initialized = .true. + + return + end subroutine initialize_rf + + subroutine setCutoffsRF( this_rrf, this_rt ) + + real(kind=dp), intent(in) :: this_rrf, this_rt + + rrf = this_rrf + rt = this_rt + rrfsq = rrf * rrf pre = 14.38362d0*2.0d0*(dielect-1.0d0)/((2.0d0*dielect+1.0d0)*rrfsq*rrf) + haveCuts = .true. + if (haveDie) rf_initialized = .true. - write(*,*) 'rrf = ', rrf - write(*,*) 'rt = ', rt - write(*,*) 'dielect = ', dielect - write(*,*) 'pre = ', pre - rf_initialized = .true. - - return - end subroutine initialize_rf + end subroutine setCutoffsRF + subroutine accumulate_rf(atom1, atom2, rij, u_l) @@ -59,6 +78,7 @@ contains if (rij.lt.rt) then taper = 1.0d0 else + write(*,*) 'rf in taper region' taper = (rrf + 2.0d0*rij - 3.0d0*rt)*(rrf-rij)**2/ ((rrf-rt)**3) endif @@ -183,6 +203,7 @@ contains if (rij.lt.rt) then dtdr = 0.0d0 else + write(*,*) 'rf correct in taper region' dtdr = 6.0d0*(rij*rij - rij*rt - rij*rrf +rrf*rt)/((rrf-rt)**3) endif @@ -237,15 +258,21 @@ contains if (do_stress) then if (molMembershipList(atom1) .ne. molMembershipList(atom2)) then - tau_Temp(1) = tau_Temp(1) + dudx * d(1) - tau_Temp(2) = tau_Temp(2) + dudx * d(2) - tau_Temp(3) = tau_Temp(3) + dudx * d(3) - tau_Temp(4) = tau_Temp(4) + dudy * d(1) - tau_Temp(5) = tau_Temp(5) + dudy * d(2) - tau_Temp(6) = tau_Temp(6) + dudy * d(3) - tau_Temp(7) = tau_Temp(7) + dudz * d(1) - tau_Temp(8) = tau_Temp(8) + dudz * d(2) - tau_Temp(9) = tau_Temp(9) + dudz * d(3) + + ! because the d vector is the rj - ri vector, and + ! because dudx, dudy, and dudz are the + ! (positive) force on atom i (negative on atom j) we need + ! a negative sign here: + + tau_Temp(1) = tau_Temp(1) - d(1) * dudx + tau_Temp(2) = tau_Temp(2) - d(1) * dudy + tau_Temp(3) = tau_Temp(3) - d(1) * dudz + tau_Temp(4) = tau_Temp(4) - d(2) * dudx + tau_Temp(5) = tau_Temp(5) - d(2) * dudy + tau_Temp(6) = tau_Temp(6) - d(2) * dudz + tau_Temp(7) = tau_Temp(7) - d(3) * dudx + tau_Temp(8) = tau_Temp(8) - d(3) * dudy + tau_Temp(9) = tau_Temp(9) - d(3) * dudz virial_Temp = virial_Temp + & (tau_Temp(1) + tau_Temp(5) + tau_Temp(9)) endif