142 DMBoundaryType xperiod = (simCtx->
i_periodic) ? DM_BOUNDARY_PERIODIC : DM_BOUNDARY_NONE;
143 DMBoundaryType yperiod = (simCtx->
j_periodic) ? DM_BOUNDARY_PERIODIC : DM_BOUNDARY_NONE;
144 DMBoundaryType zperiod = (simCtx->
k_periodic) ? DM_BOUNDARY_PERIODIC : DM_BOUNDARY_NONE;
147 PetscInt *lx = NULL, *ly = NULL, *lz = NULL;
150 PetscFunctionBeginUser;
158 DMDAGetInfo(coarse_user->
da, NULL, NULL, NULL, NULL, &m, &n, &p, NULL, NULL, NULL, NULL, NULL, NULL);
162 PetscInt *lx_contrib, *ly_contrib, *lz_contrib;
163 ierr = PetscMalloc3(m, &lx_contrib, n, &ly_contrib, p, &lz_contrib); CHKERRQ(ierr);
164 ierr = PetscMemzero(lx_contrib, m *
sizeof(PetscInt)); CHKERRQ(ierr);
165 ierr = PetscMemzero(ly_contrib, n *
sizeof(PetscInt)); CHKERRQ(ierr);
166 ierr = PetscMemzero(lz_contrib, p *
sizeof(PetscInt)); CHKERRQ(ierr);
169 DMDAGetLocalInfo(coarse_user->
da, &info);
170 PetscInt xs = info.xs, xe = info.xs + info.xm, mx = info.mx;
171 PetscInt ys = info.ys, ye = info.ys + info.ym, my = info.my;
172 PetscInt zs = info.zs, ze = info.zs + info.zm, mz = info.mz;
175 ierr = MPI_Comm_rank(PETSC_COMM_WORLD, &rank); CHKERRQ(ierr);
176 PetscInt proc_i = rank % m;
177 PetscInt proc_j = (rank / m) % n;
178 PetscInt proc_k = rank / (m * n);
181 if (user->
isc) lx_contrib[proc_i] = (xe - xs);
183 if (m == 1) lx_contrib[0] = user->
IM + 1;
184 else if (xs == 0) lx_contrib[0] = 2 * xe - 1;
185 else if (xe == mx) lx_contrib[proc_i] = user->
IM + 1 - (2 * xs - 1);
186 else lx_contrib[proc_i] = (xe - xs) * 2;
190 if (user->
jsc) ly_contrib[proc_j] = (ye - ys);
192 if (n == 1) ly_contrib[0] = user->
JM + 1;
193 else if (ys == 0) ly_contrib[0] = 2 * ye - 1;
194 else if (ye == my) ly_contrib[proc_j] = user->
JM + 1 - (2 * ys - 1);
195 else ly_contrib[proc_j] = (ye - ys) * 2;
199 if (user->
ksc) lz_contrib[proc_k] = (ze - zs);
201 if (p == 1) lz_contrib[0] = user->
KM + 1;
202 else if (zs == 0) lz_contrib[0] = 2 * ze - 1;
203 else if (ze == mz) lz_contrib[proc_k] = user->
KM + 1 - (2 * zs - 1);
204 else lz_contrib[proc_k] = (ze - zs) * 2;
206 LOG_ALLOW_SYNC(
LOCAL,
LOG_VERBOSE,
"Rank %d: Calculated this rank's node contribution to fine grid: lx=%d, ly=%d, lz=%d\n", simCtx->
rank, lx_contrib[proc_i], ly_contrib[proc_j], lz_contrib[proc_k]);
209 ierr = PetscMalloc3(m, &lx, n, &ly, p, &lz); CHKERRQ(ierr);
210 ierr = MPI_Allreduce(lx_contrib, lx, m, MPIU_INT, MPI_MAX, PETSC_COMM_WORLD); CHKERRQ(ierr);
211 ierr = MPI_Allreduce(ly_contrib, ly, n, MPIU_INT, MPI_MAX, PETSC_COMM_WORLD); CHKERRQ(ierr);
212 ierr = MPI_Allreduce(lz_contrib, lz, p, MPIU_INT, MPI_MAX, PETSC_COMM_WORLD); CHKERRQ(ierr);
214 ierr = PetscFree3(lx_contrib, ly_contrib, lz_contrib); CHKERRQ(ierr);
229 m = n = p = PETSC_DECIDE;
237 ierr = DMDACreate3d(PETSC_COMM_WORLD, xperiod, yperiod, zperiod, DMDA_STENCIL_BOX,
238 user->
IM + 1, user->
JM + 1, user->
KM + 1,
240 1, stencil_width, lx, ly, lz, &user->
da); CHKERRQ(ierr);
243 ierr = PetscFree3(lx, ly, lz); CHKERRQ(ierr);
247 ierr = DMSetUp(user->
da); CHKERRQ(ierr);
248 ierr = DMGetCoordinateDM(user->
da, &user->
fda); CHKERRQ(ierr);
249 ierr = DMDASetUniformCoordinates(user->
da, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0); CHKERRQ(ierr);
250 ierr = DMDAGetLocalInfo(user->
da, &user->
info); CHKERRQ(ierr);
255 PetscFunctionReturn(0);
439 PetscFunctionBeginUser;
449 FILE *grid_file_handle = NULL;
451 if (simCtx->
rank == 0) {
452 grid_file_handle = fopen(simCtx->
grid_file,
"r");
453 if (!grid_file_handle) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_FILE_OPEN,
"Cannot open file: %s", simCtx->
grid_file);
458 char dummy_buffer[2048];
459 for (PetscInt s = 0; s < headerLines; ++s) {
460 if (!fgets(dummy_buffer,
sizeof(dummy_buffer), grid_file_handle)) {
461 SETERRQ(PETSC_COMM_SELF, PETSC_ERR_FILE_READ,
"Unexpected EOF while skipping grid header");
472 if (simCtx->
rank == 0) {
473 fclose(grid_file_handle);
481 ierr = DMGetCoordinates(user->
da, &gCoor); CHKERRQ(ierr);
482 ierr = DMGetCoordinatesLocal(user->
da, &lCoor); CHKERRQ(ierr);
485 ierr = DMLocalToGlobalBegin(user->
fda, lCoor, INSERT_VALUES, gCoor); CHKERRQ(ierr);
486 ierr = DMLocalToGlobalEnd(user->
fda, lCoor, INSERT_VALUES, gCoor); CHKERRQ(ierr);
488 ierr = DMGlobalToLocalBegin(user->
fda, gCoor, INSERT_VALUES, lCoor); CHKERRQ(ierr);
489 ierr = DMGlobalToLocalEnd(user->
fda, gCoor, INSERT_VALUES, lCoor); CHKERRQ(ierr);
493 PetscFunctionReturn(0);
639 PetscMPIInt rank = simCtx->
rank;
640 PetscInt block_index = user->
_this;
641 PetscInt IM = user->
IM, JM = user->
JM, KM = user->
KM;
645 PetscReal *gc = NULL;
647 PetscFunctionBeginUser;
652 simCtx->
rank, block_index);
656 PetscInt n_nodes = (IM) * (JM) * (KM);
657 ierr = PetscMalloc1(3 * n_nodes, &gc); CHKERRQ(ierr);
661 if (!fd) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_FILE_OPEN,
"Recieved a NULL file handle.\n");
664 for (PetscInt k = 0; k < KM; k++) {
665 for (PetscInt j = 0; j < JM; j++) {
666 for (PetscInt i = 0; i < IM; i++) {
667 PetscInt base_index = 3 * ((k * (JM) + j) * (IM) + i);
668 if (fscanf(fd,
"%le %le %le\n", &gc[base_index], &gc[base_index + 1], &gc[base_index + 2]) != 3) {
669 SETERRQ(PETSC_COMM_SELF, PETSC_ERR_FILE_READ,
"Error reading coordinates for node (i,j,k)=(%d,%d,%d) in block %d", i, j, k, block_index);
678 ierr = MPI_Bcast(gc, 3 * n_nodes, MPIU_REAL, 0, PETSC_COMM_WORLD); CHKERRQ(ierr);
681 ierr = DMDAGetLocalInfo(user->
da, &info); CHKERRQ(ierr);
682 ierr = DMGetCoordinatesLocal(user->
da, &lCoor); CHKERRQ(ierr);
683 ierr = DMDAVecGetArray(user->
fda, lCoor, &coor); CHKERRQ(ierr);
685 for (PetscInt k = info.zs; k < info.zs + info.zm; k++) {
686 for (PetscInt j = info.ys; j < info.ys + info.ym; j++) {
687 for (PetscInt i = info.xs; i < info.xs + info.xm; i++) {
688 if(k< KM && j < JM && i < IM){
689 PetscInt base_idx = 3 * ((k * (JM) + j) * (IM) + i);
690 coor[k][j][i].
x = gc[base_idx];
691 coor[k][j][i].
y = gc[base_idx + 1];
692 coor[k][j][i].
z = gc[base_idx + 2];
699 ierr = DMDAVecRestoreArray(user->
fda, lCoor, &coor); CHKERRQ(ierr);
700 ierr = PetscFree(gc); CHKERRQ(ierr);
704 PetscFunctionReturn(0);
725 Vec c_lCoor, f_lCoor;
728 DMDALocalInfo c_info;
731 PetscFunctionBeginUser;
738 ierr = DMDAGetLocalInfo(coarse_user->
da, &c_info); CHKERRQ(ierr);
740 ierr = DMGetCoordinatesLocal(coarse_user->
da, &c_lCoor); CHKERRQ(ierr);
741 ierr = DMGetCoordinatesLocal(fine_user->
da, &f_lCoor); CHKERRQ(ierr);
743 ierr = DMDAVecGetArray(coarse_user->
fda, c_lCoor, &c_coor); CHKERRQ(ierr);
744 ierr = DMDAVecGetArrayRead(fine_user->
fda, f_lCoor, &f_coor); CHKERRQ(ierr);
747 PetscInt xs = c_info.xs, xe = c_info.xs + c_info.xm;
748 PetscInt ys = c_info.ys, ye = c_info.ys + c_info.ym;
749 PetscInt zs = c_info.zs, ze = c_info.zs + c_info.zm;
752 PetscInt mx = c_info.mx, my = c_info.my, mz = c_info.mz;
761 for (PetscInt k = zs; k < ze; k++) {
762 for (PetscInt j = ys; j < ye; j++) {
763 for (PetscInt i = xs; i < xe; i++) {
766 ih = coarse_user->
isc ? i : 2 * i;
767 jh = coarse_user->
jsc ? j : 2 * j;
768 kh = coarse_user->
ksc ? k : 2 * k;
772 c_coor[k][j][i] = f_coor[kh][jh][ih];
777 ierr = DMDAVecRestoreArray(coarse_user->
fda, c_lCoor, &c_coor); CHKERRQ(ierr);
778 ierr = DMDAVecRestoreArrayRead(fine_user->
fda, f_lCoor, &f_coor); CHKERRQ(ierr);
782 ierr = DMGetCoordinates(coarse_user->
da, &c_gCoor); CHKERRQ(ierr);
783 ierr = DMLocalToGlobalBegin(coarse_user->
fda, c_lCoor, INSERT_VALUES, c_gCoor); CHKERRQ(ierr);
784 ierr = DMLocalToGlobalEnd(coarse_user->
fda, c_lCoor, INSERT_VALUES, c_gCoor); CHKERRQ(ierr);
785 ierr = DMGlobalToLocalBegin(coarse_user->
fda, c_gCoor, INSERT_VALUES, c_lCoor); CHKERRQ(ierr);
786 ierr = DMGlobalToLocalEnd(coarse_user->
fda, c_gCoor, INSERT_VALUES, c_lCoor); CHKERRQ(ierr);
790 PetscFunctionReturn(0);
1291 Cmpnts *face_center, PetscReal *face_area)
1293 PetscErrorCode ierr;
1299 PetscReal local_sum[3] = {0.0, 0.0, 0.0};
1300 PetscReal localAreaSum = 0.0;
1301 PetscCount local_n_points = 0;
1306 PetscReal global_sum[3] = {0.0, 0.0, 0.0};
1307 PetscReal globalAreaSum = 0.0;
1308 PetscCount global_n_points = 0;
1317 PetscInt xs = info.xs, xe = info.xs + info.xm;
1318 PetscInt ys = info.ys, ye = info.ys + info.ym;
1319 PetscInt zs = info.zs, ze = info.zs + info.zm;
1322 PetscInt mx = info.mx, my = info.my, mz = info.mz;
1323 PetscInt IM = user->
IM;
1324 PetscInt JM = user->
JM;
1325 PetscInt KM = user->
KM;
1331 PetscInt lxs = xs;
if(xs == 0) lxs = xs + 1;
1332 PetscInt lxe = xe;
if(xe == mx) lxe = xe - 1;
1333 PetscInt lys = ys;
if(ys == 0) lys = ys + 1;
1334 PetscInt lye = ye;
if(ye == my) lye = ye - 1;
1335 PetscInt lzs = zs;
if(zs == 0) lzs = zs + 1;
1336 PetscInt lze = ze;
if(ze == mz) lze = ze - 1;
1342 PetscInt i_max = (xe == mx) ? mx - 1 : xe;
1343 PetscInt j_max = (ye == my) ? my - 1 : ye;
1344 PetscInt k_max = (ze == mz) ? mz - 1 : ze;
1351 Cmpnts ***csi, ***eta, ***zet;
1354 PetscFunctionBeginUser;
1360 PetscBool owns_face = PETSC_FALSE;
1366 ierr = DMGetCoordinatesLocal(user->
da, &lCoor); CHKERRQ(ierr);
1367 ierr = DMDAVecGetArrayRead(user->
fda, lCoor, &coor); CHKERRQ(ierr);
1368 ierr = DMDAVecGetArrayRead(user->
da, user->
lNvert, &nvert); CHKERRQ(ierr);
1369 ierr = DMDAVecGetArrayRead(user->
fda, user->
lCsi, &csi); CHKERRQ(ierr);
1370 ierr = DMDAVecGetArrayRead(user->
fda, user->
lEta, &eta); CHKERRQ(ierr);
1371 ierr = DMDAVecGetArrayRead(user->
fda, user->
lZet, &zet); CHKERRQ(ierr);
1388 for (PetscInt k = zs; k < k_max; k++) {
1389 for (PetscInt j = ys; j < j_max; j++) {
1391 local_sum[0] += coor[k][j][i].
x;
1392 local_sum[1] += coor[k][j][i].
y;
1393 local_sum[2] += coor[k][j][i].
z;
1401 for (PetscInt k = lzs; k < lze; k++) {
1402 for (PetscInt j = lys; j < lye; j++) {
1406 if (nvert[k][j][i+1] < 0.1) {
1409 localAreaSum += sqrt(csi[k][j][i].x * csi[k][j][i].x +
1410 csi[k][j][i].y * csi[k][j][i].y +
1411 csi[k][j][i].z * csi[k][j][i].z);
1423 PetscInt i = mx - 2;
1426 for (PetscInt k = zs; k < k_max; k++) {
1427 for (PetscInt j = ys; j < j_max; j++) {
1428 local_sum[0] += coor[k][j][i].
x;
1429 local_sum[1] += coor[k][j][i].
y;
1430 local_sum[2] += coor[k][j][i].
z;
1436 for (PetscInt k = lzs; k < lze; k++) {
1437 for (PetscInt j = lys; j < lye; j++) {
1441 if (nvert[k][j][i] < 0.1) {
1443 localAreaSum += sqrt(csi[k][j][i].x * csi[k][j][i].x +
1444 csi[k][j][i].y * csi[k][j][i].y +
1445 csi[k][j][i].z * csi[k][j][i].z);
1461 for (PetscInt k = zs; k < k_max; k++) {
1462 for (PetscInt i = xs; i < i_max; i++) {
1463 local_sum[0] += coor[k][j][i].
x;
1464 local_sum[1] += coor[k][j][i].
y;
1465 local_sum[2] += coor[k][j][i].
z;
1472 for (PetscInt k = lzs; k < lze; k++) {
1473 for (PetscInt i = lxs; i < lxe; i++) {
1475 if (nvert[k][j+1][i] < 0.1) {
1477 localAreaSum += sqrt(eta[k][j][i].x * eta[k][j][i].x +
1478 eta[k][j][i].y * eta[k][j][i].y +
1479 eta[k][j][i].z * eta[k][j][i].z);
1491 PetscInt j = my - 2;
1494 for (PetscInt k = zs; k < k_max; k++) {
1495 for (PetscInt i = xs; i < i_max; i++) {
1496 local_sum[0] += coor[k][j][i].
x;
1497 local_sum[1] += coor[k][j][i].
y;
1498 local_sum[2] += coor[k][j][i].
z;
1504 for (PetscInt k = lzs; k < lze; k++) {
1505 for (PetscInt i = lxs; i < lxe; i++) {
1507 if (nvert[k][j][i] < 0.1) {
1509 localAreaSum += sqrt(eta[k][j][i].x * eta[k][j][i].x +
1510 eta[k][j][i].y * eta[k][j][i].y +
1511 eta[k][j][i].z * eta[k][j][i].z);
1527 for (PetscInt j = ys; j < j_max; j++) {
1528 for (PetscInt i = xs; i < i_max; i++) {
1529 local_sum[0] += coor[k][j][i].
x;
1530 local_sum[1] += coor[k][j][i].
y;
1531 local_sum[2] += coor[k][j][i].
z;
1538 for (PetscInt j = lys; j < lye; j++) {
1539 for (PetscInt i = lxs; i < lxe; i++) {
1542 if (nvert[k+1][j][i] < 0.1) {
1544 localAreaSum += sqrt(zet[k][j][i].x * zet[k][j][i].x +
1545 zet[k][j][i].y * zet[k][j][i].y +
1546 zet[k][j][i].z * zet[k][j][i].z);
1558 PetscInt k = mz - 2;
1562 for (PetscInt j = ys; j < j_max; j++) {
1563 for (PetscInt i = xs; i < i_max; i++) {
1564 local_sum[0] += coor[k][j][i].
x;
1565 local_sum[1] += coor[k][j][i].
y;
1566 local_sum[2] += coor[k][j][i].
z;
1573 for (PetscInt j = lys; j < lye; j++) {
1574 for (PetscInt i = lxs; i < lxe; i++) {
1577 if (nvert[k][j][i] < 0.1) {
1579 localAreaSum += sqrt(zet[k][j][i].x * zet[k][j][i].x +
1580 zet[k][j][i].y * zet[k][j][i].y +
1581 zet[k][j][i].z * zet[k][j][i].z);
1589 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_OUTOFRANGE,
1590 "Unknown face_id %d in CalculateFaceCenterAndArea", face_id);
1596 ierr = DMDAVecRestoreArrayRead(user->
fda, lCoor, &coor); CHKERRQ(ierr);
1597 ierr = DMDAVecRestoreArrayRead(user->
da, user->
lNvert, &nvert); CHKERRQ(ierr);
1598 ierr = DMDAVecRestoreArrayRead(user->
fda, user->
lCsi, &csi); CHKERRQ(ierr);
1599 ierr = DMDAVecRestoreArrayRead(user->
fda, user->
lEta, &eta); CHKERRQ(ierr);
1600 ierr = DMDAVecRestoreArrayRead(user->
fda, user->
lZet, &zet); CHKERRQ(ierr);
1606 ierr = MPI_Allreduce(local_sum, global_sum, 3, MPI_DOUBLE, MPI_SUM,
1607 PETSC_COMM_WORLD); CHKERRQ(ierr);
1610 ierr = MPI_Allreduce(&local_n_points, &global_n_points, 1, MPI_COUNT, MPI_SUM,
1611 PETSC_COMM_WORLD); CHKERRQ(ierr);
1614 ierr = MPI_Allreduce(&localAreaSum, &globalAreaSum, 1, MPI_DOUBLE, MPI_SUM,
1615 PETSC_COMM_WORLD); CHKERRQ(ierr);
1620 if (global_n_points > 0) {
1621 face_center->
x = global_sum[0] / global_n_points;
1622 face_center->
y = global_sum[1] / global_n_points;
1623 face_center->
z = global_sum[2] / global_n_points;
1625 "Calculated center for Face %s: (x=%.4f, y=%.4f, z=%.4f) from %lld nodes\n",
1627 face_center->
x, face_center->
y, face_center->
z,
1628 (
long long)global_n_points);
1632 "WARNING: Face %s identified but no grid points found. Center not calculated.\n",
1634 face_center->
x = face_center->
y = face_center->
z = 0.0;
1640 *face_area = globalAreaSum;
1642 "Calculated area for Face %s: Area=%.6f\n",
1645 PetscFunctionReturn(0);