45 |
|
|
46 |
|
!! @author Charles F. Vardeman II |
47 |
|
!! @author Matthew Meineke |
48 |
< |
!! @version $Id: doForces.F90,v 1.9 2005-01-12 22:40:37 gezelter Exp $, $Date: 2005-01-12 22:40:37 $, $Name: not supported by cvs2svn $, $Revision: 1.9 $ |
48 |
> |
!! @version $Id: doForces.F90,v 1.12 2005-03-21 20:51:06 chrisfen Exp $, $Date: 2005-03-21 20:51:06 $, $Name: not supported by cvs2svn $, $Revision: 1.12 $ |
49 |
|
|
50 |
|
|
51 |
|
module doForces |
57 |
|
use neighborLists |
58 |
|
use lj |
59 |
|
use sticky |
60 |
< |
use dipole_dipole |
61 |
< |
use charge_charge |
60 |
> |
use electrostatic_module |
61 |
|
use reaction_field |
62 |
|
use gb_pair |
63 |
|
use shapes |
85 |
|
|
86 |
|
logical, save :: FF_uses_DirectionalAtoms |
87 |
|
logical, save :: FF_uses_LennardJones |
88 |
< |
logical, save :: FF_uses_Electrostatic |
89 |
< |
logical, save :: FF_uses_charges |
90 |
< |
logical, save :: FF_uses_dipoles |
88 |
> |
logical, save :: FF_uses_Electrostatics |
89 |
> |
logical, save :: FF_uses_Charges |
90 |
> |
logical, save :: FF_uses_Dipoles |
91 |
> |
logical, save :: FF_uses_Quadrupoles |
92 |
|
logical, save :: FF_uses_sticky |
93 |
|
logical, save :: FF_uses_GayBerne |
94 |
|
logical, save :: FF_uses_EAM |
101 |
|
logical, save :: SIM_uses_Electrostatics |
102 |
|
logical, save :: SIM_uses_Charges |
103 |
|
logical, save :: SIM_uses_Dipoles |
104 |
+ |
logical, save :: SIM_uses_Quadrupoles |
105 |
|
logical, save :: SIM_uses_Sticky |
106 |
|
logical, save :: SIM_uses_GayBerne |
107 |
|
logical, save :: SIM_uses_EAM |
132 |
|
logical :: is_Electrostatic = .false. |
133 |
|
logical :: is_Charge = .false. |
134 |
|
logical :: is_Dipole = .false. |
135 |
+ |
logical :: is_Quadrupole = .false. |
136 |
|
logical :: is_Sticky = .false. |
137 |
|
logical :: is_GayBerne = .false. |
138 |
|
logical :: is_EAM = .false. |
191 |
|
call getElementProperty(atypes, i, "is_Dipole", thisProperty) |
192 |
|
PropertyMap(i)%is_Dipole = thisProperty |
193 |
|
|
194 |
+ |
call getElementProperty(atypes, i, "is_Quadrupole", thisProperty) |
195 |
+ |
PropertyMap(i)%is_Quadrupole = thisProperty |
196 |
+ |
|
197 |
|
call getElementProperty(atypes, i, "is_Sticky", thisProperty) |
198 |
|
PropertyMap(i)%is_Sticky = thisProperty |
199 |
|
|
311 |
|
|
312 |
|
FF_uses_DirectionalAtoms = .false. |
313 |
|
FF_uses_LennardJones = .false. |
314 |
< |
FF_uses_Electrostatic = .false. |
314 |
> |
FF_uses_Electrostatics = .false. |
315 |
|
FF_uses_Charges = .false. |
316 |
|
FF_uses_Dipoles = .false. |
317 |
|
FF_uses_Sticky = .false. |
331 |
|
call getMatchingElementList(atypes, "is_Electrostatic", .true., & |
332 |
|
nMatches, MatchList) |
333 |
|
if (nMatches .gt. 0) then |
334 |
< |
FF_uses_Electrostatic = .true. |
334 |
> |
FF_uses_Electrostatics = .true. |
335 |
|
endif |
336 |
|
|
337 |
|
call getMatchingElementList(atypes, "is_Charge", .true., & |
338 |
|
nMatches, MatchList) |
339 |
|
if (nMatches .gt. 0) then |
340 |
< |
FF_uses_charges = .true. |
341 |
< |
FF_uses_electrostatic = .true. |
340 |
> |
FF_uses_Charges = .true. |
341 |
> |
FF_uses_Electrostatics = .true. |
342 |
|
endif |
343 |
|
|
344 |
|
call getMatchingElementList(atypes, "is_Dipole", .true., & |
345 |
|
nMatches, MatchList) |
346 |
|
if (nMatches .gt. 0) then |
347 |
< |
FF_uses_dipoles = .true. |
348 |
< |
FF_uses_electrostatic = .true. |
347 |
> |
FF_uses_Dipoles = .true. |
348 |
> |
FF_uses_Electrostatics = .true. |
349 |
|
FF_uses_DirectionalAtoms = .true. |
350 |
|
endif |
351 |
+ |
|
352 |
+ |
call getMatchingElementList(atypes, "is_Quadrupole", .true., & |
353 |
+ |
nMatches, MatchList) |
354 |
+ |
if (nMatches .gt. 0) then |
355 |
+ |
FF_uses_Quadrupoles = .true. |
356 |
+ |
FF_uses_Electrostatics = .true. |
357 |
+ |
FF_uses_DirectionalAtoms = .true. |
358 |
+ |
endif |
359 |
|
|
360 |
|
call getMatchingElementList(atypes, "is_Sticky", .true., nMatches, & |
361 |
|
MatchList) |
847 |
|
if (PropertyMap(me_i)%is_Dipole) then |
848 |
|
|
849 |
|
mu_i = getDipoleMoment(me_i) |
850 |
< |
|
850 |
> |
|
851 |
|
!! The reaction field needs to include a self contribution |
852 |
|
!! to the field: |
853 |
|
call accumulate_self_rf(i, mu_i, eFrame) |
933 |
|
|
934 |
|
endif |
935 |
|
|
936 |
< |
if (FF_uses_charges .and. SIM_uses_charges) then |
936 |
> |
if (FF_uses_Electrostatics .and. SIM_uses_Electrostatics) then |
937 |
|
|
938 |
< |
if (PropertyMap(me_i)%is_Charge .and. PropertyMap(me_j)%is_Charge) then |
939 |
< |
call do_charge_pair(i, j, d, r, rijsq, sw, vpair, fpair, & |
940 |
< |
pot, f, do_pot) |
938 |
> |
if (PropertyMap(me_i)%is_Electrostatic .and. & |
939 |
> |
PropertyMap(me_j)%is_Electrostatic) then |
940 |
> |
call doElectrostaticPair(i, j, d, r, rijsq, sw, vpair, fpair, & |
941 |
> |
pot, eFrame, f, t, do_pot) |
942 |
|
endif |
943 |
|
|
944 |
< |
endif |
945 |
< |
|
946 |
< |
if (FF_uses_dipoles .and. SIM_uses_dipoles) then |
947 |
< |
|
948 |
< |
if ( PropertyMap(me_i)%is_Dipole .and. PropertyMap(me_j)%is_Dipole) then |
949 |
< |
call do_dipole_pair(i, j, d, r, rijsq, sw, vpair, fpair, & |
950 |
< |
pot, eFrame, f, t, do_pot) |
937 |
< |
if (FF_uses_RF .and. SIM_uses_RF) then |
938 |
< |
call accumulate_rf(i, j, r, eFrame, sw) |
939 |
< |
call rf_correct_forces(i, j, d, r, eFrame, sw, f, fpair) |
944 |
> |
if (FF_uses_dipoles .and. SIM_uses_dipoles) then |
945 |
> |
if ( PropertyMap(me_i)%is_Dipole .and. & |
946 |
> |
PropertyMap(me_j)%is_Dipole) then |
947 |
> |
if (FF_uses_RF .and. SIM_uses_RF) then |
948 |
> |
call accumulate_rf(i, j, r, eFrame, sw) |
949 |
> |
call rf_correct_forces(i, j, d, r, eFrame, sw, f, fpair) |
950 |
> |
endif |
951 |
|
endif |
952 |
|
endif |
942 |
– |
|
953 |
|
endif |
954 |
+ |
|
955 |
|
|
956 |
|
if (FF_uses_Sticky .and. SIM_uses_sticky) then |
957 |
|
|
1233 |
|
function FF_UsesDirectionalAtoms() result(doesit) |
1234 |
|
logical :: doesit |
1235 |
|
doesit = FF_uses_DirectionalAtoms .or. FF_uses_Dipoles .or. & |
1236 |
< |
FF_uses_Sticky .or. FF_uses_GayBerne .or. FF_uses_Shapes |
1236 |
> |
FF_uses_Quadrupoles .or. FF_uses_Sticky .or. & |
1237 |
> |
FF_uses_GayBerne .or. FF_uses_Shapes |
1238 |
|
end function FF_UsesDirectionalAtoms |
1239 |
|
|
1240 |
|
function FF_RequiresPrepairCalc() result(doesit) |
1280 |
|
end subroutine add_stress_tensor |
1281 |
|
|
1282 |
|
end module doForces |
1271 |
– |
|
1272 |
– |
!! Interfaces for C programs to module.... |
1273 |
– |
|
1274 |
– |
subroutine initFortranFF(use_RF_c, thisStat) |
1275 |
– |
use doForces, ONLY: init_FF |
1276 |
– |
logical, intent(in) :: use_RF_c |
1277 |
– |
|
1278 |
– |
integer, intent(out) :: thisStat |
1279 |
– |
call init_FF(use_RF_c, thisStat) |
1280 |
– |
|
1281 |
– |
end subroutine initFortranFF |
1282 |
– |
|
1283 |
– |
subroutine doForceloop(q, q_group, A, eFrame, f, t, tau, pot, & |
1284 |
– |
do_pot_c, do_stress_c, error) |
1285 |
– |
|
1286 |
– |
use definitions, ONLY: dp |
1287 |
– |
use simulation |
1288 |
– |
use doForces, ONLY: do_force_loop |
1289 |
– |
!! Position array provided by C, dimensioned by getNlocal |
1290 |
– |
real ( kind = dp ), dimension(3, nLocal) :: q |
1291 |
– |
!! molecular center-of-mass position array |
1292 |
– |
real ( kind = dp ), dimension(3, nGroups) :: q_group |
1293 |
– |
!! Rotation Matrix for each long range particle in simulation. |
1294 |
– |
real( kind = dp), dimension(9, nLocal) :: A |
1295 |
– |
!! Unit vectors for dipoles (lab frame) |
1296 |
– |
real( kind = dp ), dimension(9,nLocal) :: eFrame |
1297 |
– |
!! Force array provided by C, dimensioned by getNlocal |
1298 |
– |
real ( kind = dp ), dimension(3,nLocal) :: f |
1299 |
– |
!! Torsion array provided by C, dimensioned by getNlocal |
1300 |
– |
real( kind = dp ), dimension(3,nLocal) :: t |
1301 |
– |
|
1302 |
– |
!! Stress Tensor |
1303 |
– |
real( kind = dp), dimension(9) :: tau |
1304 |
– |
real ( kind = dp ) :: pot |
1305 |
– |
logical ( kind = 2) :: do_pot_c, do_stress_c |
1306 |
– |
integer :: error |
1307 |
– |
|
1308 |
– |
call do_force_loop(q, q_group, A, eFrame, f, t, tau, pot, & |
1309 |
– |
do_pot_c, do_stress_c, error) |
1310 |
– |
|
1311 |
– |
end subroutine doForceloop |