121 PetscFunctionBeginUser;
124 char drivenDirection =
' ';
125 for (
int i = 0; i < 6; i++) {
140 if (drivenDirection ==
' ') {
141 PetscFunctionReturn(0);
144 LOG_ALLOW(
LOCAL,
LOG_DEBUG,
"Rank %d, Block %d: Starting channel flux profile correction in '%c' direction...\n",
145 simCtx->
rank, user->
_this, drivenDirection);
148 DMDALocalInfo info = user->
info;
150 PetscInt mx = info.mx, my = info.my, mz = info.mz;
151 PetscInt lxs = (info.xs == 0) ? 1 : info.xs;
152 PetscInt lys = (info.ys == 0) ? 1 : info.ys;
153 PetscInt lzs = (info.zs == 0) ? 1 : info.zs;
154 PetscInt lxe = (info.xs + info.xm == mx) ? mx - 1 : info.xs + info.xm;
155 PetscInt lye = (info.ys + info.ym == my) ? my - 1 : info.ys + info.ym;
156 PetscInt lze = (info.zs + info.zm == mz) ? mz - 1 : info.zs + info.zm;
158 Cmpnts ***ucont, ***csi, ***eta, ***zet;
160 ierr = DMDAVecGetArray(user->
fda, user->
lUcont, &ucont); CHKERRQ(ierr);
161 ierr = DMDAVecGetArrayRead(user->
fda, user->
lCsi, (
const Cmpnts***)&csi); CHKERRQ(ierr);
162 ierr = DMDAVecGetArrayRead(user->
fda, user->
lEta, (
const Cmpnts***)&eta); CHKERRQ(ierr);
163 ierr = DMDAVecGetArrayRead(user->
fda, user->
lZet, (
const Cmpnts***)&zet); CHKERRQ(ierr);
164 ierr = DMDAVecGetArrayRead(user->
da, user->
lNvert, (
const PetscReal***)&nvert); CHKERRQ(ierr);
167 PetscInt n_planes = 0;
168 switch (drivenDirection) {
169 case 'X': n_planes = mx - 1;
break;
170 case 'Y': n_planes = my - 1;
break;
171 case 'Z': n_planes = mz - 1;
break;
174 PetscReal *localFluxProfile, *globalFluxProfile, *correctionProfile;
175 ierr = PetscMalloc1(n_planes, &localFluxProfile); CHKERRQ(ierr);
176 ierr = PetscMalloc1(n_planes, &globalFluxProfile); CHKERRQ(ierr);
177 ierr = PetscMalloc1(n_planes, &correctionProfile); CHKERRQ(ierr);
178 ierr = PetscMemzero(localFluxProfile, n_planes *
sizeof(PetscReal)); CHKERRQ(ierr);
181 PetscReal localArea = 0.0, globalArea = 0.0;
183 switch (drivenDirection) {
187 for (k = lzs; k < lze; k++)
for (j = lys; j < lye; j++) {
188 if (nvert[k][j][i + 1] < 0.1)
189 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);
192 for (i = info.xs; i < lxe; i++) {
193 for (k = lzs; k < lze; k++)
for (j = lys; j < lye; j++) {
194 if (nvert[k][j][i + 1] < 0.1) localFluxProfile[i] += ucont[k][j][i].
x;
201 for (k = lzs; k < lze; k++)
for (i = lxs; i < lxe; i++) {
202 if (nvert[k][j + 1][i] < 0.1)
203 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);
206 for (j = info.ys; j < lye; j++) {
207 for (k = lzs; k < lze; k++)
for (i = lxs; i < lxe; i++) {
208 if (nvert[k][j + 1][i] < 0.1) localFluxProfile[j] += ucont[k][j][i].
y;
215 for (j = lys; j < lye; j++)
for (i = lxs; i < lxe; i++) {
216 if (nvert[k + 1][j][i] < 0.1)
217 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);
220 for (k = info.zs; k < lze; k++) {
221 for (j = lys; j < lye; j++)
for (i = lxs; i < lxe; i++) {
222 if (nvert[k + 1][j][i] < 0.1) localFluxProfile[k] += ucont[k][j][i].
z;
228 ierr = MPI_Allreduce(&localArea, &globalArea, 1, MPI_DOUBLE, MPI_SUM, PETSC_COMM_WORLD); CHKERRQ(ierr);
229 ierr = MPI_Allreduce(localFluxProfile, globalFluxProfile, n_planes, MPI_DOUBLE, MPI_SUM, PETSC_COMM_WORLD); CHKERRQ(ierr);
233 if (globalArea > 1.0e-12) {
234 for (i = 0; i < n_planes; i++) {
235 correctionProfile[i] = (targetFlux - globalFluxProfile[i]) / globalArea;
238 ierr = PetscMemzero(correctionProfile, n_planes *
sizeof(PetscReal)); CHKERRQ(ierr);
243 LOG_ALLOW(
GLOBAL,
LOG_INFO,
" - Measured Flux at plane 0: %.6e (Correction Velocity: %.6e)\n", globalFluxProfile[0], correctionProfile[0]);
244 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]);
289 ierr = PetscFree(localFluxProfile); CHKERRQ(ierr);
290 ierr = PetscFree(globalFluxProfile); CHKERRQ(ierr);
291 ierr = PetscFree(correctionProfile); CHKERRQ(ierr);
293 ierr = DMDAVecRestoreArray(user->
fda, user->
lUcont, &ucont); CHKERRQ(ierr);
294 ierr = DMDAVecRestoreArrayRead(user->
fda, user->
lCsi, (
const Cmpnts***)&csi); CHKERRQ(ierr);
295 ierr = DMDAVecRestoreArrayRead(user->
fda, user->
lEta, (
const Cmpnts***)&eta); CHKERRQ(ierr);
296 ierr = DMDAVecRestoreArrayRead(user->
fda, user->
lZet, (
const Cmpnts***)&zet); CHKERRQ(ierr);
297 ierr = DMDAVecRestoreArrayRead(user->
da, user->
lNvert, (
const PetscReal***)&nvert); CHKERRQ(ierr);
302 PetscFunctionReturn(0);
370 PetscFunctionBeginUser;
380 DM da = user->
da, fda = user->
fda;
381 DMDALocalInfo info = user->
info;
384 PetscInt mx = info.mx, my = info.my, mz = info.mz;
385 PetscInt xs = info.xs, xe = info.xs + info.xm;
386 PetscInt ys = info.ys, ye = info.ys + info.ym;
387 PetscInt zs = info.zs, ze = info.zs + info.zm;
390 PetscInt lxs = (xs == 0) ? xs + 1 : xs;
391 PetscInt lxe = (xe == mx) ? xe - 1 : xe;
392 PetscInt lys = (ys == 0) ? ys + 1 : ys;
393 PetscInt lye = (ye == my) ? ye - 1 : ye;
394 PetscInt lzs = (zs == 0) ? zs + 1 : zs;
395 PetscInt lze = (ze == mz) ? ze - 1 : ze;
398 Cmpnts ***icsi, ***ieta, ***izet, ***jcsi, ***jeta, ***jzet, ***kcsi, ***keta, ***kzet;
399 PetscReal ***iaj, ***jaj, ***kaj, ***p, ***nvert;
401 DMDAVecGetArray(fda, user->
lICsi, &icsi); DMDAVecGetArray(fda, user->
lIEta, &ieta); DMDAVecGetArray(fda, user->
lIZet, &izet);
402 DMDAVecGetArray(fda, user->
lJCsi, &jcsi); DMDAVecGetArray(fda, user->
lJEta, &jeta); DMDAVecGetArray(fda, user->
lJZet, &jzet);
403 DMDAVecGetArray(fda, user->
lKCsi, &kcsi); DMDAVecGetArray(fda, user->
lKEta, &keta); DMDAVecGetArray(fda, user->
lKZet, &kzet);
404 DMDAVecGetArray(da, user->
lIAj, &iaj); DMDAVecGetArray(da, user->
lJAj, &jaj); DMDAVecGetArray(da, user->
lKAj, &kaj);
405 DMDAVecGetArray(da, user->
lNvert, &nvert);
406 DMDAVecGetArray(da, user->
lPhi, &p);
408 DMDAVecGetArray(fda, user->
Ucont, &ucont);
411 const PetscReal IBM_FLUID_THRESHOLD = 0.1;
422 for (PetscInt k = lzs; k < lze; k++) {
423 for (PetscInt j = lys; j < lye; j++) {
424 for (PetscInt i = lxs; i < lxe; i++) {
430 if (!(nvert[k][j][i] > IBM_FLUID_THRESHOLD || nvert[k][j][i + 1] > IBM_FLUID_THRESHOLD)) {
433 PetscReal dpdc = p[k][j][i + 1] - p[k][j][i];
434 PetscReal dpde = 0.0, dpdz = 0.0;
439 dpde = (p[k][j][i] + p[k][j][i+1] -
440 p[k][j-1][i] - p[k][j-1][i+1]) * 0.5;
445 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; }
449 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; }
453 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; }
456 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; }
464 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; }
468 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; }
472 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; }
475 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; }
481 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
482 + icsi[k][j][i].
z * icsi[k][j][i].
z) * iaj[k][j][i] +
483 dpde * (ieta[k][j][i].x * icsi[k][j][i].x + ieta[k][j][i].y * icsi[k][j][i].y
484 + ieta[k][j][i].z * icsi[k][j][i].z) * iaj[k][j][i] +
485 dpdz * (izet[k][j][i].
x * icsi[k][j][i].
x + izet[k][j][i].
y * icsi[k][j][i].
y
486 + izet[k][j][i].
z * icsi[k][j][i].
z) * iaj[k][j][i]);
488 PetscReal correction = grad_p_x*scale;
490 ucont[k][j][i].
x -= correction;
498 if (!(nvert[k][j][i] > IBM_FLUID_THRESHOLD || nvert[k][j + 1][i] > IBM_FLUID_THRESHOLD)) {
499 PetscReal dpdc = 0.0, dpde = 0.0, dpdz = 0.0;
500 dpde = p[k][j + 1][i] - p[k][j][i];
506 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; }
508 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; }
510 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; }
511 }
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; }
517 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; }
519 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; }
521 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; }
522 }
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; }
524 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] +
525 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] +
526 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]);
528 PetscReal correction = grad_p_y*scale;
530 ucont[k][j][i].
y -= correction;
537 if (!(nvert[k][j][i] > IBM_FLUID_THRESHOLD || nvert[k + 1][j][i] > IBM_FLUID_THRESHOLD)) {
538 PetscReal dpdc = 0.0, dpde = 0.0, dpdz = 0.0;
539 dpdz = p[k + 1][j][i] - p[k][j][i];
545 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; }
547 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; }
549 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; }
550 }
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; }
556 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; }
558 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; }
560 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; }
561 }
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; }
563 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] +
564 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] +
565 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]);
569 "[k=%d, j=%d, i=%d] ---- Neighbor Pressures ----\n"
570 " Central Z-Neighbors: p[k+1][j][i] = %g | p[k][j][i] = %g\n"
571 " 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"
572 " 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",
574 p[k + 1][j][i], p[k][j][i],
575 p[k][j - 1][i], p[k + 1][j - 1][i], p[k][j + 1][i], p[k + 1][j + 1][i],
576 p[k][j][i - 1], p[k + 1][j][i - 1], p[k][j][i + 1], p[k + 1][j][i + 1]);
580 PetscReal correction = grad_p_z*scale;
582 ucont[k][j][i].
z -= correction;
593 for (PetscInt k=lzs; k<lze; k++) {
594 for (PetscInt j=lys; j<lye; j++) {
597 PetscReal dpdc = p[k][j][i+1] - p[k][j][i];
604 dpde = (p[k][j ][i] + p[k][j ][i+1] -
605 p[k][j-1][i] - p[k][j-1][i+1]) * 0.5;
609 if (nvert[k][j-1][i] + nvert[k][j-1][i+1] < 0.1) {
610 dpde = (p[k][j ][i] + p[k][j ][i+1] -
611 p[k][j-1][i] - p[k][j-1][i+1]) * 0.5;
615 if (nvert[k][j+1][i] + nvert[k][j+1][i+1] < 0.1) {
616 dpde = (p[k][j+1][i] + p[k][j+1][i+1] -
617 p[k][j ][i] - p[k][j ][i+1]) * 0.5;
621 if (nvert[k][j+1][i] + nvert[k][j+1][i+1] < 0.1) {
622 dpde = (p[k][j+1][i] + p[k][j+1][i+1] -
623 p[k][j ][i] - p[k][j ][i+1]) * 0.5;
627 dpde = (p[k][j+1][i] + p[k][j+1][i+1] -
628 p[k][j-1][i] - p[k][j-1][i+1]) * 0.25;
633 dpdz = (p[k ][j][i] + p[k ][j][i+1] -
634 p[k-1][j][i] - p[k-1][j][i+1]) * 0.5;
638 if (nvert[k-1][j][i] + nvert[k-1][j][i+1] < 0.1) {
639 dpdz = (p[k ][j][i] + p[k ][j][i+1] -
640 p[k-1][j][i] - p[k-1][j][i+1]) * 0.5;
644 if (nvert[k+1][j][i] + nvert[k+1][j][i+1] < 0.1) {
645 dpdz = (p[k+1][j][i] + p[k+1][j][i+1] -
646 p[k ][j][i] - p[k ][j][i+1]) * 0.5;
650 if (nvert[k+1][j][i] + nvert[k+1][j][i+1] < 0.1) {
651 dpdz = (p[k+1][j][i] + p[k+1][j][i+1] -
652 p[k ][j][i] - p[k ][j][i+1]) * 0.5;
656 dpdz = (p[k+1][j][i] + p[k+1][j][i+1] -
657 p[k-1][j][i] - p[k-1][j][i+1]) * 0.25;
662 if (!(nvert[k][j][i] + nvert[k][j][i+1])) {
664 (dpdc * (icsi[k][j][i].
x * icsi[k][j][i].
x +
665 icsi[k][j][i].
y * icsi[k][j][i].
y +
666 icsi[k][j][i].
z * icsi[k][j][i].
z) * iaj[k][j][i] +
667 dpde * (ieta[k][j][i].x * icsi[k][j][i].x +
668 ieta[k][j][i].y * icsi[k][j][i].y +
669 ieta[k][j][i].z * icsi[k][j][i].z) * iaj[k][j][i] +
670 dpdz * (izet[k][j][i].
x * icsi[k][j][i].
x +
671 izet[k][j][i].
y * icsi[k][j][i].
y +
672 izet[k][j][i].
z * icsi[k][j][i].
z) * iaj[k][j][i])
681 for (PetscInt k=lzs; k<lze; k++) {
682 for (PetscInt i=lxs; i<lxe; i++) {
689 dpdc = (p[k][j][i ] + p[k][j+1][i ] -
690 p[k][j][i-1] - p[k][j+1][i-1]) * 0.5;
694 if (nvert[k][j][i-1] + nvert[k][j+1][i-1] < 0.1) {
695 dpdc = (p[k][j][i ] + p[k][j+1][i ] -
696 p[k][j][i-1] - p[k][j+1][i-1]) * 0.5;
700 if (nvert[k][j][i+1] + nvert[k][j+1][i+1] < 0.1) {
701 dpdc = (p[k][j][i+1] + p[k][j+1][i+1] -
702 p[k][j][i ] - p[k][j+1][i ]) * 0.5;
706 if (nvert[k][j][i+1] + nvert[k][j+1][i+1] < 0.1) {
707 dpdc = (p[k][j][i+1] + p[k][j+1][i+1] -
708 p[k][j][i ] - p[k][j+1][i ]) * 0.5;
712 dpdc = (p[k][j][i+1] + p[k][j+1][i+1] -
713 p[k][j][i-1] - p[k][j+1][i-1]) * 0.25;
716 PetscReal dpde = p[k][j+1][i] - p[k][j][i];
720 dpdz = (p[k ][j][i] + p[k ][j+1][i] -
721 p[k-1][j][i] - p[k-1][j+1][i]) * 0.5;
725 if (nvert[k-1][j][i] + nvert[k-1][j+1][i] < 0.1) {
726 dpdz = (p[k ][j][i] + p[k ][j+1][i] -
727 p[k-1][j][i] - p[k-1][j+1][i]) * 0.5;
731 if (nvert[k+1][j][i] + nvert[k+1][j+1][i] < 0.1) {
732 dpdz = (p[k+1][j][i] + p[k+1][j+1][i] -
733 p[k ][j][i] - p[k ][j+1][i]) * 0.5;
737 if (nvert[k+1][j][i] + nvert[k+1][j+1][i] < 0.1) {
738 dpdz = (p[k+1][j][i] + p[k+1][j+1][i] -
739 p[k ][j][i] - p[k ][j+1][i]) * 0.5;
743 dpdz = (p[k+1][j][i] + p[k+1][j+1][i] -
744 p[k-1][j][i] - p[k-1][j+1][i]) * 0.25;
747 if (!(nvert[k][j][i] + nvert[k][j+1][i])) {
749 (dpdc * (jcsi[k][j][i].
x * jeta[k][j][i].
x +
750 jcsi[k][j][i].
y * jeta[k][j][i].
y +
751 jcsi[k][j][i].
z * jeta[k][j][i].
z) * jaj[k][j][i] +
752 dpde * (jeta[k][j][i].x * jeta[k][j][i].x +
753 jeta[k][j][i].y * jeta[k][j][i].y +
754 jeta[k][j][i].z * jeta[k][j][i].z) * jaj[k][j][i] +
755 dpdz * (jzet[k][j][i].
x * jeta[k][j][i].
x +
756 jzet[k][j][i].
y * jeta[k][j][i].
y +
757 jzet[k][j][i].
z * jeta[k][j][i].
z) * jaj[k][j][i])
765 for (PetscInt j=lys; j<lye; j++) {
766 for (PetscInt i=lxs; i<lxe; i++) {
774 dpdc = (p[k][j][i ] + p[k+1][j][i ] -
775 p[k][j][i-1] - p[k+1][j][i-1]) * 0.5;
779 if (nvert[k][j][i-1] + nvert[k+1][j][i-1] < 0.1) {
780 dpdc = (p[k][j][i ] + p[k+1][j][i ] -
781 p[k][j][i-1] - p[k+1][j][i-1]) * 0.5;
785 if (nvert[k][j][i+1] + nvert[k+1][j][i+1] < 0.1) {
786 dpdc = (p[k][j][i+1] + p[k+1][j][i+1] -
787 p[k][j][i ] - p[k+1][j][i ]) * 0.5;
791 if (nvert[k][j][i+1] + nvert[k+1][j][i+1] < 0.1) {
792 dpdc = (p[k][j][i+1] + p[k+1][j][i+1] -
793 p[k][j][i ] - p[k+1][j][i ]) * 0.5;
797 dpdc = (p[k][j][i+1] + p[k+1][j][i+1] -
798 p[k][j][i-1] - p[k+1][j][i-1]) * 0.25;
803 dpde = (p[k][j ][i] + p[k+1][j ][i] -
804 p[k][j-1][i] - p[k+1][j-1][i]) * 0.5;
808 if (nvert[k][j-1][i] + nvert[k+1][j-1][i] < 0.1) {
809 dpde = (p[k][j ][i] + p[k+1][j ][i] -
810 p[k][j-1][i] - p[k+1][j-1][i]) * 0.5;
814 if (nvert[k][j+1][i] + nvert[k+1][j+1][i] < 0.1) {
815 dpde = (p[k][j+1][i] + p[k+1][j+1][i] -
816 p[k][j ][i] - p[k+1][j ][i]) * 0.5;
820 if (nvert[k][j+1][i] + nvert[k+1][j+1][i] < 0.1) {
821 dpde = (p[k][j+1][i] + p[k+1][j+1][i] -
822 p[k][j ][i] - p[k+1][j ][i]) * 0.5;
826 dpde = (p[k][j+1][i] + p[k+1][j+1][i] -
827 p[k][j-1][i] - p[k+1][j-1][i]) * 0.25;
830 PetscReal dpdz = p[k+1][j][i] - p[k][j][i];
832 if (!(nvert[k][j][i] + nvert[k+1][j][i])) {
835 (dpdc * (kcsi[k][j][i].
x * kzet[k][j][i].
x +
836 kcsi[k][j][i].
y * kzet[k][j][i].
y +
837 kcsi[k][j][i].
z * kzet[k][j][i].
z) * kaj[k][j][i] +
838 dpde * (keta[k][j][i].x * kzet[k][j][i].x +
839 keta[k][j][i].y * kzet[k][j][i].y +
840 keta[k][j][i].z * kzet[k][j][i].z) * kaj[k][j][i] +
841 dpdz * (kzet[k][j][i].
x * kzet[k][j][i].
x +
842 kzet[k][j][i].
y * kzet[k][j][i].
y +
843 kzet[k][j][i].
z * kzet[k][j][i].
z) * kaj[k][j][i])
859 DMDAVecRestoreArray(fda, user->
Ucont, &ucont);
862 DMDAVecRestoreArray(fda, user->
lICsi, &icsi); DMDAVecRestoreArray(fda, user->
lIEta, &ieta); DMDAVecRestoreArray(fda, user->
lIZet, &izet);
863 DMDAVecRestoreArray(fda, user->
lJCsi, &jcsi); DMDAVecRestoreArray(fda, user->
lJEta, &jeta); DMDAVecRestoreArray(fda, user->
lJZet, &jzet);
864 DMDAVecRestoreArray(fda, user->
lKCsi, &kcsi); DMDAVecRestoreArray(fda, user->
lKEta, &keta); DMDAVecRestoreArray(fda, user->
lKZet, &kzet);
865 DMDAVecRestoreArray(da, user->
lIAj, &iaj); DMDAVecRestoreArray(da, user->
lJAj, &jaj); DMDAVecRestoreArray(da, user->
lKAj, &kaj);
866 DMDAVecRestoreArray(da, user->
lP, &p);
867 DMDAVecRestoreArray(da, user->
lNvert, &nvert);
871 DMGlobalToLocalBegin(fda, user->
Ucont, INSERT_VALUES, user->
lUcont);
872 DMGlobalToLocalEnd(fda, user->
Ucont, INSERT_VALUES, user->
lUcont);
883 PetscFunctionReturn(0);
1622 PetscFunctionBeginUser;
1625 PetscErrorCode ierr;
1633 DM da = user->
da, fda = user->
fda;
1634 DMDALocalInfo info = user->
info;
1635 PetscInt IM = user->
IM, JM = user->
JM, KM = user->
KM;
1639 PetscInt mx = info.mx, my = info.my, mz = info.mz;
1640 PetscInt xs = info.xs, xe = info.xs + info.xm;
1641 PetscInt ys = info.ys, ye = info.ys + info.ym;
1642 PetscInt zs = info.zs, ze = info.zs + info.zm;
1643 PetscInt gxs = info.gxs, gxe = gxs + info.gxm;
1644 PetscInt gys = info.gys, gye = gys + info.gym;
1645 PetscInt gzs = info.gzs, gze = gzs + info.gzm;
1648 const PetscReal IBM_FLUID_THRESHOLD = 0.1;
1653 PetscInt N = mx * my * mz;
1655 VecGetLocalSize(user->
Phi, &M);
1657 MatCreateAIJ(PETSC_COMM_WORLD, M, M, N, N, 19, PETSC_NULL, 19, PETSC_NULL, &(user->
A));
1662 MatZeroEntries(user->
A);
1665 Cmpnts ***csi, ***eta, ***zet, ***icsi, ***ieta, ***izet, ***jcsi, ***jeta, ***jzet, ***kcsi, ***keta, ***kzet;
1666 PetscReal ***aj, ***iaj, ***jaj, ***kaj, ***nvert;
1667 DMDAVecGetArray(fda, user->
lCsi, &csi); DMDAVecGetArray(fda, user->
lEta, &eta); DMDAVecGetArray(fda, user->
lZet, &zet);
1668 DMDAVecGetArray(fda, user->
lICsi, &icsi); DMDAVecGetArray(fda, user->
lIEta, &ieta); DMDAVecGetArray(fda, user->
lIZet, &izet);
1669 DMDAVecGetArray(fda, user->
lJCsi, &jcsi); DMDAVecGetArray(fda, user->
lJEta, &jeta); DMDAVecGetArray(fda, user->
lJZet, &jzet);
1670 DMDAVecGetArray(fda, user->
lKCsi, &kcsi); DMDAVecGetArray(fda, user->
lKEta, &keta); DMDAVecGetArray(fda, user->
lKZet, &kzet);
1671 DMDAVecGetArray(da, user->
lAj, &aj); DMDAVecGetArray(da, user->
lIAj, &iaj); DMDAVecGetArray(da, user->
lJAj, &jaj); DMDAVecGetArray(da, user->
lKAj, &kaj);
1672 DMDAVecGetArray(da, user->
lNvert, &nvert);
1675 Vec G11, G12, G13, G21, G22, G23, G31, G32, G33;
1676 PetscReal ***g11, ***g12, ***g13, ***g21, ***g22, ***g23, ***g31, ***g32, ***g33;
1677 VecDuplicate(user->
lAj, &G11); VecDuplicate(user->
lAj, &G12); VecDuplicate(user->
lAj, &G13);
1678 VecDuplicate(user->
lAj, &G21); VecDuplicate(user->
lAj, &G22); VecDuplicate(user->
lAj, &G23);
1679 VecDuplicate(user->
lAj, &G31); VecDuplicate(user->
lAj, &G32); VecDuplicate(user->
lAj, &G33);
1680 DMDAVecGetArray(da, G11, &g11); DMDAVecGetArray(da, G12, &g12); DMDAVecGetArray(da, G13, &g13);
1681 DMDAVecGetArray(da, G21, &g21); DMDAVecGetArray(da, G22, &g22); DMDAVecGetArray(da, G23, &g23);
1682 DMDAVecGetArray(da, G31, &g31); DMDAVecGetArray(da, G32, &g32); DMDAVecGetArray(da, G33, &g33);
1688 for (k = gzs; k < gze; k++) {
1689 for (j = gys; j < gye; j++) {
1690 for (i = gxs; i < gxe; i++) {
1693 if(i>-1 && j>-1 && k>-1 && i<IM+1 && j<JM+1 && k<KM+1){
1694 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];
1695 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];
1696 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];
1697 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];
1698 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];
1699 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];
1700 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];
1701 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];
1702 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];
1714 PetscInt x_str, x_end, y_str, y_end, z_str, z_end;
1716 else { x_end = mx - 2; x_str = 1; }
1718 else { y_end = my - 2; y_str = 1; }
1720 else { z_end = mz - 2; z_str = 1; }
1723 for (k = zs; k < ze; k++) {
1724 for (j = ys; j < ye; j++) {
1725 for (i = xs; i < xe; i++) {
1726 PetscScalar vol[19];
1728 PetscInt row =
Gidx(i, j, k, user);
1733 if (i == 0 || i == mx - 1 || j == 0 || j == my - 1 || k == 0 || k == mz - 1 || nvert[k][j][i] > IBM_FLUID_THRESHOLD) {
1736 MatSetValues(user->
A, 1, &row, 1, &idx[
CP], &vol[
CP], INSERT_VALUES);
1740 for (PetscInt m = 0; m < 19; m++) {
1747 if (nvert[k][j][i + 1] < IBM_FLUID_THRESHOLD && i != x_end) {
1749 vol[
CP] -= g11[k][j][i];
1750 vol[
EP] += g11[k][j][i];
1757 vol[
CP] += g12[k][j][i] * 0.5; vol[
EP] += g12[k][j][i] * 0.5;
1758 vol[
SP] -= g12[k][j][i] * 0.5; vol[
SE] -= g12[k][j][i] * 0.5;
1762 if (nvert[k][j-1][i] + nvert[k][j-1][i+1] < 0.1) {
1763 vol[
CP] += g12[k][j][i] * 0.5; vol[
EP] += g12[k][j][i] * 0.5;
1764 vol[
SP] -= g12[k][j][i] * 0.5; vol[
SE] -= g12[k][j][i] * 0.5;
1768 if (nvert[k][j+1][i] + nvert[k][j+1][i+1] < 0.1) {
1769 vol[
NP] += g12[k][j][i] * 0.5; vol[
NE] += g12[k][j][i] * 0.5;
1770 vol[
CP] -= g12[k][j][i] * 0.5; vol[
EP] -= g12[k][j][i] * 0.5;
1774 if (nvert[k][j+1][i] + nvert[k][j+1][i+1] < 0.1) {
1775 vol[
NP] += g12[k][j][i] * 0.5; vol[
NE] += g12[k][j][i] * 0.5;
1776 vol[
CP] -= g12[k][j][i] * 0.5; vol[
EP] -= g12[k][j][i] * 0.5;
1780 vol[
NP] += g12[k][j][i] * 0.25; vol[
NE] += g12[k][j][i] * 0.25;
1781 vol[
SP] -= g12[k][j][i] * 0.25; vol[
SE] -= g12[k][j][i] * 0.25;
1787 vol[
CP] += g13[k][j][i] * 0.5; vol[
EP] += g13[k][j][i] * 0.5;
1788 vol[
BP] -= g13[k][j][i] * 0.5; vol[
BE] -= g13[k][j][i] * 0.5;
1792 if (nvert[k-1][j][i] + nvert[k-1][j][i+1] < 0.1) {
1793 vol[
CP] += g13[k][j][i] * 0.5; vol[
EP] += g13[k][j][i] * 0.5;
1794 vol[
BP] -= g13[k][j][i] * 0.5; vol[
BE] -= g13[k][j][i] * 0.5;
1798 if (nvert[k+1][j][i] + nvert[k+1][j][i+1] < 0.1) {
1799 vol[
TP] += g13[k][j][i] * 0.5; vol[
TE] += g13[k][j][i] * 0.5;
1800 vol[
CP] -= g13[k][j][i] * 0.5; vol[
EP] -= g13[k][j][i] * 0.5;
1804 if (nvert[k+1][j][i] + nvert[k+1][j][i+1] < 0.1) {
1805 vol[
TP] += g13[k][j][i] * 0.5; vol[
TE] += g13[k][j][i] * 0.5;
1806 vol[
CP] -= g13[k][j][i] * 0.5; vol[
EP] -= g13[k][j][i] * 0.5;
1810 vol[
TP] += g13[k][j][i] * 0.25; vol[
TE] += g13[k][j][i] * 0.25;
1811 vol[
BP] -= g13[k][j][i] * 0.25; vol[
BE] -= g13[k][j][i] * 0.25;
1818 if (nvert[k][j][i-1] < IBM_FLUID_THRESHOLD && i != x_str) {
1819 vol[
CP] -= g11[k][j][i-1];
1820 vol[
WP] += g11[k][j][i-1];
1824 vol[
CP] -= g12[k][j][i-1] * 0.5; vol[
WP] -= g12[k][j][i-1] * 0.5;
1825 vol[
SP] += g12[k][j][i-1] * 0.5; vol[
SW] += g12[k][j][i-1] * 0.5;
1829 if (nvert[k][j-1][i] + nvert[k][j-1][i-1] < 0.1) {
1830 vol[
CP] -= g12[k][j][i-1] * 0.5; vol[
WP] -= g12[k][j][i-1] * 0.5;
1831 vol[
SP] += g12[k][j][i-1] * 0.5; vol[
SW] += g12[k][j][i-1] * 0.5;
1835 if (nvert[k][j+1][i] + nvert[k][j+1][i-1] < 0.1) {
1836 vol[
NP] -= g12[k][j][i-1] * 0.5; vol[
NW] -= g12[k][j][i-1] * 0.5;
1837 vol[
CP] += g12[k][j][i-1] * 0.5; vol[
WP] += g12[k][j][i-1] * 0.5;
1841 if (nvert[k][j+1][i] + nvert[k][j+1][i-1] < 0.1) {
1842 vol[
NP] -= g12[k][j][i-1] * 0.5; vol[
NW] -= g12[k][j][i-1] * 0.5;
1843 vol[
CP] += g12[k][j][i-1] * 0.5; vol[
WP] += g12[k][j][i-1] * 0.5;
1847 vol[
NP] -= g12[k][j][i-1] * 0.25; vol[
NW] -= g12[k][j][i-1] * 0.25;
1848 vol[
SP] += g12[k][j][i-1] * 0.25; vol[
SW] += g12[k][j][i-1] * 0.25;
1853 vol[
CP] -= g13[k][j][i-1] * 0.5; vol[
WP] -= g13[k][j][i-1] * 0.5;
1854 vol[
BP] += g13[k][j][i-1] * 0.5; vol[
BW] += g13[k][j][i-1] * 0.5;
1858 if (nvert[k-1][j][i] + nvert[k-1][j][i-1] < 0.1) {
1859 vol[
CP] -= g13[k][j][i-1] * 0.5; vol[
WP] -= g13[k][j][i-1] * 0.5;
1860 vol[
BP] += g13[k][j][i-1] * 0.5; vol[
BW] += g13[k][j][i-1] * 0.5;
1864 if (nvert[k+1][j][i] + nvert[k+1][j][i-1] < 0.1) {
1865 vol[
TP] -= g13[k][j][i-1] * 0.5; vol[
TW] -= g13[k][j][i-1] * 0.5;
1866 vol[
CP] += g13[k][j][i-1] * 0.5; vol[
WP] += g13[k][j][i-1] * 0.5;
1870 if (nvert[k+1][j][i] + nvert[k+1][j][i-1] < 0.1) {
1871 vol[
TP] -= g13[k][j][i-1] * 0.5; vol[
TW] -= g13[k][j][i-1] * 0.5;
1872 vol[
CP] += g13[k][j][i-1] * 0.5; vol[
WP] += g13[k][j][i-1] * 0.5;
1876 vol[
TP] -= g13[k][j][i-1] * 0.25; vol[
TW] -= g13[k][j][i-1] * 0.25;
1877 vol[
BP] += g13[k][j][i-1] * 0.25; vol[
BW] += g13[k][j][i-1] * 0.25;
1884 if (nvert[k][j+1][i] < IBM_FLUID_THRESHOLD && j != y_end) {
1887 vol[
CP] += g21[k][j][i] * 0.5; vol[
NP] += g21[k][j][i] * 0.5;
1888 vol[
WP] -= g21[k][j][i] * 0.5; vol[
NW] -= g21[k][j][i] * 0.5;
1892 if (nvert[k][j][i-1] + nvert[k][j+1][i-1] < 0.1) {
1893 vol[
CP] += g21[k][j][i] * 0.5; vol[
NP] += g21[k][j][i] * 0.5;
1894 vol[
WP] -= g21[k][j][i] * 0.5; vol[
NW] -= g21[k][j][i] * 0.5;
1898 if (nvert[k][j][i+1] + nvert[k][j+1][i+1] < 0.1) {
1899 vol[
EP] += g21[k][j][i] * 0.5; vol[
NE] += g21[k][j][i] * 0.5;
1900 vol[
CP] -= g21[k][j][i] * 0.5; vol[
NP] -= g21[k][j][i] * 0.5;
1904 if (nvert[k][j][i+1] + nvert[k][j+1][i+1] < 0.1) {
1905 vol[
EP] += g21[k][j][i] * 0.5; vol[
NE] += g21[k][j][i] * 0.5;
1906 vol[
CP] -= g21[k][j][i] * 0.5; vol[
NP] -= g21[k][j][i] * 0.5;
1910 vol[
EP] += g21[k][j][i] * 0.25; vol[
NE] += g21[k][j][i] * 0.25;
1911 vol[
WP] -= g21[k][j][i] * 0.25; vol[
NW] -= g21[k][j][i] * 0.25;
1914 vol[
CP] -= g22[k][j][i];
1915 vol[
NP] += g22[k][j][i];
1919 vol[
CP] += g23[k][j][i] * 0.5; vol[
NP] += g23[k][j][i] * 0.5;
1920 vol[
BP] -= g23[k][j][i] * 0.5; vol[
BN] -= g23[k][j][i] * 0.5;
1924 if (nvert[k-1][j][i] + nvert[k-1][j+1][i] < 0.1) {
1925 vol[
CP] += g23[k][j][i] * 0.5; vol[
NP] += g23[k][j][i] * 0.5;
1926 vol[
BP] -= g23[k][j][i] * 0.5; vol[
BN] -= g23[k][j][i] * 0.5;
1930 if (nvert[k+1][j][i] + nvert[k+1][j+1][i] < 0.1) {
1931 vol[
TP] += g23[k][j][i] * 0.5; vol[
TN] += g23[k][j][i] * 0.5;
1932 vol[
CP] -= g23[k][j][i] * 0.5; vol[
NP] -= g23[k][j][i] * 0.5;
1936 if (nvert[k+1][j][i] + nvert[k+1][j+1][i] < 0.1) {
1937 vol[
TP] += g23[k][j][i] * 0.5; vol[
TN] += g23[k][j][i] * 0.5;
1938 vol[
CP] -= g23[k][j][i] * 0.5; vol[
NP] -= g23[k][j][i] * 0.5;
1942 vol[
TP] += g23[k][j][i] * 0.25; vol[
TN] += g23[k][j][i] * 0.25;
1943 vol[
BP] -= g23[k][j][i] * 0.25; vol[
BN] -= g23[k][j][i] * 0.25;
1950 if (nvert[k][j-1][i] < IBM_FLUID_THRESHOLD && j != y_str) {
1953 vol[
CP] -= g21[k][j-1][i] * 0.5; vol[
SP] -= g21[k][j-1][i] * 0.5;
1954 vol[
WP] += g21[k][j-1][i] * 0.5; vol[
SW] += g21[k][j-1][i] * 0.5;
1958 if (nvert[k][j][i-1] + nvert[k][j-1][i-1] < 0.1) {
1959 vol[
CP] -= g21[k][j-1][i] * 0.5; vol[
SP] -= g21[k][j-1][i] * 0.5;
1960 vol[
WP] += g21[k][j-1][i] * 0.5; vol[
SW] += g21[k][j-1][i] * 0.5;
1964 if (nvert[k][j][i+1] + nvert[k][j-1][i+1] < 0.1) {
1965 vol[
EP] -= g21[k][j-1][i] * 0.5; vol[
SE] -= g21[k][j-1][i] * 0.5;
1966 vol[
CP] += g21[k][j-1][i] * 0.5; vol[
SP] += g21[k][j-1][i] * 0.5;
1970 if (nvert[k][j][i+1] + nvert[k][j-1][i+1] < 0.1) {
1971 vol[
EP] -= g21[k][j-1][i] * 0.5; vol[
SE] -= g21[k][j-1][i] * 0.5;
1972 vol[
CP] += g21[k][j-1][i] * 0.5; vol[
SP] += g21[k][j-1][i] * 0.5;
1976 vol[
EP] -= g21[k][j-1][i] * 0.25; vol[
SE] -= g21[k][j-1][i] * 0.25;
1977 vol[
WP] += g21[k][j-1][i] * 0.25; vol[
SW] += g21[k][j-1][i] * 0.25;
1980 vol[
CP] -= g22[k][j-1][i];
1981 vol[
SP] += g22[k][j-1][i];
1985 vol[
CP] -= g23[k][j-1][i] * 0.5; vol[
SP] -= g23[k][j-1][i] * 0.5;
1986 vol[
BP] += g23[k][j-1][i] * 0.5; vol[
BS] += g23[k][j-1][i] * 0.5;
1990 if (nvert[k-1][j][i] + nvert[k-1][j-1][i] < 0.1 ) {
1991 vol[
CP] -= g23[k][j-1][i] * 0.5; vol[
SP] -= g23[k][j-1][i] * 0.5;
1992 vol[
BP] += g23[k][j-1][i] * 0.5; vol[
BS] += g23[k][j-1][i] * 0.5;
1996 if (nvert[k+1][j][i] + nvert[k+1][j-1][i] < 0.1) {
1997 vol[
TP] -= g23[k][j-1][i] * 0.5; vol[
TS] -= g23[k][j-1][i] * 0.5;
1998 vol[
CP] += g23[k][j-1][i] * 0.5; vol[
SP] += g23[k][j-1][i] * 0.5;
2002 if (nvert[k+1][j][i] + nvert[k+1][j-1][i] < 0.1) {
2003 vol[
TP] -= g23[k][j-1][i] * 0.5; vol[
TS] -= g23[k][j-1][i] * 0.5;
2004 vol[
CP] += g23[k][j-1][i] * 0.5; vol[
SP] += g23[k][j-1][i] * 0.5;
2008 vol[
TP] -= g23[k][j-1][i] * 0.25; vol[
TS] -= g23[k][j-1][i] * 0.25;
2009 vol[
BP] += g23[k][j-1][i] * 0.25; vol[
BS] += g23[k][j-1][i] * 0.25;
2016 if (nvert[k+1][j][i] < IBM_FLUID_THRESHOLD && k != z_end) {
2019 vol[
CP] += g31[k][j][i] * 0.5; vol[
TP] += g31[k][j][i] * 0.5;
2020 vol[
WP] -= g31[k][j][i] * 0.5; vol[
TW] -= g31[k][j][i] * 0.5;
2024 if (nvert[k][j][i-1] + nvert[k+1][j][i-1] < 0.1) {
2025 vol[
CP] += g31[k][j][i] * 0.5; vol[
TP] += g31[k][j][i] * 0.5;
2026 vol[
WP] -= g31[k][j][i] * 0.5; vol[
TW] -= g31[k][j][i] * 0.5;
2030 if (nvert[k][j][i+1] + nvert[k+1][j][i+1] < 0.1) {
2031 vol[
EP] += g31[k][j][i] * 0.5; vol[
TE] += g31[k][j][i] * 0.5;
2032 vol[
CP] -= g31[k][j][i] * 0.5; vol[
TP] -= g31[k][j][i] * 0.5;
2036 if (nvert[k][j][i+1] + nvert[k+1][j][i+1] < 0.1) {
2037 vol[
EP] += g31[k][j][i] * 0.5; vol[
TE] += g31[k][j][i] * 0.5;
2038 vol[
CP] -= g31[k][j][i] * 0.5; vol[
TP] -= g31[k][j][i] * 0.5;
2042 vol[
EP] += g31[k][j][i] * 0.25; vol[
TE] += g31[k][j][i] * 0.25;
2043 vol[
WP] -= g31[k][j][i] * 0.25; vol[
TW] -= g31[k][j][i] * 0.25;
2048 vol[
CP] += g32[k][j][i] * 0.5; vol[
TP] += g32[k][j][i] * 0.5;
2049 vol[
SP] -= g32[k][j][i] * 0.5; vol[
TS] -= g32[k][j][i] * 0.5;
2053 if (nvert[k][j-1][i] + nvert[k+1][j-1][i] < 0.1) {
2054 vol[
CP] += g32[k][j][i] * 0.5; vol[
TP] += g32[k][j][i] * 0.5;
2055 vol[
SP] -= g32[k][j][i] * 0.5; vol[
TS] -= g32[k][j][i] * 0.5;
2059 if (nvert[k][j+1][i] + nvert[k+1][j+1][i] < 0.1) {
2060 vol[
NP] += g32[k][j][i] * 0.5; vol[
TN] += g32[k][j][i] * 0.5;
2061 vol[
CP] -= g32[k][j][i] * 0.5; vol[
TP] -= g32[k][j][i] * 0.5;
2065 if (nvert[k][j+1][i] + nvert[k+1][j+1][i] < 0.1) {
2066 vol[
NP] += g32[k][j][i] * 0.5; vol[
TN] += g32[k][j][i] * 0.5;
2067 vol[
CP] -= g32[k][j][i] * 0.5; vol[
TP] -= g32[k][j][i] * 0.5;
2071 vol[
NP] += g32[k][j][i] * 0.25; vol[
TN] += g32[k][j][i] * 0.25;
2072 vol[
SP] -= g32[k][j][i] * 0.25; vol[
TS] -= g32[k][j][i] * 0.25;
2075 vol[
CP] -= g33[k][j][i];
2076 vol[
TP] += g33[k][j][i];
2082 if (nvert[k-1][j][i] < IBM_FLUID_THRESHOLD && k != z_str) {
2085 vol[
CP] -= g31[k-1][j][i] * 0.5; vol[
BP] -= g31[k-1][j][i] * 0.5;
2086 vol[
WP] += g31[k-1][j][i] * 0.5; vol[
BW] += g31[k-1][j][i] * 0.5;
2090 if (nvert[k][j][i-1] + nvert[k-1][j][i-1] < 0.1) {
2091 vol[
CP] -= g31[k-1][j][i] * 0.5; vol[
BP] -= g31[k-1][j][i] * 0.5;
2092 vol[
WP] += g31[k-1][j][i] * 0.5; vol[
BW] += g31[k-1][j][i] * 0.5;
2096 if (nvert[k][j][i+1] + nvert[k-1][j][i+1] < 0.1) {
2097 vol[
EP] -= g31[k-1][j][i] * 0.5; vol[
BE] -= g31[k-1][j][i] * 0.5;
2098 vol[
CP] += g31[k-1][j][i] * 0.5; vol[
BP] += g31[k-1][j][i] * 0.5;
2102 if (nvert[k][j][i+1] + nvert[k-1][j][i+1] < 0.1) {
2103 vol[
EP] -= g31[k-1][j][i] * 0.5; vol[
BE] -= g31[k-1][j][i] * 0.5;
2104 vol[
CP] += g31[k-1][j][i] * 0.5; vol[
BP] += g31[k-1][j][i] * 0.5;
2108 vol[
EP] -= g31[k-1][j][i] * 0.25; vol[
BE] -= g31[k-1][j][i] * 0.25;
2109 vol[
WP] += g31[k-1][j][i] * 0.25; vol[
BW] += g31[k-1][j][i] * 0.25;
2114 vol[
CP] -= g32[k-1][j][i] * 0.5; vol[
BP] -= g32[k-1][j][i] * 0.5;
2115 vol[
SP] += g32[k-1][j][i] * 0.5; vol[
BS] += g32[k-1][j][i] * 0.5;
2119 if (nvert[k][j-1][i] + nvert[k-1][j-1][i] < 0.1) {
2120 vol[
CP] -= g32[k-1][j][i] * 0.5; vol[
BP] -= g32[k-1][j][i] * 0.5;
2121 vol[
SP] += g32[k-1][j][i] * 0.5; vol[
BS] += g32[k-1][j][i] * 0.5;
2125 if (nvert[k][j+1][i] + nvert[k-1][j+1][i] < 0.1) {
2126 vol[
NP] -= g32[k-1][j][i] * 0.5; vol[
BN] -= g32[k-1][j][i] * 0.5;
2127 vol[
CP] += g32[k-1][j][i] * 0.5; vol[
BP] += g32[k-1][j][i] * 0.5;
2131 if (nvert[k][j+1][i] + nvert[k-1][j+1][i] < 0.1) {
2132 vol[
NP] -= g32[k-1][j][i] * 0.5; vol[
BN] -= g32[k-1][j][i] * 0.5;
2133 vol[
CP] += g32[k-1][j][i] * 0.5; vol[
BP] += g32[k-1][j][i] * 0.5;
2137 vol[
NP] -= g32[k-1][j][i] * 0.25; vol[
BN] -= g32[k-1][j][i] * 0.25;
2138 vol[
SP] += g32[k-1][j][i] * 0.25; vol[
BS] += g32[k-1][j][i] * 0.25;
2141 vol[
CP] -= g33[k-1][j][i];
2142 vol[
BP] += g33[k-1][j][i];
2148 for (PetscInt m = 0; m < 19; m++) {
2149 vol[m] *= -aj[k][j][i];
2153 idx[
CP] =
Gidx(i, j, k, user);
2160 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);
2161 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);
2162 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);
2163 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);
2164 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);
2165 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);
2166 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);
2167 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);
2168 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);
2169 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);
2170 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);
2171 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);
2174 MatSetValues(user->
A, 1, &row, 19, idx, vol, INSERT_VALUES);
2185 MatAssemblyBegin(user->
A, MAT_FINAL_ASSEMBLY);
2186 MatAssemblyEnd(user->
A, MAT_FINAL_ASSEMBLY);
2190 ierr = MatNorm(user->
A,NORM_INFINITY,&max_A);CHKERRQ(ierr);
2199 DMDAVecRestoreArray(da, G11, &g11); DMDAVecRestoreArray(da, G12, &g12); DMDAVecRestoreArray(da, G13, &g13);
2200 DMDAVecRestoreArray(da, G21, &g21); DMDAVecRestoreArray(da, G22, &g22); DMDAVecRestoreArray(da, G23, &g23);
2201 DMDAVecRestoreArray(da, G31, &g31); DMDAVecRestoreArray(da, G32, &g32); DMDAVecRestoreArray(da, G33, &g33);
2203 VecDestroy(&G11); VecDestroy(&G12); VecDestroy(&G13);
2204 VecDestroy(&G21); VecDestroy(&G22); VecDestroy(&G23);
2205 VecDestroy(&G31); VecDestroy(&G32); VecDestroy(&G33);
2207 DMDAVecRestoreArray(fda, user->
lCsi, &csi); DMDAVecRestoreArray(fda, user->
lEta, &eta); DMDAVecRestoreArray(fda, user->
lZet, &zet);
2208 DMDAVecRestoreArray(fda, user->
lICsi, &icsi); DMDAVecRestoreArray(fda, user->
lIEta, &ieta); DMDAVecRestoreArray(fda, user->
lIZet, &izet);
2209 DMDAVecRestoreArray(fda, user->
lJCsi, &jcsi); DMDAVecRestoreArray(fda, user->
lJEta, &jeta); DMDAVecRestoreArray(fda, user->
lJZet, &jzet);
2210 DMDAVecRestoreArray(fda, user->
lKCsi, &kcsi); DMDAVecRestoreArray(fda, user->
lKEta, &keta); DMDAVecRestoreArray(fda, user->
lKZet, &kzet);
2211 DMDAVecRestoreArray(da, user->
lAj, &aj); DMDAVecRestoreArray(da, user->
lIAj, &iaj); DMDAVecRestoreArray(da, user->
lJAj, &jaj); DMDAVecRestoreArray(da, user->
lKAj, &kaj);
2212 DMDAVecRestoreArray(da, user->
lNvert, &nvert);
2216 PetscFunctionReturn(0);
2305 PetscReal *ibm_Area, PetscInt flg)
2316 DM da = user->
da, fda = user->
fda;
2318 DMDALocalInfo info = user->
info;
2320 PetscInt xs = info.xs, xe = info.xs + info.xm;
2321 PetscInt ys = info.ys, ye = info.ys + info.ym;
2322 PetscInt zs = info.zs, ze = info.zs + info.zm;
2323 PetscInt mx = info.mx, my = info.my, mz = info.mz;
2326 PetscInt lxs, lys, lzs, lxe, lye, lze;
2332 if (xs==0) lxs = xs+1;
2333 if (ys==0) lys = ys+1;
2334 if (zs==0) lzs = zs+1;
2336 if (xe==mx) lxe = xe-1;
2337 if (ye==my) lye = ye-1;
2338 if (ze==mz) lze = ze-1;
2340 PetscReal ***nvert, ibmval=1.5;
2341 Cmpnts ***ucor, ***csi, ***eta, ***zet;
2342 DMDAVecGetArray(fda, user->
Ucont, &ucor);
2343 DMDAVecGetArray(fda, user->
lCsi, &csi);
2344 DMDAVecGetArray(fda, user->
lEta, &eta);
2345 DMDAVecGetArray(fda, user->
lZet, &zet);
2346 DMDAVecGetArray(da, user->
lNvert, &nvert);
2348 PetscReal libm_Flux, libm_area;
2351 for (k=lzs; k<lze; k++) {
2352 for (j=lys; j<lye; j++) {
2353 for (i=lxs; i<lxe; i++) {
2354 if (nvert[k][j][i] < 0.1) {
2355 if (nvert[k][j][i+1] > ibmval-0.4 && nvert[k][j][i+1] < ibmval && i < mx-2) {
2356 libm_Flux += ucor[k][j][i].
x;
2357 libm_area += sqrt(csi[k][j][i].x * csi[k][j][i].x +
2358 csi[k][j][i].y * csi[k][j][i].y +
2359 csi[k][j][i].z * csi[k][j][i].z);
2362 if (nvert[k][j+1][i] > ibmval-0.4 && nvert[k][j+1][i] < ibmval && j < my-2) {
2363 libm_Flux += ucor[k][j][i].
y;
2364 libm_area += sqrt(eta[k][j][i].x * eta[k][j][i].x +
2365 eta[k][j][i].y * eta[k][j][i].y +
2366 eta[k][j][i].z * eta[k][j][i].z);
2368 if (nvert[k+1][j][i] > ibmval-0.4 && nvert[k+1][j][i] < ibmval && k < mz-2) {
2369 libm_Flux += ucor[k][j][i].
z;
2370 libm_area += sqrt(zet[k][j][i].x * zet[k][j][i].x +
2371 zet[k][j][i].y * zet[k][j][i].y +
2372 zet[k][j][i].z * zet[k][j][i].z);
2376 if (nvert[k][j][i] > ibmval-0.4 && nvert[k][j][i] < ibmval) {
2377 if (nvert[k][j][i+1] < 0.1 && i < mx-2) {
2378 libm_Flux -= ucor[k][j][i].
x;
2379 libm_area += sqrt(csi[k][j][i].x * csi[k][j][i].x +
2380 csi[k][j][i].y * csi[k][j][i].y +
2381 csi[k][j][i].z * csi[k][j][i].z);
2384 if (nvert[k][j+1][i] < 0.1 && j < my-2) {
2385 libm_Flux -= ucor[k][j][i].
y;
2386 libm_area += sqrt(eta[k][j][i].x * eta[k][j][i].x +
2387 eta[k][j][i].y * eta[k][j][i].y +
2388 eta[k][j][i].z * eta[k][j][i].z);
2390 if (nvert[k+1][j][i] < 0.1 && k < mz-2) {
2391 libm_Flux -= ucor[k][j][i].
z;
2392 libm_area += sqrt(zet[k][j][i].x * zet[k][j][i].x +
2393 zet[k][j][i].y * zet[k][j][i].y +
2394 zet[k][j][i].z * zet[k][j][i].z);
2402 MPI_Allreduce(&libm_Flux, ibm_Flux,1,MPI_DOUBLE,MPI_SUM, PETSC_COMM_WORLD);
2403 MPI_Allreduce(&libm_area, ibm_Area,1,MPI_DOUBLE,MPI_SUM, PETSC_COMM_WORLD);
2407 PetscPrintf(PETSC_COMM_WORLD,
"IBMFlux REV %le %le\n", *ibm_Flux, *ibm_Area);
2409 PetscReal correction;
2411 if (*ibm_Area > 1.e-15) {
2413 correction = (*ibm_Flux + user->
FluxIntpSum) / *ibm_Area;
2415 correction = *ibm_Flux / *ibm_Area;
2421 for (k=lzs; k<lze; k++) {
2422 for (j=lys; j<lye; j++) {
2423 for (i=lxs; i<lxe; i++) {
2424 if (nvert[k][j][i] < 0.1) {
2425 if (nvert[k][j][i+1] > ibmval-0.4 && nvert[k][j][i+1] < ibmval && i < mx-2) {
2426 ucor[k][j][i].
x -= sqrt(csi[k][j][i].x * csi[k][j][i].x +
2427 csi[k][j][i].y * csi[k][j][i].y +
2428 csi[k][j][i].z * csi[k][j][i].z) *
2432 if (nvert[k][j+1][i] > ibmval-0.4 && nvert[k][j+1][i] < ibmval && j < my-2) {
2433 ucor[k][j][i].
y -= sqrt(eta[k][j][i].x * eta[k][j][i].x +
2434 eta[k][j][i].y * eta[k][j][i].y +
2435 eta[k][j][i].z * eta[k][j][i].z) *
2438 if (nvert[k+1][j][i] > ibmval-0.4 && nvert[k+1][j][i] < ibmval && k < mz-2) {
2439 ucor[k][j][i].
z -= sqrt(zet[k][j][i].x * zet[k][j][i].x +
2440 zet[k][j][i].y * zet[k][j][i].y +
2441 zet[k][j][i].z * zet[k][j][i].z) *
2446 if (nvert[k][j][i] > ibmval-0.4 && nvert[k][j][i] < ibmval) {
2447 if (nvert[k][j][i+1] < 0.1 && i < mx-2) {
2448 ucor[k][j][i].
x += sqrt(csi[k][j][i].x * csi[k][j][i].x +
2449 csi[k][j][i].y * csi[k][j][i].y +
2450 csi[k][j][i].z * csi[k][j][i].z) *
2454 if (nvert[k][j+1][i] < 0.1 && j < my-2) {
2455 ucor[k][j][i].
y += sqrt(eta[k][j][i].x * eta[k][j][i].x +
2456 eta[k][j][i].y * eta[k][j][i].y +
2457 eta[k][j][i].z * eta[k][j][i].z) *
2460 if (nvert[k+1][j][i] < 0.1 && k < mz-2) {
2461 ucor[k][j][i].
z += sqrt(zet[k][j][i].x * zet[k][j][i].x +
2462 zet[k][j][i].y * zet[k][j][i].y +
2463 zet[k][j][i].z * zet[k][j][i].z) *
2476 for (k=lzs; k<lze; k++) {
2477 for (j=lys; j<lye; j++) {
2478 for (i=lxs; i<lxe; i++) {
2479 if (nvert[k][j][i] < 0.1) {
2480 if (nvert[k][j][i+1] > ibmval-0.4 && nvert[k][j][i+1] < ibmval && i < mx-2) {
2481 libm_Flux += ucor[k][j][i].
x;
2482 libm_area += sqrt(csi[k][j][i].x * csi[k][j][i].x +
2483 csi[k][j][i].y * csi[k][j][i].y +
2484 csi[k][j][i].z * csi[k][j][i].z);
2487 if (nvert[k][j+1][i] > ibmval-0.4 && nvert[k][j+1][i] < ibmval && j < my-2) {
2488 libm_Flux += ucor[k][j][i].
y;
2489 libm_area += sqrt(eta[k][j][i].x * eta[k][j][i].x +
2490 eta[k][j][i].y * eta[k][j][i].y +
2491 eta[k][j][i].z * eta[k][j][i].z);
2493 if (nvert[k+1][j][i] > ibmval-0.4 && nvert[k+1][j][i] < ibmval && k < mz-2) {
2494 libm_Flux += ucor[k][j][i].
z;
2495 libm_area += sqrt(zet[k][j][i].x * zet[k][j][i].x +
2496 zet[k][j][i].y * zet[k][j][i].y +
2497 zet[k][j][i].z * zet[k][j][i].z);
2501 if (nvert[k][j][i] > ibmval-0.4 && nvert[k][j][i] < ibmval) {
2502 if (nvert[k][j][i+1] < 0.1 && i < mx-2) {
2503 libm_Flux -= ucor[k][j][i].
x;
2504 libm_area += sqrt(csi[k][j][i].x * csi[k][j][i].x +
2505 csi[k][j][i].y * csi[k][j][i].y +
2506 csi[k][j][i].z * csi[k][j][i].z);
2509 if (nvert[k][j+1][i] < 0.1 && j < my-2) {
2510 libm_Flux -= ucor[k][j][i].
y;
2511 libm_area += sqrt(eta[k][j][i].x * eta[k][j][i].x +
2512 eta[k][j][i].y * eta[k][j][i].y +
2513 eta[k][j][i].z * eta[k][j][i].z);
2515 if (nvert[k+1][j][i] < 0.1 && k < mz-2) {
2516 libm_Flux -= 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);
2527 MPI_Allreduce(&libm_Flux, ibm_Flux,1,MPI_DOUBLE,MPI_SUM, PETSC_COMM_WORLD);
2528 MPI_Allreduce(&libm_area, ibm_Area,1,MPI_DOUBLE,MPI_SUM, PETSC_COMM_WORLD);
2532 PetscPrintf(PETSC_COMM_WORLD,
"IBMFlux22 REV %le %le\n", *ibm_Flux, *ibm_Area);
2534 DMDAVecRestoreArray(da, user->
lNvert, &nvert);
2535 DMDAVecRestoreArray(fda, user->
lCsi, &csi);
2536 DMDAVecRestoreArray(fda, user->
lEta, &eta);
2537 DMDAVecRestoreArray(fda, user->
lZet, &zet);
2538 DMDAVecRestoreArray(fda, user->
Ucont, &ucor);
2540 DMGlobalToLocalBegin(fda, user->
Ucont, INSERT_VALUES, user->
lUcont);
2541 DMGlobalToLocalEnd(fda, user->
Ucont, INSERT_VALUES, user->
lUcont);
2554 const PetscInt channelz = simCtx->
channelz;
2555 const PetscInt fish = simCtx->
fish;
2558 DM da = user->
da, fda = user->
fda;
2560 DMDALocalInfo info = user->
info;
2562 PetscInt xs = info.xs, xe = info.xs + info.xm;
2563 PetscInt ys = info.ys, ye = info.ys + info.ym;
2564 PetscInt zs = info.zs, ze = info.zs + info.zm;
2565 PetscInt mx = info.mx, my = info.my, mz = info.mz;
2567 PetscInt i, j, k,ibi;
2568 PetscInt lxs, lys, lzs, lxe, lye, lze;
2570 PetscInt gxs, gxe, gys, gye, gzs, gze;
2572 gxs = info.gxs; gxe = gxs + info.gxm;
2573 gys = info.gys; gye = gys + info.gym;
2574 gzs = info.gzs; gze = gzs + info.gzm;
2580 if (xs==0) lxs = xs+1;
2581 if (ys==0) lys = ys+1;
2582 if (zs==0) lzs = zs+1;
2584 if (xe==mx) lxe = xe-1;
2585 if (ye==my) lye = ye-1;
2586 if (ze==mz) lze = ze-1;
2588 PetscReal epsilon=1.e-8;
2589 PetscReal ***nvert, ibmval=1.9999;
2595 }***ucor, ***lucor,***csi, ***eta, ***zet;
2598 PetscInt xend=mx-2 ,yend=my-2,zend=mz-2;
2604 DMDAVecGetArray(fda, user->
Ucont, &ucor);
2605 DMDAVecGetArray(fda, user->
lCsi, &csi);
2606 DMDAVecGetArray(fda, user->
lEta, &eta);
2607 DMDAVecGetArray(fda, user->
lZet, &zet);
2608 DMDAVecGetArray(da, user->
lNvert, &nvert);
2610 PetscReal libm_Flux, libm_area, libm_Flux_abs=0., ibm_Flux_abs;
2617 PetscReal *lIB_Flux, *lIB_area,*IB_Flux,*IB_Area;
2618 if (NumberOfBodies > 1) {
2620 lIB_Flux=(PetscReal *)calloc(NumberOfBodies,
sizeof(PetscReal));
2621 lIB_area=(PetscReal *)calloc(NumberOfBodies,
sizeof(PetscReal));
2622 IB_Flux=(PetscReal *)calloc(NumberOfBodies,
sizeof(PetscReal));
2623 IB_Area=(PetscReal *)calloc(NumberOfBodies,
sizeof(PetscReal));
2626 for (ibi=0; ibi<NumberOfBodies; ibi++) {
2641 for (k=lzs; k<lze; k++) {
2642 for (j=lys; j<lye; j++) {
2643 for (i=lxs; i<lxe; i++) {
2644 if (nvert[k][j][i] < 0.1) {
2645 if (nvert[k][j][i+1] > 0.1 && nvert[k][j][i+1] < ibmval && i < xend) {
2647 if (fabs(ucor[k][j][i].x)>epsilon) {
2648 libm_Flux += ucor[k][j][i].x;
2650 libm_Flux_abs += fabs(ucor[k][j][i].x)/sqrt(csi[k][j][i].x * csi[k][j][i].x +
2651 csi[k][j][i].y * csi[k][j][i].y +
2652 csi[k][j][i].z * csi[k][j][i].z);
2654 libm_Flux_abs += fabs(ucor[k][j][i].x);
2656 libm_area += sqrt(csi[k][j][i].x * csi[k][j][i].x +
2657 csi[k][j][i].y * csi[k][j][i].y +
2658 csi[k][j][i].z * csi[k][j][i].z);
2660 if (NumberOfBodies > 1) {
2662 ibi=(int)((nvert[k][j][i+1]-1.0)*1001);
2663 lIB_Flux[ibi] += ucor[k][j][i].x;
2664 lIB_area[ibi] += sqrt(csi[k][j][i].x * csi[k][j][i].x +
2665 csi[k][j][i].y * csi[k][j][i].y +
2666 csi[k][j][i].z * csi[k][j][i].z);
2672 if (nvert[k][j+1][i] > 0.1 && nvert[k][j+1][i] < ibmval && j < yend) {
2674 if (fabs(ucor[k][j][i].y)>epsilon) {
2675 libm_Flux += ucor[k][j][i].y;
2677 libm_Flux_abs += fabs(ucor[k][j][i].y)/sqrt(eta[k][j][i].x * eta[k][j][i].x +
2678 eta[k][j][i].y * eta[k][j][i].y +
2679 eta[k][j][i].z * eta[k][j][i].z);
2681 libm_Flux_abs += fabs(ucor[k][j][i].y);
2682 libm_area += sqrt(eta[k][j][i].x * eta[k][j][i].x +
2683 eta[k][j][i].y * eta[k][j][i].y +
2684 eta[k][j][i].z * eta[k][j][i].z);
2685 if (NumberOfBodies > 1) {
2687 ibi=(int)((nvert[k][j+1][i]-1.0)*1001);
2689 lIB_Flux[ibi] += ucor[k][j][i].y;
2690 lIB_area[ibi] += sqrt(eta[k][j][i].x * eta[k][j][i].x +
2691 eta[k][j][i].y * eta[k][j][i].y +
2692 eta[k][j][i].z * eta[k][j][i].z);
2697 if (nvert[k+1][j][i] > 0.1 && nvert[k+1][j][i] < ibmval && k < zend) {
2699 if (fabs(ucor[k][j][i].z)>epsilon) {
2700 libm_Flux += ucor[k][j][i].z;
2702 libm_Flux_abs += fabs(ucor[k][j][i].z)/sqrt(zet[k][j][i].x * zet[k][j][i].x +
2703 zet[k][j][i].y * zet[k][j][i].y +
2704 zet[k][j][i].z * zet[k][j][i].z);
2706 libm_Flux_abs += fabs(ucor[k][j][i].z);
2707 libm_area += sqrt(zet[k][j][i].x * zet[k][j][i].x +
2708 zet[k][j][i].y * zet[k][j][i].y +
2709 zet[k][j][i].z * zet[k][j][i].z);
2711 if (NumberOfBodies > 1) {
2713 ibi=(int)((nvert[k+1][j][i]-1.0)*1001);
2714 lIB_Flux[ibi] += ucor[k][j][i].z;
2715 lIB_area[ibi] += 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);
2724 if (nvert[k][j][i] > 0.1 && nvert[k][j][i] < ibmval) {
2726 if (nvert[k][j][i+1] < 0.1 && i < xend) {
2727 if (fabs(ucor[k][j][i].x)>epsilon) {
2728 libm_Flux -= ucor[k][j][i].x;
2730 libm_Flux_abs += fabs(ucor[k][j][i].x)/sqrt(csi[k][j][i].x * csi[k][j][i].x +
2731 csi[k][j][i].y * csi[k][j][i].y +
2732 csi[k][j][i].z * csi[k][j][i].z);
2734 libm_Flux_abs += fabs(ucor[k][j][i].x);
2735 libm_area += sqrt(csi[k][j][i].x * csi[k][j][i].x +
2736 csi[k][j][i].y * csi[k][j][i].y +
2737 csi[k][j][i].z * csi[k][j][i].z);
2738 if (NumberOfBodies > 1) {
2740 ibi=(int)((nvert[k][j][i]-1.0)*1001);
2741 lIB_Flux[ibi] -= ucor[k][j][i].x;
2742 lIB_area[ibi] += sqrt(csi[k][j][i].x * csi[k][j][i].x +
2743 csi[k][j][i].y * csi[k][j][i].y +
2744 csi[k][j][i].z * csi[k][j][i].z);
2750 if (nvert[k][j+1][i] < 0.1 && j < yend) {
2751 if (fabs(ucor[k][j][i].y)>epsilon) {
2752 libm_Flux -= ucor[k][j][i].y;
2754 libm_Flux_abs += fabs(ucor[k][j][i].y)/ sqrt(eta[k][j][i].x * eta[k][j][i].x +
2755 eta[k][j][i].y * eta[k][j][i].y +
2756 eta[k][j][i].z * eta[k][j][i].z);
2758 libm_Flux_abs += fabs(ucor[k][j][i].y);
2759 libm_area += sqrt(eta[k][j][i].x * eta[k][j][i].x +
2760 eta[k][j][i].y * eta[k][j][i].y +
2761 eta[k][j][i].z * eta[k][j][i].z);
2762 if (NumberOfBodies > 1) {
2764 ibi=(int)((nvert[k][j][i]-1.0)*1001);
2765 lIB_Flux[ibi] -= ucor[k][j][i].y;
2766 lIB_area[ibi] += sqrt(eta[k][j][i].x * eta[k][j][i].x +
2767 eta[k][j][i].y * eta[k][j][i].y +
2768 eta[k][j][i].z * eta[k][j][i].z);
2773 if (nvert[k+1][j][i] < 0.1 && k < zend) {
2774 if (fabs(ucor[k][j][i].z)>epsilon) {
2775 libm_Flux -= ucor[k][j][i].z;
2777 libm_Flux_abs += fabs(ucor[k][j][i].z)/sqrt(zet[k][j][i].x * zet[k][j][i].x +
2778 zet[k][j][i].y * zet[k][j][i].y +
2779 zet[k][j][i].z * zet[k][j][i].z);
2781 libm_Flux_abs += fabs(ucor[k][j][i].z);
2782 libm_area += sqrt(zet[k][j][i].x * zet[k][j][i].x +
2783 zet[k][j][i].y * zet[k][j][i].y +
2784 zet[k][j][i].z * zet[k][j][i].z);
2785 if (NumberOfBodies > 1) {
2787 ibi=(int)((nvert[k][j][i]-1.0)*1001);
2788 lIB_Flux[ibi] -= ucor[k][j][i].z;
2789 lIB_area[ibi] += sqrt(zet[k][j][i].x * zet[k][j][i].x +
2790 zet[k][j][i].y * zet[k][j][i].y +
2791 zet[k][j][i].z * zet[k][j][i].z);
2802 MPI_Allreduce(&libm_Flux, ibm_Flux,1,MPI_DOUBLE,MPI_SUM, PETSC_COMM_WORLD);
2803 MPI_Allreduce(&libm_Flux_abs, &ibm_Flux_abs,1,MPI_DOUBLE,MPI_SUM, PETSC_COMM_WORLD);
2804 MPI_Allreduce(&libm_area, ibm_Area,1,MPI_DOUBLE,MPI_SUM, PETSC_COMM_WORLD);
2806 if (NumberOfBodies > 1) {
2807 MPI_Allreduce(lIB_Flux,IB_Flux,NumberOfBodies,MPI_DOUBLE,MPI_SUM,PETSC_COMM_WORLD);
2808 MPI_Allreduce(lIB_area,IB_Area,NumberOfBodies,MPI_DOUBLE,MPI_SUM,PETSC_COMM_WORLD);
2811 PetscReal correction;
2813 PetscReal *Correction;
2814 if (NumberOfBodies > 1) {
2815 Correction=(PetscReal *)calloc(NumberOfBodies,
sizeof(PetscReal));
2816 for (ibi=0; ibi<NumberOfBodies; ibi++) Correction[ibi]=0.0;
2819 if (*ibm_Area > 1.e-15) {
2821 correction = (*ibm_Flux + user->
FluxIntpSum)/ ibm_Flux_abs;
2823 correction = (*ibm_Flux + user->
FluxIntpSum) / *ibm_Area;
2825 correction = *ibm_Flux / *ibm_Area;
2826 if (NumberOfBodies > 1)
2827 for (ibi=0; ibi<NumberOfBodies; ibi++)
if (IB_Area[ibi]>1.e-15) Correction[ibi] = IB_Flux[ibi] / IB_Area[ibi];
2833 LOG_ALLOW(
GLOBAL,
LOG_INFO,
"IBM Uncorrected Flux: %g, Area: %g, Correction: %g\n", *ibm_Flux, *ibm_Area, correction);
2834 if (NumberOfBodies>1){
2835 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]);
2844 for (k=lzs; k<lze; k++) {
2845 for (j=lys; j<lye; j++) {
2846 for (i=lxs; i<lxe; i++) {
2847 if (nvert[k][j][i] < 0.1) {
2848 if (nvert[k][j][i+1] > 0.1 && nvert[k][j][i+1] <ibmval && i < xend) {
2849 if (fabs(ucor[k][j][i].x)>epsilon){
2851 ucor[k][j][i].x -=correction*fabs(ucor[k][j][i].x)/
2852 sqrt(csi[k][j][i].x * csi[k][j][i].x +
2853 csi[k][j][i].y * csi[k][j][i].y +
2854 csi[k][j][i].z * csi[k][j][i].z);
2856 ucor[k][j][i].x -=correction*fabs(ucor[k][j][i].x);
2857 else if (NumberOfBodies > 1) {
2858 ibi=(int)((nvert[k][j][i+1]-1.0)*1001);
2859 ucor[k][j][i].x -= sqrt(csi[k][j][i].x * csi[k][j][i].x +
2860 csi[k][j][i].y * csi[k][j][i].y +
2861 csi[k][j][i].z * csi[k][j][i].z) *
2865 ucor[k][j][i].x -= sqrt(csi[k][j][i].x * csi[k][j][i].x +
2866 csi[k][j][i].y * csi[k][j][i].y +
2867 csi[k][j][i].z * csi[k][j][i].z) *
2871 if (nvert[k][j+1][i] > 0.1 && nvert[k][j+1][i] < ibmval && j < yend) {
2872 if (fabs(ucor[k][j][i].y)>epsilon) {
2874 ucor[k][j][i].y -=correction*fabs(ucor[k][j][i].y)/
2875 sqrt(eta[k][j][i].x * eta[k][j][i].x +
2876 eta[k][j][i].y * eta[k][j][i].y +
2877 eta[k][j][i].z * eta[k][j][i].z);
2879 ucor[k][j][i].y -=correction*fabs(ucor[k][j][i].y);
2880 else if (NumberOfBodies > 1) {
2881 ibi=(int)((nvert[k][j+1][i]-1.0)*1001);
2882 ucor[k][j][i].y -= sqrt(eta[k][j][i].x * eta[k][j][i].x +
2883 eta[k][j][i].y * eta[k][j][i].y +
2884 eta[k][j][i].z * eta[k][j][i].z) *
2888 ucor[k][j][i].y -= sqrt(eta[k][j][i].x * eta[k][j][i].x +
2889 eta[k][j][i].y * eta[k][j][i].y +
2890 eta[k][j][i].z * eta[k][j][i].z) *
2894 if (nvert[k+1][j][i] > 0.1 && nvert[k+1][j][i] < ibmval && k < zend) {
2895 if (fabs(ucor[k][j][i].z)>epsilon) {
2897 ucor[k][j][i].z -= correction*fabs(ucor[k][j][i].z)/
2898 sqrt(zet[k][j][i].x * zet[k][j][i].x +
2899 zet[k][j][i].y * zet[k][j][i].y +
2900 zet[k][j][i].z * zet[k][j][i].z);
2902 ucor[k][j][i].z -= correction*fabs(ucor[k][j][i].z);
2903 else if (NumberOfBodies > 1) {
2904 ibi=(int)((nvert[k+1][j][i]-1.0)*1001);
2905 ucor[k][j][i].z -= sqrt(zet[k][j][i].x * zet[k][j][i].x +
2906 zet[k][j][i].y * zet[k][j][i].y +
2907 zet[k][j][i].z * zet[k][j][i].z) *
2911 ucor[k][j][i].z -= sqrt(zet[k][j][i].x * zet[k][j][i].x +
2912 zet[k][j][i].y * zet[k][j][i].y +
2913 zet[k][j][i].z * zet[k][j][i].z) *
2919 if (nvert[k][j][i] > 0.1 && nvert[k][j][i] < ibmval) {
2920 if (nvert[k][j][i+1] < 0.1 && i < xend) {
2921 if (fabs(ucor[k][j][i].x)>epsilon) {
2923 ucor[k][j][i].x += correction*fabs(ucor[k][j][i].x)/
2924 sqrt(csi[k][j][i].x * csi[k][j][i].x +
2925 csi[k][j][i].y * csi[k][j][i].y +
2926 csi[k][j][i].z * csi[k][j][i].z);
2928 ucor[k][j][i].x += correction*fabs(ucor[k][j][i].x);
2929 else if (NumberOfBodies > 1) {
2930 ibi=(int)((nvert[k][j][i]-1.0)*1001);
2931 ucor[k][j][i].x += sqrt(csi[k][j][i].x * csi[k][j][i].x +
2932 csi[k][j][i].y * csi[k][j][i].y +
2933 csi[k][j][i].z * csi[k][j][i].z) *
2937 ucor[k][j][i].x += sqrt(csi[k][j][i].x * csi[k][j][i].x +
2938 csi[k][j][i].y * csi[k][j][i].y +
2939 csi[k][j][i].z * csi[k][j][i].z) *
2943 if (nvert[k][j+1][i] < 0.1 && j < yend) {
2944 if (fabs(ucor[k][j][i].y)>epsilon) {
2946 ucor[k][j][i].y +=correction*fabs(ucor[k][j][i].y)/
2947 sqrt(eta[k][j][i].x * eta[k][j][i].x +
2948 eta[k][j][i].y * eta[k][j][i].y +
2949 eta[k][j][i].z * eta[k][j][i].z);
2951 ucor[k][j][i].y +=correction*fabs(ucor[k][j][i].y);
2952 else if (NumberOfBodies > 1) {
2953 ibi=(int)((nvert[k][j][i]-1.0)*1001);
2954 ucor[k][j][i].y += sqrt(eta[k][j][i].x * eta[k][j][i].x +
2955 eta[k][j][i].y * eta[k][j][i].y +
2956 eta[k][j][i].z * eta[k][j][i].z) *
2960 ucor[k][j][i].y += sqrt(eta[k][j][i].x * eta[k][j][i].x +
2961 eta[k][j][i].y * eta[k][j][i].y +
2962 eta[k][j][i].z * eta[k][j][i].z) *
2966 if (nvert[k+1][j][i] < 0.1 && k < zend) {
2967 if (fabs(ucor[k][j][i].z)>epsilon) {
2969 ucor[k][j][i].z += correction*fabs(ucor[k][j][i].z)/
2970 sqrt(zet[k][j][i].x * zet[k][j][i].x +
2971 zet[k][j][i].y * zet[k][j][i].y +
2972 zet[k][j][i].z * zet[k][j][i].z);
2974 ucor[k][j][i].z += correction*fabs(ucor[k][j][i].z);
2975 else if (NumberOfBodies > 1) {
2976 ibi=(int)((nvert[k][j][i]-1.0)*1001);
2977 ucor[k][j][i].z += sqrt(zet[k][j][i].x * zet[k][j][i].x +
2978 zet[k][j][i].y * zet[k][j][i].y +
2979 zet[k][j][i].z * zet[k][j][i].z) *
2983 ucor[k][j][i].z += sqrt(zet[k][j][i].x * zet[k][j][i].x +
2984 zet[k][j][i].y * zet[k][j][i].y +
2985 zet[k][j][i].z * zet[k][j][i].z) *
3003 for (k=lzs; k<lze; k++) {
3004 for (j=lys; j<lye; j++) {
3005 for (i=lxs; i<lxe; i++) {
3006 if (nvert[k][j][i] < 0.1) {
3007 if (nvert[k][j][i+1] > 0.1 && nvert[k][j][i+1] < ibmval && i < xend) {
3008 libm_Flux += ucor[k][j][i].x;
3009 libm_area += sqrt(csi[k][j][i].x * csi[k][j][i].x +
3010 csi[k][j][i].y * csi[k][j][i].y +
3011 csi[k][j][i].z * csi[k][j][i].z);
3014 if (nvert[k][j+1][i] > 0.1 && nvert[k][j+1][i] < ibmval && j < yend) {
3015 libm_Flux += ucor[k][j][i].y;
3016 libm_area += sqrt(eta[k][j][i].x * eta[k][j][i].x +
3017 eta[k][j][i].y * eta[k][j][i].y +
3018 eta[k][j][i].z * eta[k][j][i].z);
3020 if (nvert[k+1][j][i] > 0.1 && nvert[k+1][j][i] < ibmval && k < zend) {
3021 libm_Flux += ucor[k][j][i].z;
3022 libm_area += sqrt(zet[k][j][i].x * zet[k][j][i].x +
3023 zet[k][j][i].y * zet[k][j][i].y +
3024 zet[k][j][i].z * zet[k][j][i].z);
3028 if (nvert[k][j][i] > 0.1 && nvert[k][j][i] < ibmval) {
3029 if (nvert[k][j][i+1] < 0.1 && i < xend) {
3030 libm_Flux -= ucor[k][j][i].x;
3031 libm_area += sqrt(csi[k][j][i].x * csi[k][j][i].x +
3032 csi[k][j][i].y * csi[k][j][i].y +
3033 csi[k][j][i].z * csi[k][j][i].z);
3036 if (nvert[k][j+1][i] < 0.1 && j < yend) {
3037 libm_Flux -= ucor[k][j][i].y;
3038 libm_area += sqrt(eta[k][j][i].x * eta[k][j][i].x +
3039 eta[k][j][i].y * eta[k][j][i].y +
3040 eta[k][j][i].z * eta[k][j][i].z);
3042 if (nvert[k+1][j][i] < 0.1 && k < zend) {
3043 libm_Flux -= ucor[k][j][i].z;
3044 libm_area += sqrt(zet[k][j][i].x * zet[k][j][i].x +
3045 zet[k][j][i].y * zet[k][j][i].y +
3046 zet[k][j][i].z * zet[k][j][i].z);
3054 MPI_Allreduce(&libm_Flux, ibm_Flux,1,MPI_DOUBLE,MPI_SUM, PETSC_COMM_WORLD);
3055 MPI_Allreduce(&libm_area, ibm_Area,1,MPI_DOUBLE,MPI_SUM, PETSC_COMM_WORLD);
3065 for (k=lzs; k<lze; k++) {
3066 for (j=lys; j<lye; j++) {
3068 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;
3079 for (k=lzs; k<lze; k++) {
3080 for (i=lxs; i<lxe; i++) {
3082 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;
3092 for (j=lys; j<lye; j++) {
3093 for (i=lxs; i<lxe; i++) {
3095 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;
3103 DMDAVecRestoreArray(da, user->
lNvert, &nvert);
3104 DMDAVecRestoreArray(fda, user->
lCsi, &csi);
3105 DMDAVecRestoreArray(fda, user->
lEta, &eta);
3106 DMDAVecRestoreArray(fda, user->
lZet, &zet);
3107 DMDAVecRestoreArray(fda, user->
Ucont, &ucor);
3109 DMGlobalToLocalBegin(fda, user->
Ucont, INSERT_VALUES, user->
lUcont);
3110 DMGlobalToLocalEnd(fda, user->
Ucont, INSERT_VALUES, user->
lUcont);
3114 DMDAVecGetArray(fda, user->
lUcont, &lucor);
3115 DMDAVecGetArray(fda, user->
Ucont, &ucor);
3120 for (k=zs; k<ze; k++) {
3121 for (j=ys; j<ye; j++) {
3122 if(j>0 && k>0 && j<user->JM && k<user->KM){
3123 ucor[k][j][i].x=lucor[k][j][i-2].x;
3132 for (k=zs; k<ze; k++) {
3133 for (i=xs; i<xe; i++) {
3134 if(i>0 && k>0 && i<user->IM && k<user->KM){
3135 ucor[k][j][i].y=lucor[k][j-2][i].y;
3144 for (j=ys; j<ye; j++) {
3145 for (i=xs; i<xe; i++) {
3146 if(i>0 && j>0 && i<user->IM && j<user->JM){
3147 ucor[k][j][i].z=lucor[k-2][j][i].z;
3153 DMDAVecRestoreArray(fda, user->
lUcont, &lucor);
3154 DMDAVecRestoreArray(fda, user->
Ucont, &ucor);
3158 DMGlobalToLocalBegin(user->
fda, user->
Ucont, INSERT_VALUES, user->
lUcont);
3159 DMGlobalToLocalEnd(user->
fda, user->
Ucont, INSERT_VALUES, user->
lUcont);
3161 if (NumberOfBodies > 1) {
3381 const PetscInt immersed = simCtx->
immersed;
3382 const PetscInt MHV = simCtx->
MHV;
3383 const PetscInt LV = simCtx->
LV;
3384 PetscMPIInt rank = simCtx->
rank;
3387 PetscErrorCode ierr;
3394 PetscFunctionBeginUser;
3398 for (bi = 0; bi < block_number; bi++) {
3405 for (l = usermg->
mglevels - 1; l > 0; l--) {
3411 user = mgctx[l].
user;
3412 ierr = PetscMalloc1(user[bi].info.mx * user[bi].
info.my * 2, &user[bi].
KSKE); CHKERRQ(ierr);
3418 user = mgctx[l].
user;
3424 ierr = VecDuplicate(user[bi].P, &user[bi].B); CHKERRQ(ierr);
3426 PetscReal ibm_Flux, ibm_Area;
3427 PetscInt flg = immersed - 1;
3430 VolumeFlux(&user[bi], &ibm_Flux, &ibm_Area, flg);
3432 flg = ((MHV > 1 || LV) && bi == 0) ? 1 : 0;
3440 for (l = usermg->
mglevels - 1; l >= 0; l--) {
3441 user = mgctx[l].
user;
3449 ierr = KSPCreate(PETSC_COMM_WORLD, &mgksp); CHKERRQ(ierr);
3450 ierr = KSPAppendOptionsPrefix(mgksp,
"ps_"); CHKERRQ(ierr);
3455 PetscBool has_monitor_option;
3458 ierr = PetscNew(&monctx); CHKERRQ(ierr);
3466 sprintf(filen,
"%s/Poisson_Solver_Convergence_History_Block_%d.log", simCtx->
log_dir,bi);
3475 PetscFPrintf(PETSC_COMM_SELF, monctx->
file_handle,
"--- Convergence for Timestep %d, Block %d ---\n", (
int)simCtx->
step, bi);
3477 SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_FILE_OPEN,
"Could not open KSP monitor log file: %s", filen);
3481 ierr = PetscOptionsHasName(NULL, NULL,
"-ps_ksp_pic_monitor_true_residual", &has_monitor_option); CHKERRQ(ierr);
3487 ierr = KSPGetPC(mgksp, &mgpc); CHKERRQ(ierr);
3488 ierr = PCSetType(mgpc, PCMG); CHKERRQ(ierr);
3490 ierr = PCMGSetLevels(mgpc, usermg->
mglevels, PETSC_NULL); CHKERRQ(ierr);
3491 ierr = PCMGSetCycleType(mgpc, PC_MG_CYCLE_V); CHKERRQ(ierr);
3492 ierr = PCMGSetType(mgpc, PC_MG_MULTIPLICATIVE); CHKERRQ(ierr);
3495 for (l = usermg->
mglevels - 1; l > 0; l--) {
3504 coarse_user_ctx->
da_f = &(fine_user_ctx->
da);
3505 coarse_user_ctx->
user_f = fine_user_ctx;
3508 fine_user_ctx->
da_c = &(coarse_user_ctx->
da);
3509 fine_user_ctx->
user_c = coarse_user_ctx;
3513 PetscInt m_c = (coarse_user_ctx->
info.xm * coarse_user_ctx->
info.ym * coarse_user_ctx->
info.zm);
3514 PetscInt m_f = (fine_user_ctx->
info.xm * fine_user_ctx->
info.ym * fine_user_ctx->
info.zm);
3515 PetscInt M_c = (coarse_user_ctx->
info.mx * coarse_user_ctx->
info.my * coarse_user_ctx->
info.mz);
3516 PetscInt M_f = (fine_user_ctx->
info.mx * fine_user_ctx->
info.my * fine_user_ctx->
info.mz);
3521 ierr = MatCreateShell(PETSC_COMM_WORLD, m_c, m_f, M_c, M_f, (
void*)coarse_user_ctx, &fine_user_ctx->
MR); CHKERRQ(ierr);
3524 ierr = MatCreateShell(PETSC_COMM_WORLD, m_f, m_c, M_f, M_c, (
void*)fine_user_ctx, &fine_user_ctx->
MP); CHKERRQ(ierr);
3528 ierr = MatShellSetOperation(fine_user_ctx->
MP, MATOP_MULT, (
void(*)(
void))
MyInterpolation); CHKERRQ(ierr);
3531 ierr = PCMGSetRestriction(mgpc, l, fine_user_ctx->
MR); CHKERRQ(ierr);
3532 ierr = PCMGSetInterpolation(mgpc, l, fine_user_ctx->
MP); CHKERRQ(ierr);
3537 for (l = usermg->
mglevels - 1; l >= 0; l--) {
3538 user = mgctx[l].
user;
3540 ierr = PCMGGetSmoother(mgpc, l, &subksp); CHKERRQ(ierr);
3542 ierr = PCMGGetCoarseSolve(mgpc, &subksp); CHKERRQ(ierr);
3543 ierr = KSPSetTolerances(subksp, 1.e-8, PETSC_DEFAULT, PETSC_DEFAULT, 40); CHKERRQ(ierr);
3546 ierr = KSPSetOperators(subksp, user[bi].A, user[bi].A); CHKERRQ(ierr);
3547 ierr = KSPSetFromOptions(subksp); CHKERRQ(ierr);
3548 ierr = KSPGetPC(subksp, &subpc); CHKERRQ(ierr);
3549 ierr = PCSetType(subpc, PCBJACOBI); CHKERRQ(ierr);
3557 ierr = KSPSetUp(subksp); CHKERRQ(ierr);
3558 ierr = PCBJacobiGetSubKSP(subpc, &nlocal, NULL, &subsubksp); CHKERRQ(ierr);
3560 for (PetscInt abi = 0; abi < nlocal; abi++) {
3561 ierr = KSPGetPC(subsubksp[abi], &subsubpc); CHKERRQ(ierr);
3563 ierr = PCFactorSetShiftAmount(subsubpc, 1.e-10); CHKERRQ(ierr);
3566 ierr = MatNullSpaceCreate(PETSC_COMM_WORLD, PETSC_TRUE, 0, PETSC_NULL, &user[bi].nullsp); CHKERRQ(ierr);
3568 ierr = MatSetNullSpace(user[bi].A, user[bi].nullsp); CHKERRQ(ierr);
3570 ierr = PCMGSetResidual(mgpc, l, PCMGResidualDefault, user[bi].A); CHKERRQ(ierr);
3571 ierr = KSPSetUp(subksp); CHKERRQ(ierr);
3573 if (l < usermg->mglevels - 1) {
3574 ierr = MatCreateVecs(user[bi].A, &user[bi].R, PETSC_NULL); CHKERRQ(ierr);
3575 ierr = PCMGSetRhs(mgpc, l, user[bi].R); CHKERRQ(ierr);
3581 user = mgctx[l].
user;
3584 ierr = KSPSetOperators(mgksp, user[bi].A, user[bi].A); CHKERRQ(ierr);
3585 ierr = MatSetNullSpace(user[bi].A, user[bi].nullsp); CHKERRQ(ierr);
3586 ierr = KSPSetFromOptions(mgksp); CHKERRQ(ierr);
3587 ierr = KSPSetUp(mgksp); CHKERRQ(ierr);
3588 ierr = KSPSolve(mgksp, user[bi].B, user[bi].Phi); CHKERRQ(ierr);
3591 for (l = usermg->
mglevels - 1; l >= 0; l--) {
3592 user = mgctx[l].
user;
3593 MatNullSpaceDestroy(&user[bi].nullsp);
3594 MatDestroy(&user[bi].A);
3597 MatDestroy(&user[bi].MR);
3598 MatDestroy(&user[bi].MP);
3599 }
else if (l==0 && immersed) {
3600 PetscFree(user[bi].KSKE);
3602 if (l < usermg->mglevels - 1) {
3603 VecDestroy(&user[bi].R);
3614 PetscFunctionReturn(0);