17 const PetscInt les = simCtx->
les;
18 const PetscInt rans = simCtx->
rans;
19 const PetscInt ti = simCtx->
step;
20 const PetscReal U_bc = simCtx->
U_bc;
23 DM da = user->
da, fda = user->
fda;
24 DMDALocalInfo info = user->
info;
25 PetscInt xs = info.xs, xe = info.xs + info.xm;
26 PetscInt ys = info.ys, ye = info.ys + info.ym;
27 PetscInt zs = info.zs, ze = info.zs + info.zm;
28 PetscInt mx = info.mx, my = info.my, mz = info.mz;
31 PetscInt lxs, lxe, lys, lye, lzs, lze;
33 Cmpnts ***ubcs, ***ucat,***lucat, ***csi, ***eta, ***zet,***cent;
36 PetscReal Un, nx,ny,nz,A;
42 PetscInt gxs, gxe, gys, gye, gzs, gze;
44 gxs = info.gxs; gxe = gxs + info.gxm;
45 gys = info.gys; gye = gys + info.gym;
46 gzs = info.gzs; gze = gzs + info.gzm;
48 if (xs==0) lxs = xs+1;
49 if (ys==0) lys = ys+1;
50 if (zs==0) lzs = zs+1;
52 if (xe==mx) lxe = xe-1;
53 if (ye==my) lye = ye-1;
54 if (ze==mz) lze = ze-1;
56 PetscFunctionBeginUser;
60 DMDAVecGetArray(fda, user->
lCsi, &csi);
61 DMDAVecGetArray(fda, user->
lEta, &eta);
62 DMDAVecGetArray(fda, user->
lZet, &zet);
69 PetscReal ***ustar, ***aj, ***nvert;
70 DMDAVecGetArray(fda, user->
Ucat, &ucat);
71 DMDAVecGetArray(da, user->
lUstar, &ustar);
72 DMDAVecGetArray(da, user->
lAj, &aj);
73 DMDAVecGetArray(da, user->
lNvert, &nvert);
77 for (k=lzs; k<lze; k++)
78 for (j=lys; j<lye; j++)
79 for (i=lxs; i<lxe; i++) {
80 if( nvert[k][j][i]<1.1 && ( (user->
bctype[0]==-1 && i==1) || (user->
bctype[1]==-1 && i==mx-2) ) ) {
81 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 );
83 double ni[3], nj[3], nk[3];
86 Ua.
x = Ua.
y = Ua.
z = 0;
87 sb = 0.5/aj[k][j][i]/area;
90 sc = 2*sb + 0.5/aj[k][j][i+1]/area;
94 sc = 2*sb + 0.5/aj[k][j][i-1]/area;
99 if(i==mx-2) ni[0]*=-1, ni[1]*=-1, ni[2]*=-1;
102 wall_function (user, sc, sb, Ua, Uc, &ucat[k][j][i], &ustar[k][j][i], ni[0], ni[1], ni[2]);
107 if( nvert[k][j][i]<1.1 && ( (user->
bctype[2]==-1 && j==1) || (user->
bctype[3]==-1 && j==my-2) ) ) {
108 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 );
110 double ni[3], nj[3], nk[3];
113 Ua.
x = Ua.
y = Ua.
z = 0;
114 sb = 0.5/aj[k][j][i]/area;
117 sc = 2*sb + 0.5/aj[k][j+1][i]/area;
118 Uc = ucat[k][j+1][i];
121 sc = 2*sb + 0.5/aj[k][j-1][i]/area;
122 Uc = ucat[k][j-1][i];
128 wall_function (user, sc, sb, Ua, Uc, &ucat[k][j][i], &ustar[k][j][i], nj[0], nj[1], nj[2]);
134 DMDAVecRestoreArray(da, user->
lAj, &aj);
135 DMDAVecRestoreArray(da, user->
lNvert, &nvert);
136 DMDAVecRestoreArray(da, user->
lUstar, &ustar);
137 DMDAVecRestoreArray(fda, user->
Ucat, &ucat);
139 DMGlobalToLocalBegin(fda, user->
Ucat, INSERT_VALUES, user->
lUcat);
140 DMGlobalToLocalEnd(fda, user->
Ucat, INSERT_VALUES, user->
lUcat);
150 DMDAVecGetArray(fda, user->
Bcs.
Ubcs, &ubcs);
151 DMDAVecGetArray(fda, user->
Ucat, &ucat);
158 for (j=lys; j<lye; j++) {
159 for (i=lxs; i<lxe; i++) {
160 ubcs[k][j][i].
x = 0.;
161 ubcs[k][j][i].
y = 1.;
162 ubcs[k][j][i].
z = 0.;
170 if (user->
bctype[3]==12) {
175 for (k=lzs; k<lze; k++) {
176 for (i=lxs; i<lxe; i++) {
177 ubcs[k][j][i].
x = 0.;
178 ubcs[k][j][i].
y = 0.;
179 ubcs[k][j][i].
z = 1.;
189 if (user->
bctype[2]==11) {
190 DMDAVecGetArray(fda, user->
Cent, ¢);
193 for (k=lzs; k<lze; k++) {
194 for (i=lxs; i<lxe; i++) {
195 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);;
197 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);
199 ubcs[k][j][i].
z = 0.0;
204 DMDAVecRestoreArray(fda, user->
Cent, ¢);
215 for (k=lzs; k<lze; k++) {
216 for (j=lys; j<lye; j++) {
217 A=sqrt(csi[k][j][i].z*csi[k][j][i].z +
218 csi[k][j][i].y*csi[k][j][i].y +
219 csi[k][j][i].x*csi[k][j][i].x);
223 Un=ucat[k][j][i+1].
x*nx+ucat[k][j][i+1].
y*ny+ucat[k][j][i+1].
z*nz;
224 ubcs[k][j][i].
x = ucat[k][j][i+1].
x-Un*nx;
225 ubcs[k][j][i].
y = ucat[k][j][i+1].
y-Un*ny;
226 ubcs[k][j][i].
z = ucat[k][j][i+1].
z-Un*nz;
236 for (k=lzs; k<lze; k++) {
237 for (j=lys; j<lye; j++) {
238 A=sqrt(csi[k][j][i-1].z*csi[k][j][i-1].z +
239 csi[k][j][i-1].y*csi[k][j][i-1].y +
240 csi[k][j][i-1].x*csi[k][j][i-1].x);
241 nx=csi[k][j][i-1].
x/A;
242 ny=csi[k][j][i-1].
y/A;
243 nz=csi[k][j][i-1].
z/A;
244 Un=ucat[k][j][i-1].
x*nx+ucat[k][j][i-1].
y*ny+ucat[k][j][i-1].
z*nz;
245 ubcs[k][j][i].
x = ucat[k][j][i-1].
x-Un*nx;
246 ubcs[k][j][i].
y = ucat[k][j][i-1].
y-Un*ny;
247 ubcs[k][j][i].
z = ucat[k][j][i-1].
z-Un*nz;
257 for (k=lzs; k<lze; k++) {
258 for (i=lxs; i<lxe; i++) {
259 A=sqrt(eta[k][j][i].z*eta[k][j][i].z +
260 eta[k][j][i].y*eta[k][j][i].y +
261 eta[k][j][i].x*eta[k][j][i].x);
265 Un=ucat[k][j+1][i].
x*nx+ucat[k][j+1][i].
y*ny+ucat[k][j+1][i].
z*nz;
266 ubcs[k][j][i].
x = ucat[k][j+1][i].
x-Un*nx;
267 ubcs[k][j][i].
y = ucat[k][j+1][i].
y-Un*ny;
268 ubcs[k][j][i].
z = ucat[k][j+1][i].
z-Un*nz;
278 for (k=lzs; k<lze; k++) {
279 for (i=lxs; i<lxe; i++) {
280 A=sqrt(eta[k][j-1][i].z*eta[k][j-1][i].z +
281 eta[k][j-1][i].y*eta[k][j-1][i].y +
282 eta[k][j-1][i].x*eta[k][j-1][i].x);
283 nx=eta[k][j-1][i].
x/A;
284 ny=eta[k][j-1][i].
y/A;
285 nz=eta[k][j-1][i].
z/A;
286 Un=ucat[k][j-1][i].
x*nx+ucat[k][j-1][i].
y*ny+ucat[k][j-1][i].
z*nz;
287 ubcs[k][j][i].
x = ucat[k][j-1][i].
x-Un*nx;
288 ubcs[k][j][i].
y = ucat[k][j-1][i].
y-Un*ny;
289 ubcs[k][j][i].
z = ucat[k][j-1][i].
z-Un*nz;
299 for (j=lys; j<lye; j++) {
300 for (i=lxs; i<lxe; i++) {
301 A=sqrt(zet[k][j][i].z*zet[k][j][i].z +
302 zet[k][j][i].y*zet[k][j][i].y +
303 zet[k][j][i].x*zet[k][j][i].x);
307 Un=ucat[k][j][i].
x*nx+ucat[k][j][i].
y*ny+ucat[k][j][i].
z*nz;
308 ubcs[k][j][i].
x = ucat[k][j][i].
x-Un*nx;
309 ubcs[k][j][i].
y = ucat[k][j][i].
y-Un*ny;
310 ubcs[k][j][i].
z = ucat[k][j][i].
z-Un*nz;
319 for (j=lys; j<lye; j++) {
320 for (i=lxs; i<lxe; i++) {
321 A=sqrt(zet[k-1][j][i].z*zet[k-1][j][i].z +
322 zet[k-1][j][i].y*zet[k-1][j][i].y +
323 zet[k-1][j][i].x*zet[k-1][j][i].x);
324 nx=zet[k-1][j][i].
x/A;
325 ny=zet[k-1][j][i].
y/A;
326 nz=zet[k-1][j][i].
z/A;
327 Un=ucat[k-1][j][i].
x*nx+ucat[k-1][j][i].
y*ny+ucat[k-1][j][i].
z*nz;
328 ubcs[k][j][i].
x = ucat[k-1][j][i].
x-Un*nx;
329 ubcs[k][j][i].
y = ucat[k-1][j][i].
y-Un*ny;
330 ubcs[k][j][i].
z = ucat[k-1][j][i].
z-Un*nz;
344 for (k=lzs; k<lze; k++) {
345 for (i=lxs; i<lxe; i++) {
346 ubcs[k][j][i].
x = 0.;
348 ubcs[k][j][i].
y = 0.;
349 ubcs[k][j][i].
z =-U_bc;
358 for (k=lzs; k<lze; k++) {
359 for (i=lxs; i<lxe; i++) {
360 ubcs[k][j][i].
x = 0.;
362 ubcs[k][j][i].
y = 0.;
363 ubcs[k][j][i].
z = U_bc;
372 for (j=lys; j<lye; j++) {
373 for (i=lxs; i<lxe; i++) {
374 ubcs[k][j][i].
x =-U_bc;
375 ubcs[k][j][i].
y = 0.;
376 ubcs[k][j][i].
z = 0.;
384 for (j=lys; j<lye; j++) {
385 for (i=lxs; i<lxe; i++) {
386 ubcs[k][j][i].
x = U_bc;
387 ubcs[k][j][i].
y = 0.;
388 ubcs[k][j][i].
z = 0.;
397 if (xs==0 && user->
bctype[0]!=7) {
399 for (k=zs; k<ze; k++) {
400 for (j=ys; j<ye; j++) {
401 ucat[k][j][i].
x = 2 * ubcs[k][j][i].
x - ucat[k][j][i+1].
x;
402 ucat[k][j][i].
y = 2 * ubcs[k][j][i].
y - ucat[k][j][i+1].
y;
403 ucat[k][j][i].
z = 2 * ubcs[k][j][i].
z - ucat[k][j][i+1].
z;
408 if (xe==mx && user->
bctype[0]!=7) {
410 for (k=zs; k<ze; k++) {
411 for (j=ys; j<ye; j++) {
412 ucat[k][j][i].
x = 2 * ubcs[k][j][i].
x - ucat[k][j][i-1].
x;
413 ucat[k][j][i].
y = 2 * ubcs[k][j][i].
y - ucat[k][j][i-1].
y;
414 ucat[k][j][i].
z = 2 * ubcs[k][j][i].
z - ucat[k][j][i-1].
z;
419 if (ys==0 && user->
bctype[2]!=7) {
421 for (k=zs; k<ze; k++) {
422 for (i=xs; i<xe; i++) {
423 ucat[k][j][i].
x = 2 * ubcs[k][j][i].
x - ucat[k][j+1][i].
x;
424 ucat[k][j][i].
y = 2 * ubcs[k][j][i].
y - ucat[k][j+1][i].
y;
425 ucat[k][j][i].
z = 2 * ubcs[k][j][i].
z - ucat[k][j+1][i].
z;
430 if (ye==my && user->
bctype[2]!=7) {
432 for (k=zs; k<ze; k++) {
433 for (i=xs; i<xe; i++) {
434 ucat[k][j][i].
x = 2 * ubcs[k][j][i].
x - ucat[k][j-1][i].
x;
435 ucat[k][j][i].
y = 2 * ubcs[k][j][i].
y - ucat[k][j-1][i].
y;
436 ucat[k][j][i].
z = 2 * ubcs[k][j][i].
z - ucat[k][j-1][i].
z;
441 if (zs==0 && user->
bctype[4]!=7) {
443 for (j=ys; j<ye; j++) {
444 for (i=xs; i<xe; i++) {
445 ucat[k][j][i].
x = 2 * ubcs[k][j][i].
x - ucat[k+1][j][i].
x;
446 ucat[k][j][i].
y = 2 * ubcs[k][j][i].
y - ucat[k+1][j][i].
y;
447 ucat[k][j][i].
z = 2 * ubcs[k][j][i].
z - ucat[k+1][j][i].
z;
452 if (ze==mz && user->
bctype[4]!=7) {
454 for (j=ys; j<ye; j++) {
455 for (i=xs; i<xe; i++) {
456 ucat[k][j][i].
x = 2 * ubcs[k][j][i].
x - ucat[k-1][j][i].
x;
457 ucat[k][j][i].
y = 2 * ubcs[k][j][i].
y - ucat[k-1][j][i].
y;
458 ucat[k][j][i].
z = 2 * ubcs[k][j][i].
z - ucat[k-1][j][i].
z;
462 DMDAVecRestoreArray(fda, user->
Bcs.
Ubcs, &ubcs);
463 DMDAVecRestoreArray(fda, user->
Ucat,&ucat);
470 DMGlobalToLocalBegin(fda, user->
Ucat, INSERT_VALUES, user->
lUcat);
471 DMGlobalToLocalEnd(fda, user->
Ucat, INSERT_VALUES, user->
lUcat);
473 DMDAVecGetArray(fda, user->
lUcat, &lucat);
474 DMDAVecGetArray(fda, user->
Ucat, &ucat);
479 for (k=zs; k<ze; k++) {
480 for (j=ys; j<ye; j++) {
481 if(k>0 && k<user->KM && j>0 && j<user->JM){
482 ucat[k][j][i]=lucat[k][j][i-2];
491 for (k=zs; k<ze; k++) {
492 for (i=xs; i<xe; i++) {
493 if(k>0 && k<user->KM && i>0 && i<user->IM){
494 ucat[k][j][i]=lucat[k][j-2][i];
503 for (j=ys; j<ye; j++) {
504 for (i=xs; i<xe; i++) {
505 if(j>0 && j<user->JM && i>0 && i<user->IM){
506 ucat[k][j][i]=lucat[k-2][j][i];
515 for (k=zs; k<ze; k++) {
516 for (j=ys; j<ye; j++) {
517 if(k>0 && k<user->KM && j>0 && j<user->JM){
518 ucat[k][j][i]=lucat[k][j][i+2];
527 for (k=zs; k<ze; k++) {
528 for (i=xs; i<xe; i++) {
529 if(k>0 && k<user->KM && i>0 && i<user->IM){
530 ucat[k][j][i]=lucat[k][j+2][i];
539 for (j=ys; j<ye; j++) {
540 for (i=xs; i<xe; i++) {
541 if(j>0 && j<user->JM && i>0 && i<user->IM){
542 ucat[k][j][i].
x=lucat[k+2][j][i].
x;
549 DMDAVecRestoreArray(fda, user->
lUcat, &lucat);
550 DMDAVecRestoreArray(fda, user->
Ucat, &ucat);
552 DMGlobalToLocalBegin(fda, user->
Ucat, INSERT_VALUES, user->
lUcat);
553 DMGlobalToLocalEnd(fda, user->
Ucat, INSERT_VALUES, user->
lUcat);
559 DMDAVecGetArray(fda, user->
Ucat, &ucat);
565 for (j=ys; j<ye; j++) {
566 ucat[k][j][i].
x = 0.5*(ucat[k+1][j][i].
x+ucat[k][j][i+1].
x);
567 ucat[k][j][i].
y = 0.5*(ucat[k+1][j][i].
y+ucat[k][j][i+1].
y);
568 ucat[k][j][i].
z = 0.5*(ucat[k+1][j][i].
z+ucat[k][j][i+1].
z);
573 for (j=ys; j<ye; j++) {
574 ucat[k][j][i].
x = 0.5*(ucat[k+1][j][i].
x+ucat[k][j][i-1].
x);
575 ucat[k][j][i].
y = 0.5*(ucat[k+1][j][i].
y+ucat[k][j][i-1].
y);
576 ucat[k][j][i].
z = 0.5*(ucat[k+1][j][i].
z+ucat[k][j][i-1].
z);
582 for (i=xs; i<xe; i++) {
583 ucat[k][j][i].
x = 0.5*(ucat[k+1][j][i].
x+ucat[k][j+1][i].
x);
584 ucat[k][j][i].
y = 0.5*(ucat[k+1][j][i].
y+ucat[k][j+1][i].
y);
585 ucat[k][j][i].
z = 0.5*(ucat[k+1][j][i].
z+ucat[k][j+1][i].
z);
591 for (i=xs; i<xe; i++) {
592 ucat[k][j][i].
x = 0.5*(ucat[k+1][j][i].
x+ucat[k][j-1][i].
x);
593 ucat[k][j][i].
y = 0.5*(ucat[k+1][j][i].
y+ucat[k][j-1][i].
y);
594 ucat[k][j][i].
z = 0.5*(ucat[k+1][j][i].
z+ucat[k][j-1][i].
z);
603 for (j=ys; j<ye; j++) {
604 ucat[k][j][i].
x = 0.5*(ucat[k-1][j][i].
x+ucat[k][j][i+1].
x);
605 ucat[k][j][i].
y = 0.5*(ucat[k-1][j][i].
y+ucat[k][j][i+1].
y);
606 ucat[k][j][i].
z = 0.5*(ucat[k-1][j][i].
z+ucat[k][j][i+1].
z);
611 for (j=ys; j<ye; j++) {
612 ucat[k][j][i].
x = 0.5*(ucat[k-1][j][i].
x+ucat[k][j][i-1].
x);
613 ucat[k][j][i].
y = 0.5*(ucat[k-1][j][i].
y+ucat[k][j][i-1].
y);
614 ucat[k][j][i].
z = 0.5*(ucat[k-1][j][i].
z+ucat[k][j][i-1].
z);
619 for (i=xs; i<xe; i++) {
620 ucat[k][j][i].
x = 0.5*(ucat[k-1][j][i].
x+ucat[k][j+1][i].
x);
621 ucat[k][j][i].
y = 0.5*(ucat[k-1][j][i].
y+ucat[k][j+1][i].
y);
622 ucat[k][j][i].
z = 0.5*(ucat[k-1][j][i].
z+ucat[k][j+1][i].
z);
628 for (i=xs; i<xe; i++) {
629 ucat[k][j][i].
x = 0.5*(ucat[k-1][j][i].
x+ucat[k][j-1][i].
x);
630 ucat[k][j][i].
y = 0.5*(ucat[k-1][j][i].
y+ucat[k][j-1][i].
y);
631 ucat[k][j][i].
z = 0.5*(ucat[k-1][j][i].
z+ucat[k][j-1][i].
z);
640 for (k=zs; k<ze; k++) {
641 ucat[k][j][i].
x = 0.5*(ucat[k][j+1][i].
x+ucat[k][j][i+1].
x);
642 ucat[k][j][i].
y = 0.5*(ucat[k][j+1][i].
y+ucat[k][j][i+1].
y);
643 ucat[k][j][i].
z = 0.5*(ucat[k][j+1][i].
z+ucat[k][j][i+1].
z);
649 for (k=zs; k<ze; k++) {
650 ucat[k][j][i].
x = 0.5*(ucat[k][j+1][i].
x+ucat[k][j][i-1].
x);
651 ucat[k][j][i].
y = 0.5*(ucat[k][j+1][i].
y+ucat[k][j][i-1].
y);
652 ucat[k][j][i].
z = 0.5*(ucat[k][j+1][i].
z+ucat[k][j][i-1].
z);
661 for (k=zs; k<ze; k++) {
662 ucat[k][j][i].
x = 0.5*(ucat[k][j-1][i].
x+ucat[k][j][i+1].
x);
663 ucat[k][j][i].
y = 0.5*(ucat[k][j-1][i].
y+ucat[k][j][i+1].
y);
664 ucat[k][j][i].
z = 0.5*(ucat[k][j-1][i].
z+ucat[k][j][i+1].
z);
670 for (k=zs; k<ze; k++) {
671 ucat[k][j][i].
x = 0.5*(ucat[k][j-1][i].
x+ucat[k][j][i-1].
x);
672 ucat[k][j][i].
y = 0.5*(ucat[k][j-1][i].
y+ucat[k][j][i-1].
y);
673 ucat[k][j][i].
z = 0.5*(ucat[k][j-1][i].
z+ucat[k][j][i-1].
z);
678 DMDAVecRestoreArray(fda, user->
Ucat, &ucat);
680 DMGlobalToLocalBegin(fda, user->
Ucat, INSERT_VALUES, user->
lUcat);
681 DMGlobalToLocalEnd(fda, user->
Ucat, INSERT_VALUES, user->
lUcat);
685 DMDAVecGetArray(fda, user->
lUcat, &lucat);
686 DMDAVecGetArray(fda, user->
Ucat, &ucat);
691 for (k=zs; k<ze; k++) {
692 for (j=ys; j<ye; j++) {
693 ucat[k][j][i]=lucat[k][j][i-2];
701 for (k=zs; k<ze; k++) {
702 for (j=ys; j<ye; j++) {
703 ucat[k][j][i]=lucat[k][j][i+2];
708 DMDAVecRestoreArray(fda, user->
lUcat, &lucat);
709 DMDAVecRestoreArray(fda, user->
Ucat, &ucat);
714 DMGlobalToLocalBegin(fda, user->
Ucat, INSERT_VALUES, user->
lUcat);
715 DMGlobalToLocalEnd(fda, user->
Ucat, INSERT_VALUES, user->
lUcat);
719 DMDAVecGetArray(fda, user->
lUcat, &lucat);
720 DMDAVecGetArray(fda, user->
Ucat, &ucat);
725 for (k=zs; k<ze; k++) {
726 for (i=xs; i<xe; i++) {
727 ucat[k][j][i]=lucat[k][j-2][i];
736 for (k=zs; k<ze; k++) {
737 for (i=xs; i<xe; i++) {
738 ucat[k][j][i]=lucat[k][j+2][i];
744 DMDAVecRestoreArray(fda, user->
lUcat, &lucat);
745 DMDAVecRestoreArray(fda, user->
Ucat, &ucat);
750 DMGlobalToLocalBegin(fda, user->
Ucat, INSERT_VALUES, user->
lUcat);
751 DMGlobalToLocalEnd(fda, user->
Ucat, INSERT_VALUES, user->
lUcat);
755 DMDAVecGetArray(fda, user->
lUcat, &lucat);
756 DMDAVecGetArray(fda, user->
Ucat, &ucat);
761 for (j=ys; j<ye; j++) {
762 for (i=xs; i<xe; i++) {
763 ucat[k][j][i]=lucat[k-2][j][i];
771 for (j=ys; j<ye; j++) {
772 for (i=xs; i<xe; i++) {
773 ucat[k][j][i].
x=lucat[k+2][j][i].
x;
779 DMDAVecRestoreArray(fda, user->
lUcat, &lucat);
780 DMDAVecRestoreArray(fda, user->
Ucat, &ucat);
785 DMGlobalToLocalBegin(fda, user->
Ucat, INSERT_VALUES, user->
lUcat);
786 DMGlobalToLocalEnd(fda, user->
Ucat, INSERT_VALUES, user->
lUcat);
789 DMDAVecRestoreArray(fda, user->
lCsi, &csi);
790 DMDAVecRestoreArray(fda, user->
lEta, &eta);
791 DMDAVecRestoreArray(fda, user->
lZet, &zet);
794 PetscFunctionReturn(0);
950 PetscFunctionBeginUser;
960 DM da = user->
da, fda = user->
fda;
961 DMDALocalInfo info = user->
info;
964 PetscInt mx = info.mx, my = info.my, mz = info.mz;
965 PetscInt xs = info.xs, xe = info.xs + info.xm;
966 PetscInt ys = info.ys, ye = info.ys + info.ym;
967 PetscInt zs = info.zs, ze = info.zs + info.zm;
970 PetscInt lxs = (xs == 0) ? xs + 1 : xs;
971 PetscInt lxe = (xe == mx) ? xe - 1 : xe;
972 PetscInt lys = (ys == 0) ? ys + 1 : ys;
973 PetscInt lye = (ye == my) ? ye - 1 : ye;
974 PetscInt lzs = (zs == 0) ? zs + 1 : zs;
975 PetscInt lze = (ze == mz) ? ze - 1 : ze;
978 Cmpnts ***icsi, ***ieta, ***izet, ***jcsi, ***jeta, ***jzet, ***kcsi, ***keta, ***kzet;
979 PetscReal ***iaj, ***jaj, ***kaj, ***p, ***nvert;
981 DMDAVecGetArray(fda, user->
lICsi, &icsi); DMDAVecGetArray(fda, user->
lIEta, &ieta); DMDAVecGetArray(fda, user->
lIZet, &izet);
982 DMDAVecGetArray(fda, user->
lJCsi, &jcsi); DMDAVecGetArray(fda, user->
lJEta, &jeta); DMDAVecGetArray(fda, user->
lJZet, &jzet);
983 DMDAVecGetArray(fda, user->
lKCsi, &kcsi); DMDAVecGetArray(fda, user->
lKEta, &keta); DMDAVecGetArray(fda, user->
lKZet, &kzet);
984 DMDAVecGetArray(da, user->
lIAj, &iaj); DMDAVecGetArray(da, user->
lJAj, &jaj); DMDAVecGetArray(da, user->
lKAj, &kaj);
985 DMDAVecGetArray(da, user->
lNvert, &nvert);
986 DMDAVecGetArray(da, user->
lPhi, &p);
988 DMDAVecGetArray(fda, user->
Ucont, &ucont);
991 const PetscReal IBM_FLUID_THRESHOLD = 0.1;
1002 for (PetscInt k = lzs; k < lze; k++) {
1003 for (PetscInt j = lys; j < lye; j++) {
1004 for (PetscInt i = lxs; i < lxe; i++) {
1007 PetscInt i_end = (user->
bctype[0] == 7) ? mx - 1 : mx - 2;
1010 if (!(nvert[k][j][i] > IBM_FLUID_THRESHOLD || nvert[k][j][i + 1] > IBM_FLUID_THRESHOLD)) {
1013 PetscReal dpdc = p[k][j][i + 1] - p[k][j][i];
1014 PetscReal dpde = 0.0, dpdz = 0.0;
1017 if ((j==my-2 && user->
bctype[2]!=7)|| nvert[k][j+1][i]+nvert[k][j+1][i+1] > 0.1) {
1018 if (nvert[k][j-1][i] + nvert[k][j-1][i+1] < 0.1 && (j!=1 || (j==1 && user->
bctype[2]==7))) {
1019 dpde = (p[k][j][i] + p[k][j][i+1] -
1020 p[k][j-1][i] - p[k][j-1][i+1]) * 0.5;
1024 else if ((j==my-2 || j==1) && user->
bctype[2]==7 && nvert[k][j+1][i]+nvert[k][j+1][i+1] > 0.1) {
1025 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; }
1028 else if ((j == 1 && user->
bctype[2]!=7) || nvert[k][j-1][i] + nvert[k][j-1][i+1] > 0.1) {
1029 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; }
1032 else if ((j == 1 || j==my-2) && user->
bctype[2]==7 && nvert[k][j-1][i] + nvert[k][j-1][i+1] > 0.1) {
1033 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; }
1036 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; }
1039 if ((k == mz-2 && user->
bctype[4]!=7) || nvert[k+1][j][i] + nvert[k+1][j][i+1] > 0.1) {
1040 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; }
1043 else if ((k == mz-2 || k==1) && user->
bctype[4]==7 && nvert[k+1][j][i] + nvert[k+1][j][i+1] > 0.1) {
1044 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; }
1047 else if ((k == 1 && user->
bctype[4]!=7)|| nvert[k-1][j][i] + nvert[k-1][j][i+1] > 0.1) {
1048 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; }
1051 else if ((k == 1 || k==mz-2) && user->
bctype[4]==7 && nvert[k-1][j][i] + nvert[k-1][j][i+1] > 0.1) {
1052 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; }
1055 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; }
1061 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
1062 + icsi[k][j][i].
z * icsi[k][j][i].
z) * iaj[k][j][i] +
1063 dpde * (ieta[k][j][i].x * icsi[k][j][i].x + ieta[k][j][i].y * icsi[k][j][i].y
1064 + ieta[k][j][i].z * icsi[k][j][i].z) * iaj[k][j][i] +
1065 dpdz * (izet[k][j][i].
x * icsi[k][j][i].
x + izet[k][j][i].
y * icsi[k][j][i].
y
1066 + izet[k][j][i].
z * icsi[k][j][i].
z) * iaj[k][j][i]);
1068 PetscReal correction = grad_p_x*scale;
1070 ucont[k][j][i].
x -= correction;
1076 PetscInt j_end = (user->
bctype[2] == 7) ? my - 1 : my - 2;
1078 if (!(nvert[k][j][i] > IBM_FLUID_THRESHOLD || nvert[k][j + 1][i] > IBM_FLUID_THRESHOLD)) {
1079 PetscReal dpdc = 0.0, dpde = 0.0, dpdz = 0.0;
1080 dpde = p[k][j + 1][i] - p[k][j][i];
1083 if ((i == mx-2 && user->
bctype[0]!=7) || nvert[k][j][i+1] + nvert[k][j+1][i+1] > 0.1) {
1084 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; }
1085 }
else if ((i == mx-2 || i==1) && user->
bctype[0]==7 && nvert[k][j][i+1] + nvert[k][j+1][i+1] > 0.1) {
1086 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; }
1087 }
else if ((i == 1 && user->
bctype[0]!=7)|| nvert[k][j][i-1] + nvert[k][j+1][i-1] > 0.1) {
1088 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; }
1089 }
else if ((i == 1 || i==mx-2) && user->
bctype[0]==7 && nvert[k][j][i-1] + nvert[k][j+1][i-1] > 0.1) {
1090 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; }
1091 }
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; }
1094 if ((k == mz-2 && user->
bctype[4]!=7)|| nvert[k+1][j][i] + nvert[k+1][j+1][i] > 0.1) {
1095 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; }
1096 }
else if ((k == mz-2 || k==1 ) && user->
bctype[4]==7 && nvert[k+1][j][i] + nvert[k+1][j+1][i] > 0.1) {
1097 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; }
1098 }
else if ((k == 1 && user->
bctype[4]!=7)|| nvert[k-1][j][i] + nvert[k-1][j+1][i] > 0.1) {
1099 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; }
1100 }
else if ((k == 1 || k==mz-2) && user->
bctype[4]==7 && nvert[k-1][j][i] + nvert[k-1][j+1][i] > 0.1) {
1101 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; }
1102 }
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; }
1104 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] +
1105 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] +
1106 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]);
1108 PetscReal correction = grad_p_y*scale;
1110 ucont[k][j][i].
y -= correction;
1115 PetscInt k_end = (user->
bctype[4] == 7) ? mz - 1 : mz - 2;
1117 if (!(nvert[k][j][i] > IBM_FLUID_THRESHOLD || nvert[k + 1][j][i] > IBM_FLUID_THRESHOLD)) {
1118 PetscReal dpdc = 0.0, dpde = 0.0, dpdz = 0.0;
1119 dpdz = p[k + 1][j][i] - p[k][j][i];
1122 if ((i == mx-2 && user->
bctype[0]!=7)|| nvert[k][j][i+1] + nvert[k+1][j][i+1] > 0.1) {
1123 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; }
1124 }
else if ((i == mx-2 || i==1) && user->
bctype[0]==7 && nvert[k][j][i+1] + nvert[k+1][j][i+1] > 0.1) {
1125 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; }
1126 }
else if ((i == 1 && user->
bctype[0]!=7)|| nvert[k][j][i-1] + nvert[k+1][j][i-1] > 0.1) {
1127 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; }
1128 }
else if ((i == 1 || i==mx-2) && user->
bctype[0]==7 && nvert[k][j][i-1] + nvert[k+1][j][i-1] > 0.1) {
1129 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; }
1130 }
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; }
1133 if ((j == my-2 && user->
bctype[2]!=7)|| nvert[k][j+1][i] + nvert[k+1][j+1][i] > 0.1) {
1134 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; }
1135 }
else if ((j == my-2 || j==1) && user->
bctype[2]==7 && nvert[k][j+1][i] + nvert[k+1][j+1][i] > 0.1) {
1136 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; }
1137 }
else if ((j == 1 && user->
bctype[2]!=7)|| nvert[k][j-1][i] + nvert[k+1][j-1][i] > 0.1) {
1138 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; }
1139 }
else if ((j == 1 || j==my-2) && user->
bctype[2]==7 && nvert[k][j-1][i] + nvert[k+1][j-1][i] > 0.1) {
1140 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; }
1141 }
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; }
1143 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] +
1144 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] +
1145 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]);
1149 "[k=%d, j=%d, i=%d] ---- Neighbor Pressures ----\n"
1150 " Central Z-Neighbors: p[k+1][j][i] = %g | p[k][j][i] = %g\n"
1151 " 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"
1152 " 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",
1154 p[k + 1][j][i], p[k][j][i],
1155 p[k][j - 1][i], p[k + 1][j - 1][i], p[k][j + 1][i], p[k + 1][j + 1][i],
1156 p[k][j][i - 1], p[k + 1][j][i - 1], p[k][j][i + 1], p[k + 1][j][i + 1]);
1160 PetscReal correction = grad_p_z*scale;
1162 ucont[k][j][i].
z -= correction;
1172 if (user->
bctype[0] == 7 && xs == 0) {
1173 for (PetscInt k=lzs; k<lze; k++) {
1174 for (PetscInt j=lys; j<lye; j++) {
1177 PetscReal dpdc = p[k][j][i+1] - p[k][j][i];
1179 PetscReal dpde = 0.;
1180 PetscReal dpdz = 0.;
1182 if ((j==my-2 && user->
bctype[2]!=7)|| nvert[k][j+1][i]+nvert[k][j+1][i+1] > 0.1) {
1183 if (nvert[k][j-1][i] + nvert[k][j-1][i+1] < 0.1 && (j!=1 || (j==1 && user->
bctype[2]==7))) {
1184 dpde = (p[k][j ][i] + p[k][j ][i+1] -
1185 p[k][j-1][i] - p[k][j-1][i+1]) * 0.5;
1188 else if ((j==my-2 || j==1) && user->
bctype[2]==7 && nvert[k][j+1][i]+nvert[k][j+1][i+1] > 0.1) {
1189 if (nvert[k][j-1][i] + nvert[k][j-1][i+1] < 0.1) {
1190 dpde = (p[k][j ][i] + p[k][j ][i+1] -
1191 p[k][j-1][i] - p[k][j-1][i+1]) * 0.5;
1194 else if ((j == 1 && user->
bctype[2]!=7) || nvert[k][j-1][i] + nvert[k][j-1][i+1] > 0.1) {
1195 if (nvert[k][j+1][i] + nvert[k][j+1][i+1] < 0.1) {
1196 dpde = (p[k][j+1][i] + p[k][j+1][i+1] -
1197 p[k][j ][i] - p[k][j ][i+1]) * 0.5;
1200 else if ((j == 1 || j==my-2) && user->
bctype[2]==7 && nvert[k][j-1][i] + nvert[k][j-1][i+1] > 0.1) {
1201 if (nvert[k][j+1][i] + nvert[k][j+1][i+1] < 0.1) {
1202 dpde = (p[k][j+1][i] + p[k][j+1][i+1] -
1203 p[k][j ][i] - p[k][j ][i+1]) * 0.5;
1207 dpde = (p[k][j+1][i] + p[k][j+1][i+1] -
1208 p[k][j-1][i] - p[k][j-1][i+1]) * 0.25;
1211 if ((k == mz-2 && user->
bctype[4]!=7) || nvert[k+1][j][i] + nvert[k+1][j][i+1] > 0.1) {
1212 if (nvert[k-1][j][i] + nvert[k-1][j][i+1] < 0.1 && (k!=1 || (k==1 && user->
bctype[4]==7))) {
1213 dpdz = (p[k ][j][i] + p[k ][j][i+1] -
1214 p[k-1][j][i] - p[k-1][j][i+1]) * 0.5;
1217 else if ((k == mz-2 || k==1) && user->
bctype[4]==7 && nvert[k+1][j][i] + nvert[k+1][j][i+1] > 0.1) {
1218 if (nvert[k-1][j][i] + nvert[k-1][j][i+1] < 0.1) {
1219 dpdz = (p[k ][j][i] + p[k ][j][i+1] -
1220 p[k-1][j][i] - p[k-1][j][i+1]) * 0.5;
1223 else if ((k == 1 && user->
bctype[4]!=7)|| nvert[k-1][j][i] + nvert[k-1][j][i+1] > 0.1) {
1224 if (nvert[k+1][j][i] + nvert[k+1][j][i+1] < 0.1) {
1225 dpdz = (p[k+1][j][i] + p[k+1][j][i+1] -
1226 p[k ][j][i] - p[k ][j][i+1]) * 0.5;
1229 else if ((k == 1 || k==mz-2) && user->
bctype[4]==7 && nvert[k-1][j][i] + nvert[k-1][j][i+1] > 0.1) {
1230 if (nvert[k+1][j][i] + nvert[k+1][j][i+1] < 0.1) {
1231 dpdz = (p[k+1][j][i] + p[k+1][j][i+1] -
1232 p[k ][j][i] - p[k ][j][i+1]) * 0.5;
1236 dpdz = (p[k+1][j][i] + p[k+1][j][i+1] -
1237 p[k-1][j][i] - p[k-1][j][i+1]) * 0.25;
1242 if (!(nvert[k][j][i] + nvert[k][j][i+1])) {
1244 (dpdc * (icsi[k][j][i].
x * icsi[k][j][i].
x +
1245 icsi[k][j][i].
y * icsi[k][j][i].
y +
1246 icsi[k][j][i].
z * icsi[k][j][i].
z) * iaj[k][j][i] +
1247 dpde * (ieta[k][j][i].x * icsi[k][j][i].x +
1248 ieta[k][j][i].y * icsi[k][j][i].y +
1249 ieta[k][j][i].z * icsi[k][j][i].z) * iaj[k][j][i] +
1250 dpdz * (izet[k][j][i].
x * icsi[k][j][i].
x +
1251 izet[k][j][i].
y * icsi[k][j][i].
y +
1252 izet[k][j][i].
z * icsi[k][j][i].
z) * iaj[k][j][i])
1259 if (user->
bctype[2] == 7 && ys == 0) {
1261 for (PetscInt k=lzs; k<lze; k++) {
1262 for (PetscInt i=lxs; i<lxe; i++) {
1265 PetscReal dpdc = 0.;
1266 PetscReal dpdz = 0.;
1267 if ((i == mx-2 && user->
bctype[0]!=7) || nvert[k][j][i+1] + nvert[k][j+1][i+1] > 0.1) {
1268 if (nvert[k][j][i-1] + nvert[k][j+1][i-1] < 0.1 && (i!=1 || (i==1 && user->
bctype[0]==7))) {
1269 dpdc = (p[k][j][i ] + p[k][j+1][i ] -
1270 p[k][j][i-1] - p[k][j+1][i-1]) * 0.5;
1273 else if ((i == mx-2 || i==1) && user->
bctype[0]==7 && nvert[k][j][i+1] + nvert[k][j+1][i+1] > 0.1) {
1274 if (nvert[k][j][i-1] + nvert[k][j+1][i-1] < 0.1) {
1275 dpdc = (p[k][j][i ] + p[k][j+1][i ] -
1276 p[k][j][i-1] - p[k][j+1][i-1]) * 0.5;
1279 else if ((i == 1 && user->
bctype[0]!=7)|| nvert[k][j][i-1] + nvert[k][j+1][i-1] > 0.1) {
1280 if (nvert[k][j][i+1] + nvert[k][j+1][i+1] < 0.1) {
1281 dpdc = (p[k][j][i+1] + p[k][j+1][i+1] -
1282 p[k][j][i ] - p[k][j+1][i ]) * 0.5;
1285 else if ((i == 1 || i==mx-2) && user->
bctype[0]==7 && nvert[k][j][i-1] + nvert[k][j+1][i-1] > 0.1) {
1286 if (nvert[k][j][i+1] + nvert[k][j+1][i+1] < 0.1) {
1287 dpdc = (p[k][j][i+1] + p[k][j+1][i+1] -
1288 p[k][j][i ] - p[k][j+1][i ]) * 0.5;
1292 dpdc = (p[k][j][i+1] + p[k][j+1][i+1] -
1293 p[k][j][i-1] - p[k][j+1][i-1]) * 0.25;
1296 PetscReal dpde = p[k][j+1][i] - p[k][j][i];
1298 if ((k == mz-2 && user->
bctype[4]!=7)|| nvert[k+1][j][i] + nvert[k+1][j+1][i] > 0.1) {
1299 if (nvert[k-1][j][i] + nvert[k-1][j+1][i] < 0.1 && (k!=1 || (k==1 && user->
bctype[4]==7))) {
1300 dpdz = (p[k ][j][i] + p[k ][j+1][i] -
1301 p[k-1][j][i] - p[k-1][j+1][i]) * 0.5;
1304 else if ((k == mz-2 || k==1 ) && user->
bctype[0]==7 && nvert[k+1][j][i] + nvert[k+1][j+1][i] > 0.1) {
1305 if (nvert[k-1][j][i] + nvert[k-1][j+1][i] < 0.1) {
1306 dpdz = (p[k ][j][i] + p[k ][j+1][i] -
1307 p[k-1][j][i] - p[k-1][j+1][i]) * 0.5;
1310 else if ((k == 1 && user->
bctype[4]!=7)|| nvert[k-1][j][i] + nvert[k-1][j+1][i] > 0.1) {
1311 if (nvert[k+1][j][i] + nvert[k+1][j+1][i] < 0.1) {
1312 dpdz = (p[k+1][j][i] + p[k+1][j+1][i] -
1313 p[k ][j][i] - p[k ][j+1][i]) * 0.5;
1316 else if ((k == 1 || k==mz-2) && user->
bctype[4]==7 && nvert[k-1][j][i] + nvert[k-1][j+1][i] > 0.1) {
1317 if (nvert[k+1][j][i] + nvert[k+1][j+1][i] < 0.1) {
1318 dpdz = (p[k+1][j][i] + p[k+1][j+1][i] -
1319 p[k ][j][i] - p[k ][j+1][i]) * 0.5;
1323 dpdz = (p[k+1][j][i] + p[k+1][j+1][i] -
1324 p[k-1][j][i] - p[k-1][j+1][i]) * 0.25;
1327 if (!(nvert[k][j][i] + nvert[k][j+1][i])) {
1329 (dpdc * (jcsi[k][j][i].
x * jeta[k][j][i].
x +
1330 jcsi[k][j][i].
y * jeta[k][j][i].
y +
1331 jcsi[k][j][i].
z * jeta[k][j][i].
z) * jaj[k][j][i] +
1332 dpde * (jeta[k][j][i].x * jeta[k][j][i].x +
1333 jeta[k][j][i].y * jeta[k][j][i].y +
1334 jeta[k][j][i].z * jeta[k][j][i].z) * jaj[k][j][i] +
1335 dpdz * (jzet[k][j][i].
x * jeta[k][j][i].
x +
1336 jzet[k][j][i].
y * jeta[k][j][i].
y +
1337 jzet[k][j][i].
z * jeta[k][j][i].
z) * jaj[k][j][i])
1344 if (user->
bctype[4] == 7 && zs == 0) {
1345 for (PetscInt j=lys; j<lye; j++) {
1346 for (PetscInt i=lxs; i<lxe; i++) {
1349 PetscReal dpdc = 0.;
1350 PetscReal dpde = 0.;
1352 if ((i == mx-2 && user->
bctype[0]!=7)|| nvert[k][j][i+1] + nvert[k+1][j][i+1] > 0.1) {
1353 if (nvert[k][j][i-1] + nvert[k+1][j][i-1] < 0.1 && (i!=1 || (i==1 && user->
bctype[0]==7))) {
1354 dpdc = (p[k][j][i ] + p[k+1][j][i ] -
1355 p[k][j][i-1] - p[k+1][j][i-1]) * 0.5;
1358 else if ((i == mx-2 || i==1) && user->
bctype[0]==7 && nvert[k][j][i+1] + nvert[k+1][j][i+1] > 0.1) {
1359 if (nvert[k][j][i-1] + nvert[k+1][j][i-1] < 0.1) {
1360 dpdc = (p[k][j][i ] + p[k+1][j][i ] -
1361 p[k][j][i-1] - p[k+1][j][i-1]) * 0.5;
1364 else if ((i == 1 && user->
bctype[0]!=7)|| nvert[k][j][i-1] + nvert[k+1][j][i-1] > 0.1) {
1365 if (nvert[k][j][i+1] + nvert[k+1][j][i+1] < 0.1) {
1366 dpdc = (p[k][j][i+1] + p[k+1][j][i+1] -
1367 p[k][j][i ] - p[k+1][j][i ]) * 0.5;
1370 else if ((i == 1 || i==mx-2) && user->
bctype[0]==7 && nvert[k][j][i-1] + nvert[k+1][j][i-1] > 0.1) {
1371 if (nvert[k][j][i+1] + nvert[k+1][j][i+1] < 0.1) {
1372 dpdc = (p[k][j][i+1] + p[k+1][j][i+1] -
1373 p[k][j][i ] - p[k+1][j][i ]) * 0.5;
1377 dpdc = (p[k][j][i+1] + p[k+1][j][i+1] -
1378 p[k][j][i-1] - p[k+1][j][i-1]) * 0.25;
1381 if ((j == my-2 && user->
bctype[2]!=7)|| nvert[k][j+1][i] + nvert[k+1][j+1][i] > 0.1) {
1382 if (nvert[k][j-1][i] + nvert[k+1][j-1][i] < 0.1 && (j!=1 || (j==1 && user->
bctype[2]==7))) {
1383 dpde = (p[k][j ][i] + p[k+1][j ][i] -
1384 p[k][j-1][i] - p[k+1][j-1][i]) * 0.5;
1387 else if ((j == my-2 || j==1) && user->
bctype[2]==7 && nvert[k][j+1][i] + nvert[k+1][j+1][i] > 0.1) {
1388 if (nvert[k][j-1][i] + nvert[k+1][j-1][i] < 0.1) {
1389 dpde = (p[k][j ][i] + p[k+1][j ][i] -
1390 p[k][j-1][i] - p[k+1][j-1][i]) * 0.5;
1393 else if ((j == 1 && user->
bctype[2]!=7)|| nvert[k][j-1][i] + nvert[k+1][j-1][i] > 0.1) {
1394 if (nvert[k][j+1][i] + nvert[k+1][j+1][i] < 0.1) {
1395 dpde = (p[k][j+1][i] + p[k+1][j+1][i] -
1396 p[k][j ][i] - p[k+1][j ][i]) * 0.5;
1399 else if ((j == 1 || j==my-2) && user->
bctype[2]==7 && nvert[k][j-1][i] + nvert[k+1][j-1][i] > 0.1) {
1400 if (nvert[k][j+1][i] + nvert[k+1][j+1][i] < 0.1) {
1401 dpde = (p[k][j+1][i] + p[k+1][j+1][i] -
1402 p[k][j ][i] - p[k+1][j ][i]) * 0.5;
1406 dpde = (p[k][j+1][i] + p[k+1][j+1][i] -
1407 p[k][j-1][i] - p[k+1][j-1][i]) * 0.25;
1410 PetscReal dpdz = p[k+1][j][i] - p[k][j][i];
1412 if (!(nvert[k][j][i] + nvert[k+1][j][i])) {
1415 (dpdc * (kcsi[k][j][i].
x * kzet[k][j][i].
x +
1416 kcsi[k][j][i].
y * kzet[k][j][i].
y +
1417 kcsi[k][j][i].
z * kzet[k][j][i].
z) * kaj[k][j][i] +
1418 dpde * (keta[k][j][i].x * kzet[k][j][i].x +
1419 keta[k][j][i].y * kzet[k][j][i].y +
1420 keta[k][j][i].z * kzet[k][j][i].z) * kaj[k][j][i] +
1421 dpdz * (kzet[k][j][i].
x * kzet[k][j][i].
x +
1422 kzet[k][j][i].
y * kzet[k][j][i].
y +
1423 kzet[k][j][i].
z * kzet[k][j][i].
z) * kaj[k][j][i])
1448 DMDAVecRestoreArray(fda, user->
Ucont, &ucont);
1451 DMDAVecRestoreArray(fda, user->
lICsi, &icsi); DMDAVecRestoreArray(fda, user->
lIEta, &ieta); DMDAVecRestoreArray(fda, user->
lIZet, &izet);
1452 DMDAVecRestoreArray(fda, user->
lJCsi, &jcsi); DMDAVecRestoreArray(fda, user->
lJEta, &jeta); DMDAVecRestoreArray(fda, user->
lJZet, &jzet);
1453 DMDAVecRestoreArray(fda, user->
lKCsi, &kcsi); DMDAVecRestoreArray(fda, user->
lKEta, &keta); DMDAVecRestoreArray(fda, user->
lKZet, &kzet);
1454 DMDAVecRestoreArray(da, user->
lIAj, &iaj); DMDAVecRestoreArray(da, user->
lJAj, &jaj); DMDAVecRestoreArray(da, user->
lKAj, &kaj);
1455 DMDAVecRestoreArray(da, user->
lP, &p);
1456 DMDAVecRestoreArray(da, user->
lNvert, &nvert);
1460 DMGlobalToLocalBegin(fda, user->
Ucont, INSERT_VALUES, user->
lUcont);
1461 DMGlobalToLocalEnd(fda, user->
Ucont, INSERT_VALUES, user->
lUcont);
1470 PetscFunctionReturn(0);
2209 PetscFunctionBeginUser;
2212 PetscErrorCode ierr;
2220 DM da = user->
da, fda = user->
fda;
2221 DMDALocalInfo info = user->
info;
2222 PetscInt IM = user->
IM, JM = user->
JM, KM = user->
KM;
2226 PetscInt mx = info.mx, my = info.my, mz = info.mz;
2227 PetscInt xs = info.xs, xe = info.xs + info.xm;
2228 PetscInt ys = info.ys, ye = info.ys + info.ym;
2229 PetscInt zs = info.zs, ze = info.zs + info.zm;
2230 PetscInt gxs = info.gxs, gxe = gxs + info.gxm;
2231 PetscInt gys = info.gys, gye = gys + info.gym;
2232 PetscInt gzs = info.gzs, gze = gzs + info.gzm;
2235 const PetscReal IBM_FLUID_THRESHOLD = 0.1;
2240 PetscInt N = mx * my * mz;
2242 VecGetLocalSize(user->
Phi, &M);
2244 MatCreateAIJ(PETSC_COMM_WORLD, M, M, N, N, 19, PETSC_NULL, 19, PETSC_NULL, &(user->
A));
2249 MatZeroEntries(user->
A);
2252 Cmpnts ***csi, ***eta, ***zet, ***icsi, ***ieta, ***izet, ***jcsi, ***jeta, ***jzet, ***kcsi, ***keta, ***kzet;
2253 PetscReal ***aj, ***iaj, ***jaj, ***kaj, ***nvert;
2254 DMDAVecGetArray(fda, user->
lCsi, &csi); DMDAVecGetArray(fda, user->
lEta, &eta); DMDAVecGetArray(fda, user->
lZet, &zet);
2255 DMDAVecGetArray(fda, user->
lICsi, &icsi); DMDAVecGetArray(fda, user->
lIEta, &ieta); DMDAVecGetArray(fda, user->
lIZet, &izet);
2256 DMDAVecGetArray(fda, user->
lJCsi, &jcsi); DMDAVecGetArray(fda, user->
lJEta, &jeta); DMDAVecGetArray(fda, user->
lJZet, &jzet);
2257 DMDAVecGetArray(fda, user->
lKCsi, &kcsi); DMDAVecGetArray(fda, user->
lKEta, &keta); DMDAVecGetArray(fda, user->
lKZet, &kzet);
2258 DMDAVecGetArray(da, user->
lAj, &aj); DMDAVecGetArray(da, user->
lIAj, &iaj); DMDAVecGetArray(da, user->
lJAj, &jaj); DMDAVecGetArray(da, user->
lKAj, &kaj);
2259 DMDAVecGetArray(da, user->
lNvert, &nvert);
2262 Vec G11, G12, G13, G21, G22, G23, G31, G32, G33;
2263 PetscReal ***g11, ***g12, ***g13, ***g21, ***g22, ***g23, ***g31, ***g32, ***g33;
2264 VecDuplicate(user->
lAj, &G11); VecDuplicate(user->
lAj, &G12); VecDuplicate(user->
lAj, &G13);
2265 VecDuplicate(user->
lAj, &G21); VecDuplicate(user->
lAj, &G22); VecDuplicate(user->
lAj, &G23);
2266 VecDuplicate(user->
lAj, &G31); VecDuplicate(user->
lAj, &G32); VecDuplicate(user->
lAj, &G33);
2267 DMDAVecGetArray(da, G11, &g11); DMDAVecGetArray(da, G12, &g12); DMDAVecGetArray(da, G13, &g13);
2268 DMDAVecGetArray(da, G21, &g21); DMDAVecGetArray(da, G22, &g22); DMDAVecGetArray(da, G23, &g23);
2269 DMDAVecGetArray(da, G31, &g31); DMDAVecGetArray(da, G32, &g32); DMDAVecGetArray(da, G33, &g33);
2275 for (k = gzs; k < gze; k++) {
2276 for (j = gys; j < gye; j++) {
2277 for (i = gxs; i < gxe; i++) {
2280 if(i>-1 && j>-1 && k>-1 && i<IM+1 && j<JM+1 && k<KM+1){
2281 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];
2282 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];
2283 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];
2284 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];
2285 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];
2286 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];
2287 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];
2288 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];
2289 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];
2301 PetscInt x_str, x_end, y_str, y_end, z_str, z_end;
2302 if (user->
bctype[0] == 7) { x_end = mx - 1; x_str = 0; }
2303 else { x_end = mx - 2; x_str = 1; }
2304 if (user->
bctype[2] == 7) { y_end = my - 1; y_str = 0; }
2305 else { y_end = my - 2; y_str = 1; }
2306 if (user->
bctype[4] == 7) { z_end = mz - 1; z_str = 0; }
2307 else { z_end = mz - 2; z_str = 1; }
2310 for (k = zs; k < ze; k++) {
2311 for (j = ys; j < ye; j++) {
2312 for (i = xs; i < xe; i++) {
2313 PetscScalar vol[19];
2315 PetscInt row =
Gidx(i, j, k, user);
2320 if (i == 0 || i == mx - 1 || j == 0 || j == my - 1 || k == 0 || k == mz - 1 || nvert[k][j][i] > IBM_FLUID_THRESHOLD) {
2323 MatSetValues(user->
A, 1, &row, 1, &idx[
CP], &vol[
CP], INSERT_VALUES);
2327 for (PetscInt m = 0; m < 19; m++) {
2334 if (nvert[k][j][i + 1] < IBM_FLUID_THRESHOLD && i != x_end) {
2336 vol[
CP] -= g11[k][j][i];
2337 vol[
EP] += g11[k][j][i];
2342 if ((j == my-2 && user->
bctype[2]!=7) || nvert[k][j+1][i] + nvert[k][j+1][i+1] > 0.1) {
2343 if (nvert[k][j-1][i] + nvert[k][j-1][i+1] < 0.1 && (j!=1 || (j==1 && user->
bctype[2]==7))) {
2344 vol[
CP] += g12[k][j][i] * 0.5; vol[
EP] += g12[k][j][i] * 0.5;
2345 vol[
SP] -= g12[k][j][i] * 0.5; vol[
SE] -= g12[k][j][i] * 0.5;
2348 else if ((j == my-2 || j==1) && user->
bctype[2]==7 && nvert[k][j+1][i] + nvert[k][j+1][i+1] > 0.1) {
2349 if (nvert[k][j-1][i] + nvert[k][j-1][i+1] < 0.1) {
2350 vol[
CP] += g12[k][j][i] * 0.5; vol[
EP] += g12[k][j][i] * 0.5;
2351 vol[
SP] -= g12[k][j][i] * 0.5; vol[
SE] -= g12[k][j][i] * 0.5;
2354 else if ((j == 1 && user->
bctype[2]!=7) || nvert[k][j-1][i] + nvert[k][j-1][i+1] > 0.1) {
2355 if (nvert[k][j+1][i] + nvert[k][j+1][i+1] < 0.1) {
2356 vol[
NP] += g12[k][j][i] * 0.5; vol[
NE] += g12[k][j][i] * 0.5;
2357 vol[
CP] -= g12[k][j][i] * 0.5; vol[
EP] -= g12[k][j][i] * 0.5;
2360 else if ((j == 1 || j==my-2) && user->
bctype[2]==7 && nvert[k][j-1][i] + nvert[k][j-1][i+1] > 0.1) {
2361 if (nvert[k][j+1][i] + nvert[k][j+1][i+1] < 0.1) {
2362 vol[
NP] += g12[k][j][i] * 0.5; vol[
NE] += g12[k][j][i] * 0.5;
2363 vol[
CP] -= g12[k][j][i] * 0.5; vol[
EP] -= g12[k][j][i] * 0.5;
2367 vol[
NP] += g12[k][j][i] * 0.25; vol[
NE] += g12[k][j][i] * 0.25;
2368 vol[
SP] -= g12[k][j][i] * 0.25; vol[
SE] -= g12[k][j][i] * 0.25;
2372 if ((k == mz-2 && user->
bctype[4]!=7) || nvert[k+1][j][i] + nvert[k+1][j][i+1] > 0.1) {
2373 if (nvert[k-1][j][i] + nvert[k-1][j][i+1] < 0.1 && (k!=1 || (k==1 && user->
bctype[4]==7))) {
2374 vol[
CP] += g13[k][j][i] * 0.5; vol[
EP] += g13[k][j][i] * 0.5;
2375 vol[
BP] -= g13[k][j][i] * 0.5; vol[
BE] -= g13[k][j][i] * 0.5;
2378 else if ((k == mz-2 || k==1) && user->
bctype[4]==7 && nvert[k+1][j][i] + nvert[k+1][j][i+1] > 0.1) {
2379 if (nvert[k-1][j][i] + nvert[k-1][j][i+1] < 0.1) {
2380 vol[
CP] += g13[k][j][i] * 0.5; vol[
EP] += g13[k][j][i] * 0.5;
2381 vol[
BP] -= g13[k][j][i] * 0.5; vol[
BE] -= g13[k][j][i] * 0.5;
2384 else if ((k == 1 && user->
bctype[4]!=7) || nvert[k-1][j][i] + nvert[k-1][j][i+1] > 0.1) {
2385 if (nvert[k+1][j][i] + nvert[k+1][j][i+1] < 0.1) {
2386 vol[
TP] += g13[k][j][i] * 0.5; vol[
TE] += g13[k][j][i] * 0.5;
2387 vol[
CP] -= g13[k][j][i] * 0.5; vol[
EP] -= g13[k][j][i] * 0.5;
2390 else if ((k == 1 || k==mz-2) && user->
bctype[4]==7 && nvert[k-1][j][i] + nvert[k-1][j][i+1] > 0.1) {
2391 if (nvert[k+1][j][i] + nvert[k+1][j][i+1] < 0.1) {
2392 vol[
TP] += g13[k][j][i] * 0.5; vol[
TE] += g13[k][j][i] * 0.5;
2393 vol[
CP] -= g13[k][j][i] * 0.5; vol[
EP] -= g13[k][j][i] * 0.5;
2397 vol[
TP] += g13[k][j][i] * 0.25; vol[
TE] += g13[k][j][i] * 0.25;
2398 vol[
BP] -= g13[k][j][i] * 0.25; vol[
BE] -= g13[k][j][i] * 0.25;
2405 if (nvert[k][j][i-1] < IBM_FLUID_THRESHOLD && i != x_str) {
2406 vol[
CP] -= g11[k][j][i-1];
2407 vol[
WP] += g11[k][j][i-1];
2409 if ((j == my-2 && user->
bctype[2]!=7) || nvert[k][j+1][i] + nvert[k][j+1][i-1] > 0.1) {
2410 if (nvert[k][j-1][i] + nvert[k][j-1][i-1] < 0.1 && (j!=1 || (j==1 && user->
bctype[2]==7))) {
2411 vol[
CP] -= g12[k][j][i-1] * 0.5; vol[
WP] -= g12[k][j][i-1] * 0.5;
2412 vol[
SP] += g12[k][j][i-1] * 0.5; vol[
SW] += g12[k][j][i-1] * 0.5;
2415 else if ((j == my-2 || j==1) && user->
bctype[2]==7 && nvert[k][j+1][i] + nvert[k][j+1][i-1] > 0.1) {
2416 if (nvert[k][j-1][i] + nvert[k][j-1][i-1] < 0.1) {
2417 vol[
CP] -= g12[k][j][i-1] * 0.5; vol[
WP] -= g12[k][j][i-1] * 0.5;
2418 vol[
SP] += g12[k][j][i-1] * 0.5; vol[
SW] += g12[k][j][i-1] * 0.5;
2421 else if ((j == 1 && user->
bctype[2]!=7)|| nvert[k][j-1][i] + nvert[k][j-1][i-1] > 0.1) {
2422 if (nvert[k][j+1][i] + nvert[k][j+1][i-1] < 0.1) {
2423 vol[
NP] -= g12[k][j][i-1] * 0.5; vol[
NW] -= g12[k][j][i-1] * 0.5;
2424 vol[
CP] += g12[k][j][i-1] * 0.5; vol[
WP] += g12[k][j][i-1] * 0.5;
2427 else if ((j == 1 || j==my-2) && user->
bctype[2]==7 && nvert[k][j-1][i] + nvert[k][j-1][i-1] > 0.1) {
2428 if (nvert[k][j+1][i] + nvert[k][j+1][i-1] < 0.1) {
2429 vol[
NP] -= g12[k][j][i-1] * 0.5; vol[
NW] -= g12[k][j][i-1] * 0.5;
2430 vol[
CP] += g12[k][j][i-1] * 0.5; vol[
WP] += g12[k][j][i-1] * 0.5;
2434 vol[
NP] -= g12[k][j][i-1] * 0.25; vol[
NW] -= g12[k][j][i-1] * 0.25;
2435 vol[
SP] += g12[k][j][i-1] * 0.25; vol[
SW] += g12[k][j][i-1] * 0.25;
2438 if ((k == mz-2 && user->
bctype[4]!=7) || nvert[k+1][j][i] + nvert[k+1][j][i-1] > 0.1) {
2439 if (nvert[k-1][j][i] + nvert[k-1][j][i-1] < 0.1 && (k!=1 || (k==1 && user->
bctype[4]==7))) {
2440 vol[
CP] -= g13[k][j][i-1] * 0.5; vol[
WP] -= g13[k][j][i-1] * 0.5;
2441 vol[
BP] += g13[k][j][i-1] * 0.5; vol[
BW] += g13[k][j][i-1] * 0.5;
2444 else if ((k == mz-2 || k==1) && user->
bctype[4]==7 && nvert[k+1][j][i] + nvert[k+1][j][i-1] > 0.1) {
2445 if (nvert[k-1][j][i] + nvert[k-1][j][i-1] < 0.1) {
2446 vol[
CP] -= g13[k][j][i-1] * 0.5; vol[
WP] -= g13[k][j][i-1] * 0.5;
2447 vol[
BP] += g13[k][j][i-1] * 0.5; vol[
BW] += g13[k][j][i-1] * 0.5;
2450 else if ((k == 1 && user->
bctype[4]!=7) || nvert[k-1][j][i] + nvert[k-1][j][i-1] > 0.1) {
2451 if (nvert[k+1][j][i] + nvert[k+1][j][i-1] < 0.1) {
2452 vol[
TP] -= g13[k][j][i-1] * 0.5; vol[
TW] -= g13[k][j][i-1] * 0.5;
2453 vol[
CP] += g13[k][j][i-1] * 0.5; vol[
WP] += g13[k][j][i-1] * 0.5;
2456 else if ((k == 1 || k==mz-2) && user->
bctype[4]==7 && nvert[k-1][j][i] + nvert[k-1][j][i-1] > 0.1) {
2457 if (nvert[k+1][j][i] + nvert[k+1][j][i-1] < 0.1) {
2458 vol[
TP] -= g13[k][j][i-1] * 0.5; vol[
TW] -= g13[k][j][i-1] * 0.5;
2459 vol[
CP] += g13[k][j][i-1] * 0.5; vol[
WP] += g13[k][j][i-1] * 0.5;
2463 vol[
TP] -= g13[k][j][i-1] * 0.25; vol[
TW] -= g13[k][j][i-1] * 0.25;
2464 vol[
BP] += g13[k][j][i-1] * 0.25; vol[
BW] += g13[k][j][i-1] * 0.25;
2471 if (nvert[k][j+1][i] < IBM_FLUID_THRESHOLD && j != y_end) {
2472 if ((i == mx-2 && user->
bctype[0]!=7)|| nvert[k][j][i+1] + nvert[k][j+1][i+1] > 0.1) {
2473 if (nvert[k][j][i-1] + nvert[k][j+1][i-1] < 0.1 && (i!=1 || (i==1 && user->
bctype[0]==7))) {
2474 vol[
CP] += g21[k][j][i] * 0.5; vol[
NP] += g21[k][j][i] * 0.5;
2475 vol[
WP] -= g21[k][j][i] * 0.5; vol[
NW] -= g21[k][j][i] * 0.5;
2478 else if ((i == mx-2 || i==1) && user->
bctype[0]==7 && nvert[k][j][i+1] + nvert[k][j+1][i+1] > 0.1) {
2479 if (nvert[k][j][i-1] + nvert[k][j+1][i-1] < 0.1) {
2480 vol[
CP] += g21[k][j][i] * 0.5; vol[
NP] += g21[k][j][i] * 0.5;
2481 vol[
WP] -= g21[k][j][i] * 0.5; vol[
NW] -= g21[k][j][i] * 0.5;
2484 else if ((i == 1 && user->
bctype[0]!=7) || nvert[k][j][i-1] + nvert[k][j+1][i-1] > 0.1) {
2485 if (nvert[k][j][i+1] + nvert[k][j+1][i+1] < 0.1) {
2486 vol[
EP] += g21[k][j][i] * 0.5; vol[
NE] += g21[k][j][i] * 0.5;
2487 vol[
CP] -= g21[k][j][i] * 0.5; vol[
NP] -= g21[k][j][i] * 0.5;
2490 else if ((i == 1 || i==mx-2) && user->
bctype[0]==7 && nvert[k][j][i-1] + nvert[k][j+1][i-1] > 0.1) {
2491 if (nvert[k][j][i+1] + nvert[k][j+1][i+1] < 0.1) {
2492 vol[
EP] += g21[k][j][i] * 0.5; vol[
NE] += g21[k][j][i] * 0.5;
2493 vol[
CP] -= g21[k][j][i] * 0.5; vol[
NP] -= g21[k][j][i] * 0.5;
2497 vol[
EP] += g21[k][j][i] * 0.25; vol[
NE] += g21[k][j][i] * 0.25;
2498 vol[
WP] -= g21[k][j][i] * 0.25; vol[
NW] -= g21[k][j][i] * 0.25;
2501 vol[
CP] -= g22[k][j][i];
2502 vol[
NP] += g22[k][j][i];
2504 if ((k == mz-2 && user->
bctype[4]!=7)|| nvert[k+1][j][i] + nvert[k+1][j+1][i] > 0.1) {
2505 if (nvert[k-1][j][i] + nvert[k-1][j+1][i] < 0.1 && (k!=1 || (k==1 && user->
bctype[4]==7))) {
2506 vol[
CP] += g23[k][j][i] * 0.5; vol[
NP] += g23[k][j][i] * 0.5;
2507 vol[
BP] -= g23[k][j][i] * 0.5; vol[
BN] -= g23[k][j][i] * 0.5;
2510 else if ((k == mz-2 || k==1 ) && user->
bctype[4]==7 && nvert[k+1][j][i] + nvert[k+1][j+1][i] > 0.1) {
2511 if (nvert[k-1][j][i] + nvert[k-1][j+1][i] < 0.1) {
2512 vol[
CP] += g23[k][j][i] * 0.5; vol[
NP] += g23[k][j][i] * 0.5;
2513 vol[
BP] -= g23[k][j][i] * 0.5; vol[
BN] -= g23[k][j][i] * 0.5;
2516 else if ((k == 1 && user->
bctype[4]!=7)|| nvert[k-1][j][i] + nvert[k-1][j+1][i] > 0.1) {
2517 if (nvert[k+1][j][i] + nvert[k+1][j+1][i] < 0.1) {
2518 vol[
TP] += g23[k][j][i] * 0.5; vol[
TN] += g23[k][j][i] * 0.5;
2519 vol[
CP] -= g23[k][j][i] * 0.5; vol[
NP] -= g23[k][j][i] * 0.5;
2522 else if ((k == 1 || k==mz-2 ) && user->
bctype[4]==7 && nvert[k-1][j][i] + nvert[k-1][j+1][i] > 0.1) {
2523 if (nvert[k+1][j][i] + nvert[k+1][j+1][i] < 0.1) {
2524 vol[
TP] += g23[k][j][i] * 0.5; vol[
TN] += g23[k][j][i] * 0.5;
2525 vol[
CP] -= g23[k][j][i] * 0.5; vol[
NP] -= g23[k][j][i] * 0.5;
2529 vol[
TP] += g23[k][j][i] * 0.25; vol[
TN] += g23[k][j][i] * 0.25;
2530 vol[
BP] -= g23[k][j][i] * 0.25; vol[
BN] -= g23[k][j][i] * 0.25;
2537 if (nvert[k][j-1][i] < IBM_FLUID_THRESHOLD && j != y_str) {
2538 if ((i == mx-2 && user->
bctype[0]!=7) || nvert[k][j][i+1] + nvert[k][j-1][i+1] > 0.1) {
2539 if (nvert[k][j][i-1] + nvert[k][j-1][i-1] < 0.1 && (i!=1 || (i==1 && user->
bctype[0]==7))) {
2540 vol[
CP] -= g21[k][j-1][i] * 0.5; vol[
SP] -= g21[k][j-1][i] * 0.5;
2541 vol[
WP] += g21[k][j-1][i] * 0.5; vol[
SW] += g21[k][j-1][i] * 0.5;
2544 else if ((i == mx-2 || i==1) && user->
bctype[0]==7 && nvert[k][j][i+1] + nvert[k][j-1][i+1] > 0.1) {
2545 if (nvert[k][j][i-1] + nvert[k][j-1][i-1] < 0.1) {
2546 vol[
CP] -= g21[k][j-1][i] * 0.5; vol[
SP] -= g21[k][j-1][i] * 0.5;
2547 vol[
WP] += g21[k][j-1][i] * 0.5; vol[
SW] += g21[k][j-1][i] * 0.5;
2550 else if ((i == 1 && user->
bctype[0]!=7)|| nvert[k][j][i-1] + nvert[k][j-1][i-1] > 0.1) {
2551 if (nvert[k][j][i+1] + nvert[k][j-1][i+1] < 0.1) {
2552 vol[
EP] -= g21[k][j-1][i] * 0.5; vol[
SE] -= g21[k][j-1][i] * 0.5;
2553 vol[
CP] += g21[k][j-1][i] * 0.5; vol[
SP] += g21[k][j-1][i] * 0.5;
2556 else if ((i == 1 || i==mx-2) && user->
bctype[0]==7 && nvert[k][j][i-1] + nvert[k][j-1][i-1] > 0.1) {
2557 if (nvert[k][j][i+1] + nvert[k][j-1][i+1] < 0.1) {
2558 vol[
EP] -= g21[k][j-1][i] * 0.5; vol[
SE] -= g21[k][j-1][i] * 0.5;
2559 vol[
CP] += g21[k][j-1][i] * 0.5; vol[
SP] += g21[k][j-1][i] * 0.5;
2563 vol[
EP] -= g21[k][j-1][i] * 0.25; vol[
SE] -= g21[k][j-1][i] * 0.25;
2564 vol[
WP] += g21[k][j-1][i] * 0.25; vol[
SW] += g21[k][j-1][i] * 0.25;
2567 vol[
CP] -= g22[k][j-1][i];
2568 vol[
SP] += g22[k][j-1][i];
2570 if ((k == mz-2 && user->
bctype[4]!=7)|| nvert[k+1][j][i] + nvert[k+1][j-1][i] > 0.1) {
2571 if (nvert[k-1][j][i] + nvert[k-1][j-1][i] < 0.1 && (k!=1 || (k==1 && user->
bctype[4]==7))) {
2572 vol[
CP] -= g23[k][j-1][i] * 0.5; vol[
SP] -= g23[k][j-1][i] * 0.5;
2573 vol[
BP] += g23[k][j-1][i] * 0.5; vol[
BS] += g23[k][j-1][i] * 0.5;
2576 else if ((k == mz-2 || k==1) && user->
bctype[4]==7 && nvert[k+1][j][i] + nvert[k+1][j-1][i] > 0.1) {
2577 if (nvert[k-1][j][i] + nvert[k-1][j-1][i] < 0.1 ) {
2578 vol[
CP] -= g23[k][j-1][i] * 0.5; vol[
SP] -= g23[k][j-1][i] * 0.5;
2579 vol[
BP] += g23[k][j-1][i] * 0.5; vol[
BS] += g23[k][j-1][i] * 0.5;
2582 else if ((k == 1 && user->
bctype[4]!=7)|| nvert[k-1][j][i] + nvert[k-1][j-1][i] > 0.1) {
2583 if (nvert[k+1][j][i] + nvert[k+1][j-1][i] < 0.1) {
2584 vol[
TP] -= g23[k][j-1][i] * 0.5; vol[
TS] -= g23[k][j-1][i] * 0.5;
2585 vol[
CP] += g23[k][j-1][i] * 0.5; vol[
SP] += g23[k][j-1][i] * 0.5;
2588 else if ((k == 1 || k==mz-2) && user->
bctype[4]==7 && nvert[k-1][j][i] + nvert[k-1][j-1][i] > 0.1) {
2589 if (nvert[k+1][j][i] + nvert[k+1][j-1][i] < 0.1) {
2590 vol[
TP] -= g23[k][j-1][i] * 0.5; vol[
TS] -= g23[k][j-1][i] * 0.5;
2591 vol[
CP] += g23[k][j-1][i] * 0.5; vol[
SP] += g23[k][j-1][i] * 0.5;
2595 vol[
TP] -= g23[k][j-1][i] * 0.25; vol[
TS] -= g23[k][j-1][i] * 0.25;
2596 vol[
BP] += g23[k][j-1][i] * 0.25; vol[
BS] += g23[k][j-1][i] * 0.25;
2603 if (nvert[k+1][j][i] < IBM_FLUID_THRESHOLD && k != z_end) {
2604 if ((i == mx-2 && user->
bctype[0]!=7)|| nvert[k][j][i+1] + nvert[k+1][j][i+1] > 0.1) {
2605 if (nvert[k][j][i-1] + nvert[k+1][j][i-1] < 0.1 && (i!=1 || (i==1 && user->
bctype[0]==7))) {
2606 vol[
CP] += g31[k][j][i] * 0.5; vol[
TP] += g31[k][j][i] * 0.5;
2607 vol[
WP] -= g31[k][j][i] * 0.5; vol[
TW] -= g31[k][j][i] * 0.5;
2610 else if ((i == mx-2 || i==1) && user->
bctype[0]==7 && nvert[k][j][i+1] + nvert[k+1][j][i+1] > 0.1) {
2611 if (nvert[k][j][i-1] + nvert[k+1][j][i-1] < 0.1) {
2612 vol[
CP] += g31[k][j][i] * 0.5; vol[
TP] += g31[k][j][i] * 0.5;
2613 vol[
WP] -= g31[k][j][i] * 0.5; vol[
TW] -= g31[k][j][i] * 0.5;
2616 else if ((i == 1 && user->
bctype[0]!=7)|| nvert[k][j][i-1] + nvert[k+1][j][i-1] > 0.1) {
2617 if (nvert[k][j][i+1] + nvert[k+1][j][i+1] < 0.1) {
2618 vol[
EP] += g31[k][j][i] * 0.5; vol[
TE] += g31[k][j][i] * 0.5;
2619 vol[
CP] -= g31[k][j][i] * 0.5; vol[
TP] -= g31[k][j][i] * 0.5;
2622 else if ((i == 1 || i==mx-2) && user->
bctype[0]==7 && nvert[k][j][i-1] + nvert[k+1][j][i-1] > 0.1) {
2623 if (nvert[k][j][i+1] + nvert[k+1][j][i+1] < 0.1) {
2624 vol[
EP] += g31[k][j][i] * 0.5; vol[
TE] += g31[k][j][i] * 0.5;
2625 vol[
CP] -= g31[k][j][i] * 0.5; vol[
TP] -= g31[k][j][i] * 0.5;
2629 vol[
EP] += g31[k][j][i] * 0.25; vol[
TE] += g31[k][j][i] * 0.25;
2630 vol[
WP] -= g31[k][j][i] * 0.25; vol[
TW] -= g31[k][j][i] * 0.25;
2633 if ((j == my-2 && user->
bctype[2]!=7)|| nvert[k][j+1][i] + nvert[k+1][j+1][i] > 0.1) {
2634 if (nvert[k][j-1][i] + nvert[k+1][j-1][i] < 0.1 && (j!=1 || (j==1 && user->
bctype[2]==7))) {
2635 vol[
CP] += g32[k][j][i] * 0.5; vol[
TP] += g32[k][j][i] * 0.5;
2636 vol[
SP] -= g32[k][j][i] * 0.5; vol[
TS] -= g32[k][j][i] * 0.5;
2639 else if ((j == my-2 || j==1) && user->
bctype[2]==7 && nvert[k][j+1][i] + nvert[k+1][j+1][i] > 0.1) {
2640 if (nvert[k][j-1][i] + nvert[k+1][j-1][i] < 0.1) {
2641 vol[
CP] += g32[k][j][i] * 0.5; vol[
TP] += g32[k][j][i] * 0.5;
2642 vol[
SP] -= g32[k][j][i] * 0.5; vol[
TS] -= g32[k][j][i] * 0.5;
2645 else if ((j == 1 && user->
bctype[2]!=7)|| nvert[k][j-1][i] + nvert[k+1][j-1][i] > 0.1) {
2646 if (nvert[k][j+1][i] + nvert[k+1][j+1][i] < 0.1) {
2647 vol[
NP] += g32[k][j][i] * 0.5; vol[
TN] += g32[k][j][i] * 0.5;
2648 vol[
CP] -= g32[k][j][i] * 0.5; vol[
TP] -= g32[k][j][i] * 0.5;
2651 else if ((j == 1 || j==my-2) && user->
bctype[2]==7 && nvert[k][j-1][i] + nvert[k+1][j-1][i] > 0.1) {
2652 if (nvert[k][j+1][i] + nvert[k+1][j+1][i] < 0.1) {
2653 vol[
NP] += g32[k][j][i] * 0.5; vol[
TN] += g32[k][j][i] * 0.5;
2654 vol[
CP] -= g32[k][j][i] * 0.5; vol[
TP] -= g32[k][j][i] * 0.5;
2658 vol[
NP] += g32[k][j][i] * 0.25; vol[
TN] += g32[k][j][i] * 0.25;
2659 vol[
SP] -= g32[k][j][i] * 0.25; vol[
TS] -= g32[k][j][i] * 0.25;
2662 vol[
CP] -= g33[k][j][i];
2663 vol[
TP] += g33[k][j][i];
2669 if (nvert[k-1][j][i] < IBM_FLUID_THRESHOLD && k != z_str) {
2670 if ((i == mx-2 && user->
bctype[0]!=7)|| nvert[k][j][i+1] + nvert[k-1][j][i+1] > 0.1) {
2671 if (nvert[k][j][i-1] + nvert[k-1][j][i-1] < 0.1 && (i!=1 || (i==1 && user->
bctype[0]==7))) {
2672 vol[
CP] -= g31[k-1][j][i] * 0.5; vol[
BP] -= g31[k-1][j][i] * 0.5;
2673 vol[
WP] += g31[k-1][j][i] * 0.5; vol[
BW] += g31[k-1][j][i] * 0.5;
2676 else if ((i == mx-2 || i==1) && user->
bctype[0]==7 && nvert[k][j][i+1] + nvert[k-1][j][i+1] > 0.1) {
2677 if (nvert[k][j][i-1] + nvert[k-1][j][i-1] < 0.1) {
2678 vol[
CP] -= g31[k-1][j][i] * 0.5; vol[
BP] -= g31[k-1][j][i] * 0.5;
2679 vol[
WP] += g31[k-1][j][i] * 0.5; vol[
BW] += g31[k-1][j][i] * 0.5;
2682 else if ((i == 1 && user->
bctype[0]!=7)|| nvert[k][j][i-1] + nvert[k-1][j][i-1] > 0.1) {
2683 if (nvert[k][j][i+1] + nvert[k-1][j][i+1] < 0.1) {
2684 vol[
EP] -= g31[k-1][j][i] * 0.5; vol[
BE] -= g31[k-1][j][i] * 0.5;
2685 vol[
CP] += g31[k-1][j][i] * 0.5; vol[
BP] += g31[k-1][j][i] * 0.5;
2688 else if ((i == 1 || i==mx-2) && user->
bctype[0]==7 && nvert[k][j][i-1] + nvert[k-1][j][i-1] > 0.1) {
2689 if (nvert[k][j][i+1] + nvert[k-1][j][i+1] < 0.1) {
2690 vol[
EP] -= g31[k-1][j][i] * 0.5; vol[
BE] -= g31[k-1][j][i] * 0.5;
2691 vol[
CP] += g31[k-1][j][i] * 0.5; vol[
BP] += g31[k-1][j][i] * 0.5;
2695 vol[
EP] -= g31[k-1][j][i] * 0.25; vol[
BE] -= g31[k-1][j][i] * 0.25;
2696 vol[
WP] += g31[k-1][j][i] * 0.25; vol[
BW] += g31[k-1][j][i] * 0.25;
2699 if ((j == my-2 && user->
bctype[2]!=7)|| nvert[k][j+1][i] + nvert[k-1][j+1][i] > 0.1) {
2700 if (nvert[k][j-1][i] + nvert[k-1][j-1][i] < 0.1 && (j!=1 || (j==1 && user->
bctype[2]==7))) {
2701 vol[
CP] -= g32[k-1][j][i] * 0.5; vol[
BP] -= g32[k-1][j][i] * 0.5;
2702 vol[
SP] += g32[k-1][j][i] * 0.5; vol[
BS] += g32[k-1][j][i] * 0.5;
2705 else if ((j == my-2 || j==1) && user->
bctype[2]==7 && nvert[k][j+1][i] + nvert[k-1][j+1][i] > 0.1) {
2706 if (nvert[k][j-1][i] + nvert[k-1][j-1][i] < 0.1) {
2707 vol[
CP] -= g32[k-1][j][i] * 0.5; vol[
BP] -= g32[k-1][j][i] * 0.5;
2708 vol[
SP] += g32[k-1][j][i] * 0.5; vol[
BS] += g32[k-1][j][i] * 0.5;
2711 else if ((j == 1 && user->
bctype[2]!=7)|| nvert[k][j-1][i] + nvert[k-1][j-1][i] > 0.1) {
2712 if (nvert[k][j+1][i] + nvert[k-1][j+1][i] < 0.1) {
2713 vol[
NP] -= g32[k-1][j][i] * 0.5; vol[
BN] -= g32[k-1][j][i] * 0.5;
2714 vol[
CP] += g32[k-1][j][i] * 0.5; vol[
BP] += g32[k-1][j][i] * 0.5;
2717 else if ((j == 1 || j==my-2) && user->
bctype[2]==7 && nvert[k][j-1][i] + nvert[k-1][j-1][i] > 0.1) {
2718 if (nvert[k][j+1][i] + nvert[k-1][j+1][i] < 0.1) {
2719 vol[
NP] -= g32[k-1][j][i] * 0.5; vol[
BN] -= g32[k-1][j][i] * 0.5;
2720 vol[
CP] += g32[k-1][j][i] * 0.5; vol[
BP] += g32[k-1][j][i] * 0.5;
2724 vol[
NP] -= g32[k-1][j][i] * 0.25; vol[
BN] -= g32[k-1][j][i] * 0.25;
2725 vol[
SP] += g32[k-1][j][i] * 0.25; vol[
BS] += g32[k-1][j][i] * 0.25;
2728 vol[
CP] -= g33[k-1][j][i];
2729 vol[
BP] += g33[k-1][j][i];
2735 for (PetscInt m = 0; m < 19; m++) {
2736 vol[m] *= -aj[k][j][i];
2740 idx[
CP] =
Gidx(i, j, k, user);
2741 if (user->
bctype[0]==7 && i==mx-2) idx[
EP] =
Gidx(1, j, k, user);
else idx[
EP] =
Gidx(i+1, j, k, user);
2742 if (user->
bctype[0]==7 && i==1) idx[
WP] =
Gidx(mx-2, j, k, user);
else idx[
WP] =
Gidx(i-1, j, k, user);
2743 if (user->
bctype[2]==7 && j==my-2) idx[
NP] =
Gidx(i, 1, k, user);
else idx[
NP] =
Gidx(i, j+1, k, user);
2744 if (user->
bctype[2]==7 && j==1) idx[
SP] =
Gidx(i, my-2, k, user);
else idx[
SP] =
Gidx(i, j-1, k, user);
2745 if (user->
bctype[4]==7 && k==mz-2) idx[
TP] =
Gidx(i, j, 1, user);
else idx[
TP] =
Gidx(i, j, k+1, user);
2746 if (user->
bctype[4]==7 && k==1) idx[
BP] =
Gidx(i, j, mz-2, user);
else idx[
BP] =
Gidx(i, j, k-1, user);
2747 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);
2748 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);
2749 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);
2750 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);
2751 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);
2752 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);
2753 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);
2754 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);
2755 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);
2756 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);
2757 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);
2758 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);
2761 MatSetValues(user->
A, 1, &row, 19, idx, vol, INSERT_VALUES);
2772 MatAssemblyBegin(user->
A, MAT_FINAL_ASSEMBLY);
2773 MatAssemblyEnd(user->
A, MAT_FINAL_ASSEMBLY);
2777 ierr = MatNorm(user->
A,NORM_INFINITY,&max_A);CHKERRQ(ierr);
2786 DMDAVecRestoreArray(da, G11, &g11); DMDAVecRestoreArray(da, G12, &g12); DMDAVecRestoreArray(da, G13, &g13);
2787 DMDAVecRestoreArray(da, G21, &g21); DMDAVecRestoreArray(da, G22, &g22); DMDAVecRestoreArray(da, G23, &g23);
2788 DMDAVecRestoreArray(da, G31, &g31); DMDAVecRestoreArray(da, G32, &g32); DMDAVecRestoreArray(da, G33, &g33);
2790 VecDestroy(&G11); VecDestroy(&G12); VecDestroy(&G13);
2791 VecDestroy(&G21); VecDestroy(&G22); VecDestroy(&G23);
2792 VecDestroy(&G31); VecDestroy(&G32); VecDestroy(&G33);
2794 DMDAVecRestoreArray(fda, user->
lCsi, &csi); DMDAVecRestoreArray(fda, user->
lEta, &eta); DMDAVecRestoreArray(fda, user->
lZet, &zet);
2795 DMDAVecRestoreArray(fda, user->
lICsi, &icsi); DMDAVecRestoreArray(fda, user->
lIEta, &ieta); DMDAVecRestoreArray(fda, user->
lIZet, &izet);
2796 DMDAVecRestoreArray(fda, user->
lJCsi, &jcsi); DMDAVecRestoreArray(fda, user->
lJEta, &jeta); DMDAVecRestoreArray(fda, user->
lJZet, &jzet);
2797 DMDAVecRestoreArray(fda, user->
lKCsi, &kcsi); DMDAVecRestoreArray(fda, user->
lKEta, &keta); DMDAVecRestoreArray(fda, user->
lKZet, &kzet);
2798 DMDAVecRestoreArray(da, user->
lAj, &aj); DMDAVecRestoreArray(da, user->
lIAj, &iaj); DMDAVecRestoreArray(da, user->
lJAj, &jaj); DMDAVecRestoreArray(da, user->
lKAj, &kaj);
2799 DMDAVecRestoreArray(da, user->
lNvert, &nvert);
2803 PetscFunctionReturn(0);
2892 PetscReal *ibm_Area, PetscInt flg)
2903 DM da = user->
da, fda = user->
fda;
2905 DMDALocalInfo info = user->
info;
2907 PetscInt xs = info.xs, xe = info.xs + info.xm;
2908 PetscInt ys = info.ys, ye = info.ys + info.ym;
2909 PetscInt zs = info.zs, ze = info.zs + info.zm;
2910 PetscInt mx = info.mx, my = info.my, mz = info.mz;
2913 PetscInt lxs, lys, lzs, lxe, lye, lze;
2919 if (xs==0) lxs = xs+1;
2920 if (ys==0) lys = ys+1;
2921 if (zs==0) lzs = zs+1;
2923 if (xe==mx) lxe = xe-1;
2924 if (ye==my) lye = ye-1;
2925 if (ze==mz) lze = ze-1;
2927 PetscReal ***nvert, ibmval=1.5;
2928 Cmpnts ***ucor, ***csi, ***eta, ***zet;
2929 DMDAVecGetArray(fda, user->
Ucont, &ucor);
2930 DMDAVecGetArray(fda, user->
lCsi, &csi);
2931 DMDAVecGetArray(fda, user->
lEta, &eta);
2932 DMDAVecGetArray(fda, user->
lZet, &zet);
2933 DMDAVecGetArray(da, user->
lNvert, &nvert);
2935 PetscReal libm_Flux, libm_area;
2938 for (k=lzs; k<lze; k++) {
2939 for (j=lys; j<lye; j++) {
2940 for (i=lxs; i<lxe; i++) {
2941 if (nvert[k][j][i] < 0.1) {
2942 if (nvert[k][j][i+1] > ibmval-0.4 && nvert[k][j][i+1] < ibmval && i < mx-2) {
2943 libm_Flux += ucor[k][j][i].
x;
2944 libm_area += sqrt(csi[k][j][i].x * csi[k][j][i].x +
2945 csi[k][j][i].y * csi[k][j][i].y +
2946 csi[k][j][i].z * csi[k][j][i].z);
2949 if (nvert[k][j+1][i] > ibmval-0.4 && nvert[k][j+1][i] < ibmval && j < my-2) {
2950 libm_Flux += ucor[k][j][i].
y;
2951 libm_area += sqrt(eta[k][j][i].x * eta[k][j][i].x +
2952 eta[k][j][i].y * eta[k][j][i].y +
2953 eta[k][j][i].z * eta[k][j][i].z);
2955 if (nvert[k+1][j][i] > ibmval-0.4 && nvert[k+1][j][i] < ibmval && k < mz-2) {
2956 libm_Flux += ucor[k][j][i].
z;
2957 libm_area += sqrt(zet[k][j][i].x * zet[k][j][i].x +
2958 zet[k][j][i].y * zet[k][j][i].y +
2959 zet[k][j][i].z * zet[k][j][i].z);
2963 if (nvert[k][j][i] > ibmval-0.4 && nvert[k][j][i] < ibmval) {
2964 if (nvert[k][j][i+1] < 0.1 && i < mx-2) {
2965 libm_Flux -= ucor[k][j][i].
x;
2966 libm_area += sqrt(csi[k][j][i].x * csi[k][j][i].x +
2967 csi[k][j][i].y * csi[k][j][i].y +
2968 csi[k][j][i].z * csi[k][j][i].z);
2971 if (nvert[k][j+1][i] < 0.1 && j < my-2) {
2972 libm_Flux -= ucor[k][j][i].
y;
2973 libm_area += sqrt(eta[k][j][i].x * eta[k][j][i].x +
2974 eta[k][j][i].y * eta[k][j][i].y +
2975 eta[k][j][i].z * eta[k][j][i].z);
2977 if (nvert[k+1][j][i] < 0.1 && k < mz-2) {
2978 libm_Flux -= ucor[k][j][i].
z;
2979 libm_area += sqrt(zet[k][j][i].x * zet[k][j][i].x +
2980 zet[k][j][i].y * zet[k][j][i].y +
2981 zet[k][j][i].z * zet[k][j][i].z);
2989 MPI_Allreduce(&libm_Flux, ibm_Flux,1,MPI_DOUBLE,MPI_SUM, PETSC_COMM_WORLD);
2990 MPI_Allreduce(&libm_area, ibm_Area,1,MPI_DOUBLE,MPI_SUM, PETSC_COMM_WORLD);
2994 PetscPrintf(PETSC_COMM_WORLD,
"IBMFlux REV %le %le\n", *ibm_Flux, *ibm_Area);
2996 PetscReal correction;
2998 if (*ibm_Area > 1.e-15) {
3000 correction = (*ibm_Flux + user->
FluxIntpSum) / *ibm_Area;
3002 correction = *ibm_Flux / *ibm_Area;
3008 for (k=lzs; k<lze; k++) {
3009 for (j=lys; j<lye; j++) {
3010 for (i=lxs; i<lxe; i++) {
3011 if (nvert[k][j][i] < 0.1) {
3012 if (nvert[k][j][i+1] > ibmval-0.4 && nvert[k][j][i+1] < ibmval && i < mx-2) {
3013 ucor[k][j][i].
x -= sqrt(csi[k][j][i].x * csi[k][j][i].x +
3014 csi[k][j][i].y * csi[k][j][i].y +
3015 csi[k][j][i].z * csi[k][j][i].z) *
3019 if (nvert[k][j+1][i] > ibmval-0.4 && nvert[k][j+1][i] < ibmval && j < my-2) {
3020 ucor[k][j][i].
y -= sqrt(eta[k][j][i].x * eta[k][j][i].x +
3021 eta[k][j][i].y * eta[k][j][i].y +
3022 eta[k][j][i].z * eta[k][j][i].z) *
3025 if (nvert[k+1][j][i] > ibmval-0.4 && nvert[k+1][j][i] < ibmval && k < mz-2) {
3026 ucor[k][j][i].
z -= sqrt(zet[k][j][i].x * zet[k][j][i].x +
3027 zet[k][j][i].y * zet[k][j][i].y +
3028 zet[k][j][i].z * zet[k][j][i].z) *
3033 if (nvert[k][j][i] > ibmval-0.4 && nvert[k][j][i] < ibmval) {
3034 if (nvert[k][j][i+1] < 0.1 && i < mx-2) {
3035 ucor[k][j][i].
x += sqrt(csi[k][j][i].x * csi[k][j][i].x +
3036 csi[k][j][i].y * csi[k][j][i].y +
3037 csi[k][j][i].z * csi[k][j][i].z) *
3041 if (nvert[k][j+1][i] < 0.1 && j < my-2) {
3042 ucor[k][j][i].
y += sqrt(eta[k][j][i].x * eta[k][j][i].x +
3043 eta[k][j][i].y * eta[k][j][i].y +
3044 eta[k][j][i].z * eta[k][j][i].z) *
3047 if (nvert[k+1][j][i] < 0.1 && k < mz-2) {
3048 ucor[k][j][i].
z += sqrt(zet[k][j][i].x * zet[k][j][i].x +
3049 zet[k][j][i].y * zet[k][j][i].y +
3050 zet[k][j][i].z * zet[k][j][i].z) *
3063 for (k=lzs; k<lze; k++) {
3064 for (j=lys; j<lye; j++) {
3065 for (i=lxs; i<lxe; i++) {
3066 if (nvert[k][j][i] < 0.1) {
3067 if (nvert[k][j][i+1] > ibmval-0.4 && nvert[k][j][i+1] < ibmval && i < mx-2) {
3068 libm_Flux += ucor[k][j][i].
x;
3069 libm_area += sqrt(csi[k][j][i].x * csi[k][j][i].x +
3070 csi[k][j][i].y * csi[k][j][i].y +
3071 csi[k][j][i].z * csi[k][j][i].z);
3074 if (nvert[k][j+1][i] > ibmval-0.4 && nvert[k][j+1][i] < ibmval && j < my-2) {
3075 libm_Flux += ucor[k][j][i].
y;
3076 libm_area += sqrt(eta[k][j][i].x * eta[k][j][i].x +
3077 eta[k][j][i].y * eta[k][j][i].y +
3078 eta[k][j][i].z * eta[k][j][i].z);
3080 if (nvert[k+1][j][i] > ibmval-0.4 && nvert[k+1][j][i] < ibmval && k < mz-2) {
3081 libm_Flux += ucor[k][j][i].
z;
3082 libm_area += sqrt(zet[k][j][i].x * zet[k][j][i].x +
3083 zet[k][j][i].y * zet[k][j][i].y +
3084 zet[k][j][i].z * zet[k][j][i].z);
3088 if (nvert[k][j][i] > ibmval-0.4 && nvert[k][j][i] < ibmval) {
3089 if (nvert[k][j][i+1] < 0.1 && i < mx-2) {
3090 libm_Flux -= ucor[k][j][i].
x;
3091 libm_area += sqrt(csi[k][j][i].x * csi[k][j][i].x +
3092 csi[k][j][i].y * csi[k][j][i].y +
3093 csi[k][j][i].z * csi[k][j][i].z);
3096 if (nvert[k][j+1][i] < 0.1 && j < my-2) {
3097 libm_Flux -= ucor[k][j][i].
y;
3098 libm_area += sqrt(eta[k][j][i].x * eta[k][j][i].x +
3099 eta[k][j][i].y * eta[k][j][i].y +
3100 eta[k][j][i].z * eta[k][j][i].z);
3102 if (nvert[k+1][j][i] < 0.1 && k < mz-2) {
3103 libm_Flux -= ucor[k][j][i].
z;
3104 libm_area += sqrt(zet[k][j][i].x * zet[k][j][i].x +
3105 zet[k][j][i].y * zet[k][j][i].y +
3106 zet[k][j][i].z * zet[k][j][i].z);
3114 MPI_Allreduce(&libm_Flux, ibm_Flux,1,MPI_DOUBLE,MPI_SUM, PETSC_COMM_WORLD);
3115 MPI_Allreduce(&libm_area, ibm_Area,1,MPI_DOUBLE,MPI_SUM, PETSC_COMM_WORLD);
3119 PetscPrintf(PETSC_COMM_WORLD,
"IBMFlux22 REV %le %le\n", *ibm_Flux, *ibm_Area);
3121 DMDAVecRestoreArray(da, user->
lNvert, &nvert);
3122 DMDAVecRestoreArray(fda, user->
lCsi, &csi);
3123 DMDAVecRestoreArray(fda, user->
lEta, &eta);
3124 DMDAVecRestoreArray(fda, user->
lZet, &zet);
3125 DMDAVecRestoreArray(fda, user->
Ucont, &ucor);
3127 DMGlobalToLocalBegin(fda, user->
Ucont, INSERT_VALUES, user->
lUcont);
3128 DMGlobalToLocalEnd(fda, user->
Ucont, INSERT_VALUES, user->
lUcont);
3141 const PetscInt channelz = simCtx->
channelz;
3142 const PetscInt fish = simCtx->
fish;
3145 DM da = user->
da, fda = user->
fda;
3147 DMDALocalInfo info = user->
info;
3149 PetscInt xs = info.xs, xe = info.xs + info.xm;
3150 PetscInt ys = info.ys, ye = info.ys + info.ym;
3151 PetscInt zs = info.zs, ze = info.zs + info.zm;
3152 PetscInt mx = info.mx, my = info.my, mz = info.mz;
3154 PetscInt i, j, k,ibi;
3155 PetscInt lxs, lys, lzs, lxe, lye, lze;
3157 PetscInt gxs, gxe, gys, gye, gzs, gze;
3159 gxs = info.gxs; gxe = gxs + info.gxm;
3160 gys = info.gys; gye = gys + info.gym;
3161 gzs = info.gzs; gze = gzs + info.gzm;
3167 if (xs==0) lxs = xs+1;
3168 if (ys==0) lys = ys+1;
3169 if (zs==0) lzs = zs+1;
3171 if (xe==mx) lxe = xe-1;
3172 if (ye==my) lye = ye-1;
3173 if (ze==mz) lze = ze-1;
3175 PetscReal epsilon=1.e-8;
3176 PetscReal ***nvert, ibmval=1.9999;
3182 }***ucor, ***lucor,***csi, ***eta, ***zet;
3185 PetscInt xend=mx-2 ,yend=my-2,zend=mz-2;
3187 if (user->
bctype[0]==7) xend=mx-1;
3188 if (user->
bctype[2]==7) yend=my-1;
3189 if (user->
bctype[4]==7) zend=mz-1;
3191 DMDAVecGetArray(fda, user->
Ucont, &ucor);
3192 DMDAVecGetArray(fda, user->
lCsi, &csi);
3193 DMDAVecGetArray(fda, user->
lEta, &eta);
3194 DMDAVecGetArray(fda, user->
lZet, &zet);
3195 DMDAVecGetArray(da, user->
lNvert, &nvert);
3197 PetscReal libm_Flux, libm_area, libm_Flux_abs=0., ibm_Flux_abs;
3204 PetscReal *lIB_Flux, *lIB_area,*IB_Flux,*IB_Area;
3205 if (NumberOfBodies > 1) {
3207 lIB_Flux=(PetscReal *)calloc(NumberOfBodies,
sizeof(PetscReal));
3208 lIB_area=(PetscReal *)calloc(NumberOfBodies,
sizeof(PetscReal));
3209 IB_Flux=(PetscReal *)calloc(NumberOfBodies,
sizeof(PetscReal));
3210 IB_Area=(PetscReal *)calloc(NumberOfBodies,
sizeof(PetscReal));
3213 for (ibi=0; ibi<NumberOfBodies; ibi++) {
3228 for (k=lzs; k<lze; k++) {
3229 for (j=lys; j<lye; j++) {
3230 for (i=lxs; i<lxe; i++) {
3231 if (nvert[k][j][i] < 0.1) {
3232 if (nvert[k][j][i+1] > 0.1 && nvert[k][j][i+1] < ibmval && i < xend) {
3234 if (fabs(ucor[k][j][i].x)>epsilon) {
3235 libm_Flux += ucor[k][j][i].x;
3237 libm_Flux_abs += fabs(ucor[k][j][i].x)/sqrt(csi[k][j][i].x * csi[k][j][i].x +
3238 csi[k][j][i].y * csi[k][j][i].y +
3239 csi[k][j][i].z * csi[k][j][i].z);
3241 libm_Flux_abs += fabs(ucor[k][j][i].x);
3243 libm_area += sqrt(csi[k][j][i].x * csi[k][j][i].x +
3244 csi[k][j][i].y * csi[k][j][i].y +
3245 csi[k][j][i].z * csi[k][j][i].z);
3247 if (NumberOfBodies > 1) {
3249 ibi=(int)((nvert[k][j][i+1]-1.0)*1001);
3250 lIB_Flux[ibi] += ucor[k][j][i].x;
3251 lIB_area[ibi] += sqrt(csi[k][j][i].x * csi[k][j][i].x +
3252 csi[k][j][i].y * csi[k][j][i].y +
3253 csi[k][j][i].z * csi[k][j][i].z);
3259 if (nvert[k][j+1][i] > 0.1 && nvert[k][j+1][i] < ibmval && j < yend) {
3261 if (fabs(ucor[k][j][i].y)>epsilon) {
3262 libm_Flux += ucor[k][j][i].y;
3264 libm_Flux_abs += fabs(ucor[k][j][i].y)/sqrt(eta[k][j][i].x * eta[k][j][i].x +
3265 eta[k][j][i].y * eta[k][j][i].y +
3266 eta[k][j][i].z * eta[k][j][i].z);
3268 libm_Flux_abs += fabs(ucor[k][j][i].y);
3269 libm_area += sqrt(eta[k][j][i].x * eta[k][j][i].x +
3270 eta[k][j][i].y * eta[k][j][i].y +
3271 eta[k][j][i].z * eta[k][j][i].z);
3272 if (NumberOfBodies > 1) {
3274 ibi=(int)((nvert[k][j+1][i]-1.0)*1001);
3276 lIB_Flux[ibi] += ucor[k][j][i].y;
3277 lIB_area[ibi] += sqrt(eta[k][j][i].x * eta[k][j][i].x +
3278 eta[k][j][i].y * eta[k][j][i].y +
3279 eta[k][j][i].z * eta[k][j][i].z);
3284 if (nvert[k+1][j][i] > 0.1 && nvert[k+1][j][i] < ibmval && k < zend) {
3286 if (fabs(ucor[k][j][i].z)>epsilon) {
3287 libm_Flux += ucor[k][j][i].z;
3289 libm_Flux_abs += fabs(ucor[k][j][i].z)/sqrt(zet[k][j][i].x * zet[k][j][i].x +
3290 zet[k][j][i].y * zet[k][j][i].y +
3291 zet[k][j][i].z * zet[k][j][i].z);
3293 libm_Flux_abs += fabs(ucor[k][j][i].z);
3294 libm_area += sqrt(zet[k][j][i].x * zet[k][j][i].x +
3295 zet[k][j][i].y * zet[k][j][i].y +
3296 zet[k][j][i].z * zet[k][j][i].z);
3298 if (NumberOfBodies > 1) {
3300 ibi=(int)((nvert[k+1][j][i]-1.0)*1001);
3301 lIB_Flux[ibi] += ucor[k][j][i].z;
3302 lIB_area[ibi] += sqrt(zet[k][j][i].x * zet[k][j][i].x +
3303 zet[k][j][i].y * zet[k][j][i].y +
3304 zet[k][j][i].z * zet[k][j][i].z);
3311 if (nvert[k][j][i] > 0.1 && nvert[k][j][i] < ibmval) {
3313 if (nvert[k][j][i+1] < 0.1 && i < xend) {
3314 if (fabs(ucor[k][j][i].x)>epsilon) {
3315 libm_Flux -= ucor[k][j][i].x;
3317 libm_Flux_abs += fabs(ucor[k][j][i].x)/sqrt(csi[k][j][i].x * csi[k][j][i].x +
3318 csi[k][j][i].y * csi[k][j][i].y +
3319 csi[k][j][i].z * csi[k][j][i].z);
3321 libm_Flux_abs += fabs(ucor[k][j][i].x);
3322 libm_area += sqrt(csi[k][j][i].x * csi[k][j][i].x +
3323 csi[k][j][i].y * csi[k][j][i].y +
3324 csi[k][j][i].z * csi[k][j][i].z);
3325 if (NumberOfBodies > 1) {
3327 ibi=(int)((nvert[k][j][i]-1.0)*1001);
3328 lIB_Flux[ibi] -= ucor[k][j][i].x;
3329 lIB_area[ibi] += sqrt(csi[k][j][i].x * csi[k][j][i].x +
3330 csi[k][j][i].y * csi[k][j][i].y +
3331 csi[k][j][i].z * csi[k][j][i].z);
3337 if (nvert[k][j+1][i] < 0.1 && j < yend) {
3338 if (fabs(ucor[k][j][i].y)>epsilon) {
3339 libm_Flux -= ucor[k][j][i].y;
3341 libm_Flux_abs += fabs(ucor[k][j][i].y)/ sqrt(eta[k][j][i].x * eta[k][j][i].x +
3342 eta[k][j][i].y * eta[k][j][i].y +
3343 eta[k][j][i].z * eta[k][j][i].z);
3345 libm_Flux_abs += fabs(ucor[k][j][i].y);
3346 libm_area += sqrt(eta[k][j][i].x * eta[k][j][i].x +
3347 eta[k][j][i].y * eta[k][j][i].y +
3348 eta[k][j][i].z * eta[k][j][i].z);
3349 if (NumberOfBodies > 1) {
3351 ibi=(int)((nvert[k][j][i]-1.0)*1001);
3352 lIB_Flux[ibi] -= ucor[k][j][i].y;
3353 lIB_area[ibi] += sqrt(eta[k][j][i].x * eta[k][j][i].x +
3354 eta[k][j][i].y * eta[k][j][i].y +
3355 eta[k][j][i].z * eta[k][j][i].z);
3360 if (nvert[k+1][j][i] < 0.1 && k < zend) {
3361 if (fabs(ucor[k][j][i].z)>epsilon) {
3362 libm_Flux -= ucor[k][j][i].z;
3364 libm_Flux_abs += fabs(ucor[k][j][i].z)/sqrt(zet[k][j][i].x * zet[k][j][i].x +
3365 zet[k][j][i].y * zet[k][j][i].y +
3366 zet[k][j][i].z * zet[k][j][i].z);
3368 libm_Flux_abs += fabs(ucor[k][j][i].z);
3369 libm_area += sqrt(zet[k][j][i].x * zet[k][j][i].x +
3370 zet[k][j][i].y * zet[k][j][i].y +
3371 zet[k][j][i].z * zet[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].z;
3376 lIB_area[ibi] += sqrt(zet[k][j][i].x * zet[k][j][i].x +
3377 zet[k][j][i].y * zet[k][j][i].y +
3378 zet[k][j][i].z * zet[k][j][i].z);
3389 MPI_Allreduce(&libm_Flux, ibm_Flux,1,MPI_DOUBLE,MPI_SUM, PETSC_COMM_WORLD);
3390 MPI_Allreduce(&libm_Flux_abs, &ibm_Flux_abs,1,MPI_DOUBLE,MPI_SUM, PETSC_COMM_WORLD);
3391 MPI_Allreduce(&libm_area, ibm_Area,1,MPI_DOUBLE,MPI_SUM, PETSC_COMM_WORLD);
3393 if (NumberOfBodies > 1) {
3394 MPI_Allreduce(lIB_Flux,IB_Flux,NumberOfBodies,MPI_DOUBLE,MPI_SUM,PETSC_COMM_WORLD);
3395 MPI_Allreduce(lIB_area,IB_Area,NumberOfBodies,MPI_DOUBLE,MPI_SUM,PETSC_COMM_WORLD);
3398 PetscReal correction;
3400 PetscReal *Correction;
3401 if (NumberOfBodies > 1) {
3402 Correction=(PetscReal *)calloc(NumberOfBodies,
sizeof(PetscReal));
3403 for (ibi=0; ibi<NumberOfBodies; ibi++) Correction[ibi]=0.0;
3406 if (*ibm_Area > 1.e-15) {
3408 correction = (*ibm_Flux + user->
FluxIntpSum)/ ibm_Flux_abs;
3410 correction = (*ibm_Flux + user->
FluxIntpSum) / *ibm_Area;
3412 correction = *ibm_Flux / *ibm_Area;
3413 if (NumberOfBodies > 1)
3414 for (ibi=0; ibi<NumberOfBodies; ibi++)
if (IB_Area[ibi]>1.e-15) Correction[ibi] = IB_Flux[ibi] / IB_Area[ibi];
3420 LOG_ALLOW(
GLOBAL,
LOG_INFO,
"IBM Uncorrected Flux: %g, Area: %g, Correction: %g\n", *ibm_Flux, *ibm_Area, correction);
3421 if (NumberOfBodies>1){
3422 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]);
3431 for (k=lzs; k<lze; k++) {
3432 for (j=lys; j<lye; j++) {
3433 for (i=lxs; i<lxe; i++) {
3434 if (nvert[k][j][i] < 0.1) {
3435 if (nvert[k][j][i+1] > 0.1 && nvert[k][j][i+1] <ibmval && i < xend) {
3436 if (fabs(ucor[k][j][i].x)>epsilon){
3438 ucor[k][j][i].x -=correction*fabs(ucor[k][j][i].x)/
3439 sqrt(csi[k][j][i].x * csi[k][j][i].x +
3440 csi[k][j][i].y * csi[k][j][i].y +
3441 csi[k][j][i].z * csi[k][j][i].z);
3443 ucor[k][j][i].x -=correction*fabs(ucor[k][j][i].x);
3444 else if (NumberOfBodies > 1) {
3445 ibi=(int)((nvert[k][j][i+1]-1.0)*1001);
3446 ucor[k][j][i].x -= sqrt(csi[k][j][i].x * csi[k][j][i].x +
3447 csi[k][j][i].y * csi[k][j][i].y +
3448 csi[k][j][i].z * csi[k][j][i].z) *
3452 ucor[k][j][i].x -= sqrt(csi[k][j][i].x * csi[k][j][i].x +
3453 csi[k][j][i].y * csi[k][j][i].y +
3454 csi[k][j][i].z * csi[k][j][i].z) *
3458 if (nvert[k][j+1][i] > 0.1 && nvert[k][j+1][i] < ibmval && j < yend) {
3459 if (fabs(ucor[k][j][i].y)>epsilon) {
3461 ucor[k][j][i].y -=correction*fabs(ucor[k][j][i].y)/
3462 sqrt(eta[k][j][i].x * eta[k][j][i].x +
3463 eta[k][j][i].y * eta[k][j][i].y +
3464 eta[k][j][i].z * eta[k][j][i].z);
3466 ucor[k][j][i].y -=correction*fabs(ucor[k][j][i].y);
3467 else if (NumberOfBodies > 1) {
3468 ibi=(int)((nvert[k][j+1][i]-1.0)*1001);
3469 ucor[k][j][i].y -= sqrt(eta[k][j][i].x * eta[k][j][i].x +
3470 eta[k][j][i].y * eta[k][j][i].y +
3471 eta[k][j][i].z * eta[k][j][i].z) *
3475 ucor[k][j][i].y -= sqrt(eta[k][j][i].x * eta[k][j][i].x +
3476 eta[k][j][i].y * eta[k][j][i].y +
3477 eta[k][j][i].z * eta[k][j][i].z) *
3481 if (nvert[k+1][j][i] > 0.1 && nvert[k+1][j][i] < ibmval && k < zend) {
3482 if (fabs(ucor[k][j][i].z)>epsilon) {
3484 ucor[k][j][i].z -= correction*fabs(ucor[k][j][i].z)/
3485 sqrt(zet[k][j][i].x * zet[k][j][i].x +
3486 zet[k][j][i].y * zet[k][j][i].y +
3487 zet[k][j][i].z * zet[k][j][i].z);
3489 ucor[k][j][i].z -= correction*fabs(ucor[k][j][i].z);
3490 else if (NumberOfBodies > 1) {
3491 ibi=(int)((nvert[k+1][j][i]-1.0)*1001);
3492 ucor[k][j][i].z -= sqrt(zet[k][j][i].x * zet[k][j][i].x +
3493 zet[k][j][i].y * zet[k][j][i].y +
3494 zet[k][j][i].z * zet[k][j][i].z) *
3498 ucor[k][j][i].z -= sqrt(zet[k][j][i].x * zet[k][j][i].x +
3499 zet[k][j][i].y * zet[k][j][i].y +
3500 zet[k][j][i].z * zet[k][j][i].z) *
3506 if (nvert[k][j][i] > 0.1 && nvert[k][j][i] < ibmval) {
3507 if (nvert[k][j][i+1] < 0.1 && i < xend) {
3508 if (fabs(ucor[k][j][i].x)>epsilon) {
3510 ucor[k][j][i].x += correction*fabs(ucor[k][j][i].x)/
3511 sqrt(csi[k][j][i].x * csi[k][j][i].x +
3512 csi[k][j][i].y * csi[k][j][i].y +
3513 csi[k][j][i].z * csi[k][j][i].z);
3515 ucor[k][j][i].x += correction*fabs(ucor[k][j][i].x);
3516 else if (NumberOfBodies > 1) {
3517 ibi=(int)((nvert[k][j][i]-1.0)*1001);
3518 ucor[k][j][i].x += sqrt(csi[k][j][i].x * csi[k][j][i].x +
3519 csi[k][j][i].y * csi[k][j][i].y +
3520 csi[k][j][i].z * csi[k][j][i].z) *
3524 ucor[k][j][i].x += sqrt(csi[k][j][i].x * csi[k][j][i].x +
3525 csi[k][j][i].y * csi[k][j][i].y +
3526 csi[k][j][i].z * csi[k][j][i].z) *
3530 if (nvert[k][j+1][i] < 0.1 && j < yend) {
3531 if (fabs(ucor[k][j][i].y)>epsilon) {
3533 ucor[k][j][i].y +=correction*fabs(ucor[k][j][i].y)/
3534 sqrt(eta[k][j][i].x * eta[k][j][i].x +
3535 eta[k][j][i].y * eta[k][j][i].y +
3536 eta[k][j][i].z * eta[k][j][i].z);
3538 ucor[k][j][i].y +=correction*fabs(ucor[k][j][i].y);
3539 else if (NumberOfBodies > 1) {
3540 ibi=(int)((nvert[k][j][i]-1.0)*1001);
3541 ucor[k][j][i].y += sqrt(eta[k][j][i].x * eta[k][j][i].x +
3542 eta[k][j][i].y * eta[k][j][i].y +
3543 eta[k][j][i].z * eta[k][j][i].z) *
3547 ucor[k][j][i].y += sqrt(eta[k][j][i].x * eta[k][j][i].x +
3548 eta[k][j][i].y * eta[k][j][i].y +
3549 eta[k][j][i].z * eta[k][j][i].z) *
3553 if (nvert[k+1][j][i] < 0.1 && k < zend) {
3554 if (fabs(ucor[k][j][i].z)>epsilon) {
3556 ucor[k][j][i].z += correction*fabs(ucor[k][j][i].z)/
3557 sqrt(zet[k][j][i].x * zet[k][j][i].x +
3558 zet[k][j][i].y * zet[k][j][i].y +
3559 zet[k][j][i].z * zet[k][j][i].z);
3561 ucor[k][j][i].z += correction*fabs(ucor[k][j][i].z);
3562 else if (NumberOfBodies > 1) {
3563 ibi=(int)((nvert[k][j][i]-1.0)*1001);
3564 ucor[k][j][i].z += sqrt(zet[k][j][i].x * zet[k][j][i].x +
3565 zet[k][j][i].y * zet[k][j][i].y +
3566 zet[k][j][i].z * zet[k][j][i].z) *
3570 ucor[k][j][i].z += sqrt(zet[k][j][i].x * zet[k][j][i].x +
3571 zet[k][j][i].y * zet[k][j][i].y +
3572 zet[k][j][i].z * zet[k][j][i].z) *
3590 for (k=lzs; k<lze; k++) {
3591 for (j=lys; j<lye; j++) {
3592 for (i=lxs; i<lxe; i++) {
3593 if (nvert[k][j][i] < 0.1) {
3594 if (nvert[k][j][i+1] > 0.1 && nvert[k][j][i+1] < ibmval && i < xend) {
3595 libm_Flux += ucor[k][j][i].x;
3596 libm_area += sqrt(csi[k][j][i].x * csi[k][j][i].x +
3597 csi[k][j][i].y * csi[k][j][i].y +
3598 csi[k][j][i].z * csi[k][j][i].z);
3601 if (nvert[k][j+1][i] > 0.1 && nvert[k][j+1][i] < ibmval && j < yend) {
3602 libm_Flux += ucor[k][j][i].y;
3603 libm_area += sqrt(eta[k][j][i].x * eta[k][j][i].x +
3604 eta[k][j][i].y * eta[k][j][i].y +
3605 eta[k][j][i].z * eta[k][j][i].z);
3607 if (nvert[k+1][j][i] > 0.1 && nvert[k+1][j][i] < ibmval && k < zend) {
3608 libm_Flux += ucor[k][j][i].z;
3609 libm_area += sqrt(zet[k][j][i].x * zet[k][j][i].x +
3610 zet[k][j][i].y * zet[k][j][i].y +
3611 zet[k][j][i].z * zet[k][j][i].z);
3615 if (nvert[k][j][i] > 0.1 && nvert[k][j][i] < ibmval) {
3616 if (nvert[k][j][i+1] < 0.1 && i < xend) {
3617 libm_Flux -= ucor[k][j][i].x;
3618 libm_area += sqrt(csi[k][j][i].x * csi[k][j][i].x +
3619 csi[k][j][i].y * csi[k][j][i].y +
3620 csi[k][j][i].z * csi[k][j][i].z);
3623 if (nvert[k][j+1][i] < 0.1 && j < yend) {
3624 libm_Flux -= ucor[k][j][i].y;
3625 libm_area += sqrt(eta[k][j][i].x * eta[k][j][i].x +
3626 eta[k][j][i].y * eta[k][j][i].y +
3627 eta[k][j][i].z * eta[k][j][i].z);
3629 if (nvert[k+1][j][i] < 0.1 && k < zend) {
3630 libm_Flux -= ucor[k][j][i].z;
3631 libm_area += sqrt(zet[k][j][i].x * zet[k][j][i].x +
3632 zet[k][j][i].y * zet[k][j][i].y +
3633 zet[k][j][i].z * zet[k][j][i].z);
3641 MPI_Allreduce(&libm_Flux, ibm_Flux,1,MPI_DOUBLE,MPI_SUM, PETSC_COMM_WORLD);
3642 MPI_Allreduce(&libm_area, ibm_Area,1,MPI_DOUBLE,MPI_SUM, PETSC_COMM_WORLD);
3652 for (k=lzs; k<lze; k++) {
3653 for (j=lys; j<lye; j++) {
3655 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;
3666 for (k=lzs; k<lze; k++) {
3667 for (i=lxs; i<lxe; i++) {
3669 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;
3679 for (j=lys; j<lye; j++) {
3680 for (i=lxs; i<lxe; i++) {
3682 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;
3690 DMDAVecRestoreArray(da, user->
lNvert, &nvert);
3691 DMDAVecRestoreArray(fda, user->
lCsi, &csi);
3692 DMDAVecRestoreArray(fda, user->
lEta, &eta);
3693 DMDAVecRestoreArray(fda, user->
lZet, &zet);
3694 DMDAVecRestoreArray(fda, user->
Ucont, &ucor);
3696 DMGlobalToLocalBegin(fda, user->
Ucont, INSERT_VALUES, user->
lUcont);
3697 DMGlobalToLocalEnd(fda, user->
Ucont, INSERT_VALUES, user->
lUcont);
3701 DMDAVecGetArray(fda, user->
lUcont, &lucor);
3702 DMDAVecGetArray(fda, user->
Ucont, &ucor);
3707 for (k=zs; k<ze; k++) {
3708 for (j=ys; j<ye; j++) {
3709 if(j>0 && k>0 && j<user->JM && k<user->KM){
3710 ucor[k][j][i].x=lucor[k][j][i-2].x;
3719 for (k=zs; k<ze; k++) {
3720 for (i=xs; i<xe; i++) {
3721 if(i>0 && k>0 && i<user->IM && k<user->KM){
3722 ucor[k][j][i].y=lucor[k][j-2][i].y;
3731 for (j=ys; j<ye; j++) {
3732 for (i=xs; i<xe; i++) {
3733 if(i>0 && j>0 && i<user->IM && j<user->JM){
3734 ucor[k][j][i].z=lucor[k-2][j][i].z;
3740 DMDAVecRestoreArray(fda, user->
lUcont, &lucor);
3741 DMDAVecRestoreArray(fda, user->
Ucont, &ucor);
3745 DMGlobalToLocalBegin(user->
fda, user->
Ucont, INSERT_VALUES, user->
lUcont);
3746 DMGlobalToLocalEnd(user->
fda, user->
Ucont, INSERT_VALUES, user->
lUcont);
3748 if (NumberOfBodies > 1) {
3968 const PetscInt immersed = simCtx->
immersed;
3969 const PetscInt MHV = simCtx->
MHV;
3970 const PetscInt LV = simCtx->
LV;
3971 PetscMPIInt rank = simCtx->
rank;
3974 PetscErrorCode ierr;
3981 PetscFunctionBeginUser;
3985 for (bi = 0; bi < block_number; bi++) {
3992 for (l = usermg->
mglevels - 1; l > 0; l--) {
3998 user = mgctx[l].
user;
3999 ierr = PetscMalloc1(user[bi].info.mx * user[bi].
info.my * 2, &user[bi].
KSKE); CHKERRQ(ierr);
4005 user = mgctx[l].
user;
4009 ierr = VecDuplicate(user[bi].P, &user[bi].B); CHKERRQ(ierr);
4011 PetscReal ibm_Flux, ibm_Area;
4012 PetscInt flg = immersed - 1;
4015 VolumeFlux(&user[bi], &ibm_Flux, &ibm_Area, flg);
4017 flg = ((MHV > 1 || LV) && bi == 0) ? 1 : 0;
4025 for (l = usermg->
mglevels - 1; l >= 0; l--) {
4026 user = mgctx[l].
user;
4034 ierr = KSPCreate(PETSC_COMM_WORLD, &mgksp); CHKERRQ(ierr);
4035 ierr = KSPAppendOptionsPrefix(mgksp,
"ps_"); CHKERRQ(ierr);
4040 PetscBool has_monitor_option;
4043 ierr = PetscNew(&monctx); CHKERRQ(ierr);
4051 sprintf(filen,
"%s/Poisson_Solver_Convergence_History_Block_%d.log", simCtx->
log_dir,bi);
4060 PetscFPrintf(PETSC_COMM_SELF, monctx->
file_handle,
"--- Convergence for Timestep %d, Block %d ---\n", (
int)simCtx->
step, bi);
4062 SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_FILE_OPEN,
"Could not open KSP monitor log file: %s", filen);
4066 ierr = PetscOptionsHasName(NULL, NULL,
"-ps_ksp_pic_monitor_true_residual", &has_monitor_option); CHKERRQ(ierr);
4072 ierr = KSPGetPC(mgksp, &mgpc); CHKERRQ(ierr);
4073 ierr = PCSetType(mgpc, PCMG); CHKERRQ(ierr);
4075 ierr = PCMGSetLevels(mgpc, usermg->
mglevels, PETSC_NULL); CHKERRQ(ierr);
4076 ierr = PCMGSetCycleType(mgpc, PC_MG_CYCLE_V); CHKERRQ(ierr);
4077 ierr = PCMGSetType(mgpc, PC_MG_MULTIPLICATIVE); CHKERRQ(ierr);
4080 for (l = usermg->
mglevels - 1; l > 0; l--) {
4089 coarse_user_ctx->
da_f = &(fine_user_ctx->
da);
4090 coarse_user_ctx->
user_f = fine_user_ctx;
4093 fine_user_ctx->
da_c = &(coarse_user_ctx->
da);
4094 fine_user_ctx->
user_c = coarse_user_ctx;
4098 PetscInt m_c = (coarse_user_ctx->
info.xm * coarse_user_ctx->
info.ym * coarse_user_ctx->
info.zm);
4099 PetscInt m_f = (fine_user_ctx->
info.xm * fine_user_ctx->
info.ym * fine_user_ctx->
info.zm);
4100 PetscInt M_c = (coarse_user_ctx->
info.mx * coarse_user_ctx->
info.my * coarse_user_ctx->
info.mz);
4101 PetscInt M_f = (fine_user_ctx->
info.mx * fine_user_ctx->
info.my * fine_user_ctx->
info.mz);
4106 ierr = MatCreateShell(PETSC_COMM_WORLD, m_c, m_f, M_c, M_f, (
void*)coarse_user_ctx, &fine_user_ctx->
MR); CHKERRQ(ierr);
4109 ierr = MatCreateShell(PETSC_COMM_WORLD, m_f, m_c, M_f, M_c, (
void*)fine_user_ctx, &fine_user_ctx->
MP); CHKERRQ(ierr);
4113 ierr = MatShellSetOperation(fine_user_ctx->
MP, MATOP_MULT, (
void(*)(
void))
MyInterpolation); CHKERRQ(ierr);
4116 ierr = PCMGSetRestriction(mgpc, l, fine_user_ctx->
MR); CHKERRQ(ierr);
4117 ierr = PCMGSetInterpolation(mgpc, l, fine_user_ctx->
MP); CHKERRQ(ierr);
4122 for (l = usermg->
mglevels - 1; l >= 0; l--) {
4123 user = mgctx[l].
user;
4125 ierr = PCMGGetSmoother(mgpc, l, &subksp); CHKERRQ(ierr);
4127 ierr = PCMGGetCoarseSolve(mgpc, &subksp); CHKERRQ(ierr);
4128 ierr = KSPSetTolerances(subksp, 1.e-8, PETSC_DEFAULT, PETSC_DEFAULT, 40); CHKERRQ(ierr);
4131 ierr = KSPSetOperators(subksp, user[bi].A, user[bi].A); CHKERRQ(ierr);
4132 ierr = KSPSetFromOptions(subksp); CHKERRQ(ierr);
4133 ierr = KSPGetPC(subksp, &subpc); CHKERRQ(ierr);
4134 ierr = PCSetType(subpc, PCBJACOBI); CHKERRQ(ierr);
4142 ierr = KSPSetUp(subksp); CHKERRQ(ierr);
4143 ierr = PCBJacobiGetSubKSP(subpc, &nlocal, NULL, &subsubksp); CHKERRQ(ierr);
4145 for (PetscInt abi = 0; abi < nlocal; abi++) {
4146 ierr = KSPGetPC(subsubksp[abi], &subsubpc); CHKERRQ(ierr);
4148 ierr = PCFactorSetShiftAmount(subsubpc, 1.e-10); CHKERRQ(ierr);
4151 ierr = MatNullSpaceCreate(PETSC_COMM_WORLD, PETSC_TRUE, 0, PETSC_NULL, &user[bi].nullsp); CHKERRQ(ierr);
4153 ierr = MatSetNullSpace(user[bi].A, user[bi].nullsp); CHKERRQ(ierr);
4155 ierr = PCMGSetResidual(mgpc, l, PCMGResidualDefault, user[bi].A); CHKERRQ(ierr);
4156 ierr = KSPSetUp(subksp); CHKERRQ(ierr);
4158 if (l < usermg->mglevels - 1) {
4159 ierr = MatCreateVecs(user[bi].A, &user[bi].R, PETSC_NULL); CHKERRQ(ierr);
4160 ierr = PCMGSetRhs(mgpc, l, user[bi].R); CHKERRQ(ierr);
4166 user = mgctx[l].
user;
4169 ierr = KSPSetOperators(mgksp, user[bi].A, user[bi].A); CHKERRQ(ierr);
4170 ierr = MatSetNullSpace(user[bi].A, user[bi].nullsp); CHKERRQ(ierr);
4171 ierr = KSPSetFromOptions(mgksp); CHKERRQ(ierr);
4172 ierr = KSPSetUp(mgksp); CHKERRQ(ierr);
4173 ierr = KSPSolve(mgksp, user[bi].B, user[bi].Phi); CHKERRQ(ierr);
4176 for (l = usermg->
mglevels - 1; l >= 0; l--) {
4177 user = mgctx[l].
user;
4178 MatNullSpaceDestroy(&user[bi].nullsp);
4179 MatDestroy(&user[bi].A);
4182 MatDestroy(&user[bi].MR);
4183 MatDestroy(&user[bi].MP);
4184 }
else if (l==0 && immersed) {
4185 PetscFree(user[bi].KSKE);
4187 if (l < usermg->mglevels - 1) {
4188 VecDestroy(&user[bi].R);
4199 PetscFunctionReturn(0);