2D AMRCLAW
preicall.f
Go to the documentation of this file.
1 c
2 c --------------------------------------------------------------
3 c
4  subroutine preicall(val,aux,nrow,ncol,nvar,naux,
5  1 ilo,ihi,jlo,jhi,level,fliparray)
6 c
7  use amr_module
8  implicit double precision (a-h,o-z)
9 
10  dimension fliparray((nrow+ncol)*nghost*(nvar+naux))
11  dimension val(nvar,nrow,ncol)
12  dimension aux(naux,nrow,ncol)
13 
14  dimension ist(3), iend(3), jst(3), jend(3), ishift(3), jshift(3)
15  logical xint, yint
16 
17 c
18 c NEW INDEXING - ORDER SWITCHED
19  iadd(ivar,i,j) = locflip + ivar-1 + nvar*((j-1)*nc+i-1)
20  iaddaux(iaux,i,j) = locflipaux + iaux-1 + naux*((j-1)*nc+i-1)
21 
22 c
23 c :::::::::::::: PREICALL :::::::::::::::::::::::::::::::::::::::::::
24 c For periodic boundary conditions more work needed to initialize a
25 c new grid that sticks out. This routine was
26 c called because the patch sticks out of the domain,
27 c and has periodic bc.s preprocess the patch before calling
28 c icall to shift the patch periodically back into the domain.
29 c
30 c Inputs to this routine:
31 c ilo,ihi,jlo,jhi = the location in index space of this patch.
32 c
33 c Outputs from this routine:
34 c The values of the grid are inserted
35 c directly into the enlarged val array for this piece.
36 c
37 c :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
38 c
39 ! ## fliparray now passed in; index into it below
40  locflip = 1
41  locflipaux = 1 + nvar*(ncol+nrow)
42 c
43 c ## will divide patch into 9 possibilities (some empty):
44 c ## x sticks out left, x interior, x sticks out right
45 c ## same for y. for example, the max. would be
46 c ## i from (ilo,-1), (0,iregsz(level)-1), (iregsz(level),ihi)
47 
48  if (xperdom) then
49  ist(1) = ilo
50  ist(2) = 0
51  ist(3) = iregsz(level)
52  iend(1) = -1
53  iend(2) = iregsz(level)-1
54  iend(3) = ihi
55  ishift(1) = iregsz(level)
56  ishift(2) = 0
57  ishift(3) = -iregsz(level)
58  else ! if not periodic, set vals to only have nonnull intersection for interior regoin
59  ist(1) = iregsz(level)
60  ist(2) = ilo
61  ist(3) = iregsz(level)
62  iend(1) = -nghost
63  iend(2) = ihi
64  iend(3) = -nghost
65  ishift(1) = 0
66  ishift(2) = 0
67  ishift(3) = 0
68  endif
69 
70 
71  if (yperdom .or. spheredom) then
72  jst(1) = jlo
73  jst(2) = 0
74  jst(3) = jregsz(level)
75  jend(1) = -1
76  jend(2) = jregsz(level)-1
77  jend(3) = jhi
78  jshift(1) = jregsz(level)
79  jshift(2) = 0
80  jshift(3) = -jregsz(level)
81  else
82  jst(1) = jregsz(level)
83  jst(2) = jlo
84  jst(3) = jregsz(level)
85  jend(1) = -nghost
86  jend(2) = jhi
87  jend(3) = -nghost
88  jshift(1) = 0
89  jshift(2) = 0
90  jshift(3) = 0
91  endif
92 
93 c ## loop over the 9 regions (in 2D) of the patch - the interior is i=j=2 plus
94 c ## the ghost cell regions. If any parts stick out of domain and are periodic
95 c ## map indices periodically, but stick the values in the correct place
96 c ## in the orig grid (indicated by iputst,jputst.
97 c ## if a region sticks out of domain but is not periodic, not handled in (pre)-icall
98 c ## but in setaux/bcamr (not called from here).
99  do 20 i = 1, 3
100  i1 = max(ilo, ist(i))
101  i2 = min(ihi, iend(i))
102  if (i1 .gt. i2) go to 20 ! non-empty intersection not possible
103  do 10 j = 1, 3
104  j1 = max(jlo, jst(j))
105  j2 = min(jhi, jend(j))
106 
107  if (j1 .le. j2) then ! part of patch in this region
108 c
109 c check if special mapping needed for spherical bc.
110 c (j=2 is interior,nothing special needed)
111  if (.not. spheredom .or. j .eq. 2) then
112  iputst = i1 - ilo + 1
113  jputst = j1 - jlo + 1
114  call icall(val,aux,nrow,ncol,nvar,naux,
115  1 i1+ishift(i),i2+ishift(i),
116  2 j1+jshift(j),j2+jshift(j),level,
117  3 iputst,jputst)
118  else
119  nr = i2 - i1 + 1
120  nc = j2 - j1 + 1
121  ng = 0 ! no ghost cells in this little patch. fill everything.
122 
123  jbump = 0
124  if (j1 < 0) jbump = abs(j1) ! bump up so new bottom is 0
125  if (j2 >= jregsz(level)) jbump = -(j2+1-jregsz(level)) ! bump down
126 
127 c next 2 lines would take care of periodicity in x
128  iwrap1 = i1 + ishift(i)
129  iwrap2 = i2 + ishift(i)
130 c next 2 lines take care of mapped sphere bcs
131  iwrap1 = iregsz(level) - iwrap1 -1
132  iwrap2 = iregsz(level) - iwrap2 -1
133 c swap so that smaller one is left index, etc since mapping reflects
134  tmp = iwrap1
135  iwrap1 = iwrap2
136  iwrap2 = tmp
137 
138  jwrap1 = j1 + jbump
139  xlwrap = xlower + iwrap1*hxposs(level)
140  ybwrap = ylower + jwrap1*hyposs(level)
141  jwrap2 = j2 + jbump
142 
143  if (naux>0) then
144 ! fliparray(locflipaux:locflipaux+naux*(ncol+nrow)-1) =
145  iflipchunksize = naux*nc*nr - 1 + nvar*(ncol+nrow)
146  idimen = (nrow+ncol)*nghost*(nvar+naux)
147  if (iflipchunksize .gt. idimen) then
148  write(*,*) "Error in fliparray size: asking for ",
149  . iflipchunksize," but dimension is",idimen
150  stop
151  endif
152  fliparray(locflipaux:locflipaux+naux*nc*nr - 1) =
153  1 needs_to_be_set
154  call setaux(ng,nr,nc,xlwrap,ybwrap,
155  1 hxposs(level),hyposs(level),naux,
156  2 fliparray(locflipaux))
157  endif
158 
159 c write(dbugunit,101) i1,i2,j1,j2
160 c write(dbugunit6,102) iwrap1,iwrap2,j1+jbump,j2+jbump
161  101 format(" actual patch from i:",2i5," j :",2i5)
162  102 format(" icall called w i:",2i5," j :",2i5)
163  call icall(fliparray(locflip),fliparray(locflipaux),
164  1 nr,nc,nvar, naux,iwrap1,iwrap2,jwrap1,jwrap2,
165  2 level,1,1)
166 
167 c copy back using weird mapping for spherical folding
168  nrowst = 1 ! start filling up val at (1,1) - no additional offset
169  ncolst = 1
170  do 15 ii = i1, i2
171  do 15 jj = j1, j2
172 c write(dbugunit6,100)nrowst+ii-ilo,ncolst+jj-jlo,nr-(ii-i1),
173 c 1 nc-jj+j1
174  100 format(" filling loc ",2i5," with ",2i5)
175 
176  do 17 ivar = 1, nvar
177  val(ivar,nrowst+(ii-ilo),ncolst+(jj-jlo)) =
178  1 fliparray(iadd(ivar,nr-(ii-i1),nc-(jj-j1)))
179  17 continue
180 
181  do 16 iaux = 1, naux
182  aux(iaux,nrowst+(ii-ilo),ncolst+(jj-jlo)) =
183  1 fliparray(iaddaux(iaux,nr-(ii-i1),nc-(jj-j1)))
184  16 continue
185  15 continue
186 
187  endif
188 
189  endif
190 
191 
192  10 continue
193  20 continue
194 
195 
196  return
197  end
integer pure function iadd(ivar, i, j)
Definition: intfil.f90:293
subroutine icall(val, aux, nrow, ncol, nvar, naux, ilo, ihi, jlo, jhi, level, iputst, jputst)
Definition: icall.f:4
subroutine preicall(val, aux, nrow, ncol, nvar, naux, ilo, ihi, jlo, jhi, level, fliparray)
Definition: preicall.f:4
subroutine setaux(mbc, mx, my, xlower, ylower, dx, dy, maux, aux)
Definition: setaux.f90:1