15 recursive subroutine filrecur(level,nvar,valbig,aux,naux,t,mx,my, &
16 nrowst,ncolst,ilo,ihi,jlo,jhi)
18 use amr_module, only: hxposs, hyposs, xlower, ylower, xupper, yupper
19 use amr_module, only: outunit, nghost, xperdom, yperdom, spheredom
20 use amr_module, only: iregsz, jregsz, intratx, intraty, needs_to_be_set
23 use amr_module, only: timesetaux, timesetauxcpu
28 integer,
intent(in) :: level, nvar, naux, mx, my, nrowst, ncolst
29 integer,
intent(in) :: ilo,ihi,jlo,jhi
31 real(kind=8),
intent(in) :: t
34 real(kind=8),
intent(in out) :: valbig(nvar,mx,my)
35 real(kind=8),
intent(in out) :: aux(naux,mx,my)
38 integer :: i_fine, j_fine, i_coarse, j_coarse, n, k
39 integer :: iplo, iphi, jplo, jphi
40 integer :: mx_patch, my_patch, mx_coarse, my_coarse, nghost_patch, lencrse
41 integer :: refinement_ratio_x, refinement_ratio_y
42 integer :: unset_indices(4)
43 real(kind=8) :: dx_fine, dy_fine, dx_coarse, dy_coarse
44 real(kind=8) :: xlow_coarse,ylow_coarse, xlow_fine, ylow_fine, xhi_fine,yhi_fine
47 integer :: clock_start, clock_finish, clock_rate
48 real(kind=8) :: cpu_start, cpu_finish
51 real(kind=8) :: eta1, eta2, valp10, valm10, valc, valp01, valm01, dupc, dumc
52 real(kind=8) :: ducc, du, fu, dvpc, dvmc, dvcc, dv, fv, valint
56 integer(kind=1) :: flaguse(ihi-ilo+1, jhi-jlo+1)
78 real(kind=8) :: valcrse((ihi-ilo+3) * (jhi-jlo+3) * nvar)
79 real(kind=8) :: auxcrse((ihi-ilo+3) * (jhi-jlo+3) * naux)
84 mx_patch = ihi-ilo + 1
85 my_patch = jhi-jlo + 1
87 dx_fine = hxposs(level)
88 dy_fine = hyposs(level)
95 xlow_fine = xlower + ilo * dx_fine
96 ylow_fine = ylower + jlo * dy_fine
102 call
intfil(valbig,mx,my,t,flaguse,nrowst,ncolst, ilo, &
103 ihi,jlo,jhi,level,nvar,naux)
114 call
trimbd(flaguse,mx_patch,my_patch,set,unset_indices)
124 write(outunit,*)
" error in filrecur - level 1 not set"
125 write(outunit,
'("start at row: ",i4," col ",i4)') nrowst,ncolst
126 print *,
" error in filrecur - level 1 not set"
127 print *,
" should not need more recursion "
128 print *,
" to set patch boundaries"
129 print
'("start at row: ",i4," col ",i4)', nrowst,ncolst
135 dx_coarse = hxposs(level - 1)
136 dy_coarse = hyposs(level - 1)
140 unset_indices(1) = unset_indices(1) + ilo - 1
141 unset_indices(2) = unset_indices(2) + ilo - 1
142 unset_indices(3) = unset_indices(3) + jlo - 1
143 unset_indices(4) = unset_indices(4) + jlo - 1
146 refinement_ratio_x = intratx(level - 1)
147 refinement_ratio_y = intraty(level - 1)
152 iplo = (unset_indices(1) - refinement_ratio_x + nghost * refinement_ratio_x) &
153 / refinement_ratio_x - nghost
154 iphi = (unset_indices(2) + refinement_ratio_x) / refinement_ratio_x
155 jplo = (unset_indices(3) - refinement_ratio_y + nghost * refinement_ratio_y) &
156 / refinement_ratio_y - nghost
157 jphi = (unset_indices(4) + refinement_ratio_y) / refinement_ratio_y
159 xlow_coarse = xlower + iplo * dx_coarse
160 ylow_coarse = ylower + jplo * dy_coarse
163 mx_coarse = iphi - iplo + 1
164 my_coarse = jphi - jplo + 1
167 if (mx_coarse > ihi - ilo + 3 .or. &
168 my_coarse > jhi - jlo + 3)
then
170 print *,
" did not make big enough work space in filrecur "
171 print *,
" need coarse space with mx_coarse,my_coarse ",mx_coarse,my_coarse
172 print *,
" made space for ilo,ihi,jlo,jhi ",ilo,ihi,jlo,jhi
181 lencrse = (ihi-ilo+3)*(jhi-jlo+3)*naux
182 do k = 1, lencrse, naux
183 auxcrse(k) = needs_to_be_set
185 call system_clock(clock_start, clock_rate)
186 call cpu_time(cpu_start)
187 call
setaux(nghost_patch, mx_coarse,my_coarse, &
188 xlow_coarse, ylow_coarse, &
189 dx_coarse,dy_coarse,naux,auxcrse)
190 call system_clock(clock_finish, clock_rate)
191 call cpu_time(cpu_finish)
192 timesetaux = timesetaux + clock_finish - clock_start
193 timesetauxcpu = timesetaux + cpu_finish - cpu_start
197 if ((xperdom .or. (yperdom .or. spheredom)) .and.
sticksout(iplo,iphi,jplo,jphi))
then
198 call
prefilrecur(level-1,nvar,valcrse,auxcrse,naux,t,mx_coarse,my_coarse,1,1,iplo,iphi,jplo,jphi)
200 call
filrecur(level-1,nvar,valcrse,auxcrse,naux,t,mx_coarse,my_coarse,1,1,iplo,iphi,jplo,jphi)
203 do i_fine = 1,mx_patch
204 i_coarse = 2 + (i_fine - (unset_indices(1) - ilo) - 1) / refinement_ratio_x
205 eta1 = (-0.5d0 +
real(mod(i_fine - 1, refinement_ratio_x),kind=8)) &
206 /
real(refinement_ratio_x,kind=8)
208 do j_fine = 1,my_patch
209 j_coarse = 2 + (j_fine - (unset_indices(3) - jlo) - 1) / refinement_ratio_y
210 eta2 = (-0.5d0 +
real(mod(j_fine - 1, refinement_ratio_y),kind=8)) &
211 /
real(refinement_ratio_y,kind=8)
213 if (flaguse(i_fine,j_fine) == 0)
then
220 valp01 = valcrse(
coarse_index(n,i_coarse ,j_coarse + 1))
221 valm01 = valcrse(
coarse_index(n,i_coarse ,j_coarse - 1))
225 ducc = valp10 - valm10
226 du = min(abs(dupc), abs(dumc))
227 du = min(2.d0 * du, 0.5d0 * abs(ducc))
228 fu = max(0.d0, sign(1.d0, dupc * dumc))
232 dvcc = valp01 - valm01
233 dv = min(abs(dvpc), abs(dvmc))
234 dv = min(2.d0 * dv, 0.5d0 * abs(dvcc))
235 fv = max(0.d0,sign(1.d0, dvpc * dvmc))
237 valint = valc + eta1 * du * sign(1.d0, ducc) * fu &
238 + eta2 * dv * sign(1.d0, dvcc) * fv
241 valbig(n,i_fine+nrowst-1,j_fine+ncolst-1) = valint
252 xhi_fine = xlower + (ihi + 1) * dx_fine
253 yhi_fine = ylower + (jhi + 1) * dy_fine
254 call
bc2amr(valbig,aux,mx,my,nvar,naux,dx_fine,dy_fine,level,t,xlow_fine,xhi_fine, &
255 ylow_fine,yhi_fine,xlower,ylower,xupper,yupper,xperdom,yperdom,spheredom)
261 integer,
intent(in) :: n, i, j
267 integer,
intent(in) :: iplo,iphi,jplo,jphi
268 sticksout = (iplo < 0 .or. jplo < 0 .or. &
269 iphi >= iregsz(level - 1) .or. jphi >= jregsz(level - 1))
subroutine bc2amr(val, aux, nrow, ncol, meqn, naux,
Take a grid patch with mesh widths hx,hy, of dimensions nrow by ncol, and set the values of any piece...
logical pure function sticksout(iplo, iphi, jplo, jphi)
recursive subroutine prefilrecur(level, nvar, valbig, auxbig, naux, time, mitot, mjtot, nrowst, ncolst, ilo, ihi, jlo, jhi, iglo, ighi, jglo, jghi, patchOnly)
subroutine trimbd(used, nrow, ncol, set, unset_rect)
Examine the setting status of a patch.
subroutine intfil(val, mi, mj, time, flaguse, nrowst, ncolst, ilo, ihi, jlo, jhi, level, nvar, naux, msrc)
Fill values for a patch at the specified level and location, using values from grids at level level O...
recursive subroutine filrecur(level, nvar, valbig, aux, naux, t, mitot, mjtot, nrowst, ncolst, ilo, ihi, jlo, jhi, patchOnly, msrc)
Fill a region (patch) described by:
subroutine setaux(mbc, mx, my, xlower, ylower, dx, dy, maux, aux)
integer pure function coarse_index(n, i, j)