-
Holger Grosshans authored
modified: write_vtk.f90
Holger Grosshans authoredmodified: write_vtk.f90
bc.f90 8.00 KiB
!####################################################################
!> @author Holger Grosshans
!> @brief Dirichlet (fixed value) boundary condition for velocity field
subroutine bcUVW(myu,myv,myw)
use var
use parallel
real(kind=pr),dimension(ii,jj,ll) :: myu,myv,myw
real(kind=pr) :: wval
integer :: m
wval=0._pr
call sync(myu); call sync(myv); call sync(myw) ! between procs through the sync routines
if (bcx.eq.'w') then ! x:
if (myid.eq.0) then
do 1 m=1,gc
myu(imin-m,:,:)= wval
myv(imin-m,:,:)= myv(imin,:,:)-2._pr*(myv(imin,:,:)-wval)
myw(imin-m,:,:)= myw(imin,:,:)-2._pr*(myw(imin,:,:)-wval)
1 enddo
endif
if (myid.eq.nrprocs-1) then
do 2 m=1,gc
myu(imax-1+m,:,:)=wval
myv(imax+m,:,:)= myv(imax,:,:)-2._pr*(myv(imax,:,:)-wval)
myw(imax+m,:,:)= myw(imax,:,:)-2._pr*(myw(imax,:,:)-wval)
2 enddo
endif
elseif (bcx.eq.'p') then
! between procs through the sync routines
elseif (bcx.eq.'i') then
! see inflow routine
if (myid.eq.nrprocs-1) then
do 8 m=1,gc
myu(imax+m-1,:,:)=myu(imax-1,:,:)
myv(imax+m,:,:)= myv(imax,:,:)
myw(imax+m,:,:)= myw(imax,:,:)
8 enddo
endif
endif
if (bcy.eq.'w') then ! y:
do 3 m=1,gc
myu(:,jmin-m,:)= myu(:,jmin,:)-2._pr*(myu(:,jmin,:)-wval)
myu(:,jmax+m,:)= myu(:,jmax,:)-2._pr*(myu(:,jmax,:)-wval)
myv(:,jmin-m,:)= wval
myv(:,jmax-1+m,:)=wval
myw(:,jmin-m,:)= myw(:,jmin,:)-2._pr*(myw(:,jmin,:)-wval)
myw(:,jmax+m,:)= myw(:,jmax,:)-2._pr*(myw(:,jmax,:)-wval)
3 enddo
elseif (bcy.eq.'p') then
do 4 m=1,gc
myu(:,jmin-m,:)= myu(:,jmax+1-m,:)
myu(:,jmax+m,:)= myu(:,jmin-1+m,:)
myv(:,jmin-m,:)= myv(:,jmax+1-m,:)
myv(:,jmax+m,:)= myv(:,jmin-1+m,:)
myw(:,jmin-m,:)= myw(:,jmax+1-m,:)
myw(:,jmax+m,:)= myw(:,jmin-1+m,:)
4 enddo
endif
if (bcz.eq.'w') then ! z:
do 5 m=1,gc
myu(:,:,lmin-m)= myu(:,:,lmin)-2._pr*(myu(:,:,lmin)-wval)
myu(:,:,lmax+m)= myu(:,:,lmax)-2._pr*(myu(:,:,lmax)-wval)
myv(:,:,lmin-m)= myv(:,:,lmin)-2._pr*(myv(:,:,lmin)-wval)
myv(:,:,lmax+m)= myv(:,:,lmax)-2._pr*(myv(:,:,lmax)-wval)
myw(:,:,lmin-m)= wval
myw(:,:,lmax-1+m)=wval
5 enddo
elseif (bcz.eq.'p') then
do 6 m=1,gc
myu(:,:,lmin-m)= myu(:,:,lmax+1-m)
myu(:,:,lmax+m)= myu(:,:,lmin-1+m)
myv(:,:,lmin-m)= myv(:,:,lmax+1-m)
myv(:,:,lmax+m)= myv(:,:,lmin-1+m)
myw(:,:,lmin-m)= myw(:,:,lmax+1-m)
myw(:,:,lmax+m)= myw(:,:,lmin-1+m)
6 enddo
endif
end
!####################################################################
!> @author Holger Grosshans
!> @brief inflow boundary condition
subroutine inflow
use var
real(kind=pr),dimension(dimj*diml) :: random
real(kind=pr) :: alpha,dist
integer :: i,j,l,m,mm
call random_number(random)
alpha=.1_pr
mm=0
do l=lmin,lmax; do j=jmin,jmax
mm=mm+1
if (bcy.eq.'w'.and.bcz.eq.'w') dist=delta-max(abs(yc(j)),abs(zc(l)))
if (bcy.eq.'w'.and.bcz.eq.'p') dist=delta-abs(yc(j))
if (bcy.eq.'p'.and.bcz.eq.'w') dist=delta-abs(zc(l))
do m=1,gc
u(imin-m,j,l)=max(0._pr,ubulk0*(dist/delta)**(1._pr/6._pr) + (random(mm)-.5_pr)*alpha*ubulk0)
v(imin-m,j,l)=(random(mm)-.5_pr)*alpha*ubulk0
w(imin-m,j,l)=(random(mm)-.5_pr)*alpha*ubulk0
enddo
enddo; enddo
end
!####################################################################
!> @author Holger Grosshans
!> @brief Neumann (zero-gradient) boundary condition
subroutine bcNeumann(myvar)
use var
use parallel
real(kind=pr) :: myvar(ii,jj,ll)
integer :: m
call sync(myvar) ! between procs through the sync routines
if (bcx.eq.'w') then
if (myid.eq.0) then
do 1 m=1,gc
myvar(imin-m,:,:)= myvar(imin,:,:)
1 enddo
endif
if (myid.eq.nrprocs-1) then
do 2 m=1,gc
myvar(imax+m,:,:)= myvar(imax,:,:)
2 enddo
endif
elseif (bcx.eq.'p') then
! between procs through the sync routines
elseif (bcx.eq.'i') then
if (myid.eq.0) then
do 7 m=1,gc
myvar(imin-m,:,:)= myvar(imin,:,:)
7 enddo
endif
if (myid.eq.nrprocs-1) then
do 8 m=1,gc
myvar(imax+m,:,:)= myvar(imax,:,:)
8 enddo
endif
endif
if (bcy.eq.'w') then
do 3 m=1,gc
myvar(:,jmin-m,:)= myvar(:,jmin,:)
myvar(:,jmax+m,:)= myvar(:,jmax,:)
3 enddo
elseif (bcy.eq.'p') then
do 4 m=1,gc
myvar(:,jmin-m,:)= myvar(:,jmax+1-m,:)
myvar(:,jmax+m,:)= myvar(:,jmin-1+m,:)
4 enddo
endif
if (bcz.eq.'w') then
do 5 m=1,gc
myvar(:,:,lmin-m)= myvar(:,:,lmin)
myvar(:,:,lmax+m)= myvar(:,:,lmax)
5 enddo
elseif (bcz.eq.'p') then
do 6 m=1,gc
myvar(:,:,lmin-m)= myvar(:,:,lmax+1-m)
myvar(:,:,lmax+m)= myvar(:,:,lmin-1+m)
6 enddo
endif
end
!####################################################################
!> @author Holger Grosshans
!> @brief Dirichlet (fixed value) boundary condition
subroutine bcDirichlet(myvar,wval)
use var
use parallel
real(kind=pr) :: myvar(ii,jj,ll)
real(kind=pr) :: wval
integer :: m
call sync(myvar) ! between procs through the sync routines
if (bcx.eq.'w') then
if (myid.eq.0) then
do 1 m=1,gc
myvar(imin-m,:,:)= -myvar(imin,:,:)+2._pr*wval
1 enddo
endif
if (myid.eq.nrprocs-1) then
do 2 m=1,gc
myvar(imax+m,:,:)= -myvar(imax,:,:)+2._pr*wval
2 enddo
endif
elseif (bcx.eq.'p') then
! between procs through the sync routines
elseif (bcx.eq.'i') then
if (myid.eq.0) then
do 7 m=1,gc
myvar(imin-m,:,:)= myvar(imin,:,:)
7 enddo
endif
if (myid.eq.nrprocs-1) then
do 8 m=1,gc
myvar(imax+m,:,:)= myvar(imax,:,:)
8 enddo
endif
endif
if (bcy.eq.'w') then
do 3 m=1,gc
myvar(:,jmin-m,:)= -myvar(:,jmin,:)+2._pr*wval
myvar(:,jmax+m,:)= -myvar(:,jmax,:)+2._pr*wval
3 enddo
elseif (bcy.eq.'p') then
do 4 m=1,gc
myvar(:,jmin-m,:)= myvar(:,jmax+1-m,:)
myvar(:,jmax+m,:)= myvar(:,jmin-1+m,:)
4 enddo
endif
if (bcz.eq.'w') then
do 5 m=1,gc
myvar(:,:,lmin-m)= -myvar(:,:,lmin)+2._pr*wval
myvar(:,:,lmax+m)= -myvar(:,:,lmax)+2._pr*wval
5 enddo
elseif (bcz.eq.'p') then
do 6 m=1,gc
myvar(:,:,lmin-m)= myvar(:,:,lmax+1-m)
myvar(:,:,lmax+m)= myvar(:,:,lmin-1+m)
6 enddo
endif
end
!####################################################################
!> @author Holger Grosshans
!> @brief a particle located on myid=0, i=imax imposes a source on
!> myid=0, i=imax+1 which needs to be transferred to myid=1, i=imin
!> required for rho_el,Fsx,Fsy,Fsz
!> @todo if 2 dimensions periodic, the corners between diagonal
!> procs not transferred yet
subroutine bcLEsource(myvar)
use var
use parallel
real(kind=pr) :: myvar(ii,jj,ll)
integer :: m
call syncLEsource(myvar) ! between procs through the sync routines
if (bcy.eq.'p') then
do 4 m=1,gc
myvar(:,jmax+1-m,:)= myvar(:,jmin-m,:) + myvar(:,jmax+1-m,:)
myvar(:,jmin-1+m,:)= myvar(:,jmax+m,:) + myvar(:,jmin-1+m,:)
4 enddo
endif
if (bcz.eq.'p') then
do 6 m=1,gc
myvar(:,:,lmax+1-m)= myvar(:,:,lmin-m) + myvar(:,:,lmax+1-m)
myvar(:,:,lmin-1+m)= myvar(:,:,lmax+m) + myvar(:,:,lmin-1+m)
6 enddo
endif
end