128 DMBoundaryType xperiod = (simCtx->
i_periodic) ? DM_BOUNDARY_PERIODIC : DM_BOUNDARY_NONE;
129 DMBoundaryType yperiod = (simCtx->
j_periodic) ? DM_BOUNDARY_PERIODIC : DM_BOUNDARY_NONE;
130 DMBoundaryType zperiod = (simCtx->
k_periodic) ? DM_BOUNDARY_PERIODIC : DM_BOUNDARY_NONE;
133 PetscInt *lx = NULL, *ly = NULL, *lz = NULL;
136 PetscFunctionBeginUser;
144 DMDAGetInfo(coarse_user->
da, NULL, NULL, NULL, NULL, &m, &n, &p, NULL, NULL, NULL, NULL, NULL, NULL);
148 PetscInt *lx_contrib, *ly_contrib, *lz_contrib;
149 ierr = PetscMalloc3(m, &lx_contrib, n, &ly_contrib, p, &lz_contrib); CHKERRQ(ierr);
150 ierr = PetscMemzero(lx_contrib, m *
sizeof(PetscInt)); CHKERRQ(ierr);
151 ierr = PetscMemzero(ly_contrib, n *
sizeof(PetscInt)); CHKERRQ(ierr);
152 ierr = PetscMemzero(lz_contrib, p *
sizeof(PetscInt)); CHKERRQ(ierr);
155 DMDAGetLocalInfo(coarse_user->
da, &info);
156 PetscInt xs = info.xs, xe = info.xs + info.xm, mx = info.mx;
157 PetscInt ys = info.ys, ye = info.ys + info.ym, my = info.my;
158 PetscInt zs = info.zs, ze = info.zs + info.zm, mz = info.mz;
161 ierr = MPI_Comm_rank(PETSC_COMM_WORLD, &rank); CHKERRQ(ierr);
162 PetscInt proc_i = rank % m;
163 PetscInt proc_j = (rank / m) % n;
164 PetscInt proc_k = rank / (m * n);
167 if (user->
isc) lx_contrib[proc_i] = (xe - xs);
169 if (m == 1) lx_contrib[0] = user->
IM + 1;
170 else if (xs == 0) lx_contrib[0] = 2 * xe - 1;
171 else if (xe == mx) lx_contrib[proc_i] = user->
IM + 1 - (2 * xs - 1);
172 else lx_contrib[proc_i] = (xe - xs) * 2;
176 if (user->
jsc) ly_contrib[proc_j] = (ye - ys);
178 if (n == 1) ly_contrib[0] = user->
JM + 1;
179 else if (ys == 0) ly_contrib[0] = 2 * ye - 1;
180 else if (ye == my) ly_contrib[proc_j] = user->
JM + 1 - (2 * ys - 1);
181 else ly_contrib[proc_j] = (ye - ys) * 2;
185 if (user->
ksc) lz_contrib[proc_k] = (ze - zs);
187 if (p == 1) lz_contrib[0] = user->
KM + 1;
188 else if (zs == 0) lz_contrib[0] = 2 * ze - 1;
189 else if (ze == mz) lz_contrib[proc_k] = user->
KM + 1 - (2 * zs - 1);
190 else lz_contrib[proc_k] = (ze - zs) * 2;
192 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]);
195 ierr = PetscMalloc3(m, &lx, n, &ly, p, &lz); CHKERRQ(ierr);
196 ierr = MPI_Allreduce(lx_contrib, lx, m, MPIU_INT, MPI_MAX, PETSC_COMM_WORLD); CHKERRQ(ierr);
197 ierr = MPI_Allreduce(ly_contrib, ly, n, MPIU_INT, MPI_MAX, PETSC_COMM_WORLD); CHKERRQ(ierr);
198 ierr = MPI_Allreduce(lz_contrib, lz, p, MPIU_INT, MPI_MAX, PETSC_COMM_WORLD); CHKERRQ(ierr);
200 ierr = PetscFree3(lx_contrib, ly_contrib, lz_contrib); CHKERRQ(ierr);
215 m = n = p = PETSC_DECIDE;
223 ierr = DMDACreate3d(PETSC_COMM_WORLD, xperiod, yperiod, zperiod, DMDA_STENCIL_BOX,
224 user->
IM + 1, user->
JM + 1, user->
KM + 1,
226 1, stencil_width, lx, ly, lz, &user->
da); CHKERRQ(ierr);
229 ierr = PetscFree3(lx, ly, lz); CHKERRQ(ierr);
233 ierr = DMSetUp(user->
da); CHKERRQ(ierr);
234 ierr = DMGetCoordinateDM(user->
da, &user->
fda); CHKERRQ(ierr);
235 ierr = DMDASetUniformCoordinates(user->
da, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0); CHKERRQ(ierr);
236 ierr = DMDAGetLocalInfo(user->
da, &user->
info); CHKERRQ(ierr);
241 PetscFunctionReturn(0);
425 PetscFunctionBeginUser;
435 FILE *grid_file_handle = NULL;
437 if (simCtx->
rank == 0) {
438 grid_file_handle = fopen(simCtx->
grid_file,
"r");
439 if (!grid_file_handle) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_FILE_OPEN,
"Cannot open file: %s", simCtx->
grid_file);
444 char dummy_buffer[2048];
445 for (PetscInt s = 0; s < headerLines; ++s) {
446 if (!fgets(dummy_buffer,
sizeof(dummy_buffer), grid_file_handle)) {
447 SETERRQ(PETSC_COMM_SELF, PETSC_ERR_FILE_READ,
"Unexpected EOF while skipping grid header");
458 if (simCtx->
rank == 0) {
459 fclose(grid_file_handle);
467 ierr = DMGetCoordinates(user->
da, &gCoor); CHKERRQ(ierr);
468 ierr = DMGetCoordinatesLocal(user->
da, &lCoor); CHKERRQ(ierr);
471 ierr = DMLocalToGlobalBegin(user->
fda, lCoor, INSERT_VALUES, gCoor); CHKERRQ(ierr);
472 ierr = DMLocalToGlobalEnd(user->
fda, lCoor, INSERT_VALUES, gCoor); CHKERRQ(ierr);
474 ierr = DMGlobalToLocalBegin(user->
fda, gCoor, INSERT_VALUES, lCoor); CHKERRQ(ierr);
475 ierr = DMGlobalToLocalEnd(user->
fda, gCoor, INSERT_VALUES, lCoor); CHKERRQ(ierr);
479 PetscFunctionReturn(0);
625 PetscMPIInt rank = simCtx->
rank;
626 PetscInt block_index = user->
_this;
627 PetscInt IM = user->
IM, JM = user->
JM, KM = user->
KM;
631 PetscReal *gc = NULL;
633 PetscFunctionBeginUser;
638 simCtx->
rank, block_index);
642 PetscInt n_nodes = (IM) * (JM) * (KM);
643 ierr = PetscMalloc1(3 * n_nodes, &gc); CHKERRQ(ierr);
647 if (!fd) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_FILE_OPEN,
"Recieved a NULL file handle.\n");
650 for (PetscInt k = 0; k < KM; k++) {
651 for (PetscInt j = 0; j < JM; j++) {
652 for (PetscInt i = 0; i < IM; i++) {
653 PetscInt base_index = 3 * ((k * (JM) + j) * (IM) + i);
654 if (fscanf(fd,
"%le %le %le\n", &gc[base_index], &gc[base_index + 1], &gc[base_index + 2]) != 3) {
655 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);
664 ierr = MPI_Bcast(gc, 3 * n_nodes, MPIU_REAL, 0, PETSC_COMM_WORLD); CHKERRQ(ierr);
667 ierr = DMDAGetLocalInfo(user->
da, &info); CHKERRQ(ierr);
668 ierr = DMGetCoordinatesLocal(user->
da, &lCoor); CHKERRQ(ierr);
669 ierr = DMDAVecGetArray(user->
fda, lCoor, &coor); CHKERRQ(ierr);
671 for (PetscInt k = info.zs; k < info.zs + info.zm; k++) {
672 for (PetscInt j = info.ys; j < info.ys + info.ym; j++) {
673 for (PetscInt i = info.xs; i < info.xs + info.xm; i++) {
674 if(k< KM && j < JM && i < IM){
675 PetscInt base_idx = 3 * ((k * (JM) + j) * (IM) + i);
676 coor[k][j][i].
x = gc[base_idx];
677 coor[k][j][i].
y = gc[base_idx + 1];
678 coor[k][j][i].
z = gc[base_idx + 2];
685 ierr = DMDAVecRestoreArray(user->
fda, lCoor, &coor); CHKERRQ(ierr);
686 ierr = PetscFree(gc); CHKERRQ(ierr);
690 PetscFunctionReturn(0);
711 Vec c_lCoor, f_lCoor;
714 DMDALocalInfo c_info;
717 PetscFunctionBeginUser;
724 ierr = DMDAGetLocalInfo(coarse_user->
da, &c_info); CHKERRQ(ierr);
726 ierr = DMGetCoordinatesLocal(coarse_user->
da, &c_lCoor); CHKERRQ(ierr);
727 ierr = DMGetCoordinatesLocal(fine_user->
da, &f_lCoor); CHKERRQ(ierr);
729 ierr = DMDAVecGetArray(coarse_user->
fda, c_lCoor, &c_coor); CHKERRQ(ierr);
730 ierr = DMDAVecGetArrayRead(fine_user->
fda, f_lCoor, &f_coor); CHKERRQ(ierr);
733 PetscInt xs = c_info.xs, xe = c_info.xs + c_info.xm;
734 PetscInt ys = c_info.ys, ye = c_info.ys + c_info.ym;
735 PetscInt zs = c_info.zs, ze = c_info.zs + c_info.zm;
738 PetscInt mx = c_info.mx, my = c_info.my, mz = c_info.mz;
747 for (PetscInt k = zs; k < ze; k++) {
748 for (PetscInt j = ys; j < ye; j++) {
749 for (PetscInt i = xs; i < xe; i++) {
752 ih = coarse_user->
isc ? i : 2 * i;
753 jh = coarse_user->
jsc ? j : 2 * j;
754 kh = coarse_user->
ksc ? k : 2 * k;
758 c_coor[k][j][i] = f_coor[kh][jh][ih];
763 ierr = DMDAVecRestoreArray(coarse_user->
fda, c_lCoor, &c_coor); CHKERRQ(ierr);
764 ierr = DMDAVecRestoreArrayRead(fine_user->
fda, f_lCoor, &f_coor); CHKERRQ(ierr);
768 ierr = DMGetCoordinates(coarse_user->
da, &c_gCoor); CHKERRQ(ierr);
769 ierr = DMLocalToGlobalBegin(coarse_user->
fda, c_lCoor, INSERT_VALUES, c_gCoor); CHKERRQ(ierr);
770 ierr = DMLocalToGlobalEnd(coarse_user->
fda, c_lCoor, INSERT_VALUES, c_gCoor); CHKERRQ(ierr);
771 ierr = DMGlobalToLocalBegin(coarse_user->
fda, c_gCoor, INSERT_VALUES, c_lCoor); CHKERRQ(ierr);
772 ierr = DMGlobalToLocalEnd(coarse_user->
fda, c_gCoor, INSERT_VALUES, c_lCoor); CHKERRQ(ierr);
776 PetscFunctionReturn(0);
1277 Cmpnts *face_center, PetscReal *face_area)
1279 PetscErrorCode ierr;
1285 PetscReal local_sum[3] = {0.0, 0.0, 0.0};
1286 PetscReal localAreaSum = 0.0;
1287 PetscCount local_n_points = 0;
1292 PetscReal global_sum[3] = {0.0, 0.0, 0.0};
1293 PetscReal globalAreaSum = 0.0;
1294 PetscCount global_n_points = 0;
1303 PetscInt xs = info.xs, xe = info.xs + info.xm;
1304 PetscInt ys = info.ys, ye = info.ys + info.ym;
1305 PetscInt zs = info.zs, ze = info.zs + info.zm;
1308 PetscInt mx = info.mx, my = info.my, mz = info.mz;
1309 PetscInt IM = user->
IM;
1310 PetscInt JM = user->
JM;
1311 PetscInt KM = user->
KM;
1317 PetscInt lxs = xs;
if(xs == 0) lxs = xs + 1;
1318 PetscInt lxe = xe;
if(xe == mx) lxe = xe - 1;
1319 PetscInt lys = ys;
if(ys == 0) lys = ys + 1;
1320 PetscInt lye = ye;
if(ye == my) lye = ye - 1;
1321 PetscInt lzs = zs;
if(zs == 0) lzs = zs + 1;
1322 PetscInt lze = ze;
if(ze == mz) lze = ze - 1;
1328 PetscInt i_max = (xe == mx) ? mx - 1 : xe;
1329 PetscInt j_max = (ye == my) ? my - 1 : ye;
1330 PetscInt k_max = (ze == mz) ? mz - 1 : ze;
1337 Cmpnts ***csi, ***eta, ***zet;
1340 PetscFunctionBeginUser;
1346 PetscBool owns_face = PETSC_FALSE;
1352 ierr = DMGetCoordinatesLocal(user->
da, &lCoor); CHKERRQ(ierr);
1353 ierr = DMDAVecGetArrayRead(user->
fda, lCoor, &coor); CHKERRQ(ierr);
1354 ierr = DMDAVecGetArrayRead(user->
da, user->
lNvert, &nvert); CHKERRQ(ierr);
1355 ierr = DMDAVecGetArrayRead(user->
fda, user->
lCsi, &csi); CHKERRQ(ierr);
1356 ierr = DMDAVecGetArrayRead(user->
fda, user->
lEta, &eta); CHKERRQ(ierr);
1357 ierr = DMDAVecGetArrayRead(user->
fda, user->
lZet, &zet); CHKERRQ(ierr);
1374 for (PetscInt k = zs; k < k_max; k++) {
1375 for (PetscInt j = ys; j < j_max; j++) {
1377 local_sum[0] += coor[k][j][i].
x;
1378 local_sum[1] += coor[k][j][i].
y;
1379 local_sum[2] += coor[k][j][i].
z;
1387 for (PetscInt k = lzs; k < lze; k++) {
1388 for (PetscInt j = lys; j < lye; j++) {
1392 if (nvert[k][j][i+1] < 0.1) {
1395 localAreaSum += sqrt(csi[k][j][i].x * csi[k][j][i].x +
1396 csi[k][j][i].y * csi[k][j][i].y +
1397 csi[k][j][i].z * csi[k][j][i].z);
1409 PetscInt i = mx - 2;
1412 for (PetscInt k = zs; k < k_max; k++) {
1413 for (PetscInt j = ys; j < j_max; j++) {
1414 local_sum[0] += coor[k][j][i].
x;
1415 local_sum[1] += coor[k][j][i].
y;
1416 local_sum[2] += coor[k][j][i].
z;
1422 for (PetscInt k = lzs; k < lze; k++) {
1423 for (PetscInt j = lys; j < lye; j++) {
1427 if (nvert[k][j][i] < 0.1) {
1429 localAreaSum += sqrt(csi[k][j][i].x * csi[k][j][i].x +
1430 csi[k][j][i].y * csi[k][j][i].y +
1431 csi[k][j][i].z * csi[k][j][i].z);
1447 for (PetscInt k = zs; k < k_max; k++) {
1448 for (PetscInt i = xs; i < i_max; i++) {
1449 local_sum[0] += coor[k][j][i].
x;
1450 local_sum[1] += coor[k][j][i].
y;
1451 local_sum[2] += coor[k][j][i].
z;
1458 for (PetscInt k = lzs; k < lze; k++) {
1459 for (PetscInt i = lxs; i < lxe; i++) {
1461 if (nvert[k][j+1][i] < 0.1) {
1463 localAreaSum += sqrt(eta[k][j][i].x * eta[k][j][i].x +
1464 eta[k][j][i].y * eta[k][j][i].y +
1465 eta[k][j][i].z * eta[k][j][i].z);
1477 PetscInt j = my - 2;
1480 for (PetscInt k = zs; k < k_max; k++) {
1481 for (PetscInt i = xs; i < i_max; i++) {
1482 local_sum[0] += coor[k][j][i].
x;
1483 local_sum[1] += coor[k][j][i].
y;
1484 local_sum[2] += coor[k][j][i].
z;
1490 for (PetscInt k = lzs; k < lze; k++) {
1491 for (PetscInt i = lxs; i < lxe; i++) {
1493 if (nvert[k][j][i] < 0.1) {
1495 localAreaSum += sqrt(eta[k][j][i].x * eta[k][j][i].x +
1496 eta[k][j][i].y * eta[k][j][i].y +
1497 eta[k][j][i].z * eta[k][j][i].z);
1513 for (PetscInt j = ys; j < j_max; j++) {
1514 for (PetscInt i = xs; i < i_max; i++) {
1515 local_sum[0] += coor[k][j][i].
x;
1516 local_sum[1] += coor[k][j][i].
y;
1517 local_sum[2] += coor[k][j][i].
z;
1524 for (PetscInt j = lys; j < lye; j++) {
1525 for (PetscInt i = lxs; i < lxe; i++) {
1528 if (nvert[k+1][j][i] < 0.1) {
1530 localAreaSum += sqrt(zet[k][j][i].x * zet[k][j][i].x +
1531 zet[k][j][i].y * zet[k][j][i].y +
1532 zet[k][j][i].z * zet[k][j][i].z);
1544 PetscInt k = mz - 2;
1548 for (PetscInt j = ys; j < j_max; j++) {
1549 for (PetscInt i = xs; i < i_max; i++) {
1550 local_sum[0] += coor[k][j][i].
x;
1551 local_sum[1] += coor[k][j][i].
y;
1552 local_sum[2] += coor[k][j][i].
z;
1559 for (PetscInt j = lys; j < lye; j++) {
1560 for (PetscInt i = lxs; i < lxe; i++) {
1563 if (nvert[k][j][i] < 0.1) {
1565 localAreaSum += sqrt(zet[k][j][i].x * zet[k][j][i].x +
1566 zet[k][j][i].y * zet[k][j][i].y +
1567 zet[k][j][i].z * zet[k][j][i].z);
1575 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_OUTOFRANGE,
1576 "Unknown face_id %d in CalculateFaceCenterAndArea", face_id);
1582 ierr = DMDAVecRestoreArrayRead(user->
fda, lCoor, &coor); CHKERRQ(ierr);
1583 ierr = DMDAVecRestoreArrayRead(user->
da, user->
lNvert, &nvert); CHKERRQ(ierr);
1584 ierr = DMDAVecRestoreArrayRead(user->
fda, user->
lCsi, &csi); CHKERRQ(ierr);
1585 ierr = DMDAVecRestoreArrayRead(user->
fda, user->
lEta, &eta); CHKERRQ(ierr);
1586 ierr = DMDAVecRestoreArrayRead(user->
fda, user->
lZet, &zet); CHKERRQ(ierr);
1592 ierr = MPI_Allreduce(local_sum, global_sum, 3, MPI_DOUBLE, MPI_SUM,
1593 PETSC_COMM_WORLD); CHKERRQ(ierr);
1596 ierr = MPI_Allreduce(&local_n_points, &global_n_points, 1, MPI_COUNT, MPI_SUM,
1597 PETSC_COMM_WORLD); CHKERRQ(ierr);
1600 ierr = MPI_Allreduce(&localAreaSum, &globalAreaSum, 1, MPI_DOUBLE, MPI_SUM,
1601 PETSC_COMM_WORLD); CHKERRQ(ierr);
1606 if (global_n_points > 0) {
1607 face_center->
x = global_sum[0] / global_n_points;
1608 face_center->
y = global_sum[1] / global_n_points;
1609 face_center->
z = global_sum[2] / global_n_points;
1611 "Calculated center for Face %s: (x=%.4f, y=%.4f, z=%.4f) from %lld nodes\n",
1613 face_center->
x, face_center->
y, face_center->
z,
1614 (
long long)global_n_points);
1618 "WARNING: Face %s identified but no grid points found. Center not calculated.\n",
1620 face_center->
x = face_center->
y = face_center->
z = 0.0;
1626 *face_area = globalAreaSum;
1628 "Calculated area for Face %s: Area=%.6f\n",
1631 PetscFunctionReturn(0);