68 integer,
intent(in) :: igrid
70 double precision ::
dx^
d, summeddx, sizeuniformpart^
d
72 double precision :: delx_ext(ixglo1-1:ixghi1+1)
73 double precision :: exp_factor_ext(ixglo1-1:ixghi1+1),del_exp_factor_ext(ixglo1-1:ixghi1+1),exp_factor_primitive_ext(ixglo1-1:ixghi1+1)
74 double precision :: xc(ixglo1:ixghi1),delxc(ixglo1:ixghi1)
75 double precision :: exp_factor_coarse(ixglo1:ixghi1),del_exp_factor_coarse(ixglo1:ixghi1),exp_factor_primitive_coarse(ixglo1:ixghi1)
76 integer :: level, ig^
d, ign^
d, ixcog^
l, ix, i^
d
77 integer :: imin, imax, index, igco^
d, ixshift, offset, ifirst
78 integer :: icase, ixgext^
l
92 ixgext^
l=ixg^
ll^ladd1;
100 if(.not.
allocated(ps(igrid)%w))
then
105 call alloc_state_coarse(igrid, psc(igrid), ixcog^
l, ixcog^
l)
126 ps(igrid)%level=level
127 psc(igrid)%level=level-1
128 if(
phys_trac) ps(igrid)%special_values=0.d0
130 ps1(igrid)%level=level
133 ps2(igrid)%level=level
135 ps2(igrid)%level=level
136 ps3(igrid)%level=level
138 ps2(igrid)%level=level
139 ps3(igrid)%level=level
140 ps4(igrid)%level=level
167 {
do ix=ixmhi^d-nghostcells+1,ixghi^d
168 ps(igrid)%x(ix^d%ixG^t,^d)=rnode(rpxmax^d_,igrid)+(dble(ix-ixmhi^d)-half)*dx^d
171 ^d&dx^d=2.0d0*rnode(rpdx^d_,igrid)\
172 {
do ix=ixcogmin^d,ixcogmax^d
173 psc(igrid)%x(ix^d%ixCoG^s,^d)=rnode(rpxmin^d_,igrid)+(dble(ix-nghostcells)-half)*dx^d
176 ^d&ps(igrid)%dx(ixgext^s,^d)=rnode(rpdx^d_,igrid);
177 ^d&psc(igrid)%dx(ixcog^s,^d)=2.0d0*rnode(rpdx^d_,igrid);
178 ^d&dx^d=rnode(rpdx^d_,igrid)\
179 {
do ix=ixgextmin^d,ixgextmax^d
180 xext(ix^d%ixGext^s,^d)=rnode(rpxmin^d_,igrid)+(dble(ix-nghostcells)-half)*dx^d
183 if(any(stretched_dim))
then
184 {
if(stretch_type(^d) == stretch_uni)
then
185 imin=(ig^d-1)*block_nx^d
187 rnode(rpxmin^d_,igrid)=xprobmin^d+dxfirst_1mq(level,^d) &
188 *(1.0d0-qstretch(level,^d)**imin)
189 rnode(rpxmax^d_,igrid)=xprobmin^d+dxfirst_1mq(level,^d) &
190 *(1.0d0-qstretch(level,^d)**imax)
192 if(rnode(rpxmax^d_,igrid)>xprobmax^d) rnode(rpxmax^d_,igrid)=xprobmax^d
193 ixshift=(ig^d-1)*block_nx^d-nghostcells
194 do ix=ixgextmin^d,ixgextmax^d
196 ps(igrid)%dx(ix^d%ixGext^s,^d)=dxfirst(level,^d)*qstretch(level,^d)**(index-1)
199 ixshift=igco^d*block_nx^d+(1-modulo(ig^d,2))*block_nx^d/2-nghostcells
200 do ix=ixcogmin^d,ixcogmax^d
202 psc(igrid)%dx(ix^d%ixCoG^s,^d)=dxfirst(level-1,^d)*qstretch(level-1,^d)**(index-1)
203 psc(igrid)%x(ix^d%ixCoG^s,^d)=xprobmin^d+dxfirst_1mq(level-1,^d)&
204 *(1.0d0-qstretch(level-1,^d)**(index-1))&
205 + 0.5d0*dxfirst(level-1,^d)*qstretch(level-1,^d)**(index-1)
211 do ix=ixmlo^d,ixmhi^d
212 ps(igrid)%x(ix^d%ixG^t,^d)=rnode(rpxmin^d_,igrid)+summeddx+0.5d0*ps(igrid)%dx(ix^d%ixG^t,^d)
213 summeddx=summeddx+ps(igrid)%dx(ix^d%ifirst,^d)
217 do ix=nghostcells,1,-1
218 ps(igrid)%x(ix^d%ixG^t,^d)=rnode(rpxmin^d_,igrid)-summeddx-0.5d0*ps(igrid)%dx(ix^d%ixG^t,^d)
219 summeddx=summeddx+ps(igrid)%dx(ix^d%ifirst,^d)
223 do ix=ixghi^d-nghostcells+1,ixghi^d
224 ps(igrid)%x(ix^d%ixG^t,^d)=rnode(rpxmax^d_,igrid)+summeddx+0.5d0*ps(igrid)%dx(ix^d%ixG^t,^d)
225 summeddx=summeddx+ps(igrid)%dx(ix^d%ifirst,^d)
230 xext(ixgext^s,^d)=ps(igrid)%x(ixgext^s,^d)
234 do ix=ixmlo^d,ixmhi^d
235 xext(ix^d%ixGext^s,^d)=rnode(rpxmin^d_,igrid)+summeddx+0.5d0*ps(igrid)%dx(ix^d%ixGext^s,^d)
236 summeddx=summeddx+ps(igrid)%dx(ix^d%ifirst,^d)
240 do ix=nghostcells,ixgextmin^d,-1
241 xext(ix^d%ixGext^s,^d)=rnode(rpxmin^d_,igrid)-summeddx-0.5d0*ps(igrid)%dx(ix^d%ixGext^s,^d)
242 summeddx=summeddx+ps(igrid)%dx(ix^d%ifirst,^d)
246 do ix=ixghi^d-nghostcells+1,ixgextmax^d
247 xext(ix^d%ixGext^s,^d)=rnode(rpxmax^d_,igrid)+summeddx+0.5d0*ps(igrid)%dx(ix^d%ixGext^s,^d)
248 summeddx=summeddx+ps(igrid)%dx(ix^d%ifirst,^d)
251 call mpistop(
"no such case")
254 {
if(stretch_type(^d) == stretch_symm)
then
260 if(ig^d<=nstretchedblocks(level,^d)/2)
then
262 offset=block_nx^d*nstretchedblocks(level,^d)/2
263 imin=(ig^d-1)*block_nx^d
265 rnode(rpxmin^d_,igrid)=xprobmin^d+xstretch^d-dxfirst_1mq(level,^d) &
266 *(1.0d0-qstretch(level,^d)**(offset-imin))
267 rnode(rpxmax^d_,igrid)=xprobmin^d+xstretch^d-dxfirst_1mq(level,^d) &
268 *(1.0d0-qstretch(level,^d)**(offset-imax))
270 if(rnode(rpxmin^d_,igrid)<xprobmin^d) rnode(rpxmin^d_,igrid)=xprobmin^d
271 ixshift=(ig^d-1)*block_nx^d-nghostcells
272 do ix=ixgextmin^d,ixgextmax^d
274 ps(igrid)%dx(ix^d%ixGext^s,^d)=dxfirst(level,^d)*qstretch(level,^d)**(offset-index)
276 ixshift=(nstretchedblocks(level,^d)/2-ig^d)*(block_nx^d/2)+block_nx^d/2+nghostcells
277 do ix=ixcogmin^d,ixcogmax^d
279 psc(igrid)%dx(ix^d%ixCoG^s,^d)=dxfirst(level-1,^d)*qstretch(level-1,^d)**index
282 if(ig^d==nstretchedblocks(level,^d)/2)
then
283 if(ng^d(level)==nstretchedblocks(level,^d))
then
285 do ix=ixghi^d-nghostcells+1,ixgextmax^d
286 ps(igrid)%dx(ix^d%ixGext^s,^d)= &
287 ps(igrid)%dx(2*(ixghi^d-nghostcells)+1-ix^d%ixGext^s,^d)
289 do ix=ixcogmax^d-nghostcells+1,ixcogmax^d
290 psc(igrid)%dx(ix^d%ixCoG^s,^d)= &
291 psc(igrid)%dx(2*(ixcogmax^d-nghostcells)+1-ix^d%ixCoG^s,^d)
295 do ix=ixghi^d-nghostcells+1,ixgextmax^d
296 ps(igrid)%dx(ix^d%ixGext^s,^d)=dxmid(level,^d)
298 do ix=ixcogmax^d-nghostcells+1,ixcogmax^d
299 psc(igrid)%dx(ix^d%ixCoG^s,^d)=dxmid(level-1,^d)
305 do ix=ixgextmin^d,nghostcells
306 ps(igrid)%dx(ix^d%ixGext^s,^d)=ps(igrid)%dx(2*nghostcells+1-ix^d%ixGext^s,^d)
309 psc(igrid)%dx(ix^d%ixCoG^s,^d)=psc(igrid)%dx(2*nghostcells+1-ix^d%ixCoG^s,^d)
313 if(ig^d<=ng^d(level)-nstretchedblocks(level,^d)/2)
then
315 ps(igrid)%dx(ixgext^s,^d)=dxmid(level,^d)
316 psc(igrid)%dx(ixcog^s,^d)=dxmid(level-1,^d)
317 rnode(rpxmin^d_,igrid)=xprobmin^d+xstretch^d+(ig^d-nstretchedblocks(level,^d)/2-1)*block_nx^d*dxmid(level,^d)
318 rnode(rpxmax^d_,igrid)=xprobmin^d+xstretch^d+(ig^d-nstretchedblocks(level,^d)/2) *block_nx^d*dxmid(level,^d)
320 if(ig^d==nstretchedblocks(level,^d)/2+1)
then
321 do ix=ixgextmin^d,nghostcells
322 ps(igrid)%dx(ix^d%ixGext^s,^d)=dxfirst(level,^d)*qstretch(level,^d)**(nghostcells-ix)
325 psc(igrid)%dx(ix^d%ixCoG^s,^d)=dxfirst(level-1,^d)*qstretch(level-1,^d)**(nghostcells-ix)
328 if(ig^d==ng^d(level)-nstretchedblocks(level,^d))
then
329 do ix=ixghi^d-nghostcells+1,ixgextmax^d
330 ps(igrid)%dx(ix^d%ixGext^s,^d)=dxfirst(level,^d)*qstretch(level,^d)**(ix-block_nx^d-nghostcells-1)
332 do ix=ixcogmax^d-nghostcells+1,ixcogmax^d
333 psc(igrid)%dx(ix^d%ixCoG^s,^d)=dxfirst(level-1,^d)*qstretch(level-1,^d)**(ix-ixcogmax^d+nghostcells-1)
338 offset=block_nx^d*(ng^d(level)-nstretchedblocks(level,^d)/2)
339 sizeuniformpart^d=dxmid(1,^d)*(domain_nx^d-nstretchedblocks_baselevel(^d)*block_nx^d)
340 imin=(ig^d-1)*block_nx^d-offset
341 imax=ig^d*block_nx^d-offset
342 rnode(rpxmin^d_,igrid)=xprobmin^d+xstretch^d+sizeuniformpart^d+dxfirst_1mq(level,^d) &
343 *(1.0d0-qstretch(level,^d)**imin)
344 rnode(rpxmax^d_,igrid)=xprobmin^d+xstretch^d+sizeuniformpart^d+dxfirst_1mq(level,^d) &
345 *(1.0d0-qstretch(level,^d)**imax)
347 if(rnode(rpxmax^d_,igrid)>xprobmax^d) rnode(rpxmax^d_,igrid)=xprobmax^d
348 ixshift=(ig^d-1)*block_nx^d-nghostcells-offset
349 do ix=ixgextmin^d,ixgextmax^d
351 ps(igrid)%dx(ix^d%ixGext^s,^d)=dxfirst(level,^d)*qstretch(level,^d)**(index-1)
353 ixshift=(ig^d+nstretchedblocks(level,^d)/2-ng^d(level)-1)*(block_nx^d/2)-nghostcells
354 do ix=ixcogmin^d,ixcogmax^d
356 psc(igrid)%dx(ix^d%ixCoG^s,^d)=dxfirst(level-1,^d)*qstretch(level-1,^d)**(index-1)
359 if(ig^d==ng^d(level)-nstretchedblocks(level,^d)+1)
then
360 if(ng^d(level)==nstretchedblocks(level,^d))
then
362 do ix=ixgextmin^d,nghostcells
363 ps(igrid)%dx(ix^d%ixGext^s,^d)=ps(igrid)%dx(2*nghostcells+1-ix^d%ixGext^s,^d)
366 psc(igrid)%dx(ix^d%ixCoG^s,^d)=psc(igrid)%dx(2*nghostcells+1-ix^d%ixCoG^s,^d)
370 do ix=ixgextmin^d,nghostcells
371 ps(igrid)%dx(ix^d%ixGext^s,^d)=dxmid(level,^d)
374 psc(igrid)%dx(ix^d%ixCoG^s,^d)=dxmid(level-1,^d)
379 if(ig^d==ng^d(level))
then
380 do ix=ixghi^d-nghostcells+1,ixgextmax^d
381 ps(igrid)%dx(ix^d%ixGext^s,^d)=ps(igrid)%dx(2*(ixghi^d-nghostcells)+1-ix^d%ixGext^s,^d)
383 do ix=ixcogmax^d-nghostcells+1,ixcogmax^d
384 psc(igrid)%dx(ix^d%ixCoG^s,^d)=psc(igrid)%dx(2*(ixcogmax^d-nghostcells)+1-ix^d%ixCoG^s,^d)
393 do ix=ixmlo^d,ixmhi^d
394 ps(igrid)%x(ix^d%ixG^t,^d)=rnode(rpxmin^d_,igrid)+summeddx+0.5d0*ps(igrid)%dx(ix^d%ixG^t,^d)
395 summeddx=summeddx+ps(igrid)%dx(ix^d%ifirst,^d)
399 do ix=nghostcells,1,-1
400 ps(igrid)%x(ix^d%ixG^t,^d)=rnode(rpxmin^d_,igrid)-summeddx-0.5d0*ps(igrid)%dx(ix^d%ixG^t,^d)
401 summeddx=summeddx+ps(igrid)%dx(ix^d%ifirst,^d)
405 do ix=ixghi^d-nghostcells+1,ixghi^d
406 ps(igrid)%x(ix^d%ixG^t,^d)=rnode(rpxmax^d_,igrid)+summeddx+0.5d0*ps(igrid)%dx(ix^d%ixG^t,^d)
407 summeddx=summeddx+ps(igrid)%dx(ix^d%ifirst,^d)
412 do ix=nghostcells+1,ixcogmax^d-nghostcells
413 psc(igrid)%x(ix^d%ixCoG^s,^d)=rnode(rpxmin^d_,igrid)+summeddx+0.5d0*psc(igrid)%dx(ix^d%ixCoG^s,^d)
414 summeddx=summeddx+psc(igrid)%dx(ix^d%ifirst,^d)
418 do ix=nghostcells,1,-1
419 psc(igrid)%x(ix^d%ixCoG^s,^d)=rnode(rpxmin^d_,igrid)-summeddx-0.5d0*psc(igrid)%dx(ix^d%ixCoG^s,^d)
420 summeddx=summeddx+psc(igrid)%dx(ix^d%ifirst,^d)
424 do ix=ixcogmax^d-nghostcells+1,ixcogmax^d
425 psc(igrid)%x(ix^d%ixCoG^s,^d)=rnode(rpxmax^d_,igrid)+summeddx+0.5d0*psc(igrid)%dx(ix^d%ixCoG^s,^d)
426 summeddx=summeddx+psc(igrid)%dx(ix^d%ifirst,^d)
431 xext(ixgext^s,^d)=ps(igrid)%x(ixgext^s,^d)
435 do ix=ixmlo^d,ixmhi^d
436 xext(ix^d%ixGext^s,^d)=rnode(rpxmin^d_,igrid)+summeddx+0.5d0*ps(igrid)%dx(ix^d%ixGext^s,^d)
437 summeddx=summeddx+ps(igrid)%dx(ix^d%ifirst,^d)
441 do ix=nghostcells,ixgextmin^d,-1
442 xext(ix^d%ixGext^s,^d)=rnode(rpxmin^d_,igrid)-summeddx-0.5d0*ps(igrid)%dx(ix^d%ixGext^s,^d)
443 summeddx=summeddx+ps(igrid)%dx(ix^d%ifirst,^d)
447 do ix=ixghi^d-nghostcells+1,ixgextmax^d
448 xext(ix^d%ixGext^s,^d)=rnode(rpxmax^d_,igrid)+summeddx+0.5d0*ps(igrid)%dx(ix^d%ixGext^s,^d)
449 summeddx=summeddx+ps(igrid)%dx(ix^d%ifirst,^d)
452 call mpistop(
"no such case")
458 call get_surface_area(ps(igrid),ixg^ll)
460 call get_surface_area(psc(igrid),ixcog^l)
463 select case (coordinate)
465 ps(igrid)%dvolume(ixgext^s)= {^d&rnode(rpdx^d_,igrid)|*}
466 ps(igrid)%ds(ixgext^s,1:ndim)=ps(igrid)%dx(ixgext^s,1:ndim)
467 ps(igrid)%dsC(ixgext^s,1:ndim)=ps(igrid)%dx(ixgext^s,1:ndim)
468 psc(igrid)%dvolume(ixcog^s)= {^d&2.d0*rnode(rpdx^d_,igrid)|*}
469 psc(igrid)%ds(ixcog^s,1:ndim)=psc(igrid)%dx(ixcog^s,1:ndim)
470 case (cartesian_stretched)
471 ps(igrid)%dvolume(ixgext^s)= {^d&ps(igrid)%dx(ixgext^s,^d)|*}
472 ps(igrid)%ds(ixgext^s,1:ndim)=ps(igrid)%dx(ixgext^s,1:ndim)
473 ps(igrid)%dsC(ixgext^s,1:ndim)=ps(igrid)%dx(ixgext^s,1:ndim)
474 psc(igrid)%dvolume(ixcog^s)= {^d&psc(igrid)%dx(ixcog^s,^d)|*}
475 psc(igrid)%ds(ixcog^s,1:ndim)=psc(igrid)%dx(ixcog^s,1:ndim)
476 case (cartesian_expansion)
478 delx_ext(ixgext^s) = ps(igrid)%dx(ixgext^s,1)
479 if(
associated(usr_set_surface))
call usr_set_surface(ixgext^l,xext(ixgext^s,1),delx_ext(ixgext^s),exp_factor_ext(ixgext^s),del_exp_factor_ext(ixgext^s),exp_factor_primitive_ext(ixgext^s))
480 ps(igrid)%dvolume(ixgext^s)= exp_factor_primitive_ext(ixgext^s)
481 ps(igrid)%ds(ixgext^s,1)=ps(igrid)%dx(ixgext^s,1)
482 ps(igrid)%dsC(ixgext^s,1)=ps(igrid)%dx(ixgext^s,1)
483 xc(ixcog^s) = psc(igrid)%x(ixcog^s,1)
484 delxc(ixcog^s) = psc(igrid)%dx(ixcog^s,1)
485 if(
associated(usr_set_surface))
call usr_set_surface(ixcog^l,xc(ixcog^s),delxc(ixcog^s),exp_factor_coarse(ixcog^s),del_exp_factor_coarse(ixcog^s),exp_factor_primitive_coarse(ixcog^s))
486 psc(igrid)%dvolume(ixcog^s)= exp_factor_primitive_coarse(ixcog^s)
487 psc(igrid)%ds(ixcog^s,1)=psc(igrid)%dx(ixcog^s,1)
490 ps(igrid)%dvolume(ixgext^s)=(xext(ixgext^s,1)**2 &
491 +ps(igrid)%dx(ixgext^s,1)**2/12.0d0)*&
492 ps(igrid)%dx(ixgext^s,1){^nooned &
493 *two*dabs(dsin(xext(ixgext^s,2))) &
494 *dsin(half*ps(igrid)%dx(ixgext^s,2))}{^ifthreed*ps(igrid)%dx(ixgext^s,3)}
495 psc(igrid)%dvolume(ixcog^s)=(psc(igrid)%x(ixcog^s,1)**2 &
496 +psc(igrid)%dx(ixcog^s,1)**2/12.0d0)*&
497 psc(igrid)%dx(ixcog^s,1){^nooned &
498 *two*dabs(dsin(psc(igrid)%x(ixcog^s,2))) &
499 *dsin(half*psc(igrid)%dx(ixcog^s,2))}{^ifthreed*psc(igrid)%dx(ixcog^s,3)}
500 ps(igrid)%ds(ixgext^s,1)=ps(igrid)%dx(ixgext^s,1)
501 {^nooned ps(igrid)%ds(ixgext^s,2)=xext(ixgext^s,1)*ps(igrid)%dx(ixgext^s,2)}
502 {^ifthreed ps(igrid)%ds(ixgext^s,3)=xext(ixgext^s,1)*dsin(xext(ixgext^s,2))*&
503 ps(igrid)%dx(ixgext^s,3)}
504 ps(igrid)%dsC(ixgext^s,1)=ps(igrid)%dx(ixgext^s,1)
505 {^nooned ps(igrid)%dsC(ixgext^s,2)=(xext(ixgext^s,1)+half*ps(igrid)%dx(ixgext^s,1))*&
506 ps(igrid)%dx(ixgext^s,2)
508 ps(igrid)%dsC(ixgext^s,3)=(xext(ixgext^s,1)+half*ps(igrid)%dx(ixgext^s,1))*&
509 dsin(xext(ixgext^s,2)+half*ps(igrid)%dx(ixgext^s,2))
512 {^ifthreed ps(igrid)%dsC(ixgext^s,3)=(xext(ixgext^s,1)+half*ps(igrid)%dx(ixgext^s,1))*&
513 dsin(xext(ixgext^s,2)+half*ps(igrid)%dx(ixgext^s,2))*&
514 ps(igrid)%dx(ixgext^s,3)}
516 ps(igrid)%dvolume(ixgext^s)=dabs(xext(ixgext^s,1)) &
517 *ps(igrid)%dx(ixgext^s,1){^de&*ps(igrid)%dx(ixgext^s,^de) }
518 psc(igrid)%dvolume(ixcog^s)=dabs(psc(igrid)%x(ixcog^s,1)) &
519 *psc(igrid)%dx(ixcog^s,1){^de&*psc(igrid)%dx(ixcog^s,^de) }
520 ps(igrid)%ds(ixgext^s,r_)=ps(igrid)%dx(ixgext^s,r_)
521 ps(igrid)%dsC(ixgext^s,r_)=ps(igrid)%dx(ixgext^s,r_)
522 if(z_>0.and.z_<=ndim)
then
523 ps(igrid)%ds(ixgext^s,z_)=ps(igrid)%dx(ixgext^s,z_)
524 ps(igrid)%dsC(ixgext^s,z_)=ps(igrid)%dx(ixgext^s,z_)
525 if(phi_>z_.and.ndir>ndim)
then
526 ps(igrid)%dsC(ixgext^s,phi_)=xext(ixgext^s,1)+half*ps(igrid)%dx(ixgext^s,1)
529 if(phi_>0.and.phi_<=ndim)
then
530 ps(igrid)%ds(ixgext^s,phi_)=xext(ixgext^s,1)*ps(igrid)%dx(ixgext^s,phi_)
531 ps(igrid)%dsC(ixgext^s,phi_)=(xext(ixgext^s,1)+&
532 half*ps(igrid)%dx(ixgext^s,1))*ps(igrid)%dx(ixgext^s,phi_)
533 if(z_>phi_.and.ndir>ndim) ps(igrid)%dsC(ixgext^s,z_)=1.d0
536 call mpistop(
"Sorry, coordinate unknown")
540 if (b0field)
call set_b0_grid(igrid)
541 if (number_equi_vars>0)
call phys_set_equi_vars(igrid)
544 ps(igrid)%is_physical_boundary=.false.
551 if (periodb(^d)) ign^d=1+modulo(ign^d-1,ng^d(level))
552 if (ign^d > ng^d(level))
then
553 if(phi_ > 0 .and. poleb(2,^d))
then
555 ps(igrid)%is_physical_boundary(2*^d)=.false.
557 ps(igrid)%is_physical_boundary(2*^d)=.true.
559 else if (ign^d < 1)
then
560 if(phi_ > 0 .and. poleb(1,^d))
then
562 ps(igrid)%is_physical_boundary(2*^d-1)=.false.
564 ps(igrid)%is_physical_boundary(2*^d-1)=.true.
569 if(any(ps(igrid)%is_physical_boundary))
then
570 phyboundblock(igrid)=.true.
572 phyboundblock(igrid)=.false.