!!****f* setups/jet_injection/user_bnd !! !! NAME !! tot_bnd !! !! SYNOPSIS !! call user_bnd(solnData, block_no,neigh , bndcnd) !! call user_bnd(real(:,:,:,:), integer, integer, integer) !! !! DESCRIPTION !! !! This is a user_bnd routine for the problem of jet injection !! through a nozzle in the left X boundary of the computational !! domain. !! !! By Michal Hanasz (MH), based on the windtunnel 'user_bnd.F90' !! !! !! Called for a block if the boundary condition is bnd_user. !! The routine must fill the appropriate guardcells (as determined !! by `neigh', which is 1 for -X, 2 for +X, 3 for -Y, 4 for +Y, !! 5 for -Z, 6 for +Z) for the given block number (block_no). !! For completeness, the boundary condition is passed as well; !! at the moment, we expect this to be bnd_user. !! !! NOTES !! This is intended to be a template. Please describe here !! what any actual functional versions do. !! !!*** subroutine user_bnd( solnData, block_no,neigh , bndcnd) !=============================================================================== use runtime_parameters, only : get_parm_from_context, GLOBAL_PARM_CONTEXT use dBase, ONLY: & & nxb, nyb, nzb, k2d, k3d, nguard, mfaces, ionmax, & & iLo_gc, jLo_gc, kLo_gc, & & iHi_gc, jHi_gc, kHi_gc, nvar, & & bnd_reflect, bnd_outflow, bnd_user, bnd_hydrostat, & & dBaseLocalBlockCount, & & dBaseKeyNumber, dBaseSpecies, & & dBaseGetDataPtrSingleBlock, & & dBaseNeighborBlockList, & & dBaseGetCoords, & ! (MH) & ndim !----- implicit none real,intent(INOUT), & DIMENSION(nvar,iLo_gc:iHi_gc,jLo_gc:jHi_gc,kLo_gc:kHi_gc) & :: solnData ! (MH) integer, PARAMETER :: q = max(iHi_gc, jHi_gc, kHi_gc) real, DIMENSION(q) :: xl,yl,zl, x,y,z, xr, yr, zr !----- integer, intent(IN) :: block_no, neigh, bndcnd logical, save :: first_call = .true. integer :: n, i, j, k integer :: ic, kk integer, save :: ivelx, ively, ivelz, idens, ipres, itemp, iener, & igamc, igame integer, save :: inuc_begin real, save :: gamma, smallp real :: kine ! Jet parameters (MH) ------------ integer, save :: mjb real, save :: p_a, p_j, rho_j, rho_a, rj, jet_vel !--------------------------------- ! Global database keys ! integer, save :: idens, ivelx, ively, ivelz, ipres, iener, & ! itemp, igamc, igame, imagx, imagy, imagz ! integer, save :: nxb, nyb, nzb, k2d, k3d integer, save :: iXvector, iYvector, iZvector integer, save :: iXcoord, iYcoord, iZcoord, iznl, izn, iznr, iPoint !------ !=============================================================================== if (first_call) then ivelx = dBaseKeyNumber("velx") ively = dBaseKeyNumber("vely") ivelz = dBaseKeyNumber("velz") idens = dBaseKeyNumber("dens") ipres = dBaseKeyNumber("pres") itemp = dBaseKeyNumber("temp") iener = dBaseKeyNumber("ener") igame = dBaseKeyNumber("game") igamc = dBaseKeyNumber("gamc") inuc_begin = dBaseSpecies(1) ! get the runtime parameters needed for the jet call get_parm_from_context(GLOBAL_PARM_CONTEXT, 'gamma', gamma) call get_parm_from_context(GLOBAL_PARM_CONTEXT, 'smallp', smallp) ! (MH) call get_parm_from_context(GLOBAL_PARM_CONTEXT, 'p_a', p_a) call get_parm_from_context(GLOBAL_PARM_CONTEXT, 'rho_a', rho_a) call get_parm_from_context(GLOBAL_PARM_CONTEXT, 'rho_j', rho_j) call get_parm_from_context(GLOBAL_PARM_CONTEXT, 'jet_vel', jet_vel) call get_parm_from_context(GLOBAL_PARM_CONTEXT, 'rj', rj) call get_parm_from_context(GLOBAL_PARM_CONTEXT, 'mjb', mjb) ! ---- first_call = .FALSE. endif if (bndcnd .ne. bnd_user) then call abort_flash('user_bnd: dont know about non-bnd_user bcs!') endif ! (MH) ! set coordinates y = 0. yl = 0. yr = 0. z = 0. zl = 0. zr = 0. iznl = dBaseKeyNumber('znr') izn = dBaseKeyNumber('zn') iznr = dBaseKeyNumber('znl') iXcoord = dBaseKeyNumber('xCoord') iYcoord = dBaseKeyNumber('yCoord') iZcoord = dBaseKeyNumber('zCoord') call dBaseGetCoords(iznr, iXcoord, block_no, xr) call dBaseGetCoords(izn , iXcoord, block_no, x ) call dBaseGetCoords(iznl, iXcoord, block_no, xl) if (ndim > 1) then call dBaseGetCoords(iznr, iYcoord, block_no, yr) call dBaseGetCoords(izn , iYcoord, block_no, y ) call dBaseGetCoords(iznl, iYcoord, block_no, yl) if (ndim > 2) then call dBaseGetCoords(iznr, iZcoord, block_no, zr) call dBaseGetCoords(izn , iZcoord, block_no, z ) call dBaseGetCoords(iznl, iZcoord, block_no, zl) endif endif !------ !------------------------------------------------------------------------------- ! -X user-defined boundary if (neigh == 1 .and. bndcnd == bnd_user) then do k = 1,2*nguard*k3d+nzb do j = 1,2*nguard*k2d+nyb do i = 1,nguard solnData(igame,i,j,k) = gamma solnData(igamc,i,j,k) = gamma solnData(idens,i,j,k) = rho_a - (rho_a-rho_j)/cosh((y(j)/rj)**mjb) solnData(ivelx,i,j,k) = jet_vel/cosh((y(j)/rj)**mjb) solnData(ively,i,j,k) = 0. solnData(ivelz,i,j,k) = 0. solnData(ipres,i,j,k) = p_a - (p_a-p_j)/cosh((y(j)/rj)**mjb) kine = 0.5 * (solnData(ivelx,i,j,k)**2) solnData(iener,i,j,k) = & solnData(ipres,i,j,k) / & (solnData(igame,i,j,k)-1.) solnData(iener,i,j,k) = & solnData(iener,i,j,k) / & solnData(idens,i,j,k) solnData(iener,i,j,k) = & solnData(iener,i,j,k) & + kine solnData(iener,i,j,k) = & max(solnData(iener,i,j,k),smallp) end do end do end do endif !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ! +X user-defined boundary if (neigh == 2 .and. bndcnd == bnd_user) then call abort_flash & & ("tot_bnd: no +X user boundary condition defined!") ! do k = 1, 2*nguard*k3d+nzb ! do j = 1, 2*nguard*k2d+nyb ! do i = nguard+nxb+1, 2*nguard+nxb ! solnData(:,i,j,k) = user-defined values ! end do ! end do ! end do end if !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ! -Y user-defined boundary if (neigh == 3 .and. bndcnd == bnd_user) then call abort_flash & & ("tot_bnd: no -Y user boundary condition defined!") ! do k = 1, 2*nguard*k3d+nzb ! do i = 1, 2*nguard+nxb ! do j = 1, nguard ! solnData(:,i,j,k) = user-defined values ! end do ! end do ! end do end if !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ! +Y user-defined boundary if (neigh == 4 .and. bndcnd == bnd_user) then call abort_flash & & ("tot_bnd: no +Y user boundary condition defined!") ! do k = 1, 2*nguard*k3d+nzb ! do i = 1, 2*nguard+nxb ! do j = 2*nguard+nyb, nguard+nyb+1, -1 ! solnData(:,i,j,k) = user-defined values ! end do ! end do ! end do end if !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ! -Z user-defined boundary if (neigh == 5 .and. bndcnd == bnd_user) then call abort_flash & & ("tot_bnd: no -Z user boundary condition defined!") ! do j = 1, 2*nguard+nyb ! do i = 1, 2*nguard+nxb ! do k = 1, nguard ! solnData(:,i,j,k) = user-defined values ! end do ! end do ! end do end if !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ! +Z user-defined boundary if (neigh == 6 .and. bndcnd == bnd_user) then call abort_flash & & ("tot_bnd: no +Z user boundary condition defined!") ! do j = 1, 2*nguard+nyb ! do i = 1, 2*nguard+nxb ! do k = 2*nguard+nzb, nguard+nzb+1, -1 ! solnData(:,i,j,k) = user-defined values ! end do ! end do ! end do end if !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - return end