250 |
|
subroutine allocateEAM(status) |
251 |
|
integer, intent(out) :: status |
252 |
|
|
253 |
– |
integer :: nlocal |
253 |
|
#ifdef IS_MPI |
254 |
< |
integer :: nrow |
255 |
< |
integer :: ncol |
254 |
> |
integer :: nAtomsInRow |
255 |
> |
integer :: nAtomsInCol |
256 |
|
#endif |
257 |
|
integer :: alloc_stat |
258 |
|
|
259 |
|
|
261 |
– |
nlocal = getNlocal() |
260 |
|
status = 0 |
261 |
|
#ifdef IS_MPI |
262 |
< |
nrow = getNrow(plan_row) |
263 |
< |
ncol = getNcol(plan_col) |
262 |
> |
nAtomsInRow = getNatomsInRow(plan_atom_row) |
263 |
> |
nAtomsInCol = getNatomsInCol(plan_atom_col) |
264 |
|
#endif |
265 |
|
|
266 |
|
if (allocated(frho)) deallocate(frho) |
301 |
|
|
302 |
|
|
303 |
|
if (allocated(frho_row)) deallocate(frho_row) |
304 |
< |
allocate(frho_row(nrow),stat=alloc_stat) |
304 |
> |
allocate(frho_row(nAtomsInRow),stat=alloc_stat) |
305 |
|
if (alloc_stat /= 0) then |
306 |
|
status = -1 |
307 |
|
return |
308 |
|
end if |
309 |
|
if (allocated(rho_row)) deallocate(rho_row) |
310 |
< |
allocate(rho_row(nrow),stat=alloc_stat) |
310 |
> |
allocate(rho_row(nAtomsInRow),stat=alloc_stat) |
311 |
|
if (alloc_stat /= 0) then |
312 |
|
status = -1 |
313 |
|
return |
314 |
|
end if |
315 |
|
if (allocated(dfrhodrho_row)) deallocate(dfrhodrho_row) |
316 |
< |
allocate(dfrhodrho_row(nrow),stat=alloc_stat) |
316 |
> |
allocate(dfrhodrho_row(nAtomsInRow),stat=alloc_stat) |
317 |
|
if (alloc_stat /= 0) then |
318 |
|
status = -1 |
319 |
|
return |
320 |
|
end if |
321 |
|
if (allocated(d2frhodrhodrho_row)) deallocate(d2frhodrhodrho_row) |
322 |
< |
allocate(d2frhodrhodrho_row(nrow),stat=alloc_stat) |
322 |
> |
allocate(d2frhodrhodrho_row(nAtomsInRow),stat=alloc_stat) |
323 |
|
if (alloc_stat /= 0) then |
324 |
|
status = -1 |
325 |
|
return |
329 |
|
! Now do column arrays |
330 |
|
|
331 |
|
if (allocated(frho_col)) deallocate(frho_col) |
332 |
< |
allocate(frho_col(ncol),stat=alloc_stat) |
332 |
> |
allocate(frho_col(nAtomsInCol),stat=alloc_stat) |
333 |
|
if (alloc_stat /= 0) then |
334 |
|
status = -1 |
335 |
|
return |
336 |
|
end if |
337 |
|
if (allocated(rho_col)) deallocate(rho_col) |
338 |
< |
allocate(rho_col(ncol),stat=alloc_stat) |
338 |
> |
allocate(rho_col(nAtomsInCol),stat=alloc_stat) |
339 |
|
if (alloc_stat /= 0) then |
340 |
|
status = -1 |
341 |
|
return |
342 |
|
end if |
343 |
|
if (allocated(dfrhodrho_col)) deallocate(dfrhodrho_col) |
344 |
< |
allocate(dfrhodrho_col(ncol),stat=alloc_stat) |
344 |
> |
allocate(dfrhodrho_col(nAtomsInCol),stat=alloc_stat) |
345 |
|
if (alloc_stat /= 0) then |
346 |
|
status = -1 |
347 |
|
return |
348 |
|
end if |
349 |
|
if (allocated(d2frhodrhodrho_col)) deallocate(d2frhodrhodrho_col) |
350 |
< |
allocate(d2frhodrhodrho_col(ncol),stat=alloc_stat) |
350 |
> |
allocate(d2frhodrhodrho_col(nAtomsInCol),stat=alloc_stat) |
351 |
|
if (alloc_stat /= 0) then |
352 |
|
status = -1 |
353 |
|
return |
567 |
|
cleanme = .true. |
568 |
|
!! Scatter the electron density from pre-pair calculation back to local atoms |
569 |
|
#ifdef IS_MPI |
570 |
< |
call scatter(rho_row,rho,plan_row,eam_err) |
570 |
> |
call scatter(rho_row,rho,plan_atom_row,eam_err) |
571 |
|
if (eam_err /= 0 ) then |
572 |
|
write(errMsg,*) " Error scattering rho_row into rho" |
573 |
|
call handleError(RoutineName,errMesg) |
574 |
|
endif |
575 |
< |
call scatter(rho_col,rho_tmp,plan_col,eam_err) |
575 |
> |
call scatter(rho_col,rho_tmp,plan_atom_col,eam_err) |
576 |
|
if (eam_err /= 0 ) then |
577 |
|
write(errMsg,*) " Error scattering rho_col into rho" |
578 |
|
call handleError(RoutineName,errMesg) |
617 |
|
|
618 |
|
#ifdef IS_MPI |
619 |
|
!! communicate f(rho) and derivatives back into row and column arrays |
620 |
< |
call gather(frho,frho_row,plan_row, eam_err) |
620 |
> |
call gather(frho,frho_row,plan_atom_row, eam_err) |
621 |
|
if (eam_err /= 0) then |
622 |
|
call handleError("cal_eam_forces()","MPI gather frho_row failure") |
623 |
|
endif |
624 |
< |
call gather(dfrhodrho,dfrhodrho_row,plan_row, eam_err) |
624 |
> |
call gather(dfrhodrho,dfrhodrho_row,plan_atom_row, eam_err) |
625 |
|
if (eam_err /= 0) then |
626 |
|
call handleError("cal_eam_forces()","MPI gather dfrhodrho_row failure") |
627 |
|
endif |
628 |
< |
call gather(frho,frho_col,plan_col, eam_err) |
628 |
> |
call gather(frho,frho_col,plan_atom_col, eam_err) |
629 |
|
if (eam_err /= 0) then |
630 |
|
call handleError("cal_eam_forces()","MPI gather frho_col failure") |
631 |
|
endif |
632 |
< |
call gather(dfrhodrho,dfrhodrho_col,plan_col, eam_err) |
632 |
> |
call gather(dfrhodrho,dfrhodrho_col,plan_atom_col, eam_err) |
633 |
|
if (eam_err /= 0) then |
634 |
|
call handleError("cal_eam_forces()","MPI gather dfrhodrho_col failure") |
635 |
|
endif |
639 |
|
|
640 |
|
|
641 |
|
if (nmflag) then |
642 |
< |
call gather(d2frhodrhodrho,d2frhodrhodrho_row,plan_row) |
643 |
< |
call gather(d2frhodrhodrho,d2frhodrhodrho_col,plan_col) |
642 |
> |
call gather(d2frhodrhodrho,d2frhodrhodrho_row,plan_atom_row) |
643 |
> |
call gather(d2frhodrhodrho,d2frhodrhodrho_col,plan_atom_col) |
644 |
|
endif |
645 |
|
#endif |
646 |
|
|
651 |
|
|
652 |
|
|
653 |
|
!! Does EAM pairwise Force calculation. |
654 |
< |
subroutine do_eam_pair(atom1,atom2,d,rij,r2,pot,f,do_pot,do_stress) |
654 |
> |
subroutine do_eam_pair(atom1, atom2, d, rij, r2, sw, vpair, fpair, & |
655 |
> |
pot, f, do_pot) |
656 |
|
!Arguments |
657 |
|
integer, intent(in) :: atom1, atom2 |
658 |
|
real( kind = dp ), intent(in) :: rij, r2 |
659 |
< |
real( kind = dp ) :: pot |
660 |
< |
real( kind = dp ), dimension(3,getNlocal()) :: f |
659 |
> |
real( kind = dp ) :: pot, sw, vpair |
660 |
> |
real( kind = dp ), dimension(3,nLocal) :: f |
661 |
|
real( kind = dp ), intent(in), dimension(3) :: d |
662 |
< |
logical, intent(in) :: do_pot, do_stress |
662 |
> |
real( kind = dp ), intent(inout), dimension(3) :: fpair |
663 |
> |
|
664 |
> |
logical, intent(in) :: do_pot |
665 |
|
|
666 |
|
real( kind = dp ) :: drdx,drdy,drdz |
667 |
|
real( kind = dp ) :: d2 |
814 |
|
f(3,atom2) = f(3,atom2) - fz |
815 |
|
#endif |
816 |
|
|
817 |
+ |
vpair = vpair + phab |
818 |
+ |
#ifdef IS_MPI |
819 |
+ |
id1 = AtomRowToGlobal(atom1) |
820 |
+ |
id2 = AtomColToGlobal(atom2) |
821 |
+ |
#else |
822 |
+ |
id1 = atom1 |
823 |
+ |
id2 = atom2 |
824 |
+ |
#endif |
825 |
+ |
|
826 |
+ |
if (molMembershipList(id1) .ne. molMembershipList(id2)) then |
827 |
+ |
|
828 |
+ |
fpair(1) = fpair(1) + fx |
829 |
+ |
fpair(2) = fpair(2) + fy |
830 |
+ |
fpair(3) = fpair(3) + fz |
831 |
+ |
|
832 |
+ |
endif |
833 |
+ |
|
834 |
|
if (nmflag) then |
835 |
|
|
836 |
|
drhoidr = drha |
854 |
|
drhojdr*drhojdr*d2frhodrhodrho(atom1) |
855 |
|
#endif |
856 |
|
end if |
839 |
– |
|
840 |
– |
|
857 |
|
|
858 |
< |
|
843 |
< |
if (do_stress) then |
844 |
< |
|
845 |
< |
#ifdef IS_MPI |
846 |
< |
id1 = tagRow(atom1) |
847 |
< |
id2 = tagColumn(atom2) |
848 |
< |
#else |
849 |
< |
id1 = atom1 |
850 |
< |
id2 = atom2 |
851 |
< |
#endif |
852 |
< |
|
853 |
< |
if (molMembershipList(id1) .ne. molMembershipList(id2)) then |
854 |
< |
|
855 |
< |
tau_Temp(1) = tau_Temp(1) - d(1) * fx |
856 |
< |
tau_Temp(2) = tau_Temp(2) - d(1) * fy |
857 |
< |
tau_Temp(3) = tau_Temp(3) - d(1) * fz |
858 |
< |
tau_Temp(4) = tau_Temp(4) - d(2) * fx |
859 |
< |
tau_Temp(5) = tau_Temp(5) - d(2) * fy |
860 |
< |
tau_Temp(6) = tau_Temp(6) - d(2) * fz |
861 |
< |
tau_Temp(7) = tau_Temp(7) - d(3) * fx |
862 |
< |
tau_Temp(8) = tau_Temp(8) - d(3) * fy |
863 |
< |
tau_Temp(9) = tau_Temp(9) - d(3) * fz |
864 |
< |
|
865 |
< |
virial_Temp = virial_Temp + & |
866 |
< |
(tau_Temp(1) + tau_Temp(5) + tau_Temp(9)) |
867 |
< |
|
868 |
< |
endif |
869 |
< |
endif |
870 |
< |
endif |
871 |
< |
|
872 |
< |
|
858 |
> |
endif |
859 |
|
end subroutine do_eam_pair |
860 |
|
|
861 |
|
|