40 subroutine prolong_2nd_stg(sCo,sFi,ixCo^Lin,ixFi^Lin,dxCo^D,xComin^D,dxFi^D,xFimin^D,ghost,fine_^Lin)
44 logical,
intent(in) :: ghost
45 integer,
intent(in) :: ixco^lin, ixfi^lin
46 double precision,
intent(in) :: dxco^
d, xcomin^
d, dxfi^
d, xfimin^
d
47 type(state),
intent(in) :: sco
48 type(state),
intent(inout) :: sfi
49 logical,
optional :: fine_^lin
51 double precision :: eta^
d, invdxco^
d
52 double precision :: bfluxco(sco%ixgs^s,nws),bfluxfi(sfi%ixgs^s,nws)
53 double precision :: slopes(sco%ixgs^s,
ndim),b_energy_change(ixg^t)
59 double precision :: sigmau(ixg^t),sigmad(ixg^t),sigma(ixg^t,1:
ndim), alpha(ixg^t,1:
ndim)
61 double precision :: f1(ixg^t),f2(ixg^t),f3(ixg^t),f4(ixg^t)
63 integer :: ixco^
l,ixfi^
l
64 integer :: idim1,idim2,ix^de,idim3,ixfis^
l,ixgs^
l,ixcos^
l,ixfisc^
l
66 integer :: hxcos^
l,jxcos^
l,ixcose^
l,ixfise^
l,hxfisc^
l,jxfisc^
l,ipxfisc^
l,ixcosc^
l,imxfisc^
l,jpxfisc^
l,jmxfisc^
l,hpxfisc^
l
67 integer :: hxfi^
l,jxfi^
l,hijxfi^
l,hjixfi^
l,hjjxfi^
l
68 integer :: iihxfi^
l,iijxfi^
l,ijhxfi^
l,ijjxfi^
l,ihixfi^
l,ijixfi^
l,ihjxfi^
l
69 integer :: jihxfi^
l,jijxfi^
l,jjhxfi^
l,jjjxfi^
l,jhixfi^
l,jjixfi^
l,jhjxfi^
l
90 {
if(
present(fine_min^din)) fine_min^
d=fine_min^din;}
91 {
if(
present(fine_max^din)) fine_max^
d=fine_max^din;}
105 ixcosmin^
d=ixcomin^
d-1;
106 ixcosmax^
d=ixcomax^
d;
108 ixfismin^
d=ixfimin^
d-1;
109 ixfismax^
d=ixfimax^
d;
112 associate(wcos=>sco%ws, wfis=>sfi%ws,wco=>sco%w, wfi=>sfi%w)
114 ixgsmin^
d=sfi%ixGsmin^
d;
115 ixgsmax^
d=sfi%ixGsmax^
d;
118 ixcosvmin^
d(idim1)=ixcomin^
d-
kr(^
d,idim1);
119 ixcosvmax^
d(idim1)=ixcomax^
d;
120 ixfisvmin^
d(idim1)=ixfimin^
d-
kr(^
d,idim1);
121 ixfisvmax^
d(idim1)=ixfimax^
d;
130 invdxco^
d=1.d0/dxco^
d;
137 ixfisemin^
d=max(1-
kr(^
d,idim1),ixfisvmin^
d(idim1)-2*(1-
kr(^
d,idim1)));
138 ixfisemax^
d=min(ixgsmax^
d,ixfisvmax^
d(idim1)+2*(1-
kr(^
d,idim1)));
141 ixcose^
l=ixcosv^
l(idim1)^ladd(1-
kr(idim1,^
d));
142 ixfise^
l=ixfisv^
l(idim1)^ladd2*(1-
kr(idim1,^
d));
145 bfluxfi(ixfise^s,idim1)=wfis(ixfise^s,idim1)*sfi%surfaceC(ixfise^s,idim1)
151 idim3=1+mod(idim1+1,3)
153 bfluxco(ixcose^s,idim1) = zero
156 ixfisc^
l=ixfise^
l+ix2*
kr(idim2,^
d);
158 ixfisc^
l=ixfisc^
l+ix3*
kr(idim3,^
d);
160 bfluxco(ixcose^s,idim1)=bfluxco(ixcose^s,idim1)+bfluxfi(ixfiscmin^
d:ixfiscmax^
d:2,idim1)
167 ixcosvmin^d(^d)=ixcosvmin^d(^d)+1
168 ixfisvmin^d(^d)=ixfisvmin^d(^d)+2
171 ixcosvmax^d(^d)=ixcosvmax^d(^d)-1
172 ixfisvmax^d(^d)=ixfisvmax^d(^d)-2
177 ixcose^l=ixcosv^l(idim1);
181 if ((.not.fine_min^d).or.(.not.ghost))
then
182 ixcosemin^d=ixcosvmin^d(idim1)-1
184 if ((.not.fine_max^d).or.(.not.ghost))
then
185 ixcosemax^d=ixcosvmax^d(idim1)+1
190 bfluxco(ixcose^s,idim1)=wcos(ixcose^s,idim1)*sco%surfaceC(ixcose^s,idim1)
197 ixcos^l=ixcosv^l(idim1);
199 if(idim1==idim2) cycle
202 jxcos^l=ixcos^l+kr(idim2,^d);
203 hxcos^l=ixcos^l-kr(idim2,^d);
204 slopes(ixcos^s,idim2)=0.125d0*(bfluxco(jxcos^s,idim1)-bfluxco(hxcos^s,idim1))
207 ixfiscmin^d=ixfisvmin^d(idim1)+ix2*kr(^d,idim2);
208 ixfiscmax^d=ixfisvmax^d(idim1)+ix2*kr(^d,idim2);
209 bfluxfi(ixfiscmin^d:ixfiscmax^d:2,idim1)=half*(bfluxco(ixcos^s,idim1)&
210 +(2*ix2-1)*slopes(ixcos^s,idim2))
217 jxcos^l=ixcos^l+kr(idim3,^d);
218 hxcos^l=ixcos^l-kr(idim3,^d);
219 slopes(ixcos^s,idim3)=0.125d0*(bfluxco(jxcos^s,idim1)-bfluxco(hxcos^s,idim1))
220 if(lvc(idim1,idim2,idim3)<1) cycle
223 {ixfiscmin^d=ixfisvmin^d(idim1)+ix2*kr(^d,idim2)+ix3*kr(^d,idim3);}
224 {ixfiscmax^d=ixfisvmax^d(idim1)+ix2*kr(^d,idim2)+ix3*kr(^d,idim3);}
225 bfluxfi(ixfiscmin^d:ixfiscmax^d:2,idim1)=quarter*bfluxco(ixcos^s,idim1)&
226 +quarter*(2*ix2-1)*slopes(ixcos^s,idim2)&
227 +quarter*(2*ix3-1)*slopes(ixcos^s,idim3)
241 if (lvc(idim1,idim2,idim3)<1) cycle
243 hxfi^l=ixfi^l-kr(idim1,^d);
244 jxfi^l=ixfi^l+kr(idim1,^d);
246 hijxfi^l=hxfi^l+kr(idim3,^d);
247 hjixfi^l=hxfi^l+kr(idim2,^d);
248 hjjxfi^l=hijxfi^l+kr(idim2,^d);
250 iihxfi^l=ixfi^l-kr(idim3,^d);
251 iijxfi^l=ixfi^l+kr(idim3,^d);
252 ihixfi^l=ixfi^l-kr(idim2,^d);
253 ihjxfi^l=ihixfi^l+kr(idim3,^d);
254 ijixfi^l=ixfi^l+kr(idim2,^d);
255 ijhxfi^l=ijixfi^l-kr(idim3,^d);
256 ijjxfi^l=ijixfi^l+kr(idim3,^d);
258 jihxfi^l=jxfi^l-kr(idim3,^d);
259 jijxfi^l=jxfi^l+kr(idim3,^d);
260 jhixfi^l=jxfi^l-kr(idim2,^d);
261 jhjxfi^l=jhixfi^l+kr(idim3,^d);
262 jjixfi^l=jxfi^l+kr(idim2,^d);
263 jjhxfi^l=jjixfi^l-kr(idim3,^d);
264 jjjxfi^l=jjixfi^l+kr(idim3,^d);
267 abs(bfluxfi(jhixfimin^d:jhixfimax^d:2,idim2))&
268 + abs(bfluxfi(jhjxfimin^d:jhjxfimax^d:2,idim2))&
269 + abs(bfluxfi(jjixfimin^d:jjixfimax^d:2,idim2))&
270 + abs(bfluxfi(jjjxfimin^d:jjjxfimax^d:2,idim2))&
271 + abs(bfluxfi(jihxfimin^d:jihxfimax^d:2,idim3))&
272 + abs(bfluxfi(jijxfimin^d:jijxfimax^d:2,idim3))&
273 + abs(bfluxfi(jjhxfimin^d:jjhxfimax^d:2,idim3))&
274 + abs(bfluxfi(jjjxfimin^d:jjjxfimax^d:2,idim3))
277 abs(bfluxfi(ihixfimin^d:ihixfimax^d:2,idim2))&
278 + abs(bfluxfi(ihjxfimin^d:ihjxfimax^d:2,idim2))&
279 + abs(bfluxfi(ijixfimin^d:ijixfimax^d:2,idim2))&
280 + abs(bfluxfi(ijjxfimin^d:ijjxfimax^d:2,idim2))&
281 + abs(bfluxfi(iihxfimin^d:iihxfimax^d:2,idim3))&
282 + abs(bfluxfi(iijxfimin^d:iijxfimax^d:2,idim3))&
283 + abs(bfluxfi(ijhxfimin^d:ijhxfimax^d:2,idim3))&
284 + abs(bfluxfi(ijjxfimin^d:ijjxfimax^d:2,idim3))
286 sigma(ixco^s,idim1)=sigmau(ixco^s)+sigmad(ixco^s)
287 where(sigma(ixco^s,idim1)/=zero)
288 sigma(ixco^s,idim1)=abs(sigmau(ixco^s)-sigmad(ixco^s))/sigma(ixco^s,idim1)
290 sigma(ixco^s,idim1)=zero
301 if (lvc(idim1,idim2,idim3)<1) cycle
307 alpha(ixco^s,idim1)=(sco%dx(ixco^s,idim2)-sco%dx(ixco^s,idim3))/(sco%dx(ixco^s,idim2)+sco%dx(ixco^s,idim3))
316 if (idim1==idim2) cycle
317 ixfiscmin^d=ixfismin^d+1;
318 ixfiscmax^d=ixfismax^d-1;
319 jxfisc^l=ixfisc^l+kr(idim1,^d);
320 hxfisc^l=ixfisc^l-kr(idim1,^d);
321 ipxfisc^l=ixfisc^l+kr(idim2,^d);
322 imxfisc^l=ixfisc^l-kr(idim2,^d);
323 jpxfisc^l=jxfisc^l+kr(idim2,^d);
324 jmxfisc^l=jxfisc^l-kr(idim2,^d);
325 hpxfisc^l=hxfisc^l+kr(idim2,^d);
327 bfluxfi(ixfiscmin^d:ixfiscmax^d:2,idim1)=&
328 half*(bfluxfi(jxfiscmin^d:jxfiscmax^d:2,idim1)&
329 +bfluxfi(hxfiscmin^d:hxfiscmax^d:2,idim1))&
330 -quarter*(bfluxfi(ipxfiscmin^d:ipxfiscmax^d:2,idim2)&
331 -bfluxfi(jpxfiscmin^d:jpxfiscmax^d:2,idim2)&
332 -bfluxfi(imxfiscmin^d:imxfiscmax^d:2,idim2)&
333 +bfluxfi(jmxfiscmin^d:jmxfiscmax^d:2,idim2))
335 bfluxfi(ipxfiscmin^d:ipxfiscmax^d:2,idim1)=&
336 half*(bfluxfi(jpxfiscmin^d:jpxfiscmax^d:2,idim1)&
337 +bfluxfi(hpxfiscmin^d:hpxfiscmax^d:2,idim1))&
338 -quarter*(bfluxfi(ipxfiscmin^d:ipxfiscmax^d:2,idim2)&
339 -bfluxfi(jpxfiscmin^d:jpxfiscmax^d:2,idim2)&
340 -bfluxfi(imxfiscmin^d:imxfiscmax^d:2,idim2)&
341 +bfluxfi(jmxfiscmin^d:jmxfiscmax^d:2,idim2))
345 if (lvc(idim1,idim2,idim3)<1) cycle
347 hxfi^l=ixfi^l-kr(idim1,^d);
348 jxfi^l=ixfi^l+kr(idim1,^d);
350 hijxfi^l=hxfi^l+kr(idim3,^d);
351 hjixfi^l=hxfi^l+kr(idim2,^d);
352 hjjxfi^l=hijxfi^l+kr(idim2,^d);
354 iihxfi^l=ixfi^l-kr(idim3,^d);
355 iijxfi^l=ixfi^l+kr(idim3,^d);
356 ihixfi^l=ixfi^l-kr(idim2,^d);
357 ihjxfi^l=ihixfi^l+kr(idim3,^d);
358 ijixfi^l=ixfi^l+kr(idim2,^d);
359 ijhxfi^l=ijixfi^l-kr(idim3,^d);
360 ijjxfi^l=ijixfi^l+kr(idim3,^d);
362 jihxfi^l=jxfi^l-kr(idim3,^d);
363 jijxfi^l=jxfi^l+kr(idim3,^d);
364 jhixfi^l=jxfi^l-kr(idim2,^d);
365 jhjxfi^l=jhixfi^l+kr(idim3,^d);
366 jjixfi^l=jxfi^l+kr(idim2,^d);
367 jjhxfi^l=jjixfi^l-kr(idim3,^d);
368 jjjxfi^l=jjixfi^l+kr(idim3,^d);
371 f1(ixco^s)=bfluxfi(ihixfimin^d:ihixfimax^d:2,idim2)&
372 -bfluxfi(jhixfimin^d:jhixfimax^d:2,idim2)&
373 -bfluxfi(ijixfimin^d:ijixfimax^d:2,idim2)&
374 +bfluxfi(jjixfimin^d:jjixfimax^d:2,idim2)
376 f2(ixco^s)=bfluxfi(ihjxfimin^d:ihjxfimax^d:2,idim2)&
377 -bfluxfi(jhjxfimin^d:jhjxfimax^d:2,idim2)&
378 -bfluxfi(ijjxfimin^d:ijjxfimax^d:2,idim2)&
379 +bfluxfi(jjjxfimin^d:jjjxfimax^d:2,idim2)
381 f3(ixco^s)=bfluxfi(iihxfimin^d:iihxfimax^d:2,idim3)&
382 -bfluxfi(jihxfimin^d:jihxfimax^d:2,idim3)&
383 -bfluxfi(iijxfimin^d:iijxfimax^d:2,idim3)&
384 +bfluxfi(jijxfimin^d:jijxfimax^d:2,idim3)
386 f4(ixco^s)=bfluxfi(ijhxfimin^d:ijhxfimax^d:2,idim3)&
387 -bfluxfi(jjhxfimin^d:jjhxfimax^d:2,idim3)&
388 -bfluxfi(ijjxfimin^d:ijjxfimax^d:2,idim3)&
389 +bfluxfi(jjjxfimin^d:jjjxfimax^d:2,idim3)
391 bfluxfi(ixfimin^d:ixfimax^d:2,idim1)=&
392 half*(bfluxfi(hxfimin^d:hxfimax^d:2,idim1)+bfluxfi(jxfimin^d:jxfimax^d:2,idim1))&
393 +6.25d-2*((3.d0+alpha(ixco^s,idim2))*f1(ixco^s)&
394 +(1.d0-alpha(ixco^s,idim2))*f2(ixco^s)&
395 +(3.d0-alpha(ixco^s,idim3))*f3(ixco^s)&
396 +(1.d0+alpha(ixco^s,idim3))*f4(ixco^s))
398 bfluxfi(ijixfimin^d:ijixfimax^d:2,idim1)=&
399 half*(bfluxfi(hjixfimin^d:hjixfimax^d:2,idim1)+bfluxfi(jjixfimin^d:jjixfimax^d:2,idim1))&
400 +6.25d-2*((3.d0+alpha(ixco^s,idim2))*f1(ixco^s)&
401 +(1.d0-alpha(ixco^s,idim2))*f2(ixco^s)&
402 +(1.d0+alpha(ixco^s,idim3))*f3(ixco^s)&
403 +(3.d0-alpha(ixco^s,idim3))*f4(ixco^s))
405 bfluxfi(iijxfimin^d:iijxfimax^d:2,idim1)=&
406 half*(bfluxfi(hijxfimin^d:hijxfimax^d:2,idim1)+bfluxfi(jijxfimin^d:jijxfimax^d:2,idim1))&
407 +6.25d-2*((1.d0-alpha(ixco^s,idim2))*f1(ixco^s)&
408 +(3.d0+alpha(ixco^s,idim2))*f2(ixco^s)&
409 +(3.d0-alpha(ixco^s,idim3))*f3(ixco^s)&
410 +(1.d0+alpha(ixco^s,idim3))*f4(ixco^s))
412 bfluxfi(ijjxfimin^d:ijjxfimax^d:2,idim1)=&
413 half*(bfluxfi(hjjxfimin^d:hjjxfimax^d:2,idim1)+bfluxfi(jjjxfimin^d:jjjxfimax^d:2,idim1))&
414 +6.25d-2*((1.d0-alpha(ixco^s,idim2))*f1(ixco^s)&
415 +(3.d0+alpha(ixco^s,idim2))*f2(ixco^s)&
416 +(1.d0+alpha(ixco^s,idim3))*f3(ixco^s)&
417 +(3.d0-alpha(ixco^s,idim3))*f4(ixco^s))
425 ixfiscmax^d=ixfimax^d;
426 ixfiscmin^d=ixfimin^d-kr(^d,idim1);
427 where(sfi%surfaceC(ixfisc^s,idim1)/=zero)
428 wfis(ixfisc^s,idim1)=bfluxfi(ixfisc^s,idim1)/sfi%surfaceC(ixfisc^s,idim1)
430 wfis(ixfisc^s,idim1)=zero
434 if(phys_total_energy.and. .not.prolongprimitive)
then
435 b_energy_change(ixfi^s)=0.5d0*sum(wfi(ixfi^s,iw_mag(:))**2,dim=ndim+1)
437 call phys_face_to_center(ixfi^l,sfi)
438 if(phys_total_energy.and. .not.prolongprimitive)
then
439 b_energy_change(ixfi^s)=0.5d0*sum(wfi(ixfi^s,iw_mag(:))**2,dim=ndim+1)-&
440 b_energy_change(ixfi^s)
441 wfi(ixfi^s,iw_e)=wfi(ixfi^s,iw_e)+b_energy_change(ixfi^s)
527 integer :: iigrid,igrid,ineighbor,ipe_neighbor
528 integer :: idims,iside,i^
d,ic^
d,inc^
d,nx^
d
529 integer :: recvsize, sendsize
542 nrecv=nrecv+nrecv_fc(^
d)
543 nsend=nsend+nsend_fc(^
d)
544 nx^
d=1^
d%nx^dd=ixmhi^dd-ixmlo^dd+1;
546 recvsize=recvsize+nrecv_fc(^
d)*isize(^
d)
547 sendsize=sendsize+nsend_fc(^
d)*isize(^
d)
554 allocate(recvbuffer(recvsize),recvstatus(mpi_status_size,nrecv), &
556 recvrequest=mpi_request_null
561 do iigrid=1,igridstail; igrid=igrids(iigrid);
571 if (ineighbor>0.and.ipe_neighbor/=
mype)
then
572 {
if (idims==^
d) iside=ic^
d\}
574 i^
d=
kr(^
d,idims)*(2*iside-3);
575 if (neighbor_pole(i^
d,igrid)/=0) cycle
578 itag=4**^nd*(igrid-1)+{inc^
d*4**(^
d-1)+}
580 call mpi_irecv(recvbuffer(ibuf_recv),isize(idims), &
581 mpi_double_precision,ipe_neighbor,itag, &
583 ibuf_recv=ibuf_recv+isize(idims)
594 allocate(sendbuffer(sendsize),sendstatus(mpi_status_size,nsend),sendrequest(nsend))
595 sendrequest=mpi_request_null
598 do iigrid=1,igridstail; igrid=igrids(iigrid);
602 i^dd=kr(^dd,^d)*(2*iside-3);
604 if (neighbor_pole(i^dd,igrid)/=0) cycle
605 if (neighbor_type(i^dd,igrid)==neighbor_coarse)
then
606 ineighbor =neighbor(1,i^dd,igrid)
607 ipe_neighbor=neighbor(2,i^dd,igrid)
608 if (refine(ineighbor,ipe_neighbor))
then
609 if (ipe_neighbor/=mype)
then
610 ic^dd=1+modulo(node(pig^dd_,igrid)-1,2);
611 inc^d=-2*i^d+ic^d^d%inc^dd=ic^dd;
612 itag=4**^nd*(ineighbor-1)+{inc^dd*4**(^dd-1)+}
614 ibuf_send_next=ibuf_send+isize(^d)
615 sendbuffer(ibuf_send:ibuf_send_next-1)=&
616 reshape(
pface(iside,^d,igrid)%face,(/isize(^d)/))
617 call mpi_isend(sendbuffer(ibuf_send),isize(^d), &
618 mpi_double_precision,ipe_neighbor,itag, &
619 icomm,sendrequest(isend),ierrmpi)
620 ibuf_send=ibuf_send_next
630 call mpi_waitall(nrecv,recvrequest,recvstatus,ierrmpi)
631 deallocate(recvstatus,recvrequest)
636 call mpi_waitall(nsend,sendrequest,sendstatus,ierrmpi)
637 deallocate(sendbuffer,sendstatus,sendrequest)