--- trunk/mdtools/md_code/simulation_module.F90 2003/01/28 22:16:55 252 +++ trunk/mdtools/md_code/simulation_module.F90 2003/02/25 21:30:09 284 @@ -7,28 +7,9 @@ module simulation implicit none PRIVATE +#define __FORTRAN90 +#include "../headers/fsimulation.h" - - type, public :: simtype - PRIVATE -! SEQUENCE -!! Number of particles on this processor - integer :: nLRparticles -!! Periodic Box - real ( kind = dp ), dimension(3) :: box -!! List Cutoff - real ( kind = dp ) :: rlist = 0.0_dp -!! Radial cutoff - real ( kind = dp ) :: rcut = 0.0_dp -!! List cutoff squared - real ( kind = dp ) :: rlistsq = 0.0_dp -!! Radial Cutoff squared - real ( kind = dp ) :: rcutsq = 0.0_dp -!! Radial Cutoff^6 - real ( kind = dp ) :: rcut6 = 0.0_dp - - end type simtype - type (simtype), public :: thisSim !! Tag for MPI calculations integer, allocatable, dimension(:) :: tag @@ -39,21 +20,23 @@ module simulation #endif !! WARNING: use_pbc hardcoded, fixme - logical :: use_pbc = .true. - logical :: setSim = .false. + logical :: setSim = .false. !! array for saving previous positions for neighbor lists. real( kind = dp ), allocatable,dimension(:,:),save :: q0 - public :: check - public :: save_nlist public :: wrap public :: getBox public :: getRcut public :: getRlist public :: getNlocal public :: setSimulation + public :: isEnsemble + public :: isPBC + public :: getStringLen + public :: returnMixingRules + ! public :: setRcut interface wrap @@ -77,11 +60,14 @@ contains contains - subroutine setSimulation(nLRParticles,box,rlist,rcut) + subroutine setSimulation(nLRParticles,box,rlist,rcut,ensemble,mixingRule,use_pbc) integer, intent(in) :: nLRParticles real(kind = dp ), intent(in), dimension(3) :: box real(kind = dp ), intent(in) :: rlist real(kind = dp ), intent(in) :: rcut + character( len = stringLen), intent(in) :: ensemble + character( len = stringLen), intent(in) :: mixingRule + logical, intent(in) :: use_pbc integer :: alloc_stat if( setsim ) return ! simulation is already initialized setSim = .true. @@ -89,10 +75,15 @@ contains thisSim%nLRParticles = nLRParticles thisSim%box = box thisSim%rlist = rlist + thisSIm%rlistsq = rlist * rlist thisSim%rcut = rcut thisSim%rcutsq = rcut * rcut thisSim%rcut6 = thisSim%rcutsq * thisSim%rcutsq * thisSim%rcutsq + thisSim%ensemble = ensemble + thisSim%mixingRule = mixingRule + thisSim%use_pbc = use_pbc + if (.not. allocated(q0)) then allocate(q0(3,nLRParticles),stat=alloc_stat) endif @@ -123,65 +114,8 @@ contains thisBox = thisSim%box(dim) end function getBox_dim - - subroutine check(q,update_nlist) - real( kind = dp ), dimension(:,:) :: q - integer :: i - real( kind = DP ) :: dispmx - logical, intent(out) :: update_nlist - real( kind = DP ) :: dispmx_tmp - real( kind = dp ) :: skin_thickness - integer :: natoms - - natoms = thisSim%nLRparticles - skin_thickness = thisSim%rlist - dispmx = 0.0E0_DP - !! calculate the largest displacement of any atom in any direction - -#ifdef MPI - dispmx_tmp = 0.0E0_DP - do i = 1, thisSim%nLRparticles - dispmx_tmp = max( abs ( q(1,i) - q0(1,i) ), dispmx ) - dispmx_tmp = max( abs ( q(2,i) - q0(2,i) ), dispmx ) - dispmx_tmp = max( abs ( q(3,i) - q0(3,i) ), dispmx ) - end do - call mpi_allreduce(dispmx_tmp,dispmx,1,mpi_double_precision, & - mpi_max,mpi_comm_world,mpi_err) -#else - - do i = 1, thisSim%nLRparticles - dispmx = max( abs ( q(1,i) - q0(1,i) ), dispmx ) - dispmx = max( abs ( q(2,i) - q0(2,i) ), dispmx ) - dispmx = max( abs ( q(3,i) - q0(3,i) ), dispmx ) - end do -#endif - !! a conservative test of list skin crossings - dispmx = 2.0E0_DP * sqrt (3.0E0_DP * dispmx * dispmx) - - update_nlist = (dispmx.gt.(skin_thickness)) - - end subroutine check - - subroutine save_nlist(q) - real(kind = dp ), dimension(:,:), intent(in) :: q - integer :: list_size - - list_size = size(q) - - if (.not. allocated(q0)) then - allocate(q0(3,list_size)) - else if( list_size > size(q0)) then - deallocate(q0) - allocate(q0(3,list_size)) - endif - - q0 = q - - end subroutine save_nlist - - function wrap_1d(r,dim) result(this_wrap) @@ -204,7 +138,7 @@ contains real( kind = dp ), dimension(3) :: this_wrap - if (use_pbc) then + if (this_sim%use_pbc) then ! this_wrap = r - box(dim)*dsign(1.0E0_DP,r)*int(abs(r/box(dim)) + 0.5E0_DP) this_wrap = r - thisSim%box*nint(r/thisSim%box) else @@ -252,6 +186,7 @@ contains thisrlist = thisSim%rlist if(present(rlist2)) rlist2 = thisSim%rlistsq + end subroutine getRlist @@ -262,5 +197,32 @@ contains end function getNlocal + function isEnsemble(this_ensemble) result(is_this_ensemble) + character(len = *) :: this_ensemble + logical :: is_this_enemble + is_this_ensemble = .false. + if (this_ensemble == thisSim%ensemble) is_this_ensemble = .true. + end function isEnsemble + function returnEnsemble() result(thisEnsemble) + character (len = len(thisSim%ensemble)) :: thisEnsemble + thisEnsemble = thisSim%ensemble + end function returnEnsemble + + function returnMixingRules() result(thisMixingRule) + character (len = len(thisSim%ensemble)) :: thisMixingRule + thisMixingRule = thisSim%MixingRule + end function returnMixingRules + + function isPBC() result(PBCset) + logical :: PBCset + PBCset = .false. + if (thisSim%use_pbc) PBCset = .true. + end function isPBC + + pure function getStringLen() result (thislen) + integer :: thislen + thislen = string_len + end function setStringLen + end module simulation