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);
330 PetscFunctionBeginUser;
340 DM da = user->
da, fda = user->
fda;
341 DMDALocalInfo info = user->
info;
344 PetscInt mx = info.mx, my = info.my, mz = info.mz;
345 PetscInt xs = info.xs, xe = info.xs + info.xm;
346 PetscInt ys = info.ys, ye = info.ys + info.ym;
347 PetscInt zs = info.zs, ze = info.zs + info.zm;
350 PetscInt lxs = (xs == 0) ? xs + 1 : xs;
351 PetscInt lxe = (xe == mx) ? xe - 1 : xe;
352 PetscInt lys = (ys == 0) ? ys + 1 : ys;
353 PetscInt lye = (ye == my) ? ye - 1 : ye;
354 PetscInt lzs = (zs == 0) ? zs + 1 : zs;
355 PetscInt lze = (ze == mz) ? ze - 1 : ze;
358 Cmpnts ***icsi, ***ieta, ***izet, ***jcsi, ***jeta, ***jzet, ***kcsi, ***keta, ***kzet;
359 PetscReal ***iaj, ***jaj, ***kaj, ***p, ***nvert;
361 DMDAVecGetArray(fda, user->
lICsi, &icsi); DMDAVecGetArray(fda, user->
lIEta, &ieta); DMDAVecGetArray(fda, user->
lIZet, &izet);
362 DMDAVecGetArray(fda, user->
lJCsi, &jcsi); DMDAVecGetArray(fda, user->
lJEta, &jeta); DMDAVecGetArray(fda, user->
lJZet, &jzet);
363 DMDAVecGetArray(fda, user->
lKCsi, &kcsi); DMDAVecGetArray(fda, user->
lKEta, &keta); DMDAVecGetArray(fda, user->
lKZet, &kzet);
364 DMDAVecGetArray(da, user->
lIAj, &iaj); DMDAVecGetArray(da, user->
lJAj, &jaj); DMDAVecGetArray(da, user->
lKAj, &kaj);
365 DMDAVecGetArray(da, user->
lNvert, &nvert);
366 DMDAVecGetArray(da, user->
lPhi, &p);
368 DMDAVecGetArray(fda, user->
Ucont, &ucont);
371 const PetscReal IBM_FLUID_THRESHOLD = 0.1;
382 for (PetscInt k = lzs; k < lze; k++) {
383 for (PetscInt j = lys; j < lye; j++) {
384 for (PetscInt i = lxs; i < lxe; i++) {
390 if (!(nvert[k][j][i] > IBM_FLUID_THRESHOLD || nvert[k][j][i + 1] > IBM_FLUID_THRESHOLD)) {
393 PetscReal dpdc = p[k][j][i + 1] - p[k][j][i];
394 PetscReal dpde = 0.0, dpdz = 0.0;
399 dpde = (p[k][j][i] + p[k][j][i+1] -
400 p[k][j-1][i] - p[k][j-1][i+1]) * 0.5;
405 if (nvert[k][j-1][i] + nvert[k][j-1][i+1] < 0.1) { dpde = (p[k][j][i] + p[k][j][i+1] - p[k][j-1][i] - p[k][j-1][i+1]) * 0.5; }
409 if (nvert[k][j+1][i] + nvert[k][j+1][i+1] < 0.1) { dpde = (p[k][j+1][i] + p[k][j+1][i+1] - p[k][j][i] - p[k][j][i+1]) * 0.5; }
413 if (nvert[k][j+1][i] + nvert[k][j+1][i+1] < 0.1) { dpde = (p[k][j+1][i] + p[k][j+1][i+1] - p[k][j][i] - p[k][j][i+1]) * 0.5; }
416 else { dpde = (p[k][j+1][i] + p[k][j+1][i+1] - p[k][j-1][i] - p[k][j-1][i+1]) * 0.25; }
424 if (nvert[k-1][j][i] + nvert[k-1][j][i+1] < 0.1) { dpdz = (p[k][j][i] + p[k][j][i+1] - p[k-1][j][i] - p[k-1][j][i+1]) * 0.5; }
428 if (nvert[k+1][j][i] + nvert[k+1][j][i+1] < 0.1) { dpdz = (p[k+1][j][i] + p[k+1][j][i+1] - p[k][j][i] - p[k][j][i+1]) * 0.5; }
432 if (nvert[k+1][j][i] + nvert[k+1][j][i+1] < 0.1) { dpdz = (p[k+1][j][i] + p[k+1][j][i+1] - p[k][j][i] - p[k][j][i+1]) * 0.5; }
435 else { dpdz = (p[k+1][j][i] + p[k+1][j][i+1] - p[k-1][j][i] - p[k-1][j][i+1]) * 0.25; }
441 PetscReal grad_p_x = (dpdc * (icsi[k][j][i].
x * icsi[k][j][i].
x + icsi[k][j][i].
y * icsi[k][j][i].
y
442 + icsi[k][j][i].
z * icsi[k][j][i].
z) * iaj[k][j][i] +
443 dpde * (ieta[k][j][i].x * icsi[k][j][i].x + ieta[k][j][i].y * icsi[k][j][i].y
444 + ieta[k][j][i].z * icsi[k][j][i].z) * iaj[k][j][i] +
445 dpdz * (izet[k][j][i].
x * icsi[k][j][i].
x + izet[k][j][i].
y * icsi[k][j][i].
y
446 + izet[k][j][i].
z * icsi[k][j][i].
z) * iaj[k][j][i]);
448 PetscReal correction = grad_p_x*scale;
450 ucont[k][j][i].
x -= correction;
458 if (!(nvert[k][j][i] > IBM_FLUID_THRESHOLD || nvert[k][j + 1][i] > IBM_FLUID_THRESHOLD)) {
459 PetscReal dpdc = 0.0, dpde = 0.0, dpdz = 0.0;
460 dpde = p[k][j + 1][i] - p[k][j][i];
466 if (nvert[k][j][i-1] + nvert[k][j+1][i-1] < 0.1) { dpdc = (p[k][j][i] + p[k][j+1][i] - p[k][j][i-1] - p[k][j+1][i-1]) * 0.5; }
468 if (nvert[k][j][i+1] + nvert[k][j+1][i+1] < 0.1) { dpdc = (p[k][j][i+1] + p[k][j+1][i+1] - p[k][j][i] - p[k][j+1][i]) * 0.5; }
470 if (nvert[k][j][i+1] + nvert[k][j+1][i+1] < 0.1) { dpdc = (p[k][j][i+1] + p[k][j+1][i+1] - p[k][j][i] - p[k][j+1][i]) * 0.5; }
471 }
else { dpdc = (p[k][j][i+1] + p[k][j+1][i+1] - p[k][j][i-1] - p[k][j+1][i-1]) * 0.25; }
477 if (nvert[k-1][j][i] + nvert[k-1][j+1][i] < 0.1) { dpdz = (p[k][j][i] + p[k][j+1][i] - p[k-1][j][i] - p[k-1][j+1][i]) * 0.5; }
479 if (nvert[k+1][j][i] + nvert[k+1][j+1][i] < 0.1) { dpdz = (p[k+1][j][i] + p[k+1][j+1][i] - p[k][j][i] - p[k][j+1][i]) * 0.5; }
481 if (nvert[k+1][j][i] + nvert[k+1][j+1][i] < 0.1) { dpdz = (p[k+1][j][i] + p[k+1][j+1][i] - p[k][j][i] - p[k][j+1][i]) * 0.5; }
482 }
else { dpdz = (p[k+1][j][i] + p[k+1][j+1][i] - p[k-1][j][i] - p[k-1][j+1][i]) * 0.25; }
484 PetscReal grad_p_y = (dpdc * (jcsi[k][j][i].
x * jeta[k][j][i].
x + jcsi[k][j][i].
y * jeta[k][j][i].
y + jcsi[k][j][i].
z * jeta[k][j][i].
z) * jaj[k][j][i] +
485 dpde * (jeta[k][j][i].x * jeta[k][j][i].x + jeta[k][j][i].y * jeta[k][j][i].y + jeta[k][j][i].z * jeta[k][j][i].z) * jaj[k][j][i] +
486 dpdz * (jzet[k][j][i].
x * jeta[k][j][i].
x + jzet[k][j][i].
y * jeta[k][j][i].
y + jzet[k][j][i].
z * jeta[k][j][i].
z) * jaj[k][j][i]);
488 PetscReal correction = grad_p_y*scale;
490 ucont[k][j][i].
y -= correction;
497 if (!(nvert[k][j][i] > IBM_FLUID_THRESHOLD || nvert[k + 1][j][i] > IBM_FLUID_THRESHOLD)) {
498 PetscReal dpdc = 0.0, dpde = 0.0, dpdz = 0.0;
499 dpdz = p[k + 1][j][i] - p[k][j][i];
505 if (nvert[k][j][i-1] + nvert[k+1][j][i-1] < 0.1) { dpdc = (p[k][j][i] + p[k+1][j][i] - p[k][j][i-1] - p[k+1][j][i-1]) * 0.5; }
507 if (nvert[k][j][i+1] + nvert[k+1][j][i+1] < 0.1) { dpdc = (p[k][j][i+1] + p[k+1][j][i+1] - p[k][j][i] - p[k+1][j][i]) * 0.5; }
509 if (nvert[k][j][i+1] + nvert[k+1][j][i+1] < 0.1) { dpdc = (p[k][j][i+1] + p[k+1][j][i+1] - p[k][j][i] - p[k+1][j][i]) * 0.5; }
510 }
else { dpdc = (p[k][j][i+1] + p[k+1][j][i+1] - p[k][j][i-1] - p[k+1][j][i-1]) * 0.25; }
516 if (nvert[k][j-1][i] + nvert[k+1][j-1][i] < 0.1) { dpde = (p[k][j][i] + p[k+1][j][i] - p[k][j-1][i] - p[k+1][j-1][i]) * 0.5; }
518 if (nvert[k][j+1][i] + nvert[k+1][j+1][i] < 0.1) { dpde = (p[k][j+1][i] + p[k+1][j+1][i] - p[k][j][i] - p[k+1][j][i]) * 0.5; }
520 if (nvert[k][j+1][i] + nvert[k+1][j+1][i] < 0.1) { dpde = (p[k][j+1][i] + p[k+1][j+1][i] - p[k][j][i] - p[k+1][j][i]) * 0.5; }
521 }
else { dpde = (p[k][j+1][i] + p[k+1][j+1][i] - p[k][j-1][i] - p[k+1][j-1][i]) * 0.25; }
523 PetscReal grad_p_z = (dpdc * (kcsi[k][j][i].
x * kzet[k][j][i].
x + kcsi[k][j][i].
y * kzet[k][j][i].
y + kcsi[k][j][i].
z * kzet[k][j][i].
z) * kaj[k][j][i] +
524 dpde * (keta[k][j][i].x * kzet[k][j][i].x + keta[k][j][i].y * kzet[k][j][i].y + keta[k][j][i].z * kzet[k][j][i].z) * kaj[k][j][i] +
525 dpdz * (kzet[k][j][i].
x * kzet[k][j][i].
x + kzet[k][j][i].
y * kzet[k][j][i].
y + kzet[k][j][i].
z * kzet[k][j][i].
z) * kaj[k][j][i]);
529 "[k=%d, j=%d, i=%d] ---- Neighbor Pressures ----\n"
530 " Central Z-Neighbors: p[k+1][j][i] = %g | p[k][j][i] = %g\n"
531 " Eta-Stencil (Y-dir): p[k][j-1][i] = %g, p[k+1][j-1][i] = %g | p[k][j+1][i] = %g, p[k+1][j+1][i] = %g\n"
532 " Csi-Stencil (X-dir): p[k][j][i-1] = %g, p[k+1][j][i-1] = %g | p[k][j][i+1] = %g, p[k+1][j][i+1] = %g\n",
534 p[k + 1][j][i], p[k][j][i],
535 p[k][j - 1][i], p[k + 1][j - 1][i], p[k][j + 1][i], p[k + 1][j + 1][i],
536 p[k][j][i - 1], p[k + 1][j][i - 1], p[k][j][i + 1], p[k + 1][j][i + 1]);
540 PetscReal correction = grad_p_z*scale;
542 ucont[k][j][i].
z -= correction;
553 for (PetscInt k=lzs; k<lze; k++) {
554 for (PetscInt j=lys; j<lye; j++) {
557 PetscReal dpdc = p[k][j][i+1] - p[k][j][i];
564 dpde = (p[k][j ][i] + p[k][j ][i+1] -
565 p[k][j-1][i] - p[k][j-1][i+1]) * 0.5;
569 if (nvert[k][j-1][i] + nvert[k][j-1][i+1] < 0.1) {
570 dpde = (p[k][j ][i] + p[k][j ][i+1] -
571 p[k][j-1][i] - p[k][j-1][i+1]) * 0.5;
575 if (nvert[k][j+1][i] + nvert[k][j+1][i+1] < 0.1) {
576 dpde = (p[k][j+1][i] + p[k][j+1][i+1] -
577 p[k][j ][i] - p[k][j ][i+1]) * 0.5;
581 if (nvert[k][j+1][i] + nvert[k][j+1][i+1] < 0.1) {
582 dpde = (p[k][j+1][i] + p[k][j+1][i+1] -
583 p[k][j ][i] - p[k][j ][i+1]) * 0.5;
587 dpde = (p[k][j+1][i] + p[k][j+1][i+1] -
588 p[k][j-1][i] - p[k][j-1][i+1]) * 0.25;
593 dpdz = (p[k ][j][i] + p[k ][j][i+1] -
594 p[k-1][j][i] - p[k-1][j][i+1]) * 0.5;
598 if (nvert[k-1][j][i] + nvert[k-1][j][i+1] < 0.1) {
599 dpdz = (p[k ][j][i] + p[k ][j][i+1] -
600 p[k-1][j][i] - p[k-1][j][i+1]) * 0.5;
604 if (nvert[k+1][j][i] + nvert[k+1][j][i+1] < 0.1) {
605 dpdz = (p[k+1][j][i] + p[k+1][j][i+1] -
606 p[k ][j][i] - p[k ][j][i+1]) * 0.5;
610 if (nvert[k+1][j][i] + nvert[k+1][j][i+1] < 0.1) {
611 dpdz = (p[k+1][j][i] + p[k+1][j][i+1] -
612 p[k ][j][i] - p[k ][j][i+1]) * 0.5;
616 dpdz = (p[k+1][j][i] + p[k+1][j][i+1] -
617 p[k-1][j][i] - p[k-1][j][i+1]) * 0.25;
622 if (!(nvert[k][j][i] + nvert[k][j][i+1])) {
624 (dpdc * (icsi[k][j][i].
x * icsi[k][j][i].
x +
625 icsi[k][j][i].
y * icsi[k][j][i].
y +
626 icsi[k][j][i].
z * icsi[k][j][i].
z) * iaj[k][j][i] +
627 dpde * (ieta[k][j][i].x * icsi[k][j][i].x +
628 ieta[k][j][i].y * icsi[k][j][i].y +
629 ieta[k][j][i].z * icsi[k][j][i].z) * iaj[k][j][i] +
630 dpdz * (izet[k][j][i].
x * icsi[k][j][i].
x +
631 izet[k][j][i].
y * icsi[k][j][i].
y +
632 izet[k][j][i].
z * icsi[k][j][i].
z) * iaj[k][j][i])
641 for (PetscInt k=lzs; k<lze; k++) {
642 for (PetscInt i=lxs; i<lxe; i++) {
649 dpdc = (p[k][j][i ] + p[k][j+1][i ] -
650 p[k][j][i-1] - p[k][j+1][i-1]) * 0.5;
654 if (nvert[k][j][i-1] + nvert[k][j+1][i-1] < 0.1) {
655 dpdc = (p[k][j][i ] + p[k][j+1][i ] -
656 p[k][j][i-1] - p[k][j+1][i-1]) * 0.5;
660 if (nvert[k][j][i+1] + nvert[k][j+1][i+1] < 0.1) {
661 dpdc = (p[k][j][i+1] + p[k][j+1][i+1] -
662 p[k][j][i ] - p[k][j+1][i ]) * 0.5;
666 if (nvert[k][j][i+1] + nvert[k][j+1][i+1] < 0.1) {
667 dpdc = (p[k][j][i+1] + p[k][j+1][i+1] -
668 p[k][j][i ] - p[k][j+1][i ]) * 0.5;
672 dpdc = (p[k][j][i+1] + p[k][j+1][i+1] -
673 p[k][j][i-1] - p[k][j+1][i-1]) * 0.25;
676 PetscReal dpde = p[k][j+1][i] - p[k][j][i];
680 dpdz = (p[k ][j][i] + p[k ][j+1][i] -
681 p[k-1][j][i] - p[k-1][j+1][i]) * 0.5;
685 if (nvert[k-1][j][i] + nvert[k-1][j+1][i] < 0.1) {
686 dpdz = (p[k ][j][i] + p[k ][j+1][i] -
687 p[k-1][j][i] - p[k-1][j+1][i]) * 0.5;
691 if (nvert[k+1][j][i] + nvert[k+1][j+1][i] < 0.1) {
692 dpdz = (p[k+1][j][i] + p[k+1][j+1][i] -
693 p[k ][j][i] - p[k ][j+1][i]) * 0.5;
697 if (nvert[k+1][j][i] + nvert[k+1][j+1][i] < 0.1) {
698 dpdz = (p[k+1][j][i] + p[k+1][j+1][i] -
699 p[k ][j][i] - p[k ][j+1][i]) * 0.5;
703 dpdz = (p[k+1][j][i] + p[k+1][j+1][i] -
704 p[k-1][j][i] - p[k-1][j+1][i]) * 0.25;
707 if (!(nvert[k][j][i] + nvert[k][j+1][i])) {
709 (dpdc * (jcsi[k][j][i].
x * jeta[k][j][i].
x +
710 jcsi[k][j][i].
y * jeta[k][j][i].
y +
711 jcsi[k][j][i].
z * jeta[k][j][i].
z) * jaj[k][j][i] +
712 dpde * (jeta[k][j][i].x * jeta[k][j][i].x +
713 jeta[k][j][i].y * jeta[k][j][i].y +
714 jeta[k][j][i].z * jeta[k][j][i].z) * jaj[k][j][i] +
715 dpdz * (jzet[k][j][i].
x * jeta[k][j][i].
x +
716 jzet[k][j][i].
y * jeta[k][j][i].
y +
717 jzet[k][j][i].
z * jeta[k][j][i].
z) * jaj[k][j][i])
725 for (PetscInt j=lys; j<lye; j++) {
726 for (PetscInt i=lxs; i<lxe; i++) {
734 dpdc = (p[k][j][i ] + p[k+1][j][i ] -
735 p[k][j][i-1] - p[k+1][j][i-1]) * 0.5;
739 if (nvert[k][j][i-1] + nvert[k+1][j][i-1] < 0.1) {
740 dpdc = (p[k][j][i ] + p[k+1][j][i ] -
741 p[k][j][i-1] - p[k+1][j][i-1]) * 0.5;
745 if (nvert[k][j][i+1] + nvert[k+1][j][i+1] < 0.1) {
746 dpdc = (p[k][j][i+1] + p[k+1][j][i+1] -
747 p[k][j][i ] - p[k+1][j][i ]) * 0.5;
751 if (nvert[k][j][i+1] + nvert[k+1][j][i+1] < 0.1) {
752 dpdc = (p[k][j][i+1] + p[k+1][j][i+1] -
753 p[k][j][i ] - p[k+1][j][i ]) * 0.5;
757 dpdc = (p[k][j][i+1] + p[k+1][j][i+1] -
758 p[k][j][i-1] - p[k+1][j][i-1]) * 0.25;
763 dpde = (p[k][j ][i] + p[k+1][j ][i] -
764 p[k][j-1][i] - p[k+1][j-1][i]) * 0.5;
768 if (nvert[k][j-1][i] + nvert[k+1][j-1][i] < 0.1) {
769 dpde = (p[k][j ][i] + p[k+1][j ][i] -
770 p[k][j-1][i] - p[k+1][j-1][i]) * 0.5;
774 if (nvert[k][j+1][i] + nvert[k+1][j+1][i] < 0.1) {
775 dpde = (p[k][j+1][i] + p[k+1][j+1][i] -
776 p[k][j ][i] - p[k+1][j ][i]) * 0.5;
780 if (nvert[k][j+1][i] + nvert[k+1][j+1][i] < 0.1) {
781 dpde = (p[k][j+1][i] + p[k+1][j+1][i] -
782 p[k][j ][i] - p[k+1][j ][i]) * 0.5;
786 dpde = (p[k][j+1][i] + p[k+1][j+1][i] -
787 p[k][j-1][i] - p[k+1][j-1][i]) * 0.25;
790 PetscReal dpdz = p[k+1][j][i] - p[k][j][i];
792 if (!(nvert[k][j][i] + nvert[k+1][j][i])) {
795 (dpdc * (kcsi[k][j][i].
x * kzet[k][j][i].
x +
796 kcsi[k][j][i].
y * kzet[k][j][i].
y +
797 kcsi[k][j][i].
z * kzet[k][j][i].
z) * kaj[k][j][i] +
798 dpde * (keta[k][j][i].x * kzet[k][j][i].x +
799 keta[k][j][i].y * kzet[k][j][i].y +
800 keta[k][j][i].z * kzet[k][j][i].z) * kaj[k][j][i] +
801 dpdz * (kzet[k][j][i].
x * kzet[k][j][i].
x +
802 kzet[k][j][i].
y * kzet[k][j][i].
y +
803 kzet[k][j][i].
z * kzet[k][j][i].
z) * kaj[k][j][i])
819 DMDAVecRestoreArray(fda, user->
Ucont, &ucont);
822 DMDAVecRestoreArray(fda, user->
lICsi, &icsi); DMDAVecRestoreArray(fda, user->
lIEta, &ieta); DMDAVecRestoreArray(fda, user->
lIZet, &izet);
823 DMDAVecRestoreArray(fda, user->
lJCsi, &jcsi); DMDAVecRestoreArray(fda, user->
lJEta, &jeta); DMDAVecRestoreArray(fda, user->
lJZet, &jzet);
824 DMDAVecRestoreArray(fda, user->
lKCsi, &kcsi); DMDAVecRestoreArray(fda, user->
lKEta, &keta); DMDAVecRestoreArray(fda, user->
lKZet, &kzet);
825 DMDAVecRestoreArray(da, user->
lIAj, &iaj); DMDAVecRestoreArray(da, user->
lJAj, &jaj); DMDAVecRestoreArray(da, user->
lKAj, &kaj);
826 DMDAVecRestoreArray(da, user->
lP, &p);
827 DMDAVecRestoreArray(da, user->
lNvert, &nvert);
831 DMGlobalToLocalBegin(fda, user->
Ucont, INSERT_VALUES, user->
lUcont);
832 DMGlobalToLocalEnd(fda, user->
Ucont, INSERT_VALUES, user->
lUcont);
843 PetscFunctionReturn(0);
1534 PetscFunctionBeginUser;
1537 PetscErrorCode ierr;
1544 DM da = user->
da, fda = user->
fda;
1545 DMDALocalInfo info = user->
info;
1546 PetscInt IM = user->
IM, JM = user->
JM, KM = user->
KM;
1550 PetscInt mx = info.mx, my = info.my, mz = info.mz;
1551 PetscInt xs = info.xs, xe = info.xs + info.xm;
1552 PetscInt ys = info.ys, ye = info.ys + info.ym;
1553 PetscInt zs = info.zs, ze = info.zs + info.zm;
1554 PetscInt gxs = info.gxs, gxe = gxs + info.gxm;
1555 PetscInt gys = info.gys, gye = gys + info.gym;
1556 PetscInt gzs = info.gzs, gze = gzs + info.gzm;
1559 const PetscReal IBM_FLUID_THRESHOLD = 0.1;
1564 PetscInt N = mx * my * mz;
1566 VecGetLocalSize(user->
Phi, &M);
1568 MatCreateAIJ(PETSC_COMM_WORLD, M, M, N, N, 19, PETSC_NULLPTR, 19, PETSC_NULLPTR, &(user->
A));
1573 MatZeroEntries(user->
A);
1576 Cmpnts ***csi, ***eta, ***zet, ***icsi, ***ieta, ***izet, ***jcsi, ***jeta, ***jzet, ***kcsi, ***keta, ***kzet;
1577 PetscReal ***aj, ***iaj, ***jaj, ***kaj, ***nvert;
1578 DMDAVecGetArray(fda, user->
lCsi, &csi); DMDAVecGetArray(fda, user->
lEta, &eta); DMDAVecGetArray(fda, user->
lZet, &zet);
1579 DMDAVecGetArray(fda, user->
lICsi, &icsi); DMDAVecGetArray(fda, user->
lIEta, &ieta); DMDAVecGetArray(fda, user->
lIZet, &izet);
1580 DMDAVecGetArray(fda, user->
lJCsi, &jcsi); DMDAVecGetArray(fda, user->
lJEta, &jeta); DMDAVecGetArray(fda, user->
lJZet, &jzet);
1581 DMDAVecGetArray(fda, user->
lKCsi, &kcsi); DMDAVecGetArray(fda, user->
lKEta, &keta); DMDAVecGetArray(fda, user->
lKZet, &kzet);
1582 DMDAVecGetArray(da, user->
lAj, &aj); DMDAVecGetArray(da, user->
lIAj, &iaj); DMDAVecGetArray(da, user->
lJAj, &jaj); DMDAVecGetArray(da, user->
lKAj, &kaj);
1583 DMDAVecGetArray(da, user->
lNvert, &nvert);
1586 Vec G11, G12, G13, G21, G22, G23, G31, G32, G33;
1587 PetscReal ***g11, ***g12, ***g13, ***g21, ***g22, ***g23, ***g31, ***g32, ***g33;
1588 VecDuplicate(user->
lAj, &G11); VecDuplicate(user->
lAj, &G12); VecDuplicate(user->
lAj, &G13);
1589 VecDuplicate(user->
lAj, &G21); VecDuplicate(user->
lAj, &G22); VecDuplicate(user->
lAj, &G23);
1590 VecDuplicate(user->
lAj, &G31); VecDuplicate(user->
lAj, &G32); VecDuplicate(user->
lAj, &G33);
1591 DMDAVecGetArray(da, G11, &g11); DMDAVecGetArray(da, G12, &g12); DMDAVecGetArray(da, G13, &g13);
1592 DMDAVecGetArray(da, G21, &g21); DMDAVecGetArray(da, G22, &g22); DMDAVecGetArray(da, G23, &g23);
1593 DMDAVecGetArray(da, G31, &g31); DMDAVecGetArray(da, G32, &g32); DMDAVecGetArray(da, G33, &g33);
1599 for (k = gzs; k < gze; k++) {
1600 for (j = gys; j < gye; j++) {
1601 for (i = gxs; i < gxe; i++) {
1604 if(i>-1 && j>-1 && k>-1 && i<IM+1 && j<JM+1 && k<KM+1){
1605 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];
1606 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];
1607 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];
1608 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];
1609 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];
1610 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];
1611 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];
1612 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];
1613 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];
1625 PetscInt x_str, x_end, y_str, y_end, z_str, z_end;
1627 else { x_end = mx - 2; x_str = 1; }
1629 else { y_end = my - 2; y_str = 1; }
1631 else { z_end = mz - 2; z_str = 1; }
1634 for (k = zs; k < ze; k++) {
1635 for (j = ys; j < ye; j++) {
1636 for (i = xs; i < xe; i++) {
1637 PetscScalar vol[19];
1639 PetscInt row =
Gidx(i, j, k, user);
1644 if (i == 0 || i == mx - 1 || j == 0 || j == my - 1 || k == 0 || k == mz - 1 || nvert[k][j][i] > IBM_FLUID_THRESHOLD) {
1647 MatSetValues(user->
A, 1, &row, 1, &idx[
CP], &vol[
CP], INSERT_VALUES);
1651 for (PetscInt m = 0; m < 19; m++) {
1658 if (nvert[k][j][i + 1] < IBM_FLUID_THRESHOLD && i != x_end) {
1660 vol[
CP] -= g11[k][j][i];
1661 vol[
EP] += g11[k][j][i];
1668 vol[
CP] += g12[k][j][i] * 0.5; vol[
EP] += g12[k][j][i] * 0.5;
1669 vol[
SP] -= g12[k][j][i] * 0.5; vol[
SE] -= g12[k][j][i] * 0.5;
1673 if (nvert[k][j-1][i] + nvert[k][j-1][i+1] < 0.1) {
1674 vol[
CP] += g12[k][j][i] * 0.5; vol[
EP] += g12[k][j][i] * 0.5;
1675 vol[
SP] -= g12[k][j][i] * 0.5; vol[
SE] -= g12[k][j][i] * 0.5;
1679 if (nvert[k][j+1][i] + nvert[k][j+1][i+1] < 0.1) {
1680 vol[
NP] += g12[k][j][i] * 0.5; vol[
NE] += g12[k][j][i] * 0.5;
1681 vol[
CP] -= g12[k][j][i] * 0.5; vol[
EP] -= g12[k][j][i] * 0.5;
1685 if (nvert[k][j+1][i] + nvert[k][j+1][i+1] < 0.1) {
1686 vol[
NP] += g12[k][j][i] * 0.5; vol[
NE] += g12[k][j][i] * 0.5;
1687 vol[
CP] -= g12[k][j][i] * 0.5; vol[
EP] -= g12[k][j][i] * 0.5;
1691 vol[
NP] += g12[k][j][i] * 0.25; vol[
NE] += g12[k][j][i] * 0.25;
1692 vol[
SP] -= g12[k][j][i] * 0.25; vol[
SE] -= g12[k][j][i] * 0.25;
1698 vol[
CP] += g13[k][j][i] * 0.5; vol[
EP] += g13[k][j][i] * 0.5;
1699 vol[
BP] -= g13[k][j][i] * 0.5; vol[
BE] -= g13[k][j][i] * 0.5;
1703 if (nvert[k-1][j][i] + nvert[k-1][j][i+1] < 0.1) {
1704 vol[
CP] += g13[k][j][i] * 0.5; vol[
EP] += g13[k][j][i] * 0.5;
1705 vol[
BP] -= g13[k][j][i] * 0.5; vol[
BE] -= g13[k][j][i] * 0.5;
1709 if (nvert[k+1][j][i] + nvert[k+1][j][i+1] < 0.1) {
1710 vol[
TP] += g13[k][j][i] * 0.5; vol[
TE] += g13[k][j][i] * 0.5;
1711 vol[
CP] -= g13[k][j][i] * 0.5; vol[
EP] -= g13[k][j][i] * 0.5;
1715 if (nvert[k+1][j][i] + nvert[k+1][j][i+1] < 0.1) {
1716 vol[
TP] += g13[k][j][i] * 0.5; vol[
TE] += g13[k][j][i] * 0.5;
1717 vol[
CP] -= g13[k][j][i] * 0.5; vol[
EP] -= g13[k][j][i] * 0.5;
1721 vol[
TP] += g13[k][j][i] * 0.25; vol[
TE] += g13[k][j][i] * 0.25;
1722 vol[
BP] -= g13[k][j][i] * 0.25; vol[
BE] -= g13[k][j][i] * 0.25;
1729 if (nvert[k][j][i-1] < IBM_FLUID_THRESHOLD && i != x_str) {
1730 vol[
CP] -= g11[k][j][i-1];
1731 vol[
WP] += g11[k][j][i-1];
1735 vol[
CP] -= g12[k][j][i-1] * 0.5; vol[
WP] -= g12[k][j][i-1] * 0.5;
1736 vol[
SP] += g12[k][j][i-1] * 0.5; vol[
SW] += g12[k][j][i-1] * 0.5;
1740 if (nvert[k][j-1][i] + nvert[k][j-1][i-1] < 0.1) {
1741 vol[
CP] -= g12[k][j][i-1] * 0.5; vol[
WP] -= g12[k][j][i-1] * 0.5;
1742 vol[
SP] += g12[k][j][i-1] * 0.5; vol[
SW] += g12[k][j][i-1] * 0.5;
1746 if (nvert[k][j+1][i] + nvert[k][j+1][i-1] < 0.1) {
1747 vol[
NP] -= g12[k][j][i-1] * 0.5; vol[
NW] -= g12[k][j][i-1] * 0.5;
1748 vol[
CP] += g12[k][j][i-1] * 0.5; vol[
WP] += g12[k][j][i-1] * 0.5;
1752 if (nvert[k][j+1][i] + nvert[k][j+1][i-1] < 0.1) {
1753 vol[
NP] -= g12[k][j][i-1] * 0.5; vol[
NW] -= g12[k][j][i-1] * 0.5;
1754 vol[
CP] += g12[k][j][i-1] * 0.5; vol[
WP] += g12[k][j][i-1] * 0.5;
1758 vol[
NP] -= g12[k][j][i-1] * 0.25; vol[
NW] -= g12[k][j][i-1] * 0.25;
1759 vol[
SP] += g12[k][j][i-1] * 0.25; vol[
SW] += g12[k][j][i-1] * 0.25;
1764 vol[
CP] -= g13[k][j][i-1] * 0.5; vol[
WP] -= g13[k][j][i-1] * 0.5;
1765 vol[
BP] += g13[k][j][i-1] * 0.5; vol[
BW] += g13[k][j][i-1] * 0.5;
1769 if (nvert[k-1][j][i] + nvert[k-1][j][i-1] < 0.1) {
1770 vol[
CP] -= g13[k][j][i-1] * 0.5; vol[
WP] -= g13[k][j][i-1] * 0.5;
1771 vol[
BP] += g13[k][j][i-1] * 0.5; vol[
BW] += g13[k][j][i-1] * 0.5;
1775 if (nvert[k+1][j][i] + nvert[k+1][j][i-1] < 0.1) {
1776 vol[
TP] -= g13[k][j][i-1] * 0.5; vol[
TW] -= g13[k][j][i-1] * 0.5;
1777 vol[
CP] += g13[k][j][i-1] * 0.5; vol[
WP] += g13[k][j][i-1] * 0.5;
1781 if (nvert[k+1][j][i] + nvert[k+1][j][i-1] < 0.1) {
1782 vol[
TP] -= g13[k][j][i-1] * 0.5; vol[
TW] -= g13[k][j][i-1] * 0.5;
1783 vol[
CP] += g13[k][j][i-1] * 0.5; vol[
WP] += g13[k][j][i-1] * 0.5;
1787 vol[
TP] -= g13[k][j][i-1] * 0.25; vol[
TW] -= g13[k][j][i-1] * 0.25;
1788 vol[
BP] += g13[k][j][i-1] * 0.25; vol[
BW] += g13[k][j][i-1] * 0.25;
1795 if (nvert[k][j+1][i] < IBM_FLUID_THRESHOLD && j != y_end) {
1798 vol[
CP] += g21[k][j][i] * 0.5; vol[
NP] += g21[k][j][i] * 0.5;
1799 vol[
WP] -= g21[k][j][i] * 0.5; vol[
NW] -= g21[k][j][i] * 0.5;
1803 if (nvert[k][j][i-1] + nvert[k][j+1][i-1] < 0.1) {
1804 vol[
CP] += g21[k][j][i] * 0.5; vol[
NP] += g21[k][j][i] * 0.5;
1805 vol[
WP] -= g21[k][j][i] * 0.5; vol[
NW] -= g21[k][j][i] * 0.5;
1809 if (nvert[k][j][i+1] + nvert[k][j+1][i+1] < 0.1) {
1810 vol[
EP] += g21[k][j][i] * 0.5; vol[
NE] += g21[k][j][i] * 0.5;
1811 vol[
CP] -= g21[k][j][i] * 0.5; vol[
NP] -= g21[k][j][i] * 0.5;
1815 if (nvert[k][j][i+1] + nvert[k][j+1][i+1] < 0.1) {
1816 vol[
EP] += g21[k][j][i] * 0.5; vol[
NE] += g21[k][j][i] * 0.5;
1817 vol[
CP] -= g21[k][j][i] * 0.5; vol[
NP] -= g21[k][j][i] * 0.5;
1821 vol[
EP] += g21[k][j][i] * 0.25; vol[
NE] += g21[k][j][i] * 0.25;
1822 vol[
WP] -= g21[k][j][i] * 0.25; vol[
NW] -= g21[k][j][i] * 0.25;
1825 vol[
CP] -= g22[k][j][i];
1826 vol[
NP] += g22[k][j][i];
1830 vol[
CP] += g23[k][j][i] * 0.5; vol[
NP] += g23[k][j][i] * 0.5;
1831 vol[
BP] -= g23[k][j][i] * 0.5; vol[
BN] -= g23[k][j][i] * 0.5;
1835 if (nvert[k-1][j][i] + nvert[k-1][j+1][i] < 0.1) {
1836 vol[
CP] += g23[k][j][i] * 0.5; vol[
NP] += g23[k][j][i] * 0.5;
1837 vol[
BP] -= g23[k][j][i] * 0.5; vol[
BN] -= g23[k][j][i] * 0.5;
1841 if (nvert[k+1][j][i] + nvert[k+1][j+1][i] < 0.1) {
1842 vol[
TP] += g23[k][j][i] * 0.5; vol[
TN] += g23[k][j][i] * 0.5;
1843 vol[
CP] -= g23[k][j][i] * 0.5; vol[
NP] -= g23[k][j][i] * 0.5;
1847 if (nvert[k+1][j][i] + nvert[k+1][j+1][i] < 0.1) {
1848 vol[
TP] += g23[k][j][i] * 0.5; vol[
TN] += g23[k][j][i] * 0.5;
1849 vol[
CP] -= g23[k][j][i] * 0.5; vol[
NP] -= g23[k][j][i] * 0.5;
1853 vol[
TP] += g23[k][j][i] * 0.25; vol[
TN] += g23[k][j][i] * 0.25;
1854 vol[
BP] -= g23[k][j][i] * 0.25; vol[
BN] -= g23[k][j][i] * 0.25;
1861 if (nvert[k][j-1][i] < IBM_FLUID_THRESHOLD && j != y_str) {
1864 vol[
CP] -= g21[k][j-1][i] * 0.5; vol[
SP] -= g21[k][j-1][i] * 0.5;
1865 vol[
WP] += g21[k][j-1][i] * 0.5; vol[
SW] += g21[k][j-1][i] * 0.5;
1869 if (nvert[k][j][i-1] + nvert[k][j-1][i-1] < 0.1) {
1870 vol[
CP] -= g21[k][j-1][i] * 0.5; vol[
SP] -= g21[k][j-1][i] * 0.5;
1871 vol[
WP] += g21[k][j-1][i] * 0.5; vol[
SW] += g21[k][j-1][i] * 0.5;
1875 if (nvert[k][j][i+1] + nvert[k][j-1][i+1] < 0.1) {
1876 vol[
EP] -= g21[k][j-1][i] * 0.5; vol[
SE] -= g21[k][j-1][i] * 0.5;
1877 vol[
CP] += g21[k][j-1][i] * 0.5; vol[
SP] += g21[k][j-1][i] * 0.5;
1881 if (nvert[k][j][i+1] + nvert[k][j-1][i+1] < 0.1) {
1882 vol[
EP] -= g21[k][j-1][i] * 0.5; vol[
SE] -= g21[k][j-1][i] * 0.5;
1883 vol[
CP] += g21[k][j-1][i] * 0.5; vol[
SP] += g21[k][j-1][i] * 0.5;
1887 vol[
EP] -= g21[k][j-1][i] * 0.25; vol[
SE] -= g21[k][j-1][i] * 0.25;
1888 vol[
WP] += g21[k][j-1][i] * 0.25; vol[
SW] += g21[k][j-1][i] * 0.25;
1891 vol[
CP] -= g22[k][j-1][i];
1892 vol[
SP] += g22[k][j-1][i];
1896 vol[
CP] -= g23[k][j-1][i] * 0.5; vol[
SP] -= g23[k][j-1][i] * 0.5;
1897 vol[
BP] += g23[k][j-1][i] * 0.5; vol[
BS] += g23[k][j-1][i] * 0.5;
1901 if (nvert[k-1][j][i] + nvert[k-1][j-1][i] < 0.1 ) {
1902 vol[
CP] -= g23[k][j-1][i] * 0.5; vol[
SP] -= g23[k][j-1][i] * 0.5;
1903 vol[
BP] += g23[k][j-1][i] * 0.5; vol[
BS] += g23[k][j-1][i] * 0.5;
1907 if (nvert[k+1][j][i] + nvert[k+1][j-1][i] < 0.1) {
1908 vol[
TP] -= g23[k][j-1][i] * 0.5; vol[
TS] -= g23[k][j-1][i] * 0.5;
1909 vol[
CP] += g23[k][j-1][i] * 0.5; vol[
SP] += g23[k][j-1][i] * 0.5;
1913 if (nvert[k+1][j][i] + nvert[k+1][j-1][i] < 0.1) {
1914 vol[
TP] -= g23[k][j-1][i] * 0.5; vol[
TS] -= g23[k][j-1][i] * 0.5;
1915 vol[
CP] += g23[k][j-1][i] * 0.5; vol[
SP] += g23[k][j-1][i] * 0.5;
1919 vol[
TP] -= g23[k][j-1][i] * 0.25; vol[
TS] -= g23[k][j-1][i] * 0.25;
1920 vol[
BP] += g23[k][j-1][i] * 0.25; vol[
BS] += g23[k][j-1][i] * 0.25;
1927 if (nvert[k+1][j][i] < IBM_FLUID_THRESHOLD && k != z_end) {
1930 vol[
CP] += g31[k][j][i] * 0.5; vol[
TP] += g31[k][j][i] * 0.5;
1931 vol[
WP] -= g31[k][j][i] * 0.5; vol[
TW] -= g31[k][j][i] * 0.5;
1935 if (nvert[k][j][i-1] + nvert[k+1][j][i-1] < 0.1) {
1936 vol[
CP] += g31[k][j][i] * 0.5; vol[
TP] += g31[k][j][i] * 0.5;
1937 vol[
WP] -= g31[k][j][i] * 0.5; vol[
TW] -= g31[k][j][i] * 0.5;
1941 if (nvert[k][j][i+1] + nvert[k+1][j][i+1] < 0.1) {
1942 vol[
EP] += g31[k][j][i] * 0.5; vol[
TE] += g31[k][j][i] * 0.5;
1943 vol[
CP] -= g31[k][j][i] * 0.5; vol[
TP] -= g31[k][j][i] * 0.5;
1947 if (nvert[k][j][i+1] + nvert[k+1][j][i+1] < 0.1) {
1948 vol[
EP] += g31[k][j][i] * 0.5; vol[
TE] += g31[k][j][i] * 0.5;
1949 vol[
CP] -= g31[k][j][i] * 0.5; vol[
TP] -= g31[k][j][i] * 0.5;
1953 vol[
EP] += g31[k][j][i] * 0.25; vol[
TE] += g31[k][j][i] * 0.25;
1954 vol[
WP] -= g31[k][j][i] * 0.25; vol[
TW] -= g31[k][j][i] * 0.25;
1959 vol[
CP] += g32[k][j][i] * 0.5; vol[
TP] += g32[k][j][i] * 0.5;
1960 vol[
SP] -= g32[k][j][i] * 0.5; vol[
TS] -= g32[k][j][i] * 0.5;
1964 if (nvert[k][j-1][i] + nvert[k+1][j-1][i] < 0.1) {
1965 vol[
CP] += g32[k][j][i] * 0.5; vol[
TP] += g32[k][j][i] * 0.5;
1966 vol[
SP] -= g32[k][j][i] * 0.5; vol[
TS] -= g32[k][j][i] * 0.5;
1970 if (nvert[k][j+1][i] + nvert[k+1][j+1][i] < 0.1) {
1971 vol[
NP] += g32[k][j][i] * 0.5; vol[
TN] += g32[k][j][i] * 0.5;
1972 vol[
CP] -= g32[k][j][i] * 0.5; vol[
TP] -= g32[k][j][i] * 0.5;
1976 if (nvert[k][j+1][i] + nvert[k+1][j+1][i] < 0.1) {
1977 vol[
NP] += g32[k][j][i] * 0.5; vol[
TN] += g32[k][j][i] * 0.5;
1978 vol[
CP] -= g32[k][j][i] * 0.5; vol[
TP] -= g32[k][j][i] * 0.5;
1982 vol[
NP] += g32[k][j][i] * 0.25; vol[
TN] += g32[k][j][i] * 0.25;
1983 vol[
SP] -= g32[k][j][i] * 0.25; vol[
TS] -= g32[k][j][i] * 0.25;
1986 vol[
CP] -= g33[k][j][i];
1987 vol[
TP] += g33[k][j][i];
1993 if (nvert[k-1][j][i] < IBM_FLUID_THRESHOLD && k != z_str) {
1996 vol[
CP] -= g31[k-1][j][i] * 0.5; vol[
BP] -= g31[k-1][j][i] * 0.5;
1997 vol[
WP] += g31[k-1][j][i] * 0.5; vol[
BW] += g31[k-1][j][i] * 0.5;
2001 if (nvert[k][j][i-1] + nvert[k-1][j][i-1] < 0.1) {
2002 vol[
CP] -= g31[k-1][j][i] * 0.5; vol[
BP] -= g31[k-1][j][i] * 0.5;
2003 vol[
WP] += g31[k-1][j][i] * 0.5; vol[
BW] += g31[k-1][j][i] * 0.5;
2007 if (nvert[k][j][i+1] + nvert[k-1][j][i+1] < 0.1) {
2008 vol[
EP] -= g31[k-1][j][i] * 0.5; vol[
BE] -= g31[k-1][j][i] * 0.5;
2009 vol[
CP] += g31[k-1][j][i] * 0.5; vol[
BP] += g31[k-1][j][i] * 0.5;
2013 if (nvert[k][j][i+1] + nvert[k-1][j][i+1] < 0.1) {
2014 vol[
EP] -= g31[k-1][j][i] * 0.5; vol[
BE] -= g31[k-1][j][i] * 0.5;
2015 vol[
CP] += g31[k-1][j][i] * 0.5; vol[
BP] += g31[k-1][j][i] * 0.5;
2019 vol[
EP] -= g31[k-1][j][i] * 0.25; vol[
BE] -= g31[k-1][j][i] * 0.25;
2020 vol[
WP] += g31[k-1][j][i] * 0.25; vol[
BW] += g31[k-1][j][i] * 0.25;
2025 vol[
CP] -= g32[k-1][j][i] * 0.5; vol[
BP] -= g32[k-1][j][i] * 0.5;
2026 vol[
SP] += g32[k-1][j][i] * 0.5; vol[
BS] += g32[k-1][j][i] * 0.5;
2030 if (nvert[k][j-1][i] + nvert[k-1][j-1][i] < 0.1) {
2031 vol[
CP] -= g32[k-1][j][i] * 0.5; vol[
BP] -= g32[k-1][j][i] * 0.5;
2032 vol[
SP] += g32[k-1][j][i] * 0.5; vol[
BS] += g32[k-1][j][i] * 0.5;
2036 if (nvert[k][j+1][i] + nvert[k-1][j+1][i] < 0.1) {
2037 vol[
NP] -= g32[k-1][j][i] * 0.5; vol[
BN] -= g32[k-1][j][i] * 0.5;
2038 vol[
CP] += g32[k-1][j][i] * 0.5; vol[
BP] += g32[k-1][j][i] * 0.5;
2042 if (nvert[k][j+1][i] + nvert[k-1][j+1][i] < 0.1) {
2043 vol[
NP] -= g32[k-1][j][i] * 0.5; vol[
BN] -= g32[k-1][j][i] * 0.5;
2044 vol[
CP] += g32[k-1][j][i] * 0.5; vol[
BP] += g32[k-1][j][i] * 0.5;
2048 vol[
NP] -= g32[k-1][j][i] * 0.25; vol[
BN] -= g32[k-1][j][i] * 0.25;
2049 vol[
SP] += g32[k-1][j][i] * 0.25; vol[
BS] += g32[k-1][j][i] * 0.25;
2052 vol[
CP] -= g33[k-1][j][i];
2053 vol[
BP] += g33[k-1][j][i];
2059 for (PetscInt m = 0; m < 19; m++) {
2060 vol[m] *= -aj[k][j][i];
2064 idx[
CP] =
Gidx(i, j, k, user);
2071 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);
2072 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);
2073 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);
2074 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);
2075 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);
2076 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);
2077 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);
2078 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);
2079 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);
2080 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);
2081 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);
2082 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);
2085 MatSetValues(user->
A, 1, &row, 19, idx, vol, INSERT_VALUES);
2096 MatAssemblyBegin(user->
A, MAT_FINAL_ASSEMBLY);
2097 MatAssemblyEnd(user->
A, MAT_FINAL_ASSEMBLY);
2101 ierr = MatNorm(user->
A,NORM_INFINITY,&max_A);CHKERRQ(ierr);
2110 DMDAVecRestoreArray(da, G11, &g11); DMDAVecRestoreArray(da, G12, &g12); DMDAVecRestoreArray(da, G13, &g13);
2111 DMDAVecRestoreArray(da, G21, &g21); DMDAVecRestoreArray(da, G22, &g22); DMDAVecRestoreArray(da, G23, &g23);
2112 DMDAVecRestoreArray(da, G31, &g31); DMDAVecRestoreArray(da, G32, &g32); DMDAVecRestoreArray(da, G33, &g33);
2114 VecDestroy(&G11); VecDestroy(&G12); VecDestroy(&G13);
2115 VecDestroy(&G21); VecDestroy(&G22); VecDestroy(&G23);
2116 VecDestroy(&G31); VecDestroy(&G32); VecDestroy(&G33);
2118 DMDAVecRestoreArray(fda, user->
lCsi, &csi); DMDAVecRestoreArray(fda, user->
lEta, &eta); DMDAVecRestoreArray(fda, user->
lZet, &zet);
2119 DMDAVecRestoreArray(fda, user->
lICsi, &icsi); DMDAVecRestoreArray(fda, user->
lIEta, &ieta); DMDAVecRestoreArray(fda, user->
lIZet, &izet);
2120 DMDAVecRestoreArray(fda, user->
lJCsi, &jcsi); DMDAVecRestoreArray(fda, user->
lJEta, &jeta); DMDAVecRestoreArray(fda, user->
lJZet, &jzet);
2121 DMDAVecRestoreArray(fda, user->
lKCsi, &kcsi); DMDAVecRestoreArray(fda, user->
lKEta, &keta); DMDAVecRestoreArray(fda, user->
lKZet, &kzet);
2122 DMDAVecRestoreArray(da, user->
lAj, &aj); DMDAVecRestoreArray(da, user->
lIAj, &iaj); DMDAVecRestoreArray(da, user->
lJAj, &jaj); DMDAVecRestoreArray(da, user->
lKAj, &kaj);
2123 DMDAVecRestoreArray(da, user->
lNvert, &nvert);
2127 PetscFunctionReturn(0);
2231 PetscReal *ibm_Area, PetscInt flg)
2233 PetscErrorCode ierr;
2235 DM da = user->
da, fda = user->
fda;
2237 DMDALocalInfo info = user->
info;
2239 PetscInt xs = info.xs, xe = info.xs + info.xm;
2240 PetscInt ys = info.ys, ye = info.ys + info.ym;
2241 PetscInt zs = info.zs, ze = info.zs + info.zm;
2242 PetscInt mx = info.mx, my = info.my, mz = info.mz;
2245 PetscInt lxs, lys, lzs, lxe, lye, lze;
2251 if (xs==0) lxs = xs+1;
2252 if (ys==0) lys = ys+1;
2253 if (zs==0) lzs = zs+1;
2255 if (xe==mx) lxe = xe-1;
2256 if (ye==my) lye = ye-1;
2257 if (ze==mz) lze = ze-1;
2259 PetscReal ***nvert, ibmval=1.5;
2260 Cmpnts ***ucor, ***csi, ***eta, ***zet;
2261 DMDAVecGetArray(fda, user->
Ucont, &ucor);
2262 DMDAVecGetArray(fda, user->
lCsi, &csi);
2263 DMDAVecGetArray(fda, user->
lEta, &eta);
2264 DMDAVecGetArray(fda, user->
lZet, &zet);
2265 DMDAVecGetArray(da, user->
lNvert, &nvert);
2267 PetscReal libm_Flux, libm_area;
2270 for (k=lzs; k<lze; k++) {
2271 for (j=lys; j<lye; j++) {
2272 for (i=lxs; i<lxe; i++) {
2273 if (nvert[k][j][i] < 0.1) {
2274 if (nvert[k][j][i+1] > ibmval-0.4 && nvert[k][j][i+1] < ibmval && i < mx-2) {
2275 libm_Flux += ucor[k][j][i].
x;
2276 libm_area += sqrt(csi[k][j][i].x * csi[k][j][i].x +
2277 csi[k][j][i].y * csi[k][j][i].y +
2278 csi[k][j][i].z * csi[k][j][i].z);
2281 if (nvert[k][j+1][i] > ibmval-0.4 && nvert[k][j+1][i] < ibmval && j < my-2) {
2282 libm_Flux += ucor[k][j][i].
y;
2283 libm_area += sqrt(eta[k][j][i].x * eta[k][j][i].x +
2284 eta[k][j][i].y * eta[k][j][i].y +
2285 eta[k][j][i].z * eta[k][j][i].z);
2287 if (nvert[k+1][j][i] > ibmval-0.4 && nvert[k+1][j][i] < ibmval && k < mz-2) {
2288 libm_Flux += ucor[k][j][i].
z;
2289 libm_area += sqrt(zet[k][j][i].x * zet[k][j][i].x +
2290 zet[k][j][i].y * zet[k][j][i].y +
2291 zet[k][j][i].z * zet[k][j][i].z);
2295 if (nvert[k][j][i] > ibmval-0.4 && nvert[k][j][i] < ibmval) {
2296 if (nvert[k][j][i+1] < 0.1 && i < mx-2) {
2297 libm_Flux -= ucor[k][j][i].
x;
2298 libm_area += sqrt(csi[k][j][i].x * csi[k][j][i].x +
2299 csi[k][j][i].y * csi[k][j][i].y +
2300 csi[k][j][i].z * csi[k][j][i].z);
2303 if (nvert[k][j+1][i] < 0.1 && j < my-2) {
2304 libm_Flux -= ucor[k][j][i].
y;
2305 libm_area += sqrt(eta[k][j][i].x * eta[k][j][i].x +
2306 eta[k][j][i].y * eta[k][j][i].y +
2307 eta[k][j][i].z * eta[k][j][i].z);
2309 if (nvert[k+1][j][i] < 0.1 && k < mz-2) {
2310 libm_Flux -= ucor[k][j][i].
z;
2311 libm_area += sqrt(zet[k][j][i].x * zet[k][j][i].x +
2312 zet[k][j][i].y * zet[k][j][i].y +
2313 zet[k][j][i].z * zet[k][j][i].z);
2321 ierr = MPI_Allreduce(&libm_Flux, ibm_Flux,1,MPI_DOUBLE,MPI_SUM, PETSC_COMM_WORLD); CHKERRMPI(ierr);
2322 ierr = MPI_Allreduce(&libm_area, ibm_Area,1,MPI_DOUBLE,MPI_SUM, PETSC_COMM_WORLD); CHKERRMPI(ierr);
2326 PetscPrintf(PETSC_COMM_WORLD,
"IBMFlux REV %le %le\n", *ibm_Flux, *ibm_Area);
2328 PetscReal correction;
2330 if (*ibm_Area > 1.e-15) {
2332 correction = (*ibm_Flux + user->
FluxIntpSum) / *ibm_Area;
2334 correction = *ibm_Flux / *ibm_Area;
2340 for (k=lzs; k<lze; k++) {
2341 for (j=lys; j<lye; j++) {
2342 for (i=lxs; i<lxe; i++) {
2343 if (nvert[k][j][i] < 0.1) {
2344 if (nvert[k][j][i+1] > ibmval-0.4 && nvert[k][j][i+1] < ibmval && i < mx-2) {
2345 ucor[k][j][i].
x -= sqrt(csi[k][j][i].x * csi[k][j][i].x +
2346 csi[k][j][i].y * csi[k][j][i].y +
2347 csi[k][j][i].z * csi[k][j][i].z) *
2351 if (nvert[k][j+1][i] > ibmval-0.4 && nvert[k][j+1][i] < ibmval && j < my-2) {
2352 ucor[k][j][i].
y -= sqrt(eta[k][j][i].x * eta[k][j][i].x +
2353 eta[k][j][i].y * eta[k][j][i].y +
2354 eta[k][j][i].z * eta[k][j][i].z) *
2357 if (nvert[k+1][j][i] > ibmval-0.4 && nvert[k+1][j][i] < ibmval && k < mz-2) {
2358 ucor[k][j][i].
z -= sqrt(zet[k][j][i].x * zet[k][j][i].x +
2359 zet[k][j][i].y * zet[k][j][i].y +
2360 zet[k][j][i].z * zet[k][j][i].z) *
2365 if (nvert[k][j][i] > ibmval-0.4 && nvert[k][j][i] < ibmval) {
2366 if (nvert[k][j][i+1] < 0.1 && i < mx-2) {
2367 ucor[k][j][i].
x += sqrt(csi[k][j][i].x * csi[k][j][i].x +
2368 csi[k][j][i].y * csi[k][j][i].y +
2369 csi[k][j][i].z * csi[k][j][i].z) *
2373 if (nvert[k][j+1][i] < 0.1 && j < my-2) {
2374 ucor[k][j][i].
y += sqrt(eta[k][j][i].x * eta[k][j][i].x +
2375 eta[k][j][i].y * eta[k][j][i].y +
2376 eta[k][j][i].z * eta[k][j][i].z) *
2379 if (nvert[k+1][j][i] < 0.1 && k < mz-2) {
2380 ucor[k][j][i].
z += sqrt(zet[k][j][i].x * zet[k][j][i].x +
2381 zet[k][j][i].y * zet[k][j][i].y +
2382 zet[k][j][i].z * zet[k][j][i].z) *
2395 for (k=lzs; k<lze; k++) {
2396 for (j=lys; j<lye; j++) {
2397 for (i=lxs; i<lxe; i++) {
2398 if (nvert[k][j][i] < 0.1) {
2399 if (nvert[k][j][i+1] > ibmval-0.4 && nvert[k][j][i+1] < ibmval && i < mx-2) {
2400 libm_Flux += ucor[k][j][i].
x;
2401 libm_area += sqrt(csi[k][j][i].x * csi[k][j][i].x +
2402 csi[k][j][i].y * csi[k][j][i].y +
2403 csi[k][j][i].z * csi[k][j][i].z);
2406 if (nvert[k][j+1][i] > ibmval-0.4 && nvert[k][j+1][i] < ibmval && j < my-2) {
2407 libm_Flux += ucor[k][j][i].
y;
2408 libm_area += sqrt(eta[k][j][i].x * eta[k][j][i].x +
2409 eta[k][j][i].y * eta[k][j][i].y +
2410 eta[k][j][i].z * eta[k][j][i].z);
2412 if (nvert[k+1][j][i] > ibmval-0.4 && nvert[k+1][j][i] < ibmval && k < mz-2) {
2413 libm_Flux += ucor[k][j][i].
z;
2414 libm_area += sqrt(zet[k][j][i].x * zet[k][j][i].x +
2415 zet[k][j][i].y * zet[k][j][i].y +
2416 zet[k][j][i].z * zet[k][j][i].z);
2420 if (nvert[k][j][i] > ibmval-0.4 && nvert[k][j][i] < ibmval) {
2421 if (nvert[k][j][i+1] < 0.1 && i < mx-2) {
2422 libm_Flux -= ucor[k][j][i].
x;
2423 libm_area += sqrt(csi[k][j][i].x * csi[k][j][i].x +
2424 csi[k][j][i].y * csi[k][j][i].y +
2425 csi[k][j][i].z * csi[k][j][i].z);
2428 if (nvert[k][j+1][i] < 0.1 && j < my-2) {
2429 libm_Flux -= ucor[k][j][i].
y;
2430 libm_area += sqrt(eta[k][j][i].x * eta[k][j][i].x +
2431 eta[k][j][i].y * eta[k][j][i].y +
2432 eta[k][j][i].z * eta[k][j][i].z);
2434 if (nvert[k+1][j][i] < 0.1 && k < mz-2) {
2435 libm_Flux -= ucor[k][j][i].
z;
2436 libm_area += sqrt(zet[k][j][i].x * zet[k][j][i].x +
2437 zet[k][j][i].y * zet[k][j][i].y +
2438 zet[k][j][i].z * zet[k][j][i].z);
2446 ierr = MPI_Allreduce(&libm_Flux, ibm_Flux,1,MPI_DOUBLE,MPI_SUM, PETSC_COMM_WORLD); CHKERRMPI(ierr);
2447 ierr = MPI_Allreduce(&libm_area, ibm_Area,1,MPI_DOUBLE,MPI_SUM, PETSC_COMM_WORLD); CHKERRMPI(ierr);
2451 PetscPrintf(PETSC_COMM_WORLD,
"IBMFlux22 REV %le %le\n", *ibm_Flux, *ibm_Area);
2453 DMDAVecRestoreArray(da, user->
lNvert, &nvert);
2454 DMDAVecRestoreArray(fda, user->
lCsi, &csi);
2455 DMDAVecRestoreArray(fda, user->
lEta, &eta);
2456 DMDAVecRestoreArray(fda, user->
lZet, &zet);
2457 DMDAVecRestoreArray(fda, user->
Ucont, &ucor);
2459 DMGlobalToLocalBegin(fda, user->
Ucont, INSERT_VALUES, user->
lUcont);
2460 DMGlobalToLocalEnd(fda, user->
Ucont, INSERT_VALUES, user->
lUcont);
2474 PetscErrorCode ierr;
2483 DM da = user->
da, fda = user->
fda;
2485 DMDALocalInfo info = user->
info;
2487 PetscInt xs = info.xs, xe = info.xs + info.xm;
2488 PetscInt ys = info.ys, ye = info.ys + info.ym;
2489 PetscInt zs = info.zs, ze = info.zs + info.zm;
2490 PetscInt mx = info.mx, my = info.my, mz = info.mz;
2492 PetscInt i, j, k,ibi;
2493 PetscInt lxs, lys, lzs, lxe, lye, lze;
2499 if (xs==0) lxs = xs+1;
2500 if (ys==0) lys = ys+1;
2501 if (zs==0) lzs = zs+1;
2503 if (xe==mx) lxe = xe-1;
2504 if (ye==my) lye = ye-1;
2505 if (ze==mz) lze = ze-1;
2507 PetscReal epsilon=1.e-8;
2508 PetscReal ***nvert, ibmval=1.9999;
2514 }***ucor, ***lucor,***csi, ***eta, ***zet;
2517 PetscInt xend=mx-2 ,yend=my-2,zend=mz-2;
2523 DMDAVecGetArray(fda, user->
Ucont, &ucor);
2524 DMDAVecGetArray(fda, user->
lCsi, &csi);
2525 DMDAVecGetArray(fda, user->
lEta, &eta);
2526 DMDAVecGetArray(fda, user->
lZet, &zet);
2527 DMDAVecGetArray(da, user->
lNvert, &nvert);
2529 PetscReal libm_Flux, libm_area, libm_Flux_abs=0., ibm_Flux_abs;
2536 PetscReal *lIB_Flux = NULL, *lIB_area = NULL, *IB_Flux = NULL, *IB_Area = NULL;
2537 if (NumberOfBodies > 1) {
2539 lIB_Flux=(PetscReal *)calloc(NumberOfBodies,
sizeof(PetscReal));
2540 lIB_area=(PetscReal *)calloc(NumberOfBodies,
sizeof(PetscReal));
2541 IB_Flux=(PetscReal *)calloc(NumberOfBodies,
sizeof(PetscReal));
2542 IB_Area=(PetscReal *)calloc(NumberOfBodies,
sizeof(PetscReal));
2545 for (ibi=0; ibi<NumberOfBodies; ibi++) {
2560 for (k=lzs; k<lze; k++) {
2561 for (j=lys; j<lye; j++) {
2562 for (i=lxs; i<lxe; i++) {
2563 if (nvert[k][j][i] < 0.1) {
2564 if (nvert[k][j][i+1] > 0.1 && nvert[k][j][i+1] < ibmval && i < xend) {
2566 if (fabs(ucor[k][j][i].x)>epsilon) {
2567 libm_Flux += ucor[k][j][i].x;
2569 libm_Flux_abs += fabs(ucor[k][j][i].x)/sqrt(csi[k][j][i].x * csi[k][j][i].x +
2570 csi[k][j][i].y * csi[k][j][i].y +
2571 csi[k][j][i].z * csi[k][j][i].z);
2573 libm_Flux_abs += fabs(ucor[k][j][i].x);
2575 libm_area += sqrt(csi[k][j][i].x * csi[k][j][i].x +
2576 csi[k][j][i].y * csi[k][j][i].y +
2577 csi[k][j][i].z * csi[k][j][i].z);
2579 if (NumberOfBodies > 1) {
2581 ibi=(int)((nvert[k][j][i+1]-1.0)*1001);
2582 lIB_Flux[ibi] += ucor[k][j][i].x;
2583 lIB_area[ibi] += sqrt(csi[k][j][i].x * csi[k][j][i].x +
2584 csi[k][j][i].y * csi[k][j][i].y +
2585 csi[k][j][i].z * csi[k][j][i].z);
2591 if (nvert[k][j+1][i] > 0.1 && nvert[k][j+1][i] < ibmval && j < yend) {
2593 if (fabs(ucor[k][j][i].y)>epsilon) {
2594 libm_Flux += ucor[k][j][i].y;
2596 libm_Flux_abs += fabs(ucor[k][j][i].y)/sqrt(eta[k][j][i].x * eta[k][j][i].x +
2597 eta[k][j][i].y * eta[k][j][i].y +
2598 eta[k][j][i].z * eta[k][j][i].z);
2600 libm_Flux_abs += fabs(ucor[k][j][i].y);
2601 libm_area += sqrt(eta[k][j][i].x * eta[k][j][i].x +
2602 eta[k][j][i].y * eta[k][j][i].y +
2603 eta[k][j][i].z * eta[k][j][i].z);
2604 if (NumberOfBodies > 1) {
2606 ibi=(int)((nvert[k][j+1][i]-1.0)*1001);
2608 lIB_Flux[ibi] += ucor[k][j][i].y;
2609 lIB_area[ibi] += sqrt(eta[k][j][i].x * eta[k][j][i].x +
2610 eta[k][j][i].y * eta[k][j][i].y +
2611 eta[k][j][i].z * eta[k][j][i].z);
2616 if (nvert[k+1][j][i] > 0.1 && nvert[k+1][j][i] < ibmval && k < zend) {
2618 if (fabs(ucor[k][j][i].z)>epsilon) {
2619 libm_Flux += ucor[k][j][i].z;
2621 libm_Flux_abs += fabs(ucor[k][j][i].z)/sqrt(zet[k][j][i].x * zet[k][j][i].x +
2622 zet[k][j][i].y * zet[k][j][i].y +
2623 zet[k][j][i].z * zet[k][j][i].z);
2625 libm_Flux_abs += fabs(ucor[k][j][i].z);
2626 libm_area += sqrt(zet[k][j][i].x * zet[k][j][i].x +
2627 zet[k][j][i].y * zet[k][j][i].y +
2628 zet[k][j][i].z * zet[k][j][i].z);
2630 if (NumberOfBodies > 1) {
2632 ibi=(int)((nvert[k+1][j][i]-1.0)*1001);
2633 lIB_Flux[ibi] += ucor[k][j][i].z;
2634 lIB_area[ibi] += sqrt(zet[k][j][i].x * zet[k][j][i].x +
2635 zet[k][j][i].y * zet[k][j][i].y +
2636 zet[k][j][i].z * zet[k][j][i].z);
2643 if (nvert[k][j][i] > 0.1 && nvert[k][j][i] < ibmval) {
2645 if (nvert[k][j][i+1] < 0.1 && i < xend) {
2646 if (fabs(ucor[k][j][i].x)>epsilon) {
2647 libm_Flux -= ucor[k][j][i].x;
2649 libm_Flux_abs += fabs(ucor[k][j][i].x)/sqrt(csi[k][j][i].x * csi[k][j][i].x +
2650 csi[k][j][i].y * csi[k][j][i].y +
2651 csi[k][j][i].z * csi[k][j][i].z);
2653 libm_Flux_abs += fabs(ucor[k][j][i].x);
2654 libm_area += sqrt(csi[k][j][i].x * csi[k][j][i].x +
2655 csi[k][j][i].y * csi[k][j][i].y +
2656 csi[k][j][i].z * csi[k][j][i].z);
2657 if (NumberOfBodies > 1) {
2659 ibi=(int)((nvert[k][j][i]-1.0)*1001);
2660 lIB_Flux[ibi] -= ucor[k][j][i].x;
2661 lIB_area[ibi] += sqrt(csi[k][j][i].x * csi[k][j][i].x +
2662 csi[k][j][i].y * csi[k][j][i].y +
2663 csi[k][j][i].z * csi[k][j][i].z);
2669 if (nvert[k][j+1][i] < 0.1 && j < yend) {
2670 if (fabs(ucor[k][j][i].y)>epsilon) {
2671 libm_Flux -= ucor[k][j][i].y;
2673 libm_Flux_abs += fabs(ucor[k][j][i].y)/ sqrt(eta[k][j][i].x * eta[k][j][i].x +
2674 eta[k][j][i].y * eta[k][j][i].y +
2675 eta[k][j][i].z * eta[k][j][i].z);
2677 libm_Flux_abs += fabs(ucor[k][j][i].y);
2678 libm_area += sqrt(eta[k][j][i].x * eta[k][j][i].x +
2679 eta[k][j][i].y * eta[k][j][i].y +
2680 eta[k][j][i].z * eta[k][j][i].z);
2681 if (NumberOfBodies > 1) {
2683 ibi=(int)((nvert[k][j][i]-1.0)*1001);
2684 lIB_Flux[ibi] -= ucor[k][j][i].y;
2685 lIB_area[ibi] += sqrt(eta[k][j][i].x * eta[k][j][i].x +
2686 eta[k][j][i].y * eta[k][j][i].y +
2687 eta[k][j][i].z * eta[k][j][i].z);
2692 if (nvert[k+1][j][i] < 0.1 && k < zend) {
2693 if (fabs(ucor[k][j][i].z)>epsilon) {
2694 libm_Flux -= ucor[k][j][i].z;
2696 libm_Flux_abs += fabs(ucor[k][j][i].z)/sqrt(zet[k][j][i].x * zet[k][j][i].x +
2697 zet[k][j][i].y * zet[k][j][i].y +
2698 zet[k][j][i].z * zet[k][j][i].z);
2700 libm_Flux_abs += fabs(ucor[k][j][i].z);
2701 libm_area += sqrt(zet[k][j][i].x * zet[k][j][i].x +
2702 zet[k][j][i].y * zet[k][j][i].y +
2703 zet[k][j][i].z * zet[k][j][i].z);
2704 if (NumberOfBodies > 1) {
2706 ibi=(int)((nvert[k][j][i]-1.0)*1001);
2707 lIB_Flux[ibi] -= ucor[k][j][i].z;
2708 lIB_area[ibi] += sqrt(zet[k][j][i].x * zet[k][j][i].x +
2709 zet[k][j][i].y * zet[k][j][i].y +
2710 zet[k][j][i].z * zet[k][j][i].z);
2721 ierr = MPI_Allreduce(&libm_Flux, ibm_Flux,1,MPI_DOUBLE,MPI_SUM, PETSC_COMM_WORLD); CHKERRMPI(ierr);
2722 ierr = MPI_Allreduce(&libm_Flux_abs, &ibm_Flux_abs,1,MPI_DOUBLE,MPI_SUM, PETSC_COMM_WORLD); CHKERRMPI(ierr);
2723 ierr = MPI_Allreduce(&libm_area, ibm_Area,1,MPI_DOUBLE,MPI_SUM, PETSC_COMM_WORLD); CHKERRMPI(ierr);
2725 if (NumberOfBodies > 1) {
2726 ierr = MPI_Allreduce(lIB_Flux,IB_Flux,NumberOfBodies,MPI_DOUBLE,MPI_SUM,PETSC_COMM_WORLD); CHKERRMPI(ierr);
2727 ierr = MPI_Allreduce(lIB_area,IB_Area,NumberOfBodies,MPI_DOUBLE,MPI_SUM,PETSC_COMM_WORLD); CHKERRMPI(ierr);
2730 PetscReal correction;
2732 PetscReal *Correction = NULL;
2733 if (NumberOfBodies > 1) {
2734 Correction=(PetscReal *)calloc(NumberOfBodies,
sizeof(PetscReal));
2735 for (ibi=0; ibi<NumberOfBodies; ibi++) Correction[ibi]=0.0;
2738 if (*ibm_Area > 1.e-15) {
2740 correction = (*ibm_Flux + user->
FluxIntpSum)/ ibm_Flux_abs;
2742 correction = (*ibm_Flux + user->
FluxIntpSum) / *ibm_Area;
2744 correction = *ibm_Flux / *ibm_Area;
2745 if (NumberOfBodies > 1)
2746 for (ibi=0; ibi<NumberOfBodies; ibi++)
if (IB_Area[ibi]>1.e-15) Correction[ibi] = IB_Flux[ibi] / IB_Area[ibi];
2752 LOG_ALLOW(
GLOBAL,
LOG_INFO,
"IBM Uncorrected Flux: %g, Area: %g, Correction: %g\n", *ibm_Flux, *ibm_Area, correction);
2753 if (NumberOfBodies>1){
2754 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]);
2763 for (k=lzs; k<lze; k++) {
2764 for (j=lys; j<lye; j++) {
2765 for (i=lxs; i<lxe; i++) {
2766 if (nvert[k][j][i] < 0.1) {
2767 if (nvert[k][j][i+1] > 0.1 && nvert[k][j][i+1] <ibmval && i < xend) {
2768 if (fabs(ucor[k][j][i].x)>epsilon){
2770 ucor[k][j][i].x -=correction*fabs(ucor[k][j][i].x)/
2771 sqrt(csi[k][j][i].x * csi[k][j][i].x +
2772 csi[k][j][i].y * csi[k][j][i].y +
2773 csi[k][j][i].z * csi[k][j][i].z);
2775 ucor[k][j][i].x -=correction*fabs(ucor[k][j][i].x);
2776 else if (NumberOfBodies > 1) {
2777 ibi=(int)((nvert[k][j][i+1]-1.0)*1001);
2778 ucor[k][j][i].x -= sqrt(csi[k][j][i].x * csi[k][j][i].x +
2779 csi[k][j][i].y * csi[k][j][i].y +
2780 csi[k][j][i].z * csi[k][j][i].z) *
2784 ucor[k][j][i].x -= sqrt(csi[k][j][i].x * csi[k][j][i].x +
2785 csi[k][j][i].y * csi[k][j][i].y +
2786 csi[k][j][i].z * csi[k][j][i].z) *
2790 if (nvert[k][j+1][i] > 0.1 && nvert[k][j+1][i] < ibmval && j < yend) {
2791 if (fabs(ucor[k][j][i].y)>epsilon) {
2793 ucor[k][j][i].y -=correction*fabs(ucor[k][j][i].y)/
2794 sqrt(eta[k][j][i].x * eta[k][j][i].x +
2795 eta[k][j][i].y * eta[k][j][i].y +
2796 eta[k][j][i].z * eta[k][j][i].z);
2798 ucor[k][j][i].y -=correction*fabs(ucor[k][j][i].y);
2799 else if (NumberOfBodies > 1) {
2800 ibi=(int)((nvert[k][j+1][i]-1.0)*1001);
2801 ucor[k][j][i].y -= sqrt(eta[k][j][i].x * eta[k][j][i].x +
2802 eta[k][j][i].y * eta[k][j][i].y +
2803 eta[k][j][i].z * eta[k][j][i].z) *
2807 ucor[k][j][i].y -= sqrt(eta[k][j][i].x * eta[k][j][i].x +
2808 eta[k][j][i].y * eta[k][j][i].y +
2809 eta[k][j][i].z * eta[k][j][i].z) *
2813 if (nvert[k+1][j][i] > 0.1 && nvert[k+1][j][i] < ibmval && k < zend) {
2814 if (fabs(ucor[k][j][i].z)>epsilon) {
2816 ucor[k][j][i].z -= correction*fabs(ucor[k][j][i].z)/
2817 sqrt(zet[k][j][i].x * zet[k][j][i].x +
2818 zet[k][j][i].y * zet[k][j][i].y +
2819 zet[k][j][i].z * zet[k][j][i].z);
2821 ucor[k][j][i].z -= correction*fabs(ucor[k][j][i].z);
2822 else if (NumberOfBodies > 1) {
2823 ibi=(int)((nvert[k+1][j][i]-1.0)*1001);
2824 ucor[k][j][i].z -= sqrt(zet[k][j][i].x * zet[k][j][i].x +
2825 zet[k][j][i].y * zet[k][j][i].y +
2826 zet[k][j][i].z * zet[k][j][i].z) *
2830 ucor[k][j][i].z -= sqrt(zet[k][j][i].x * zet[k][j][i].x +
2831 zet[k][j][i].y * zet[k][j][i].y +
2832 zet[k][j][i].z * zet[k][j][i].z) *
2838 if (nvert[k][j][i] > 0.1 && nvert[k][j][i] < ibmval) {
2839 if (nvert[k][j][i+1] < 0.1 && i < xend) {
2840 if (fabs(ucor[k][j][i].x)>epsilon) {
2842 ucor[k][j][i].x += correction*fabs(ucor[k][j][i].x)/
2843 sqrt(csi[k][j][i].x * csi[k][j][i].x +
2844 csi[k][j][i].y * csi[k][j][i].y +
2845 csi[k][j][i].z * csi[k][j][i].z);
2847 ucor[k][j][i].x += correction*fabs(ucor[k][j][i].x);
2848 else if (NumberOfBodies > 1) {
2849 ibi=(int)((nvert[k][j][i]-1.0)*1001);
2850 ucor[k][j][i].x += sqrt(csi[k][j][i].x * csi[k][j][i].x +
2851 csi[k][j][i].y * csi[k][j][i].y +
2852 csi[k][j][i].z * csi[k][j][i].z) *
2856 ucor[k][j][i].x += sqrt(csi[k][j][i].x * csi[k][j][i].x +
2857 csi[k][j][i].y * csi[k][j][i].y +
2858 csi[k][j][i].z * csi[k][j][i].z) *
2862 if (nvert[k][j+1][i] < 0.1 && j < yend) {
2863 if (fabs(ucor[k][j][i].y)>epsilon) {
2865 ucor[k][j][i].y +=correction*fabs(ucor[k][j][i].y)/
2866 sqrt(eta[k][j][i].x * eta[k][j][i].x +
2867 eta[k][j][i].y * eta[k][j][i].y +
2868 eta[k][j][i].z * eta[k][j][i].z);
2870 ucor[k][j][i].y +=correction*fabs(ucor[k][j][i].y);
2871 else if (NumberOfBodies > 1) {
2872 ibi=(int)((nvert[k][j][i]-1.0)*1001);
2873 ucor[k][j][i].y += sqrt(eta[k][j][i].x * eta[k][j][i].x +
2874 eta[k][j][i].y * eta[k][j][i].y +
2875 eta[k][j][i].z * eta[k][j][i].z) *
2879 ucor[k][j][i].y += sqrt(eta[k][j][i].x * eta[k][j][i].x +
2880 eta[k][j][i].y * eta[k][j][i].y +
2881 eta[k][j][i].z * eta[k][j][i].z) *
2885 if (nvert[k+1][j][i] < 0.1 && k < zend) {
2886 if (fabs(ucor[k][j][i].z)>epsilon) {
2888 ucor[k][j][i].z += correction*fabs(ucor[k][j][i].z)/
2889 sqrt(zet[k][j][i].x * zet[k][j][i].x +
2890 zet[k][j][i].y * zet[k][j][i].y +
2891 zet[k][j][i].z * zet[k][j][i].z);
2893 ucor[k][j][i].z += correction*fabs(ucor[k][j][i].z);
2894 else if (NumberOfBodies > 1) {
2895 ibi=(int)((nvert[k][j][i]-1.0)*1001);
2896 ucor[k][j][i].z += sqrt(zet[k][j][i].x * zet[k][j][i].x +
2897 zet[k][j][i].y * zet[k][j][i].y +
2898 zet[k][j][i].z * zet[k][j][i].z) *
2902 ucor[k][j][i].z += sqrt(zet[k][j][i].x * zet[k][j][i].x +
2903 zet[k][j][i].y * zet[k][j][i].y +
2904 zet[k][j][i].z * zet[k][j][i].z) *
2922 for (k=lzs; k<lze; k++) {
2923 for (j=lys; j<lye; j++) {
2924 for (i=lxs; i<lxe; i++) {
2925 if (nvert[k][j][i] < 0.1) {
2926 if (nvert[k][j][i+1] > 0.1 && nvert[k][j][i+1] < ibmval && i < xend) {
2927 libm_Flux += ucor[k][j][i].x;
2928 libm_area += sqrt(csi[k][j][i].x * csi[k][j][i].x +
2929 csi[k][j][i].y * csi[k][j][i].y +
2930 csi[k][j][i].z * csi[k][j][i].z);
2933 if (nvert[k][j+1][i] > 0.1 && nvert[k][j+1][i] < ibmval && j < yend) {
2934 libm_Flux += ucor[k][j][i].y;
2935 libm_area += sqrt(eta[k][j][i].x * eta[k][j][i].x +
2936 eta[k][j][i].y * eta[k][j][i].y +
2937 eta[k][j][i].z * eta[k][j][i].z);
2939 if (nvert[k+1][j][i] > 0.1 && nvert[k+1][j][i] < ibmval && k < zend) {
2940 libm_Flux += ucor[k][j][i].z;
2941 libm_area += sqrt(zet[k][j][i].x * zet[k][j][i].x +
2942 zet[k][j][i].y * zet[k][j][i].y +
2943 zet[k][j][i].z * zet[k][j][i].z);
2947 if (nvert[k][j][i] > 0.1 && nvert[k][j][i] < ibmval) {
2948 if (nvert[k][j][i+1] < 0.1 && i < xend) {
2949 libm_Flux -= ucor[k][j][i].x;
2950 libm_area += sqrt(csi[k][j][i].x * csi[k][j][i].x +
2951 csi[k][j][i].y * csi[k][j][i].y +
2952 csi[k][j][i].z * csi[k][j][i].z);
2955 if (nvert[k][j+1][i] < 0.1 && j < yend) {
2956 libm_Flux -= ucor[k][j][i].y;
2957 libm_area += sqrt(eta[k][j][i].x * eta[k][j][i].x +
2958 eta[k][j][i].y * eta[k][j][i].y +
2959 eta[k][j][i].z * eta[k][j][i].z);
2961 if (nvert[k+1][j][i] < 0.1 && k < zend) {
2962 libm_Flux -= ucor[k][j][i].z;
2963 libm_area += sqrt(zet[k][j][i].x * zet[k][j][i].x +
2964 zet[k][j][i].y * zet[k][j][i].y +
2965 zet[k][j][i].z * zet[k][j][i].z);
2973 ierr = MPI_Allreduce(&libm_Flux, ibm_Flux,1,MPI_DOUBLE,MPI_SUM, PETSC_COMM_WORLD); CHKERRMPI(ierr);
2974 ierr = MPI_Allreduce(&libm_area, ibm_Area,1,MPI_DOUBLE,MPI_SUM, PETSC_COMM_WORLD); CHKERRMPI(ierr);
2984 for (k=lzs; k<lze; k++) {
2985 for (j=lys; j<lye; j++) {
2987 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;
2998 for (k=lzs; k<lze; k++) {
2999 for (i=lxs; i<lxe; i++) {
3001 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;
3011 for (j=lys; j<lye; j++) {
3012 for (i=lxs; i<lxe; i++) {
3014 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;
3022 DMDAVecRestoreArray(da, user->
lNvert, &nvert);
3023 DMDAVecRestoreArray(fda, user->
lCsi, &csi);
3024 DMDAVecRestoreArray(fda, user->
lEta, &eta);
3025 DMDAVecRestoreArray(fda, user->
lZet, &zet);
3026 DMDAVecRestoreArray(fda, user->
Ucont, &ucor);
3028 DMGlobalToLocalBegin(fda, user->
Ucont, INSERT_VALUES, user->
lUcont);
3029 DMGlobalToLocalEnd(fda, user->
Ucont, INSERT_VALUES, user->
lUcont);
3033 PetscBool has_periodic_ucont_seam =
3040 PetscInt periodic_seam_updates_local = 0, periodic_seam_updates_global = 0;
3041 PetscReal periodic_seam_max_delta_local = 0.0, periodic_seam_max_delta_global = 0.0;
3043 if (has_periodic_ucont_seam) {
3047 DMDAVecGetArray(fda, user->
lUcont, &lucor);
3048 DMDAVecGetArray(fda, user->
Ucont, &ucor);
3053 for (k=zs; k<ze; k++) {
3054 for (j=ys; j<ye; j++) {
3055 if(j>0 && k>0 && j<user->JM && k<user->KM){
3056 PetscReal old_val = ucor[k][j][i].x;
3057 PetscReal new_val = lucor[k][j][i-2].x;
3058 PetscReal delta = PetscAbsReal(new_val - old_val);
3059 ucor[k][j][i].x = new_val;
3060 if (delta > 1.0e-14) periodic_seam_updates_local++;
3061 periodic_seam_max_delta_local = PetscMax(periodic_seam_max_delta_local, delta);
3070 for (k=zs; k<ze; k++) {
3071 for (i=xs; i<xe; i++) {
3072 if(i>0 && k>0 && i<user->IM && k<user->KM){
3073 PetscReal old_val = ucor[k][j][i].y;
3074 PetscReal new_val = lucor[k][j-2][i].y;
3075 PetscReal delta = PetscAbsReal(new_val - old_val);
3076 ucor[k][j][i].y = new_val;
3077 if (delta > 1.0e-14) periodic_seam_updates_local++;
3078 periodic_seam_max_delta_local = PetscMax(periodic_seam_max_delta_local, delta);
3087 for (j=ys; j<ye; j++) {
3088 for (i=xs; i<xe; i++) {
3089 if(i>0 && j>0 && i<user->IM && j<user->JM){
3090 PetscReal old_val = ucor[k][j][i].z;
3091 PetscReal new_val = lucor[k-2][j][i].z;
3092 PetscReal delta = PetscAbsReal(new_val - old_val);
3093 ucor[k][j][i].z = new_val;
3094 if (delta > 1.0e-14) periodic_seam_updates_local++;
3095 periodic_seam_max_delta_local = PetscMax(periodic_seam_max_delta_local, delta);
3101 DMDAVecRestoreArray(fda, user->
lUcont, &lucor);
3102 DMDAVecRestoreArray(fda, user->
Ucont, &ucor);
3104 if (has_periodic_ucont_seam) {
3105 ierr = MPI_Allreduce(&periodic_seam_updates_local, &periodic_seam_updates_global, 1, MPIU_INT, MPI_SUM, PETSC_COMM_WORLD); CHKERRMPI(ierr);
3106 ierr = MPI_Allreduce(&periodic_seam_max_delta_local, &periodic_seam_max_delta_global, 1, MPIU_REAL, MPI_MAX, PETSC_COMM_WORLD); CHKERRMPI(ierr);
3108 "VolumeFlux: legacy periodic Ucont seam refresh updated %d values, max |delta|=%.6e.\n",
3109 (
int)periodic_seam_updates_global, periodic_seam_max_delta_global);
3114 DMGlobalToLocalBegin(user->
fda, user->
Ucont, INSERT_VALUES, user->
lUcont);
3115 DMGlobalToLocalEnd(user->
fda, user->
Ucont, INSERT_VALUES, user->
lUcont);
3117 if (NumberOfBodies > 1) {
3353 const PetscInt immersed = simCtx->
immersed;
3354 const PetscInt MHV = simCtx->
MHV;
3355 const PetscInt LV = simCtx->
LV;
3356 PetscMPIInt rank = simCtx->
rank;
3359 PetscErrorCode ierr;
3366 PetscFunctionBeginUser;
3370 for (bi = 0; bi < block_number; bi++) {
3377 for (l = usermg->
mglevels - 1; l > 0; l--) {
3383 user = mgctx[l].
user;
3384 ierr = PetscMalloc1(user[bi].info.mx * user[bi].
info.my * 2, &user[bi].
KSKE); CHKERRQ(ierr);
3390 user = mgctx[l].
user;
3396 ierr = VecDuplicate(user[bi].P, &user[bi].B); CHKERRQ(ierr);
3398 PetscReal ibm_Flux, ibm_Area;
3399 PetscInt flg = immersed - 1;
3402 VolumeFlux(&user[bi], &ibm_Flux, &ibm_Area, flg);
3404 flg = ((MHV > 1 || LV) && bi == 0) ? 1 : 0;
3412 for (l = usermg->
mglevels - 1; l >= 0; l--) {
3413 user = mgctx[l].
user;
3421 ierr = KSPCreate(PETSC_COMM_WORLD, &mgksp); CHKERRQ(ierr);
3422 ierr = KSPAppendOptionsPrefix(mgksp,
"ps_"); CHKERRQ(ierr);
3426 char filen[PETSC_MAX_PATH_LEN + 128];
3429 ierr = PetscNew(&monctx); CHKERRQ(ierr);
3437 ierr = PetscSNPrintf(filen,
sizeof(filen),
"%s/Poisson_Solver_Convergence_History_Block_%d.log", simCtx->
log_dir, bi); CHKERRQ(ierr);
3447 PetscFPrintf(PETSC_COMM_SELF, monctx->
file_handle,
"--- Convergence for Timestep %d, Block %d ---\n", (
int)simCtx->
step, bi);
3449 SETERRQ(PETSC_COMM_SELF, PETSC_ERR_FILE_OPEN,
"Could not open KSP monitor log file: %s", filen);
3458 ierr = KSPGetPC(mgksp, &mgpc); CHKERRQ(ierr);
3459 ierr = PCSetType(mgpc, PCMG); CHKERRQ(ierr);
3461 ierr = PCMGSetLevels(mgpc, usermg->
mglevels, PETSC_NULLPTR); CHKERRQ(ierr);
3462 ierr = PCMGSetCycleType(mgpc, PC_MG_CYCLE_V); CHKERRQ(ierr);
3463 ierr = PCMGSetType(mgpc, PC_MG_MULTIPLICATIVE); CHKERRQ(ierr);
3466 for (l = usermg->
mglevels - 1; l > 0; l--) {
3475 coarse_user_ctx->
da_f = &(fine_user_ctx->
da);
3476 coarse_user_ctx->
user_f = fine_user_ctx;
3479 fine_user_ctx->
da_c = &(coarse_user_ctx->
da);
3480 fine_user_ctx->
user_c = coarse_user_ctx;
3484 PetscInt m_c = (coarse_user_ctx->
info.xm * coarse_user_ctx->
info.ym * coarse_user_ctx->
info.zm);
3485 PetscInt m_f = (fine_user_ctx->
info.xm * fine_user_ctx->
info.ym * fine_user_ctx->
info.zm);
3486 PetscInt M_c = (coarse_user_ctx->
info.mx * coarse_user_ctx->
info.my * coarse_user_ctx->
info.mz);
3487 PetscInt M_f = (fine_user_ctx->
info.mx * fine_user_ctx->
info.my * fine_user_ctx->
info.mz);
3492 ierr = MatCreateShell(PETSC_COMM_WORLD, m_c, m_f, M_c, M_f, (
void*)coarse_user_ctx, &fine_user_ctx->
MR); CHKERRQ(ierr);
3495 ierr = MatCreateShell(PETSC_COMM_WORLD, m_f, m_c, M_f, M_c, (
void*)fine_user_ctx, &fine_user_ctx->
MP); CHKERRQ(ierr);
3499 ierr = MatShellSetOperation(fine_user_ctx->
MP, MATOP_MULT, (
void(*)(
void))
MyInterpolation); CHKERRQ(ierr);
3502 ierr = PCMGSetRestriction(mgpc, l, fine_user_ctx->
MR); CHKERRQ(ierr);
3503 ierr = PCMGSetInterpolation(mgpc, l, fine_user_ctx->
MP); CHKERRQ(ierr);
3508 for (l = usermg->
mglevels - 1; l >= 0; l--) {
3509 user = mgctx[l].
user;
3511 ierr = PCMGGetSmoother(mgpc, l, &subksp); CHKERRQ(ierr);
3513 ierr = PCMGGetCoarseSolve(mgpc, &subksp); CHKERRQ(ierr);
3514 ierr = KSPSetTolerances(subksp, 1.e-8, PETSC_DEFAULT, PETSC_DEFAULT, 40); CHKERRQ(ierr);
3517 ierr = KSPSetOperators(subksp, user[bi].A, user[bi].A); CHKERRQ(ierr);
3518 ierr = KSPSetFromOptions(subksp); CHKERRQ(ierr);
3519 ierr = KSPGetPC(subksp, &subpc); CHKERRQ(ierr);
3520 ierr = PCSetType(subpc, PCBJACOBI); CHKERRQ(ierr);
3528 ierr = KSPSetUp(subksp); CHKERRQ(ierr);
3529 ierr = PCBJacobiGetSubKSP(subpc, &nlocal, NULL, &subsubksp); CHKERRQ(ierr);
3531 for (PetscInt abi = 0; abi < nlocal; abi++) {
3532 ierr = KSPGetPC(subsubksp[abi], &subsubpc); CHKERRQ(ierr);
3534 ierr = PCFactorSetShiftAmount(subsubpc, 1.e-10); CHKERRQ(ierr);
3537 ierr = MatNullSpaceCreate(PETSC_COMM_WORLD, PETSC_TRUE, 0, PETSC_NULLPTR, &user[bi].nullsp); CHKERRQ(ierr);
3539 ierr = MatSetNullSpace(user[bi].A, user[bi].nullsp); CHKERRQ(ierr);
3541 ierr = PCMGSetResidual(mgpc, l, PCMGResidualDefault, user[bi].A); CHKERRQ(ierr);
3542 ierr = KSPSetUp(subksp); CHKERRQ(ierr);
3544 if (l < usermg->mglevels - 1) {
3545 ierr = MatCreateVecs(user[bi].A, &user[bi].R, PETSC_NULLPTR); CHKERRQ(ierr);
3546 ierr = PCMGSetRhs(mgpc, l, user[bi].R); CHKERRQ(ierr);
3552 user = mgctx[l].
user;
3555 ierr = KSPSetOperators(mgksp, user[bi].A, user[bi].A); CHKERRQ(ierr);
3556 ierr = MatSetNullSpace(user[bi].A, user[bi].nullsp); CHKERRQ(ierr);
3557 ierr = KSPSetFromOptions(mgksp); CHKERRQ(ierr);
3558 ierr = KSPSetUp(mgksp); CHKERRQ(ierr);
3559 ierr = KSPSolve(mgksp, user[bi].B, user[bi].Phi); CHKERRQ(ierr);
3562 for (l = usermg->
mglevels - 1; l >= 0; l--) {
3563 user = mgctx[l].
user;
3564 MatNullSpaceDestroy(&user[bi].nullsp);
3565 MatDestroy(&user[bi].A);
3568 MatDestroy(&user[bi].MR);
3569 MatDestroy(&user[bi].MP);
3570 }
else if (l==0 && immersed) {
3571 PetscFree(user[bi].KSKE);
3573 if (l < usermg->mglevels - 1) {
3574 VecDestroy(&user[bi].R);
3585 PetscFunctionReturn(0);