Skip to content
Snippets Groups Projects
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