68 const PetscInt les = simCtx->
les;
69 const PetscInt rans = simCtx->
rans;
70 const PetscInt ti = simCtx->
step;
71 const PetscReal U_bc = simCtx->
U_bc;
74 DM da = user->
da, fda = user->
fda;
75 DMDALocalInfo info = user->
info;
76 PetscInt xs = info.xs, xe = info.xs + info.xm;
77 PetscInt ys = info.ys, ye = info.ys + info.ym;
78 PetscInt zs = info.zs, ze = info.zs + info.zm;
79 PetscInt mx = info.mx, my = info.my, mz = info.mz;
82 PetscInt lxs, lxe, lys, lye, lzs, lze;
84 Cmpnts ***ubcs, ***ucat,***lucat, ***csi, ***eta, ***zet,***cent;
87 PetscReal Un, nx,ny,nz,A;
93 PetscInt gxs, gxe, gys, gye, gzs, gze;
95 gxs = info.gxs; gxe = gxs + info.gxm;
96 gys = info.gys; gye = gys + info.gym;
97 gzs = info.gzs; gze = gzs + info.gzm;
99 if (xs==0) lxs = xs+1;
100 if (ys==0) lys = ys+1;
101 if (zs==0) lzs = zs+1;
103 if (xe==mx) lxe = xe-1;
104 if (ye==my) lye = ye-1;
105 if (ze==mz) lze = ze-1;
107 DMDAVecGetArray(fda, user->
lCsi, &csi);
108 DMDAVecGetArray(fda, user->
lEta, &eta);
109 DMDAVecGetArray(fda, user->
lZet, &zet);
116 PetscReal ***ustar, ***aj, ***nvert;
117 DMDAVecGetArray(fda, user->
Ucat, &ucat);
118 DMDAVecGetArray(da, user->
lUstar, &ustar);
119 DMDAVecGetArray(da, user->
lAj, &aj);
120 DMDAVecGetArray(da, user->
lNvert, &nvert);
124 for (k=lzs; k<lze; k++)
125 for (j=lys; j<lye; j++)
126 for (i=lxs; i<lxe; i++) {
127 if( nvert[k][j][i]<1.1 && ( (user->
bctype[0]==-1 && i==1) || (user->
bctype[1]==-1 && i==mx-2) ) ) {
128 double area = sqrt( csi[k][j][i].x*csi[k][j][i].x + csi[k][j][i].y*csi[k][j][i].y + csi[k][j][i].z*csi[k][j][i].z );
130 double ni[3], nj[3], nk[3];
133 Ua.
x = Ua.
y = Ua.
z = 0;
134 sb = 0.5/aj[k][j][i]/area;
137 sc = 2*sb + 0.5/aj[k][j][i+1]/area;
138 Uc = ucat[k][j][i+1];
141 sc = 2*sb + 0.5/aj[k][j][i-1]/area;
142 Uc = ucat[k][j][i-1];
146 if(i==mx-2) ni[0]*=-1, ni[1]*=-1, ni[2]*=-1;
149 wall_function (user, sc, sb, Ua, Uc, &ucat[k][j][i], &ustar[k][j][i], ni[0], ni[1], ni[2]);
154 if( nvert[k][j][i]<1.1 && ( (user->
bctype[2]==-1 && j==1) || (user->
bctype[3]==-1 && j==my-2) ) ) {
155 double area = sqrt( eta[k][j][i].x*eta[k][j][i].x + eta[k][j][i].y*eta[k][j][i].y + eta[k][j][i].z*eta[k][j][i].z );
157 double ni[3], nj[3], nk[3];
160 Ua.
x = Ua.
y = Ua.
z = 0;
161 sb = 0.5/aj[k][j][i]/area;
164 sc = 2*sb + 0.5/aj[k][j+1][i]/area;
165 Uc = ucat[k][j+1][i];
168 sc = 2*sb + 0.5/aj[k][j-1][i]/area;
169 Uc = ucat[k][j-1][i];
175 wall_function (user, sc, sb, Ua, Uc, &ucat[k][j][i], &ustar[k][j][i], nj[0], nj[1], nj[2]);
181 DMDAVecRestoreArray(da, user->
lAj, &aj);
182 DMDAVecRestoreArray(da, user->
lNvert, &nvert);
183 DMDAVecRestoreArray(da, user->
lUstar, &ustar);
184 DMDAVecRestoreArray(fda, user->
Ucat, &ucat);
186 DMGlobalToLocalBegin(fda, user->
Ucat, INSERT_VALUES, user->
lUcat);
187 DMGlobalToLocalEnd(fda, user->
Ucat, INSERT_VALUES, user->
lUcat);
197 DMDAVecGetArray(fda, user->
Bcs.
Ubcs, &ubcs);
198 DMDAVecGetArray(fda, user->
Ucat, &ucat);
205 for (j=lys; j<lye; j++) {
206 for (i=lxs; i<lxe; i++) {
207 ubcs[k][j][i].
x = 0.;
208 ubcs[k][j][i].
y = 1.;
209 ubcs[k][j][i].
z = 0.;
217 if (user->
bctype[3]==12) {
222 for (k=lzs; k<lze; k++) {
223 for (i=lxs; i<lxe; i++) {
224 ubcs[k][j][i].
x = 0.;
225 ubcs[k][j][i].
y = 0.;
226 ubcs[k][j][i].
z = 1.;
236 if (user->
bctype[2]==11) {
237 DMDAVecGetArray(fda, user->
Cent, ¢);
240 for (k=lzs; k<lze; k++) {
241 for (i=lxs; i<lxe; i++) {
242 ubcs[k][j][i].
x =cent[k][j+1][i].
y/sqrt(cent[k][j+1][i].x*cent[k][j+1][i].x+cent[k][j+1][i].y*cent[k][j+1][i].y);;
244 ubcs[k][j][i].
y =-cent[k][j+1][i].
x/sqrt(cent[k][j+1][i].x*cent[k][j+1][i].x+cent[k][j+1][i].y*cent[k][j+1][i].y);
246 ubcs[k][j][i].
z = 0.0;
251 DMDAVecRestoreArray(fda, user->
Cent, ¢);
262 for (k=lzs; k<lze; k++) {
263 for (j=lys; j<lye; j++) {
264 A=sqrt(csi[k][j][i].z*csi[k][j][i].z +
265 csi[k][j][i].y*csi[k][j][i].y +
266 csi[k][j][i].x*csi[k][j][i].x);
270 Un=ucat[k][j][i+1].
x*nx+ucat[k][j][i+1].
y*ny+ucat[k][j][i+1].
z*nz;
271 ubcs[k][j][i].
x = ucat[k][j][i+1].
x-Un*nx;
272 ubcs[k][j][i].
y = ucat[k][j][i+1].
y-Un*ny;
273 ubcs[k][j][i].
z = ucat[k][j][i+1].
z-Un*nz;
283 for (k=lzs; k<lze; k++) {
284 for (j=lys; j<lye; j++) {
285 A=sqrt(csi[k][j][i-1].z*csi[k][j][i-1].z +
286 csi[k][j][i-1].y*csi[k][j][i-1].y +
287 csi[k][j][i-1].x*csi[k][j][i-1].x);
288 nx=csi[k][j][i-1].
x/A;
289 ny=csi[k][j][i-1].
y/A;
290 nz=csi[k][j][i-1].
z/A;
291 Un=ucat[k][j][i-1].
x*nx+ucat[k][j][i-1].
y*ny+ucat[k][j][i-1].
z*nz;
292 ubcs[k][j][i].
x = ucat[k][j][i-1].
x-Un*nx;
293 ubcs[k][j][i].
y = ucat[k][j][i-1].
y-Un*ny;
294 ubcs[k][j][i].
z = ucat[k][j][i-1].
z-Un*nz;
304 for (k=lzs; k<lze; k++) {
305 for (i=lxs; i<lxe; i++) {
306 A=sqrt(eta[k][j][i].z*eta[k][j][i].z +
307 eta[k][j][i].y*eta[k][j][i].y +
308 eta[k][j][i].x*eta[k][j][i].x);
312 Un=ucat[k][j+1][i].
x*nx+ucat[k][j+1][i].
y*ny+ucat[k][j+1][i].
z*nz;
313 ubcs[k][j][i].
x = ucat[k][j+1][i].
x-Un*nx;
314 ubcs[k][j][i].
y = ucat[k][j+1][i].
y-Un*ny;
315 ubcs[k][j][i].
z = ucat[k][j+1][i].
z-Un*nz;
325 for (k=lzs; k<lze; k++) {
326 for (i=lxs; i<lxe; i++) {
327 A=sqrt(eta[k][j-1][i].z*eta[k][j-1][i].z +
328 eta[k][j-1][i].y*eta[k][j-1][i].y +
329 eta[k][j-1][i].x*eta[k][j-1][i].x);
330 nx=eta[k][j-1][i].
x/A;
331 ny=eta[k][j-1][i].
y/A;
332 nz=eta[k][j-1][i].
z/A;
333 Un=ucat[k][j-1][i].
x*nx+ucat[k][j-1][i].
y*ny+ucat[k][j-1][i].
z*nz;
334 ubcs[k][j][i].
x = ucat[k][j-1][i].
x-Un*nx;
335 ubcs[k][j][i].
y = ucat[k][j-1][i].
y-Un*ny;
336 ubcs[k][j][i].
z = ucat[k][j-1][i].
z-Un*nz;
346 for (j=lys; j<lye; j++) {
347 for (i=lxs; i<lxe; i++) {
348 A=sqrt(zet[k][j][i].z*zet[k][j][i].z +
349 zet[k][j][i].y*zet[k][j][i].y +
350 zet[k][j][i].x*zet[k][j][i].x);
354 Un=ucat[k][j][i].
x*nx+ucat[k][j][i].
y*ny+ucat[k][j][i].
z*nz;
355 ubcs[k][j][i].
x = ucat[k][j][i].
x-Un*nx;
356 ubcs[k][j][i].
y = ucat[k][j][i].
y-Un*ny;
357 ubcs[k][j][i].
z = ucat[k][j][i].
z-Un*nz;
366 for (j=lys; j<lye; j++) {
367 for (i=lxs; i<lxe; i++) {
368 A=sqrt(zet[k-1][j][i].z*zet[k-1][j][i].z +
369 zet[k-1][j][i].y*zet[k-1][j][i].y +
370 zet[k-1][j][i].x*zet[k-1][j][i].x);
371 nx=zet[k-1][j][i].
x/A;
372 ny=zet[k-1][j][i].
y/A;
373 nz=zet[k-1][j][i].
z/A;
374 Un=ucat[k-1][j][i].
x*nx+ucat[k-1][j][i].
y*ny+ucat[k-1][j][i].
z*nz;
375 ubcs[k][j][i].
x = ucat[k-1][j][i].
x-Un*nx;
376 ubcs[k][j][i].
y = ucat[k-1][j][i].
y-Un*ny;
377 ubcs[k][j][i].
z = ucat[k-1][j][i].
z-Un*nz;
391 for (k=lzs; k<lze; k++) {
392 for (i=lxs; i<lxe; i++) {
393 ubcs[k][j][i].
x = 0.;
395 ubcs[k][j][i].
y = 0.;
396 ubcs[k][j][i].
z =-U_bc;
405 for (k=lzs; k<lze; k++) {
406 for (i=lxs; i<lxe; i++) {
407 ubcs[k][j][i].
x = 0.;
409 ubcs[k][j][i].
y = 0.;
410 ubcs[k][j][i].
z = U_bc;
419 for (j=lys; j<lye; j++) {
420 for (i=lxs; i<lxe; i++) {
421 ubcs[k][j][i].
x =-U_bc;
422 ubcs[k][j][i].
y = 0.;
423 ubcs[k][j][i].
z = 0.;
431 for (j=lys; j<lye; j++) {
432 for (i=lxs; i<lxe; i++) {
433 ubcs[k][j][i].
x = U_bc;
434 ubcs[k][j][i].
y = 0.;
435 ubcs[k][j][i].
z = 0.;
444 if (xs==0 && user->
bctype[0]!=7) {
446 for (k=zs; k<ze; k++) {
447 for (j=ys; j<ye; j++) {
448 ucat[k][j][i].
x = 2 * ubcs[k][j][i].
x - ucat[k][j][i+1].
x;
449 ucat[k][j][i].
y = 2 * ubcs[k][j][i].
y - ucat[k][j][i+1].
y;
450 ucat[k][j][i].
z = 2 * ubcs[k][j][i].
z - ucat[k][j][i+1].
z;
455 if (xe==mx && user->
bctype[0]!=7) {
457 for (k=zs; k<ze; k++) {
458 for (j=ys; j<ye; j++) {
459 ucat[k][j][i].
x = 2 * ubcs[k][j][i].
x - ucat[k][j][i-1].
x;
460 ucat[k][j][i].
y = 2 * ubcs[k][j][i].
y - ucat[k][j][i-1].
y;
461 ucat[k][j][i].
z = 2 * ubcs[k][j][i].
z - ucat[k][j][i-1].
z;
466 if (ys==0 && user->
bctype[2]!=7) {
468 for (k=zs; k<ze; k++) {
469 for (i=xs; i<xe; i++) {
470 ucat[k][j][i].
x = 2 * ubcs[k][j][i].
x - ucat[k][j+1][i].
x;
471 ucat[k][j][i].
y = 2 * ubcs[k][j][i].
y - ucat[k][j+1][i].
y;
472 ucat[k][j][i].
z = 2 * ubcs[k][j][i].
z - ucat[k][j+1][i].
z;
477 if (ye==my && user->
bctype[2]!=7) {
479 for (k=zs; k<ze; k++) {
480 for (i=xs; i<xe; i++) {
481 ucat[k][j][i].
x = 2 * ubcs[k][j][i].
x - ucat[k][j-1][i].
x;
482 ucat[k][j][i].
y = 2 * ubcs[k][j][i].
y - ucat[k][j-1][i].
y;
483 ucat[k][j][i].
z = 2 * ubcs[k][j][i].
z - ucat[k][j-1][i].
z;
488 if (zs==0 && user->
bctype[4]!=7) {
490 for (j=ys; j<ye; j++) {
491 for (i=xs; i<xe; i++) {
492 ucat[k][j][i].
x = 2 * ubcs[k][j][i].
x - ucat[k+1][j][i].
x;
493 ucat[k][j][i].
y = 2 * ubcs[k][j][i].
y - ucat[k+1][j][i].
y;
494 ucat[k][j][i].
z = 2 * ubcs[k][j][i].
z - ucat[k+1][j][i].
z;
499 if (ze==mz && user->
bctype[4]!=7) {
501 for (j=ys; j<ye; j++) {
502 for (i=xs; i<xe; i++) {
503 ucat[k][j][i].
x = 2 * ubcs[k][j][i].
x - ucat[k-1][j][i].
x;
504 ucat[k][j][i].
y = 2 * ubcs[k][j][i].
y - ucat[k-1][j][i].
y;
505 ucat[k][j][i].
z = 2 * ubcs[k][j][i].
z - ucat[k-1][j][i].
z;
509 DMDAVecRestoreArray(fda, user->
Bcs.
Ubcs, &ubcs);
510 DMDAVecRestoreArray(fda, user->
Ucat,&ucat);
517 DMGlobalToLocalBegin(fda, user->
Ucat, INSERT_VALUES, user->
lUcat);
518 DMGlobalToLocalEnd(fda, user->
Ucat, INSERT_VALUES, user->
lUcat);
520 DMDAVecGetArray(fda, user->
lUcat, &lucat);
521 DMDAVecGetArray(fda, user->
Ucat, &ucat);
526 for (k=zs; k<ze; k++) {
527 for (j=ys; j<ye; j++) {
528 if(k>0 && k<user->KM && j>0 && j<user->JM){
529 ucat[k][j][i]=lucat[k][j][i-2];
538 for (k=zs; k<ze; k++) {
539 for (i=xs; i<xe; i++) {
540 if(k>0 && k<user->KM && i>0 && i<user->IM){
541 ucat[k][j][i]=lucat[k][j-2][i];
550 for (j=ys; j<ye; j++) {
551 for (i=xs; i<xe; i++) {
552 if(j>0 && j<user->JM && i>0 && i<user->IM){
553 ucat[k][j][i]=lucat[k-2][j][i];
562 for (k=zs; k<ze; k++) {
563 for (j=ys; j<ye; j++) {
564 if(k>0 && k<user->KM && j>0 && j<user->JM){
565 ucat[k][j][i]=lucat[k][j][i+2];
574 for (k=zs; k<ze; k++) {
575 for (i=xs; i<xe; i++) {
576 if(k>0 && k<user->KM && i>0 && i<user->IM){
577 ucat[k][j][i]=lucat[k][j+2][i];
586 for (j=ys; j<ye; j++) {
587 for (i=xs; i<xe; i++) {
588 if(j>0 && j<user->JM && i>0 && i<user->IM){
589 ucat[k][j][i].
x=lucat[k+2][j][i].
x;
596 DMDAVecRestoreArray(fda, user->
lUcat, &lucat);
597 DMDAVecRestoreArray(fda, user->
Ucat, &ucat);
599 DMGlobalToLocalBegin(fda, user->
Ucat, INSERT_VALUES, user->
lUcat);
600 DMGlobalToLocalEnd(fda, user->
Ucat, INSERT_VALUES, user->
lUcat);
606 DMDAVecGetArray(fda, user->
Ucat, &ucat);
612 for (j=ys; j<ye; j++) {
613 ucat[k][j][i].
x = 0.5*(ucat[k+1][j][i].
x+ucat[k][j][i+1].
x);
614 ucat[k][j][i].
y = 0.5*(ucat[k+1][j][i].
y+ucat[k][j][i+1].
y);
615 ucat[k][j][i].
z = 0.5*(ucat[k+1][j][i].
z+ucat[k][j][i+1].
z);
620 for (j=ys; j<ye; j++) {
621 ucat[k][j][i].
x = 0.5*(ucat[k+1][j][i].
x+ucat[k][j][i-1].
x);
622 ucat[k][j][i].
y = 0.5*(ucat[k+1][j][i].
y+ucat[k][j][i-1].
y);
623 ucat[k][j][i].
z = 0.5*(ucat[k+1][j][i].
z+ucat[k][j][i-1].
z);
629 for (i=xs; i<xe; i++) {
630 ucat[k][j][i].
x = 0.5*(ucat[k+1][j][i].
x+ucat[k][j+1][i].
x);
631 ucat[k][j][i].
y = 0.5*(ucat[k+1][j][i].
y+ucat[k][j+1][i].
y);
632 ucat[k][j][i].
z = 0.5*(ucat[k+1][j][i].
z+ucat[k][j+1][i].
z);
638 for (i=xs; i<xe; i++) {
639 ucat[k][j][i].
x = 0.5*(ucat[k+1][j][i].
x+ucat[k][j-1][i].
x);
640 ucat[k][j][i].
y = 0.5*(ucat[k+1][j][i].
y+ucat[k][j-1][i].
y);
641 ucat[k][j][i].
z = 0.5*(ucat[k+1][j][i].
z+ucat[k][j-1][i].
z);
650 for (j=ys; j<ye; j++) {
651 ucat[k][j][i].
x = 0.5*(ucat[k-1][j][i].
x+ucat[k][j][i+1].
x);
652 ucat[k][j][i].
y = 0.5*(ucat[k-1][j][i].
y+ucat[k][j][i+1].
y);
653 ucat[k][j][i].
z = 0.5*(ucat[k-1][j][i].
z+ucat[k][j][i+1].
z);
658 for (j=ys; j<ye; j++) {
659 ucat[k][j][i].
x = 0.5*(ucat[k-1][j][i].
x+ucat[k][j][i-1].
x);
660 ucat[k][j][i].
y = 0.5*(ucat[k-1][j][i].
y+ucat[k][j][i-1].
y);
661 ucat[k][j][i].
z = 0.5*(ucat[k-1][j][i].
z+ucat[k][j][i-1].
z);
666 for (i=xs; i<xe; i++) {
667 ucat[k][j][i].
x = 0.5*(ucat[k-1][j][i].
x+ucat[k][j+1][i].
x);
668 ucat[k][j][i].
y = 0.5*(ucat[k-1][j][i].
y+ucat[k][j+1][i].
y);
669 ucat[k][j][i].
z = 0.5*(ucat[k-1][j][i].
z+ucat[k][j+1][i].
z);
675 for (i=xs; i<xe; i++) {
676 ucat[k][j][i].
x = 0.5*(ucat[k-1][j][i].
x+ucat[k][j-1][i].
x);
677 ucat[k][j][i].
y = 0.5*(ucat[k-1][j][i].
y+ucat[k][j-1][i].
y);
678 ucat[k][j][i].
z = 0.5*(ucat[k-1][j][i].
z+ucat[k][j-1][i].
z);
687 for (k=zs; k<ze; k++) {
688 ucat[k][j][i].
x = 0.5*(ucat[k][j+1][i].
x+ucat[k][j][i+1].
x);
689 ucat[k][j][i].
y = 0.5*(ucat[k][j+1][i].
y+ucat[k][j][i+1].
y);
690 ucat[k][j][i].
z = 0.5*(ucat[k][j+1][i].
z+ucat[k][j][i+1].
z);
696 for (k=zs; k<ze; k++) {
697 ucat[k][j][i].
x = 0.5*(ucat[k][j+1][i].
x+ucat[k][j][i-1].
x);
698 ucat[k][j][i].
y = 0.5*(ucat[k][j+1][i].
y+ucat[k][j][i-1].
y);
699 ucat[k][j][i].
z = 0.5*(ucat[k][j+1][i].
z+ucat[k][j][i-1].
z);
708 for (k=zs; k<ze; k++) {
709 ucat[k][j][i].
x = 0.5*(ucat[k][j-1][i].
x+ucat[k][j][i+1].
x);
710 ucat[k][j][i].
y = 0.5*(ucat[k][j-1][i].
y+ucat[k][j][i+1].
y);
711 ucat[k][j][i].
z = 0.5*(ucat[k][j-1][i].
z+ucat[k][j][i+1].
z);
717 for (k=zs; k<ze; k++) {
718 ucat[k][j][i].
x = 0.5*(ucat[k][j-1][i].
x+ucat[k][j][i-1].
x);
719 ucat[k][j][i].
y = 0.5*(ucat[k][j-1][i].
y+ucat[k][j][i-1].
y);
720 ucat[k][j][i].
z = 0.5*(ucat[k][j-1][i].
z+ucat[k][j][i-1].
z);
725 DMDAVecRestoreArray(fda, user->
Ucat, &ucat);
727 DMGlobalToLocalBegin(fda, user->
Ucat, INSERT_VALUES, user->
lUcat);
728 DMGlobalToLocalEnd(fda, user->
Ucat, INSERT_VALUES, user->
lUcat);
732 DMDAVecGetArray(fda, user->
lUcat, &lucat);
733 DMDAVecGetArray(fda, user->
Ucat, &ucat);
738 for (k=zs; k<ze; k++) {
739 for (j=ys; j<ye; j++) {
740 ucat[k][j][i]=lucat[k][j][i-2];
748 for (k=zs; k<ze; k++) {
749 for (j=ys; j<ye; j++) {
750 ucat[k][j][i]=lucat[k][j][i+2];
755 DMDAVecRestoreArray(fda, user->
lUcat, &lucat);
756 DMDAVecRestoreArray(fda, user->
Ucat, &ucat);
761 DMGlobalToLocalBegin(fda, user->
Ucat, INSERT_VALUES, user->
lUcat);
762 DMGlobalToLocalEnd(fda, user->
Ucat, INSERT_VALUES, user->
lUcat);
766 DMDAVecGetArray(fda, user->
lUcat, &lucat);
767 DMDAVecGetArray(fda, user->
Ucat, &ucat);
772 for (k=zs; k<ze; k++) {
773 for (i=xs; i<xe; i++) {
774 ucat[k][j][i]=lucat[k][j-2][i];
783 for (k=zs; k<ze; k++) {
784 for (i=xs; i<xe; i++) {
785 ucat[k][j][i]=lucat[k][j+2][i];
791 DMDAVecRestoreArray(fda, user->
lUcat, &lucat);
792 DMDAVecRestoreArray(fda, user->
Ucat, &ucat);
797 DMGlobalToLocalBegin(fda, user->
Ucat, INSERT_VALUES, user->
lUcat);
798 DMGlobalToLocalEnd(fda, user->
Ucat, INSERT_VALUES, user->
lUcat);
802 DMDAVecGetArray(fda, user->
lUcat, &lucat);
803 DMDAVecGetArray(fda, user->
Ucat, &ucat);
808 for (j=ys; j<ye; j++) {
809 for (i=xs; i<xe; i++) {
810 ucat[k][j][i]=lucat[k-2][j][i];
818 for (j=ys; j<ye; j++) {
819 for (i=xs; i<xe; i++) {
820 ucat[k][j][i].
x=lucat[k+2][j][i].
x;
826 DMDAVecRestoreArray(fda, user->
lUcat, &lucat);
827 DMDAVecRestoreArray(fda, user->
Ucat, &ucat);
832 DMGlobalToLocalBegin(fda, user->
Ucat, INSERT_VALUES, user->
lUcat);
833 DMGlobalToLocalEnd(fda, user->
Ucat, INSERT_VALUES, user->
lUcat);
836 DMDAVecRestoreArray(fda, user->
lCsi, &csi);
837 DMDAVecRestoreArray(fda, user->
lEta, &eta);
838 DMDAVecRestoreArray(fda, user->
lZet, &zet);
990 PetscFunctionBeginUser;
1000 DM da = user->
da, fda = user->
fda;
1001 DMDALocalInfo info = user->
info;
1004 PetscInt mx = info.mx, my = info.my, mz = info.mz;
1005 PetscInt xs = info.xs, xe = info.xs + info.xm;
1006 PetscInt ys = info.ys, ye = info.ys + info.ym;
1007 PetscInt zs = info.zs, ze = info.zs + info.zm;
1010 PetscInt lxs = (xs == 0) ? xs + 1 : xs;
1011 PetscInt lxe = (xe == mx) ? xe - 1 : xe;
1012 PetscInt lys = (ys == 0) ? ys + 1 : ys;
1013 PetscInt lye = (ye == my) ? ye - 1 : ye;
1014 PetscInt lzs = (zs == 0) ? zs + 1 : zs;
1015 PetscInt lze = (ze == mz) ? ze - 1 : ze;
1018 Cmpnts ***icsi, ***ieta, ***izet, ***jcsi, ***jeta, ***jzet, ***kcsi, ***keta, ***kzet;
1019 PetscReal ***iaj, ***jaj, ***kaj, ***p, ***nvert;
1021 DMDAVecGetArray(fda, user->
lICsi, &icsi); DMDAVecGetArray(fda, user->
lIEta, &ieta); DMDAVecGetArray(fda, user->
lIZet, &izet);
1022 DMDAVecGetArray(fda, user->
lJCsi, &jcsi); DMDAVecGetArray(fda, user->
lJEta, &jeta); DMDAVecGetArray(fda, user->
lJZet, &jzet);
1023 DMDAVecGetArray(fda, user->
lKCsi, &kcsi); DMDAVecGetArray(fda, user->
lKEta, &keta); DMDAVecGetArray(fda, user->
lKZet, &kzet);
1024 DMDAVecGetArray(da, user->
lIAj, &iaj); DMDAVecGetArray(da, user->
lJAj, &jaj); DMDAVecGetArray(da, user->
lKAj, &kaj);
1025 DMDAVecGetArray(da, user->
lNvert, &nvert);
1026 DMDAVecGetArray(da, user->
lPhi, &p);
1028 DMDAVecGetArray(fda, user->
Ucont, &ucont);
1031 const PetscReal IBM_FLUID_THRESHOLD = 0.1;
1042 for (PetscInt k = lzs; k < lze; k++) {
1043 for (PetscInt j = lys; j < lye; j++) {
1044 for (PetscInt i = lxs; i < lxe; i++) {
1047 PetscInt i_end = (user->
bctype[0] == 7) ? mx - 1 : mx - 2;
1050 if (!(nvert[k][j][i] > IBM_FLUID_THRESHOLD || nvert[k][j][i + 1] > IBM_FLUID_THRESHOLD)) {
1053 PetscReal dpdc = p[k][j][i + 1] - p[k][j][i];
1054 PetscReal dpde = 0.0, dpdz = 0.0;
1057 if ((j==my-2 && user->
bctype[2]!=7)|| nvert[k][j+1][i]+nvert[k][j+1][i+1] > 0.1) {
1058 if (nvert[k][j-1][i] + nvert[k][j-1][i+1] < 0.1 && (j!=1 || (j==1 && user->
bctype[2]==7))) {
1059 dpde = (p[k][j][i] + p[k][j][i+1] -
1060 p[k][j-1][i] - p[k][j-1][i+1]) * 0.5;
1064 else if ((j==my-2 || j==1) && user->
bctype[2]==7 && nvert[k][j+1][i]+nvert[k][j+1][i+1] > 0.1) {
1065 if (nvert[k][j-1][i] + nvert[k][j-1][i+1] < 0.1) { dpde = (p[k][j][i] + p[k][j][i+1] - p[k][j-1][i] - p[k][j-1][i+1]) * 0.5; }
1068 else if ((j == 1 && user->
bctype[2]!=7) || nvert[k][j-1][i] + nvert[k][j-1][i+1] > 0.1) {
1069 if (nvert[k][j+1][i] + nvert[k][j+1][i+1] < 0.1) { dpde = (p[k][j+1][i] + p[k][j+1][i+1] - p[k][j][i] - p[k][j][i+1]) * 0.5; }
1072 else if ((j == 1 || j==my-2) && user->
bctype[2]==7 && nvert[k][j-1][i] + nvert[k][j-1][i+1] > 0.1) {
1073 if (nvert[k][j+1][i] + nvert[k][j+1][i+1] < 0.1) { dpde = (p[k][j+1][i] + p[k][j+1][i+1] - p[k][j][i] - p[k][j][i+1]) * 0.5; }
1076 else { dpde = (p[k][j+1][i] + p[k][j+1][i+1] - p[k][j-1][i] - p[k][j-1][i+1]) * 0.25; }
1079 if ((k == mz-2 && user->
bctype[4]!=7) || nvert[k+1][j][i] + nvert[k+1][j][i+1] > 0.1) {
1080 if (nvert[k-1][j][i] + nvert[k-1][j][i+1] < 0.1 && (k!=1 || (k==1 && user->
bctype[4]==7))) { dpdz = (p[k][j][i] + p[k][j][i+1] - p[k-1][j][i] - p[k-1][j][i+1]) * 0.5; }
1083 else if ((k == mz-2 || k==1) && user->
bctype[4]==7 && nvert[k+1][j][i] + nvert[k+1][j][i+1] > 0.1) {
1084 if (nvert[k-1][j][i] + nvert[k-1][j][i+1] < 0.1) { dpdz = (p[k][j][i] + p[k][j][i+1] - p[k-1][j][i] - p[k-1][j][i+1]) * 0.5; }
1087 else if ((k == 1 && user->
bctype[4]!=7)|| nvert[k-1][j][i] + nvert[k-1][j][i+1] > 0.1) {
1088 if (nvert[k+1][j][i] + nvert[k+1][j][i+1] < 0.1) { dpdz = (p[k+1][j][i] + p[k+1][j][i+1] - p[k][j][i] - p[k][j][i+1]) * 0.5; }
1091 else if ((k == 1 || k==mz-2) && user->
bctype[4]==7 && nvert[k-1][j][i] + nvert[k-1][j][i+1] > 0.1) {
1092 if (nvert[k+1][j][i] + nvert[k+1][j][i+1] < 0.1) { dpdz = (p[k+1][j][i] + p[k+1][j][i+1] - p[k][j][i] - p[k][j][i+1]) * 0.5; }
1095 else { dpdz = (p[k+1][j][i] + p[k+1][j][i+1] - p[k-1][j][i] - p[k-1][j][i+1]) * 0.25; }
1101 PetscReal grad_p_x = (dpdc * (icsi[k][j][i].
x * icsi[k][j][i].
x + icsi[k][j][i].
y * icsi[k][j][i].
y
1102 + icsi[k][j][i].
z * icsi[k][j][i].
z) * iaj[k][j][i] +
1103 dpde * (ieta[k][j][i].x * icsi[k][j][i].x + ieta[k][j][i].y * icsi[k][j][i].y
1104 + ieta[k][j][i].z * icsi[k][j][i].z) * iaj[k][j][i] +
1105 dpdz * (izet[k][j][i].
x * icsi[k][j][i].
x + izet[k][j][i].
y * icsi[k][j][i].
y
1106 + izet[k][j][i].
z * icsi[k][j][i].
z) * iaj[k][j][i]);
1108 PetscReal correction = grad_p_x*scale;
1110 ucont[k][j][i].
x -= correction;
1116 PetscInt j_end = (user->
bctype[2] == 7) ? my - 1 : my - 2;
1118 if (!(nvert[k][j][i] > IBM_FLUID_THRESHOLD || nvert[k][j + 1][i] > IBM_FLUID_THRESHOLD)) {
1119 PetscReal dpdc = 0.0, dpde = 0.0, dpdz = 0.0;
1120 dpde = p[k][j + 1][i] - p[k][j][i];
1123 if ((i == mx-2 && user->
bctype[0]!=7) || nvert[k][j][i+1] + nvert[k][j+1][i+1] > 0.1) {
1124 if (nvert[k][j][i-1] + nvert[k][j+1][i-1] < 0.1 && (i!=1 || (i==1 && user->
bctype[0]==7))) { dpdc = (p[k][j][i] + p[k][j+1][i] - p[k][j][i-1] - p[k][j+1][i-1]) * 0.5; }
1125 }
else if ((i == mx-2 || i==1) && user->
bctype[0]==7 && nvert[k][j][i+1] + nvert[k][j+1][i+1] > 0.1) {
1126 if (nvert[k][j][i-1] + nvert[k][j+1][i-1] < 0.1) { dpdc = (p[k][j][i] + p[k][j+1][i] - p[k][j][i-1] - p[k][j+1][i-1]) * 0.5; }
1127 }
else if ((i == 1 && user->
bctype[0]!=7)|| nvert[k][j][i-1] + nvert[k][j+1][i-1] > 0.1) {
1128 if (nvert[k][j][i+1] + nvert[k][j+1][i+1] < 0.1) { dpdc = (p[k][j][i+1] + p[k][j+1][i+1] - p[k][j][i] - p[k][j+1][i]) * 0.5; }
1129 }
else if ((i == 1 || i==mx-2) && user->
bctype[0]==7 && nvert[k][j][i-1] + nvert[k][j+1][i-1] > 0.1) {
1130 if (nvert[k][j][i+1] + nvert[k][j+1][i+1] < 0.1) { dpdc = (p[k][j][i+1] + p[k][j+1][i+1] - p[k][j][i] - p[k][j+1][i]) * 0.5; }
1131 }
else { dpdc = (p[k][j][i+1] + p[k][j+1][i+1] - p[k][j][i-1] - p[k][j+1][i-1]) * 0.25; }
1134 if ((k == mz-2 && user->
bctype[4]!=7)|| nvert[k+1][j][i] + nvert[k+1][j+1][i] > 0.1) {
1135 if (nvert[k-1][j][i] + nvert[k-1][j+1][i] < 0.1 && (k!=1 || (k==1 && user->
bctype[4]==7))) { dpdz = (p[k][j][i] + p[k][j+1][i] - p[k-1][j][i] - p[k-1][j+1][i]) * 0.5; }
1136 }
else if ((k == mz-2 || k==1 ) && user->
bctype[4]==7 && nvert[k+1][j][i] + nvert[k+1][j+1][i] > 0.1) {
1137 if (nvert[k-1][j][i] + nvert[k-1][j+1][i] < 0.1) { dpdz = (p[k][j][i] + p[k][j+1][i] - p[k-1][j][i] - p[k-1][j+1][i]) * 0.5; }
1138 }
else if ((k == 1 && user->
bctype[4]!=7)|| nvert[k-1][j][i] + nvert[k-1][j+1][i] > 0.1) {
1139 if (nvert[k+1][j][i] + nvert[k+1][j+1][i] < 0.1) { dpdz = (p[k+1][j][i] + p[k+1][j+1][i] - p[k][j][i] - p[k][j+1][i]) * 0.5; }
1140 }
else if ((k == 1 || k==mz-2) && user->
bctype[4]==7 && nvert[k-1][j][i] + nvert[k-1][j+1][i] > 0.1) {
1141 if (nvert[k+1][j][i] + nvert[k+1][j+1][i] < 0.1) { dpdz = (p[k+1][j][i] + p[k+1][j+1][i] - p[k][j][i] - p[k][j+1][i]) * 0.5; }
1142 }
else { dpdz = (p[k+1][j][i] + p[k+1][j+1][i] - p[k-1][j][i] - p[k-1][j+1][i]) * 0.25; }
1144 PetscReal grad_p_y = (dpdc * (jcsi[k][j][i].
x * jeta[k][j][i].
x + jcsi[k][j][i].
y * jeta[k][j][i].
y + jcsi[k][j][i].
z * jeta[k][j][i].
z) * jaj[k][j][i] +
1145 dpde * (jeta[k][j][i].x * jeta[k][j][i].x + jeta[k][j][i].y * jeta[k][j][i].y + jeta[k][j][i].z * jeta[k][j][i].z) * jaj[k][j][i] +
1146 dpdz * (jzet[k][j][i].
x * jeta[k][j][i].
x + jzet[k][j][i].
y * jeta[k][j][i].
y + jzet[k][j][i].
z * jeta[k][j][i].
z) * jaj[k][j][i]);
1148 PetscReal correction = grad_p_y*scale;
1150 ucont[k][j][i].
y -= correction;
1155 PetscInt k_end = (user->
bctype[4] == 7) ? mz - 1 : mz - 2;
1157 if (!(nvert[k][j][i] > IBM_FLUID_THRESHOLD || nvert[k + 1][j][i] > IBM_FLUID_THRESHOLD)) {
1158 PetscReal dpdc = 0.0, dpde = 0.0, dpdz = 0.0;
1159 dpdz = p[k + 1][j][i] - p[k][j][i];
1162 if ((i == mx-2 && user->
bctype[0]!=7)|| nvert[k][j][i+1] + nvert[k+1][j][i+1] > 0.1) {
1163 if (nvert[k][j][i-1] + nvert[k+1][j][i-1] < 0.1 && (i!=1 || (i==1 && user->
bctype[0]==7))) { dpdc = (p[k][j][i] + p[k+1][j][i] - p[k][j][i-1] - p[k+1][j][i-1]) * 0.5; }
1164 }
else if ((i == mx-2 || i==1) && user->
bctype[0]==7 && nvert[k][j][i+1] + nvert[k+1][j][i+1] > 0.1) {
1165 if (nvert[k][j][i-1] + nvert[k+1][j][i-1] < 0.1) { dpdc = (p[k][j][i] + p[k+1][j][i] - p[k][j][i-1] - p[k+1][j][i-1]) * 0.5; }
1166 }
else if ((i == 1 && user->
bctype[0]!=7)|| nvert[k][j][i-1] + nvert[k+1][j][i-1] > 0.1) {
1167 if (nvert[k][j][i+1] + nvert[k+1][j][i+1] < 0.1) { dpdc = (p[k][j][i+1] + p[k+1][j][i+1] - p[k][j][i] - p[k+1][j][i]) * 0.5; }
1168 }
else if ((i == 1 || i==mx-2) && user->
bctype[0]==7 && nvert[k][j][i-1] + nvert[k+1][j][i-1] > 0.1) {
1169 if (nvert[k][j][i+1] + nvert[k+1][j][i+1] < 0.1) { dpdc = (p[k][j][i+1] + p[k+1][j][i+1] - p[k][j][i] - p[k+1][j][i]) * 0.5; }
1170 }
else { dpdc = (p[k][j][i+1] + p[k+1][j][i+1] - p[k][j][i-1] - p[k+1][j][i-1]) * 0.25; }
1173 if ((j == my-2 && user->
bctype[2]!=7)|| nvert[k][j+1][i] + nvert[k+1][j+1][i] > 0.1) {
1174 if (nvert[k][j-1][i] + nvert[k+1][j-1][i] < 0.1 && (j!=1 || (j==1 && user->
bctype[2]==7))) { dpde = (p[k][j][i] + p[k+1][j][i] - p[k][j-1][i] - p[k+1][j-1][i]) * 0.5; }
1175 }
else if ((j == my-2 || j==1) && user->
bctype[2]==7 && nvert[k][j+1][i] + nvert[k+1][j+1][i] > 0.1) {
1176 if (nvert[k][j-1][i] + nvert[k+1][j-1][i] < 0.1) { dpde = (p[k][j][i] + p[k+1][j][i] - p[k][j-1][i] - p[k+1][j-1][i]) * 0.5; }
1177 }
else if ((j == 1 && user->
bctype[2]!=7)|| nvert[k][j-1][i] + nvert[k+1][j-1][i] > 0.1) {
1178 if (nvert[k][j+1][i] + nvert[k+1][j+1][i] < 0.1) { dpde = (p[k][j+1][i] + p[k+1][j+1][i] - p[k][j][i] - p[k+1][j][i]) * 0.5; }
1179 }
else if ((j == 1 || j==my-2) && user->
bctype[2]==7 && nvert[k][j-1][i] + nvert[k+1][j-1][i] > 0.1) {
1180 if (nvert[k][j+1][i] + nvert[k+1][j+1][i] < 0.1) { dpde = (p[k][j+1][i] + p[k+1][j+1][i] - p[k][j][i] - p[k+1][j][i]) * 0.5; }
1181 }
else { dpde = (p[k][j+1][i] + p[k+1][j+1][i] - p[k][j-1][i] - p[k+1][j-1][i]) * 0.25; }
1183 PetscReal grad_p_z = (dpdc * (kcsi[k][j][i].
x * kzet[k][j][i].
x + kcsi[k][j][i].
y * kzet[k][j][i].
y + kcsi[k][j][i].
z * kzet[k][j][i].
z) * kaj[k][j][i] +
1184 dpde * (keta[k][j][i].x * kzet[k][j][i].x + keta[k][j][i].y * kzet[k][j][i].y + keta[k][j][i].z * kzet[k][j][i].z) * kaj[k][j][i] +
1185 dpdz * (kzet[k][j][i].
x * kzet[k][j][i].
x + kzet[k][j][i].
y * kzet[k][j][i].
y + kzet[k][j][i].
z * kzet[k][j][i].
z) * kaj[k][j][i]);
1189 "[k=%d, j=%d, i=%d] ---- Neighbor Pressures ----\n"
1190 " Central Z-Neighbors: p[k+1][j][i] = %g | p[k][j][i] = %g\n"
1191 " Eta-Stencil (Y-dir): p[k][j-1][i] = %g, p[k+1][j-1][i] = %g | p[k][j+1][i] = %g, p[k+1][j+1][i] = %g\n"
1192 " Csi-Stencil (X-dir): p[k][j][i-1] = %g, p[k+1][j][i-1] = %g | p[k][j][i+1] = %g, p[k+1][j][i+1] = %g\n",
1194 p[k + 1][j][i], p[k][j][i],
1195 p[k][j - 1][i], p[k + 1][j - 1][i], p[k][j + 1][i], p[k + 1][j + 1][i],
1196 p[k][j][i - 1], p[k + 1][j][i - 1], p[k][j][i + 1], p[k + 1][j][i + 1]);
1200 PetscReal correction = grad_p_z*scale;
1202 ucont[k][j][i].
z -= correction;
1212 if (user->
bctype[0] == 7 && xs == 0) {
1213 for (PetscInt k=lzs; k<lze; k++) {
1214 for (PetscInt j=lys; j<lye; j++) {
1217 PetscReal dpdc = p[k][j][i+1] - p[k][j][i];
1219 PetscReal dpde = 0.;
1220 PetscReal dpdz = 0.;
1222 if ((j==my-2 && user->
bctype[2]!=7)|| nvert[k][j+1][i]+nvert[k][j+1][i+1] > 0.1) {
1223 if (nvert[k][j-1][i] + nvert[k][j-1][i+1] < 0.1 && (j!=1 || (j==1 && user->
bctype[2]==7))) {
1224 dpde = (p[k][j ][i] + p[k][j ][i+1] -
1225 p[k][j-1][i] - p[k][j-1][i+1]) * 0.5;
1228 else if ((j==my-2 || j==1) && user->
bctype[2]==7 && nvert[k][j+1][i]+nvert[k][j+1][i+1] > 0.1) {
1229 if (nvert[k][j-1][i] + nvert[k][j-1][i+1] < 0.1) {
1230 dpde = (p[k][j ][i] + p[k][j ][i+1] -
1231 p[k][j-1][i] - p[k][j-1][i+1]) * 0.5;
1234 else if ((j == 1 && user->
bctype[2]!=7) || nvert[k][j-1][i] + nvert[k][j-1][i+1] > 0.1) {
1235 if (nvert[k][j+1][i] + nvert[k][j+1][i+1] < 0.1) {
1236 dpde = (p[k][j+1][i] + p[k][j+1][i+1] -
1237 p[k][j ][i] - p[k][j ][i+1]) * 0.5;
1240 else if ((j == 1 || j==my-2) && user->
bctype[2]==7 && nvert[k][j-1][i] + nvert[k][j-1][i+1] > 0.1) {
1241 if (nvert[k][j+1][i] + nvert[k][j+1][i+1] < 0.1) {
1242 dpde = (p[k][j+1][i] + p[k][j+1][i+1] -
1243 p[k][j ][i] - p[k][j ][i+1]) * 0.5;
1247 dpde = (p[k][j+1][i] + p[k][j+1][i+1] -
1248 p[k][j-1][i] - p[k][j-1][i+1]) * 0.25;
1251 if ((k == mz-2 && user->
bctype[4]!=7) || nvert[k+1][j][i] + nvert[k+1][j][i+1] > 0.1) {
1252 if (nvert[k-1][j][i] + nvert[k-1][j][i+1] < 0.1 && (k!=1 || (k==1 && user->
bctype[4]==7))) {
1253 dpdz = (p[k ][j][i] + p[k ][j][i+1] -
1254 p[k-1][j][i] - p[k-1][j][i+1]) * 0.5;
1257 else if ((k == mz-2 || k==1) && user->
bctype[4]==7 && nvert[k+1][j][i] + nvert[k+1][j][i+1] > 0.1) {
1258 if (nvert[k-1][j][i] + nvert[k-1][j][i+1] < 0.1) {
1259 dpdz = (p[k ][j][i] + p[k ][j][i+1] -
1260 p[k-1][j][i] - p[k-1][j][i+1]) * 0.5;
1263 else if ((k == 1 && user->
bctype[4]!=7)|| nvert[k-1][j][i] + nvert[k-1][j][i+1] > 0.1) {
1264 if (nvert[k+1][j][i] + nvert[k+1][j][i+1] < 0.1) {
1265 dpdz = (p[k+1][j][i] + p[k+1][j][i+1] -
1266 p[k ][j][i] - p[k ][j][i+1]) * 0.5;
1269 else if ((k == 1 || k==mz-2) && user->
bctype[4]==7 && nvert[k-1][j][i] + nvert[k-1][j][i+1] > 0.1) {
1270 if (nvert[k+1][j][i] + nvert[k+1][j][i+1] < 0.1) {
1271 dpdz = (p[k+1][j][i] + p[k+1][j][i+1] -
1272 p[k ][j][i] - p[k ][j][i+1]) * 0.5;
1276 dpdz = (p[k+1][j][i] + p[k+1][j][i+1] -
1277 p[k-1][j][i] - p[k-1][j][i+1]) * 0.25;
1282 if (!(nvert[k][j][i] + nvert[k][j][i+1])) {
1284 (dpdc * (icsi[k][j][i].
x * icsi[k][j][i].
x +
1285 icsi[k][j][i].
y * icsi[k][j][i].
y +
1286 icsi[k][j][i].
z * icsi[k][j][i].
z) * iaj[k][j][i] +
1287 dpde * (ieta[k][j][i].x * icsi[k][j][i].x +
1288 ieta[k][j][i].y * icsi[k][j][i].y +
1289 ieta[k][j][i].z * icsi[k][j][i].z) * iaj[k][j][i] +
1290 dpdz * (izet[k][j][i].
x * icsi[k][j][i].
x +
1291 izet[k][j][i].
y * icsi[k][j][i].
y +
1292 izet[k][j][i].
z * icsi[k][j][i].
z) * iaj[k][j][i])
1299 if (user->
bctype[2] == 7 && ys == 0) {
1301 for (PetscInt k=lzs; k<lze; k++) {
1302 for (PetscInt i=lxs; i<lxe; i++) {
1305 PetscReal dpdc = 0.;
1306 PetscReal dpdz = 0.;
1307 if ((i == mx-2 && user->
bctype[0]!=7) || nvert[k][j][i+1] + nvert[k][j+1][i+1] > 0.1) {
1308 if (nvert[k][j][i-1] + nvert[k][j+1][i-1] < 0.1 && (i!=1 || (i==1 && user->
bctype[0]==7))) {
1309 dpdc = (p[k][j][i ] + p[k][j+1][i ] -
1310 p[k][j][i-1] - p[k][j+1][i-1]) * 0.5;
1313 else if ((i == mx-2 || i==1) && user->
bctype[0]==7 && nvert[k][j][i+1] + nvert[k][j+1][i+1] > 0.1) {
1314 if (nvert[k][j][i-1] + nvert[k][j+1][i-1] < 0.1) {
1315 dpdc = (p[k][j][i ] + p[k][j+1][i ] -
1316 p[k][j][i-1] - p[k][j+1][i-1]) * 0.5;
1319 else if ((i == 1 && user->
bctype[0]!=7)|| nvert[k][j][i-1] + nvert[k][j+1][i-1] > 0.1) {
1320 if (nvert[k][j][i+1] + nvert[k][j+1][i+1] < 0.1) {
1321 dpdc = (p[k][j][i+1] + p[k][j+1][i+1] -
1322 p[k][j][i ] - p[k][j+1][i ]) * 0.5;
1325 else if ((i == 1 || i==mx-2) && user->
bctype[0]==7 && nvert[k][j][i-1] + nvert[k][j+1][i-1] > 0.1) {
1326 if (nvert[k][j][i+1] + nvert[k][j+1][i+1] < 0.1) {
1327 dpdc = (p[k][j][i+1] + p[k][j+1][i+1] -
1328 p[k][j][i ] - p[k][j+1][i ]) * 0.5;
1332 dpdc = (p[k][j][i+1] + p[k][j+1][i+1] -
1333 p[k][j][i-1] - p[k][j+1][i-1]) * 0.25;
1336 PetscReal dpde = p[k][j+1][i] - p[k][j][i];
1338 if ((k == mz-2 && user->
bctype[4]!=7)|| nvert[k+1][j][i] + nvert[k+1][j+1][i] > 0.1) {
1339 if (nvert[k-1][j][i] + nvert[k-1][j+1][i] < 0.1 && (k!=1 || (k==1 && user->
bctype[4]==7))) {
1340 dpdz = (p[k ][j][i] + p[k ][j+1][i] -
1341 p[k-1][j][i] - p[k-1][j+1][i]) * 0.5;
1344 else if ((k == mz-2 || k==1 ) && user->
bctype[0]==7 && nvert[k+1][j][i] + nvert[k+1][j+1][i] > 0.1) {
1345 if (nvert[k-1][j][i] + nvert[k-1][j+1][i] < 0.1) {
1346 dpdz = (p[k ][j][i] + p[k ][j+1][i] -
1347 p[k-1][j][i] - p[k-1][j+1][i]) * 0.5;
1350 else if ((k == 1 && user->
bctype[4]!=7)|| nvert[k-1][j][i] + nvert[k-1][j+1][i] > 0.1) {
1351 if (nvert[k+1][j][i] + nvert[k+1][j+1][i] < 0.1) {
1352 dpdz = (p[k+1][j][i] + p[k+1][j+1][i] -
1353 p[k ][j][i] - p[k ][j+1][i]) * 0.5;
1356 else if ((k == 1 || k==mz-2) && user->
bctype[4]==7 && nvert[k-1][j][i] + nvert[k-1][j+1][i] > 0.1) {
1357 if (nvert[k+1][j][i] + nvert[k+1][j+1][i] < 0.1) {
1358 dpdz = (p[k+1][j][i] + p[k+1][j+1][i] -
1359 p[k ][j][i] - p[k ][j+1][i]) * 0.5;
1363 dpdz = (p[k+1][j][i] + p[k+1][j+1][i] -
1364 p[k-1][j][i] - p[k-1][j+1][i]) * 0.25;
1367 if (!(nvert[k][j][i] + nvert[k][j+1][i])) {
1369 (dpdc * (jcsi[k][j][i].
x * jeta[k][j][i].
x +
1370 jcsi[k][j][i].
y * jeta[k][j][i].
y +
1371 jcsi[k][j][i].
z * jeta[k][j][i].
z) * jaj[k][j][i] +
1372 dpde * (jeta[k][j][i].x * jeta[k][j][i].x +
1373 jeta[k][j][i].y * jeta[k][j][i].y +
1374 jeta[k][j][i].z * jeta[k][j][i].z) * jaj[k][j][i] +
1375 dpdz * (jzet[k][j][i].
x * jeta[k][j][i].
x +
1376 jzet[k][j][i].
y * jeta[k][j][i].
y +
1377 jzet[k][j][i].
z * jeta[k][j][i].
z) * jaj[k][j][i])
1384 if (user->
bctype[4] == 7 && zs == 0) {
1385 for (PetscInt j=lys; j<lye; j++) {
1386 for (PetscInt i=lxs; i<lxe; i++) {
1389 PetscReal dpdc = 0.;
1390 PetscReal dpde = 0.;
1392 if ((i == mx-2 && user->
bctype[0]!=7)|| nvert[k][j][i+1] + nvert[k+1][j][i+1] > 0.1) {
1393 if (nvert[k][j][i-1] + nvert[k+1][j][i-1] < 0.1 && (i!=1 || (i==1 && user->
bctype[0]==7))) {
1394 dpdc = (p[k][j][i ] + p[k+1][j][i ] -
1395 p[k][j][i-1] - p[k+1][j][i-1]) * 0.5;
1398 else if ((i == mx-2 || i==1) && user->
bctype[0]==7 && nvert[k][j][i+1] + nvert[k+1][j][i+1] > 0.1) {
1399 if (nvert[k][j][i-1] + nvert[k+1][j][i-1] < 0.1) {
1400 dpdc = (p[k][j][i ] + p[k+1][j][i ] -
1401 p[k][j][i-1] - p[k+1][j][i-1]) * 0.5;
1404 else if ((i == 1 && user->
bctype[0]!=7)|| nvert[k][j][i-1] + nvert[k+1][j][i-1] > 0.1) {
1405 if (nvert[k][j][i+1] + nvert[k+1][j][i+1] < 0.1) {
1406 dpdc = (p[k][j][i+1] + p[k+1][j][i+1] -
1407 p[k][j][i ] - p[k+1][j][i ]) * 0.5;
1410 else if ((i == 1 || i==mx-2) && user->
bctype[0]==7 && nvert[k][j][i-1] + nvert[k+1][j][i-1] > 0.1) {
1411 if (nvert[k][j][i+1] + nvert[k+1][j][i+1] < 0.1) {
1412 dpdc = (p[k][j][i+1] + p[k+1][j][i+1] -
1413 p[k][j][i ] - p[k+1][j][i ]) * 0.5;
1417 dpdc = (p[k][j][i+1] + p[k+1][j][i+1] -
1418 p[k][j][i-1] - p[k+1][j][i-1]) * 0.25;
1421 if ((j == my-2 && user->
bctype[2]!=7)|| nvert[k][j+1][i] + nvert[k+1][j+1][i] > 0.1) {
1422 if (nvert[k][j-1][i] + nvert[k+1][j-1][i] < 0.1 && (j!=1 || (j==1 && user->
bctype[2]==7))) {
1423 dpde = (p[k][j ][i] + p[k+1][j ][i] -
1424 p[k][j-1][i] - p[k+1][j-1][i]) * 0.5;
1427 else if ((j == my-2 || j==1) && user->
bctype[2]==7 && nvert[k][j+1][i] + nvert[k+1][j+1][i] > 0.1) {
1428 if (nvert[k][j-1][i] + nvert[k+1][j-1][i] < 0.1) {
1429 dpde = (p[k][j ][i] + p[k+1][j ][i] -
1430 p[k][j-1][i] - p[k+1][j-1][i]) * 0.5;
1433 else if ((j == 1 && user->
bctype[2]!=7)|| nvert[k][j-1][i] + nvert[k+1][j-1][i] > 0.1) {
1434 if (nvert[k][j+1][i] + nvert[k+1][j+1][i] < 0.1) {
1435 dpde = (p[k][j+1][i] + p[k+1][j+1][i] -
1436 p[k][j ][i] - p[k+1][j ][i]) * 0.5;
1439 else if ((j == 1 || j==my-2) && user->
bctype[2]==7 && nvert[k][j-1][i] + nvert[k+1][j-1][i] > 0.1) {
1440 if (nvert[k][j+1][i] + nvert[k+1][j+1][i] < 0.1) {
1441 dpde = (p[k][j+1][i] + p[k+1][j+1][i] -
1442 p[k][j ][i] - p[k+1][j ][i]) * 0.5;
1446 dpde = (p[k][j+1][i] + p[k+1][j+1][i] -
1447 p[k][j-1][i] - p[k+1][j-1][i]) * 0.25;
1450 PetscReal dpdz = p[k+1][j][i] - p[k][j][i];
1452 if (!(nvert[k][j][i] + nvert[k+1][j][i])) {
1455 (dpdc * (kcsi[k][j][i].
x * kzet[k][j][i].
x +
1456 kcsi[k][j][i].
y * kzet[k][j][i].
y +
1457 kcsi[k][j][i].
z * kzet[k][j][i].
z) * kaj[k][j][i] +
1458 dpde * (keta[k][j][i].x * kzet[k][j][i].x +
1459 keta[k][j][i].y * kzet[k][j][i].y +
1460 keta[k][j][i].z * kzet[k][j][i].z) * kaj[k][j][i] +
1461 dpdz * (kzet[k][j][i].
x * kzet[k][j][i].
x +
1462 kzet[k][j][i].
y * kzet[k][j][i].
y +
1463 kzet[k][j][i].
z * kzet[k][j][i].
z) * kaj[k][j][i])
1488 DMDAVecRestoreArray(fda, user->
Ucont, &ucont);
1491 DMDAVecRestoreArray(fda, user->
lICsi, &icsi); DMDAVecRestoreArray(fda, user->
lIEta, &ieta); DMDAVecRestoreArray(fda, user->
lIZet, &izet);
1492 DMDAVecRestoreArray(fda, user->
lJCsi, &jcsi); DMDAVecRestoreArray(fda, user->
lJEta, &jeta); DMDAVecRestoreArray(fda, user->
lJZet, &jzet);
1493 DMDAVecRestoreArray(fda, user->
lKCsi, &kcsi); DMDAVecRestoreArray(fda, user->
lKEta, &keta); DMDAVecRestoreArray(fda, user->
lKZet, &kzet);
1494 DMDAVecRestoreArray(da, user->
lIAj, &iaj); DMDAVecRestoreArray(da, user->
lJAj, &jaj); DMDAVecRestoreArray(da, user->
lKAj, &kaj);
1495 DMDAVecRestoreArray(da, user->
lP, &p);
1496 DMDAVecRestoreArray(da, user->
lNvert, &nvert);
1500 DMGlobalToLocalBegin(fda, user->
Ucont, INSERT_VALUES, user->
lUcont);
1501 DMGlobalToLocalEnd(fda, user->
Ucont, INSERT_VALUES, user->
lUcont);
1510 PetscFunctionReturn(0);
2242 PetscFunctionBeginUser;
2244 PetscErrorCode ierr;
2252 DM da = user->
da, fda = user->
fda;
2253 DMDALocalInfo info = user->
info;
2254 PetscInt IM = user->
IM, JM = user->
JM, KM = user->
KM;
2258 PetscInt mx = info.mx, my = info.my, mz = info.mz;
2259 PetscInt xs = info.xs, xe = info.xs + info.xm;
2260 PetscInt ys = info.ys, ye = info.ys + info.ym;
2261 PetscInt zs = info.zs, ze = info.zs + info.zm;
2262 PetscInt gxs = info.gxs, gxe = gxs + info.gxm;
2263 PetscInt gys = info.gys, gye = gys + info.gym;
2264 PetscInt gzs = info.gzs, gze = gzs + info.gzm;
2267 const PetscReal IBM_FLUID_THRESHOLD = 0.1;
2272 PetscInt N = mx * my * mz;
2274 VecGetLocalSize(user->
Phi, &M);
2276 MatCreateAIJ(PETSC_COMM_WORLD, M, M, N, N, 19, PETSC_NULL, 19, PETSC_NULL, &(user->
A));
2281 MatZeroEntries(user->
A);
2284 Cmpnts ***csi, ***eta, ***zet, ***icsi, ***ieta, ***izet, ***jcsi, ***jeta, ***jzet, ***kcsi, ***keta, ***kzet;
2285 PetscReal ***aj, ***iaj, ***jaj, ***kaj, ***nvert;
2286 DMDAVecGetArray(fda, user->
lCsi, &csi); DMDAVecGetArray(fda, user->
lEta, &eta); DMDAVecGetArray(fda, user->
lZet, &zet);
2287 DMDAVecGetArray(fda, user->
lICsi, &icsi); DMDAVecGetArray(fda, user->
lIEta, &ieta); DMDAVecGetArray(fda, user->
lIZet, &izet);
2288 DMDAVecGetArray(fda, user->
lJCsi, &jcsi); DMDAVecGetArray(fda, user->
lJEta, &jeta); DMDAVecGetArray(fda, user->
lJZet, &jzet);
2289 DMDAVecGetArray(fda, user->
lKCsi, &kcsi); DMDAVecGetArray(fda, user->
lKEta, &keta); DMDAVecGetArray(fda, user->
lKZet, &kzet);
2290 DMDAVecGetArray(da, user->
lAj, &aj); DMDAVecGetArray(da, user->
lIAj, &iaj); DMDAVecGetArray(da, user->
lJAj, &jaj); DMDAVecGetArray(da, user->
lKAj, &kaj);
2291 DMDAVecGetArray(da, user->
lNvert, &nvert);
2294 Vec G11, G12, G13, G21, G22, G23, G31, G32, G33;
2295 PetscReal ***g11, ***g12, ***g13, ***g21, ***g22, ***g23, ***g31, ***g32, ***g33;
2296 VecDuplicate(user->
lAj, &G11); VecDuplicate(user->
lAj, &G12); VecDuplicate(user->
lAj, &G13);
2297 VecDuplicate(user->
lAj, &G21); VecDuplicate(user->
lAj, &G22); VecDuplicate(user->
lAj, &G23);
2298 VecDuplicate(user->
lAj, &G31); VecDuplicate(user->
lAj, &G32); VecDuplicate(user->
lAj, &G33);
2299 DMDAVecGetArray(da, G11, &g11); DMDAVecGetArray(da, G12, &g12); DMDAVecGetArray(da, G13, &g13);
2300 DMDAVecGetArray(da, G21, &g21); DMDAVecGetArray(da, G22, &g22); DMDAVecGetArray(da, G23, &g23);
2301 DMDAVecGetArray(da, G31, &g31); DMDAVecGetArray(da, G32, &g32); DMDAVecGetArray(da, G33, &g33);
2307 for (k = gzs; k < gze; k++) {
2308 for (j = gys; j < gye; j++) {
2309 for (i = gxs; i < gxe; i++) {
2312 if(i>-1 && j>-1 && k>-1 && i<IM+1 && j<JM+1 && k<KM+1){
2313 g11[k][j][i] = (icsi[k][j][i].
x * icsi[k][j][i].
x + icsi[k][j][i].
y * icsi[k][j][i].
y + icsi[k][j][i].
z * icsi[k][j][i].
z) * iaj[k][j][i];
2314 g12[k][j][i] = (ieta[k][j][i].
x * icsi[k][j][i].
x + ieta[k][j][i].
y * icsi[k][j][i].
y + ieta[k][j][i].
z * icsi[k][j][i].
z) * iaj[k][j][i];
2315 g13[k][j][i] = (izet[k][j][i].
x * icsi[k][j][i].
x + izet[k][j][i].
y * icsi[k][j][i].
y + izet[k][j][i].
z * icsi[k][j][i].
z) * iaj[k][j][i];
2316 g21[k][j][i] = (jcsi[k][j][i].
x * jeta[k][j][i].
x + jcsi[k][j][i].
y * jeta[k][j][i].
y + jcsi[k][j][i].
z * jeta[k][j][i].
z) * jaj[k][j][i];
2317 g22[k][j][i] = (jeta[k][j][i].
x * jeta[k][j][i].
x + jeta[k][j][i].
y * jeta[k][j][i].
y + jeta[k][j][i].
z * jeta[k][j][i].
z) * jaj[k][j][i];
2318 g23[k][j][i] = (jzet[k][j][i].
x * jeta[k][j][i].
x + jzet[k][j][i].
y * jeta[k][j][i].
y + jzet[k][j][i].
z * jeta[k][j][i].
z) * jaj[k][j][i];
2319 g31[k][j][i] = (kcsi[k][j][i].
x * kzet[k][j][i].
x + kcsi[k][j][i].
y * kzet[k][j][i].
y + kcsi[k][j][i].
z * kzet[k][j][i].
z) * kaj[k][j][i];
2320 g32[k][j][i] = (keta[k][j][i].
x * kzet[k][j][i].
x + keta[k][j][i].
y * kzet[k][j][i].
y + keta[k][j][i].
z * kzet[k][j][i].
z) * kaj[k][j][i];
2321 g33[k][j][i] = (kzet[k][j][i].
x * kzet[k][j][i].
x + kzet[k][j][i].
y * kzet[k][j][i].
y + kzet[k][j][i].
z * kzet[k][j][i].
z) * kaj[k][j][i];
2333 PetscInt x_str, x_end, y_str, y_end, z_str, z_end;
2334 if (user->
bctype[0] == 7) { x_end = mx - 1; x_str = 0; }
2335 else { x_end = mx - 2; x_str = 1; }
2336 if (user->
bctype[2] == 7) { y_end = my - 1; y_str = 0; }
2337 else { y_end = my - 2; y_str = 1; }
2338 if (user->
bctype[4] == 7) { z_end = mz - 1; z_str = 0; }
2339 else { z_end = mz - 2; z_str = 1; }
2342 for (k = zs; k < ze; k++) {
2343 for (j = ys; j < ye; j++) {
2344 for (i = xs; i < xe; i++) {
2345 PetscScalar vol[19];
2347 PetscInt row =
Gidx(i, j, k, user);
2352 if (i == 0 || i == mx - 1 || j == 0 || j == my - 1 || k == 0 || k == mz - 1 || nvert[k][j][i] > IBM_FLUID_THRESHOLD) {
2355 MatSetValues(user->
A, 1, &row, 1, &idx[
CP], &vol[
CP], INSERT_VALUES);
2359 for (PetscInt m = 0; m < 19; m++) {
2366 if (nvert[k][j][i + 1] < IBM_FLUID_THRESHOLD && i != x_end) {
2368 vol[
CP] -= g11[k][j][i];
2369 vol[
EP] += g11[k][j][i];
2374 if ((j == my-2 && user->
bctype[2]!=7) || nvert[k][j+1][i] + nvert[k][j+1][i+1] > 0.1) {
2375 if (nvert[k][j-1][i] + nvert[k][j-1][i+1] < 0.1 && (j!=1 || (j==1 && user->
bctype[2]==7))) {
2376 vol[
CP] += g12[k][j][i] * 0.5; vol[
EP] += g12[k][j][i] * 0.5;
2377 vol[
SP] -= g12[k][j][i] * 0.5; vol[
SE] -= g12[k][j][i] * 0.5;
2380 else if ((j == my-2 || j==1) && user->
bctype[2]==7 && nvert[k][j+1][i] + nvert[k][j+1][i+1] > 0.1) {
2381 if (nvert[k][j-1][i] + nvert[k][j-1][i+1] < 0.1) {
2382 vol[
CP] += g12[k][j][i] * 0.5; vol[
EP] += g12[k][j][i] * 0.5;
2383 vol[
SP] -= g12[k][j][i] * 0.5; vol[
SE] -= g12[k][j][i] * 0.5;
2386 else if ((j == 1 && user->
bctype[2]!=7) || nvert[k][j-1][i] + nvert[k][j-1][i+1] > 0.1) {
2387 if (nvert[k][j+1][i] + nvert[k][j+1][i+1] < 0.1) {
2388 vol[
NP] += g12[k][j][i] * 0.5; vol[
NE] += g12[k][j][i] * 0.5;
2389 vol[
CP] -= g12[k][j][i] * 0.5; vol[
EP] -= g12[k][j][i] * 0.5;
2392 else if ((j == 1 || j==my-2) && user->
bctype[2]==7 && nvert[k][j-1][i] + nvert[k][j-1][i+1] > 0.1) {
2393 if (nvert[k][j+1][i] + nvert[k][j+1][i+1] < 0.1) {
2394 vol[
NP] += g12[k][j][i] * 0.5; vol[
NE] += g12[k][j][i] * 0.5;
2395 vol[
CP] -= g12[k][j][i] * 0.5; vol[
EP] -= g12[k][j][i] * 0.5;
2399 vol[
NP] += g12[k][j][i] * 0.25; vol[
NE] += g12[k][j][i] * 0.25;
2400 vol[
SP] -= g12[k][j][i] * 0.25; vol[
SE] -= g12[k][j][i] * 0.25;
2404 if ((k == mz-2 && user->
bctype[4]!=7) || nvert[k+1][j][i] + nvert[k+1][j][i+1] > 0.1) {
2405 if (nvert[k-1][j][i] + nvert[k-1][j][i+1] < 0.1 && (k!=1 || (k==1 && user->
bctype[4]==7))) {
2406 vol[
CP] += g13[k][j][i] * 0.5; vol[
EP] += g13[k][j][i] * 0.5;
2407 vol[
BP] -= g13[k][j][i] * 0.5; vol[
BE] -= g13[k][j][i] * 0.5;
2410 else if ((k == mz-2 || k==1) && user->
bctype[4]==7 && nvert[k+1][j][i] + nvert[k+1][j][i+1] > 0.1) {
2411 if (nvert[k-1][j][i] + nvert[k-1][j][i+1] < 0.1) {
2412 vol[
CP] += g13[k][j][i] * 0.5; vol[
EP] += g13[k][j][i] * 0.5;
2413 vol[
BP] -= g13[k][j][i] * 0.5; vol[
BE] -= g13[k][j][i] * 0.5;
2416 else if ((k == 1 && user->
bctype[4]!=7) || nvert[k-1][j][i] + nvert[k-1][j][i+1] > 0.1) {
2417 if (nvert[k+1][j][i] + nvert[k+1][j][i+1] < 0.1) {
2418 vol[
TP] += g13[k][j][i] * 0.5; vol[
TE] += g13[k][j][i] * 0.5;
2419 vol[
CP] -= g13[k][j][i] * 0.5; vol[
EP] -= g13[k][j][i] * 0.5;
2422 else if ((k == 1 || k==mz-2) && user->
bctype[4]==7 && nvert[k-1][j][i] + nvert[k-1][j][i+1] > 0.1) {
2423 if (nvert[k+1][j][i] + nvert[k+1][j][i+1] < 0.1) {
2424 vol[
TP] += g13[k][j][i] * 0.5; vol[
TE] += g13[k][j][i] * 0.5;
2425 vol[
CP] -= g13[k][j][i] * 0.5; vol[
EP] -= g13[k][j][i] * 0.5;
2429 vol[
TP] += g13[k][j][i] * 0.25; vol[
TE] += g13[k][j][i] * 0.25;
2430 vol[
BP] -= g13[k][j][i] * 0.25; vol[
BE] -= g13[k][j][i] * 0.25;
2437 if (nvert[k][j][i-1] < IBM_FLUID_THRESHOLD && i != x_str) {
2438 vol[
CP] -= g11[k][j][i-1];
2439 vol[
WP] += g11[k][j][i-1];
2441 if ((j == my-2 && user->
bctype[2]!=7) || nvert[k][j+1][i] + nvert[k][j+1][i-1] > 0.1) {
2442 if (nvert[k][j-1][i] + nvert[k][j-1][i-1] < 0.1 && (j!=1 || (j==1 && user->
bctype[2]==7))) {
2443 vol[
CP] -= g12[k][j][i-1] * 0.5; vol[
WP] -= g12[k][j][i-1] * 0.5;
2444 vol[
SP] += g12[k][j][i-1] * 0.5; vol[
SW] += g12[k][j][i-1] * 0.5;
2447 else if ((j == my-2 || j==1) && user->
bctype[2]==7 && nvert[k][j+1][i] + nvert[k][j+1][i-1] > 0.1) {
2448 if (nvert[k][j-1][i] + nvert[k][j-1][i-1] < 0.1) {
2449 vol[
CP] -= g12[k][j][i-1] * 0.5; vol[
WP] -= g12[k][j][i-1] * 0.5;
2450 vol[
SP] += g12[k][j][i-1] * 0.5; vol[
SW] += g12[k][j][i-1] * 0.5;
2453 else if ((j == 1 && user->
bctype[2]!=7)|| nvert[k][j-1][i] + nvert[k][j-1][i-1] > 0.1) {
2454 if (nvert[k][j+1][i] + nvert[k][j+1][i-1] < 0.1) {
2455 vol[
NP] -= g12[k][j][i-1] * 0.5; vol[
NW] -= g12[k][j][i-1] * 0.5;
2456 vol[
CP] += g12[k][j][i-1] * 0.5; vol[
WP] += g12[k][j][i-1] * 0.5;
2459 else if ((j == 1 || j==my-2) && user->
bctype[2]==7 && nvert[k][j-1][i] + nvert[k][j-1][i-1] > 0.1) {
2460 if (nvert[k][j+1][i] + nvert[k][j+1][i-1] < 0.1) {
2461 vol[
NP] -= g12[k][j][i-1] * 0.5; vol[
NW] -= g12[k][j][i-1] * 0.5;
2462 vol[
CP] += g12[k][j][i-1] * 0.5; vol[
WP] += g12[k][j][i-1] * 0.5;
2466 vol[
NP] -= g12[k][j][i-1] * 0.25; vol[
NW] -= g12[k][j][i-1] * 0.25;
2467 vol[
SP] += g12[k][j][i-1] * 0.25; vol[
SW] += g12[k][j][i-1] * 0.25;
2470 if ((k == mz-2 && user->
bctype[4]!=7) || nvert[k+1][j][i] + nvert[k+1][j][i-1] > 0.1) {
2471 if (nvert[k-1][j][i] + nvert[k-1][j][i-1] < 0.1 && (k!=1 || (k==1 && user->
bctype[4]==7))) {
2472 vol[
CP] -= g13[k][j][i-1] * 0.5; vol[
WP] -= g13[k][j][i-1] * 0.5;
2473 vol[
BP] += g13[k][j][i-1] * 0.5; vol[
BW] += g13[k][j][i-1] * 0.5;
2476 else if ((k == mz-2 || k==1) && user->
bctype[4]==7 && nvert[k+1][j][i] + nvert[k+1][j][i-1] > 0.1) {
2477 if (nvert[k-1][j][i] + nvert[k-1][j][i-1] < 0.1) {
2478 vol[
CP] -= g13[k][j][i-1] * 0.5; vol[
WP] -= g13[k][j][i-1] * 0.5;
2479 vol[
BP] += g13[k][j][i-1] * 0.5; vol[
BW] += g13[k][j][i-1] * 0.5;
2482 else if ((k == 1 && user->
bctype[4]!=7) || nvert[k-1][j][i] + nvert[k-1][j][i-1] > 0.1) {
2483 if (nvert[k+1][j][i] + nvert[k+1][j][i-1] < 0.1) {
2484 vol[
TP] -= g13[k][j][i-1] * 0.5; vol[
TW] -= g13[k][j][i-1] * 0.5;
2485 vol[
CP] += g13[k][j][i-1] * 0.5; vol[
WP] += g13[k][j][i-1] * 0.5;
2488 else if ((k == 1 || k==mz-2) && user->
bctype[4]==7 && nvert[k-1][j][i] + nvert[k-1][j][i-1] > 0.1) {
2489 if (nvert[k+1][j][i] + nvert[k+1][j][i-1] < 0.1) {
2490 vol[
TP] -= g13[k][j][i-1] * 0.5; vol[
TW] -= g13[k][j][i-1] * 0.5;
2491 vol[
CP] += g13[k][j][i-1] * 0.5; vol[
WP] += g13[k][j][i-1] * 0.5;
2495 vol[
TP] -= g13[k][j][i-1] * 0.25; vol[
TW] -= g13[k][j][i-1] * 0.25;
2496 vol[
BP] += g13[k][j][i-1] * 0.25; vol[
BW] += g13[k][j][i-1] * 0.25;
2503 if (nvert[k][j+1][i] < IBM_FLUID_THRESHOLD && j != y_end) {
2504 if ((i == mx-2 && user->
bctype[0]!=7)|| nvert[k][j][i+1] + nvert[k][j+1][i+1] > 0.1) {
2505 if (nvert[k][j][i-1] + nvert[k][j+1][i-1] < 0.1 && (i!=1 || (i==1 && user->
bctype[0]==7))) {
2506 vol[
CP] += g21[k][j][i] * 0.5; vol[
NP] += g21[k][j][i] * 0.5;
2507 vol[
WP] -= g21[k][j][i] * 0.5; vol[
NW] -= g21[k][j][i] * 0.5;
2510 else if ((i == mx-2 || i==1) && user->
bctype[0]==7 && nvert[k][j][i+1] + nvert[k][j+1][i+1] > 0.1) {
2511 if (nvert[k][j][i-1] + nvert[k][j+1][i-1] < 0.1) {
2512 vol[
CP] += g21[k][j][i] * 0.5; vol[
NP] += g21[k][j][i] * 0.5;
2513 vol[
WP] -= g21[k][j][i] * 0.5; vol[
NW] -= g21[k][j][i] * 0.5;
2516 else if ((i == 1 && user->
bctype[0]!=7) || nvert[k][j][i-1] + nvert[k][j+1][i-1] > 0.1) {
2517 if (nvert[k][j][i+1] + nvert[k][j+1][i+1] < 0.1) {
2518 vol[
EP] += g21[k][j][i] * 0.5; vol[
NE] += g21[k][j][i] * 0.5;
2519 vol[
CP] -= g21[k][j][i] * 0.5; vol[
NP] -= g21[k][j][i] * 0.5;
2522 else if ((i == 1 || i==mx-2) && user->
bctype[0]==7 && nvert[k][j][i-1] + nvert[k][j+1][i-1] > 0.1) {
2523 if (nvert[k][j][i+1] + nvert[k][j+1][i+1] < 0.1) {
2524 vol[
EP] += g21[k][j][i] * 0.5; vol[
NE] += g21[k][j][i] * 0.5;
2525 vol[
CP] -= g21[k][j][i] * 0.5; vol[
NP] -= g21[k][j][i] * 0.5;
2529 vol[
EP] += g21[k][j][i] * 0.25; vol[
NE] += g21[k][j][i] * 0.25;
2530 vol[
WP] -= g21[k][j][i] * 0.25; vol[
NW] -= g21[k][j][i] * 0.25;
2533 vol[
CP] -= g22[k][j][i];
2534 vol[
NP] += g22[k][j][i];
2536 if ((k == mz-2 && user->
bctype[4]!=7)|| nvert[k+1][j][i] + nvert[k+1][j+1][i] > 0.1) {
2537 if (nvert[k-1][j][i] + nvert[k-1][j+1][i] < 0.1 && (k!=1 || (k==1 && user->
bctype[4]==7))) {
2538 vol[
CP] += g23[k][j][i] * 0.5; vol[
NP] += g23[k][j][i] * 0.5;
2539 vol[
BP] -= g23[k][j][i] * 0.5; vol[
BN] -= g23[k][j][i] * 0.5;
2542 else if ((k == mz-2 || k==1 ) && user->
bctype[4]==7 && nvert[k+1][j][i] + nvert[k+1][j+1][i] > 0.1) {
2543 if (nvert[k-1][j][i] + nvert[k-1][j+1][i] < 0.1) {
2544 vol[
CP] += g23[k][j][i] * 0.5; vol[
NP] += g23[k][j][i] * 0.5;
2545 vol[
BP] -= g23[k][j][i] * 0.5; vol[
BN] -= g23[k][j][i] * 0.5;
2548 else if ((k == 1 && user->
bctype[4]!=7)|| nvert[k-1][j][i] + nvert[k-1][j+1][i] > 0.1) {
2549 if (nvert[k+1][j][i] + nvert[k+1][j+1][i] < 0.1) {
2550 vol[
TP] += g23[k][j][i] * 0.5; vol[
TN] += g23[k][j][i] * 0.5;
2551 vol[
CP] -= g23[k][j][i] * 0.5; vol[
NP] -= g23[k][j][i] * 0.5;
2554 else if ((k == 1 || k==mz-2 ) && user->
bctype[4]==7 && nvert[k-1][j][i] + nvert[k-1][j+1][i] > 0.1) {
2555 if (nvert[k+1][j][i] + nvert[k+1][j+1][i] < 0.1) {
2556 vol[
TP] += g23[k][j][i] * 0.5; vol[
TN] += g23[k][j][i] * 0.5;
2557 vol[
CP] -= g23[k][j][i] * 0.5; vol[
NP] -= g23[k][j][i] * 0.5;
2561 vol[
TP] += g23[k][j][i] * 0.25; vol[
TN] += g23[k][j][i] * 0.25;
2562 vol[
BP] -= g23[k][j][i] * 0.25; vol[
BN] -= g23[k][j][i] * 0.25;
2569 if (nvert[k][j-1][i] < IBM_FLUID_THRESHOLD && j != y_str) {
2570 if ((i == mx-2 && user->
bctype[0]!=7) || nvert[k][j][i+1] + nvert[k][j-1][i+1] > 0.1) {
2571 if (nvert[k][j][i-1] + nvert[k][j-1][i-1] < 0.1 && (i!=1 || (i==1 && user->
bctype[0]==7))) {
2572 vol[
CP] -= g21[k][j-1][i] * 0.5; vol[
SP] -= g21[k][j-1][i] * 0.5;
2573 vol[
WP] += g21[k][j-1][i] * 0.5; vol[
SW] += g21[k][j-1][i] * 0.5;
2576 else if ((i == mx-2 || i==1) && user->
bctype[0]==7 && nvert[k][j][i+1] + nvert[k][j-1][i+1] > 0.1) {
2577 if (nvert[k][j][i-1] + nvert[k][j-1][i-1] < 0.1) {
2578 vol[
CP] -= g21[k][j-1][i] * 0.5; vol[
SP] -= g21[k][j-1][i] * 0.5;
2579 vol[
WP] += g21[k][j-1][i] * 0.5; vol[
SW] += g21[k][j-1][i] * 0.5;
2582 else if ((i == 1 && user->
bctype[0]!=7)|| nvert[k][j][i-1] + nvert[k][j-1][i-1] > 0.1) {
2583 if (nvert[k][j][i+1] + nvert[k][j-1][i+1] < 0.1) {
2584 vol[
EP] -= g21[k][j-1][i] * 0.5; vol[
SE] -= g21[k][j-1][i] * 0.5;
2585 vol[
CP] += g21[k][j-1][i] * 0.5; vol[
SP] += g21[k][j-1][i] * 0.5;
2588 else if ((i == 1 || i==mx-2) && user->
bctype[0]==7 && nvert[k][j][i-1] + nvert[k][j-1][i-1] > 0.1) {
2589 if (nvert[k][j][i+1] + nvert[k][j-1][i+1] < 0.1) {
2590 vol[
EP] -= g21[k][j-1][i] * 0.5; vol[
SE] -= g21[k][j-1][i] * 0.5;
2591 vol[
CP] += g21[k][j-1][i] * 0.5; vol[
SP] += g21[k][j-1][i] * 0.5;
2595 vol[
EP] -= g21[k][j-1][i] * 0.25; vol[
SE] -= g21[k][j-1][i] * 0.25;
2596 vol[
WP] += g21[k][j-1][i] * 0.25; vol[
SW] += g21[k][j-1][i] * 0.25;
2599 vol[
CP] -= g22[k][j-1][i];
2600 vol[
SP] += g22[k][j-1][i];
2602 if ((k == mz-2 && user->
bctype[4]!=7)|| nvert[k+1][j][i] + nvert[k+1][j-1][i] > 0.1) {
2603 if (nvert[k-1][j][i] + nvert[k-1][j-1][i] < 0.1 && (k!=1 || (k==1 && user->
bctype[4]==7))) {
2604 vol[
CP] -= g23[k][j-1][i] * 0.5; vol[
SP] -= g23[k][j-1][i] * 0.5;
2605 vol[
BP] += g23[k][j-1][i] * 0.5; vol[
BS] += g23[k][j-1][i] * 0.5;
2608 else if ((k == mz-2 || k==1) && user->
bctype[4]==7 && nvert[k+1][j][i] + nvert[k+1][j-1][i] > 0.1) {
2609 if (nvert[k-1][j][i] + nvert[k-1][j-1][i] < 0.1 ) {
2610 vol[
CP] -= g23[k][j-1][i] * 0.5; vol[
SP] -= g23[k][j-1][i] * 0.5;
2611 vol[
BP] += g23[k][j-1][i] * 0.5; vol[
BS] += g23[k][j-1][i] * 0.5;
2614 else if ((k == 1 && user->
bctype[4]!=7)|| nvert[k-1][j][i] + nvert[k-1][j-1][i] > 0.1) {
2615 if (nvert[k+1][j][i] + nvert[k+1][j-1][i] < 0.1) {
2616 vol[
TP] -= g23[k][j-1][i] * 0.5; vol[
TS] -= g23[k][j-1][i] * 0.5;
2617 vol[
CP] += g23[k][j-1][i] * 0.5; vol[
SP] += g23[k][j-1][i] * 0.5;
2620 else if ((k == 1 || k==mz-2) && user->
bctype[4]==7 && nvert[k-1][j][i] + nvert[k-1][j-1][i] > 0.1) {
2621 if (nvert[k+1][j][i] + nvert[k+1][j-1][i] < 0.1) {
2622 vol[
TP] -= g23[k][j-1][i] * 0.5; vol[
TS] -= g23[k][j-1][i] * 0.5;
2623 vol[
CP] += g23[k][j-1][i] * 0.5; vol[
SP] += g23[k][j-1][i] * 0.5;
2627 vol[
TP] -= g23[k][j-1][i] * 0.25; vol[
TS] -= g23[k][j-1][i] * 0.25;
2628 vol[
BP] += g23[k][j-1][i] * 0.25; vol[
BS] += g23[k][j-1][i] * 0.25;
2635 if (nvert[k+1][j][i] < IBM_FLUID_THRESHOLD && k != z_end) {
2636 if ((i == mx-2 && user->
bctype[0]!=7)|| nvert[k][j][i+1] + nvert[k+1][j][i+1] > 0.1) {
2637 if (nvert[k][j][i-1] + nvert[k+1][j][i-1] < 0.1 && (i!=1 || (i==1 && user->
bctype[0]==7))) {
2638 vol[
CP] += g31[k][j][i] * 0.5; vol[
TP] += g31[k][j][i] * 0.5;
2639 vol[
WP] -= g31[k][j][i] * 0.5; vol[
TW] -= g31[k][j][i] * 0.5;
2642 else if ((i == mx-2 || i==1) && user->
bctype[0]==7 && nvert[k][j][i+1] + nvert[k+1][j][i+1] > 0.1) {
2643 if (nvert[k][j][i-1] + nvert[k+1][j][i-1] < 0.1) {
2644 vol[
CP] += g31[k][j][i] * 0.5; vol[
TP] += g31[k][j][i] * 0.5;
2645 vol[
WP] -= g31[k][j][i] * 0.5; vol[
TW] -= g31[k][j][i] * 0.5;
2648 else if ((i == 1 && user->
bctype[0]!=7)|| nvert[k][j][i-1] + nvert[k+1][j][i-1] > 0.1) {
2649 if (nvert[k][j][i+1] + nvert[k+1][j][i+1] < 0.1) {
2650 vol[
EP] += g31[k][j][i] * 0.5; vol[
TE] += g31[k][j][i] * 0.5;
2651 vol[
CP] -= g31[k][j][i] * 0.5; vol[
TP] -= g31[k][j][i] * 0.5;
2654 else if ((i == 1 || i==mx-2) && user->
bctype[0]==7 && nvert[k][j][i-1] + nvert[k+1][j][i-1] > 0.1) {
2655 if (nvert[k][j][i+1] + nvert[k+1][j][i+1] < 0.1) {
2656 vol[
EP] += g31[k][j][i] * 0.5; vol[
TE] += g31[k][j][i] * 0.5;
2657 vol[
CP] -= g31[k][j][i] * 0.5; vol[
TP] -= g31[k][j][i] * 0.5;
2661 vol[
EP] += g31[k][j][i] * 0.25; vol[
TE] += g31[k][j][i] * 0.25;
2662 vol[
WP] -= g31[k][j][i] * 0.25; vol[
TW] -= g31[k][j][i] * 0.25;
2665 if ((j == my-2 && user->
bctype[2]!=7)|| nvert[k][j+1][i] + nvert[k+1][j+1][i] > 0.1) {
2666 if (nvert[k][j-1][i] + nvert[k+1][j-1][i] < 0.1 && (j!=1 || (j==1 && user->
bctype[2]==7))) {
2667 vol[
CP] += g32[k][j][i] * 0.5; vol[
TP] += g32[k][j][i] * 0.5;
2668 vol[
SP] -= g32[k][j][i] * 0.5; vol[
TS] -= g32[k][j][i] * 0.5;
2671 else if ((j == my-2 || j==1) && user->
bctype[2]==7 && nvert[k][j+1][i] + nvert[k+1][j+1][i] > 0.1) {
2672 if (nvert[k][j-1][i] + nvert[k+1][j-1][i] < 0.1) {
2673 vol[
CP] += g32[k][j][i] * 0.5; vol[
TP] += g32[k][j][i] * 0.5;
2674 vol[
SP] -= g32[k][j][i] * 0.5; vol[
TS] -= g32[k][j][i] * 0.5;
2677 else if ((j == 1 && user->
bctype[2]!=7)|| nvert[k][j-1][i] + nvert[k+1][j-1][i] > 0.1) {
2678 if (nvert[k][j+1][i] + nvert[k+1][j+1][i] < 0.1) {
2679 vol[
NP] += g32[k][j][i] * 0.5; vol[
TN] += g32[k][j][i] * 0.5;
2680 vol[
CP] -= g32[k][j][i] * 0.5; vol[
TP] -= g32[k][j][i] * 0.5;
2683 else if ((j == 1 || j==my-2) && user->
bctype[2]==7 && nvert[k][j-1][i] + nvert[k+1][j-1][i] > 0.1) {
2684 if (nvert[k][j+1][i] + nvert[k+1][j+1][i] < 0.1) {
2685 vol[
NP] += g32[k][j][i] * 0.5; vol[
TN] += g32[k][j][i] * 0.5;
2686 vol[
CP] -= g32[k][j][i] * 0.5; vol[
TP] -= g32[k][j][i] * 0.5;
2690 vol[
NP] += g32[k][j][i] * 0.25; vol[
TN] += g32[k][j][i] * 0.25;
2691 vol[
SP] -= g32[k][j][i] * 0.25; vol[
TS] -= g32[k][j][i] * 0.25;
2694 vol[
CP] -= g33[k][j][i];
2695 vol[
TP] += g33[k][j][i];
2701 if (nvert[k-1][j][i] < IBM_FLUID_THRESHOLD && k != z_str) {
2702 if ((i == mx-2 && user->
bctype[0]!=7)|| nvert[k][j][i+1] + nvert[k-1][j][i+1] > 0.1) {
2703 if (nvert[k][j][i-1] + nvert[k-1][j][i-1] < 0.1 && (i!=1 || (i==1 && user->
bctype[0]==7))) {
2704 vol[
CP] -= g31[k-1][j][i] * 0.5; vol[
BP] -= g31[k-1][j][i] * 0.5;
2705 vol[
WP] += g31[k-1][j][i] * 0.5; vol[
BW] += g31[k-1][j][i] * 0.5;
2708 else if ((i == mx-2 || i==1) && user->
bctype[0]==7 && nvert[k][j][i+1] + nvert[k-1][j][i+1] > 0.1) {
2709 if (nvert[k][j][i-1] + nvert[k-1][j][i-1] < 0.1) {
2710 vol[
CP] -= g31[k-1][j][i] * 0.5; vol[
BP] -= g31[k-1][j][i] * 0.5;
2711 vol[
WP] += g31[k-1][j][i] * 0.5; vol[
BW] += g31[k-1][j][i] * 0.5;
2714 else if ((i == 1 && user->
bctype[0]!=7)|| nvert[k][j][i-1] + nvert[k-1][j][i-1] > 0.1) {
2715 if (nvert[k][j][i+1] + nvert[k-1][j][i+1] < 0.1) {
2716 vol[
EP] -= g31[k-1][j][i] * 0.5; vol[
BE] -= g31[k-1][j][i] * 0.5;
2717 vol[
CP] += g31[k-1][j][i] * 0.5; vol[
BP] += g31[k-1][j][i] * 0.5;
2720 else if ((i == 1 || i==mx-2) && user->
bctype[0]==7 && nvert[k][j][i-1] + nvert[k-1][j][i-1] > 0.1) {
2721 if (nvert[k][j][i+1] + nvert[k-1][j][i+1] < 0.1) {
2722 vol[
EP] -= g31[k-1][j][i] * 0.5; vol[
BE] -= g31[k-1][j][i] * 0.5;
2723 vol[
CP] += g31[k-1][j][i] * 0.5; vol[
BP] += g31[k-1][j][i] * 0.5;
2727 vol[
EP] -= g31[k-1][j][i] * 0.25; vol[
BE] -= g31[k-1][j][i] * 0.25;
2728 vol[
WP] += g31[k-1][j][i] * 0.25; vol[
BW] += g31[k-1][j][i] * 0.25;
2731 if ((j == my-2 && user->
bctype[2]!=7)|| nvert[k][j+1][i] + nvert[k-1][j+1][i] > 0.1) {
2732 if (nvert[k][j-1][i] + nvert[k-1][j-1][i] < 0.1 && (j!=1 || (j==1 && user->
bctype[2]==7))) {
2733 vol[
CP] -= g32[k-1][j][i] * 0.5; vol[
BP] -= g32[k-1][j][i] * 0.5;
2734 vol[
SP] += g32[k-1][j][i] * 0.5; vol[
BS] += g32[k-1][j][i] * 0.5;
2737 else if ((j == my-2 || j==1) && user->
bctype[2]==7 && nvert[k][j+1][i] + nvert[k-1][j+1][i] > 0.1) {
2738 if (nvert[k][j-1][i] + nvert[k-1][j-1][i] < 0.1) {
2739 vol[
CP] -= g32[k-1][j][i] * 0.5; vol[
BP] -= g32[k-1][j][i] * 0.5;
2740 vol[
SP] += g32[k-1][j][i] * 0.5; vol[
BS] += g32[k-1][j][i] * 0.5;
2743 else if ((j == 1 && user->
bctype[2]!=7)|| nvert[k][j-1][i] + nvert[k-1][j-1][i] > 0.1) {
2744 if (nvert[k][j+1][i] + nvert[k-1][j+1][i] < 0.1) {
2745 vol[
NP] -= g32[k-1][j][i] * 0.5; vol[
BN] -= g32[k-1][j][i] * 0.5;
2746 vol[
CP] += g32[k-1][j][i] * 0.5; vol[
BP] += g32[k-1][j][i] * 0.5;
2749 else if ((j == 1 || j==my-2) && user->
bctype[2]==7 && nvert[k][j-1][i] + nvert[k-1][j-1][i] > 0.1) {
2750 if (nvert[k][j+1][i] + nvert[k-1][j+1][i] < 0.1) {
2751 vol[
NP] -= g32[k-1][j][i] * 0.5; vol[
BN] -= g32[k-1][j][i] * 0.5;
2752 vol[
CP] += g32[k-1][j][i] * 0.5; vol[
BP] += g32[k-1][j][i] * 0.5;
2756 vol[
NP] -= g32[k-1][j][i] * 0.25; vol[
BN] -= g32[k-1][j][i] * 0.25;
2757 vol[
SP] += g32[k-1][j][i] * 0.25; vol[
BS] += g32[k-1][j][i] * 0.25;
2760 vol[
CP] -= g33[k-1][j][i];
2761 vol[
BP] += g33[k-1][j][i];
2767 for (PetscInt m = 0; m < 19; m++) {
2768 vol[m] *= -aj[k][j][i];
2772 idx[
CP] =
Gidx(i, j, k, user);
2773 if (user->
bctype[0]==7 && i==mx-2) idx[
EP] =
Gidx(1, j, k, user);
else idx[
EP] =
Gidx(i+1, j, k, user);
2774 if (user->
bctype[0]==7 && i==1) idx[
WP] =
Gidx(mx-2, j, k, user);
else idx[
WP] =
Gidx(i-1, j, k, user);
2775 if (user->
bctype[2]==7 && j==my-2) idx[
NP] =
Gidx(i, 1, k, user);
else idx[
NP] =
Gidx(i, j+1, k, user);
2776 if (user->
bctype[2]==7 && j==1) idx[
SP] =
Gidx(i, my-2, k, user);
else idx[
SP] =
Gidx(i, j-1, k, user);
2777 if (user->
bctype[4]==7 && k==mz-2) idx[
TP] =
Gidx(i, j, 1, user);
else idx[
TP] =
Gidx(i, j, k+1, user);
2778 if (user->
bctype[4]==7 && k==1) idx[
BP] =
Gidx(i, j, mz-2, user);
else idx[
BP] =
Gidx(i, j, k-1, user);
2779 if (user->
bctype[0]==7 && user->
bctype[2]==7 && i==mx-2 && j==my-2) idx[
NE] =
Gidx(1, 1, k, user);
else if (user->
bctype[0]==7 && i==mx-2) idx[
NE] =
Gidx(1, j+1, k, user);
else if (user->
bctype[2]==7 && j==my-2) idx[
NE] =
Gidx(i+1, 1, k, user);
else idx[
NE] =
Gidx(i+1, j+1, k, user);
2780 if (user->
bctype[0]==7 && user->
bctype[2]==7 && i==mx-2 && j==1) idx[
SE] =
Gidx(1, my-2, k, user);
else if (user->
bctype[0]==7 && i==mx-2) idx[
SE] =
Gidx(1, j-1, k, user);
else if (user->
bctype[2]==7 && j==1) idx[
SE] =
Gidx(i+1, my-2, k, user);
else idx[
SE] =
Gidx(i+1, j-1, k, user);
2781 if (user->
bctype[0]==7 && user->
bctype[2]==7 && i==1 && j==my-2) idx[
NW] =
Gidx(mx-2, 1, k, user);
else if (user->
bctype[0]==7 && i==1) idx[
NW] =
Gidx(mx-2, j+1, k, user);
else if (user->
bctype[2]==7 && j==my-2) idx[
NW] =
Gidx(i-1, 1, k, user);
else idx[
NW] =
Gidx(i-1, j+1, k, user);
2782 if (user->
bctype[0]==7 && user->
bctype[2]==7 && i==1 && j==1) idx[
SW] =
Gidx(mx-2, my-2, k, user);
else if (user->
bctype[0]==7 && i==1) idx[
SW] =
Gidx(mx-2, j-1, k, user);
else if (user->
bctype[2]==7 && j==1) idx[
SW] =
Gidx(i-1, my-2, k, user);
else idx[
SW] =
Gidx(i-1, j-1, k, user);
2783 if (user->
bctype[2]==7 && user->
bctype[4]==7 && j==my-2 && k==mz-2) idx[
TN] =
Gidx(i, 1, 1, user);
else if (user->
bctype[2]==7 && j==my-2) idx[
TN] =
Gidx(i, 1, k+1, user);
else if (user->
bctype[4]==7 && k==mz-2) idx[
TN] =
Gidx(i, j+1, 1, user);
else idx[
TN] =
Gidx(i, j+1, k+1, user);
2784 if (user->
bctype[2]==7 && user->
bctype[4]==7 && j==my-2 && k==1) idx[
BN] =
Gidx(i, 1, mz-2, user);
else if(user->
bctype[2]==7 && j==my-2) idx[
BN] =
Gidx(i, 1, k-1, user);
else if (user->
bctype[4]==7 && k==1) idx[
BN] =
Gidx(i, j+1, mz-2, user);
else idx[
BN] =
Gidx(i, j+1, k-1, user);
2785 if (user->
bctype[2]==7 && user->
bctype[4]==7 && j==1 && k==mz-2) idx[
TS] =
Gidx(i, my-2, 1, user);
else if (user->
bctype[2]==7 && j==1) idx[
TS] =
Gidx(i, my-2, k+1, user);
else if (user->
bctype[4]==7 && k==mz-2) idx[
TS] =
Gidx(i, j-1, 1, user);
else idx[
TS] =
Gidx(i, j-1, k+1, user);
2786 if (user->
bctype[2]==7 && user->
bctype[4]==7 && j==1 && k==1) idx[
BS] =
Gidx(i, my-2, mz-2, user);
else if (user->
bctype[2]==7 && j==1) idx[
BS] =
Gidx(i, my-2, k-1, user);
else if (user->
bctype[4]==7 && k==1) idx[
BS] =
Gidx(i, j-1, mz-2, user);
else idx[
BS] =
Gidx(i, j-1, k-1, user);
2787 if (user->
bctype[0]==7 && user->
bctype[4]==7 && i==mx-2 && k==mz-2) idx[
TE] =
Gidx(1, j, 1, user);
else if(user->
bctype[0]==7 && i==mx-2) idx[
TE] =
Gidx(1, j, k+1, user);
else if(user->
bctype[4]==7 && k==mz-2) idx[
TE] =
Gidx(i+1, j, 1, user);
else idx[
TE] =
Gidx(i+1, j, k+1, user);
2788 if (user->
bctype[0]==7 && user->
bctype[4]==7 && i==mx-2 && k==1) idx[
BE] =
Gidx(1, j, mz-2, user);
else if(user->
bctype[0]==7 && i==mx-2) idx[
BE] =
Gidx(1, j, k-1, user);
else if(user->
bctype[4]==7 && k==1) idx[
BE] =
Gidx(i+1, j, mz-2, user);
else idx[
BE] =
Gidx(i+1, j, k-1, user);
2789 if (user->
bctype[0]==7 && user->
bctype[4]==7 && i==1 && k==mz-2) idx[
TW] =
Gidx(mx-2, j, 1, user);
else if(user->
bctype[0]==7 && i==1) idx[
TW] =
Gidx(mx-2, j, k+1, user);
else if (user->
bctype[4]==7 && k==mz-2) idx[
TW] =
Gidx(i-1, j, 1, user);
else idx[
TW] =
Gidx(i-1, j, k+1, user);
2790 if (user->
bctype[0]==7 && user->
bctype[4]==7 && i==1 && k==1) idx[
BW] =
Gidx(mx-2, j, mz-2, user);
else if (user->
bctype[0]==7 && i==1) idx[
BW] =
Gidx(mx-2, j, k-1, user);
else if (user->
bctype[4]==7 && k==1) idx[
BW] =
Gidx(i-1, j, mz-2, user);
else idx[
BW] =
Gidx(i-1, j, k-1, user);
2793 MatSetValues(user->
A, 1, &row, 19, idx, vol, INSERT_VALUES);
2804 MatAssemblyBegin(user->
A, MAT_FINAL_ASSEMBLY);
2805 MatAssemblyEnd(user->
A, MAT_FINAL_ASSEMBLY);
2809 ierr = MatNorm(user->
A,NORM_INFINITY,&max_A);CHKERRQ(ierr);
2818 DMDAVecRestoreArray(da, G11, &g11); DMDAVecRestoreArray(da, G12, &g12); DMDAVecRestoreArray(da, G13, &g13);
2819 DMDAVecRestoreArray(da, G21, &g21); DMDAVecRestoreArray(da, G22, &g22); DMDAVecRestoreArray(da, G23, &g23);
2820 DMDAVecRestoreArray(da, G31, &g31); DMDAVecRestoreArray(da, G32, &g32); DMDAVecRestoreArray(da, G33, &g33);
2822 VecDestroy(&G11); VecDestroy(&G12); VecDestroy(&G13);
2823 VecDestroy(&G21); VecDestroy(&G22); VecDestroy(&G23);
2824 VecDestroy(&G31); VecDestroy(&G32); VecDestroy(&G33);
2826 DMDAVecRestoreArray(fda, user->
lCsi, &csi); DMDAVecRestoreArray(fda, user->
lEta, &eta); DMDAVecRestoreArray(fda, user->
lZet, &zet);
2827 DMDAVecRestoreArray(fda, user->
lICsi, &icsi); DMDAVecRestoreArray(fda, user->
lIEta, &ieta); DMDAVecRestoreArray(fda, user->
lIZet, &izet);
2828 DMDAVecRestoreArray(fda, user->
lJCsi, &jcsi); DMDAVecRestoreArray(fda, user->
lJEta, &jeta); DMDAVecRestoreArray(fda, user->
lJZet, &jzet);
2829 DMDAVecRestoreArray(fda, user->
lKCsi, &kcsi); DMDAVecRestoreArray(fda, user->
lKEta, &keta); DMDAVecRestoreArray(fda, user->
lKZet, &kzet);
2830 DMDAVecRestoreArray(da, user->
lAj, &aj); DMDAVecRestoreArray(da, user->
lIAj, &iaj); DMDAVecRestoreArray(da, user->
lJAj, &jaj); DMDAVecRestoreArray(da, user->
lKAj, &kaj);
2831 DMDAVecRestoreArray(da, user->
lNvert, &nvert);
2834 PetscFunctionReturn(0);
2915 PetscReal *ibm_Area, PetscInt flg)
2926 DM da = user->
da, fda = user->
fda;
2928 DMDALocalInfo info = user->
info;
2930 PetscInt xs = info.xs, xe = info.xs + info.xm;
2931 PetscInt ys = info.ys, ye = info.ys + info.ym;
2932 PetscInt zs = info.zs, ze = info.zs + info.zm;
2933 PetscInt mx = info.mx, my = info.my, mz = info.mz;
2936 PetscInt lxs, lys, lzs, lxe, lye, lze;
2942 if (xs==0) lxs = xs+1;
2943 if (ys==0) lys = ys+1;
2944 if (zs==0) lzs = zs+1;
2946 if (xe==mx) lxe = xe-1;
2947 if (ye==my) lye = ye-1;
2948 if (ze==mz) lze = ze-1;
2950 PetscReal ***nvert, ibmval=1.5;
2951 Cmpnts ***ucor, ***csi, ***eta, ***zet;
2952 DMDAVecGetArray(fda, user->
Ucont, &ucor);
2953 DMDAVecGetArray(fda, user->
lCsi, &csi);
2954 DMDAVecGetArray(fda, user->
lEta, &eta);
2955 DMDAVecGetArray(fda, user->
lZet, &zet);
2956 DMDAVecGetArray(da, user->
lNvert, &nvert);
2958 PetscReal libm_Flux, libm_area;
2961 for (k=lzs; k<lze; k++) {
2962 for (j=lys; j<lye; j++) {
2963 for (i=lxs; i<lxe; i++) {
2964 if (nvert[k][j][i] < 0.1) {
2965 if (nvert[k][j][i+1] > ibmval-0.4 && nvert[k][j][i+1] < ibmval && i < mx-2) {
2966 libm_Flux += ucor[k][j][i].
x;
2967 libm_area += sqrt(csi[k][j][i].x * csi[k][j][i].x +
2968 csi[k][j][i].y * csi[k][j][i].y +
2969 csi[k][j][i].z * csi[k][j][i].z);
2972 if (nvert[k][j+1][i] > ibmval-0.4 && nvert[k][j+1][i] < ibmval && j < my-2) {
2973 libm_Flux += ucor[k][j][i].
y;
2974 libm_area += sqrt(eta[k][j][i].x * eta[k][j][i].x +
2975 eta[k][j][i].y * eta[k][j][i].y +
2976 eta[k][j][i].z * eta[k][j][i].z);
2978 if (nvert[k+1][j][i] > ibmval-0.4 && nvert[k+1][j][i] < ibmval && k < mz-2) {
2979 libm_Flux += ucor[k][j][i].
z;
2980 libm_area += sqrt(zet[k][j][i].x * zet[k][j][i].x +
2981 zet[k][j][i].y * zet[k][j][i].y +
2982 zet[k][j][i].z * zet[k][j][i].z);
2986 if (nvert[k][j][i] > ibmval-0.4 && nvert[k][j][i] < ibmval) {
2987 if (nvert[k][j][i+1] < 0.1 && i < mx-2) {
2988 libm_Flux -= ucor[k][j][i].
x;
2989 libm_area += sqrt(csi[k][j][i].x * csi[k][j][i].x +
2990 csi[k][j][i].y * csi[k][j][i].y +
2991 csi[k][j][i].z * csi[k][j][i].z);
2994 if (nvert[k][j+1][i] < 0.1 && j < my-2) {
2995 libm_Flux -= ucor[k][j][i].
y;
2996 libm_area += sqrt(eta[k][j][i].x * eta[k][j][i].x +
2997 eta[k][j][i].y * eta[k][j][i].y +
2998 eta[k][j][i].z * eta[k][j][i].z);
3000 if (nvert[k+1][j][i] < 0.1 && k < mz-2) {
3001 libm_Flux -= ucor[k][j][i].
z;
3002 libm_area += sqrt(zet[k][j][i].x * zet[k][j][i].x +
3003 zet[k][j][i].y * zet[k][j][i].y +
3004 zet[k][j][i].z * zet[k][j][i].z);
3012 MPI_Allreduce(&libm_Flux, ibm_Flux,1,MPI_DOUBLE,MPI_SUM, PETSC_COMM_WORLD);
3013 MPI_Allreduce(&libm_area, ibm_Area,1,MPI_DOUBLE,MPI_SUM, PETSC_COMM_WORLD);
3017 PetscPrintf(PETSC_COMM_WORLD,
"IBMFlux REV %le %le\n", *ibm_Flux, *ibm_Area);
3019 PetscReal correction;
3021 if (*ibm_Area > 1.e-15) {
3023 correction = (*ibm_Flux + user->
FluxIntpSum) / *ibm_Area;
3025 correction = *ibm_Flux / *ibm_Area;
3031 for (k=lzs; k<lze; k++) {
3032 for (j=lys; j<lye; j++) {
3033 for (i=lxs; i<lxe; i++) {
3034 if (nvert[k][j][i] < 0.1) {
3035 if (nvert[k][j][i+1] > ibmval-0.4 && nvert[k][j][i+1] < ibmval && i < mx-2) {
3036 ucor[k][j][i].
x -= sqrt(csi[k][j][i].x * csi[k][j][i].x +
3037 csi[k][j][i].y * csi[k][j][i].y +
3038 csi[k][j][i].z * csi[k][j][i].z) *
3042 if (nvert[k][j+1][i] > ibmval-0.4 && nvert[k][j+1][i] < ibmval && j < my-2) {
3043 ucor[k][j][i].
y -= sqrt(eta[k][j][i].x * eta[k][j][i].x +
3044 eta[k][j][i].y * eta[k][j][i].y +
3045 eta[k][j][i].z * eta[k][j][i].z) *
3048 if (nvert[k+1][j][i] > ibmval-0.4 && nvert[k+1][j][i] < ibmval && k < mz-2) {
3049 ucor[k][j][i].
z -= sqrt(zet[k][j][i].x * zet[k][j][i].x +
3050 zet[k][j][i].y * zet[k][j][i].y +
3051 zet[k][j][i].z * zet[k][j][i].z) *
3056 if (nvert[k][j][i] > ibmval-0.4 && nvert[k][j][i] < ibmval) {
3057 if (nvert[k][j][i+1] < 0.1 && i < mx-2) {
3058 ucor[k][j][i].
x += sqrt(csi[k][j][i].x * csi[k][j][i].x +
3059 csi[k][j][i].y * csi[k][j][i].y +
3060 csi[k][j][i].z * csi[k][j][i].z) *
3064 if (nvert[k][j+1][i] < 0.1 && j < my-2) {
3065 ucor[k][j][i].
y += sqrt(eta[k][j][i].x * eta[k][j][i].x +
3066 eta[k][j][i].y * eta[k][j][i].y +
3067 eta[k][j][i].z * eta[k][j][i].z) *
3070 if (nvert[k+1][j][i] < 0.1 && k < mz-2) {
3071 ucor[k][j][i].
z += sqrt(zet[k][j][i].x * zet[k][j][i].x +
3072 zet[k][j][i].y * zet[k][j][i].y +
3073 zet[k][j][i].z * zet[k][j][i].z) *
3086 for (k=lzs; k<lze; k++) {
3087 for (j=lys; j<lye; j++) {
3088 for (i=lxs; i<lxe; i++) {
3089 if (nvert[k][j][i] < 0.1) {
3090 if (nvert[k][j][i+1] > ibmval-0.4 && nvert[k][j][i+1] < ibmval && i < mx-2) {
3091 libm_Flux += ucor[k][j][i].
x;
3092 libm_area += sqrt(csi[k][j][i].x * csi[k][j][i].x +
3093 csi[k][j][i].y * csi[k][j][i].y +
3094 csi[k][j][i].z * csi[k][j][i].z);
3097 if (nvert[k][j+1][i] > ibmval-0.4 && nvert[k][j+1][i] < ibmval && j < my-2) {
3098 libm_Flux += ucor[k][j][i].
y;
3099 libm_area += sqrt(eta[k][j][i].x * eta[k][j][i].x +
3100 eta[k][j][i].y * eta[k][j][i].y +
3101 eta[k][j][i].z * eta[k][j][i].z);
3103 if (nvert[k+1][j][i] > ibmval-0.4 && nvert[k+1][j][i] < ibmval && k < mz-2) {
3104 libm_Flux += ucor[k][j][i].
z;
3105 libm_area += sqrt(zet[k][j][i].x * zet[k][j][i].x +
3106 zet[k][j][i].y * zet[k][j][i].y +
3107 zet[k][j][i].z * zet[k][j][i].z);
3111 if (nvert[k][j][i] > ibmval-0.4 && nvert[k][j][i] < ibmval) {
3112 if (nvert[k][j][i+1] < 0.1 && i < mx-2) {
3113 libm_Flux -= ucor[k][j][i].
x;
3114 libm_area += sqrt(csi[k][j][i].x * csi[k][j][i].x +
3115 csi[k][j][i].y * csi[k][j][i].y +
3116 csi[k][j][i].z * csi[k][j][i].z);
3119 if (nvert[k][j+1][i] < 0.1 && j < my-2) {
3120 libm_Flux -= ucor[k][j][i].
y;
3121 libm_area += sqrt(eta[k][j][i].x * eta[k][j][i].x +
3122 eta[k][j][i].y * eta[k][j][i].y +
3123 eta[k][j][i].z * eta[k][j][i].z);
3125 if (nvert[k+1][j][i] < 0.1 && k < mz-2) {
3126 libm_Flux -= ucor[k][j][i].
z;
3127 libm_area += sqrt(zet[k][j][i].x * zet[k][j][i].x +
3128 zet[k][j][i].y * zet[k][j][i].y +
3129 zet[k][j][i].z * zet[k][j][i].z);
3137 MPI_Allreduce(&libm_Flux, ibm_Flux,1,MPI_DOUBLE,MPI_SUM, PETSC_COMM_WORLD);
3138 MPI_Allreduce(&libm_area, ibm_Area,1,MPI_DOUBLE,MPI_SUM, PETSC_COMM_WORLD);
3142 PetscPrintf(PETSC_COMM_WORLD,
"IBMFlux22 REV %le %le\n", *ibm_Flux, *ibm_Area);
3144 DMDAVecRestoreArray(da, user->
lNvert, &nvert);
3145 DMDAVecRestoreArray(fda, user->
lCsi, &csi);
3146 DMDAVecRestoreArray(fda, user->
lEta, &eta);
3147 DMDAVecRestoreArray(fda, user->
lZet, &zet);
3148 DMDAVecRestoreArray(fda, user->
Ucont, &ucor);
3150 DMGlobalToLocalBegin(fda, user->
Ucont, INSERT_VALUES, user->
lUcont);
3151 DMGlobalToLocalEnd(fda, user->
Ucont, INSERT_VALUES, user->
lUcont);
3164 const PetscInt channelz = simCtx->
channelz;
3165 const PetscInt fish = simCtx->
fish;
3168 DM da = user->
da, fda = user->
fda;
3170 DMDALocalInfo info = user->
info;
3172 PetscInt xs = info.xs, xe = info.xs + info.xm;
3173 PetscInt ys = info.ys, ye = info.ys + info.ym;
3174 PetscInt zs = info.zs, ze = info.zs + info.zm;
3175 PetscInt mx = info.mx, my = info.my, mz = info.mz;
3177 PetscInt i, j, k,ibi;
3178 PetscInt lxs, lys, lzs, lxe, lye, lze;
3180 PetscInt gxs, gxe, gys, gye, gzs, gze;
3182 gxs = info.gxs; gxe = gxs + info.gxm;
3183 gys = info.gys; gye = gys + info.gym;
3184 gzs = info.gzs; gze = gzs + info.gzm;
3190 if (xs==0) lxs = xs+1;
3191 if (ys==0) lys = ys+1;
3192 if (zs==0) lzs = zs+1;
3194 if (xe==mx) lxe = xe-1;
3195 if (ye==my) lye = ye-1;
3196 if (ze==mz) lze = ze-1;
3198 PetscReal epsilon=1.e-8;
3199 PetscReal ***nvert, ibmval=1.9999;
3205 }***ucor, ***lucor,***csi, ***eta, ***zet;
3208 PetscInt xend=mx-2 ,yend=my-2,zend=mz-2;
3210 if (user->
bctype[0]==7) xend=mx-1;
3211 if (user->
bctype[2]==7) yend=my-1;
3212 if (user->
bctype[4]==7) zend=mz-1;
3214 DMDAVecGetArray(fda, user->
Ucont, &ucor);
3215 DMDAVecGetArray(fda, user->
lCsi, &csi);
3216 DMDAVecGetArray(fda, user->
lEta, &eta);
3217 DMDAVecGetArray(fda, user->
lZet, &zet);
3218 DMDAVecGetArray(da, user->
lNvert, &nvert);
3220 PetscReal libm_Flux, libm_area, libm_Flux_abs=0., ibm_Flux_abs;
3227 PetscReal *lIB_Flux, *lIB_area,*IB_Flux,*IB_Area;
3228 if (NumberOfBodies > 1) {
3230 lIB_Flux=(PetscReal *)calloc(NumberOfBodies,
sizeof(PetscReal));
3231 lIB_area=(PetscReal *)calloc(NumberOfBodies,
sizeof(PetscReal));
3232 IB_Flux=(PetscReal *)calloc(NumberOfBodies,
sizeof(PetscReal));
3233 IB_Area=(PetscReal *)calloc(NumberOfBodies,
sizeof(PetscReal));
3236 for (ibi=0; ibi<NumberOfBodies; ibi++) {
3251 for (k=lzs; k<lze; k++) {
3252 for (j=lys; j<lye; j++) {
3253 for (i=lxs; i<lxe; i++) {
3254 if (nvert[k][j][i] < 0.1) {
3255 if (nvert[k][j][i+1] > 0.1 && nvert[k][j][i+1] < ibmval && i < xend) {
3257 if (fabs(ucor[k][j][i].x)>epsilon) {
3258 libm_Flux += ucor[k][j][i].x;
3260 libm_Flux_abs += fabs(ucor[k][j][i].x)/sqrt(csi[k][j][i].x * csi[k][j][i].x +
3261 csi[k][j][i].y * csi[k][j][i].y +
3262 csi[k][j][i].z * csi[k][j][i].z);
3264 libm_Flux_abs += fabs(ucor[k][j][i].x);
3266 libm_area += sqrt(csi[k][j][i].x * csi[k][j][i].x +
3267 csi[k][j][i].y * csi[k][j][i].y +
3268 csi[k][j][i].z * csi[k][j][i].z);
3270 if (NumberOfBodies > 1) {
3272 ibi=(int)((nvert[k][j][i+1]-1.0)*1001);
3273 lIB_Flux[ibi] += ucor[k][j][i].x;
3274 lIB_area[ibi] += sqrt(csi[k][j][i].x * csi[k][j][i].x +
3275 csi[k][j][i].y * csi[k][j][i].y +
3276 csi[k][j][i].z * csi[k][j][i].z);
3282 if (nvert[k][j+1][i] > 0.1 && nvert[k][j+1][i] < ibmval && j < yend) {
3284 if (fabs(ucor[k][j][i].y)>epsilon) {
3285 libm_Flux += ucor[k][j][i].y;
3287 libm_Flux_abs += fabs(ucor[k][j][i].y)/sqrt(eta[k][j][i].x * eta[k][j][i].x +
3288 eta[k][j][i].y * eta[k][j][i].y +
3289 eta[k][j][i].z * eta[k][j][i].z);
3291 libm_Flux_abs += fabs(ucor[k][j][i].y);
3292 libm_area += sqrt(eta[k][j][i].x * eta[k][j][i].x +
3293 eta[k][j][i].y * eta[k][j][i].y +
3294 eta[k][j][i].z * eta[k][j][i].z);
3295 if (NumberOfBodies > 1) {
3297 ibi=(int)((nvert[k][j+1][i]-1.0)*1001);
3299 lIB_Flux[ibi] += ucor[k][j][i].y;
3300 lIB_area[ibi] += sqrt(eta[k][j][i].x * eta[k][j][i].x +
3301 eta[k][j][i].y * eta[k][j][i].y +
3302 eta[k][j][i].z * eta[k][j][i].z);
3307 if (nvert[k+1][j][i] > 0.1 && nvert[k+1][j][i] < ibmval && k < zend) {
3309 if (fabs(ucor[k][j][i].z)>epsilon) {
3310 libm_Flux += ucor[k][j][i].z;
3312 libm_Flux_abs += fabs(ucor[k][j][i].z)/sqrt(zet[k][j][i].x * zet[k][j][i].x +
3313 zet[k][j][i].y * zet[k][j][i].y +
3314 zet[k][j][i].z * zet[k][j][i].z);
3316 libm_Flux_abs += fabs(ucor[k][j][i].z);
3317 libm_area += sqrt(zet[k][j][i].x * zet[k][j][i].x +
3318 zet[k][j][i].y * zet[k][j][i].y +
3319 zet[k][j][i].z * zet[k][j][i].z);
3321 if (NumberOfBodies > 1) {
3323 ibi=(int)((nvert[k+1][j][i]-1.0)*1001);
3324 lIB_Flux[ibi] += ucor[k][j][i].z;
3325 lIB_area[ibi] += sqrt(zet[k][j][i].x * zet[k][j][i].x +
3326 zet[k][j][i].y * zet[k][j][i].y +
3327 zet[k][j][i].z * zet[k][j][i].z);
3334 if (nvert[k][j][i] > 0.1 && nvert[k][j][i] < ibmval) {
3336 if (nvert[k][j][i+1] < 0.1 && i < xend) {
3337 if (fabs(ucor[k][j][i].x)>epsilon) {
3338 libm_Flux -= ucor[k][j][i].x;
3340 libm_Flux_abs += fabs(ucor[k][j][i].x)/sqrt(csi[k][j][i].x * csi[k][j][i].x +
3341 csi[k][j][i].y * csi[k][j][i].y +
3342 csi[k][j][i].z * csi[k][j][i].z);
3344 libm_Flux_abs += fabs(ucor[k][j][i].x);
3345 libm_area += sqrt(csi[k][j][i].x * csi[k][j][i].x +
3346 csi[k][j][i].y * csi[k][j][i].y +
3347 csi[k][j][i].z * csi[k][j][i].z);
3348 if (NumberOfBodies > 1) {
3350 ibi=(int)((nvert[k][j][i]-1.0)*1001);
3351 lIB_Flux[ibi] -= ucor[k][j][i].x;
3352 lIB_area[ibi] += sqrt(csi[k][j][i].x * csi[k][j][i].x +
3353 csi[k][j][i].y * csi[k][j][i].y +
3354 csi[k][j][i].z * csi[k][j][i].z);
3360 if (nvert[k][j+1][i] < 0.1 && j < yend) {
3361 if (fabs(ucor[k][j][i].y)>epsilon) {
3362 libm_Flux -= ucor[k][j][i].y;
3364 libm_Flux_abs += fabs(ucor[k][j][i].y)/ sqrt(eta[k][j][i].x * eta[k][j][i].x +
3365 eta[k][j][i].y * eta[k][j][i].y +
3366 eta[k][j][i].z * eta[k][j][i].z);
3368 libm_Flux_abs += fabs(ucor[k][j][i].y);
3369 libm_area += sqrt(eta[k][j][i].x * eta[k][j][i].x +
3370 eta[k][j][i].y * eta[k][j][i].y +
3371 eta[k][j][i].z * eta[k][j][i].z);
3372 if (NumberOfBodies > 1) {
3374 ibi=(int)((nvert[k][j][i]-1.0)*1001);
3375 lIB_Flux[ibi] -= ucor[k][j][i].y;
3376 lIB_area[ibi] += sqrt(eta[k][j][i].x * eta[k][j][i].x +
3377 eta[k][j][i].y * eta[k][j][i].y +
3378 eta[k][j][i].z * eta[k][j][i].z);
3383 if (nvert[k+1][j][i] < 0.1 && k < zend) {
3384 if (fabs(ucor[k][j][i].z)>epsilon) {
3385 libm_Flux -= ucor[k][j][i].z;
3387 libm_Flux_abs += fabs(ucor[k][j][i].z)/sqrt(zet[k][j][i].x * zet[k][j][i].x +
3388 zet[k][j][i].y * zet[k][j][i].y +
3389 zet[k][j][i].z * zet[k][j][i].z);
3391 libm_Flux_abs += fabs(ucor[k][j][i].z);
3392 libm_area += sqrt(zet[k][j][i].x * zet[k][j][i].x +
3393 zet[k][j][i].y * zet[k][j][i].y +
3394 zet[k][j][i].z * zet[k][j][i].z);
3395 if (NumberOfBodies > 1) {
3397 ibi=(int)((nvert[k][j][i]-1.0)*1001);
3398 lIB_Flux[ibi] -= ucor[k][j][i].z;
3399 lIB_area[ibi] += sqrt(zet[k][j][i].x * zet[k][j][i].x +
3400 zet[k][j][i].y * zet[k][j][i].y +
3401 zet[k][j][i].z * zet[k][j][i].z);
3412 MPI_Allreduce(&libm_Flux, ibm_Flux,1,MPI_DOUBLE,MPI_SUM, PETSC_COMM_WORLD);
3413 MPI_Allreduce(&libm_Flux_abs, &ibm_Flux_abs,1,MPI_DOUBLE,MPI_SUM, PETSC_COMM_WORLD);
3414 MPI_Allreduce(&libm_area, ibm_Area,1,MPI_DOUBLE,MPI_SUM, PETSC_COMM_WORLD);
3416 if (NumberOfBodies > 1) {
3417 MPI_Allreduce(lIB_Flux,IB_Flux,NumberOfBodies,MPI_DOUBLE,MPI_SUM,PETSC_COMM_WORLD);
3418 MPI_Allreduce(lIB_area,IB_Area,NumberOfBodies,MPI_DOUBLE,MPI_SUM,PETSC_COMM_WORLD);
3421 PetscReal correction;
3423 PetscReal *Correction;
3424 if (NumberOfBodies > 1) {
3425 Correction=(PetscReal *)calloc(NumberOfBodies,
sizeof(PetscReal));
3426 for (ibi=0; ibi<NumberOfBodies; ibi++) Correction[ibi]=0.0;
3429 if (*ibm_Area > 1.e-15) {
3431 correction = (*ibm_Flux + user->
FluxIntpSum)/ ibm_Flux_abs;
3433 correction = (*ibm_Flux + user->
FluxIntpSum) / *ibm_Area;
3435 correction = *ibm_Flux / *ibm_Area;
3436 if (NumberOfBodies > 1)
3437 for (ibi=0; ibi<NumberOfBodies; ibi++)
if (IB_Area[ibi]>1.e-15) Correction[ibi] = IB_Flux[ibi] / IB_Area[ibi];
3443 LOG_ALLOW(
GLOBAL,
LOG_INFO,
"IBM Uncorrected Flux: %g, Area: %g, Correction: %g\n", *ibm_Flux, *ibm_Area, correction);
3444 if (NumberOfBodies>1){
3445 for (ibi=0; ibi<NumberOfBodies; ibi++)
LOG_ALLOW(
GLOBAL,
LOG_INFO,
" [Body %d] Uncorrected Flux: %g, Area: %g, Correction: %g\n", ibi, IB_Flux[ibi], IB_Area[ibi], Correction[ibi]);
3454 for (k=lzs; k<lze; k++) {
3455 for (j=lys; j<lye; j++) {
3456 for (i=lxs; i<lxe; i++) {
3457 if (nvert[k][j][i] < 0.1) {
3458 if (nvert[k][j][i+1] > 0.1 && nvert[k][j][i+1] <ibmval && i < xend) {
3459 if (fabs(ucor[k][j][i].x)>epsilon){
3461 ucor[k][j][i].x -=correction*fabs(ucor[k][j][i].x)/
3462 sqrt(csi[k][j][i].x * csi[k][j][i].x +
3463 csi[k][j][i].y * csi[k][j][i].y +
3464 csi[k][j][i].z * csi[k][j][i].z);
3466 ucor[k][j][i].x -=correction*fabs(ucor[k][j][i].x);
3467 else if (NumberOfBodies > 1) {
3468 ibi=(int)((nvert[k][j][i+1]-1.0)*1001);
3469 ucor[k][j][i].x -= sqrt(csi[k][j][i].x * csi[k][j][i].x +
3470 csi[k][j][i].y * csi[k][j][i].y +
3471 csi[k][j][i].z * csi[k][j][i].z) *
3475 ucor[k][j][i].x -= sqrt(csi[k][j][i].x * csi[k][j][i].x +
3476 csi[k][j][i].y * csi[k][j][i].y +
3477 csi[k][j][i].z * csi[k][j][i].z) *
3481 if (nvert[k][j+1][i] > 0.1 && nvert[k][j+1][i] < ibmval && j < yend) {
3482 if (fabs(ucor[k][j][i].y)>epsilon) {
3484 ucor[k][j][i].y -=correction*fabs(ucor[k][j][i].y)/
3485 sqrt(eta[k][j][i].x * eta[k][j][i].x +
3486 eta[k][j][i].y * eta[k][j][i].y +
3487 eta[k][j][i].z * eta[k][j][i].z);
3489 ucor[k][j][i].y -=correction*fabs(ucor[k][j][i].y);
3490 else if (NumberOfBodies > 1) {
3491 ibi=(int)((nvert[k][j+1][i]-1.0)*1001);
3492 ucor[k][j][i].y -= sqrt(eta[k][j][i].x * eta[k][j][i].x +
3493 eta[k][j][i].y * eta[k][j][i].y +
3494 eta[k][j][i].z * eta[k][j][i].z) *
3498 ucor[k][j][i].y -= sqrt(eta[k][j][i].x * eta[k][j][i].x +
3499 eta[k][j][i].y * eta[k][j][i].y +
3500 eta[k][j][i].z * eta[k][j][i].z) *
3504 if (nvert[k+1][j][i] > 0.1 && nvert[k+1][j][i] < ibmval && k < zend) {
3505 if (fabs(ucor[k][j][i].z)>epsilon) {
3507 ucor[k][j][i].z -= correction*fabs(ucor[k][j][i].z)/
3508 sqrt(zet[k][j][i].x * zet[k][j][i].x +
3509 zet[k][j][i].y * zet[k][j][i].y +
3510 zet[k][j][i].z * zet[k][j][i].z);
3512 ucor[k][j][i].z -= correction*fabs(ucor[k][j][i].z);
3513 else if (NumberOfBodies > 1) {
3514 ibi=(int)((nvert[k+1][j][i]-1.0)*1001);
3515 ucor[k][j][i].z -= sqrt(zet[k][j][i].x * zet[k][j][i].x +
3516 zet[k][j][i].y * zet[k][j][i].y +
3517 zet[k][j][i].z * zet[k][j][i].z) *
3521 ucor[k][j][i].z -= sqrt(zet[k][j][i].x * zet[k][j][i].x +
3522 zet[k][j][i].y * zet[k][j][i].y +
3523 zet[k][j][i].z * zet[k][j][i].z) *
3529 if (nvert[k][j][i] > 0.1 && nvert[k][j][i] < ibmval) {
3530 if (nvert[k][j][i+1] < 0.1 && i < xend) {
3531 if (fabs(ucor[k][j][i].x)>epsilon) {
3533 ucor[k][j][i].x += correction*fabs(ucor[k][j][i].x)/
3534 sqrt(csi[k][j][i].x * csi[k][j][i].x +
3535 csi[k][j][i].y * csi[k][j][i].y +
3536 csi[k][j][i].z * csi[k][j][i].z);
3538 ucor[k][j][i].x += correction*fabs(ucor[k][j][i].x);
3539 else if (NumberOfBodies > 1) {
3540 ibi=(int)((nvert[k][j][i]-1.0)*1001);
3541 ucor[k][j][i].x += sqrt(csi[k][j][i].x * csi[k][j][i].x +
3542 csi[k][j][i].y * csi[k][j][i].y +
3543 csi[k][j][i].z * csi[k][j][i].z) *
3547 ucor[k][j][i].x += sqrt(csi[k][j][i].x * csi[k][j][i].x +
3548 csi[k][j][i].y * csi[k][j][i].y +
3549 csi[k][j][i].z * csi[k][j][i].z) *
3553 if (nvert[k][j+1][i] < 0.1 && j < yend) {
3554 if (fabs(ucor[k][j][i].y)>epsilon) {
3556 ucor[k][j][i].y +=correction*fabs(ucor[k][j][i].y)/
3557 sqrt(eta[k][j][i].x * eta[k][j][i].x +
3558 eta[k][j][i].y * eta[k][j][i].y +
3559 eta[k][j][i].z * eta[k][j][i].z);
3561 ucor[k][j][i].y +=correction*fabs(ucor[k][j][i].y);
3562 else if (NumberOfBodies > 1) {
3563 ibi=(int)((nvert[k][j][i]-1.0)*1001);
3564 ucor[k][j][i].y += sqrt(eta[k][j][i].x * eta[k][j][i].x +
3565 eta[k][j][i].y * eta[k][j][i].y +
3566 eta[k][j][i].z * eta[k][j][i].z) *
3570 ucor[k][j][i].y += sqrt(eta[k][j][i].x * eta[k][j][i].x +
3571 eta[k][j][i].y * eta[k][j][i].y +
3572 eta[k][j][i].z * eta[k][j][i].z) *
3576 if (nvert[k+1][j][i] < 0.1 && k < zend) {
3577 if (fabs(ucor[k][j][i].z)>epsilon) {
3579 ucor[k][j][i].z += correction*fabs(ucor[k][j][i].z)/
3580 sqrt(zet[k][j][i].x * zet[k][j][i].x +
3581 zet[k][j][i].y * zet[k][j][i].y +
3582 zet[k][j][i].z * zet[k][j][i].z);
3584 ucor[k][j][i].z += correction*fabs(ucor[k][j][i].z);
3585 else if (NumberOfBodies > 1) {
3586 ibi=(int)((nvert[k][j][i]-1.0)*1001);
3587 ucor[k][j][i].z += sqrt(zet[k][j][i].x * zet[k][j][i].x +
3588 zet[k][j][i].y * zet[k][j][i].y +
3589 zet[k][j][i].z * zet[k][j][i].z) *
3593 ucor[k][j][i].z += sqrt(zet[k][j][i].x * zet[k][j][i].x +
3594 zet[k][j][i].y * zet[k][j][i].y +
3595 zet[k][j][i].z * zet[k][j][i].z) *
3613 for (k=lzs; k<lze; k++) {
3614 for (j=lys; j<lye; j++) {
3615 for (i=lxs; i<lxe; i++) {
3616 if (nvert[k][j][i] < 0.1) {
3617 if (nvert[k][j][i+1] > 0.1 && nvert[k][j][i+1] < ibmval && i < xend) {
3618 libm_Flux += ucor[k][j][i].x;
3619 libm_area += sqrt(csi[k][j][i].x * csi[k][j][i].x +
3620 csi[k][j][i].y * csi[k][j][i].y +
3621 csi[k][j][i].z * csi[k][j][i].z);
3624 if (nvert[k][j+1][i] > 0.1 && nvert[k][j+1][i] < ibmval && j < yend) {
3625 libm_Flux += ucor[k][j][i].y;
3626 libm_area += sqrt(eta[k][j][i].x * eta[k][j][i].x +
3627 eta[k][j][i].y * eta[k][j][i].y +
3628 eta[k][j][i].z * eta[k][j][i].z);
3630 if (nvert[k+1][j][i] > 0.1 && nvert[k+1][j][i] < ibmval && k < zend) {
3631 libm_Flux += ucor[k][j][i].z;
3632 libm_area += sqrt(zet[k][j][i].x * zet[k][j][i].x +
3633 zet[k][j][i].y * zet[k][j][i].y +
3634 zet[k][j][i].z * zet[k][j][i].z);
3638 if (nvert[k][j][i] > 0.1 && nvert[k][j][i] < ibmval) {
3639 if (nvert[k][j][i+1] < 0.1 && i < xend) {
3640 libm_Flux -= ucor[k][j][i].x;
3641 libm_area += sqrt(csi[k][j][i].x * csi[k][j][i].x +
3642 csi[k][j][i].y * csi[k][j][i].y +
3643 csi[k][j][i].z * csi[k][j][i].z);
3646 if (nvert[k][j+1][i] < 0.1 && j < yend) {
3647 libm_Flux -= ucor[k][j][i].y;
3648 libm_area += sqrt(eta[k][j][i].x * eta[k][j][i].x +
3649 eta[k][j][i].y * eta[k][j][i].y +
3650 eta[k][j][i].z * eta[k][j][i].z);
3652 if (nvert[k+1][j][i] < 0.1 && k < zend) {
3653 libm_Flux -= ucor[k][j][i].z;
3654 libm_area += sqrt(zet[k][j][i].x * zet[k][j][i].x +
3655 zet[k][j][i].y * zet[k][j][i].y +
3656 zet[k][j][i].z * zet[k][j][i].z);
3664 MPI_Allreduce(&libm_Flux, ibm_Flux,1,MPI_DOUBLE,MPI_SUM, PETSC_COMM_WORLD);
3665 MPI_Allreduce(&libm_area, ibm_Area,1,MPI_DOUBLE,MPI_SUM, PETSC_COMM_WORLD);
3675 for (k=lzs; k<lze; k++) {
3676 for (j=lys; j<lye; j++) {
3678 if ((nvert[k][j][i]>ibmval && nvert[k][j][i+1]<0.1) || (nvert[k][j][i]<0.1 && nvert[k][j][i+1]>ibmval)) ucor[k][j][i].x=0.0;
3689 for (k=lzs; k<lze; k++) {
3690 for (i=lxs; i<lxe; i++) {
3692 if ((nvert[k][j][i]>ibmval && nvert[k][j+1][i]<0.1) || (nvert[k][j][i]<0.1 && nvert[k][j+1][i]>ibmval)) ucor[k][j][i].y=0.0;
3702 for (j=lys; j<lye; j++) {
3703 for (i=lxs; i<lxe; i++) {
3705 if ((nvert[k][j][i]>ibmval && nvert[k+1][j][i]<0.1) || (nvert[k][j][i]<0.1 && nvert[k+1][j][i]>ibmval)) ucor[k][j][i].z=0.0;
3713 DMDAVecRestoreArray(da, user->
lNvert, &nvert);
3714 DMDAVecRestoreArray(fda, user->
lCsi, &csi);
3715 DMDAVecRestoreArray(fda, user->
lEta, &eta);
3716 DMDAVecRestoreArray(fda, user->
lZet, &zet);
3717 DMDAVecRestoreArray(fda, user->
Ucont, &ucor);
3719 DMGlobalToLocalBegin(fda, user->
Ucont, INSERT_VALUES, user->
lUcont);
3720 DMGlobalToLocalEnd(fda, user->
Ucont, INSERT_VALUES, user->
lUcont);
3724 DMDAVecGetArray(fda, user->
lUcont, &lucor);
3725 DMDAVecGetArray(fda, user->
Ucont, &ucor);
3730 for (k=zs; k<ze; k++) {
3731 for (j=ys; j<ye; j++) {
3732 if(j>0 && k>0 && j<user->JM && k<user->KM){
3733 ucor[k][j][i].x=lucor[k][j][i-2].x;
3742 for (k=zs; k<ze; k++) {
3743 for (i=xs; i<xe; i++) {
3744 if(i>0 && k>0 && i<user->IM && k<user->KM){
3745 ucor[k][j][i].y=lucor[k][j-2][i].y;
3754 for (j=ys; j<ye; j++) {
3755 for (i=xs; i<xe; i++) {
3756 if(i>0 && j>0 && i<user->IM && j<user->JM){
3757 ucor[k][j][i].z=lucor[k-2][j][i].z;
3763 DMDAVecRestoreArray(fda, user->
lUcont, &lucor);
3764 DMDAVecRestoreArray(fda, user->
Ucont, &ucor);
3768 DMGlobalToLocalBegin(user->
fda, user->
Ucont, INSERT_VALUES, user->
lUcont);
3769 DMGlobalToLocalEnd(user->
fda, user->
Ucont, INSERT_VALUES, user->
lUcont);
3771 if (NumberOfBodies > 1) {
3991 const PetscInt immersed = simCtx->
immersed;
3992 const PetscInt MHV = simCtx->
MHV;
3993 const PetscInt LV = simCtx->
LV;
3994 PetscMPIInt rank = simCtx->
rank;
3997 PetscErrorCode ierr;
4004 PetscFunctionBeginUser;
4008 for (bi = 0; bi < block_number; bi++) {
4015 for (l = usermg->
mglevels - 1; l > 0; l--) {
4021 user = mgctx[l].
user;
4022 ierr = PetscMalloc1(user[bi].info.mx * user[bi].
info.my * 2, &user[bi].
KSKE); CHKERRQ(ierr);
4028 user = mgctx[l].
user;
4032 ierr = VecDuplicate(user[bi].P, &user[bi].B); CHKERRQ(ierr);
4034 PetscReal ibm_Flux, ibm_Area;
4035 PetscInt flg = immersed - 1;
4038 VolumeFlux(&user[bi], &ibm_Flux, &ibm_Area, flg);
4040 flg = ((MHV > 1 || LV) && bi == 0) ? 1 : 0;
4048 for (l = usermg->
mglevels - 1; l >= 0; l--) {
4049 user = mgctx[l].
user;
4057 ierr = KSPCreate(PETSC_COMM_WORLD, &mgksp); CHKERRQ(ierr);
4058 ierr = KSPAppendOptionsPrefix(mgksp,
"ps_"); CHKERRQ(ierr);
4063 PetscBool has_monitor_option;
4066 ierr = PetscNew(&monctx); CHKERRQ(ierr);
4074 sprintf(filen,
"logs/Poisson_Solver_Convergence_History_Block_%d.log", bi);
4083 PetscFPrintf(PETSC_COMM_SELF, monctx->
file_handle,
"--- Convergence for Timestep %d, Block %d ---\n", (
int)simCtx->
step, bi);
4085 SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_FILE_OPEN,
"Could not open KSP monitor log file: %s", filen);
4089 ierr = PetscOptionsHasName(NULL, NULL,
"-ps_ksp_pic_monitor_true_residual", &has_monitor_option); CHKERRQ(ierr);
4095 ierr = KSPGetPC(mgksp, &mgpc); CHKERRQ(ierr);
4096 ierr = PCSetType(mgpc, PCMG); CHKERRQ(ierr);
4098 ierr = PCMGSetLevels(mgpc, usermg->
mglevels, PETSC_NULL); CHKERRQ(ierr);
4099 ierr = PCMGSetCycleType(mgpc, PC_MG_CYCLE_V); CHKERRQ(ierr);
4100 ierr = PCMGSetType(mgpc, PC_MG_MULTIPLICATIVE); CHKERRQ(ierr);
4103 for (l = usermg->
mglevels - 1; l > 0; l--) {
4112 coarse_user_ctx->
da_f = &(fine_user_ctx->
da);
4113 coarse_user_ctx->
user_f = fine_user_ctx;
4116 fine_user_ctx->
da_c = &(coarse_user_ctx->
da);
4117 fine_user_ctx->
user_c = coarse_user_ctx;
4121 PetscInt m_c = (coarse_user_ctx->
info.xm * coarse_user_ctx->
info.ym * coarse_user_ctx->
info.zm);
4122 PetscInt m_f = (fine_user_ctx->
info.xm * fine_user_ctx->
info.ym * fine_user_ctx->
info.zm);
4123 PetscInt M_c = (coarse_user_ctx->
info.mx * coarse_user_ctx->
info.my * coarse_user_ctx->
info.mz);
4124 PetscInt M_f = (fine_user_ctx->
info.mx * fine_user_ctx->
info.my * fine_user_ctx->
info.mz);
4129 ierr = MatCreateShell(PETSC_COMM_WORLD, m_c, m_f, M_c, M_f, (
void*)coarse_user_ctx, &fine_user_ctx->
MR); CHKERRQ(ierr);
4132 ierr = MatCreateShell(PETSC_COMM_WORLD, m_f, m_c, M_f, M_c, (
void*)fine_user_ctx, &fine_user_ctx->
MP); CHKERRQ(ierr);
4136 ierr = MatShellSetOperation(fine_user_ctx->
MP, MATOP_MULT, (
void(*)(
void))
MyInterpolation); CHKERRQ(ierr);
4139 ierr = PCMGSetRestriction(mgpc, l, fine_user_ctx->
MR); CHKERRQ(ierr);
4140 ierr = PCMGSetInterpolation(mgpc, l, fine_user_ctx->
MP); CHKERRQ(ierr);
4145 for (l = usermg->
mglevels - 1; l >= 0; l--) {
4146 user = mgctx[l].
user;
4148 ierr = PCMGGetSmoother(mgpc, l, &subksp); CHKERRQ(ierr);
4150 ierr = PCMGGetCoarseSolve(mgpc, &subksp); CHKERRQ(ierr);
4151 ierr = KSPSetTolerances(subksp, 1.e-8, PETSC_DEFAULT, PETSC_DEFAULT, 40); CHKERRQ(ierr);
4154 ierr = KSPSetOperators(subksp, user[bi].A, user[bi].A); CHKERRQ(ierr);
4155 ierr = KSPSetFromOptions(subksp); CHKERRQ(ierr);
4156 ierr = KSPGetPC(subksp, &subpc); CHKERRQ(ierr);
4157 ierr = PCSetType(subpc, PCBJACOBI); CHKERRQ(ierr);
4165 ierr = KSPSetUp(subksp); CHKERRQ(ierr);
4166 ierr = PCBJacobiGetSubKSP(subpc, &nlocal, NULL, &subsubksp); CHKERRQ(ierr);
4168 for (PetscInt abi = 0; abi < nlocal; abi++) {
4169 ierr = KSPGetPC(subsubksp[abi], &subsubpc); CHKERRQ(ierr);
4171 ierr = PCFactorSetShiftAmount(subsubpc, 1.e-10); CHKERRQ(ierr);
4174 ierr = MatNullSpaceCreate(PETSC_COMM_WORLD, PETSC_TRUE, 0, PETSC_NULL, &user[bi].nullsp); CHKERRQ(ierr);
4176 ierr = MatSetNullSpace(user[bi].A, user[bi].nullsp); CHKERRQ(ierr);
4178 ierr = PCMGSetResidual(mgpc, l, PCMGResidualDefault, user[bi].A); CHKERRQ(ierr);
4179 ierr = KSPSetUp(subksp); CHKERRQ(ierr);
4181 if (l < usermg->mglevels - 1) {
4182 ierr = MatCreateVecs(user[bi].A, &user[bi].R, PETSC_NULL); CHKERRQ(ierr);
4183 ierr = PCMGSetRhs(mgpc, l, user[bi].R); CHKERRQ(ierr);
4189 user = mgctx[l].
user;
4192 ierr = KSPSetOperators(mgksp, user[bi].A, user[bi].A); CHKERRQ(ierr);
4193 ierr = MatSetNullSpace(user[bi].A, user[bi].nullsp); CHKERRQ(ierr);
4194 ierr = KSPSetFromOptions(mgksp); CHKERRQ(ierr);
4195 ierr = KSPSetUp(mgksp); CHKERRQ(ierr);
4196 ierr = KSPSolve(mgksp, user[bi].B, user[bi].Phi); CHKERRQ(ierr);
4199 for (l = usermg->
mglevels - 1; l >= 0; l--) {
4200 user = mgctx[l].
user;
4201 MatNullSpaceDestroy(&user[bi].nullsp);
4202 MatDestroy(&user[bi].A);
4205 MatDestroy(&user[bi].MR);
4206 MatDestroy(&user[bi].MP);
4207 }
else if (l==0 && immersed) {
4208 PetscFree(user[bi].KSKE);
4210 if (l < usermg->mglevels - 1) {
4211 VecDestroy(&user[bi].R);
4222 PetscFunctionReturn(0);