95 PetscInt i,PetscInt j,PetscInt k,
96 PetscReal xi,PetscReal eta,PetscReal zta,
97 PetscReal J[3][3], PetscReal *detJ)
101 PetscFunctionBeginUser;
105 PetscReal dN_dXi[8], dN_dEta[8], dN_dZta[8];
106 for (PetscInt c=0;c<8;++c) {
107 PetscReal sx = (c & 1) ? 1.0 : -1.0;
108 PetscReal sy = (c & 2) ? 1.0 : -1.0;
109 PetscReal sz = (c & 4) ? 1.0 : -1.0;
110 dN_dXi [c] = 0.125 * sx * ( (c&2?eta:1-eta) ) * ( (c&4?zta:1-zta) );
111 dN_dEta[c] = 0.125 * sy * ( (c&1?xi :1-xi ) ) * ( (c&4?zta:1-zta) );
112 dN_dZta[c] = 0.125 * sz * ( (c&1?xi :1-xi ) ) * ( (c&2?eta:1-eta) );
116 PetscReal x_xi=0,y_xi=0,z_xi=0,
117 x_eta=0,y_eta=0,z_eta=0,
118 x_zta=0,y_zta=0,z_zta=0;
119 for (PetscInt c=0;c<8;++c) {
120 x_xi += dN_dXi [c]*V[c].
x; y_xi += dN_dXi [c]*V[c].
y; z_xi += dN_dXi [c]*V[c].
z;
121 x_eta += dN_dEta[c]*V[c].
x; y_eta += dN_dEta[c]*V[c].
y; z_eta += dN_dEta[c]*V[c].
z;
122 x_zta += dN_dZta[c]*V[c].
x; y_zta += dN_dZta[c]*V[c].
y; z_zta += dN_dZta[c]*V[c].
z;
125 J[0][0]=x_xi; J[0][1]=x_eta; J[0][2]=x_zta;
126 J[1][0]=y_xi; J[1][1]=y_eta; J[1][2]=y_zta;
127 J[2][0]=z_xi; J[2][1]=z_eta; J[2][2]=z_zta;
130 *detJ = x_xi*(y_eta*z_zta - y_zta*z_eta)
131 - x_eta*(y_xi*z_zta - y_zta*z_xi)
132 + x_zta*(y_xi*z_eta - y_eta*z_xi);
134 PetscFunctionReturn(0);
290 Cmpnts ***csi_arr, ***eta_arr, ***zet_arr;
291 Cmpnts ***nodal_coords_arr;
292 Vec localCoords_from_dm;
294 PetscFunctionBeginUser;
297 ierr = DMDAGetLocalInfo(user->
fda, &info); CHKERRQ(ierr);
300 ierr = DMGetCoordinatesLocal(user->
da, &localCoords_from_dm); CHKERRQ(ierr);
301 if (!localCoords_from_dm) SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONGSTATE,
"DMGetCoordinatesLocal failed to return a coordinate vector. \n");
302 ierr = DMDAVecGetArrayRead(user->
fda, localCoords_from_dm, &nodal_coords_arr); CHKERRQ(ierr);
305 ierr = DMDAVecGetArray(user->
fda, user->
Csi, &csi_arr); CHKERRQ(ierr);
306 ierr = DMDAVecGetArray(user->
fda, user->
Eta, &eta_arr); CHKERRQ(ierr);
307 ierr = DMDAVecGetArray(user->
fda, user->
Zet, &zet_arr); CHKERRQ(ierr);
310 PetscInt xs = info.xs, xe = info.xs + info.xm;
311 PetscInt ys = info.ys, ye = info.ys + info.ym;
312 PetscInt zs = info.zs, ze = info.zs + info.zm;
315 PetscInt mx = info.mx;
316 PetscInt my = info.my;
317 PetscInt mz = info.mz;
321 PetscInt k_loop_start = (zs == 0) ? zs + 1 : zs;
322 PetscInt j_loop_start = (ys == 0) ? ys + 1 : ys;
323 PetscInt i_loop_start = (xs == 0) ? xs + 1 : xs;
326 for (PetscInt k_node = k_loop_start; k_node < ze; ++k_node) {
327 for (PetscInt j_node = j_loop_start; j_node < ye; ++j_node) {
328 for (PetscInt i_node = xs; i_node < xe; ++i_node) {
330 PetscReal dx_deta = 0.5 * (nodal_coords_arr[k_node][j_node][i_node].
x + nodal_coords_arr[k_node-1][j_node][i_node].
x - nodal_coords_arr[k_node][j_node-1][i_node].
x - nodal_coords_arr[k_node-1][j_node-1][i_node].
x);
331 PetscReal dy_deta = 0.5 * (nodal_coords_arr[k_node][j_node][i_node].
y + nodal_coords_arr[k_node-1][j_node][i_node].
y - nodal_coords_arr[k_node][j_node-1][i_node].
y - nodal_coords_arr[k_node-1][j_node-1][i_node].
y);
332 PetscReal dz_deta = 0.5 * (nodal_coords_arr[k_node][j_node][i_node].
z + nodal_coords_arr[k_node-1][j_node][i_node].
z - nodal_coords_arr[k_node][j_node-1][i_node].
z - nodal_coords_arr[k_node-1][j_node-1][i_node].
z);
333 PetscReal dx_dzeta = 0.5 * (nodal_coords_arr[k_node][j_node-1][i_node].
x + nodal_coords_arr[k_node][j_node][i_node].
x - nodal_coords_arr[k_node-1][j_node-1][i_node].
x - nodal_coords_arr[k_node-1][j_node][i_node].
x);
334 PetscReal dy_dzeta = 0.5 * (nodal_coords_arr[k_node][j_node-1][i_node].
y + nodal_coords_arr[k_node][j_node][i_node].
y - nodal_coords_arr[k_node-1][j_node-1][i_node].
y - nodal_coords_arr[k_node-1][j_node][i_node].
y);
335 PetscReal dz_dzeta = 0.5 * (nodal_coords_arr[k_node][j_node-1][i_node].
z + nodal_coords_arr[k_node][j_node][i_node].
z - nodal_coords_arr[k_node-1][j_node-1][i_node].
z - nodal_coords_arr[k_node-1][j_node][i_node].
z);
337 csi_arr[k_node][j_node][i_node].
x = dy_deta * dz_dzeta - dz_deta * dy_dzeta;
338 csi_arr[k_node][j_node][i_node].
y = dz_deta * dx_dzeta - dx_deta * dz_dzeta;
339 csi_arr[k_node][j_node][i_node].
z = dx_deta * dy_dzeta - dy_deta * dx_dzeta;
345 for (PetscInt k_node = k_loop_start; k_node < ze; ++k_node) {
346 for (PetscInt j_node = ys; j_node < ye; ++j_node) {
347 for (PetscInt i_node = i_loop_start; i_node < xe; ++i_node) {
349 PetscReal dx_dxi = 0.5 * (nodal_coords_arr[k_node][j_node][i_node].
x + nodal_coords_arr[k_node-1][j_node][i_node].
x - nodal_coords_arr[k_node][j_node][i_node-1].
x - nodal_coords_arr[k_node-1][j_node][i_node-1].
x);
350 PetscReal dy_dxi = 0.5 * (nodal_coords_arr[k_node][j_node][i_node].
y + nodal_coords_arr[k_node-1][j_node][i_node].
y - nodal_coords_arr[k_node][j_node][i_node-1].
y - nodal_coords_arr[k_node-1][j_node][i_node-1].
y);
351 PetscReal dz_dxi = 0.5 * (nodal_coords_arr[k_node][j_node][i_node].
z + nodal_coords_arr[k_node-1][j_node][i_node].
z - nodal_coords_arr[k_node][j_node][i_node-1].
z - nodal_coords_arr[k_node-1][j_node][i_node-1].
z);
352 PetscReal dx_dzeta = 0.5 * (nodal_coords_arr[k_node][j_node][i_node].
x + nodal_coords_arr[k_node][j_node][i_node-1].
x - nodal_coords_arr[k_node-1][j_node][i_node].
x - nodal_coords_arr[k_node-1][j_node][i_node-1].
x);
353 PetscReal dy_dzeta = 0.5 * (nodal_coords_arr[k_node][j_node][i_node].
y + nodal_coords_arr[k_node][j_node][i_node-1].
y - nodal_coords_arr[k_node-1][j_node][i_node].
y - nodal_coords_arr[k_node-1][j_node][i_node-1].
y);
354 PetscReal dz_dzeta = 0.5 * (nodal_coords_arr[k_node][j_node][i_node].
z + nodal_coords_arr[k_node][j_node][i_node-1].
z - nodal_coords_arr[k_node-1][j_node][i_node].
z - nodal_coords_arr[k_node-1][j_node][i_node-1].
z);
356 eta_arr[k_node][j_node][i_node].
x = dy_dzeta * dz_dxi - dz_dzeta * dy_dxi;
357 eta_arr[k_node][j_node][i_node].
y = dz_dzeta * dx_dxi - dx_dzeta * dz_dxi;
358 eta_arr[k_node][j_node][i_node].
z = dx_dzeta * dy_dxi - dy_dzeta * dx_dxi;
364 for (PetscInt k_node = zs; k_node < ze; ++k_node) {
365 for (PetscInt j_node = j_loop_start; j_node < ye; ++j_node) {
366 for (PetscInt i_node = i_loop_start; i_node < xe; ++i_node) {
368 PetscReal dx_dxi = 0.5 * (nodal_coords_arr[k_node][j_node][i_node].
x + nodal_coords_arr[k_node][j_node-1][i_node].
x - nodal_coords_arr[k_node][j_node][i_node-1].
x - nodal_coords_arr[k_node][j_node-1][i_node-1].
x);
369 PetscReal dy_dxi = 0.5 * (nodal_coords_arr[k_node][j_node][i_node].
y + nodal_coords_arr[k_node][j_node-1][i_node].
y - nodal_coords_arr[k_node][j_node][i_node-1].
y - nodal_coords_arr[k_node][j_node-1][i_node-1].
y);
370 PetscReal dz_dxi = 0.5 * (nodal_coords_arr[k_node][j_node][i_node].
z + nodal_coords_arr[k_node][j_node-1][i_node].
z - nodal_coords_arr[k_node][j_node][i_node-1].
z - nodal_coords_arr[k_node][j_node-1][i_node-1].
z);
371 PetscReal dx_deta = 0.5 * (nodal_coords_arr[k_node][j_node][i_node].
x + nodal_coords_arr[k_node][j_node][i_node-1].
x - nodal_coords_arr[k_node][j_node-1][i_node].
x - nodal_coords_arr[k_node][j_node-1][i_node-1].
x);
372 PetscReal dy_deta = 0.5 * (nodal_coords_arr[k_node][j_node][i_node].
y + nodal_coords_arr[k_node][j_node][i_node-1].
y - nodal_coords_arr[k_node][j_node-1][i_node].
y - nodal_coords_arr[k_node][j_node-1][i_node-1].
y);
373 PetscReal dz_deta = 0.5 * (nodal_coords_arr[k_node][j_node][i_node].
z + nodal_coords_arr[k_node][j_node][i_node-1].
z - nodal_coords_arr[k_node][j_node-1][i_node].
z - nodal_coords_arr[k_node][j_node-1][i_node-1].
z);
375 zet_arr[k_node][j_node][i_node].
x = dy_dxi * dz_deta - dz_dxi * dy_deta;
376 zet_arr[k_node][j_node][i_node].
y = dz_dxi * dx_deta - dx_dxi * dz_deta;
377 zet_arr[k_node][j_node][i_node].
z = dx_dxi * dy_deta - dy_dxi * dx_deta;
384 PetscInt i_bnd, j_bnd, k_bnd;
388 for (k_bnd = zs; k_bnd < ze; ++k_bnd) {
389 for (j_bnd = ys; j_bnd < ye; ++j_bnd) {
390 if (i_bnd + 1 < mx) {
391 eta_arr[k_bnd][j_bnd][i_bnd] = eta_arr[k_bnd][j_bnd][i_bnd+1];
392 zet_arr[k_bnd][j_bnd][i_bnd] = zet_arr[k_bnd][j_bnd][i_bnd+1];
399 for (k_bnd = zs; k_bnd < ze; ++k_bnd) {
400 for (j_bnd = ys; j_bnd < ye; ++j_bnd) {
401 if (i_bnd - 1 >= 0) {
402 eta_arr[k_bnd][j_bnd][i_bnd] = eta_arr[k_bnd][j_bnd][i_bnd-1];
403 zet_arr[k_bnd][j_bnd][i_bnd] = zet_arr[k_bnd][j_bnd][i_bnd-1];
410 for (k_bnd = zs; k_bnd < ze; ++k_bnd) {
411 for (i_bnd = xs; i_bnd < xe; ++i_bnd) {
412 if (j_bnd + 1 < my) {
413 csi_arr[k_bnd][j_bnd][i_bnd] = csi_arr[k_bnd][j_bnd+1][i_bnd];
414 zet_arr[k_bnd][j_bnd][i_bnd] = zet_arr[k_bnd][j_bnd+1][i_bnd];
421 for (k_bnd = zs; k_bnd < ze; ++k_bnd) {
422 for (i_bnd = xs; i_bnd < xe; ++i_bnd) {
423 if (j_bnd - 1 >= 0) {
424 csi_arr[k_bnd][j_bnd][i_bnd] = csi_arr[k_bnd][j_bnd-1][i_bnd];
425 zet_arr[k_bnd][j_bnd][i_bnd] = zet_arr[k_bnd][j_bnd-1][i_bnd];
432 for (j_bnd = ys; j_bnd < ye; ++j_bnd) {
433 for (i_bnd = xs; i_bnd < xe; ++i_bnd) {
434 if (k_bnd + 1 < mz) {
435 csi_arr[k_bnd][j_bnd][i_bnd] = csi_arr[k_bnd+1][j_bnd][i_bnd];
436 eta_arr[k_bnd][j_bnd][i_bnd] = eta_arr[k_bnd+1][j_bnd][i_bnd];
443 for (j_bnd = ys; j_bnd < ye; ++j_bnd) {
444 for (i_bnd = xs; i_bnd < xe; ++i_bnd) {
445 if (k_bnd - 1 >= 0) {
446 csi_arr[k_bnd][j_bnd][i_bnd] = csi_arr[k_bnd-1][j_bnd][i_bnd];
447 eta_arr[k_bnd][j_bnd][i_bnd] = eta_arr[k_bnd-1][j_bnd][i_bnd];
453 if (info.xs==0 && info.ys==0 && info.zs==0) {
454 PetscReal dot = zet_arr[0][0][0].
z;
459 ierr = DMDAVecRestoreArrayRead(user->
fda, localCoords_from_dm, &nodal_coords_arr); CHKERRQ(ierr);
460 ierr = DMDAVecRestoreArray(user->
fda, user->
Csi, &csi_arr); CHKERRQ(ierr);
461 ierr = DMDAVecRestoreArray(user->
fda, user->
Eta, &eta_arr); CHKERRQ(ierr);
462 ierr = DMDAVecRestoreArray(user->
fda, user->
Zet, &zet_arr); CHKERRQ(ierr);
466 ierr = VecAssemblyBegin(user->
Csi); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
Csi); CHKERRQ(ierr);
467 ierr = VecAssemblyBegin(user->
Eta); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
Eta); CHKERRQ(ierr);
468 ierr = VecAssemblyBegin(user->
Zet); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
Zet); CHKERRQ(ierr);
477 PetscFunctionReturn(0);
495 PetscScalar ***aj_arr;
496 Cmpnts ***nodal_coords_arr;
497 Vec localCoords_from_dm;
499 PetscFunctionBeginUser;
503 ierr = DMGetCoordinatesLocal(user->
da, &localCoords_from_dm); CHKERRQ(ierr);
504 ierr = DMDAVecGetArrayRead(user->
fda, localCoords_from_dm, &nodal_coords_arr); CHKERRQ(ierr);
505 ierr = DMDAGetLocalInfo(user->
da, &info); CHKERRQ(ierr);
506 ierr = DMDAVecGetArray(user->
da, user->
Aj, &aj_arr); CHKERRQ(ierr);
509 PetscInt xs = info.xs, xe = info.xs + info.xm;
510 PetscInt ys = info.ys, ye = info.ys + info.ym;
511 PetscInt zs = info.zs, ze = info.zs + info.zm;
514 PetscInt mx = info.mx;
515 PetscInt my = info.my;
516 PetscInt mz = info.mz;
520 PetscInt k_start_node = (zs == 0) ? zs + 1 : zs;
521 PetscInt j_start_node = (ys == 0) ? ys + 1 : ys;
522 PetscInt i_start_node = (xs == 0) ? xs + 1 : xs;
524 PetscInt k_end_node = (ze == mz) ? ze - 1 : ze;
525 PetscInt j_end_node = (ye == my) ? ye - 1 : ye;
526 PetscInt i_end_node = (xe == mx) ? xe - 1 : xe;
528 for (PetscInt k_node = k_start_node; k_node < k_end_node; ++k_node) {
529 for (PetscInt j_node = j_start_node; j_node < j_end_node; ++j_node) {
530 for (PetscInt i_node = i_start_node; i_node < i_end_node; ++i_node) {
532 PetscReal dx_dxi = 0.25 * ( (nodal_coords_arr[k_node][j_node][i_node].
x + nodal_coords_arr[k_node][j_node-1][i_node].
x + nodal_coords_arr[k_node-1][j_node][i_node].
x + nodal_coords_arr[k_node-1][j_node-1][i_node].
x) - (nodal_coords_arr[k_node][j_node][i_node-1].x + nodal_coords_arr[k_node][j_node-1][i_node-1].x + nodal_coords_arr[k_node-1][j_node][i_node-1].x + nodal_coords_arr[k_node-1][j_node-1][i_node-1].x) );
534 PetscReal dy_dxi = 0.25 * ( (nodal_coords_arr[k_node][j_node][i_node].
y + nodal_coords_arr[k_node][j_node-1][i_node].
y + nodal_coords_arr[k_node-1][j_node][i_node].
y + nodal_coords_arr[k_node-1][j_node-1][i_node].
y) - (nodal_coords_arr[k_node][j_node][i_node-1].y + nodal_coords_arr[k_node][j_node-1][i_node-1].y + nodal_coords_arr[k_node-1][j_node][i_node-1].y + nodal_coords_arr[k_node-1][j_node-1][i_node-1].y) );
536 PetscReal dz_dxi = 0.25 * ( (nodal_coords_arr[k_node][j_node][i_node].
z + nodal_coords_arr[k_node][j_node-1][i_node].
z + nodal_coords_arr[k_node-1][j_node][i_node].
z + nodal_coords_arr[k_node-1][j_node-1][i_node].
z) - (nodal_coords_arr[k_node][j_node][i_node-1].z + nodal_coords_arr[k_node][j_node-1][i_node-1].z + nodal_coords_arr[k_node-1][j_node][i_node-1].z + nodal_coords_arr[k_node-1][j_node-1][i_node-1].z) );
538 PetscReal dx_deta = 0.25 * ( (nodal_coords_arr[k_node][j_node][i_node].
x + nodal_coords_arr[k_node][j_node][i_node-1].
x + nodal_coords_arr[k_node-1][j_node][i_node].
x + nodal_coords_arr[k_node-1][j_node][i_node-1].
x) - (nodal_coords_arr[k_node][j_node-1][i_node].x + nodal_coords_arr[k_node][j_node-1][i_node-1].x + nodal_coords_arr[k_node-1][j_node-1][i_node].x + nodal_coords_arr[k_node-1][j_node-1][i_node-1].x) );
540 PetscReal dy_deta = 0.25 * ( (nodal_coords_arr[k_node][j_node][i_node].
y + nodal_coords_arr[k_node][j_node][i_node-1].
y + nodal_coords_arr[k_node-1][j_node][i_node].
y + nodal_coords_arr[k_node-1][j_node][i_node-1].
y) - (nodal_coords_arr[k_node][j_node-1][i_node].y + nodal_coords_arr[k_node][j_node-1][i_node-1].y + nodal_coords_arr[k_node-1][j_node-1][i_node].y + nodal_coords_arr[k_node-1][j_node-1][i_node-1].y) );
542 PetscReal dz_deta = 0.25 * ( (nodal_coords_arr[k_node][j_node][i_node].
z + nodal_coords_arr[k_node][j_node][i_node-1].
z + nodal_coords_arr[k_node-1][j_node][i_node].
z + nodal_coords_arr[k_node-1][j_node][i_node-1].
z) - (nodal_coords_arr[k_node][j_node-1][i_node].z + nodal_coords_arr[k_node][j_node-1][i_node-1].z + nodal_coords_arr[k_node-1][j_node-1][i_node].z + nodal_coords_arr[k_node-1][j_node-1][i_node-1].z) );
544 PetscReal dx_dzeta = 0.25 * ( (nodal_coords_arr[k_node][j_node][i_node].
x + nodal_coords_arr[k_node][j_node-1][i_node].
x + nodal_coords_arr[k_node][j_node][i_node-1].
x + nodal_coords_arr[k_node][j_node-1][i_node-1].
x) - (nodal_coords_arr[k_node-1][j_node][i_node].x + nodal_coords_arr[k_node-1][j_node-1][i_node].x + nodal_coords_arr[k_node-1][j_node][i_node-1].x + nodal_coords_arr[k_node-1][j_node-1][i_node-1].x) );
546 PetscReal dy_dzeta = 0.25 * ( (nodal_coords_arr[k_node][j_node][i_node].
y + nodal_coords_arr[k_node][j_node-1][i_node].
y + nodal_coords_arr[k_node][j_node][i_node-1].
y + nodal_coords_arr[k_node][j_node-1][i_node-1].
y) - (nodal_coords_arr[k_node-1][j_node][i_node].y + nodal_coords_arr[k_node-1][j_node-1][i_node].y + nodal_coords_arr[k_node-1][j_node][i_node-1].y + nodal_coords_arr[k_node-1][j_node-1][i_node-1].y) );
548 PetscReal dz_dzeta = 0.25 * ( (nodal_coords_arr[k_node][j_node][i_node].
z + nodal_coords_arr[k_node][j_node-1][i_node].
z + nodal_coords_arr[k_node][j_node][i_node-1].
z + nodal_coords_arr[k_node][j_node-1][i_node-1].
z) - (nodal_coords_arr[k_node-1][j_node][i_node].z + nodal_coords_arr[k_node-1][j_node-1][i_node].z + nodal_coords_arr[k_node-1][j_node][i_node-1].z + nodal_coords_arr[k_node-1][j_node-1][i_node-1].z) );
550 PetscReal jacobian_det = dx_dxi * (dy_deta * dz_dzeta - dz_deta * dy_dzeta) - dy_dxi * (dx_deta * dz_dzeta - dz_deta * dx_dzeta) + dz_dxi * (dx_deta * dy_dzeta - dy_deta * dx_dzeta);
551 if (PetscAbsReal(jacobian_det) < 1.0e-18) { SETERRQ(PETSC_COMM_SELF, PETSC_ERR_FLOP_COUNT,
"Jacobian is near zero..."); }
552 aj_arr[k_node][j_node][i_node] = 1.0 / jacobian_det;
559 PetscInt i_bnd, j_bnd, k_bnd;
563 for (k_bnd = zs; k_bnd < ze; ++k_bnd) {
564 for (j_bnd = ys; j_bnd < ye; ++j_bnd) {
565 if (i_bnd + 1 < mx) aj_arr[k_bnd][j_bnd][i_bnd] = aj_arr[k_bnd][j_bnd][i_bnd+1];
571 for (k_bnd = zs; k_bnd < ze; ++k_bnd) {
572 for (j_bnd = ys; j_bnd < ye; ++j_bnd) {
573 if (i_bnd - 1 >= 0) aj_arr[k_bnd][j_bnd][i_bnd] = aj_arr[k_bnd][j_bnd][i_bnd-1];
580 for (k_bnd = zs; k_bnd < ze; ++k_bnd) {
581 for (i_bnd = xs; i_bnd < xe; ++i_bnd) {
582 if (j_bnd + 1 < my) aj_arr[k_bnd][j_bnd][i_bnd] = aj_arr[k_bnd][j_bnd+1][i_bnd];
588 for (k_bnd = zs; k_bnd < ze; ++k_bnd) {
589 for (i_bnd = xs; i_bnd < xe; ++i_bnd) {
590 if (j_bnd - 1 >= 0) aj_arr[k_bnd][j_bnd][i_bnd] = aj_arr[k_bnd][j_bnd-1][i_bnd];
596 for (j_bnd = ys; j_bnd < ye; ++j_bnd) {
597 for (i_bnd = xs; i_bnd < xe; ++i_bnd) {
598 if (k_bnd + 1 < mz) aj_arr[k_bnd][j_bnd][i_bnd] = aj_arr[k_bnd+1][j_bnd][i_bnd];
604 for (j_bnd = ys; j_bnd < ye; ++j_bnd) {
605 for (i_bnd = xs; i_bnd < xe; ++i_bnd) {
606 if (k_bnd - 1 >= 0) aj_arr[k_bnd][j_bnd][i_bnd] = aj_arr[k_bnd-1][j_bnd][i_bnd];
612 ierr = DMDAVecRestoreArrayRead(user->
fda, localCoords_from_dm, &nodal_coords_arr); CHKERRQ(ierr);
613 ierr = DMDAVecRestoreArray(user->
da, user->
Aj, &aj_arr); CHKERRQ(ierr);
617 ierr = VecAssemblyBegin(user->
Aj); CHKERRQ(ierr);
618 ierr = VecAssemblyEnd(user->
Aj); CHKERRQ(ierr);
625 PetscFunctionReturn(0);
651 PetscReal xcp, ycp, zcp, xcm, ycm, zcm;
653 PetscFunctionBeginUser;
656 ierr = DMDAGetLocalInfo(user->
da, &info); CHKERRQ(ierr);
657 ierr = DMGetCoordinatesLocal(user->
da, &lCoords); CHKERRQ(ierr);
658 ierr = DMDAVecGetArrayRead(user->
fda, lCoords, &coor); CHKERRQ(ierr);
660 ierr = DMDAVecGetArray(user->
fda, user->
Cent, ¢); CHKERRQ(ierr);
661 ierr = DMDAVecGetArray(user->
fda, user->
GridSpace, &gs); CHKERRQ(ierr);
664 for (PetscInt k=info.zs+1; k<info.zs+info.zm; k++) {
665 for (PetscInt j=info.ys+1; j<info.ys+info.ym; j++) {
666 for (PetscInt i=info.xs+1; i<info.xs+info.xm; i++) {
668 cent[k][j][i].
x = 0.125 * (coor[k][j][i].
x + coor[k][j-1][i].
x + coor[k-1][j][i].
x + coor[k-1][j-1][i].
x + coor[k][j][i-1].
x + coor[k][j-1][i-1].
x + coor[k-1][j][i-1].
x + coor[k-1][j-1][i-1].
x);
669 cent[k][j][i].
y = 0.125 * (coor[k][j][i].
y + coor[k][j-1][i].
y + coor[k-1][j][i].
y + coor[k-1][j-1][i].
y + coor[k][j][i-1].
y + coor[k][j-1][i-1].
y + coor[k-1][j][i-1].
y + coor[k-1][j-1][i-1].
y);
670 cent[k][j][i].
z = 0.125 * (coor[k][j][i].
z + coor[k][j-1][i].
z + coor[k-1][j][i].
z + coor[k-1][j-1][i].
z + coor[k][j][i-1].
z + coor[k][j-1][i-1].
z + coor[k-1][j][i-1].
z + coor[k-1][j-1][i-1].
z);
673 xcp = 0.25 * (coor[k][j][i].
x + coor[k][j-1][i].
x + coor[k-1][j-1][i].
x + coor[k-1][j][i].
x);
674 ycp = 0.25 * (coor[k][j][i].
y + coor[k][j-1][i].
y + coor[k-1][j-1][i].
y + coor[k-1][j][i].
y);
675 zcp = 0.25 * (coor[k][j][i].
z + coor[k][j-1][i].
z + coor[k-1][j-1][i].
z + coor[k-1][j][i].
z);
676 xcm = 0.25 * (coor[k][j][i-1].
x + coor[k][j-1][i-1].
x + coor[k-1][j-1][i-1].
x + coor[k-1][j][i-1].
x);
677 ycm = 0.25 * (coor[k][j][i-1].
y + coor[k][j-1][i-1].
y + coor[k-1][j-1][i-1].
y + coor[k-1][j][i-1].
y);
678 zcm = 0.25 * (coor[k][j][i-1].
z + coor[k][j-1][i-1].
z + coor[k-1][j-1][i-1].
z + coor[k-1][j][i-1].
z);
679 gs[k][j][i].
x = PetscSqrtReal(PetscSqr(xcp-xcm) + PetscSqr(ycp-ycm) + PetscSqr(zcp-zcm));
682 xcp = 0.25 * (coor[k][j][i].
x + coor[k][j][i-1].
x + coor[k-1][j][i].
x + coor[k-1][j][i-1].
x);
683 ycp = 0.25 * (coor[k][j][i].
y + coor[k][j][i-1].
y + coor[k-1][j][i].
y + coor[k-1][j][i-1].
y);
684 zcp = 0.25 * (coor[k][j][i].
z + coor[k][j][i-1].
z + coor[k-1][j][i].
z + coor[k-1][j][i-1].
z);
685 xcm = 0.25 * (coor[k][j-1][i].
x + coor[k][j-1][i-1].
x + coor[k-1][j-1][i].
x + coor[k-1][j-1][i-1].
x);
686 ycm = 0.25 * (coor[k][j-1][i].
y + coor[k][j-1][i-1].
y + coor[k-1][j-1][i].
y + coor[k-1][j-1][i-1].
y);
687 zcm = 0.25 * (coor[k][j-1][i].
z + coor[k][j-1][i-1].
z + coor[k-1][j-1][i].
z + coor[k-1][j-1][i-1].
z);
688 gs[k][j][i].
y = PetscSqrtReal(PetscSqr(xcp-xcm) + PetscSqr(ycp-ycm) + PetscSqr(zcp-zcm));
691 xcp = 0.25 * (coor[k][j][i].
x + coor[k][j][i-1].
x + coor[k][j-1][i].
x + coor[k][j-1][i-1].
x);
692 ycp = 0.25 * (coor[k][j][i].
y + coor[k][j][i-1].
y + coor[k][j-1][i].
y + coor[k][j-1][i-1].
y);
693 zcp = 0.25 * (coor[k][j][i].
z + coor[k][j][i-1].
z + coor[k][j-1][i].
z + coor[k][j-1][i-1].
z);
694 xcm = 0.25 * (coor[k-1][j][i].
x + coor[k-1][j][i-1].
x + coor[k-1][j-1][i].
x + coor[k-1][j-1][i-1].
x);
695 ycm = 0.25 * (coor[k-1][j][i].
y + coor[k-1][j][i-1].
y + coor[k-1][j-1][i].
y + coor[k-1][j-1][i-1].
y);
696 zcm = 0.25 * (coor[k-1][j][i].
z + coor[k-1][j-1][i-1].
z + coor[k-1][j-1][i].
z + coor[k-1][j-1][i-1].
z);
697 gs[k][j][i].
z = PetscSqrtReal(PetscSqr(xcp-xcm) + PetscSqr(ycp-ycm) + PetscSqr(zcp-zcm));
702 ierr = DMDAVecRestoreArrayRead(user->
fda, lCoords, &coor); CHKERRQ(ierr);
703 ierr = DMDAVecRestoreArray(user->
fda, user->
Cent, ¢); CHKERRQ(ierr);
704 ierr = DMDAVecRestoreArray(user->
fda, user->
GridSpace, &gs); CHKERRQ(ierr);
707 ierr = VecAssemblyBegin(user->
Cent); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
Cent); CHKERRQ(ierr);
708 ierr = VecAssemblyBegin(user->
GridSpace); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
GridSpace); CHKERRQ(ierr);
712 PetscFunctionReturn(0);
746 const Cmpnts ***centx_const;
747 Cmpnts ***icsi, ***ieta, ***izet;
749 PetscReal dxdc, dydc, dzdc, dxde, dyde, dzde, dxdz, dydz, dzdz;
751 PetscFunctionBeginUser;
754 ierr = DMDAGetLocalInfo(user->
da, &info); CHKERRQ(ierr);
755 PetscInt xs = info.xs, xe = info.xs + info.xm, mx = info.mx;
756 PetscInt ys = info.ys, ye = info.ys + info.ym, my = info.my;
757 PetscInt zs = info.zs, ze = info.zs + info.zm, mz = info.mz;
758 PetscInt gxs = info.gxs, gxe = info.gxs + info.gxm;
759 PetscInt gys = info.gys, gye = info.gys + info.gym;
760 PetscInt gzs = info.gzs, gze = info.gzs + info.gzm;
762 PetscInt lxs = xs; PetscInt lxe = xe;
763 PetscInt lys = ys; PetscInt lye = ye;
764 PetscInt lzs = zs; PetscInt lze = ze;
766 if (xs==0) lxs = xs+1;
767 if (ys==0) lys = ys+1;
768 if (zs==0) lzs = zs+1;
770 if (xe==mx) lxe=xe-1;
771 if (ye==my) lye=ye-1;
772 if (ze==mz) lze=ze-1;
775 ierr = DMGetCoordinatesLocal(user->
da, &lCoords); CHKERRQ(ierr);
776 ierr = DMDAVecGetArrayRead(user->
fda, lCoords, &coor); CHKERRQ(ierr);
777 ierr = DMDAVecGetArray(user->
fda, user->
Centx, ¢x); CHKERRQ(ierr);
781 for (PetscInt k = gzs + 1; k < gze; k++) {
782 for (PetscInt j = gys + 1; j < gye; j++) {
783 for (PetscInt i = gxs; i < gxe; i++) {
784 centx[k][j][i].
x = 0.25 * (coor[k][j][i].
x + coor[k-1][j][i].
x + coor[k][j-1][i].
x + coor[k-1][j-1][i].
x);
785 centx[k][j][i].
y = 0.25 * (coor[k][j][i].
y + coor[k-1][j][i].
y + coor[k][j-1][i].
y + coor[k-1][j-1][i].
y);
786 centx[k][j][i].
z = 0.25 * (coor[k][j][i].
z + coor[k-1][j][i].
z + coor[k][j-1][i].
z + coor[k-1][j-1][i].
z);
814 ierr = DMDAVecRestoreArrayRead(user->
fda, lCoords, &coor); CHKERRQ(ierr);
815 ierr = DMDAVecRestoreArray(user->
fda, user->
Centx, ¢x); CHKERRQ(ierr);
821 ierr = DMDAVecGetArrayRead(user->
fda, user->
Centx, ¢x_const); CHKERRQ(ierr);
822 ierr = DMDAVecGetArray(user->
fda, user->
ICsi, &icsi); CHKERRQ(ierr);
823 ierr = DMDAVecGetArray(user->
fda, user->
IEta, &ieta); CHKERRQ(ierr);
824 ierr = DMDAVecGetArray(user->
fda, user->
IZet, &izet); CHKERRQ(ierr);
825 ierr = DMDAVecGetArray(user->
da, user->
IAj, &iaj); CHKERRQ(ierr);
828 for (PetscInt k=lzs; k<lze; k++) {
829 for (PetscInt j=lys; j<lye; j++) {
830 for (PetscInt i=xs; i<lxe; i++) {
834 dxdc = centx_const[k][j][i+1].
x - centx_const[k][j][i].
x;
835 dydc = centx_const[k][j][i+1].
y - centx_const[k][j][i].
y;
836 dzdc = centx_const[k][j][i+1].
z - centx_const[k][j][i].
z;
837 }
else if (i == mx - 2) {
838 dxdc = centx_const[k][j][i].
x - centx_const[k][j][i-1].
x;
839 dydc = centx_const[k][j][i].
y - centx_const[k][j][i-1].
y;
840 dzdc = centx_const[k][j][i].
z - centx_const[k][j][i-1].
z;
842 dxdc = 0.5 * (centx_const[k][j][i+1].
x - centx_const[k][j][i-1].
x);
843 dydc = 0.5 * (centx_const[k][j][i+1].
y - centx_const[k][j][i-1].
y);
844 dzdc = 0.5 * (centx_const[k][j][i+1].
z - centx_const[k][j][i-1].
z);
849 dxde = centx_const[k][j+1][i].
x - centx_const[k][j][i].
x;
850 dyde = centx_const[k][j+1][i].
y - centx_const[k][j][i].
y;
851 dzde = centx_const[k][j+1][i].
z - centx_const[k][j][i].
z;
852 }
else if (j == my - 2) {
853 dxde = centx_const[k][j][i].
x - centx_const[k][j-1][i].
x;
854 dyde = centx_const[k][j][i].
y - centx_const[k][j-1][i].
y;
855 dzde = centx_const[k][j][i].
z - centx_const[k][j-1][i].
z;
857 dxde = 0.5 * (centx_const[k][j+1][i].
x - centx_const[k][j-1][i].
x);
858 dyde = 0.5 * (centx_const[k][j+1][i].
y - centx_const[k][j-1][i].
y);
859 dzde = 0.5 * (centx_const[k][j+1][i].
z - centx_const[k][j-1][i].
z);
864 dxdz = centx_const[k+1][j][i].
x - centx_const[k][j][i].
x;
865 dydz = centx_const[k+1][j][i].
y - centx_const[k][j][i].
y;
866 dzdz = centx_const[k+1][j][i].
z - centx_const[k][j][i].
z;
867 }
else if (k == mz - 2) {
868 dxdz = centx_const[k][j][i].
x - centx_const[k-1][j][i].
x;
869 dydz = centx_const[k][j][i].
y - centx_const[k-1][j][i].
y;
870 dzdz = centx_const[k][j][i].
z - centx_const[k-1][j][i].
z;
872 dxdz = 0.5 * (centx_const[k+1][j][i].
x - centx_const[k-1][j][i].
x);
873 dydz = 0.5 * (centx_const[k+1][j][i].
y - centx_const[k-1][j][i].
y);
874 dzdz = 0.5 * (centx_const[k+1][j][i].
z - centx_const[k-1][j][i].
z);
878 icsi[k][j][i].
x = dyde * dzdz - dzde * dydz;
879 icsi[k][j][i].
y = -dxde * dzdz + dzde * dxdz;
880 icsi[k][j][i].
z = dxde * dydz - dyde * dxdz;
882 ieta[k][j][i].
x = dydz * dzdc - dzdz * dydc;
883 ieta[k][j][i].
y = -dxdz * dzdc + dzdz * dxdc;
884 ieta[k][j][i].
z = dxdz * dydc - dydz * dxdc;
886 izet[k][j][i].
x = dydc * dzde - dzdc * dyde;
887 izet[k][j][i].
y = -dxdc * dzde + dzdc * dxde;
888 izet[k][j][i].
z = dxdc * dyde - dydc * dxde;
890 iaj[k][j][i] = dxdc * icsi[k][j][i].
x + dydc * icsi[k][j][i].
y + dzdc * icsi[k][j][i].
z;
891 if (PetscAbsScalar(iaj[k][j][i]) > 1e-12) {
892 iaj[k][j][i] = 1.0 / iaj[k][j][i];
898 ierr = DMDAVecRestoreArrayRead(user->
fda, user->
Centx, ¢x_const); CHKERRQ(ierr);
899 ierr = DMDAVecRestoreArray(user->
fda, user->
ICsi, &icsi); CHKERRQ(ierr);
900 ierr = DMDAVecRestoreArray(user->
fda, user->
IEta, &ieta); CHKERRQ(ierr);
901 ierr = DMDAVecRestoreArray(user->
fda, user->
IZet, &izet); CHKERRQ(ierr);
902 ierr = DMDAVecRestoreArray(user->
da, user->
IAj, &iaj); CHKERRQ(ierr);
905 ierr = VecAssemblyBegin(user->
ICsi); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
ICsi); CHKERRQ(ierr);
906 ierr = VecAssemblyBegin(user->
IEta); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
IEta); CHKERRQ(ierr);
907 ierr = VecAssemblyBegin(user->
IZet); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
IZet); CHKERRQ(ierr);
908 ierr = VecAssemblyBegin(user->
IAj); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
IAj); CHKERRQ(ierr);
915 PetscFunctionReturn(0);
949 const Cmpnts ***centy_const;
950 Cmpnts ***jcsi, ***jeta, ***jzet;
952 PetscReal dxdc, dydc, dzdc, dxde, dyde, dzde, dxdz, dydz, dzdz;
954 PetscFunctionBeginUser;
957 ierr = DMDAGetLocalInfo(user->
da, &info); CHKERRQ(ierr);
958 PetscInt xs = info.xs, xe = info.xs + info.xm, mx = info.mx;
959 PetscInt ys = info.ys, ye = info.ys + info.ym, my = info.my;
960 PetscInt zs = info.zs, ze = info.zs + info.zm, mz = info.mz;
961 PetscInt gxs = info.gxs, gxe = info.gxs + info.gxm;
962 PetscInt gys = info.gys, gye = info.gys + info.gym;
963 PetscInt gzs = info.gzs, gze = info.gzs + info.gzm;
965 PetscInt lxs = xs; PetscInt lxe = xe;
966 PetscInt lys = ys; PetscInt lye = ye;
967 PetscInt lzs = zs; PetscInt lze = ze;
969 if (xs==0) lxs = xs+1;
970 if (ys==0) lys = ys+1;
971 if (zs==0) lzs = zs+1;
973 if (xe==mx) lxe=xe-1;
974 if (ye==my) lye=ye-1;
975 if (ze==mz) lze=ze-1;
978 ierr = DMGetCoordinatesLocal(user->
da, &lCoords); CHKERRQ(ierr);
979 ierr = DMDAVecGetArrayRead(user->
fda, lCoords, &coor); CHKERRQ(ierr);
980 ierr = DMDAVecGetArray(user->
fda, user->
Centy, ¢y); CHKERRQ(ierr);
984 for (PetscInt k = gzs + 1; k < gze; k++) {
985 for (PetscInt j = gys; j < gye; j++) {
986 for (PetscInt i = gxs + 1; i < gxe; i++) {
987 centy[k][j][i].
x = 0.25 * (coor[k][j][i].
x + coor[k-1][j][i].
x + coor[k][j][i-1].
x + coor[k-1][j][i-1].
x);
988 centy[k][j][i].
y = 0.25 * (coor[k][j][i].
y + coor[k-1][j][i].
y + coor[k][j][i-1].
y + coor[k-1][j][i-1].
y);
989 centy[k][j][i].
z = 0.25 * (coor[k][j][i].
z + coor[k-1][j][i].
z + coor[k][j][i-1].
z + coor[k-1][j][i-1].
z);
1017 ierr = DMDAVecRestoreArrayRead(user->
fda, lCoords, &coor); CHKERRQ(ierr);
1018 ierr = DMDAVecRestoreArray(user->
fda, user->
Centy, ¢y); CHKERRQ(ierr);
1024 ierr = DMDAVecGetArrayRead(user->
fda, user->
Centy, ¢y_const); CHKERRQ(ierr);
1025 ierr = DMDAVecGetArray(user->
fda, user->
JCsi, &jcsi); CHKERRQ(ierr);
1026 ierr = DMDAVecGetArray(user->
fda, user->
JEta, &jeta); CHKERRQ(ierr);
1027 ierr = DMDAVecGetArray(user->
fda, user->
JZet, &jzet); CHKERRQ(ierr);
1028 ierr = DMDAVecGetArray(user->
da, user->
JAj, &jaj); CHKERRQ(ierr);
1031 for (PetscInt k=lzs; k<lze; k++) {
1032 for (PetscInt j=ys; j<lye; j++) {
1033 for (PetscInt i=lxs; i<lxe; i++) {
1037 dxdc = centy_const[k][j][i+1].
x - centy_const[k][j][i].
x;
1038 dydc = centy_const[k][j][i+1].
y - centy_const[k][j][i].
y;
1039 dzdc = centy_const[k][j][i+1].
z - centy_const[k][j][i].
z;
1040 }
else if (i == mx - 2) {
1041 dxdc = centy_const[k][j][i].
x - centy_const[k][j][i-1].
x;
1042 dydc = centy_const[k][j][i].
y - centy_const[k][j][i-1].
y;
1043 dzdc = centy_const[k][j][i].
z - centy_const[k][j][i-1].
z;
1045 dxdc = 0.5 * (centy_const[k][j][i+1].
x - centy_const[k][j][i-1].
x);
1046 dydc = 0.5 * (centy_const[k][j][i+1].
y - centy_const[k][j][i-1].
y);
1047 dzdc = 0.5 * (centy_const[k][j][i+1].
z - centy_const[k][j][i-1].
z);
1052 dxde = centy_const[k][j+1][i].
x - centy_const[k][j][i].
x;
1053 dyde = centy_const[k][j+1][i].
y - centy_const[k][j][i].
y;
1054 dzde = centy_const[k][j+1][i].
z - centy_const[k][j][i].
z;
1055 }
else if (j == my - 2) {
1056 dxde = centy_const[k][j][i].
x - centy_const[k][j-1][i].
x;
1057 dyde = centy_const[k][j][i].
y - centy_const[k][j-1][i].
y;
1058 dzde = centy_const[k][j][i].
z - centy_const[k][j-1][i].
z;
1060 dxde = 0.5 * (centy_const[k][j+1][i].
x - centy_const[k][j-1][i].
x);
1061 dyde = 0.5 * (centy_const[k][j+1][i].
y - centy_const[k][j-1][i].
y);
1062 dzde = 0.5 * (centy_const[k][j+1][i].
z - centy_const[k][j-1][i].
z);
1067 dxdz = centy_const[k+1][j][i].
x - centy_const[k][j][i].
x;
1068 dydz = centy_const[k+1][j][i].
y - centy_const[k][j][i].
y;
1069 dzdz = centy_const[k+1][j][i].
z - centy_const[k][j][i].
z;
1070 }
else if (k == mz - 2) {
1071 dxdz = centy_const[k][j][i].
x - centy_const[k-1][j][i].
x;
1072 dydz = centy_const[k][j][i].
y - centy_const[k-1][j][i].
y;
1073 dzdz = centy_const[k][j][i].
z - centy_const[k-1][j][i].
z;
1075 dxdz = 0.5 * (centy_const[k+1][j][i].
x - centy_const[k-1][j][i].
x);
1076 dydz = 0.5 * (centy_const[k+1][j][i].
y - centy_const[k-1][j][i].
y);
1077 dzdz = 0.5 * (centy_const[k+1][j][i].
z - centy_const[k-1][j][i].
z);
1081 jcsi[k][j][i].
x = dyde * dzdz - dzde * dydz;
1082 jcsi[k][j][i].
y = -dxde * dzdz + dzde * dxdz;
1083 jcsi[k][j][i].
z = dxde * dydz - dyde * dxdz;
1085 jeta[k][j][i].
x = dydz * dzdc - dzdz * dydc;
1086 jeta[k][j][i].
y = -dxdz * dzdc + dzdz * dxdc;
1087 jeta[k][j][i].
z = dxdz * dydc - dydz * dxdc;
1089 jzet[k][j][i].
x = dydc * dzde - dzdc * dyde;
1090 jzet[k][j][i].
y = -dxdc * dzde + dzdc * dxde;
1091 jzet[k][j][i].
z = dxdc * dyde - dydc * dxde;
1093 jaj[k][j][i] = dxdc * jcsi[k][j][i].
x + dydc * jcsi[k][j][i].
y + dzdc * jcsi[k][j][i].
z;
1094 if (PetscAbsScalar(jaj[k][j][i]) > 1e-12) {
1095 jaj[k][j][i] = 1.0 / jaj[k][j][i];
1101 ierr = DMDAVecRestoreArrayRead(user->
fda, user->
Centy, ¢y_const); CHKERRQ(ierr);
1102 ierr = DMDAVecRestoreArray(user->
fda, user->
JCsi, &jcsi); CHKERRQ(ierr);
1103 ierr = DMDAVecRestoreArray(user->
fda, user->
JEta, &jeta); CHKERRQ(ierr);
1104 ierr = DMDAVecRestoreArray(user->
fda, user->
JZet, &jzet); CHKERRQ(ierr);
1105 ierr = DMDAVecRestoreArray(user->
da, user->
JAj, &jaj); CHKERRQ(ierr);
1108 ierr = VecAssemblyBegin(user->
JCsi); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
JCsi); CHKERRQ(ierr);
1109 ierr = VecAssemblyBegin(user->
JEta); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
JEta); CHKERRQ(ierr);
1110 ierr = VecAssemblyBegin(user->
JZet); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
JZet); CHKERRQ(ierr);
1111 ierr = VecAssemblyBegin(user->
JAj); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
JAj); CHKERRQ(ierr);
1118 PetscFunctionReturn(0);
1147 PetscErrorCode ierr;
1152 const Cmpnts ***centz_const;
1153 Cmpnts ***kcsi, ***keta, ***kzet;
1155 PetscReal dxdc, dydc, dzdc, dxde, dyde, dzde, dxdz, dydz, dzdz;
1157 PetscFunctionBeginUser;
1160 ierr = DMDAGetLocalInfo(user->
da, &info); CHKERRQ(ierr);
1161 PetscInt xs = info.xs, xe = info.xs + info.xm, mx = info.mx;
1162 PetscInt ys = info.ys, ye = info.ys + info.ym, my = info.my;
1163 PetscInt zs = info.zs, ze = info.zs + info.zm, mz = info.mz;
1164 PetscInt gxs = info.gxs, gxe = info.gxs + info.gxm;
1165 PetscInt gys = info.gys, gye = info.gys + info.gym;
1166 PetscInt gzs = info.gzs, gze = info.gzs + info.gzm;
1168 PetscInt lxs = xs; PetscInt lxe = xe;
1169 PetscInt lys = ys; PetscInt lye = ye;
1170 PetscInt lzs = zs; PetscInt lze = ze;
1172 if (xs==0) lxs = xs+1;
1173 if (ys==0) lys = ys+1;
1174 if (zs==0) lzs = zs+1;
1176 if (xe==mx) lxe=xe-1;
1177 if (ye==my) lye=ye-1;
1178 if (ze==mz) lze=ze-1;
1181 ierr = DMGetCoordinatesLocal(user->
da, &lCoords); CHKERRQ(ierr);
1182 ierr = DMDAVecGetArrayRead(user->
fda, lCoords, &coor); CHKERRQ(ierr);
1183 ierr = DMDAVecGetArray(user->
fda, user->
Centz, ¢z); CHKERRQ(ierr);
1187 for (PetscInt k = gzs; k < gze; k++) {
1188 for (PetscInt j = gys; j < gye; j++) {
1189 for (PetscInt i = gxs + 1; i < gxe; i++) {
1190 centz[k][j][i].
x = 0.25 * (coor[k][j][i].
x + coor[k][j-1][i].
x + coor[k][j][i-1].
x + coor[k][j-1][i-1].
x);
1191 centz[k][j][i].
y = 0.25 * (coor[k][j][i].
y + coor[k][j-1][i].
y + coor[k][j][i-1].
y + coor[k][j-1][i-1].
y);
1192 centz[k][j][i].
z = 0.25 * (coor[k][j][i].
z + coor[k][j-1][i].
z + coor[k][j][i-1].
z + coor[k][j-1][i-1].
z);
1220 ierr = DMDAVecRestoreArrayRead(user->
fda, lCoords, &coor); CHKERRQ(ierr);
1221 ierr = DMDAVecRestoreArray(user->
fda, user->
Centz, ¢z); CHKERRQ(ierr);
1227 ierr = DMDAVecGetArrayRead(user->
fda, user->
Centz, ¢z_const); CHKERRQ(ierr);
1228 ierr = DMDAVecGetArray(user->
fda, user->
KCsi, &kcsi); CHKERRQ(ierr);
1229 ierr = DMDAVecGetArray(user->
fda, user->
KEta, &keta); CHKERRQ(ierr);
1230 ierr = DMDAVecGetArray(user->
fda, user->
KZet, &kzet); CHKERRQ(ierr);
1231 ierr = DMDAVecGetArray(user->
da, user->
KAj, &kaj); CHKERRQ(ierr);
1234 for (PetscInt k=zs; k<lze; k++) {
1235 for (PetscInt j=lys; j<lye; j++) {
1236 for (PetscInt i=lxs; i<lxe; i++) {
1240 dxdc = centz_const[k][j][i+1].
x - centz_const[k][j][i].
x;
1241 dydc = centz_const[k][j][i+1].
y - centz_const[k][j][i].
y;
1242 dzdc = centz_const[k][j][i+1].
z - centz_const[k][j][i].
z;
1243 }
else if (i == mx - 2) {
1244 dxdc = centz_const[k][j][i].
x - centz_const[k][j][i-1].
x;
1245 dydc = centz_const[k][j][i].
y - centz_const[k][j][i-1].
y;
1246 dzdc = centz_const[k][j][i].
z - centz_const[k][j][i-1].
z;
1248 dxdc = 0.5 * (centz_const[k][j][i+1].
x - centz_const[k][j][i-1].
x);
1249 dydc = 0.5 * (centz_const[k][j][i+1].
y - centz_const[k][j][i-1].
y);
1250 dzdc = 0.5 * (centz_const[k][j][i+1].
z - centz_const[k][j][i-1].
z);
1255 dxde = centz_const[k][j+1][i].
x - centz_const[k][j][i].
x;
1256 dyde = centz_const[k][j+1][i].
y - centz_const[k][j][i].
y;
1257 dzde = centz_const[k][j+1][i].
z - centz_const[k][j][i].
z;
1258 }
else if (j == my - 2) {
1259 dxde = centz_const[k][j][i].
x - centz_const[k][j-1][i].
x;
1260 dyde = centz_const[k][j][i].
y - centz_const[k][j-1][i].
y;
1261 dzde = centz_const[k][j][i].
z - centz_const[k][j-1][i].
z;
1263 dxde = 0.5 * (centz_const[k][j+1][i].
x - centz_const[k][j-1][i].
x);
1264 dyde = 0.5 * (centz_const[k][j+1][i].
y - centz_const[k][j-1][i].
y);
1265 dzde = 0.5 * (centz_const[k][j+1][i].
z - centz_const[k][j-1][i].
z);
1270 dxdz = centz_const[k+1][j][i].
x - centz_const[k][j][i].
x;
1271 dydz = centz_const[k+1][j][i].
y - centz_const[k][j][i].
y;
1272 dzdz = centz_const[k+1][j][i].
z - centz_const[k][j][i].
z;
1273 }
else if (k == mz - 2) {
1274 dxdz = centz_const[k][j][i].
x - centz_const[k-1][j][i].
x;
1275 dydz = centz_const[k][j][i].
y - centz_const[k-1][j][i].
y;
1276 dzdz = centz_const[k][j][i].
z - centz_const[k-1][j][i].
z;
1278 dxdz = 0.5 * (centz_const[k+1][j][i].
x - centz_const[k-1][j][i].
x);
1279 dydz = 0.5 * (centz_const[k+1][j][i].
y - centz_const[k-1][j][i].
y);
1280 dzdz = 0.5 * (centz_const[k+1][j][i].
z - centz_const[k-1][j][i].
z);
1284 kcsi[k][j][i].
x = dyde * dzdz - dzde * dydz;
1285 kcsi[k][j][i].
y = -dxde * dzdz + dzde * dxdz;
1286 kcsi[k][j][i].
z = dxde * dydz - dyde * dxdz;
1288 keta[k][j][i].
x = dydz * dzdc - dzdz * dydc;
1289 keta[k][j][i].
y = -dxdz * dzdc + dzdz * dxdc;
1290 keta[k][j][i].
z = dxdz * dydc - dydz * dxdc;
1292 kzet[k][j][i].
x = dydc * dzde - dzdc * dyde;
1293 kzet[k][j][i].
y = -dxdc * dzde + dzdc * dxde;
1294 kzet[k][j][i].
z = dxdc * dyde - dydc * dxde;
1296 kaj[k][j][i] = dxdc * kcsi[k][j][i].
x + dydc * kcsi[k][j][i].
y + dzdc * kcsi[k][j][i].
z;
1297 if (PetscAbsScalar(kaj[k][j][i]) > 1e-12) {
1298 kaj[k][j][i] = 1.0 / kaj[k][j][i];
1304 ierr = DMDAVecRestoreArrayRead(user->
fda, user->
Centz, ¢z_const); CHKERRQ(ierr);
1305 ierr = DMDAVecRestoreArray(user->
fda, user->
KCsi, &kcsi); CHKERRQ(ierr);
1306 ierr = DMDAVecRestoreArray(user->
fda, user->
KEta, &keta); CHKERRQ(ierr);
1307 ierr = DMDAVecRestoreArray(user->
fda, user->
KZet, &kzet); CHKERRQ(ierr);
1308 ierr = DMDAVecRestoreArray(user->
da, user->
KAj, &kaj); CHKERRQ(ierr);
1311 ierr = VecAssemblyBegin(user->
KCsi); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
KCsi); CHKERRQ(ierr);
1312 ierr = VecAssemblyBegin(user->
KEta); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
KEta); CHKERRQ(ierr);
1313 ierr = VecAssemblyBegin(user->
KZet); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
KZet); CHKERRQ(ierr);
1314 ierr = VecAssemblyBegin(user->
KAj); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
KAj); CHKERRQ(ierr);
1321 PetscFunctionReturn(0);
1339 PetscErrorCode ierr;
1342 PetscReal ***div_arr;
1343 const Cmpnts ***csi_arr, ***eta_arr, ***zet_arr;
1344 const PetscScalar ***aj_arr;
1348 PetscFunctionBeginUser;
1351 ierr = DMDAGetLocalInfo(user->
da, &info); CHKERRQ(ierr);
1353 ierr = DMDAVecGetArrayRead(user->
fda, user->
lCsi, &csi_arr); CHKERRQ(ierr);
1354 ierr = DMDAVecGetArrayRead(user->
fda, user->
lEta, &eta_arr); CHKERRQ(ierr);
1355 ierr = DMDAVecGetArrayRead(user->
fda, user->
lZet, &zet_arr); CHKERRQ(ierr);
1356 ierr = DMDAVecGetArrayRead(user->
da, user->
lAj, &aj_arr); CHKERRQ(ierr);
1358 ierr = VecDuplicate(user->
P, &Div); CHKERRQ(ierr);
1359 ierr = VecSet(Div, 0.0); CHKERRQ(ierr);
1360 ierr = DMDAVecGetArray(user->
da, Div, &div_arr); CHKERRQ(ierr);
1363 for (PetscInt k=info.xs+1; k<info.xs+info.xm; k++) {
1364 for (PetscInt j=info.ys+1; j<info.ys+info.ym; j++) {
1365 for (PetscInt i=info.xs+1; i<info.xs+info.xm; i++) {
1366 PetscReal div_x = (csi_arr[k][j][i].
x - csi_arr[k][j][i-1].
x) + (eta_arr[k][j][i].x - eta_arr[k][j-1][i].x) + (zet_arr[k][j][i].
x - zet_arr[k-1][j][i].
x);
1367 PetscReal div_y = (csi_arr[k][j][i].
y - csi_arr[k][j][i-1].
y) + (eta_arr[k][j][i].y - eta_arr[k][j-1][i].y) + (zet_arr[k][j][i].
y - zet_arr[k-1][j][i].
y);
1368 PetscReal div_z = (csi_arr[k][j][i].
z - csi_arr[k][j][i-1].
z) + (eta_arr[k][j][i].z - eta_arr[k][j-1][i].z) + (zet_arr[k][j][i].
z - zet_arr[k-1][j][i].
z);
1369 div_arr[k][j][i] = PetscAbsScalar((div_x + div_y + div_z) * aj_arr[k][j][i]);
1374 ierr = DMDAVecRestoreArray(user->
da, Div, &div_arr); CHKERRQ(ierr);
1375 ierr = DMDAVecRestoreArrayRead(user->
fda, user->
lCsi, &csi_arr); CHKERRQ(ierr);
1376 ierr = DMDAVecRestoreArrayRead(user->
fda, user->
lEta, &eta_arr); CHKERRQ(ierr);
1377 ierr = DMDAVecRestoreArrayRead(user->
fda, user->
lZet, &zet_arr); CHKERRQ(ierr);
1378 ierr = DMDAVecRestoreArrayRead(user->
da, user->
lAj, &aj_arr); CHKERRQ(ierr);
1380 ierr = VecMax(Div, &max_idx, &maxdiv); CHKERRQ(ierr);
1383 ierr = VecDestroy(&Div); CHKERRQ(ierr);
1384 PetscFunctionReturn(0);
1418 DM da = user->
da, fda = user->
fda;
1419 DMDALocalInfo info = user->
info;
1420 PetscInt xs = info.xs, xe = info.xs + info.xm;
1421 PetscInt ys = info.ys, ye = info.ys + info.ym;
1422 PetscInt zs = info.zs, ze = info.zs + info.zm;
1423 PetscInt mx = info.mx, my = info.my, mz = info.mz;
1424 PetscInt lxs, lys, lzs, lxe, lye, lze;
1427 PetscReal ***div, ***aj;
1428 Cmpnts ***csi, ***eta, ***zet;
1431 PetscFunctionBeginUser;
1437 if (xs == 0) lxs = xs + 1;
1438 if (ys == 0) lys = ys + 1;
1439 if (zs == 0) lzs = zs + 1;
1441 if (xe == mx) lxe = xe - 1;
1442 if (ye == my) lye = ye - 1;
1443 if (ze == mz) lze = ze - 1;
1445 DMDAVecGetArray(fda, user->
lCsi, &csi);
1446 DMDAVecGetArray(fda, user->
lEta, &eta);
1447 DMDAVecGetArray(fda, user->
lZet, &zet);
1448 DMDAVecGetArray(da, user->
lAj, &aj);
1450 VecDuplicate(user->
P, &Div);
1452 DMDAVecGetArray(da, Div, &div);
1454 for (k = lzs; k < lze; k++) {
1455 for (j = lys; j < lye; j++) {
1456 for (i = lxs; i < lxe; i++) {
1457 PetscReal divergence = (csi[k][j][i].
x - csi[k][j][i-1].
x +
1458 eta[k][j][i].
x - eta[k][j-1][i].
x +
1459 zet[k][j][i].
x - zet[k-1][j][i].
x +
1460 csi[k][j][i].
y - csi[k][j][i-1].
y +
1461 eta[k][j][i].
y - eta[k][j-1][i].
y +
1462 zet[k][j][i].
y - zet[k-1][j][i].
y +
1463 csi[k][j][i].
z - csi[k][j][i-1].
z +
1464 eta[k][j][i].
z - eta[k][j-1][i].
z +
1465 zet[k][j][i].
z - zet[k-1][j][i].
z) * aj[k][j][i];
1466 div[k][j][i] = fabs(divergence);
1471 DMDAVecRestoreArray(da, Div, &div);
1473 PetscReal MaxFlatIndex;
1474 VecMax(Div, &MaxFlatIndex, &maxdiv);
1477 for (k=zs; k<ze; k++) {
1478 for (j=ys; j<ye; j++) {
1479 for (i=xs; i<xe; i++) {
1480 if (
Gidx(i,j,k,user) == MaxFlatIndex) {
1488 DMDAVecRestoreArray(fda, user->
lCsi, &csi);
1489 DMDAVecRestoreArray(fda, user->
lEta, &eta);
1490 DMDAVecRestoreArray(fda, user->
lZet, &zet);
1491 DMDAVecRestoreArray(da, user->
lAj, &aj);
1494 PetscFunctionReturn(0);
1509 DMDALocalInfo info = user->
info;
1510 PetscInt xs = info.xs, xe = info.xs + info.xm;
1511 PetscInt ys = info.ys, ye = info.ys + info.ym;
1512 PetscInt zs = info.zs, ze = info.zs + info.zm;
1515 PetscFunctionBeginUser;
1517 PetscReal CsiMax, EtaMax, ZetMax;
1518 PetscReal ICsiMax, IEtaMax, IZetMax;
1519 PetscReal JCsiMax, JEtaMax, JZetMax;
1520 PetscReal KCsiMax, KEtaMax, KZetMax;
1521 PetscReal AjMax, IAjMax, JAjMax, KAjMax;
1523 PetscInt CsiMaxArg, EtaMaxArg, ZetMaxArg;
1524 PetscInt ICsiMaxArg, IEtaMaxArg, IZetMaxArg;
1525 PetscInt JCsiMaxArg, JEtaMaxArg, JZetMaxArg;
1526 PetscInt KCsiMaxArg, KEtaMaxArg, KZetMaxArg;
1527 PetscInt AjMaxArg, IAjMaxArg, JAjMaxArg, KAjMaxArg;
1530 VecMax(user->
lCsi,&CsiMaxArg,&CsiMax);
1531 VecMax(user->
lEta,&EtaMaxArg,&EtaMax);
1532 VecMax(user->
lZet,&ZetMaxArg,&ZetMax);
1534 VecMax(user->
lICsi,&ICsiMaxArg,&ICsiMax);
1535 VecMax(user->
lIEta,&IEtaMaxArg,&IEtaMax);
1536 VecMax(user->
lIZet,&IZetMaxArg,&IZetMax);
1538 VecMax(user->
lJCsi,&JCsiMaxArg,&JCsiMax);
1539 VecMax(user->
lJEta,&JEtaMaxArg,&JEtaMax);
1540 VecMax(user->
lJZet,&JZetMaxArg,&JZetMax);
1542 VecMax(user->
lKCsi,&KCsiMaxArg,&KCsiMax);
1543 VecMax(user->
lKEta,&KEtaMaxArg,&KEtaMax);
1544 VecMax(user->
lKZet,&KZetMaxArg,&KZetMax);
1546 VecMax(user->
lAj,&AjMaxArg,&AjMax);
1547 VecMax(user->
lIAj,&IAjMaxArg,&IAjMax);
1548 VecMax(user->
lJAj,&JAjMaxArg,&JAjMax);
1549 VecMax(user->
lKAj,&KAjMaxArg,&KAjMax);
1551 VecMax(user->
lAj,&AjMaxArg,&AjMax);
1552 VecMax(user->
lIAj,&IAjMaxArg,&IAjMax);
1553 VecMax(user->
lJAj,&JAjMaxArg,&JAjMax);
1554 VecMax(user->
lKAj,&KAjMaxArg,&KAjMax);
1558 LOG_ALLOW(
GLOBAL,
LOG_INFO,
"The Max Metric Values are: CsiMax = %le, EtaMax = %le, ZetMax = %le.\n",CsiMax,EtaMax,ZetMax);
1559 LOG_ALLOW(
GLOBAL,
LOG_INFO,
"The Max Metric Values are: ICsiMax = %le, IEtaMax = %le, IZetMax = %le.\n",ICsiMax,IEtaMax,IZetMax);
1560 LOG_ALLOW(
GLOBAL,
LOG_INFO,
"The Max Metric Values are: JCsiMax = %le, JEtaMax = %le, JZetMax = %le.\n",JCsiMax,JEtaMax,JZetMax);
1561 LOG_ALLOW(
GLOBAL,
LOG_INFO,
"The Max Metric Values are: KCsiMax = %le, KEtaMax = %le, KZetMax = %le.\n",KCsiMax,KEtaMax,KZetMax);
1562 LOG_ALLOW(
GLOBAL,
LOG_INFO,
"The Max Volumes(Inverse) are: Aj = %le, IAj = %le, JAj = %le, KAj = %le.\n",AjMax,IAjMax,JAjMax,KAjMax);
1564 for (k=zs; k<ze; k++) {
1565 for (j=ys; j<ye; j++) {
1566 for (i=xs; i<xe; i++) {
1567 if (
Gidx(i,j,k,user) == CsiMaxArg) {
1570 if (
Gidx(i,j,k,user) == EtaMaxArg) {
1573 if (
Gidx(i,j,k,user) == ZetMaxArg) {
1576 if (
Gidx(i,j,k,user) == ICsiMaxArg) {
1579 if (
Gidx(i,j,k,user) == IEtaMaxArg) {
1582 if (
Gidx(i,j,k,user) == IZetMaxArg) {
1585 if (
Gidx(i,j,k,user) == JCsiMaxArg) {
1588 if (
Gidx(i,j,k,user) == JEtaMaxArg) {
1591 if (
Gidx(i,j,k,user) == JZetMaxArg) {
1594 if (
Gidx(i,j,k,user) == KCsiMaxArg) {
1597 if (
Gidx(i,j,k,user) == KEtaMaxArg) {
1600 if (
Gidx(i,j,k,user) == KZetMaxArg) {
1603 if (
Gidx(i,j,k,user) == AjMaxArg) {
1606 if (
Gidx(i,j,k,user) == IAjMaxArg) {
1609 if (
Gidx(i,j,k,user) == JAjMaxArg) {
1612 if (
Gidx(i,j,k,user) == KAjMaxArg) {
1625 PetscFunctionReturn(0);