112 PetscFunctionBeginUser;
115 char drivenDirection =
' ';
116 for (
int i = 0; i < 6; i++) {
131 if (drivenDirection ==
' ') {
132 PetscFunctionReturn(0);
135 LOG_ALLOW(
LOCAL,
LOG_DEBUG,
"Rank %d, Block %d: Starting channel flux profile correction in '%c' direction...\n",
136 simCtx->
rank, user->
_this, drivenDirection);
139 DMDALocalInfo info = user->
info;
141 PetscInt mx = info.mx, my = info.my, mz = info.mz;
142 PetscInt lxs = (info.xs == 0) ? 1 : info.xs;
143 PetscInt lys = (info.ys == 0) ? 1 : info.ys;
144 PetscInt lzs = (info.zs == 0) ? 1 : info.zs;
145 PetscInt lxe = (info.xs + info.xm == mx) ? mx - 1 : info.xs + info.xm;
146 PetscInt lye = (info.ys + info.ym == my) ? my - 1 : info.ys + info.ym;
147 PetscInt lze = (info.zs + info.zm == mz) ? mz - 1 : info.zs + info.zm;
149 Cmpnts ***ucont, ***csi, ***eta, ***zet;
151 ierr = DMDAVecGetArray(user->
fda, user->
lUcont, &ucont); CHKERRQ(ierr);
152 ierr = DMDAVecGetArrayRead(user->
fda, user->
lCsi, (
const Cmpnts***)&csi); CHKERRQ(ierr);
153 ierr = DMDAVecGetArrayRead(user->
fda, user->
lEta, (
const Cmpnts***)&eta); CHKERRQ(ierr);
154 ierr = DMDAVecGetArrayRead(user->
fda, user->
lZet, (
const Cmpnts***)&zet); CHKERRQ(ierr);
155 ierr = DMDAVecGetArrayRead(user->
da, user->
lNvert, (
const PetscReal***)&nvert); CHKERRQ(ierr);
158 PetscInt n_planes = 0;
159 switch (drivenDirection) {
160 case 'X': n_planes = mx - 1;
break;
161 case 'Y': n_planes = my - 1;
break;
162 case 'Z': n_planes = mz - 1;
break;
165 PetscReal *localFluxProfile, *globalFluxProfile, *correctionProfile;
166 ierr = PetscMalloc1(n_planes, &localFluxProfile); CHKERRQ(ierr);
167 ierr = PetscMalloc1(n_planes, &globalFluxProfile); CHKERRQ(ierr);
168 ierr = PetscMalloc1(n_planes, &correctionProfile); CHKERRQ(ierr);
169 ierr = PetscMemzero(localFluxProfile, n_planes *
sizeof(PetscReal)); CHKERRQ(ierr);
172 PetscReal localArea = 0.0, globalArea = 0.0;
174 switch (drivenDirection) {
178 for (k = lzs; k < lze; k++)
for (j = lys; j < lye; j++) {
179 if (nvert[k][j][i + 1] < 0.1)
180 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);
183 for (i = info.xs; i < lxe; i++) {
184 for (k = lzs; k < lze; k++)
for (j = lys; j < lye; j++) {
185 if (nvert[k][j][i + 1] < 0.1) localFluxProfile[i] += ucont[k][j][i].
x;
192 for (k = lzs; k < lze; k++)
for (i = lxs; i < lxe; i++) {
193 if (nvert[k][j + 1][i] < 0.1)
194 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);
197 for (j = info.ys; j < lye; j++) {
198 for (k = lzs; k < lze; k++)
for (i = lxs; i < lxe; i++) {
199 if (nvert[k][j + 1][i] < 0.1) localFluxProfile[j] += ucont[k][j][i].
y;
206 for (j = lys; j < lye; j++)
for (i = lxs; i < lxe; i++) {
207 if (nvert[k + 1][j][i] < 0.1)
208 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);
211 for (k = info.zs; k < lze; k++) {
212 for (j = lys; j < lye; j++)
for (i = lxs; i < lxe; i++) {
213 if (nvert[k + 1][j][i] < 0.1) localFluxProfile[k] += ucont[k][j][i].
z;
219 ierr = MPI_Allreduce(&localArea, &globalArea, 1, MPI_DOUBLE, MPI_SUM, PETSC_COMM_WORLD); CHKERRQ(ierr);
220 ierr = MPI_Allreduce(localFluxProfile, globalFluxProfile, n_planes, MPI_DOUBLE, MPI_SUM, PETSC_COMM_WORLD); CHKERRQ(ierr);
224 if (globalArea > 1.0e-12) {
225 for (i = 0; i < n_planes; i++) {
226 correctionProfile[i] = (targetFlux - globalFluxProfile[i]) / globalArea;
229 ierr = PetscMemzero(correctionProfile, n_planes *
sizeof(PetscReal)); CHKERRQ(ierr);
234 LOG_ALLOW(
GLOBAL,
LOG_INFO,
" - Measured Flux at plane 0: %.6e (Correction Velocity: %.6e)\n", globalFluxProfile[0], correctionProfile[0]);
235 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]);
280 ierr = PetscFree(localFluxProfile); CHKERRQ(ierr);
281 ierr = PetscFree(globalFluxProfile); CHKERRQ(ierr);
282 ierr = PetscFree(correctionProfile); CHKERRQ(ierr);
284 ierr = DMDAVecRestoreArray(user->
fda, user->
lUcont, &ucont); CHKERRQ(ierr);
285 ierr = DMDAVecRestoreArrayRead(user->
fda, user->
lCsi, (
const Cmpnts***)&csi); CHKERRQ(ierr);
286 ierr = DMDAVecRestoreArrayRead(user->
fda, user->
lEta, (
const Cmpnts***)&eta); CHKERRQ(ierr);
287 ierr = DMDAVecRestoreArrayRead(user->
fda, user->
lZet, (
const Cmpnts***)&zet); CHKERRQ(ierr);
288 ierr = DMDAVecRestoreArrayRead(user->
da, user->
lNvert, (
const PetscReal***)&nvert); CHKERRQ(ierr);
293 PetscFunctionReturn(0);
332 PetscFunctionBeginUser;
342 DM da = user->
da, fda = user->
fda;
343 DMDALocalInfo info = user->
info;
346 PetscInt mx = info.mx, my = info.my, mz = info.mz;
347 PetscInt xs = info.xs, xe = info.xs + info.xm;
348 PetscInt ys = info.ys, ye = info.ys + info.ym;
349 PetscInt zs = info.zs, ze = info.zs + info.zm;
352 PetscInt lxs = (xs == 0) ? xs + 1 : xs;
353 PetscInt lxe = (xe == mx) ? xe - 1 : xe;
354 PetscInt lys = (ys == 0) ? ys + 1 : ys;
355 PetscInt lye = (ye == my) ? ye - 1 : ye;
356 PetscInt lzs = (zs == 0) ? zs + 1 : zs;
357 PetscInt lze = (ze == mz) ? ze - 1 : ze;
360 Cmpnts ***icsi, ***ieta, ***izet, ***jcsi, ***jeta, ***jzet, ***kcsi, ***keta, ***kzet;
361 PetscReal ***iaj, ***jaj, ***kaj, ***p, ***nvert;
363 DMDAVecGetArray(fda, user->
lICsi, &icsi); DMDAVecGetArray(fda, user->
lIEta, &ieta); DMDAVecGetArray(fda, user->
lIZet, &izet);
364 DMDAVecGetArray(fda, user->
lJCsi, &jcsi); DMDAVecGetArray(fda, user->
lJEta, &jeta); DMDAVecGetArray(fda, user->
lJZet, &jzet);
365 DMDAVecGetArray(fda, user->
lKCsi, &kcsi); DMDAVecGetArray(fda, user->
lKEta, &keta); DMDAVecGetArray(fda, user->
lKZet, &kzet);
366 DMDAVecGetArray(da, user->
lIAj, &iaj); DMDAVecGetArray(da, user->
lJAj, &jaj); DMDAVecGetArray(da, user->
lKAj, &kaj);
367 DMDAVecGetArray(da, user->
lNvert, &nvert);
368 DMDAVecGetArray(da, user->
lPhi, &p);
370 DMDAVecGetArray(fda, user->
Ucont, &ucont);
373 const PetscReal IBM_FLUID_THRESHOLD = 0.1;
384 for (PetscInt k = lzs; k < lze; k++) {
385 for (PetscInt j = lys; j < lye; j++) {
386 for (PetscInt i = lxs; i < lxe; i++) {
392 if (!(nvert[k][j][i] > IBM_FLUID_THRESHOLD || nvert[k][j][i + 1] > IBM_FLUID_THRESHOLD)) {
395 PetscReal dpdc = p[k][j][i + 1] - p[k][j][i];
396 PetscReal dpde = 0.0, dpdz = 0.0;
401 dpde = (p[k][j][i] + p[k][j][i+1] -
402 p[k][j-1][i] - p[k][j-1][i+1]) * 0.5;
407 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; }
411 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; }
415 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; }
418 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; }
426 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; }
430 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; }
434 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; }
437 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; }
443 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
444 + icsi[k][j][i].
z * icsi[k][j][i].
z) * iaj[k][j][i] +
445 dpde * (ieta[k][j][i].x * icsi[k][j][i].x + ieta[k][j][i].y * icsi[k][j][i].y
446 + ieta[k][j][i].z * icsi[k][j][i].z) * iaj[k][j][i] +
447 dpdz * (izet[k][j][i].
x * icsi[k][j][i].
x + izet[k][j][i].
y * icsi[k][j][i].
y
448 + izet[k][j][i].
z * icsi[k][j][i].
z) * iaj[k][j][i]);
450 PetscReal correction = grad_p_x*scale;
452 ucont[k][j][i].
x -= correction;
460 if (!(nvert[k][j][i] > IBM_FLUID_THRESHOLD || nvert[k][j + 1][i] > IBM_FLUID_THRESHOLD)) {
461 PetscReal dpdc = 0.0, dpde = 0.0, dpdz = 0.0;
462 dpde = p[k][j + 1][i] - p[k][j][i];
468 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; }
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; }
472 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; }
473 }
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; }
479 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; }
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; }
483 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; }
484 }
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; }
486 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] +
487 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] +
488 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]);
490 PetscReal correction = grad_p_y*scale;
492 ucont[k][j][i].
y -= correction;
499 if (!(nvert[k][j][i] > IBM_FLUID_THRESHOLD || nvert[k + 1][j][i] > IBM_FLUID_THRESHOLD)) {
500 PetscReal dpdc = 0.0, dpde = 0.0, dpdz = 0.0;
501 dpdz = p[k + 1][j][i] - p[k][j][i];
507 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; }
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; }
511 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; }
512 }
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; }
518 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; }
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; }
522 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; }
523 }
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; }
525 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] +
526 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] +
527 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]);
531 "[k=%d, j=%d, i=%d] ---- Neighbor Pressures ----\n"
532 " Central Z-Neighbors: p[k+1][j][i] = %g | p[k][j][i] = %g\n"
533 " 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"
534 " 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",
536 p[k + 1][j][i], p[k][j][i],
537 p[k][j - 1][i], p[k + 1][j - 1][i], p[k][j + 1][i], p[k + 1][j + 1][i],
538 p[k][j][i - 1], p[k + 1][j][i - 1], p[k][j][i + 1], p[k + 1][j][i + 1]);
542 PetscReal correction = grad_p_z*scale;
544 ucont[k][j][i].
z -= correction;
555 for (PetscInt k=lzs; k<lze; k++) {
556 for (PetscInt j=lys; j<lye; j++) {
559 PetscReal dpdc = p[k][j][i+1] - p[k][j][i];
566 dpde = (p[k][j ][i] + p[k][j ][i+1] -
567 p[k][j-1][i] - p[k][j-1][i+1]) * 0.5;
571 if (nvert[k][j-1][i] + nvert[k][j-1][i+1] < 0.1) {
572 dpde = (p[k][j ][i] + p[k][j ][i+1] -
573 p[k][j-1][i] - p[k][j-1][i+1]) * 0.5;
577 if (nvert[k][j+1][i] + nvert[k][j+1][i+1] < 0.1) {
578 dpde = (p[k][j+1][i] + p[k][j+1][i+1] -
579 p[k][j ][i] - p[k][j ][i+1]) * 0.5;
583 if (nvert[k][j+1][i] + nvert[k][j+1][i+1] < 0.1) {
584 dpde = (p[k][j+1][i] + p[k][j+1][i+1] -
585 p[k][j ][i] - p[k][j ][i+1]) * 0.5;
589 dpde = (p[k][j+1][i] + p[k][j+1][i+1] -
590 p[k][j-1][i] - p[k][j-1][i+1]) * 0.25;
595 dpdz = (p[k ][j][i] + p[k ][j][i+1] -
596 p[k-1][j][i] - p[k-1][j][i+1]) * 0.5;
600 if (nvert[k-1][j][i] + nvert[k-1][j][i+1] < 0.1) {
601 dpdz = (p[k ][j][i] + p[k ][j][i+1] -
602 p[k-1][j][i] - p[k-1][j][i+1]) * 0.5;
606 if (nvert[k+1][j][i] + nvert[k+1][j][i+1] < 0.1) {
607 dpdz = (p[k+1][j][i] + p[k+1][j][i+1] -
608 p[k ][j][i] - p[k ][j][i+1]) * 0.5;
612 if (nvert[k+1][j][i] + nvert[k+1][j][i+1] < 0.1) {
613 dpdz = (p[k+1][j][i] + p[k+1][j][i+1] -
614 p[k ][j][i] - p[k ][j][i+1]) * 0.5;
618 dpdz = (p[k+1][j][i] + p[k+1][j][i+1] -
619 p[k-1][j][i] - p[k-1][j][i+1]) * 0.25;
624 if (!(nvert[k][j][i] + nvert[k][j][i+1])) {
626 (dpdc * (icsi[k][j][i].
x * icsi[k][j][i].
x +
627 icsi[k][j][i].
y * icsi[k][j][i].
y +
628 icsi[k][j][i].
z * icsi[k][j][i].
z) * iaj[k][j][i] +
629 dpde * (ieta[k][j][i].x * icsi[k][j][i].x +
630 ieta[k][j][i].y * icsi[k][j][i].y +
631 ieta[k][j][i].z * icsi[k][j][i].z) * iaj[k][j][i] +
632 dpdz * (izet[k][j][i].
x * icsi[k][j][i].
x +
633 izet[k][j][i].
y * icsi[k][j][i].
y +
634 izet[k][j][i].
z * icsi[k][j][i].
z) * iaj[k][j][i])
643 for (PetscInt k=lzs; k<lze; k++) {
644 for (PetscInt i=lxs; i<lxe; i++) {
651 dpdc = (p[k][j][i ] + p[k][j+1][i ] -
652 p[k][j][i-1] - p[k][j+1][i-1]) * 0.5;
656 if (nvert[k][j][i-1] + nvert[k][j+1][i-1] < 0.1) {
657 dpdc = (p[k][j][i ] + p[k][j+1][i ] -
658 p[k][j][i-1] - p[k][j+1][i-1]) * 0.5;
662 if (nvert[k][j][i+1] + nvert[k][j+1][i+1] < 0.1) {
663 dpdc = (p[k][j][i+1] + p[k][j+1][i+1] -
664 p[k][j][i ] - p[k][j+1][i ]) * 0.5;
668 if (nvert[k][j][i+1] + nvert[k][j+1][i+1] < 0.1) {
669 dpdc = (p[k][j][i+1] + p[k][j+1][i+1] -
670 p[k][j][i ] - p[k][j+1][i ]) * 0.5;
674 dpdc = (p[k][j][i+1] + p[k][j+1][i+1] -
675 p[k][j][i-1] - p[k][j+1][i-1]) * 0.25;
678 PetscReal dpde = p[k][j+1][i] - p[k][j][i];
682 dpdz = (p[k ][j][i] + p[k ][j+1][i] -
683 p[k-1][j][i] - p[k-1][j+1][i]) * 0.5;
687 if (nvert[k-1][j][i] + nvert[k-1][j+1][i] < 0.1) {
688 dpdz = (p[k ][j][i] + p[k ][j+1][i] -
689 p[k-1][j][i] - p[k-1][j+1][i]) * 0.5;
693 if (nvert[k+1][j][i] + nvert[k+1][j+1][i] < 0.1) {
694 dpdz = (p[k+1][j][i] + p[k+1][j+1][i] -
695 p[k ][j][i] - p[k ][j+1][i]) * 0.5;
699 if (nvert[k+1][j][i] + nvert[k+1][j+1][i] < 0.1) {
700 dpdz = (p[k+1][j][i] + p[k+1][j+1][i] -
701 p[k ][j][i] - p[k ][j+1][i]) * 0.5;
705 dpdz = (p[k+1][j][i] + p[k+1][j+1][i] -
706 p[k-1][j][i] - p[k-1][j+1][i]) * 0.25;
709 if (!(nvert[k][j][i] + nvert[k][j+1][i])) {
711 (dpdc * (jcsi[k][j][i].
x * jeta[k][j][i].
x +
712 jcsi[k][j][i].
y * jeta[k][j][i].
y +
713 jcsi[k][j][i].
z * jeta[k][j][i].
z) * jaj[k][j][i] +
714 dpde * (jeta[k][j][i].x * jeta[k][j][i].x +
715 jeta[k][j][i].y * jeta[k][j][i].y +
716 jeta[k][j][i].z * jeta[k][j][i].z) * jaj[k][j][i] +
717 dpdz * (jzet[k][j][i].
x * jeta[k][j][i].
x +
718 jzet[k][j][i].
y * jeta[k][j][i].
y +
719 jzet[k][j][i].
z * jeta[k][j][i].
z) * jaj[k][j][i])
727 for (PetscInt j=lys; j<lye; j++) {
728 for (PetscInt i=lxs; i<lxe; i++) {
736 dpdc = (p[k][j][i ] + p[k+1][j][i ] -
737 p[k][j][i-1] - p[k+1][j][i-1]) * 0.5;
741 if (nvert[k][j][i-1] + nvert[k+1][j][i-1] < 0.1) {
742 dpdc = (p[k][j][i ] + p[k+1][j][i ] -
743 p[k][j][i-1] - p[k+1][j][i-1]) * 0.5;
747 if (nvert[k][j][i+1] + nvert[k+1][j][i+1] < 0.1) {
748 dpdc = (p[k][j][i+1] + p[k+1][j][i+1] -
749 p[k][j][i ] - p[k+1][j][i ]) * 0.5;
753 if (nvert[k][j][i+1] + nvert[k+1][j][i+1] < 0.1) {
754 dpdc = (p[k][j][i+1] + p[k+1][j][i+1] -
755 p[k][j][i ] - p[k+1][j][i ]) * 0.5;
759 dpdc = (p[k][j][i+1] + p[k+1][j][i+1] -
760 p[k][j][i-1] - p[k+1][j][i-1]) * 0.25;
765 dpde = (p[k][j ][i] + p[k+1][j ][i] -
766 p[k][j-1][i] - p[k+1][j-1][i]) * 0.5;
770 if (nvert[k][j-1][i] + nvert[k+1][j-1][i] < 0.1) {
771 dpde = (p[k][j ][i] + p[k+1][j ][i] -
772 p[k][j-1][i] - p[k+1][j-1][i]) * 0.5;
776 if (nvert[k][j+1][i] + nvert[k+1][j+1][i] < 0.1) {
777 dpde = (p[k][j+1][i] + p[k+1][j+1][i] -
778 p[k][j ][i] - p[k+1][j ][i]) * 0.5;
782 if (nvert[k][j+1][i] + nvert[k+1][j+1][i] < 0.1) {
783 dpde = (p[k][j+1][i] + p[k+1][j+1][i] -
784 p[k][j ][i] - p[k+1][j ][i]) * 0.5;
788 dpde = (p[k][j+1][i] + p[k+1][j+1][i] -
789 p[k][j-1][i] - p[k+1][j-1][i]) * 0.25;
792 PetscReal dpdz = p[k+1][j][i] - p[k][j][i];
794 if (!(nvert[k][j][i] + nvert[k+1][j][i])) {
797 (dpdc * (kcsi[k][j][i].
x * kzet[k][j][i].
x +
798 kcsi[k][j][i].
y * kzet[k][j][i].
y +
799 kcsi[k][j][i].
z * kzet[k][j][i].
z) * kaj[k][j][i] +
800 dpde * (keta[k][j][i].x * kzet[k][j][i].x +
801 keta[k][j][i].y * kzet[k][j][i].y +
802 keta[k][j][i].z * kzet[k][j][i].z) * kaj[k][j][i] +
803 dpdz * (kzet[k][j][i].
x * kzet[k][j][i].
x +
804 kzet[k][j][i].
y * kzet[k][j][i].
y +
805 kzet[k][j][i].
z * kzet[k][j][i].
z) * kaj[k][j][i])
821 DMDAVecRestoreArray(fda, user->
Ucont, &ucont);
824 DMDAVecRestoreArray(fda, user->
lICsi, &icsi); DMDAVecRestoreArray(fda, user->
lIEta, &ieta); DMDAVecRestoreArray(fda, user->
lIZet, &izet);
825 DMDAVecRestoreArray(fda, user->
lJCsi, &jcsi); DMDAVecRestoreArray(fda, user->
lJEta, &jeta); DMDAVecRestoreArray(fda, user->
lJZet, &jzet);
826 DMDAVecRestoreArray(fda, user->
lKCsi, &kcsi); DMDAVecRestoreArray(fda, user->
lKEta, &keta); DMDAVecRestoreArray(fda, user->
lKZet, &kzet);
827 DMDAVecRestoreArray(da, user->
lIAj, &iaj); DMDAVecRestoreArray(da, user->
lJAj, &jaj); DMDAVecRestoreArray(da, user->
lKAj, &kaj);
828 DMDAVecRestoreArray(da, user->
lPhi, &p);
829 DMDAVecRestoreArray(da, user->
lNvert, &nvert);
833 const char *staggered_fields[] = {
"Ucont"};
844 PetscFunctionReturn(0);
1426 PetscFunctionBeginUser;
1429 PetscErrorCode ierr;
1436 DM da = user->
da, fda = user->
fda;
1437 DMDALocalInfo info = user->
info;
1438 PetscInt IM = user->
IM, JM = user->
JM, KM = user->
KM;
1442 PetscInt mx = info.mx, my = info.my, mz = info.mz;
1443 PetscInt xs = info.xs, xe = info.xs + info.xm;
1444 PetscInt ys = info.ys, ye = info.ys + info.ym;
1445 PetscInt zs = info.zs, ze = info.zs + info.zm;
1446 PetscInt gxs = info.gxs, gxe = gxs + info.gxm;
1447 PetscInt gys = info.gys, gye = gys + info.gym;
1448 PetscInt gzs = info.gzs, gze = gzs + info.gzm;
1451 const PetscReal IBM_FLUID_THRESHOLD = 0.1;
1456 PetscInt N = mx * my * mz;
1458 VecGetLocalSize(user->
Phi, &M);
1460 MatCreateAIJ(PETSC_COMM_WORLD, M, M, N, N, 19, PETSC_NULLPTR, 19, PETSC_NULLPTR, &(user->
A));
1465 MatZeroEntries(user->
A);
1468 Cmpnts ***csi, ***eta, ***zet, ***icsi, ***ieta, ***izet, ***jcsi, ***jeta, ***jzet, ***kcsi, ***keta, ***kzet;
1469 PetscReal ***aj, ***iaj, ***jaj, ***kaj, ***nvert;
1470 DMDAVecGetArray(fda, user->
lCsi, &csi); DMDAVecGetArray(fda, user->
lEta, &eta); DMDAVecGetArray(fda, user->
lZet, &zet);
1471 DMDAVecGetArray(fda, user->
lICsi, &icsi); DMDAVecGetArray(fda, user->
lIEta, &ieta); DMDAVecGetArray(fda, user->
lIZet, &izet);
1472 DMDAVecGetArray(fda, user->
lJCsi, &jcsi); DMDAVecGetArray(fda, user->
lJEta, &jeta); DMDAVecGetArray(fda, user->
lJZet, &jzet);
1473 DMDAVecGetArray(fda, user->
lKCsi, &kcsi); DMDAVecGetArray(fda, user->
lKEta, &keta); DMDAVecGetArray(fda, user->
lKZet, &kzet);
1474 DMDAVecGetArray(da, user->
lAj, &aj); DMDAVecGetArray(da, user->
lIAj, &iaj); DMDAVecGetArray(da, user->
lJAj, &jaj); DMDAVecGetArray(da, user->
lKAj, &kaj);
1475 DMDAVecGetArray(da, user->
lNvert, &nvert);
1478 Vec G11, G12, G13, G21, G22, G23, G31, G32, G33;
1479 PetscReal ***g11, ***g12, ***g13, ***g21, ***g22, ***g23, ***g31, ***g32, ***g33;
1480 VecDuplicate(user->
lAj, &G11); VecDuplicate(user->
lAj, &G12); VecDuplicate(user->
lAj, &G13);
1481 VecDuplicate(user->
lAj, &G21); VecDuplicate(user->
lAj, &G22); VecDuplicate(user->
lAj, &G23);
1482 VecDuplicate(user->
lAj, &G31); VecDuplicate(user->
lAj, &G32); VecDuplicate(user->
lAj, &G33);
1483 DMDAVecGetArray(da, G11, &g11); DMDAVecGetArray(da, G12, &g12); DMDAVecGetArray(da, G13, &g13);
1484 DMDAVecGetArray(da, G21, &g21); DMDAVecGetArray(da, G22, &g22); DMDAVecGetArray(da, G23, &g23);
1485 DMDAVecGetArray(da, G31, &g31); DMDAVecGetArray(da, G32, &g32); DMDAVecGetArray(da, G33, &g33);
1491 for (k = gzs; k < gze; k++) {
1492 for (j = gys; j < gye; j++) {
1493 for (i = gxs; i < gxe; i++) {
1496 if(i>-1 && j>-1 && k>-1 && i<IM+1 && j<JM+1 && k<KM+1){
1497 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];
1498 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];
1499 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];
1500 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];
1501 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];
1502 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];
1503 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];
1504 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];
1505 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];
1517 PetscInt x_str, x_end, y_str, y_end, z_str, z_end;
1519 else { x_end = mx - 2; x_str = 1; }
1521 else { y_end = my - 2; y_str = 1; }
1523 else { z_end = mz - 2; z_str = 1; }
1526 for (k = zs; k < ze; k++) {
1527 for (j = ys; j < ye; j++) {
1528 for (i = xs; i < xe; i++) {
1529 PetscScalar vol[19];
1531 PetscInt row =
Gidx(i, j, k, user);
1536 if (i == 0 || i == mx - 1 || j == 0 || j == my - 1 || k == 0 || k == mz - 1 || nvert[k][j][i] > IBM_FLUID_THRESHOLD) {
1539 MatSetValues(user->
A, 1, &row, 1, &idx[
CP], &vol[
CP], INSERT_VALUES);
1543 for (PetscInt m = 0; m < 19; m++) {
1550 if (nvert[k][j][i + 1] < IBM_FLUID_THRESHOLD && i != x_end) {
1552 vol[
CP] -= g11[k][j][i];
1553 vol[
EP] += g11[k][j][i];
1560 vol[
CP] += g12[k][j][i] * 0.5; vol[
EP] += g12[k][j][i] * 0.5;
1561 vol[
SP] -= g12[k][j][i] * 0.5; vol[
SE] -= g12[k][j][i] * 0.5;
1565 if (nvert[k][j-1][i] + nvert[k][j-1][i+1] < 0.1) {
1566 vol[
CP] += g12[k][j][i] * 0.5; vol[
EP] += g12[k][j][i] * 0.5;
1567 vol[
SP] -= g12[k][j][i] * 0.5; vol[
SE] -= g12[k][j][i] * 0.5;
1571 if (nvert[k][j+1][i] + nvert[k][j+1][i+1] < 0.1) {
1572 vol[
NP] += g12[k][j][i] * 0.5; vol[
NE] += g12[k][j][i] * 0.5;
1573 vol[
CP] -= g12[k][j][i] * 0.5; vol[
EP] -= g12[k][j][i] * 0.5;
1577 if (nvert[k][j+1][i] + nvert[k][j+1][i+1] < 0.1) {
1578 vol[
NP] += g12[k][j][i] * 0.5; vol[
NE] += g12[k][j][i] * 0.5;
1579 vol[
CP] -= g12[k][j][i] * 0.5; vol[
EP] -= g12[k][j][i] * 0.5;
1583 vol[
NP] += g12[k][j][i] * 0.25; vol[
NE] += g12[k][j][i] * 0.25;
1584 vol[
SP] -= g12[k][j][i] * 0.25; vol[
SE] -= g12[k][j][i] * 0.25;
1590 vol[
CP] += g13[k][j][i] * 0.5; vol[
EP] += g13[k][j][i] * 0.5;
1591 vol[
BP] -= g13[k][j][i] * 0.5; vol[
BE] -= g13[k][j][i] * 0.5;
1595 if (nvert[k-1][j][i] + nvert[k-1][j][i+1] < 0.1) {
1596 vol[
CP] += g13[k][j][i] * 0.5; vol[
EP] += g13[k][j][i] * 0.5;
1597 vol[
BP] -= g13[k][j][i] * 0.5; vol[
BE] -= g13[k][j][i] * 0.5;
1601 if (nvert[k+1][j][i] + nvert[k+1][j][i+1] < 0.1) {
1602 vol[
TP] += g13[k][j][i] * 0.5; vol[
TE] += g13[k][j][i] * 0.5;
1603 vol[
CP] -= g13[k][j][i] * 0.5; vol[
EP] -= g13[k][j][i] * 0.5;
1607 if (nvert[k+1][j][i] + nvert[k+1][j][i+1] < 0.1) {
1608 vol[
TP] += g13[k][j][i] * 0.5; vol[
TE] += g13[k][j][i] * 0.5;
1609 vol[
CP] -= g13[k][j][i] * 0.5; vol[
EP] -= g13[k][j][i] * 0.5;
1613 vol[
TP] += g13[k][j][i] * 0.25; vol[
TE] += g13[k][j][i] * 0.25;
1614 vol[
BP] -= g13[k][j][i] * 0.25; vol[
BE] -= g13[k][j][i] * 0.25;
1621 if (nvert[k][j][i-1] < IBM_FLUID_THRESHOLD && i != x_str) {
1622 vol[
CP] -= g11[k][j][i-1];
1623 vol[
WP] += g11[k][j][i-1];
1627 vol[
CP] -= g12[k][j][i-1] * 0.5; vol[
WP] -= g12[k][j][i-1] * 0.5;
1628 vol[
SP] += g12[k][j][i-1] * 0.5; vol[
SW] += g12[k][j][i-1] * 0.5;
1632 if (nvert[k][j-1][i] + nvert[k][j-1][i-1] < 0.1) {
1633 vol[
CP] -= g12[k][j][i-1] * 0.5; vol[
WP] -= g12[k][j][i-1] * 0.5;
1634 vol[
SP] += g12[k][j][i-1] * 0.5; vol[
SW] += g12[k][j][i-1] * 0.5;
1638 if (nvert[k][j+1][i] + nvert[k][j+1][i-1] < 0.1) {
1639 vol[
NP] -= g12[k][j][i-1] * 0.5; vol[
NW] -= g12[k][j][i-1] * 0.5;
1640 vol[
CP] += g12[k][j][i-1] * 0.5; vol[
WP] += g12[k][j][i-1] * 0.5;
1644 if (nvert[k][j+1][i] + nvert[k][j+1][i-1] < 0.1) {
1645 vol[
NP] -= g12[k][j][i-1] * 0.5; vol[
NW] -= g12[k][j][i-1] * 0.5;
1646 vol[
CP] += g12[k][j][i-1] * 0.5; vol[
WP] += g12[k][j][i-1] * 0.5;
1650 vol[
NP] -= g12[k][j][i-1] * 0.25; vol[
NW] -= g12[k][j][i-1] * 0.25;
1651 vol[
SP] += g12[k][j][i-1] * 0.25; vol[
SW] += g12[k][j][i-1] * 0.25;
1656 vol[
CP] -= g13[k][j][i-1] * 0.5; vol[
WP] -= g13[k][j][i-1] * 0.5;
1657 vol[
BP] += g13[k][j][i-1] * 0.5; vol[
BW] += g13[k][j][i-1] * 0.5;
1661 if (nvert[k-1][j][i] + nvert[k-1][j][i-1] < 0.1) {
1662 vol[
CP] -= g13[k][j][i-1] * 0.5; vol[
WP] -= g13[k][j][i-1] * 0.5;
1663 vol[
BP] += g13[k][j][i-1] * 0.5; vol[
BW] += g13[k][j][i-1] * 0.5;
1667 if (nvert[k+1][j][i] + nvert[k+1][j][i-1] < 0.1) {
1668 vol[
TP] -= g13[k][j][i-1] * 0.5; vol[
TW] -= g13[k][j][i-1] * 0.5;
1669 vol[
CP] += g13[k][j][i-1] * 0.5; vol[
WP] += g13[k][j][i-1] * 0.5;
1673 if (nvert[k+1][j][i] + nvert[k+1][j][i-1] < 0.1) {
1674 vol[
TP] -= g13[k][j][i-1] * 0.5; vol[
TW] -= g13[k][j][i-1] * 0.5;
1675 vol[
CP] += g13[k][j][i-1] * 0.5; vol[
WP] += g13[k][j][i-1] * 0.5;
1679 vol[
TP] -= g13[k][j][i-1] * 0.25; vol[
TW] -= g13[k][j][i-1] * 0.25;
1680 vol[
BP] += g13[k][j][i-1] * 0.25; vol[
BW] += g13[k][j][i-1] * 0.25;
1687 if (nvert[k][j+1][i] < IBM_FLUID_THRESHOLD && j != y_end) {
1690 vol[
CP] += g21[k][j][i] * 0.5; vol[
NP] += g21[k][j][i] * 0.5;
1691 vol[
WP] -= g21[k][j][i] * 0.5; vol[
NW] -= g21[k][j][i] * 0.5;
1695 if (nvert[k][j][i-1] + nvert[k][j+1][i-1] < 0.1) {
1696 vol[
CP] += g21[k][j][i] * 0.5; vol[
NP] += g21[k][j][i] * 0.5;
1697 vol[
WP] -= g21[k][j][i] * 0.5; vol[
NW] -= g21[k][j][i] * 0.5;
1701 if (nvert[k][j][i+1] + nvert[k][j+1][i+1] < 0.1) {
1702 vol[
EP] += g21[k][j][i] * 0.5; vol[
NE] += g21[k][j][i] * 0.5;
1703 vol[
CP] -= g21[k][j][i] * 0.5; vol[
NP] -= g21[k][j][i] * 0.5;
1707 if (nvert[k][j][i+1] + nvert[k][j+1][i+1] < 0.1) {
1708 vol[
EP] += g21[k][j][i] * 0.5; vol[
NE] += g21[k][j][i] * 0.5;
1709 vol[
CP] -= g21[k][j][i] * 0.5; vol[
NP] -= g21[k][j][i] * 0.5;
1713 vol[
EP] += g21[k][j][i] * 0.25; vol[
NE] += g21[k][j][i] * 0.25;
1714 vol[
WP] -= g21[k][j][i] * 0.25; vol[
NW] -= g21[k][j][i] * 0.25;
1717 vol[
CP] -= g22[k][j][i];
1718 vol[
NP] += g22[k][j][i];
1722 vol[
CP] += g23[k][j][i] * 0.5; vol[
NP] += g23[k][j][i] * 0.5;
1723 vol[
BP] -= g23[k][j][i] * 0.5; vol[
BN] -= g23[k][j][i] * 0.5;
1727 if (nvert[k-1][j][i] + nvert[k-1][j+1][i] < 0.1) {
1728 vol[
CP] += g23[k][j][i] * 0.5; vol[
NP] += g23[k][j][i] * 0.5;
1729 vol[
BP] -= g23[k][j][i] * 0.5; vol[
BN] -= g23[k][j][i] * 0.5;
1733 if (nvert[k+1][j][i] + nvert[k+1][j+1][i] < 0.1) {
1734 vol[
TP] += g23[k][j][i] * 0.5; vol[
TN] += g23[k][j][i] * 0.5;
1735 vol[
CP] -= g23[k][j][i] * 0.5; vol[
NP] -= g23[k][j][i] * 0.5;
1739 if (nvert[k+1][j][i] + nvert[k+1][j+1][i] < 0.1) {
1740 vol[
TP] += g23[k][j][i] * 0.5; vol[
TN] += g23[k][j][i] * 0.5;
1741 vol[
CP] -= g23[k][j][i] * 0.5; vol[
NP] -= g23[k][j][i] * 0.5;
1745 vol[
TP] += g23[k][j][i] * 0.25; vol[
TN] += g23[k][j][i] * 0.25;
1746 vol[
BP] -= g23[k][j][i] * 0.25; vol[
BN] -= g23[k][j][i] * 0.25;
1753 if (nvert[k][j-1][i] < IBM_FLUID_THRESHOLD && j != y_str) {
1756 vol[
CP] -= g21[k][j-1][i] * 0.5; vol[
SP] -= g21[k][j-1][i] * 0.5;
1757 vol[
WP] += g21[k][j-1][i] * 0.5; vol[
SW] += g21[k][j-1][i] * 0.5;
1761 if (nvert[k][j][i-1] + nvert[k][j-1][i-1] < 0.1) {
1762 vol[
CP] -= g21[k][j-1][i] * 0.5; vol[
SP] -= g21[k][j-1][i] * 0.5;
1763 vol[
WP] += g21[k][j-1][i] * 0.5; vol[
SW] += g21[k][j-1][i] * 0.5;
1767 if (nvert[k][j][i+1] + nvert[k][j-1][i+1] < 0.1) {
1768 vol[
EP] -= g21[k][j-1][i] * 0.5; vol[
SE] -= g21[k][j-1][i] * 0.5;
1769 vol[
CP] += g21[k][j-1][i] * 0.5; vol[
SP] += g21[k][j-1][i] * 0.5;
1773 if (nvert[k][j][i+1] + nvert[k][j-1][i+1] < 0.1) {
1774 vol[
EP] -= g21[k][j-1][i] * 0.5; vol[
SE] -= g21[k][j-1][i] * 0.5;
1775 vol[
CP] += g21[k][j-1][i] * 0.5; vol[
SP] += g21[k][j-1][i] * 0.5;
1779 vol[
EP] -= g21[k][j-1][i] * 0.25; vol[
SE] -= g21[k][j-1][i] * 0.25;
1780 vol[
WP] += g21[k][j-1][i] * 0.25; vol[
SW] += g21[k][j-1][i] * 0.25;
1783 vol[
CP] -= g22[k][j-1][i];
1784 vol[
SP] += g22[k][j-1][i];
1788 vol[
CP] -= g23[k][j-1][i] * 0.5; vol[
SP] -= g23[k][j-1][i] * 0.5;
1789 vol[
BP] += g23[k][j-1][i] * 0.5; vol[
BS] += g23[k][j-1][i] * 0.5;
1793 if (nvert[k-1][j][i] + nvert[k-1][j-1][i] < 0.1 ) {
1794 vol[
CP] -= g23[k][j-1][i] * 0.5; vol[
SP] -= g23[k][j-1][i] * 0.5;
1795 vol[
BP] += g23[k][j-1][i] * 0.5; vol[
BS] += g23[k][j-1][i] * 0.5;
1799 if (nvert[k+1][j][i] + nvert[k+1][j-1][i] < 0.1) {
1800 vol[
TP] -= g23[k][j-1][i] * 0.5; vol[
TS] -= g23[k][j-1][i] * 0.5;
1801 vol[
CP] += g23[k][j-1][i] * 0.5; vol[
SP] += g23[k][j-1][i] * 0.5;
1805 if (nvert[k+1][j][i] + nvert[k+1][j-1][i] < 0.1) {
1806 vol[
TP] -= g23[k][j-1][i] * 0.5; vol[
TS] -= g23[k][j-1][i] * 0.5;
1807 vol[
CP] += g23[k][j-1][i] * 0.5; vol[
SP] += g23[k][j-1][i] * 0.5;
1811 vol[
TP] -= g23[k][j-1][i] * 0.25; vol[
TS] -= g23[k][j-1][i] * 0.25;
1812 vol[
BP] += g23[k][j-1][i] * 0.25; vol[
BS] += g23[k][j-1][i] * 0.25;
1819 if (nvert[k+1][j][i] < IBM_FLUID_THRESHOLD && k != z_end) {
1822 vol[
CP] += g31[k][j][i] * 0.5; vol[
TP] += g31[k][j][i] * 0.5;
1823 vol[
WP] -= g31[k][j][i] * 0.5; vol[
TW] -= g31[k][j][i] * 0.5;
1827 if (nvert[k][j][i-1] + nvert[k+1][j][i-1] < 0.1) {
1828 vol[
CP] += g31[k][j][i] * 0.5; vol[
TP] += g31[k][j][i] * 0.5;
1829 vol[
WP] -= g31[k][j][i] * 0.5; vol[
TW] -= g31[k][j][i] * 0.5;
1833 if (nvert[k][j][i+1] + nvert[k+1][j][i+1] < 0.1) {
1834 vol[
EP] += g31[k][j][i] * 0.5; vol[
TE] += g31[k][j][i] * 0.5;
1835 vol[
CP] -= g31[k][j][i] * 0.5; vol[
TP] -= g31[k][j][i] * 0.5;
1839 if (nvert[k][j][i+1] + nvert[k+1][j][i+1] < 0.1) {
1840 vol[
EP] += g31[k][j][i] * 0.5; vol[
TE] += g31[k][j][i] * 0.5;
1841 vol[
CP] -= g31[k][j][i] * 0.5; vol[
TP] -= g31[k][j][i] * 0.5;
1845 vol[
EP] += g31[k][j][i] * 0.25; vol[
TE] += g31[k][j][i] * 0.25;
1846 vol[
WP] -= g31[k][j][i] * 0.25; vol[
TW] -= g31[k][j][i] * 0.25;
1851 vol[
CP] += g32[k][j][i] * 0.5; vol[
TP] += g32[k][j][i] * 0.5;
1852 vol[
SP] -= g32[k][j][i] * 0.5; vol[
TS] -= g32[k][j][i] * 0.5;
1856 if (nvert[k][j-1][i] + nvert[k+1][j-1][i] < 0.1) {
1857 vol[
CP] += g32[k][j][i] * 0.5; vol[
TP] += g32[k][j][i] * 0.5;
1858 vol[
SP] -= g32[k][j][i] * 0.5; vol[
TS] -= g32[k][j][i] * 0.5;
1862 if (nvert[k][j+1][i] + nvert[k+1][j+1][i] < 0.1) {
1863 vol[
NP] += g32[k][j][i] * 0.5; vol[
TN] += g32[k][j][i] * 0.5;
1864 vol[
CP] -= g32[k][j][i] * 0.5; vol[
TP] -= g32[k][j][i] * 0.5;
1868 if (nvert[k][j+1][i] + nvert[k+1][j+1][i] < 0.1) {
1869 vol[
NP] += g32[k][j][i] * 0.5; vol[
TN] += g32[k][j][i] * 0.5;
1870 vol[
CP] -= g32[k][j][i] * 0.5; vol[
TP] -= g32[k][j][i] * 0.5;
1874 vol[
NP] += g32[k][j][i] * 0.25; vol[
TN] += g32[k][j][i] * 0.25;
1875 vol[
SP] -= g32[k][j][i] * 0.25; vol[
TS] -= g32[k][j][i] * 0.25;
1878 vol[
CP] -= g33[k][j][i];
1879 vol[
TP] += g33[k][j][i];
1885 if (nvert[k-1][j][i] < IBM_FLUID_THRESHOLD && k != z_str) {
1888 vol[
CP] -= g31[k-1][j][i] * 0.5; vol[
BP] -= g31[k-1][j][i] * 0.5;
1889 vol[
WP] += g31[k-1][j][i] * 0.5; vol[
BW] += g31[k-1][j][i] * 0.5;
1893 if (nvert[k][j][i-1] + nvert[k-1][j][i-1] < 0.1) {
1894 vol[
CP] -= g31[k-1][j][i] * 0.5; vol[
BP] -= g31[k-1][j][i] * 0.5;
1895 vol[
WP] += g31[k-1][j][i] * 0.5; vol[
BW] += g31[k-1][j][i] * 0.5;
1899 if (nvert[k][j][i+1] + nvert[k-1][j][i+1] < 0.1) {
1900 vol[
EP] -= g31[k-1][j][i] * 0.5; vol[
BE] -= g31[k-1][j][i] * 0.5;
1901 vol[
CP] += g31[k-1][j][i] * 0.5; vol[
BP] += g31[k-1][j][i] * 0.5;
1905 if (nvert[k][j][i+1] + nvert[k-1][j][i+1] < 0.1) {
1906 vol[
EP] -= g31[k-1][j][i] * 0.5; vol[
BE] -= g31[k-1][j][i] * 0.5;
1907 vol[
CP] += g31[k-1][j][i] * 0.5; vol[
BP] += g31[k-1][j][i] * 0.5;
1911 vol[
EP] -= g31[k-1][j][i] * 0.25; vol[
BE] -= g31[k-1][j][i] * 0.25;
1912 vol[
WP] += g31[k-1][j][i] * 0.25; vol[
BW] += g31[k-1][j][i] * 0.25;
1917 vol[
CP] -= g32[k-1][j][i] * 0.5; vol[
BP] -= g32[k-1][j][i] * 0.5;
1918 vol[
SP] += g32[k-1][j][i] * 0.5; vol[
BS] += g32[k-1][j][i] * 0.5;
1922 if (nvert[k][j-1][i] + nvert[k-1][j-1][i] < 0.1) {
1923 vol[
CP] -= g32[k-1][j][i] * 0.5; vol[
BP] -= g32[k-1][j][i] * 0.5;
1924 vol[
SP] += g32[k-1][j][i] * 0.5; vol[
BS] += g32[k-1][j][i] * 0.5;
1928 if (nvert[k][j+1][i] + nvert[k-1][j+1][i] < 0.1) {
1929 vol[
NP] -= g32[k-1][j][i] * 0.5; vol[
BN] -= g32[k-1][j][i] * 0.5;
1930 vol[
CP] += g32[k-1][j][i] * 0.5; vol[
BP] += g32[k-1][j][i] * 0.5;
1934 if (nvert[k][j+1][i] + nvert[k-1][j+1][i] < 0.1) {
1935 vol[
NP] -= g32[k-1][j][i] * 0.5; vol[
BN] -= g32[k-1][j][i] * 0.5;
1936 vol[
CP] += g32[k-1][j][i] * 0.5; vol[
BP] += g32[k-1][j][i] * 0.5;
1940 vol[
NP] -= g32[k-1][j][i] * 0.25; vol[
BN] -= g32[k-1][j][i] * 0.25;
1941 vol[
SP] += g32[k-1][j][i] * 0.25; vol[
BS] += g32[k-1][j][i] * 0.25;
1944 vol[
CP] -= g33[k-1][j][i];
1945 vol[
BP] += g33[k-1][j][i];
1951 for (PetscInt m = 0; m < 19; m++) {
1952 vol[m] *= -aj[k][j][i];
1956 idx[
CP] =
Gidx(i, j, 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==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);
1964 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);
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==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);
1966 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);
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==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);
1968 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);
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==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);
1970 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);
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==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);
1972 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);
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==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);
1974 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);
1977 MatSetValues(user->
A, 1, &row, 19, idx, vol, INSERT_VALUES);
1988 MatAssemblyBegin(user->
A, MAT_FINAL_ASSEMBLY);
1989 MatAssemblyEnd(user->
A, MAT_FINAL_ASSEMBLY);
1993 ierr = MatNorm(user->
A,NORM_INFINITY,&max_A);CHKERRQ(ierr);
2002 DMDAVecRestoreArray(da, G11, &g11); DMDAVecRestoreArray(da, G12, &g12); DMDAVecRestoreArray(da, G13, &g13);
2003 DMDAVecRestoreArray(da, G21, &g21); DMDAVecRestoreArray(da, G22, &g22); DMDAVecRestoreArray(da, G23, &g23);
2004 DMDAVecRestoreArray(da, G31, &g31); DMDAVecRestoreArray(da, G32, &g32); DMDAVecRestoreArray(da, G33, &g33);
2006 VecDestroy(&G11); VecDestroy(&G12); VecDestroy(&G13);
2007 VecDestroy(&G21); VecDestroy(&G22); VecDestroy(&G23);
2008 VecDestroy(&G31); VecDestroy(&G32); VecDestroy(&G33);
2010 DMDAVecRestoreArray(fda, user->
lCsi, &csi); DMDAVecRestoreArray(fda, user->
lEta, &eta); DMDAVecRestoreArray(fda, user->
lZet, &zet);
2011 DMDAVecRestoreArray(fda, user->
lICsi, &icsi); DMDAVecRestoreArray(fda, user->
lIEta, &ieta); DMDAVecRestoreArray(fda, user->
lIZet, &izet);
2012 DMDAVecRestoreArray(fda, user->
lJCsi, &jcsi); DMDAVecRestoreArray(fda, user->
lJEta, &jeta); DMDAVecRestoreArray(fda, user->
lJZet, &jzet);
2013 DMDAVecRestoreArray(fda, user->
lKCsi, &kcsi); DMDAVecRestoreArray(fda, user->
lKEta, &keta); DMDAVecRestoreArray(fda, user->
lKZet, &kzet);
2014 DMDAVecRestoreArray(da, user->
lAj, &aj); DMDAVecRestoreArray(da, user->
lIAj, &iaj); DMDAVecRestoreArray(da, user->
lJAj, &jaj); DMDAVecRestoreArray(da, user->
lKAj, &kaj);
2015 DMDAVecRestoreArray(da, user->
lNvert, &nvert);
2019 PetscFunctionReturn(0);
2123 PetscReal *ibm_Area, PetscInt flg)
2125 PetscErrorCode ierr;
2127 DM da = user->
da, fda = user->
fda;
2129 DMDALocalInfo info = user->
info;
2131 PetscInt xs = info.xs, xe = info.xs + info.xm;
2132 PetscInt ys = info.ys, ye = info.ys + info.ym;
2133 PetscInt zs = info.zs, ze = info.zs + info.zm;
2134 PetscInt mx = info.mx, my = info.my, mz = info.mz;
2137 PetscInt lxs, lys, lzs, lxe, lye, lze;
2143 if (xs==0) lxs = xs+1;
2144 if (ys==0) lys = ys+1;
2145 if (zs==0) lzs = zs+1;
2147 if (xe==mx) lxe = xe-1;
2148 if (ye==my) lye = ye-1;
2149 if (ze==mz) lze = ze-1;
2151 PetscReal ***nvert, ibmval=1.5;
2152 Cmpnts ***ucor, ***csi, ***eta, ***zet;
2153 DMDAVecGetArray(fda, user->
Ucont, &ucor);
2154 DMDAVecGetArray(fda, user->
lCsi, &csi);
2155 DMDAVecGetArray(fda, user->
lEta, &eta);
2156 DMDAVecGetArray(fda, user->
lZet, &zet);
2157 DMDAVecGetArray(da, user->
lNvert, &nvert);
2159 PetscReal libm_Flux, libm_area;
2162 for (k=lzs; k<lze; k++) {
2163 for (j=lys; j<lye; j++) {
2164 for (i=lxs; i<lxe; i++) {
2165 if (nvert[k][j][i] < 0.1) {
2166 if (nvert[k][j][i+1] > ibmval-0.4 && nvert[k][j][i+1] < ibmval && i < mx-2) {
2167 libm_Flux += ucor[k][j][i].
x;
2168 libm_area += sqrt(csi[k][j][i].x * csi[k][j][i].x +
2169 csi[k][j][i].y * csi[k][j][i].y +
2170 csi[k][j][i].z * csi[k][j][i].z);
2173 if (nvert[k][j+1][i] > ibmval-0.4 && nvert[k][j+1][i] < ibmval && j < my-2) {
2174 libm_Flux += ucor[k][j][i].
y;
2175 libm_area += sqrt(eta[k][j][i].x * eta[k][j][i].x +
2176 eta[k][j][i].y * eta[k][j][i].y +
2177 eta[k][j][i].z * eta[k][j][i].z);
2179 if (nvert[k+1][j][i] > ibmval-0.4 && nvert[k+1][j][i] < ibmval && k < mz-2) {
2180 libm_Flux += ucor[k][j][i].
z;
2181 libm_area += sqrt(zet[k][j][i].x * zet[k][j][i].x +
2182 zet[k][j][i].y * zet[k][j][i].y +
2183 zet[k][j][i].z * zet[k][j][i].z);
2187 if (nvert[k][j][i] > ibmval-0.4 && nvert[k][j][i] < ibmval) {
2188 if (nvert[k][j][i+1] < 0.1 && i < mx-2) {
2189 libm_Flux -= ucor[k][j][i].
x;
2190 libm_area += sqrt(csi[k][j][i].x * csi[k][j][i].x +
2191 csi[k][j][i].y * csi[k][j][i].y +
2192 csi[k][j][i].z * csi[k][j][i].z);
2195 if (nvert[k][j+1][i] < 0.1 && j < my-2) {
2196 libm_Flux -= ucor[k][j][i].
y;
2197 libm_area += sqrt(eta[k][j][i].x * eta[k][j][i].x +
2198 eta[k][j][i].y * eta[k][j][i].y +
2199 eta[k][j][i].z * eta[k][j][i].z);
2201 if (nvert[k+1][j][i] < 0.1 && k < mz-2) {
2202 libm_Flux -= ucor[k][j][i].
z;
2203 libm_area += sqrt(zet[k][j][i].x * zet[k][j][i].x +
2204 zet[k][j][i].y * zet[k][j][i].y +
2205 zet[k][j][i].z * zet[k][j][i].z);
2213 ierr = MPI_Allreduce(&libm_Flux, ibm_Flux,1,MPI_DOUBLE,MPI_SUM, PETSC_COMM_WORLD); CHKERRMPI(ierr);
2214 ierr = MPI_Allreduce(&libm_area, ibm_Area,1,MPI_DOUBLE,MPI_SUM, PETSC_COMM_WORLD); CHKERRMPI(ierr);
2218 PetscPrintf(PETSC_COMM_WORLD,
"IBMFlux REV %le %le\n", *ibm_Flux, *ibm_Area);
2220 PetscReal correction;
2222 if (*ibm_Area > 1.e-15) {
2224 correction = (*ibm_Flux + user->
FluxIntpSum) / *ibm_Area;
2226 correction = *ibm_Flux / *ibm_Area;
2232 for (k=lzs; k<lze; k++) {
2233 for (j=lys; j<lye; j++) {
2234 for (i=lxs; i<lxe; i++) {
2235 if (nvert[k][j][i] < 0.1) {
2236 if (nvert[k][j][i+1] > ibmval-0.4 && nvert[k][j][i+1] < ibmval && i < mx-2) {
2237 ucor[k][j][i].
x -= sqrt(csi[k][j][i].x * csi[k][j][i].x +
2238 csi[k][j][i].y * csi[k][j][i].y +
2239 csi[k][j][i].z * csi[k][j][i].z) *
2243 if (nvert[k][j+1][i] > ibmval-0.4 && nvert[k][j+1][i] < ibmval && j < my-2) {
2244 ucor[k][j][i].
y -= sqrt(eta[k][j][i].x * eta[k][j][i].x +
2245 eta[k][j][i].y * eta[k][j][i].y +
2246 eta[k][j][i].z * eta[k][j][i].z) *
2249 if (nvert[k+1][j][i] > ibmval-0.4 && nvert[k+1][j][i] < ibmval && k < mz-2) {
2250 ucor[k][j][i].
z -= sqrt(zet[k][j][i].x * zet[k][j][i].x +
2251 zet[k][j][i].y * zet[k][j][i].y +
2252 zet[k][j][i].z * zet[k][j][i].z) *
2257 if (nvert[k][j][i] > ibmval-0.4 && nvert[k][j][i] < ibmval) {
2258 if (nvert[k][j][i+1] < 0.1 && i < mx-2) {
2259 ucor[k][j][i].
x += sqrt(csi[k][j][i].x * csi[k][j][i].x +
2260 csi[k][j][i].y * csi[k][j][i].y +
2261 csi[k][j][i].z * csi[k][j][i].z) *
2265 if (nvert[k][j+1][i] < 0.1 && j < my-2) {
2266 ucor[k][j][i].
y += sqrt(eta[k][j][i].x * eta[k][j][i].x +
2267 eta[k][j][i].y * eta[k][j][i].y +
2268 eta[k][j][i].z * eta[k][j][i].z) *
2271 if (nvert[k+1][j][i] < 0.1 && k < mz-2) {
2272 ucor[k][j][i].
z += sqrt(zet[k][j][i].x * zet[k][j][i].x +
2273 zet[k][j][i].y * zet[k][j][i].y +
2274 zet[k][j][i].z * zet[k][j][i].z) *
2287 for (k=lzs; k<lze; k++) {
2288 for (j=lys; j<lye; j++) {
2289 for (i=lxs; i<lxe; i++) {
2290 if (nvert[k][j][i] < 0.1) {
2291 if (nvert[k][j][i+1] > ibmval-0.4 && nvert[k][j][i+1] < ibmval && i < mx-2) {
2292 libm_Flux += ucor[k][j][i].
x;
2293 libm_area += sqrt(csi[k][j][i].x * csi[k][j][i].x +
2294 csi[k][j][i].y * csi[k][j][i].y +
2295 csi[k][j][i].z * csi[k][j][i].z);
2298 if (nvert[k][j+1][i] > ibmval-0.4 && nvert[k][j+1][i] < ibmval && j < my-2) {
2299 libm_Flux += ucor[k][j][i].
y;
2300 libm_area += sqrt(eta[k][j][i].x * eta[k][j][i].x +
2301 eta[k][j][i].y * eta[k][j][i].y +
2302 eta[k][j][i].z * eta[k][j][i].z);
2304 if (nvert[k+1][j][i] > ibmval-0.4 && nvert[k+1][j][i] < ibmval && k < mz-2) {
2305 libm_Flux += ucor[k][j][i].
z;
2306 libm_area += sqrt(zet[k][j][i].x * zet[k][j][i].x +
2307 zet[k][j][i].y * zet[k][j][i].y +
2308 zet[k][j][i].z * zet[k][j][i].z);
2312 if (nvert[k][j][i] > ibmval-0.4 && nvert[k][j][i] < ibmval) {
2313 if (nvert[k][j][i+1] < 0.1 && i < mx-2) {
2314 libm_Flux -= ucor[k][j][i].
x;
2315 libm_area += sqrt(csi[k][j][i].x * csi[k][j][i].x +
2316 csi[k][j][i].y * csi[k][j][i].y +
2317 csi[k][j][i].z * csi[k][j][i].z);
2320 if (nvert[k][j+1][i] < 0.1 && j < my-2) {
2321 libm_Flux -= ucor[k][j][i].
y;
2322 libm_area += sqrt(eta[k][j][i].x * eta[k][j][i].x +
2323 eta[k][j][i].y * eta[k][j][i].y +
2324 eta[k][j][i].z * eta[k][j][i].z);
2326 if (nvert[k+1][j][i] < 0.1 && k < mz-2) {
2327 libm_Flux -= ucor[k][j][i].
z;
2328 libm_area += sqrt(zet[k][j][i].x * zet[k][j][i].x +
2329 zet[k][j][i].y * zet[k][j][i].y +
2330 zet[k][j][i].z * zet[k][j][i].z);
2338 ierr = MPI_Allreduce(&libm_Flux, ibm_Flux,1,MPI_DOUBLE,MPI_SUM, PETSC_COMM_WORLD); CHKERRMPI(ierr);
2339 ierr = MPI_Allreduce(&libm_area, ibm_Area,1,MPI_DOUBLE,MPI_SUM, PETSC_COMM_WORLD); CHKERRMPI(ierr);
2343 PetscPrintf(PETSC_COMM_WORLD,
"IBMFlux22 REV %le %le\n", *ibm_Flux, *ibm_Area);
2345 DMDAVecRestoreArray(da, user->
lNvert, &nvert);
2346 DMDAVecRestoreArray(fda, user->
lCsi, &csi);
2347 DMDAVecRestoreArray(fda, user->
lEta, &eta);
2348 DMDAVecRestoreArray(fda, user->
lZet, &zet);
2349 DMDAVecRestoreArray(fda, user->
Ucont, &ucor);
2351 const char *staggered_fields[] = {
"Ucont"};
2366 PetscErrorCode ierr;
2375 DM da = user->
da, fda = user->
fda;
2377 DMDALocalInfo info = user->
info;
2379 PetscInt xs = info.xs, xe = info.xs + info.xm;
2380 PetscInt ys = info.ys, ye = info.ys + info.ym;
2381 PetscInt zs = info.zs, ze = info.zs + info.zm;
2382 PetscInt mx = info.mx, my = info.my, mz = info.mz;
2384 PetscInt i, j, k,ibi;
2385 PetscInt lxs, lys, lzs, lxe, lye, lze;
2391 if (xs==0) lxs = xs+1;
2392 if (ys==0) lys = ys+1;
2393 if (zs==0) lzs = zs+1;
2395 if (xe==mx) lxe = xe-1;
2396 if (ye==my) lye = ye-1;
2397 if (ze==mz) lze = ze-1;
2399 PetscReal epsilon=1.e-8;
2400 PetscReal ***nvert, ibmval=1.9999;
2406 }***ucor, ***csi, ***eta, ***zet;
2409 PetscInt xend=mx-2 ,yend=my-2,zend=mz-2;
2415 DMDAVecGetArray(fda, user->
Ucont, &ucor);
2416 DMDAVecGetArray(fda, user->
lCsi, &csi);
2417 DMDAVecGetArray(fda, user->
lEta, &eta);
2418 DMDAVecGetArray(fda, user->
lZet, &zet);
2419 DMDAVecGetArray(da, user->
lNvert, &nvert);
2421 PetscReal libm_Flux, libm_area, libm_Flux_abs=0., ibm_Flux_abs;
2428 PetscReal *lIB_Flux = NULL, *lIB_area = NULL, *IB_Flux = NULL, *IB_Area = NULL;
2429 if (NumberOfBodies > 1) {
2431 lIB_Flux=(PetscReal *)calloc(NumberOfBodies,
sizeof(PetscReal));
2432 lIB_area=(PetscReal *)calloc(NumberOfBodies,
sizeof(PetscReal));
2433 IB_Flux=(PetscReal *)calloc(NumberOfBodies,
sizeof(PetscReal));
2434 IB_Area=(PetscReal *)calloc(NumberOfBodies,
sizeof(PetscReal));
2437 for (ibi=0; ibi<NumberOfBodies; ibi++) {
2452 for (k=lzs; k<lze; k++) {
2453 for (j=lys; j<lye; j++) {
2454 for (i=lxs; i<lxe; i++) {
2455 if (nvert[k][j][i] < 0.1) {
2456 if (nvert[k][j][i+1] > 0.1 && nvert[k][j][i+1] < ibmval && i < xend) {
2458 if (fabs(ucor[k][j][i].x)>epsilon) {
2459 libm_Flux += ucor[k][j][i].x;
2461 libm_Flux_abs += fabs(ucor[k][j][i].x)/sqrt(csi[k][j][i].x * csi[k][j][i].x +
2462 csi[k][j][i].y * csi[k][j][i].y +
2463 csi[k][j][i].z * csi[k][j][i].z);
2465 libm_Flux_abs += fabs(ucor[k][j][i].x);
2467 libm_area += sqrt(csi[k][j][i].x * csi[k][j][i].x +
2468 csi[k][j][i].y * csi[k][j][i].y +
2469 csi[k][j][i].z * csi[k][j][i].z);
2471 if (NumberOfBodies > 1) {
2473 ibi=(int)((nvert[k][j][i+1]-1.0)*1001);
2474 lIB_Flux[ibi] += ucor[k][j][i].x;
2475 lIB_area[ibi] += sqrt(csi[k][j][i].x * csi[k][j][i].x +
2476 csi[k][j][i].y * csi[k][j][i].y +
2477 csi[k][j][i].z * csi[k][j][i].z);
2483 if (nvert[k][j+1][i] > 0.1 && nvert[k][j+1][i] < ibmval && j < yend) {
2485 if (fabs(ucor[k][j][i].y)>epsilon) {
2486 libm_Flux += ucor[k][j][i].y;
2488 libm_Flux_abs += fabs(ucor[k][j][i].y)/sqrt(eta[k][j][i].x * eta[k][j][i].x +
2489 eta[k][j][i].y * eta[k][j][i].y +
2490 eta[k][j][i].z * eta[k][j][i].z);
2492 libm_Flux_abs += fabs(ucor[k][j][i].y);
2493 libm_area += sqrt(eta[k][j][i].x * eta[k][j][i].x +
2494 eta[k][j][i].y * eta[k][j][i].y +
2495 eta[k][j][i].z * eta[k][j][i].z);
2496 if (NumberOfBodies > 1) {
2498 ibi=(int)((nvert[k][j+1][i]-1.0)*1001);
2500 lIB_Flux[ibi] += ucor[k][j][i].y;
2501 lIB_area[ibi] += sqrt(eta[k][j][i].x * eta[k][j][i].x +
2502 eta[k][j][i].y * eta[k][j][i].y +
2503 eta[k][j][i].z * eta[k][j][i].z);
2508 if (nvert[k+1][j][i] > 0.1 && nvert[k+1][j][i] < ibmval && k < zend) {
2510 if (fabs(ucor[k][j][i].z)>epsilon) {
2511 libm_Flux += ucor[k][j][i].z;
2513 libm_Flux_abs += fabs(ucor[k][j][i].z)/sqrt(zet[k][j][i].x * zet[k][j][i].x +
2514 zet[k][j][i].y * zet[k][j][i].y +
2515 zet[k][j][i].z * zet[k][j][i].z);
2517 libm_Flux_abs += fabs(ucor[k][j][i].z);
2518 libm_area += sqrt(zet[k][j][i].x * zet[k][j][i].x +
2519 zet[k][j][i].y * zet[k][j][i].y +
2520 zet[k][j][i].z * zet[k][j][i].z);
2522 if (NumberOfBodies > 1) {
2524 ibi=(int)((nvert[k+1][j][i]-1.0)*1001);
2525 lIB_Flux[ibi] += ucor[k][j][i].z;
2526 lIB_area[ibi] += sqrt(zet[k][j][i].x * zet[k][j][i].x +
2527 zet[k][j][i].y * zet[k][j][i].y +
2528 zet[k][j][i].z * zet[k][j][i].z);
2535 if (nvert[k][j][i] > 0.1 && nvert[k][j][i] < ibmval) {
2537 if (nvert[k][j][i+1] < 0.1 && i < xend) {
2538 if (fabs(ucor[k][j][i].x)>epsilon) {
2539 libm_Flux -= ucor[k][j][i].x;
2541 libm_Flux_abs += fabs(ucor[k][j][i].x)/sqrt(csi[k][j][i].x * csi[k][j][i].x +
2542 csi[k][j][i].y * csi[k][j][i].y +
2543 csi[k][j][i].z * csi[k][j][i].z);
2545 libm_Flux_abs += fabs(ucor[k][j][i].x);
2546 libm_area += sqrt(csi[k][j][i].x * csi[k][j][i].x +
2547 csi[k][j][i].y * csi[k][j][i].y +
2548 csi[k][j][i].z * csi[k][j][i].z);
2549 if (NumberOfBodies > 1) {
2551 ibi=(int)((nvert[k][j][i]-1.0)*1001);
2552 lIB_Flux[ibi] -= ucor[k][j][i].x;
2553 lIB_area[ibi] += sqrt(csi[k][j][i].x * csi[k][j][i].x +
2554 csi[k][j][i].y * csi[k][j][i].y +
2555 csi[k][j][i].z * csi[k][j][i].z);
2561 if (nvert[k][j+1][i] < 0.1 && j < yend) {
2562 if (fabs(ucor[k][j][i].y)>epsilon) {
2563 libm_Flux -= ucor[k][j][i].y;
2565 libm_Flux_abs += fabs(ucor[k][j][i].y)/ sqrt(eta[k][j][i].x * eta[k][j][i].x +
2566 eta[k][j][i].y * eta[k][j][i].y +
2567 eta[k][j][i].z * eta[k][j][i].z);
2569 libm_Flux_abs += fabs(ucor[k][j][i].y);
2570 libm_area += sqrt(eta[k][j][i].x * eta[k][j][i].x +
2571 eta[k][j][i].y * eta[k][j][i].y +
2572 eta[k][j][i].z * eta[k][j][i].z);
2573 if (NumberOfBodies > 1) {
2575 ibi=(int)((nvert[k][j][i]-1.0)*1001);
2576 lIB_Flux[ibi] -= ucor[k][j][i].y;
2577 lIB_area[ibi] += sqrt(eta[k][j][i].x * eta[k][j][i].x +
2578 eta[k][j][i].y * eta[k][j][i].y +
2579 eta[k][j][i].z * eta[k][j][i].z);
2584 if (nvert[k+1][j][i] < 0.1 && k < zend) {
2585 if (fabs(ucor[k][j][i].z)>epsilon) {
2586 libm_Flux -= ucor[k][j][i].z;
2588 libm_Flux_abs += fabs(ucor[k][j][i].z)/sqrt(zet[k][j][i].x * zet[k][j][i].x +
2589 zet[k][j][i].y * zet[k][j][i].y +
2590 zet[k][j][i].z * zet[k][j][i].z);
2592 libm_Flux_abs += fabs(ucor[k][j][i].z);
2593 libm_area += sqrt(zet[k][j][i].x * zet[k][j][i].x +
2594 zet[k][j][i].y * zet[k][j][i].y +
2595 zet[k][j][i].z * zet[k][j][i].z);
2596 if (NumberOfBodies > 1) {
2598 ibi=(int)((nvert[k][j][i]-1.0)*1001);
2599 lIB_Flux[ibi] -= ucor[k][j][i].z;
2600 lIB_area[ibi] += sqrt(zet[k][j][i].x * zet[k][j][i].x +
2601 zet[k][j][i].y * zet[k][j][i].y +
2602 zet[k][j][i].z * zet[k][j][i].z);
2613 ierr = MPI_Allreduce(&libm_Flux, ibm_Flux,1,MPI_DOUBLE,MPI_SUM, PETSC_COMM_WORLD); CHKERRMPI(ierr);
2614 ierr = MPI_Allreduce(&libm_Flux_abs, &ibm_Flux_abs,1,MPI_DOUBLE,MPI_SUM, PETSC_COMM_WORLD); CHKERRMPI(ierr);
2615 ierr = MPI_Allreduce(&libm_area, ibm_Area,1,MPI_DOUBLE,MPI_SUM, PETSC_COMM_WORLD); CHKERRMPI(ierr);
2617 if (NumberOfBodies > 1) {
2618 ierr = MPI_Allreduce(lIB_Flux,IB_Flux,NumberOfBodies,MPI_DOUBLE,MPI_SUM,PETSC_COMM_WORLD); CHKERRMPI(ierr);
2619 ierr = MPI_Allreduce(lIB_area,IB_Area,NumberOfBodies,MPI_DOUBLE,MPI_SUM,PETSC_COMM_WORLD); CHKERRMPI(ierr);
2622 PetscReal correction;
2624 PetscReal *Correction = NULL;
2625 if (NumberOfBodies > 1) {
2626 Correction=(PetscReal *)calloc(NumberOfBodies,
sizeof(PetscReal));
2627 for (ibi=0; ibi<NumberOfBodies; ibi++) Correction[ibi]=0.0;
2630 if (*ibm_Area > 1.e-15) {
2632 correction = (*ibm_Flux + user->
FluxIntpSum)/ ibm_Flux_abs;
2634 correction = (*ibm_Flux + user->
FluxIntpSum) / *ibm_Area;
2636 correction = *ibm_Flux / *ibm_Area;
2637 if (NumberOfBodies > 1)
2638 for (ibi=0; ibi<NumberOfBodies; ibi++)
if (IB_Area[ibi]>1.e-15) Correction[ibi] = IB_Flux[ibi] / IB_Area[ibi];
2644 LOG_ALLOW(
GLOBAL,
LOG_INFO,
"IBM Uncorrected Flux: %g, Area: %g, Correction: %g\n", *ibm_Flux, *ibm_Area, correction);
2645 if (NumberOfBodies>1){
2646 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]);
2655 for (k=lzs; k<lze; k++) {
2656 for (j=lys; j<lye; j++) {
2657 for (i=lxs; i<lxe; i++) {
2658 if (nvert[k][j][i] < 0.1) {
2659 if (nvert[k][j][i+1] > 0.1 && nvert[k][j][i+1] <ibmval && i < xend) {
2660 if (fabs(ucor[k][j][i].x)>epsilon){
2662 ucor[k][j][i].x -=correction*fabs(ucor[k][j][i].x)/
2663 sqrt(csi[k][j][i].x * csi[k][j][i].x +
2664 csi[k][j][i].y * csi[k][j][i].y +
2665 csi[k][j][i].z * csi[k][j][i].z);
2667 ucor[k][j][i].x -=correction*fabs(ucor[k][j][i].x);
2668 else if (NumberOfBodies > 1) {
2669 ibi=(int)((nvert[k][j][i+1]-1.0)*1001);
2670 ucor[k][j][i].x -= sqrt(csi[k][j][i].x * csi[k][j][i].x +
2671 csi[k][j][i].y * csi[k][j][i].y +
2672 csi[k][j][i].z * csi[k][j][i].z) *
2676 ucor[k][j][i].x -= sqrt(csi[k][j][i].x * csi[k][j][i].x +
2677 csi[k][j][i].y * csi[k][j][i].y +
2678 csi[k][j][i].z * csi[k][j][i].z) *
2682 if (nvert[k][j+1][i] > 0.1 && nvert[k][j+1][i] < ibmval && j < yend) {
2683 if (fabs(ucor[k][j][i].y)>epsilon) {
2685 ucor[k][j][i].y -=correction*fabs(ucor[k][j][i].y)/
2686 sqrt(eta[k][j][i].x * eta[k][j][i].x +
2687 eta[k][j][i].y * eta[k][j][i].y +
2688 eta[k][j][i].z * eta[k][j][i].z);
2690 ucor[k][j][i].y -=correction*fabs(ucor[k][j][i].y);
2691 else if (NumberOfBodies > 1) {
2692 ibi=(int)((nvert[k][j+1][i]-1.0)*1001);
2693 ucor[k][j][i].y -= sqrt(eta[k][j][i].x * eta[k][j][i].x +
2694 eta[k][j][i].y * eta[k][j][i].y +
2695 eta[k][j][i].z * eta[k][j][i].z) *
2699 ucor[k][j][i].y -= sqrt(eta[k][j][i].x * eta[k][j][i].x +
2700 eta[k][j][i].y * eta[k][j][i].y +
2701 eta[k][j][i].z * eta[k][j][i].z) *
2705 if (nvert[k+1][j][i] > 0.1 && nvert[k+1][j][i] < ibmval && k < zend) {
2706 if (fabs(ucor[k][j][i].z)>epsilon) {
2708 ucor[k][j][i].z -= correction*fabs(ucor[k][j][i].z)/
2709 sqrt(zet[k][j][i].x * zet[k][j][i].x +
2710 zet[k][j][i].y * zet[k][j][i].y +
2711 zet[k][j][i].z * zet[k][j][i].z);
2713 ucor[k][j][i].z -= correction*fabs(ucor[k][j][i].z);
2714 else if (NumberOfBodies > 1) {
2715 ibi=(int)((nvert[k+1][j][i]-1.0)*1001);
2716 ucor[k][j][i].z -= sqrt(zet[k][j][i].x * zet[k][j][i].x +
2717 zet[k][j][i].y * zet[k][j][i].y +
2718 zet[k][j][i].z * zet[k][j][i].z) *
2722 ucor[k][j][i].z -= sqrt(zet[k][j][i].x * zet[k][j][i].x +
2723 zet[k][j][i].y * zet[k][j][i].y +
2724 zet[k][j][i].z * zet[k][j][i].z) *
2730 if (nvert[k][j][i] > 0.1 && nvert[k][j][i] < ibmval) {
2731 if (nvert[k][j][i+1] < 0.1 && i < xend) {
2732 if (fabs(ucor[k][j][i].x)>epsilon) {
2734 ucor[k][j][i].x += correction*fabs(ucor[k][j][i].x)/
2735 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);
2739 ucor[k][j][i].x += correction*fabs(ucor[k][j][i].x);
2740 else if (NumberOfBodies > 1) {
2741 ibi=(int)((nvert[k][j][i]-1.0)*1001);
2742 ucor[k][j][i].x += 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) *
2748 ucor[k][j][i].x += sqrt(csi[k][j][i].x * csi[k][j][i].x +
2749 csi[k][j][i].y * csi[k][j][i].y +
2750 csi[k][j][i].z * csi[k][j][i].z) *
2754 if (nvert[k][j+1][i] < 0.1 && j < yend) {
2755 if (fabs(ucor[k][j][i].y)>epsilon) {
2757 ucor[k][j][i].y +=correction*fabs(ucor[k][j][i].y)/
2758 sqrt(eta[k][j][i].x * eta[k][j][i].x +
2759 eta[k][j][i].y * eta[k][j][i].y +
2760 eta[k][j][i].z * eta[k][j][i].z);
2762 ucor[k][j][i].y +=correction*fabs(ucor[k][j][i].y);
2763 else if (NumberOfBodies > 1) {
2764 ibi=(int)((nvert[k][j][i]-1.0)*1001);
2765 ucor[k][j][i].y += sqrt(eta[k][j][i].x * eta[k][j][i].x +
2766 eta[k][j][i].y * eta[k][j][i].y +
2767 eta[k][j][i].z * eta[k][j][i].z) *
2771 ucor[k][j][i].y += sqrt(eta[k][j][i].x * eta[k][j][i].x +
2772 eta[k][j][i].y * eta[k][j][i].y +
2773 eta[k][j][i].z * eta[k][j][i].z) *
2777 if (nvert[k+1][j][i] < 0.1 && k < zend) {
2778 if (fabs(ucor[k][j][i].z)>epsilon) {
2780 ucor[k][j][i].z += correction*fabs(ucor[k][j][i].z)/
2781 sqrt(zet[k][j][i].x * zet[k][j][i].x +
2782 zet[k][j][i].y * zet[k][j][i].y +
2783 zet[k][j][i].z * zet[k][j][i].z);
2785 ucor[k][j][i].z += correction*fabs(ucor[k][j][i].z);
2786 else if (NumberOfBodies > 1) {
2787 ibi=(int)((nvert[k][j][i]-1.0)*1001);
2788 ucor[k][j][i].z += sqrt(zet[k][j][i].x * zet[k][j][i].x +
2789 zet[k][j][i].y * zet[k][j][i].y +
2790 zet[k][j][i].z * zet[k][j][i].z) *
2794 ucor[k][j][i].z += sqrt(zet[k][j][i].x * zet[k][j][i].x +
2795 zet[k][j][i].y * zet[k][j][i].y +
2796 zet[k][j][i].z * zet[k][j][i].z) *
2814 for (k=lzs; k<lze; k++) {
2815 for (j=lys; j<lye; j++) {
2816 for (i=lxs; i<lxe; i++) {
2817 if (nvert[k][j][i] < 0.1) {
2818 if (nvert[k][j][i+1] > 0.1 && nvert[k][j][i+1] < ibmval && i < xend) {
2819 libm_Flux += ucor[k][j][i].x;
2820 libm_area += sqrt(csi[k][j][i].x * csi[k][j][i].x +
2821 csi[k][j][i].y * csi[k][j][i].y +
2822 csi[k][j][i].z * csi[k][j][i].z);
2825 if (nvert[k][j+1][i] > 0.1 && nvert[k][j+1][i] < ibmval && j < yend) {
2826 libm_Flux += ucor[k][j][i].y;
2827 libm_area += sqrt(eta[k][j][i].x * eta[k][j][i].x +
2828 eta[k][j][i].y * eta[k][j][i].y +
2829 eta[k][j][i].z * eta[k][j][i].z);
2831 if (nvert[k+1][j][i] > 0.1 && nvert[k+1][j][i] < ibmval && k < zend) {
2832 libm_Flux += ucor[k][j][i].z;
2833 libm_area += sqrt(zet[k][j][i].x * zet[k][j][i].x +
2834 zet[k][j][i].y * zet[k][j][i].y +
2835 zet[k][j][i].z * zet[k][j][i].z);
2839 if (nvert[k][j][i] > 0.1 && nvert[k][j][i] < ibmval) {
2840 if (nvert[k][j][i+1] < 0.1 && i < xend) {
2841 libm_Flux -= ucor[k][j][i].x;
2842 libm_area += sqrt(csi[k][j][i].x * csi[k][j][i].x +
2843 csi[k][j][i].y * csi[k][j][i].y +
2844 csi[k][j][i].z * csi[k][j][i].z);
2847 if (nvert[k][j+1][i] < 0.1 && j < yend) {
2848 libm_Flux -= ucor[k][j][i].y;
2849 libm_area += sqrt(eta[k][j][i].x * eta[k][j][i].x +
2850 eta[k][j][i].y * eta[k][j][i].y +
2851 eta[k][j][i].z * eta[k][j][i].z);
2853 if (nvert[k+1][j][i] < 0.1 && k < zend) {
2854 libm_Flux -= ucor[k][j][i].z;
2855 libm_area += sqrt(zet[k][j][i].x * zet[k][j][i].x +
2856 zet[k][j][i].y * zet[k][j][i].y +
2857 zet[k][j][i].z * zet[k][j][i].z);
2865 ierr = MPI_Allreduce(&libm_Flux, ibm_Flux,1,MPI_DOUBLE,MPI_SUM, PETSC_COMM_WORLD); CHKERRMPI(ierr);
2866 ierr = MPI_Allreduce(&libm_area, ibm_Area,1,MPI_DOUBLE,MPI_SUM, PETSC_COMM_WORLD); CHKERRMPI(ierr);
2876 for (k=lzs; k<lze; k++) {
2877 for (j=lys; j<lye; j++) {
2879 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;
2890 for (k=lzs; k<lze; k++) {
2891 for (i=lxs; i<lxe; i++) {
2893 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;
2903 for (j=lys; j<lye; j++) {
2904 for (i=lxs; i<lxe; i++) {
2906 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;
2914 DMDAVecRestoreArray(da, user->
lNvert, &nvert);
2915 DMDAVecRestoreArray(fda, user->
lCsi, &csi);
2916 DMDAVecRestoreArray(fda, user->
lEta, &eta);
2917 DMDAVecRestoreArray(fda, user->
lZet, &zet);
2918 DMDAVecRestoreArray(fda, user->
Ucont, &ucor);
2920 const char *staggered_fields[] = {
"Ucont"};
2923 if (NumberOfBodies > 1) {
3158 const PetscInt immersed = simCtx->
immersed;
3159 const PetscInt MHV = simCtx->
MHV;
3160 const PetscInt LV = simCtx->
LV;
3161 PetscMPIInt rank = simCtx->
rank;
3164 PetscErrorCode ierr;
3171 PetscFunctionBeginUser;
3175 for (bi = 0; bi < block_number; bi++) {
3182 for (l = usermg->
mglevels - 1; l > 0; l--) {
3188 user = mgctx[l].
user;
3189 ierr = PetscMalloc1(user[bi].info.mx * user[bi].
info.my * 2, &user[bi].
KSKE); CHKERRQ(ierr);
3195 user = mgctx[l].
user;
3201 ierr = VecDuplicate(user[bi].P, &user[bi].B); CHKERRQ(ierr);
3203 PetscReal ibm_Flux, ibm_Area;
3204 PetscInt flg = immersed - 1;
3207 VolumeFlux(&user[bi], &ibm_Flux, &ibm_Area, flg);
3209 flg = ((MHV > 1 || LV) && bi == 0) ? 1 : 0;
3217 for (l = usermg->
mglevels - 1; l >= 0; l--) {
3218 user = mgctx[l].
user;
3226 ierr = KSPCreate(PETSC_COMM_WORLD, &mgksp); CHKERRQ(ierr);
3227 ierr = KSPAppendOptionsPrefix(mgksp,
"ps_"); CHKERRQ(ierr);
3231 char filen[PETSC_MAX_PATH_LEN + 128];
3234 ierr = PetscNew(&monctx); CHKERRQ(ierr);
3242 ierr = PetscSNPrintf(filen,
sizeof(filen),
"%s/Poisson_Solver_Convergence_History_Block_%d.log", simCtx->
log_dir, bi); CHKERRQ(ierr);
3253 PetscFPrintf(PETSC_COMM_SELF, monctx->
file_handle,
3254 "# Continuation from step %" PetscInt_FMT
"\n", simCtx->
StartStep);
3256 PetscFPrintf(PETSC_COMM_SELF, monctx->
file_handle,
"--- Convergence for Timestep %d, Block %d ---\n", (
int)simCtx->
step, bi);
3258 SETERRQ(PETSC_COMM_SELF, PETSC_ERR_FILE_OPEN,
"Could not open KSP monitor log file: %s", filen);
3267 ierr = KSPGetPC(mgksp, &mgpc); CHKERRQ(ierr);
3268 ierr = PCSetType(mgpc, PCMG); CHKERRQ(ierr);
3270 ierr = PCMGSetLevels(mgpc, usermg->
mglevels, PETSC_NULLPTR); CHKERRQ(ierr);
3271 ierr = PCMGSetCycleType(mgpc, PC_MG_CYCLE_V); CHKERRQ(ierr);
3272 ierr = PCMGSetType(mgpc, PC_MG_MULTIPLICATIVE); CHKERRQ(ierr);
3275 "PETSc PCMG exposes one smoother count in this build; using max(pre_sweeps=%d, post_sweeps=%d).\n",
3279 ierr = PCMGSetNumberSmooth(mgpc, mg_smooths); CHKERRQ(ierr);
3282 for (l = usermg->
mglevels - 1; l > 0; l--) {
3291 coarse_user_ctx->
da_f = &(fine_user_ctx->
da);
3292 coarse_user_ctx->
user_f = fine_user_ctx;
3295 fine_user_ctx->
da_c = &(coarse_user_ctx->
da);
3296 fine_user_ctx->
user_c = coarse_user_ctx;
3300 PetscInt m_c = (coarse_user_ctx->
info.xm * coarse_user_ctx->
info.ym * coarse_user_ctx->
info.zm);
3301 PetscInt m_f = (fine_user_ctx->
info.xm * fine_user_ctx->
info.ym * fine_user_ctx->
info.zm);
3302 PetscInt M_c = (coarse_user_ctx->
info.mx * coarse_user_ctx->
info.my * coarse_user_ctx->
info.mz);
3303 PetscInt M_f = (fine_user_ctx->
info.mx * fine_user_ctx->
info.my * fine_user_ctx->
info.mz);
3308 ierr = MatCreateShell(PETSC_COMM_WORLD, m_c, m_f, M_c, M_f, (
void*)coarse_user_ctx, &fine_user_ctx->
MR); CHKERRQ(ierr);
3311 ierr = MatCreateShell(PETSC_COMM_WORLD, m_f, m_c, M_f, M_c, (
void*)fine_user_ctx, &fine_user_ctx->
MP); CHKERRQ(ierr);
3315 ierr = MatShellSetOperation(fine_user_ctx->
MP, MATOP_MULT, (
void(*)(
void))
MyInterpolation); CHKERRQ(ierr);
3318 ierr = PCMGSetRestriction(mgpc, l, fine_user_ctx->
MR); CHKERRQ(ierr);
3319 ierr = PCMGSetInterpolation(mgpc, l, fine_user_ctx->
MP); CHKERRQ(ierr);
3324 for (l = usermg->
mglevels - 1; l >= 0; l--) {
3325 user = mgctx[l].
user;
3327 ierr = PCMGGetSmoother(mgpc, l, &subksp); CHKERRQ(ierr);
3329 ierr = PCMGGetCoarseSolve(mgpc, &subksp); CHKERRQ(ierr);
3330 ierr = KSPSetTolerances(subksp, 1.e-8, PETSC_DEFAULT, PETSC_DEFAULT, 40); CHKERRQ(ierr);
3333 ierr = KSPSetOperators(subksp, user[bi].A, user[bi].A); CHKERRQ(ierr);
3334 ierr = KSPGetPC(subksp, &subpc); CHKERRQ(ierr);
3335 ierr = PCSetType(subpc, PCBJACOBI); CHKERRQ(ierr);
3336 ierr = KSPSetFromOptions(subksp); CHKERRQ(ierr);
3339 PetscBool is_bjacobi = PETSC_FALSE;
3340 ierr = PCGetType(subpc, &subpc_type); CHKERRQ(ierr);
3342 ierr = PetscStrcmp(subpc_type, PCBJACOBI, &is_bjacobi); CHKERRQ(ierr);
3350 ierr = KSPSetUp(subksp); CHKERRQ(ierr);
3351 ierr = PCBJacobiGetSubKSP(subpc, &nlocal, NULL, &subsubksp); CHKERRQ(ierr);
3353 for (PetscInt abi = 0; abi < nlocal; abi++) {
3354 ierr = KSPGetPC(subsubksp[abi], &subsubpc); CHKERRQ(ierr);
3356 ierr = PCFactorSetShiftAmount(subsubpc, 1.e-10); CHKERRQ(ierr);
3360 ierr = MatNullSpaceCreate(PETSC_COMM_WORLD, PETSC_TRUE, 0, PETSC_NULLPTR, &user[bi].nullsp); CHKERRQ(ierr);
3362 ierr = MatSetNullSpace(user[bi].A, user[bi].nullsp); CHKERRQ(ierr);
3364 ierr = PCMGSetResidual(mgpc, l, PCMGResidualDefault, user[bi].A); CHKERRQ(ierr);
3365 ierr = KSPSetUp(subksp); CHKERRQ(ierr);
3367 if (l < usermg->mglevels - 1) {
3368 ierr = MatCreateVecs(user[bi].A, &user[bi].R, PETSC_NULLPTR); CHKERRQ(ierr);
3369 ierr = PCMGSetRhs(mgpc, l, user[bi].R); CHKERRQ(ierr);
3375 user = mgctx[l].
user;
3378 ierr = KSPSetOperators(mgksp, user[bi].A, user[bi].A); CHKERRQ(ierr);
3379 ierr = MatSetNullSpace(user[bi].A, user[bi].nullsp); CHKERRQ(ierr);
3380 ierr = KSPSetFromOptions(mgksp); CHKERRQ(ierr);
3381 ierr = KSPSetUp(mgksp); CHKERRQ(ierr);
3382 ierr = KSPSolve(mgksp, user[bi].B, user[bi].Phi); CHKERRQ(ierr);
3385 for (l = usermg->
mglevels - 1; l >= 0; l--) {
3386 user = mgctx[l].
user;
3387 MatNullSpaceDestroy(&user[bi].nullsp);
3388 MatDestroy(&user[bi].A);
3391 MatDestroy(&user[bi].MR);
3392 MatDestroy(&user[bi].MP);
3393 }
else if (l==0 && immersed) {
3394 PetscFree(user[bi].KSKE);
3396 if (l < usermg->mglevels - 1) {
3397 VecDestroy(&user[bi].R);
3408 PetscFunctionReturn(0);