110 PetscFunctionBeginUser;
113 char drivenDirection =
' ';
114 for (
int i = 0; i < 6; i++) {
129 if (drivenDirection ==
' ') {
130 PetscFunctionReturn(0);
133 LOG_ALLOW(
LOCAL,
LOG_DEBUG,
"Rank %d, Block %d: Starting channel flux profile correction in '%c' direction...\n",
134 simCtx->
rank, user->
_this, drivenDirection);
137 DMDALocalInfo info = user->
info;
139 PetscInt mx = info.mx, my = info.my, mz = info.mz;
140 PetscInt lxs = (info.xs == 0) ? 1 : info.xs;
141 PetscInt lys = (info.ys == 0) ? 1 : info.ys;
142 PetscInt lzs = (info.zs == 0) ? 1 : info.zs;
143 PetscInt lxe = (info.xs + info.xm == mx) ? mx - 1 : info.xs + info.xm;
144 PetscInt lye = (info.ys + info.ym == my) ? my - 1 : info.ys + info.ym;
145 PetscInt lze = (info.zs + info.zm == mz) ? mz - 1 : info.zs + info.zm;
147 Cmpnts ***ucont, ***csi, ***eta, ***zet;
149 ierr = DMDAVecGetArray(user->
fda, user->
lUcont, &ucont); CHKERRQ(ierr);
150 ierr = DMDAVecGetArrayRead(user->
fda, user->
lCsi, (
const Cmpnts***)&csi); CHKERRQ(ierr);
151 ierr = DMDAVecGetArrayRead(user->
fda, user->
lEta, (
const Cmpnts***)&eta); CHKERRQ(ierr);
152 ierr = DMDAVecGetArrayRead(user->
fda, user->
lZet, (
const Cmpnts***)&zet); CHKERRQ(ierr);
153 ierr = DMDAVecGetArrayRead(user->
da, user->
lNvert, (
const PetscReal***)&nvert); CHKERRQ(ierr);
156 PetscInt n_planes = 0;
157 switch (drivenDirection) {
158 case 'X': n_planes = mx - 1;
break;
159 case 'Y': n_planes = my - 1;
break;
160 case 'Z': n_planes = mz - 1;
break;
163 PetscReal *localFluxProfile, *globalFluxProfile, *correctionProfile;
164 ierr = PetscMalloc1(n_planes, &localFluxProfile); CHKERRQ(ierr);
165 ierr = PetscMalloc1(n_planes, &globalFluxProfile); CHKERRQ(ierr);
166 ierr = PetscMalloc1(n_planes, &correctionProfile); CHKERRQ(ierr);
167 ierr = PetscMemzero(localFluxProfile, n_planes *
sizeof(PetscReal)); CHKERRQ(ierr);
170 PetscReal localArea = 0.0, globalArea = 0.0;
172 switch (drivenDirection) {
176 for (k = lzs; k < lze; k++)
for (j = lys; j < lye; j++) {
177 if (nvert[k][j][i + 1] < 0.1)
178 localArea += 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);
181 for (i = info.xs; i < lxe; i++) {
182 for (k = lzs; k < lze; k++)
for (j = lys; j < lye; j++) {
183 if (nvert[k][j][i + 1] < 0.1) localFluxProfile[i] += ucont[k][j][i].
x;
190 for (k = lzs; k < lze; k++)
for (i = lxs; i < lxe; i++) {
191 if (nvert[k][j + 1][i] < 0.1)
192 localArea += 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);
195 for (j = info.ys; j < lye; j++) {
196 for (k = lzs; k < lze; k++)
for (i = lxs; i < lxe; i++) {
197 if (nvert[k][j + 1][i] < 0.1) localFluxProfile[j] += ucont[k][j][i].
y;
204 for (j = lys; j < lye; j++)
for (i = lxs; i < lxe; i++) {
205 if (nvert[k + 1][j][i] < 0.1)
206 localArea += sqrt(zet[k][j][i].x*zet[k][j][i].x + zet[k][j][i].y*zet[k][j][i].y + zet[k][j][i].z*zet[k][j][i].z);
209 for (k = info.zs; k < lze; k++) {
210 for (j = lys; j < lye; j++)
for (i = lxs; i < lxe; i++) {
211 if (nvert[k + 1][j][i] < 0.1) localFluxProfile[k] += ucont[k][j][i].
z;
217 ierr = MPI_Allreduce(&localArea, &globalArea, 1, MPI_DOUBLE, MPI_SUM, PETSC_COMM_WORLD); CHKERRQ(ierr);
218 ierr = MPI_Allreduce(localFluxProfile, globalFluxProfile, n_planes, MPI_DOUBLE, MPI_SUM, PETSC_COMM_WORLD); CHKERRQ(ierr);
222 if (globalArea > 1.0e-12) {
223 for (i = 0; i < n_planes; i++) {
224 correctionProfile[i] = (targetFlux - globalFluxProfile[i]) / globalArea;
227 ierr = PetscMemzero(correctionProfile, n_planes *
sizeof(PetscReal)); CHKERRQ(ierr);
232 LOG_ALLOW(
GLOBAL,
LOG_INFO,
" - Measured Flux at plane 0: %.6e (Correction Velocity: %.6e)\n", globalFluxProfile[0], correctionProfile[0]);
233 LOG_ALLOW(
GLOBAL,
LOG_INFO,
" - Measured Flux at plane %d: %.6e (Correction Velocity: %.6e)\n", (n_planes-1)/2, globalFluxProfile[(n_planes-1)/2], correctionProfile[(n_planes-1)/2]);
278 ierr = PetscFree(localFluxProfile); CHKERRQ(ierr);
279 ierr = PetscFree(globalFluxProfile); CHKERRQ(ierr);
280 ierr = PetscFree(correctionProfile); CHKERRQ(ierr);
282 ierr = DMDAVecRestoreArray(user->
fda, user->
lUcont, &ucont); CHKERRQ(ierr);
283 ierr = DMDAVecRestoreArrayRead(user->
fda, user->
lCsi, (
const Cmpnts***)&csi); CHKERRQ(ierr);
284 ierr = DMDAVecRestoreArrayRead(user->
fda, user->
lEta, (
const Cmpnts***)&eta); CHKERRQ(ierr);
285 ierr = DMDAVecRestoreArrayRead(user->
fda, user->
lZet, (
const Cmpnts***)&zet); CHKERRQ(ierr);
286 ierr = DMDAVecRestoreArrayRead(user->
da, user->
lNvert, (
const PetscReal***)&nvert); CHKERRQ(ierr);
291 PetscFunctionReturn(0);
330 PetscFunctionBeginUser;
340 DM da = user->
da, fda = user->
fda;
341 DMDALocalInfo info = user->
info;
344 PetscInt mx = info.mx, my = info.my, mz = info.mz;
345 PetscInt xs = info.xs, xe = info.xs + info.xm;
346 PetscInt ys = info.ys, ye = info.ys + info.ym;
347 PetscInt zs = info.zs, ze = info.zs + info.zm;
350 PetscInt lxs = (xs == 0) ? xs + 1 : xs;
351 PetscInt lxe = (xe == mx) ? xe - 1 : xe;
352 PetscInt lys = (ys == 0) ? ys + 1 : ys;
353 PetscInt lye = (ye == my) ? ye - 1 : ye;
354 PetscInt lzs = (zs == 0) ? zs + 1 : zs;
355 PetscInt lze = (ze == mz) ? ze - 1 : ze;
358 Cmpnts ***icsi, ***ieta, ***izet, ***jcsi, ***jeta, ***jzet, ***kcsi, ***keta, ***kzet;
359 PetscReal ***iaj, ***jaj, ***kaj, ***p, ***nvert;
361 DMDAVecGetArray(fda, user->
lICsi, &icsi); DMDAVecGetArray(fda, user->
lIEta, &ieta); DMDAVecGetArray(fda, user->
lIZet, &izet);
362 DMDAVecGetArray(fda, user->
lJCsi, &jcsi); DMDAVecGetArray(fda, user->
lJEta, &jeta); DMDAVecGetArray(fda, user->
lJZet, &jzet);
363 DMDAVecGetArray(fda, user->
lKCsi, &kcsi); DMDAVecGetArray(fda, user->
lKEta, &keta); DMDAVecGetArray(fda, user->
lKZet, &kzet);
364 DMDAVecGetArray(da, user->
lIAj, &iaj); DMDAVecGetArray(da, user->
lJAj, &jaj); DMDAVecGetArray(da, user->
lKAj, &kaj);
365 DMDAVecGetArray(da, user->
lNvert, &nvert);
366 DMDAVecGetArray(da, user->
lPhi, &p);
368 DMDAVecGetArray(fda, user->
Ucont, &ucont);
371 const PetscReal IBM_FLUID_THRESHOLD = 0.1;
382 for (PetscInt k = lzs; k < lze; k++) {
383 for (PetscInt j = lys; j < lye; j++) {
384 for (PetscInt i = lxs; i < lxe; i++) {
390 if (!(nvert[k][j][i] > IBM_FLUID_THRESHOLD || nvert[k][j][i + 1] > IBM_FLUID_THRESHOLD)) {
393 PetscReal dpdc = p[k][j][i + 1] - p[k][j][i];
394 PetscReal dpde = 0.0, dpdz = 0.0;
399 dpde = (p[k][j][i] + p[k][j][i+1] -
400 p[k][j-1][i] - p[k][j-1][i+1]) * 0.5;
405 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; }
409 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; }
413 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; }
416 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; }
424 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; }
428 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; }
432 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; }
435 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; }
441 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
442 + icsi[k][j][i].
z * icsi[k][j][i].
z) * iaj[k][j][i] +
443 dpde * (ieta[k][j][i].x * icsi[k][j][i].x + ieta[k][j][i].y * icsi[k][j][i].y
444 + ieta[k][j][i].z * icsi[k][j][i].z) * iaj[k][j][i] +
445 dpdz * (izet[k][j][i].
x * icsi[k][j][i].
x + izet[k][j][i].
y * icsi[k][j][i].
y
446 + izet[k][j][i].
z * icsi[k][j][i].
z) * iaj[k][j][i]);
448 PetscReal correction = grad_p_x*scale;
450 ucont[k][j][i].
x -= correction;
458 if (!(nvert[k][j][i] > IBM_FLUID_THRESHOLD || nvert[k][j + 1][i] > IBM_FLUID_THRESHOLD)) {
459 PetscReal dpdc = 0.0, dpde = 0.0, dpdz = 0.0;
460 dpde = p[k][j + 1][i] - p[k][j][i];
466 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; }
468 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; }
470 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; }
471 }
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; }
477 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; }
479 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; }
481 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; }
482 }
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; }
484 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] +
485 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] +
486 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]);
488 PetscReal correction = grad_p_y*scale;
490 ucont[k][j][i].
y -= correction;
497 if (!(nvert[k][j][i] > IBM_FLUID_THRESHOLD || nvert[k + 1][j][i] > IBM_FLUID_THRESHOLD)) {
498 PetscReal dpdc = 0.0, dpde = 0.0, dpdz = 0.0;
499 dpdz = p[k + 1][j][i] - p[k][j][i];
505 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; }
507 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; }
509 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; }
510 }
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; }
516 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; }
518 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; }
520 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; }
521 }
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; }
523 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] +
524 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] +
525 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]);
529 "[k=%d, j=%d, i=%d] ---- Neighbor Pressures ----\n"
530 " Central Z-Neighbors: p[k+1][j][i] = %g | p[k][j][i] = %g\n"
531 " 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"
532 " 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",
534 p[k + 1][j][i], p[k][j][i],
535 p[k][j - 1][i], p[k + 1][j - 1][i], p[k][j + 1][i], p[k + 1][j + 1][i],
536 p[k][j][i - 1], p[k + 1][j][i - 1], p[k][j][i + 1], p[k + 1][j][i + 1]);
540 PetscReal correction = grad_p_z*scale;
542 ucont[k][j][i].
z -= correction;
553 for (PetscInt k=lzs; k<lze; k++) {
554 for (PetscInt j=lys; j<lye; j++) {
557 PetscReal dpdc = p[k][j][i+1] - p[k][j][i];
564 dpde = (p[k][j ][i] + p[k][j ][i+1] -
565 p[k][j-1][i] - p[k][j-1][i+1]) * 0.5;
569 if (nvert[k][j-1][i] + nvert[k][j-1][i+1] < 0.1) {
570 dpde = (p[k][j ][i] + p[k][j ][i+1] -
571 p[k][j-1][i] - p[k][j-1][i+1]) * 0.5;
575 if (nvert[k][j+1][i] + nvert[k][j+1][i+1] < 0.1) {
576 dpde = (p[k][j+1][i] + p[k][j+1][i+1] -
577 p[k][j ][i] - p[k][j ][i+1]) * 0.5;
581 if (nvert[k][j+1][i] + nvert[k][j+1][i+1] < 0.1) {
582 dpde = (p[k][j+1][i] + p[k][j+1][i+1] -
583 p[k][j ][i] - p[k][j ][i+1]) * 0.5;
587 dpde = (p[k][j+1][i] + p[k][j+1][i+1] -
588 p[k][j-1][i] - p[k][j-1][i+1]) * 0.25;
593 dpdz = (p[k ][j][i] + p[k ][j][i+1] -
594 p[k-1][j][i] - p[k-1][j][i+1]) * 0.5;
598 if (nvert[k-1][j][i] + nvert[k-1][j][i+1] < 0.1) {
599 dpdz = (p[k ][j][i] + p[k ][j][i+1] -
600 p[k-1][j][i] - p[k-1][j][i+1]) * 0.5;
604 if (nvert[k+1][j][i] + nvert[k+1][j][i+1] < 0.1) {
605 dpdz = (p[k+1][j][i] + p[k+1][j][i+1] -
606 p[k ][j][i] - p[k ][j][i+1]) * 0.5;
610 if (nvert[k+1][j][i] + nvert[k+1][j][i+1] < 0.1) {
611 dpdz = (p[k+1][j][i] + p[k+1][j][i+1] -
612 p[k ][j][i] - p[k ][j][i+1]) * 0.5;
616 dpdz = (p[k+1][j][i] + p[k+1][j][i+1] -
617 p[k-1][j][i] - p[k-1][j][i+1]) * 0.25;
622 if (!(nvert[k][j][i] + nvert[k][j][i+1])) {
624 (dpdc * (icsi[k][j][i].
x * icsi[k][j][i].
x +
625 icsi[k][j][i].
y * icsi[k][j][i].
y +
626 icsi[k][j][i].
z * icsi[k][j][i].
z) * iaj[k][j][i] +
627 dpde * (ieta[k][j][i].x * icsi[k][j][i].x +
628 ieta[k][j][i].y * icsi[k][j][i].y +
629 ieta[k][j][i].z * icsi[k][j][i].z) * iaj[k][j][i] +
630 dpdz * (izet[k][j][i].
x * icsi[k][j][i].
x +
631 izet[k][j][i].
y * icsi[k][j][i].
y +
632 izet[k][j][i].
z * icsi[k][j][i].
z) * iaj[k][j][i])
641 for (PetscInt k=lzs; k<lze; k++) {
642 for (PetscInt i=lxs; i<lxe; i++) {
649 dpdc = (p[k][j][i ] + p[k][j+1][i ] -
650 p[k][j][i-1] - p[k][j+1][i-1]) * 0.5;
654 if (nvert[k][j][i-1] + nvert[k][j+1][i-1] < 0.1) {
655 dpdc = (p[k][j][i ] + p[k][j+1][i ] -
656 p[k][j][i-1] - p[k][j+1][i-1]) * 0.5;
660 if (nvert[k][j][i+1] + nvert[k][j+1][i+1] < 0.1) {
661 dpdc = (p[k][j][i+1] + p[k][j+1][i+1] -
662 p[k][j][i ] - p[k][j+1][i ]) * 0.5;
666 if (nvert[k][j][i+1] + nvert[k][j+1][i+1] < 0.1) {
667 dpdc = (p[k][j][i+1] + p[k][j+1][i+1] -
668 p[k][j][i ] - p[k][j+1][i ]) * 0.5;
672 dpdc = (p[k][j][i+1] + p[k][j+1][i+1] -
673 p[k][j][i-1] - p[k][j+1][i-1]) * 0.25;
676 PetscReal dpde = p[k][j+1][i] - p[k][j][i];
680 dpdz = (p[k ][j][i] + p[k ][j+1][i] -
681 p[k-1][j][i] - p[k-1][j+1][i]) * 0.5;
685 if (nvert[k-1][j][i] + nvert[k-1][j+1][i] < 0.1) {
686 dpdz = (p[k ][j][i] + p[k ][j+1][i] -
687 p[k-1][j][i] - p[k-1][j+1][i]) * 0.5;
691 if (nvert[k+1][j][i] + nvert[k+1][j+1][i] < 0.1) {
692 dpdz = (p[k+1][j][i] + p[k+1][j+1][i] -
693 p[k ][j][i] - p[k ][j+1][i]) * 0.5;
697 if (nvert[k+1][j][i] + nvert[k+1][j+1][i] < 0.1) {
698 dpdz = (p[k+1][j][i] + p[k+1][j+1][i] -
699 p[k ][j][i] - p[k ][j+1][i]) * 0.5;
703 dpdz = (p[k+1][j][i] + p[k+1][j+1][i] -
704 p[k-1][j][i] - p[k-1][j+1][i]) * 0.25;
707 if (!(nvert[k][j][i] + nvert[k][j+1][i])) {
709 (dpdc * (jcsi[k][j][i].
x * jeta[k][j][i].
x +
710 jcsi[k][j][i].
y * jeta[k][j][i].
y +
711 jcsi[k][j][i].
z * jeta[k][j][i].
z) * jaj[k][j][i] +
712 dpde * (jeta[k][j][i].x * jeta[k][j][i].x +
713 jeta[k][j][i].y * jeta[k][j][i].y +
714 jeta[k][j][i].z * jeta[k][j][i].z) * jaj[k][j][i] +
715 dpdz * (jzet[k][j][i].
x * jeta[k][j][i].
x +
716 jzet[k][j][i].
y * jeta[k][j][i].
y +
717 jzet[k][j][i].
z * jeta[k][j][i].
z) * jaj[k][j][i])
725 for (PetscInt j=lys; j<lye; j++) {
726 for (PetscInt i=lxs; i<lxe; i++) {
734 dpdc = (p[k][j][i ] + p[k+1][j][i ] -
735 p[k][j][i-1] - p[k+1][j][i-1]) * 0.5;
739 if (nvert[k][j][i-1] + nvert[k+1][j][i-1] < 0.1) {
740 dpdc = (p[k][j][i ] + p[k+1][j][i ] -
741 p[k][j][i-1] - p[k+1][j][i-1]) * 0.5;
745 if (nvert[k][j][i+1] + nvert[k+1][j][i+1] < 0.1) {
746 dpdc = (p[k][j][i+1] + p[k+1][j][i+1] -
747 p[k][j][i ] - p[k+1][j][i ]) * 0.5;
751 if (nvert[k][j][i+1] + nvert[k+1][j][i+1] < 0.1) {
752 dpdc = (p[k][j][i+1] + p[k+1][j][i+1] -
753 p[k][j][i ] - p[k+1][j][i ]) * 0.5;
757 dpdc = (p[k][j][i+1] + p[k+1][j][i+1] -
758 p[k][j][i-1] - p[k+1][j][i-1]) * 0.25;
763 dpde = (p[k][j ][i] + p[k+1][j ][i] -
764 p[k][j-1][i] - p[k+1][j-1][i]) * 0.5;
768 if (nvert[k][j-1][i] + nvert[k+1][j-1][i] < 0.1) {
769 dpde = (p[k][j ][i] + p[k+1][j ][i] -
770 p[k][j-1][i] - p[k+1][j-1][i]) * 0.5;
774 if (nvert[k][j+1][i] + nvert[k+1][j+1][i] < 0.1) {
775 dpde = (p[k][j+1][i] + p[k+1][j+1][i] -
776 p[k][j ][i] - p[k+1][j ][i]) * 0.5;
780 if (nvert[k][j+1][i] + nvert[k+1][j+1][i] < 0.1) {
781 dpde = (p[k][j+1][i] + p[k+1][j+1][i] -
782 p[k][j ][i] - p[k+1][j ][i]) * 0.5;
786 dpde = (p[k][j+1][i] + p[k+1][j+1][i] -
787 p[k][j-1][i] - p[k+1][j-1][i]) * 0.25;
790 PetscReal dpdz = p[k+1][j][i] - p[k][j][i];
792 if (!(nvert[k][j][i] + nvert[k+1][j][i])) {
795 (dpdc * (kcsi[k][j][i].
x * kzet[k][j][i].
x +
796 kcsi[k][j][i].
y * kzet[k][j][i].
y +
797 kcsi[k][j][i].
z * kzet[k][j][i].
z) * kaj[k][j][i] +
798 dpde * (keta[k][j][i].x * kzet[k][j][i].x +
799 keta[k][j][i].y * kzet[k][j][i].y +
800 keta[k][j][i].z * kzet[k][j][i].z) * kaj[k][j][i] +
801 dpdz * (kzet[k][j][i].
x * kzet[k][j][i].
x +
802 kzet[k][j][i].
y * kzet[k][j][i].
y +
803 kzet[k][j][i].
z * kzet[k][j][i].
z) * kaj[k][j][i])
819 DMDAVecRestoreArray(fda, user->
Ucont, &ucont);
822 DMDAVecRestoreArray(fda, user->
lICsi, &icsi); DMDAVecRestoreArray(fda, user->
lIEta, &ieta); DMDAVecRestoreArray(fda, user->
lIZet, &izet);
823 DMDAVecRestoreArray(fda, user->
lJCsi, &jcsi); DMDAVecRestoreArray(fda, user->
lJEta, &jeta); DMDAVecRestoreArray(fda, user->
lJZet, &jzet);
824 DMDAVecRestoreArray(fda, user->
lKCsi, &kcsi); DMDAVecRestoreArray(fda, user->
lKEta, &keta); DMDAVecRestoreArray(fda, user->
lKZet, &kzet);
825 DMDAVecRestoreArray(da, user->
lIAj, &iaj); DMDAVecRestoreArray(da, user->
lJAj, &jaj); DMDAVecRestoreArray(da, user->
lKAj, &kaj);
826 DMDAVecRestoreArray(da, user->
lPhi, &p);
827 DMDAVecRestoreArray(da, user->
lNvert, &nvert);
842 PetscFunctionReturn(0);
1425 PetscFunctionBeginUser;
1428 PetscErrorCode ierr;
1435 DM da = user->
da, fda = user->
fda;
1436 DMDALocalInfo info = user->
info;
1437 PetscInt IM = user->
IM, JM = user->
JM, KM = user->
KM;
1441 PetscInt mx = info.mx, my = info.my, mz = info.mz;
1442 PetscInt xs = info.xs, xe = info.xs + info.xm;
1443 PetscInt ys = info.ys, ye = info.ys + info.ym;
1444 PetscInt zs = info.zs, ze = info.zs + info.zm;
1445 PetscInt gxs = info.gxs, gxe = gxs + info.gxm;
1446 PetscInt gys = info.gys, gye = gys + info.gym;
1447 PetscInt gzs = info.gzs, gze = gzs + info.gzm;
1450 const PetscReal IBM_FLUID_THRESHOLD = 0.1;
1455 PetscInt N = mx * my * mz;
1457 VecGetLocalSize(user->
Phi, &M);
1459 MatCreateAIJ(PETSC_COMM_WORLD, M, M, N, N, 19, PETSC_NULLPTR, 19, PETSC_NULLPTR, &(user->
A));
1464 MatZeroEntries(user->
A);
1467 Cmpnts ***csi, ***eta, ***zet, ***icsi, ***ieta, ***izet, ***jcsi, ***jeta, ***jzet, ***kcsi, ***keta, ***kzet;
1468 PetscReal ***aj, ***iaj, ***jaj, ***kaj, ***nvert;
1469 DMDAVecGetArray(fda, user->
lCsi, &csi); DMDAVecGetArray(fda, user->
lEta, &eta); DMDAVecGetArray(fda, user->
lZet, &zet);
1470 DMDAVecGetArray(fda, user->
lICsi, &icsi); DMDAVecGetArray(fda, user->
lIEta, &ieta); DMDAVecGetArray(fda, user->
lIZet, &izet);
1471 DMDAVecGetArray(fda, user->
lJCsi, &jcsi); DMDAVecGetArray(fda, user->
lJEta, &jeta); DMDAVecGetArray(fda, user->
lJZet, &jzet);
1472 DMDAVecGetArray(fda, user->
lKCsi, &kcsi); DMDAVecGetArray(fda, user->
lKEta, &keta); DMDAVecGetArray(fda, user->
lKZet, &kzet);
1473 DMDAVecGetArray(da, user->
lAj, &aj); DMDAVecGetArray(da, user->
lIAj, &iaj); DMDAVecGetArray(da, user->
lJAj, &jaj); DMDAVecGetArray(da, user->
lKAj, &kaj);
1474 DMDAVecGetArray(da, user->
lNvert, &nvert);
1477 Vec G11, G12, G13, G21, G22, G23, G31, G32, G33;
1478 PetscReal ***g11, ***g12, ***g13, ***g21, ***g22, ***g23, ***g31, ***g32, ***g33;
1479 VecDuplicate(user->
lAj, &G11); VecDuplicate(user->
lAj, &G12); VecDuplicate(user->
lAj, &G13);
1480 VecDuplicate(user->
lAj, &G21); VecDuplicate(user->
lAj, &G22); VecDuplicate(user->
lAj, &G23);
1481 VecDuplicate(user->
lAj, &G31); VecDuplicate(user->
lAj, &G32); VecDuplicate(user->
lAj, &G33);
1482 DMDAVecGetArray(da, G11, &g11); DMDAVecGetArray(da, G12, &g12); DMDAVecGetArray(da, G13, &g13);
1483 DMDAVecGetArray(da, G21, &g21); DMDAVecGetArray(da, G22, &g22); DMDAVecGetArray(da, G23, &g23);
1484 DMDAVecGetArray(da, G31, &g31); DMDAVecGetArray(da, G32, &g32); DMDAVecGetArray(da, G33, &g33);
1490 for (k = gzs; k < gze; k++) {
1491 for (j = gys; j < gye; j++) {
1492 for (i = gxs; i < gxe; i++) {
1495 if(i>-1 && j>-1 && k>-1 && i<IM+1 && j<JM+1 && k<KM+1){
1496 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];
1497 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];
1498 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];
1499 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];
1500 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];
1501 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];
1502 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];
1503 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];
1504 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];
1516 PetscInt x_str, x_end, y_str, y_end, z_str, z_end;
1518 else { x_end = mx - 2; x_str = 1; }
1520 else { y_end = my - 2; y_str = 1; }
1522 else { z_end = mz - 2; z_str = 1; }
1525 for (k = zs; k < ze; k++) {
1526 for (j = ys; j < ye; j++) {
1527 for (i = xs; i < xe; i++) {
1528 PetscScalar vol[19];
1530 PetscInt row =
Gidx(i, j, k, user);
1535 if (i == 0 || i == mx - 1 || j == 0 || j == my - 1 || k == 0 || k == mz - 1 || nvert[k][j][i] > IBM_FLUID_THRESHOLD) {
1538 MatSetValues(user->
A, 1, &row, 1, &idx[
CP], &vol[
CP], INSERT_VALUES);
1542 for (PetscInt m = 0; m < 19; m++) {
1549 if (nvert[k][j][i + 1] < IBM_FLUID_THRESHOLD && i != x_end) {
1551 vol[
CP] -= g11[k][j][i];
1552 vol[
EP] += g11[k][j][i];
1559 vol[
CP] += g12[k][j][i] * 0.5; vol[
EP] += g12[k][j][i] * 0.5;
1560 vol[
SP] -= g12[k][j][i] * 0.5; vol[
SE] -= g12[k][j][i] * 0.5;
1564 if (nvert[k][j-1][i] + nvert[k][j-1][i+1] < 0.1) {
1565 vol[
CP] += g12[k][j][i] * 0.5; vol[
EP] += g12[k][j][i] * 0.5;
1566 vol[
SP] -= g12[k][j][i] * 0.5; vol[
SE] -= g12[k][j][i] * 0.5;
1570 if (nvert[k][j+1][i] + nvert[k][j+1][i+1] < 0.1) {
1571 vol[
NP] += g12[k][j][i] * 0.5; vol[
NE] += g12[k][j][i] * 0.5;
1572 vol[
CP] -= g12[k][j][i] * 0.5; vol[
EP] -= g12[k][j][i] * 0.5;
1576 if (nvert[k][j+1][i] + nvert[k][j+1][i+1] < 0.1) {
1577 vol[
NP] += g12[k][j][i] * 0.5; vol[
NE] += g12[k][j][i] * 0.5;
1578 vol[
CP] -= g12[k][j][i] * 0.5; vol[
EP] -= g12[k][j][i] * 0.5;
1582 vol[
NP] += g12[k][j][i] * 0.25; vol[
NE] += g12[k][j][i] * 0.25;
1583 vol[
SP] -= g12[k][j][i] * 0.25; vol[
SE] -= g12[k][j][i] * 0.25;
1589 vol[
CP] += g13[k][j][i] * 0.5; vol[
EP] += g13[k][j][i] * 0.5;
1590 vol[
BP] -= g13[k][j][i] * 0.5; vol[
BE] -= g13[k][j][i] * 0.5;
1594 if (nvert[k-1][j][i] + nvert[k-1][j][i+1] < 0.1) {
1595 vol[
CP] += g13[k][j][i] * 0.5; vol[
EP] += g13[k][j][i] * 0.5;
1596 vol[
BP] -= g13[k][j][i] * 0.5; vol[
BE] -= g13[k][j][i] * 0.5;
1600 if (nvert[k+1][j][i] + nvert[k+1][j][i+1] < 0.1) {
1601 vol[
TP] += g13[k][j][i] * 0.5; vol[
TE] += g13[k][j][i] * 0.5;
1602 vol[
CP] -= g13[k][j][i] * 0.5; vol[
EP] -= g13[k][j][i] * 0.5;
1606 if (nvert[k+1][j][i] + nvert[k+1][j][i+1] < 0.1) {
1607 vol[
TP] += g13[k][j][i] * 0.5; vol[
TE] += g13[k][j][i] * 0.5;
1608 vol[
CP] -= g13[k][j][i] * 0.5; vol[
EP] -= g13[k][j][i] * 0.5;
1612 vol[
TP] += g13[k][j][i] * 0.25; vol[
TE] += g13[k][j][i] * 0.25;
1613 vol[
BP] -= g13[k][j][i] * 0.25; vol[
BE] -= g13[k][j][i] * 0.25;
1620 if (nvert[k][j][i-1] < IBM_FLUID_THRESHOLD && i != x_str) {
1621 vol[
CP] -= g11[k][j][i-1];
1622 vol[
WP] += g11[k][j][i-1];
1626 vol[
CP] -= g12[k][j][i-1] * 0.5; vol[
WP] -= g12[k][j][i-1] * 0.5;
1627 vol[
SP] += g12[k][j][i-1] * 0.5; vol[
SW] += g12[k][j][i-1] * 0.5;
1631 if (nvert[k][j-1][i] + nvert[k][j-1][i-1] < 0.1) {
1632 vol[
CP] -= g12[k][j][i-1] * 0.5; vol[
WP] -= g12[k][j][i-1] * 0.5;
1633 vol[
SP] += g12[k][j][i-1] * 0.5; vol[
SW] += g12[k][j][i-1] * 0.5;
1637 if (nvert[k][j+1][i] + nvert[k][j+1][i-1] < 0.1) {
1638 vol[
NP] -= g12[k][j][i-1] * 0.5; vol[
NW] -= g12[k][j][i-1] * 0.5;
1639 vol[
CP] += g12[k][j][i-1] * 0.5; vol[
WP] += g12[k][j][i-1] * 0.5;
1643 if (nvert[k][j+1][i] + nvert[k][j+1][i-1] < 0.1) {
1644 vol[
NP] -= g12[k][j][i-1] * 0.5; vol[
NW] -= g12[k][j][i-1] * 0.5;
1645 vol[
CP] += g12[k][j][i-1] * 0.5; vol[
WP] += g12[k][j][i-1] * 0.5;
1649 vol[
NP] -= g12[k][j][i-1] * 0.25; vol[
NW] -= g12[k][j][i-1] * 0.25;
1650 vol[
SP] += g12[k][j][i-1] * 0.25; vol[
SW] += g12[k][j][i-1] * 0.25;
1655 vol[
CP] -= g13[k][j][i-1] * 0.5; vol[
WP] -= g13[k][j][i-1] * 0.5;
1656 vol[
BP] += g13[k][j][i-1] * 0.5; vol[
BW] += g13[k][j][i-1] * 0.5;
1660 if (nvert[k-1][j][i] + nvert[k-1][j][i-1] < 0.1) {
1661 vol[
CP] -= g13[k][j][i-1] * 0.5; vol[
WP] -= g13[k][j][i-1] * 0.5;
1662 vol[
BP] += g13[k][j][i-1] * 0.5; vol[
BW] += g13[k][j][i-1] * 0.5;
1666 if (nvert[k+1][j][i] + nvert[k+1][j][i-1] < 0.1) {
1667 vol[
TP] -= g13[k][j][i-1] * 0.5; vol[
TW] -= g13[k][j][i-1] * 0.5;
1668 vol[
CP] += g13[k][j][i-1] * 0.5; vol[
WP] += g13[k][j][i-1] * 0.5;
1672 if (nvert[k+1][j][i] + nvert[k+1][j][i-1] < 0.1) {
1673 vol[
TP] -= g13[k][j][i-1] * 0.5; vol[
TW] -= g13[k][j][i-1] * 0.5;
1674 vol[
CP] += g13[k][j][i-1] * 0.5; vol[
WP] += g13[k][j][i-1] * 0.5;
1678 vol[
TP] -= g13[k][j][i-1] * 0.25; vol[
TW] -= g13[k][j][i-1] * 0.25;
1679 vol[
BP] += g13[k][j][i-1] * 0.25; vol[
BW] += g13[k][j][i-1] * 0.25;
1686 if (nvert[k][j+1][i] < IBM_FLUID_THRESHOLD && j != y_end) {
1689 vol[
CP] += g21[k][j][i] * 0.5; vol[
NP] += g21[k][j][i] * 0.5;
1690 vol[
WP] -= g21[k][j][i] * 0.5; vol[
NW] -= g21[k][j][i] * 0.5;
1694 if (nvert[k][j][i-1] + nvert[k][j+1][i-1] < 0.1) {
1695 vol[
CP] += g21[k][j][i] * 0.5; vol[
NP] += g21[k][j][i] * 0.5;
1696 vol[
WP] -= g21[k][j][i] * 0.5; vol[
NW] -= g21[k][j][i] * 0.5;
1700 if (nvert[k][j][i+1] + nvert[k][j+1][i+1] < 0.1) {
1701 vol[
EP] += g21[k][j][i] * 0.5; vol[
NE] += g21[k][j][i] * 0.5;
1702 vol[
CP] -= g21[k][j][i] * 0.5; vol[
NP] -= g21[k][j][i] * 0.5;
1706 if (nvert[k][j][i+1] + nvert[k][j+1][i+1] < 0.1) {
1707 vol[
EP] += g21[k][j][i] * 0.5; vol[
NE] += g21[k][j][i] * 0.5;
1708 vol[
CP] -= g21[k][j][i] * 0.5; vol[
NP] -= g21[k][j][i] * 0.5;
1712 vol[
EP] += g21[k][j][i] * 0.25; vol[
NE] += g21[k][j][i] * 0.25;
1713 vol[
WP] -= g21[k][j][i] * 0.25; vol[
NW] -= g21[k][j][i] * 0.25;
1716 vol[
CP] -= g22[k][j][i];
1717 vol[
NP] += g22[k][j][i];
1721 vol[
CP] += g23[k][j][i] * 0.5; vol[
NP] += g23[k][j][i] * 0.5;
1722 vol[
BP] -= g23[k][j][i] * 0.5; vol[
BN] -= g23[k][j][i] * 0.5;
1726 if (nvert[k-1][j][i] + nvert[k-1][j+1][i] < 0.1) {
1727 vol[
CP] += g23[k][j][i] * 0.5; vol[
NP] += g23[k][j][i] * 0.5;
1728 vol[
BP] -= g23[k][j][i] * 0.5; vol[
BN] -= g23[k][j][i] * 0.5;
1732 if (nvert[k+1][j][i] + nvert[k+1][j+1][i] < 0.1) {
1733 vol[
TP] += g23[k][j][i] * 0.5; vol[
TN] += g23[k][j][i] * 0.5;
1734 vol[
CP] -= g23[k][j][i] * 0.5; vol[
NP] -= g23[k][j][i] * 0.5;
1738 if (nvert[k+1][j][i] + nvert[k+1][j+1][i] < 0.1) {
1739 vol[
TP] += g23[k][j][i] * 0.5; vol[
TN] += g23[k][j][i] * 0.5;
1740 vol[
CP] -= g23[k][j][i] * 0.5; vol[
NP] -= g23[k][j][i] * 0.5;
1744 vol[
TP] += g23[k][j][i] * 0.25; vol[
TN] += g23[k][j][i] * 0.25;
1745 vol[
BP] -= g23[k][j][i] * 0.25; vol[
BN] -= g23[k][j][i] * 0.25;
1752 if (nvert[k][j-1][i] < IBM_FLUID_THRESHOLD && j != y_str) {
1755 vol[
CP] -= g21[k][j-1][i] * 0.5; vol[
SP] -= g21[k][j-1][i] * 0.5;
1756 vol[
WP] += g21[k][j-1][i] * 0.5; vol[
SW] += g21[k][j-1][i] * 0.5;
1760 if (nvert[k][j][i-1] + nvert[k][j-1][i-1] < 0.1) {
1761 vol[
CP] -= g21[k][j-1][i] * 0.5; vol[
SP] -= g21[k][j-1][i] * 0.5;
1762 vol[
WP] += g21[k][j-1][i] * 0.5; vol[
SW] += g21[k][j-1][i] * 0.5;
1766 if (nvert[k][j][i+1] + nvert[k][j-1][i+1] < 0.1) {
1767 vol[
EP] -= g21[k][j-1][i] * 0.5; vol[
SE] -= g21[k][j-1][i] * 0.5;
1768 vol[
CP] += g21[k][j-1][i] * 0.5; vol[
SP] += g21[k][j-1][i] * 0.5;
1772 if (nvert[k][j][i+1] + nvert[k][j-1][i+1] < 0.1) {
1773 vol[
EP] -= g21[k][j-1][i] * 0.5; vol[
SE] -= g21[k][j-1][i] * 0.5;
1774 vol[
CP] += g21[k][j-1][i] * 0.5; vol[
SP] += g21[k][j-1][i] * 0.5;
1778 vol[
EP] -= g21[k][j-1][i] * 0.25; vol[
SE] -= g21[k][j-1][i] * 0.25;
1779 vol[
WP] += g21[k][j-1][i] * 0.25; vol[
SW] += g21[k][j-1][i] * 0.25;
1782 vol[
CP] -= g22[k][j-1][i];
1783 vol[
SP] += g22[k][j-1][i];
1787 vol[
CP] -= g23[k][j-1][i] * 0.5; vol[
SP] -= g23[k][j-1][i] * 0.5;
1788 vol[
BP] += g23[k][j-1][i] * 0.5; vol[
BS] += g23[k][j-1][i] * 0.5;
1792 if (nvert[k-1][j][i] + nvert[k-1][j-1][i] < 0.1 ) {
1793 vol[
CP] -= g23[k][j-1][i] * 0.5; vol[
SP] -= g23[k][j-1][i] * 0.5;
1794 vol[
BP] += g23[k][j-1][i] * 0.5; vol[
BS] += g23[k][j-1][i] * 0.5;
1798 if (nvert[k+1][j][i] + nvert[k+1][j-1][i] < 0.1) {
1799 vol[
TP] -= g23[k][j-1][i] * 0.5; vol[
TS] -= g23[k][j-1][i] * 0.5;
1800 vol[
CP] += g23[k][j-1][i] * 0.5; vol[
SP] += g23[k][j-1][i] * 0.5;
1804 if (nvert[k+1][j][i] + nvert[k+1][j-1][i] < 0.1) {
1805 vol[
TP] -= g23[k][j-1][i] * 0.5; vol[
TS] -= g23[k][j-1][i] * 0.5;
1806 vol[
CP] += g23[k][j-1][i] * 0.5; vol[
SP] += g23[k][j-1][i] * 0.5;
1810 vol[
TP] -= g23[k][j-1][i] * 0.25; vol[
TS] -= g23[k][j-1][i] * 0.25;
1811 vol[
BP] += g23[k][j-1][i] * 0.25; vol[
BS] += g23[k][j-1][i] * 0.25;
1818 if (nvert[k+1][j][i] < IBM_FLUID_THRESHOLD && k != z_end) {
1821 vol[
CP] += g31[k][j][i] * 0.5; vol[
TP] += g31[k][j][i] * 0.5;
1822 vol[
WP] -= g31[k][j][i] * 0.5; vol[
TW] -= g31[k][j][i] * 0.5;
1826 if (nvert[k][j][i-1] + nvert[k+1][j][i-1] < 0.1) {
1827 vol[
CP] += g31[k][j][i] * 0.5; vol[
TP] += g31[k][j][i] * 0.5;
1828 vol[
WP] -= g31[k][j][i] * 0.5; vol[
TW] -= g31[k][j][i] * 0.5;
1832 if (nvert[k][j][i+1] + nvert[k+1][j][i+1] < 0.1) {
1833 vol[
EP] += g31[k][j][i] * 0.5; vol[
TE] += g31[k][j][i] * 0.5;
1834 vol[
CP] -= g31[k][j][i] * 0.5; vol[
TP] -= g31[k][j][i] * 0.5;
1838 if (nvert[k][j][i+1] + nvert[k+1][j][i+1] < 0.1) {
1839 vol[
EP] += g31[k][j][i] * 0.5; vol[
TE] += g31[k][j][i] * 0.5;
1840 vol[
CP] -= g31[k][j][i] * 0.5; vol[
TP] -= g31[k][j][i] * 0.5;
1844 vol[
EP] += g31[k][j][i] * 0.25; vol[
TE] += g31[k][j][i] * 0.25;
1845 vol[
WP] -= g31[k][j][i] * 0.25; vol[
TW] -= g31[k][j][i] * 0.25;
1850 vol[
CP] += g32[k][j][i] * 0.5; vol[
TP] += g32[k][j][i] * 0.5;
1851 vol[
SP] -= g32[k][j][i] * 0.5; vol[
TS] -= g32[k][j][i] * 0.5;
1855 if (nvert[k][j-1][i] + nvert[k+1][j-1][i] < 0.1) {
1856 vol[
CP] += g32[k][j][i] * 0.5; vol[
TP] += g32[k][j][i] * 0.5;
1857 vol[
SP] -= g32[k][j][i] * 0.5; vol[
TS] -= g32[k][j][i] * 0.5;
1861 if (nvert[k][j+1][i] + nvert[k+1][j+1][i] < 0.1) {
1862 vol[
NP] += g32[k][j][i] * 0.5; vol[
TN] += g32[k][j][i] * 0.5;
1863 vol[
CP] -= g32[k][j][i] * 0.5; vol[
TP] -= g32[k][j][i] * 0.5;
1867 if (nvert[k][j+1][i] + nvert[k+1][j+1][i] < 0.1) {
1868 vol[
NP] += g32[k][j][i] * 0.5; vol[
TN] += g32[k][j][i] * 0.5;
1869 vol[
CP] -= g32[k][j][i] * 0.5; vol[
TP] -= g32[k][j][i] * 0.5;
1873 vol[
NP] += g32[k][j][i] * 0.25; vol[
TN] += g32[k][j][i] * 0.25;
1874 vol[
SP] -= g32[k][j][i] * 0.25; vol[
TS] -= g32[k][j][i] * 0.25;
1877 vol[
CP] -= g33[k][j][i];
1878 vol[
TP] += g33[k][j][i];
1884 if (nvert[k-1][j][i] < IBM_FLUID_THRESHOLD && k != z_str) {
1887 vol[
CP] -= g31[k-1][j][i] * 0.5; vol[
BP] -= g31[k-1][j][i] * 0.5;
1888 vol[
WP] += g31[k-1][j][i] * 0.5; vol[
BW] += g31[k-1][j][i] * 0.5;
1892 if (nvert[k][j][i-1] + nvert[k-1][j][i-1] < 0.1) {
1893 vol[
CP] -= g31[k-1][j][i] * 0.5; vol[
BP] -= g31[k-1][j][i] * 0.5;
1894 vol[
WP] += g31[k-1][j][i] * 0.5; vol[
BW] += g31[k-1][j][i] * 0.5;
1898 if (nvert[k][j][i+1] + nvert[k-1][j][i+1] < 0.1) {
1899 vol[
EP] -= g31[k-1][j][i] * 0.5; vol[
BE] -= g31[k-1][j][i] * 0.5;
1900 vol[
CP] += g31[k-1][j][i] * 0.5; vol[
BP] += g31[k-1][j][i] * 0.5;
1904 if (nvert[k][j][i+1] + nvert[k-1][j][i+1] < 0.1) {
1905 vol[
EP] -= g31[k-1][j][i] * 0.5; vol[
BE] -= g31[k-1][j][i] * 0.5;
1906 vol[
CP] += g31[k-1][j][i] * 0.5; vol[
BP] += g31[k-1][j][i] * 0.5;
1910 vol[
EP] -= g31[k-1][j][i] * 0.25; vol[
BE] -= g31[k-1][j][i] * 0.25;
1911 vol[
WP] += g31[k-1][j][i] * 0.25; vol[
BW] += g31[k-1][j][i] * 0.25;
1916 vol[
CP] -= g32[k-1][j][i] * 0.5; vol[
BP] -= g32[k-1][j][i] * 0.5;
1917 vol[
SP] += g32[k-1][j][i] * 0.5; vol[
BS] += g32[k-1][j][i] * 0.5;
1921 if (nvert[k][j-1][i] + nvert[k-1][j-1][i] < 0.1) {
1922 vol[
CP] -= g32[k-1][j][i] * 0.5; vol[
BP] -= g32[k-1][j][i] * 0.5;
1923 vol[
SP] += g32[k-1][j][i] * 0.5; vol[
BS] += g32[k-1][j][i] * 0.5;
1927 if (nvert[k][j+1][i] + nvert[k-1][j+1][i] < 0.1) {
1928 vol[
NP] -= g32[k-1][j][i] * 0.5; vol[
BN] -= g32[k-1][j][i] * 0.5;
1929 vol[
CP] += g32[k-1][j][i] * 0.5; vol[
BP] += g32[k-1][j][i] * 0.5;
1933 if (nvert[k][j+1][i] + nvert[k-1][j+1][i] < 0.1) {
1934 vol[
NP] -= g32[k-1][j][i] * 0.5; vol[
BN] -= g32[k-1][j][i] * 0.5;
1935 vol[
CP] += g32[k-1][j][i] * 0.5; vol[
BP] += g32[k-1][j][i] * 0.5;
1939 vol[
NP] -= g32[k-1][j][i] * 0.25; vol[
BN] -= g32[k-1][j][i] * 0.25;
1940 vol[
SP] += g32[k-1][j][i] * 0.25; vol[
BS] += g32[k-1][j][i] * 0.25;
1943 vol[
CP] -= g33[k-1][j][i];
1944 vol[
BP] += g33[k-1][j][i];
1950 for (PetscInt m = 0; m < 19; m++) {
1951 vol[m] *= -aj[k][j][i];
1955 idx[
CP] =
Gidx(i, j, k, user);
1962 if (user->
boundary_faces[
BC_FACE_NEG_X].
mathematical_type ==
PERIODIC && user->
boundary_faces[
BC_FACE_NEG_Y].
mathematical_type ==
PERIODIC && i==mx-2 && j==my-2) idx[
NE] =
Gidx(1, 1, k, user);
else if (user->
boundary_faces[
BC_FACE_NEG_X].
mathematical_type ==
PERIODIC && i==mx-2) idx[
NE] =
Gidx(1, j+1, k, user);
else if (user->
boundary_faces[
BC_FACE_NEG_Y].
mathematical_type ==
PERIODIC && j==my-2) idx[
NE] =
Gidx(i+1, 1, k, user);
else idx[
NE] =
Gidx(i+1, j+1, k, user);
1963 if (user->
boundary_faces[
BC_FACE_NEG_X].
mathematical_type ==
PERIODIC && user->
boundary_faces[
BC_FACE_NEG_Y].
mathematical_type ==
PERIODIC && i==mx-2 && j==1) idx[
SE] =
Gidx(1, my-2, k, user);
else if (user->
boundary_faces[
BC_FACE_NEG_X].
mathematical_type ==
PERIODIC && i==mx-2) idx[
SE] =
Gidx(1, j-1, k, user);
else if (user->
boundary_faces[
BC_FACE_NEG_Y].
mathematical_type ==
PERIODIC && j==1) idx[
SE] =
Gidx(i+1, my-2, k, user);
else idx[
SE] =
Gidx(i+1, j-1, k, user);
1964 if (user->
boundary_faces[
BC_FACE_NEG_X].
mathematical_type ==
PERIODIC && user->
boundary_faces[
BC_FACE_NEG_Y].
mathematical_type ==
PERIODIC && i==1 && j==my-2) idx[
NW] =
Gidx(mx-2, 1, k, user);
else if (user->
boundary_faces[
BC_FACE_NEG_X].
mathematical_type ==
PERIODIC && i==1) idx[
NW] =
Gidx(mx-2, j+1, k, user);
else if (user->
boundary_faces[
BC_FACE_NEG_Y].
mathematical_type ==
PERIODIC && j==my-2) idx[
NW] =
Gidx(i-1, 1, k, user);
else idx[
NW] =
Gidx(i-1, j+1, k, user);
1965 if (user->
boundary_faces[
BC_FACE_NEG_X].
mathematical_type ==
PERIODIC && user->
boundary_faces[
BC_FACE_NEG_Y].
mathematical_type ==
PERIODIC && i==1 && j==1) idx[
SW] =
Gidx(mx-2, my-2, k, user);
else if (user->
boundary_faces[
BC_FACE_NEG_X].
mathematical_type ==
PERIODIC && i==1) idx[
SW] =
Gidx(mx-2, j-1, k, user);
else if (user->
boundary_faces[
BC_FACE_NEG_Y].
mathematical_type ==
PERIODIC && j==1) idx[
SW] =
Gidx(i-1, my-2, k, user);
else idx[
SW] =
Gidx(i-1, j-1, k, user);
1966 if (user->
boundary_faces[
BC_FACE_NEG_Y].
mathematical_type ==
PERIODIC && user->
boundary_faces[
BC_FACE_NEG_Z].
mathematical_type ==
PERIODIC && j==my-2 && k==mz-2) idx[
TN] =
Gidx(i, 1, 1, user);
else if (user->
boundary_faces[
BC_FACE_NEG_Y].
mathematical_type ==
PERIODIC && j==my-2) idx[
TN] =
Gidx(i, 1, k+1, user);
else if (user->
boundary_faces[
BC_FACE_NEG_Z].
mathematical_type ==
PERIODIC && k==mz-2) idx[
TN] =
Gidx(i, j+1, 1, user);
else idx[
TN] =
Gidx(i, j+1, k+1, user);
1967 if (user->
boundary_faces[
BC_FACE_NEG_Y].
mathematical_type ==
PERIODIC && user->
boundary_faces[
BC_FACE_NEG_Z].
mathematical_type ==
PERIODIC && j==my-2 && k==1) idx[
BN] =
Gidx(i, 1, mz-2, user);
else if(user->
boundary_faces[
BC_FACE_NEG_Y].
mathematical_type ==
PERIODIC && j==my-2) idx[
BN] =
Gidx(i, 1, k-1, user);
else if (user->
boundary_faces[
BC_FACE_NEG_Z].
mathematical_type ==
PERIODIC && k==1) idx[
BN] =
Gidx(i, j+1, mz-2, user);
else idx[
BN] =
Gidx(i, j+1, k-1, user);
1968 if (user->
boundary_faces[
BC_FACE_NEG_Y].
mathematical_type ==
PERIODIC && user->
boundary_faces[
BC_FACE_NEG_Z].
mathematical_type ==
PERIODIC && j==1 && k==mz-2) idx[
TS] =
Gidx(i, my-2, 1, user);
else if (user->
boundary_faces[
BC_FACE_NEG_Y].
mathematical_type ==
PERIODIC && j==1) idx[
TS] =
Gidx(i, my-2, k+1, user);
else if (user->
boundary_faces[
BC_FACE_NEG_Z].
mathematical_type ==
PERIODIC && k==mz-2) idx[
TS] =
Gidx(i, j-1, 1, user);
else idx[
TS] =
Gidx(i, j-1, k+1, user);
1969 if (user->
boundary_faces[
BC_FACE_NEG_Y].
mathematical_type ==
PERIODIC && user->
boundary_faces[
BC_FACE_NEG_Z].
mathematical_type ==
PERIODIC && j==1 && k==1) idx[
BS] =
Gidx(i, my-2, mz-2, user);
else if (user->
boundary_faces[
BC_FACE_NEG_Y].
mathematical_type ==
PERIODIC && j==1) idx[
BS] =
Gidx(i, my-2, k-1, user);
else if (user->
boundary_faces[
BC_FACE_NEG_Z].
mathematical_type ==
PERIODIC && k==1) idx[
BS] =
Gidx(i, j-1, mz-2, user);
else idx[
BS] =
Gidx(i, j-1, k-1, user);
1970 if (user->
boundary_faces[
BC_FACE_NEG_X].
mathematical_type ==
PERIODIC && user->
boundary_faces[
BC_FACE_NEG_Z].
mathematical_type ==
PERIODIC && i==mx-2 && k==mz-2) idx[
TE] =
Gidx(1, j, 1, user);
else if(user->
boundary_faces[
BC_FACE_NEG_X].
mathematical_type ==
PERIODIC && i==mx-2) idx[
TE] =
Gidx(1, j, k+1, user);
else if(user->
boundary_faces[
BC_FACE_NEG_Z].
mathematical_type ==
PERIODIC && k==mz-2) idx[
TE] =
Gidx(i+1, j, 1, user);
else idx[
TE] =
Gidx(i+1, j, k+1, user);
1971 if (user->
boundary_faces[
BC_FACE_NEG_X].
mathematical_type ==
PERIODIC && user->
boundary_faces[
BC_FACE_NEG_Z].
mathematical_type ==
PERIODIC && i==mx-2 && k==1) idx[
BE] =
Gidx(1, j, mz-2, user);
else if(user->
boundary_faces[
BC_FACE_NEG_X].
mathematical_type ==
PERIODIC && i==mx-2) idx[
BE] =
Gidx(1, j, k-1, user);
else if(user->
boundary_faces[
BC_FACE_NEG_Z].
mathematical_type ==
PERIODIC && k==1) idx[
BE] =
Gidx(i+1, j, mz-2, user);
else idx[
BE] =
Gidx(i+1, j, k-1, user);
1972 if (user->
boundary_faces[
BC_FACE_NEG_X].
mathematical_type ==
PERIODIC && user->
boundary_faces[
BC_FACE_NEG_Z].
mathematical_type ==
PERIODIC && i==1 && k==mz-2) idx[
TW] =
Gidx(mx-2, j, 1, user);
else if(user->
boundary_faces[
BC_FACE_NEG_X].
mathematical_type ==
PERIODIC && i==1) idx[
TW] =
Gidx(mx-2, j, k+1, user);
else if (user->
boundary_faces[
BC_FACE_NEG_Z].
mathematical_type ==
PERIODIC && k==mz-2) idx[
TW] =
Gidx(i-1, j, 1, user);
else idx[
TW] =
Gidx(i-1, j, k+1, user);
1973 if (user->
boundary_faces[
BC_FACE_NEG_X].
mathematical_type ==
PERIODIC && user->
boundary_faces[
BC_FACE_NEG_Z].
mathematical_type ==
PERIODIC && i==1 && k==1) idx[
BW] =
Gidx(mx-2, j, mz-2, user);
else if (user->
boundary_faces[
BC_FACE_NEG_X].
mathematical_type ==
PERIODIC && i==1) idx[
BW] =
Gidx(mx-2, j, k-1, user);
else if (user->
boundary_faces[
BC_FACE_NEG_Z].
mathematical_type ==
PERIODIC && k==1) idx[
BW] =
Gidx(i-1, j, mz-2, user);
else idx[
BW] =
Gidx(i-1, j, k-1, user);
1976 MatSetValues(user->
A, 1, &row, 19, idx, vol, INSERT_VALUES);
1987 MatAssemblyBegin(user->
A, MAT_FINAL_ASSEMBLY);
1988 MatAssemblyEnd(user->
A, MAT_FINAL_ASSEMBLY);
1992 ierr = MatNorm(user->
A,NORM_INFINITY,&max_A);CHKERRQ(ierr);
2001 DMDAVecRestoreArray(da, G11, &g11); DMDAVecRestoreArray(da, G12, &g12); DMDAVecRestoreArray(da, G13, &g13);
2002 DMDAVecRestoreArray(da, G21, &g21); DMDAVecRestoreArray(da, G22, &g22); DMDAVecRestoreArray(da, G23, &g23);
2003 DMDAVecRestoreArray(da, G31, &g31); DMDAVecRestoreArray(da, G32, &g32); DMDAVecRestoreArray(da, G33, &g33);
2005 VecDestroy(&G11); VecDestroy(&G12); VecDestroy(&G13);
2006 VecDestroy(&G21); VecDestroy(&G22); VecDestroy(&G23);
2007 VecDestroy(&G31); VecDestroy(&G32); VecDestroy(&G33);
2009 DMDAVecRestoreArray(fda, user->
lCsi, &csi); DMDAVecRestoreArray(fda, user->
lEta, &eta); DMDAVecRestoreArray(fda, user->
lZet, &zet);
2010 DMDAVecRestoreArray(fda, user->
lICsi, &icsi); DMDAVecRestoreArray(fda, user->
lIEta, &ieta); DMDAVecRestoreArray(fda, user->
lIZet, &izet);
2011 DMDAVecRestoreArray(fda, user->
lJCsi, &jcsi); DMDAVecRestoreArray(fda, user->
lJEta, &jeta); DMDAVecRestoreArray(fda, user->
lJZet, &jzet);
2012 DMDAVecRestoreArray(fda, user->
lKCsi, &kcsi); DMDAVecRestoreArray(fda, user->
lKEta, &keta); DMDAVecRestoreArray(fda, user->
lKZet, &kzet);
2013 DMDAVecRestoreArray(da, user->
lAj, &aj); DMDAVecRestoreArray(da, user->
lIAj, &iaj); DMDAVecRestoreArray(da, user->
lJAj, &jaj); DMDAVecRestoreArray(da, user->
lKAj, &kaj);
2014 DMDAVecRestoreArray(da, user->
lNvert, &nvert);
2018 PetscFunctionReturn(0);
2122 PetscReal *ibm_Area, PetscInt flg)
2124 PetscErrorCode ierr;
2126 DM da = user->
da, fda = user->
fda;
2128 DMDALocalInfo info = user->
info;
2130 PetscInt xs = info.xs, xe = info.xs + info.xm;
2131 PetscInt ys = info.ys, ye = info.ys + info.ym;
2132 PetscInt zs = info.zs, ze = info.zs + info.zm;
2133 PetscInt mx = info.mx, my = info.my, mz = info.mz;
2136 PetscInt lxs, lys, lzs, lxe, lye, lze;
2142 if (xs==0) lxs = xs+1;
2143 if (ys==0) lys = ys+1;
2144 if (zs==0) lzs = zs+1;
2146 if (xe==mx) lxe = xe-1;
2147 if (ye==my) lye = ye-1;
2148 if (ze==mz) lze = ze-1;
2150 PetscReal ***nvert, ibmval=1.5;
2151 Cmpnts ***ucor, ***csi, ***eta, ***zet;
2152 DMDAVecGetArray(fda, user->
Ucont, &ucor);
2153 DMDAVecGetArray(fda, user->
lCsi, &csi);
2154 DMDAVecGetArray(fda, user->
lEta, &eta);
2155 DMDAVecGetArray(fda, user->
lZet, &zet);
2156 DMDAVecGetArray(da, user->
lNvert, &nvert);
2158 PetscReal libm_Flux, libm_area;
2161 for (k=lzs; k<lze; k++) {
2162 for (j=lys; j<lye; j++) {
2163 for (i=lxs; i<lxe; i++) {
2164 if (nvert[k][j][i] < 0.1) {
2165 if (nvert[k][j][i+1] > ibmval-0.4 && nvert[k][j][i+1] < ibmval && i < mx-2) {
2166 libm_Flux += ucor[k][j][i].
x;
2167 libm_area += sqrt(csi[k][j][i].x * csi[k][j][i].x +
2168 csi[k][j][i].y * csi[k][j][i].y +
2169 csi[k][j][i].z * csi[k][j][i].z);
2172 if (nvert[k][j+1][i] > ibmval-0.4 && nvert[k][j+1][i] < ibmval && j < my-2) {
2173 libm_Flux += ucor[k][j][i].
y;
2174 libm_area += sqrt(eta[k][j][i].x * eta[k][j][i].x +
2175 eta[k][j][i].y * eta[k][j][i].y +
2176 eta[k][j][i].z * eta[k][j][i].z);
2178 if (nvert[k+1][j][i] > ibmval-0.4 && nvert[k+1][j][i] < ibmval && k < mz-2) {
2179 libm_Flux += ucor[k][j][i].
z;
2180 libm_area += sqrt(zet[k][j][i].x * zet[k][j][i].x +
2181 zet[k][j][i].y * zet[k][j][i].y +
2182 zet[k][j][i].z * zet[k][j][i].z);
2186 if (nvert[k][j][i] > ibmval-0.4 && nvert[k][j][i] < ibmval) {
2187 if (nvert[k][j][i+1] < 0.1 && i < mx-2) {
2188 libm_Flux -= ucor[k][j][i].
x;
2189 libm_area += sqrt(csi[k][j][i].x * csi[k][j][i].x +
2190 csi[k][j][i].y * csi[k][j][i].y +
2191 csi[k][j][i].z * csi[k][j][i].z);
2194 if (nvert[k][j+1][i] < 0.1 && j < my-2) {
2195 libm_Flux -= ucor[k][j][i].
y;
2196 libm_area += sqrt(eta[k][j][i].x * eta[k][j][i].x +
2197 eta[k][j][i].y * eta[k][j][i].y +
2198 eta[k][j][i].z * eta[k][j][i].z);
2200 if (nvert[k+1][j][i] < 0.1 && k < mz-2) {
2201 libm_Flux -= ucor[k][j][i].
z;
2202 libm_area += sqrt(zet[k][j][i].x * zet[k][j][i].x +
2203 zet[k][j][i].y * zet[k][j][i].y +
2204 zet[k][j][i].z * zet[k][j][i].z);
2212 ierr = MPI_Allreduce(&libm_Flux, ibm_Flux,1,MPI_DOUBLE,MPI_SUM, PETSC_COMM_WORLD); CHKERRMPI(ierr);
2213 ierr = MPI_Allreduce(&libm_area, ibm_Area,1,MPI_DOUBLE,MPI_SUM, PETSC_COMM_WORLD); CHKERRMPI(ierr);
2219 PetscReal correction;
2221 if (*ibm_Area > 1.e-15) {
2223 correction = (*ibm_Flux + user->
FluxIntpSum) / *ibm_Area;
2225 correction = *ibm_Flux / *ibm_Area;
2231 for (k=lzs; k<lze; k++) {
2232 for (j=lys; j<lye; j++) {
2233 for (i=lxs; i<lxe; i++) {
2234 if (nvert[k][j][i] < 0.1) {
2235 if (nvert[k][j][i+1] > ibmval-0.4 && nvert[k][j][i+1] < ibmval && i < mx-2) {
2236 ucor[k][j][i].
x -= sqrt(csi[k][j][i].x * csi[k][j][i].x +
2237 csi[k][j][i].y * csi[k][j][i].y +
2238 csi[k][j][i].z * csi[k][j][i].z) *
2242 if (nvert[k][j+1][i] > ibmval-0.4 && nvert[k][j+1][i] < ibmval && j < my-2) {
2243 ucor[k][j][i].
y -= sqrt(eta[k][j][i].x * eta[k][j][i].x +
2244 eta[k][j][i].y * eta[k][j][i].y +
2245 eta[k][j][i].z * eta[k][j][i].z) *
2248 if (nvert[k+1][j][i] > ibmval-0.4 && nvert[k+1][j][i] < ibmval && k < mz-2) {
2249 ucor[k][j][i].
z -= sqrt(zet[k][j][i].x * zet[k][j][i].x +
2250 zet[k][j][i].y * zet[k][j][i].y +
2251 zet[k][j][i].z * zet[k][j][i].z) *
2256 if (nvert[k][j][i] > ibmval-0.4 && nvert[k][j][i] < ibmval) {
2257 if (nvert[k][j][i+1] < 0.1 && i < mx-2) {
2258 ucor[k][j][i].
x += sqrt(csi[k][j][i].x * csi[k][j][i].x +
2259 csi[k][j][i].y * csi[k][j][i].y +
2260 csi[k][j][i].z * csi[k][j][i].z) *
2264 if (nvert[k][j+1][i] < 0.1 && j < my-2) {
2265 ucor[k][j][i].
y += sqrt(eta[k][j][i].x * eta[k][j][i].x +
2266 eta[k][j][i].y * eta[k][j][i].y +
2267 eta[k][j][i].z * eta[k][j][i].z) *
2270 if (nvert[k+1][j][i] < 0.1 && k < mz-2) {
2271 ucor[k][j][i].
z += sqrt(zet[k][j][i].x * zet[k][j][i].x +
2272 zet[k][j][i].y * zet[k][j][i].y +
2273 zet[k][j][i].z * zet[k][j][i].z) *
2286 for (k=lzs; k<lze; k++) {
2287 for (j=lys; j<lye; j++) {
2288 for (i=lxs; i<lxe; i++) {
2289 if (nvert[k][j][i] < 0.1) {
2290 if (nvert[k][j][i+1] > ibmval-0.4 && nvert[k][j][i+1] < ibmval && i < mx-2) {
2291 libm_Flux += ucor[k][j][i].
x;
2292 libm_area += sqrt(csi[k][j][i].x * csi[k][j][i].x +
2293 csi[k][j][i].y * csi[k][j][i].y +
2294 csi[k][j][i].z * csi[k][j][i].z);
2297 if (nvert[k][j+1][i] > ibmval-0.4 && nvert[k][j+1][i] < ibmval && j < my-2) {
2298 libm_Flux += ucor[k][j][i].
y;
2299 libm_area += sqrt(eta[k][j][i].x * eta[k][j][i].x +
2300 eta[k][j][i].y * eta[k][j][i].y +
2301 eta[k][j][i].z * eta[k][j][i].z);
2303 if (nvert[k+1][j][i] > ibmval-0.4 && nvert[k+1][j][i] < ibmval && k < mz-2) {
2304 libm_Flux += ucor[k][j][i].
z;
2305 libm_area += sqrt(zet[k][j][i].x * zet[k][j][i].x +
2306 zet[k][j][i].y * zet[k][j][i].y +
2307 zet[k][j][i].z * zet[k][j][i].z);
2311 if (nvert[k][j][i] > ibmval-0.4 && nvert[k][j][i] < ibmval) {
2312 if (nvert[k][j][i+1] < 0.1 && i < mx-2) {
2313 libm_Flux -= ucor[k][j][i].
x;
2314 libm_area += sqrt(csi[k][j][i].x * csi[k][j][i].x +
2315 csi[k][j][i].y * csi[k][j][i].y +
2316 csi[k][j][i].z * csi[k][j][i].z);
2319 if (nvert[k][j+1][i] < 0.1 && j < my-2) {
2320 libm_Flux -= ucor[k][j][i].
y;
2321 libm_area += sqrt(eta[k][j][i].x * eta[k][j][i].x +
2322 eta[k][j][i].y * eta[k][j][i].y +
2323 eta[k][j][i].z * eta[k][j][i].z);
2325 if (nvert[k+1][j][i] < 0.1 && k < mz-2) {
2326 libm_Flux -= ucor[k][j][i].
z;
2327 libm_area += sqrt(zet[k][j][i].x * zet[k][j][i].x +
2328 zet[k][j][i].y * zet[k][j][i].y +
2329 zet[k][j][i].z * zet[k][j][i].z);
2337 ierr = MPI_Allreduce(&libm_Flux, ibm_Flux,1,MPI_DOUBLE,MPI_SUM, PETSC_COMM_WORLD); CHKERRMPI(ierr);
2338 ierr = MPI_Allreduce(&libm_area, ibm_Area,1,MPI_DOUBLE,MPI_SUM, PETSC_COMM_WORLD); CHKERRMPI(ierr);
2344 DMDAVecRestoreArray(da, user->
lNvert, &nvert);
2345 DMDAVecRestoreArray(fda, user->
lCsi, &csi);
2346 DMDAVecRestoreArray(fda, user->
lEta, &eta);
2347 DMDAVecRestoreArray(fda, user->
lZet, &zet);
2348 DMDAVecRestoreArray(fda, user->
Ucont, &ucor);
2365 PetscErrorCode ierr;
2374 DM da = user->
da, fda = user->
fda;
2376 DMDALocalInfo info = user->
info;
2378 PetscInt xs = info.xs, xe = info.xs + info.xm;
2379 PetscInt ys = info.ys, ye = info.ys + info.ym;
2380 PetscInt zs = info.zs, ze = info.zs + info.zm;
2381 PetscInt mx = info.mx, my = info.my, mz = info.mz;
2383 PetscInt i, j, k,ibi;
2384 PetscInt lxs, lys, lzs, lxe, lye, lze;
2390 if (xs==0) lxs = xs+1;
2391 if (ys==0) lys = ys+1;
2392 if (zs==0) lzs = zs+1;
2394 if (xe==mx) lxe = xe-1;
2395 if (ye==my) lye = ye-1;
2396 if (ze==mz) lze = ze-1;
2398 PetscReal epsilon=1.e-8;
2399 PetscReal ***nvert, ibmval=1.9999;
2405 }***ucor, ***csi, ***eta, ***zet;
2408 PetscInt xend=mx-2 ,yend=my-2,zend=mz-2;
2414 DMDAVecGetArray(fda, user->
Ucont, &ucor);
2415 DMDAVecGetArray(fda, user->
lCsi, &csi);
2416 DMDAVecGetArray(fda, user->
lEta, &eta);
2417 DMDAVecGetArray(fda, user->
lZet, &zet);
2418 DMDAVecGetArray(da, user->
lNvert, &nvert);
2420 PetscReal libm_Flux, libm_area, libm_Flux_abs=0., ibm_Flux_abs;
2427 PetscReal *lIB_Flux = NULL, *lIB_area = NULL, *IB_Flux = NULL, *IB_Area = NULL;
2428 if (NumberOfBodies > 1) {
2430 lIB_Flux=(PetscReal *)calloc(NumberOfBodies,
sizeof(PetscReal));
2431 lIB_area=(PetscReal *)calloc(NumberOfBodies,
sizeof(PetscReal));
2432 IB_Flux=(PetscReal *)calloc(NumberOfBodies,
sizeof(PetscReal));
2433 IB_Area=(PetscReal *)calloc(NumberOfBodies,
sizeof(PetscReal));
2436 for (ibi=0; ibi<NumberOfBodies; ibi++) {
2451 for (k=lzs; k<lze; k++) {
2452 for (j=lys; j<lye; j++) {
2453 for (i=lxs; i<lxe; i++) {
2454 if (nvert[k][j][i] < 0.1) {
2455 if (nvert[k][j][i+1] > 0.1 && nvert[k][j][i+1] < ibmval && i < xend) {
2457 if (fabs(ucor[k][j][i].x)>epsilon) {
2458 libm_Flux += ucor[k][j][i].x;
2460 libm_Flux_abs += fabs(ucor[k][j][i].x)/sqrt(csi[k][j][i].x * csi[k][j][i].x +
2461 csi[k][j][i].y * csi[k][j][i].y +
2462 csi[k][j][i].z * csi[k][j][i].z);
2464 libm_Flux_abs += fabs(ucor[k][j][i].x);
2466 libm_area += sqrt(csi[k][j][i].x * csi[k][j][i].x +
2467 csi[k][j][i].y * csi[k][j][i].y +
2468 csi[k][j][i].z * csi[k][j][i].z);
2470 if (NumberOfBodies > 1) {
2472 ibi=(int)((nvert[k][j][i+1]-1.0)*1001);
2473 lIB_Flux[ibi] += ucor[k][j][i].x;
2474 lIB_area[ibi] += sqrt(csi[k][j][i].x * csi[k][j][i].x +
2475 csi[k][j][i].y * csi[k][j][i].y +
2476 csi[k][j][i].z * csi[k][j][i].z);
2482 if (nvert[k][j+1][i] > 0.1 && nvert[k][j+1][i] < ibmval && j < yend) {
2484 if (fabs(ucor[k][j][i].y)>epsilon) {
2485 libm_Flux += ucor[k][j][i].y;
2487 libm_Flux_abs += fabs(ucor[k][j][i].y)/sqrt(eta[k][j][i].x * eta[k][j][i].x +
2488 eta[k][j][i].y * eta[k][j][i].y +
2489 eta[k][j][i].z * eta[k][j][i].z);
2491 libm_Flux_abs += fabs(ucor[k][j][i].y);
2492 libm_area += sqrt(eta[k][j][i].x * eta[k][j][i].x +
2493 eta[k][j][i].y * eta[k][j][i].y +
2494 eta[k][j][i].z * eta[k][j][i].z);
2495 if (NumberOfBodies > 1) {
2497 ibi=(int)((nvert[k][j+1][i]-1.0)*1001);
2499 lIB_Flux[ibi] += ucor[k][j][i].y;
2500 lIB_area[ibi] += sqrt(eta[k][j][i].x * eta[k][j][i].x +
2501 eta[k][j][i].y * eta[k][j][i].y +
2502 eta[k][j][i].z * eta[k][j][i].z);
2507 if (nvert[k+1][j][i] > 0.1 && nvert[k+1][j][i] < ibmval && k < zend) {
2509 if (fabs(ucor[k][j][i].z)>epsilon) {
2510 libm_Flux += ucor[k][j][i].z;
2512 libm_Flux_abs += fabs(ucor[k][j][i].z)/sqrt(zet[k][j][i].x * zet[k][j][i].x +
2513 zet[k][j][i].y * zet[k][j][i].y +
2514 zet[k][j][i].z * zet[k][j][i].z);
2516 libm_Flux_abs += fabs(ucor[k][j][i].z);
2517 libm_area += sqrt(zet[k][j][i].x * zet[k][j][i].x +
2518 zet[k][j][i].y * zet[k][j][i].y +
2519 zet[k][j][i].z * zet[k][j][i].z);
2521 if (NumberOfBodies > 1) {
2523 ibi=(int)((nvert[k+1][j][i]-1.0)*1001);
2524 lIB_Flux[ibi] += ucor[k][j][i].z;
2525 lIB_area[ibi] += sqrt(zet[k][j][i].x * zet[k][j][i].x +
2526 zet[k][j][i].y * zet[k][j][i].y +
2527 zet[k][j][i].z * zet[k][j][i].z);
2534 if (nvert[k][j][i] > 0.1 && nvert[k][j][i] < ibmval) {
2536 if (nvert[k][j][i+1] < 0.1 && i < xend) {
2537 if (fabs(ucor[k][j][i].x)>epsilon) {
2538 libm_Flux -= ucor[k][j][i].x;
2540 libm_Flux_abs += fabs(ucor[k][j][i].x)/sqrt(csi[k][j][i].x * csi[k][j][i].x +
2541 csi[k][j][i].y * csi[k][j][i].y +
2542 csi[k][j][i].z * csi[k][j][i].z);
2544 libm_Flux_abs += fabs(ucor[k][j][i].x);
2545 libm_area += sqrt(csi[k][j][i].x * csi[k][j][i].x +
2546 csi[k][j][i].y * csi[k][j][i].y +
2547 csi[k][j][i].z * csi[k][j][i].z);
2548 if (NumberOfBodies > 1) {
2550 ibi=(int)((nvert[k][j][i]-1.0)*1001);
2551 lIB_Flux[ibi] -= ucor[k][j][i].x;
2552 lIB_area[ibi] += sqrt(csi[k][j][i].x * csi[k][j][i].x +
2553 csi[k][j][i].y * csi[k][j][i].y +
2554 csi[k][j][i].z * csi[k][j][i].z);
2560 if (nvert[k][j+1][i] < 0.1 && j < yend) {
2561 if (fabs(ucor[k][j][i].y)>epsilon) {
2562 libm_Flux -= ucor[k][j][i].y;
2564 libm_Flux_abs += fabs(ucor[k][j][i].y)/ sqrt(eta[k][j][i].x * eta[k][j][i].x +
2565 eta[k][j][i].y * eta[k][j][i].y +
2566 eta[k][j][i].z * eta[k][j][i].z);
2568 libm_Flux_abs += fabs(ucor[k][j][i].y);
2569 libm_area += sqrt(eta[k][j][i].x * eta[k][j][i].x +
2570 eta[k][j][i].y * eta[k][j][i].y +
2571 eta[k][j][i].z * eta[k][j][i].z);
2572 if (NumberOfBodies > 1) {
2574 ibi=(int)((nvert[k][j][i]-1.0)*1001);
2575 lIB_Flux[ibi] -= ucor[k][j][i].y;
2576 lIB_area[ibi] += sqrt(eta[k][j][i].x * eta[k][j][i].x +
2577 eta[k][j][i].y * eta[k][j][i].y +
2578 eta[k][j][i].z * eta[k][j][i].z);
2583 if (nvert[k+1][j][i] < 0.1 && k < zend) {
2584 if (fabs(ucor[k][j][i].z)>epsilon) {
2585 libm_Flux -= ucor[k][j][i].z;
2587 libm_Flux_abs += fabs(ucor[k][j][i].z)/sqrt(zet[k][j][i].x * zet[k][j][i].x +
2588 zet[k][j][i].y * zet[k][j][i].y +
2589 zet[k][j][i].z * zet[k][j][i].z);
2591 libm_Flux_abs += fabs(ucor[k][j][i].z);
2592 libm_area += sqrt(zet[k][j][i].x * zet[k][j][i].x +
2593 zet[k][j][i].y * zet[k][j][i].y +
2594 zet[k][j][i].z * zet[k][j][i].z);
2595 if (NumberOfBodies > 1) {
2597 ibi=(int)((nvert[k][j][i]-1.0)*1001);
2598 lIB_Flux[ibi] -= ucor[k][j][i].z;
2599 lIB_area[ibi] += sqrt(zet[k][j][i].x * zet[k][j][i].x +
2600 zet[k][j][i].y * zet[k][j][i].y +
2601 zet[k][j][i].z * zet[k][j][i].z);
2612 ierr = MPI_Allreduce(&libm_Flux, ibm_Flux,1,MPI_DOUBLE,MPI_SUM, PETSC_COMM_WORLD); CHKERRMPI(ierr);
2613 ierr = MPI_Allreduce(&libm_Flux_abs, &ibm_Flux_abs,1,MPI_DOUBLE,MPI_SUM, PETSC_COMM_WORLD); CHKERRMPI(ierr);
2614 ierr = MPI_Allreduce(&libm_area, ibm_Area,1,MPI_DOUBLE,MPI_SUM, PETSC_COMM_WORLD); CHKERRMPI(ierr);
2616 if (NumberOfBodies > 1) {
2617 ierr = MPI_Allreduce(lIB_Flux,IB_Flux,NumberOfBodies,MPI_DOUBLE,MPI_SUM,PETSC_COMM_WORLD); CHKERRMPI(ierr);
2618 ierr = MPI_Allreduce(lIB_area,IB_Area,NumberOfBodies,MPI_DOUBLE,MPI_SUM,PETSC_COMM_WORLD); CHKERRMPI(ierr);
2621 PetscReal correction;
2623 PetscReal *Correction = NULL;
2624 if (NumberOfBodies > 1) {
2625 Correction=(PetscReal *)calloc(NumberOfBodies,
sizeof(PetscReal));
2626 for (ibi=0; ibi<NumberOfBodies; ibi++) Correction[ibi]=0.0;
2629 if (*ibm_Area > 1.e-15) {
2631 correction = (*ibm_Flux + user->
FluxIntpSum)/ ibm_Flux_abs;
2633 correction = (*ibm_Flux + user->
FluxIntpSum) / *ibm_Area;
2635 correction = *ibm_Flux / *ibm_Area;
2636 if (NumberOfBodies > 1)
2637 for (ibi=0; ibi<NumberOfBodies; ibi++)
if (IB_Area[ibi]>1.e-15) Correction[ibi] = IB_Flux[ibi] / IB_Area[ibi];
2643 LOG_ALLOW(
GLOBAL,
LOG_INFO,
"IBM Uncorrected Flux: %g, Area: %g, Correction: %g\n", *ibm_Flux, *ibm_Area, correction);
2644 if (NumberOfBodies>1){
2645 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]);
2654 for (k=lzs; k<lze; k++) {
2655 for (j=lys; j<lye; j++) {
2656 for (i=lxs; i<lxe; i++) {
2657 if (nvert[k][j][i] < 0.1) {
2658 if (nvert[k][j][i+1] > 0.1 && nvert[k][j][i+1] <ibmval && i < xend) {
2659 if (fabs(ucor[k][j][i].x)>epsilon){
2661 ucor[k][j][i].x -=correction*fabs(ucor[k][j][i].x)/
2662 sqrt(csi[k][j][i].x * csi[k][j][i].x +
2663 csi[k][j][i].y * csi[k][j][i].y +
2664 csi[k][j][i].z * csi[k][j][i].z);
2666 ucor[k][j][i].x -=correction*fabs(ucor[k][j][i].x);
2667 else if (NumberOfBodies > 1) {
2668 ibi=(int)((nvert[k][j][i+1]-1.0)*1001);
2669 ucor[k][j][i].x -= sqrt(csi[k][j][i].x * csi[k][j][i].x +
2670 csi[k][j][i].y * csi[k][j][i].y +
2671 csi[k][j][i].z * csi[k][j][i].z) *
2675 ucor[k][j][i].x -= sqrt(csi[k][j][i].x * csi[k][j][i].x +
2676 csi[k][j][i].y * csi[k][j][i].y +
2677 csi[k][j][i].z * csi[k][j][i].z) *
2681 if (nvert[k][j+1][i] > 0.1 && nvert[k][j+1][i] < ibmval && j < yend) {
2682 if (fabs(ucor[k][j][i].y)>epsilon) {
2684 ucor[k][j][i].y -=correction*fabs(ucor[k][j][i].y)/
2685 sqrt(eta[k][j][i].x * eta[k][j][i].x +
2686 eta[k][j][i].y * eta[k][j][i].y +
2687 eta[k][j][i].z * eta[k][j][i].z);
2689 ucor[k][j][i].y -=correction*fabs(ucor[k][j][i].y);
2690 else if (NumberOfBodies > 1) {
2691 ibi=(int)((nvert[k][j+1][i]-1.0)*1001);
2692 ucor[k][j][i].y -= sqrt(eta[k][j][i].x * eta[k][j][i].x +
2693 eta[k][j][i].y * eta[k][j][i].y +
2694 eta[k][j][i].z * eta[k][j][i].z) *
2698 ucor[k][j][i].y -= sqrt(eta[k][j][i].x * eta[k][j][i].x +
2699 eta[k][j][i].y * eta[k][j][i].y +
2700 eta[k][j][i].z * eta[k][j][i].z) *
2704 if (nvert[k+1][j][i] > 0.1 && nvert[k+1][j][i] < ibmval && k < zend) {
2705 if (fabs(ucor[k][j][i].z)>epsilon) {
2707 ucor[k][j][i].z -= correction*fabs(ucor[k][j][i].z)/
2708 sqrt(zet[k][j][i].x * zet[k][j][i].x +
2709 zet[k][j][i].y * zet[k][j][i].y +
2710 zet[k][j][i].z * zet[k][j][i].z);
2712 ucor[k][j][i].z -= correction*fabs(ucor[k][j][i].z);
2713 else if (NumberOfBodies > 1) {
2714 ibi=(int)((nvert[k+1][j][i]-1.0)*1001);
2715 ucor[k][j][i].z -= sqrt(zet[k][j][i].x * zet[k][j][i].x +
2716 zet[k][j][i].y * zet[k][j][i].y +
2717 zet[k][j][i].z * zet[k][j][i].z) *
2721 ucor[k][j][i].z -= sqrt(zet[k][j][i].x * zet[k][j][i].x +
2722 zet[k][j][i].y * zet[k][j][i].y +
2723 zet[k][j][i].z * zet[k][j][i].z) *
2729 if (nvert[k][j][i] > 0.1 && nvert[k][j][i] < ibmval) {
2730 if (nvert[k][j][i+1] < 0.1 && i < xend) {
2731 if (fabs(ucor[k][j][i].x)>epsilon) {
2733 ucor[k][j][i].x += correction*fabs(ucor[k][j][i].x)/
2734 sqrt(csi[k][j][i].x * csi[k][j][i].x +
2735 csi[k][j][i].y * csi[k][j][i].y +
2736 csi[k][j][i].z * csi[k][j][i].z);
2738 ucor[k][j][i].x += correction*fabs(ucor[k][j][i].x);
2739 else if (NumberOfBodies > 1) {
2740 ibi=(int)((nvert[k][j][i]-1.0)*1001);
2741 ucor[k][j][i].x += sqrt(csi[k][j][i].x * csi[k][j][i].x +
2742 csi[k][j][i].y * csi[k][j][i].y +
2743 csi[k][j][i].z * csi[k][j][i].z) *
2747 ucor[k][j][i].x += sqrt(csi[k][j][i].x * csi[k][j][i].x +
2748 csi[k][j][i].y * csi[k][j][i].y +
2749 csi[k][j][i].z * csi[k][j][i].z) *
2753 if (nvert[k][j+1][i] < 0.1 && j < yend) {
2754 if (fabs(ucor[k][j][i].y)>epsilon) {
2756 ucor[k][j][i].y +=correction*fabs(ucor[k][j][i].y)/
2757 sqrt(eta[k][j][i].x * eta[k][j][i].x +
2758 eta[k][j][i].y * eta[k][j][i].y +
2759 eta[k][j][i].z * eta[k][j][i].z);
2761 ucor[k][j][i].y +=correction*fabs(ucor[k][j][i].y);
2762 else if (NumberOfBodies > 1) {
2763 ibi=(int)((nvert[k][j][i]-1.0)*1001);
2764 ucor[k][j][i].y += sqrt(eta[k][j][i].x * eta[k][j][i].x +
2765 eta[k][j][i].y * eta[k][j][i].y +
2766 eta[k][j][i].z * eta[k][j][i].z) *
2770 ucor[k][j][i].y += sqrt(eta[k][j][i].x * eta[k][j][i].x +
2771 eta[k][j][i].y * eta[k][j][i].y +
2772 eta[k][j][i].z * eta[k][j][i].z) *
2776 if (nvert[k+1][j][i] < 0.1 && k < zend) {
2777 if (fabs(ucor[k][j][i].z)>epsilon) {
2779 ucor[k][j][i].z += correction*fabs(ucor[k][j][i].z)/
2780 sqrt(zet[k][j][i].x * zet[k][j][i].x +
2781 zet[k][j][i].y * zet[k][j][i].y +
2782 zet[k][j][i].z * zet[k][j][i].z);
2784 ucor[k][j][i].z += correction*fabs(ucor[k][j][i].z);
2785 else if (NumberOfBodies > 1) {
2786 ibi=(int)((nvert[k][j][i]-1.0)*1001);
2787 ucor[k][j][i].z += sqrt(zet[k][j][i].x * zet[k][j][i].x +
2788 zet[k][j][i].y * zet[k][j][i].y +
2789 zet[k][j][i].z * zet[k][j][i].z) *
2793 ucor[k][j][i].z += sqrt(zet[k][j][i].x * zet[k][j][i].x +
2794 zet[k][j][i].y * zet[k][j][i].y +
2795 zet[k][j][i].z * zet[k][j][i].z) *
2813 for (k=lzs; k<lze; k++) {
2814 for (j=lys; j<lye; j++) {
2815 for (i=lxs; i<lxe; i++) {
2816 if (nvert[k][j][i] < 0.1) {
2817 if (nvert[k][j][i+1] > 0.1 && nvert[k][j][i+1] < ibmval && i < xend) {
2818 libm_Flux += ucor[k][j][i].x;
2819 libm_area += sqrt(csi[k][j][i].x * csi[k][j][i].x +
2820 csi[k][j][i].y * csi[k][j][i].y +
2821 csi[k][j][i].z * csi[k][j][i].z);
2824 if (nvert[k][j+1][i] > 0.1 && nvert[k][j+1][i] < ibmval && j < yend) {
2825 libm_Flux += ucor[k][j][i].y;
2826 libm_area += sqrt(eta[k][j][i].x * eta[k][j][i].x +
2827 eta[k][j][i].y * eta[k][j][i].y +
2828 eta[k][j][i].z * eta[k][j][i].z);
2830 if (nvert[k+1][j][i] > 0.1 && nvert[k+1][j][i] < ibmval && k < zend) {
2831 libm_Flux += ucor[k][j][i].z;
2832 libm_area += sqrt(zet[k][j][i].x * zet[k][j][i].x +
2833 zet[k][j][i].y * zet[k][j][i].y +
2834 zet[k][j][i].z * zet[k][j][i].z);
2838 if (nvert[k][j][i] > 0.1 && nvert[k][j][i] < ibmval) {
2839 if (nvert[k][j][i+1] < 0.1 && i < xend) {
2840 libm_Flux -= ucor[k][j][i].x;
2841 libm_area += sqrt(csi[k][j][i].x * csi[k][j][i].x +
2842 csi[k][j][i].y * csi[k][j][i].y +
2843 csi[k][j][i].z * csi[k][j][i].z);
2846 if (nvert[k][j+1][i] < 0.1 && j < yend) {
2847 libm_Flux -= ucor[k][j][i].y;
2848 libm_area += sqrt(eta[k][j][i].x * eta[k][j][i].x +
2849 eta[k][j][i].y * eta[k][j][i].y +
2850 eta[k][j][i].z * eta[k][j][i].z);
2852 if (nvert[k+1][j][i] < 0.1 && k < zend) {
2853 libm_Flux -= ucor[k][j][i].z;
2854 libm_area += sqrt(zet[k][j][i].x * zet[k][j][i].x +
2855 zet[k][j][i].y * zet[k][j][i].y +
2856 zet[k][j][i].z * zet[k][j][i].z);
2864 ierr = MPI_Allreduce(&libm_Flux, ibm_Flux,1,MPI_DOUBLE,MPI_SUM, PETSC_COMM_WORLD); CHKERRMPI(ierr);
2865 ierr = MPI_Allreduce(&libm_area, ibm_Area,1,MPI_DOUBLE,MPI_SUM, PETSC_COMM_WORLD); CHKERRMPI(ierr);
2875 for (k=lzs; k<lze; k++) {
2876 for (j=lys; j<lye; j++) {
2878 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;
2889 for (k=lzs; k<lze; k++) {
2890 for (i=lxs; i<lxe; i++) {
2892 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;
2902 for (j=lys; j<lye; j++) {
2903 for (i=lxs; i<lxe; i++) {
2905 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;
2913 DMDAVecRestoreArray(da, user->
lNvert, &nvert);
2914 DMDAVecRestoreArray(fda, user->
lCsi, &csi);
2915 DMDAVecRestoreArray(fda, user->
lEta, &eta);
2916 DMDAVecRestoreArray(fda, user->
lZet, &zet);
2917 DMDAVecRestoreArray(fda, user->
Ucont, &ucor);
2922 if (NumberOfBodies > 1) {
3155 const PetscInt immersed = simCtx->
immersed;
3156 const PetscInt MHV = simCtx->
MHV;
3157 const PetscInt LV = simCtx->
LV;
3158 PetscMPIInt rank = simCtx->
rank;
3161 PetscErrorCode ierr;
3168 PetscFunctionBeginUser;
3172 for (bi = 0; bi < block_number; bi++) {
3179 for (l = usermg->
mglevels - 1; l > 0; l--) {
3185 user = mgctx[l].
user;
3193 user = mgctx[l].
user;
3199 ierr = VecDuplicate(user[bi].P, &user[bi].B); CHKERRQ(ierr);
3201 PetscReal ibm_Flux, ibm_Area;
3202 PetscInt flg = immersed - 1;
3205 VolumeFlux(&user[bi], &ibm_Flux, &ibm_Area, flg);
3207 flg = ((MHV > 1 || LV) && bi == 0) ? 1 : 0;
3215 for (l = usermg->
mglevels - 1; l >= 0; l--) {
3216 user = mgctx[l].
user;
3224 ierr = KSPCreate(PETSC_COMM_WORLD, &mgksp); CHKERRQ(ierr);
3225 ierr = KSPAppendOptionsPrefix(mgksp,
"ps_"); CHKERRQ(ierr);
3229 char filen[PETSC_MAX_PATH_LEN + 128];
3232 ierr = PetscNew(&monctx); CHKERRQ(ierr);
3240 ierr = PetscSNPrintf(filen,
sizeof(filen),
"%s/Poisson_Solver_Convergence_History_Block_%d.log", simCtx->
log_dir, bi); CHKERRQ(ierr);
3251 PetscFPrintf(PETSC_COMM_SELF, monctx->
file_handle,
3252 "# Continuation from step %" PetscInt_FMT
"\n", simCtx->
StartStep);
3254 PetscFPrintf(PETSC_COMM_SELF, monctx->
file_handle,
"--- Convergence for Timestep %d, Block %d ---\n", (
int)simCtx->
step, bi);
3256 SETERRQ(PETSC_COMM_SELF, PETSC_ERR_FILE_OPEN,
"Could not open KSP monitor log file: %s", filen);
3265 ierr = KSPGetPC(mgksp, &mgpc); CHKERRQ(ierr);
3266 ierr = PCSetType(mgpc, PCMG); CHKERRQ(ierr);
3268 ierr = PCMGSetLevels(mgpc, usermg->
mglevels, PETSC_NULLPTR); CHKERRQ(ierr);
3269 ierr = PCMGSetCycleType(mgpc, PC_MG_CYCLE_V); CHKERRQ(ierr);
3270 ierr = PCMGSetType(mgpc, PC_MG_MULTIPLICATIVE); CHKERRQ(ierr);
3273 "PETSc PCMG exposes one smoother count in this build; using max(pre_sweeps=%d, post_sweeps=%d).\n",
3277 ierr = PCMGSetNumberSmooth(mgpc, mg_smooths); CHKERRQ(ierr);
3280 for (l = usermg->
mglevels - 1; l > 0; l--) {
3289 coarse_user_ctx->
da_f = &(fine_user_ctx->
da);
3290 coarse_user_ctx->
user_f = fine_user_ctx;
3293 fine_user_ctx->
da_c = &(coarse_user_ctx->
da);
3294 fine_user_ctx->
user_c = coarse_user_ctx;
3298 PetscInt m_c = (coarse_user_ctx->
info.xm * coarse_user_ctx->
info.ym * coarse_user_ctx->
info.zm);
3299 PetscInt m_f = (fine_user_ctx->
info.xm * fine_user_ctx->
info.ym * fine_user_ctx->
info.zm);
3300 PetscInt M_c = (coarse_user_ctx->
info.mx * coarse_user_ctx->
info.my * coarse_user_ctx->
info.mz);
3301 PetscInt M_f = (fine_user_ctx->
info.mx * fine_user_ctx->
info.my * fine_user_ctx->
info.mz);
3306 ierr = MatCreateShell(PETSC_COMM_WORLD, m_c, m_f, M_c, M_f, (
void*)coarse_user_ctx, &fine_user_ctx->
MR); CHKERRQ(ierr);
3309 ierr = MatCreateShell(PETSC_COMM_WORLD, m_f, m_c, M_f, M_c, (
void*)fine_user_ctx, &fine_user_ctx->
MP); CHKERRQ(ierr);
3313 ierr = MatShellSetOperation(fine_user_ctx->
MP, MATOP_MULT, (
void(*)(
void))
MyInterpolation); CHKERRQ(ierr);
3316 ierr = PCMGSetRestriction(mgpc, l, fine_user_ctx->
MR); CHKERRQ(ierr);
3317 ierr = PCMGSetInterpolation(mgpc, l, fine_user_ctx->
MP); CHKERRQ(ierr);
3322 for (l = usermg->
mglevels - 1; l >= 0; l--) {
3323 user = mgctx[l].
user;
3325 ierr = PCMGGetSmoother(mgpc, l, &subksp); CHKERRQ(ierr);
3327 ierr = PCMGGetCoarseSolve(mgpc, &subksp); CHKERRQ(ierr);
3328 ierr = KSPSetTolerances(subksp, 1.e-8, PETSC_DEFAULT, PETSC_DEFAULT, 40); CHKERRQ(ierr);
3331 ierr = KSPSetOperators(subksp, user[bi].A, user[bi].A); CHKERRQ(ierr);
3332 ierr = KSPGetPC(subksp, &subpc); CHKERRQ(ierr);
3333 ierr = PCSetType(subpc, PCBJACOBI); CHKERRQ(ierr);
3334 ierr = KSPSetFromOptions(subksp); CHKERRQ(ierr);
3337 PetscBool is_bjacobi = PETSC_FALSE;
3338 ierr = PCGetType(subpc, &subpc_type); CHKERRQ(ierr);
3340 ierr = PetscStrcmp(subpc_type, PCBJACOBI, &is_bjacobi); CHKERRQ(ierr);
3348 ierr = KSPSetUp(subksp); CHKERRQ(ierr);
3349 ierr = PCBJacobiGetSubKSP(subpc, &nlocal, NULL, &subsubksp); CHKERRQ(ierr);
3351 for (PetscInt abi = 0; abi < nlocal; abi++) {
3352 ierr = KSPGetPC(subsubksp[abi], &subsubpc); CHKERRQ(ierr);
3354 ierr = PCFactorSetShiftAmount(subsubpc, 1.e-10); CHKERRQ(ierr);
3358 ierr = MatNullSpaceCreate(PETSC_COMM_WORLD, PETSC_TRUE, 0, PETSC_NULLPTR, &user[bi].nullsp); CHKERRQ(ierr);
3360 ierr = MatSetNullSpace(user[bi].A, user[bi].nullsp); CHKERRQ(ierr);
3362 ierr = PCMGSetResidual(mgpc, l, PCMGResidualDefault, user[bi].A); CHKERRQ(ierr);
3363 ierr = KSPSetUp(subksp); CHKERRQ(ierr);
3365 if (l < usermg->mglevels - 1) {
3366 ierr = MatCreateVecs(user[bi].A, &user[bi].R, PETSC_NULLPTR); CHKERRQ(ierr);
3367 ierr = PCMGSetRhs(mgpc, l, user[bi].R); CHKERRQ(ierr);
3373 user = mgctx[l].
user;
3376 ierr = KSPSetOperators(mgksp, user[bi].A, user[bi].A); CHKERRQ(ierr);
3377 ierr = MatSetNullSpace(user[bi].A, user[bi].nullsp); CHKERRQ(ierr);
3378 ierr = KSPSetFromOptions(mgksp); CHKERRQ(ierr);
3379 ierr = KSPSetUp(mgksp); CHKERRQ(ierr);
3380 ierr = KSPSolve(mgksp, user[bi].B, user[bi].Phi); CHKERRQ(ierr);
3383 for (l = usermg->
mglevels - 1; l >= 0; l--) {
3384 user = mgctx[l].
user;
3385 MatNullSpaceDestroy(&user[bi].nullsp);
3386 MatDestroy(&user[bi].A);
3389 MatDestroy(&user[bi].MR);
3390 MatDestroy(&user[bi].MP);
3392 if (l < usermg->mglevels - 1) {
3393 VecDestroy(&user[bi].R);
3404 PetscFunctionReturn(0);