82 |
|
real(kind=dp), allocatable, dimension(:), public :: mfactCol |
83 |
|
real(kind=dp), allocatable, dimension(:), public :: mfactLocal |
84 |
|
|
85 |
+ |
logical, allocatable, dimension(:) :: simHasAtypeMap |
86 |
|
real(kind=dp), public, dimension(3,3), save :: Hmat, HmatInv |
87 |
|
logical, public, save :: boxIsOrthorhombic |
88 |
|
|
98 |
|
public :: SimUsesCharges |
99 |
|
public :: SimUsesDipoles |
100 |
|
public :: SimUsesSticky |
101 |
+ |
public :: SimUsesStickyPower |
102 |
|
public :: SimUsesGayBerne |
103 |
|
public :: SimUsesEAM |
104 |
|
public :: SimUsesShapes |
106 |
|
public :: SimUsesRF |
107 |
|
public :: SimRequiresPrepairCalc |
108 |
|
public :: SimRequiresPostpairCalc |
109 |
< |
|
109 |
> |
public :: SimHasAtype |
110 |
|
|
111 |
|
contains |
112 |
|
|
458 |
|
molMemberShipList(i) = CmolMembership(i) |
459 |
|
enddo |
460 |
|
|
461 |
< |
if (status == 0) simulation_setup_complete = .true. |
461 |
> |
call createSimHasAtype(alloc_stat) |
462 |
> |
if (alloc_stat /= 0) then |
463 |
> |
status = -1 |
464 |
> |
end if |
465 |
> |
|
466 |
> |
if (status == 0) simulation_setup_complete = .true. |
467 |
|
|
468 |
|
end subroutine SimulationSetup |
469 |
|
|
495 |
|
|
496 |
|
function SimUsesDirectionalAtoms() result(doesit) |
497 |
|
logical :: doesit |
498 |
< |
doesit = thisSim%SIM_uses_dipoles .or. thisSim%SIM_uses_sticky .or. & |
498 |
> |
doesit = thisSim%SIM_uses_dipoles .or. thisSim%SIM_uses_Sticky .or. & |
499 |
> |
thisSim%SIM_uses_StickyPower .or. & |
500 |
|
thisSim%SIM_uses_GayBerne .or. thisSim%SIM_uses_Shapes |
501 |
|
end function SimUsesDirectionalAtoms |
502 |
|
|
525 |
|
doesit = thisSim%SIM_uses_Sticky |
526 |
|
end function SimUsesSticky |
527 |
|
|
528 |
+ |
function SimUsesStickyPower() result(doesit) |
529 |
+ |
logical :: doesit |
530 |
+ |
doesit = thisSim%SIM_uses_StickyPower |
531 |
+ |
end function SimUsesStickyPower |
532 |
+ |
|
533 |
|
function SimUsesGayBerne() result(doesit) |
534 |
|
logical :: doesit |
535 |
|
doesit = thisSim%SIM_uses_GayBerne |
565 |
|
doesit = thisSim%SIM_uses_RF |
566 |
|
end function SimRequiresPostpairCalc |
567 |
|
|
568 |
< |
subroutine InitializeSimGlobals(thisStat) |
568 |
> |
! Function returns true if the simulation has this atype |
569 |
> |
function SimHasAtype(thisAtype) result(doesit) |
570 |
> |
logical :: doesit |
571 |
> |
integer :: thisAtype |
572 |
> |
doesit = .false. |
573 |
> |
if(.not.allocated(SimHasAtypeMap)) return |
574 |
> |
|
575 |
> |
doesit = SimHasAtypeMap(thisAtype) |
576 |
> |
|
577 |
> |
end function SimHasAtype |
578 |
> |
|
579 |
> |
subroutine createSimHasAtype(status) |
580 |
> |
integer, intent(out) :: status |
581 |
> |
integer :: alloc_stat |
582 |
> |
integer :: me_i |
583 |
> |
integer :: mpiErrors |
584 |
> |
integer :: nAtypes |
585 |
> |
status = 0 |
586 |
> |
|
587 |
> |
nAtypes = getSize(atypes) |
588 |
> |
! Setup logical map for atypes in simulation |
589 |
> |
if (.not.allocated(SimHasAtypeMap)) then |
590 |
> |
allocate(SimHasAtypeMap(nAtypes),stat=alloc_stat) |
591 |
> |
if (alloc_stat /= 0 ) then |
592 |
> |
status = -1 |
593 |
> |
return |
594 |
> |
end if |
595 |
> |
SimHasAtypeMap = .false. |
596 |
> |
end if |
597 |
> |
! Loop through the local atoms and grab the atypes present |
598 |
> |
do me_i = 1,nLocal |
599 |
> |
SimHasAtypeMap(atid(me_i)) = .true. |
600 |
> |
end do |
601 |
> |
! For MPI, we need to know all possible atypes present in simulation on all |
602 |
> |
! processors. Use LOR operation to set map. |
603 |
> |
#ifdef IS_MPI |
604 |
> |
call mpi_allreduce(SimHasAtypeMap, SimHasAtypeMap, nAtypes, mpi_logical, & |
605 |
> |
MPI_LOR, mpi_comm_world, mpiErrors) |
606 |
> |
#endif |
607 |
> |
|
608 |
> |
end subroutine createSimHasAtype |
609 |
> |
|
610 |
> |
subroutine InitializeSimGlobals(thisStat) |
611 |
|
integer, intent(out) :: thisStat |
612 |
|
integer :: alloc_stat |
613 |
|
|
659 |
|
n = nLocal |
660 |
|
end function getNlocal |
661 |
|
|
662 |
+ |
|
663 |
+ |
|
664 |
+ |
|
665 |
+ |
|
666 |
|
end module simulation |