112 PetscInt i,PetscInt j,PetscInt k,
113 PetscReal xi,PetscReal eta,PetscReal zta,
114 PetscReal J[3][3], PetscReal *detJ)
118 PetscFunctionBeginUser;
125 PetscReal dN_dXi[8], dN_dEta[8], dN_dZta[8];
126 for (PetscInt c=0;c<8;++c) {
127 PetscReal sx = (c & 1) ? 1.0 : -1.0;
128 PetscReal sy = (c & 2) ? 1.0 : -1.0;
129 PetscReal sz = (c & 4) ? 1.0 : -1.0;
130 dN_dXi [c] = 0.125 * sx * ( (c&2?eta:1-eta) ) * ( (c&4?zta:1-zta) );
131 dN_dEta[c] = 0.125 * sy * ( (c&1?xi :1-xi ) ) * ( (c&4?zta:1-zta) );
132 dN_dZta[c] = 0.125 * sz * ( (c&1?xi :1-xi ) ) * ( (c&2?eta:1-eta) );
136 PetscReal x_xi=0,y_xi=0,z_xi=0,
137 x_eta=0,y_eta=0,z_eta=0,
138 x_zta=0,y_zta=0,z_zta=0;
139 for (PetscInt c=0;c<8;++c) {
140 x_xi += dN_dXi [c]*V[c].
x; y_xi += dN_dXi [c]*V[c].
y; z_xi += dN_dXi [c]*V[c].
z;
141 x_eta += dN_dEta[c]*V[c].
x; y_eta += dN_dEta[c]*V[c].
y; z_eta += dN_dEta[c]*V[c].
z;
142 x_zta += dN_dZta[c]*V[c].
x; y_zta += dN_dZta[c]*V[c].
y; z_zta += dN_dZta[c]*V[c].
z;
145 J[0][0]=x_xi; J[0][1]=x_eta; J[0][2]=x_zta;
146 J[1][0]=y_xi; J[1][1]=y_eta; J[1][2]=y_zta;
147 J[2][0]=z_xi; J[2][1]=z_eta; J[2][2]=z_zta;
150 *detJ = x_xi*(y_eta*z_zta - y_zta*z_eta)
151 - x_eta*(y_xi*z_zta - y_zta*z_xi)
152 + x_zta*(y_xi*z_eta - y_eta*z_xi);
157 PetscFunctionReturn(0);
468 Cmpnts ***csi_arr, ***eta_arr, ***zet_arr;
469 Cmpnts ***nodal_coords_arr;
470 Vec localCoords_from_dm;
472 PetscFunctionBeginUser;
478 ierr = DMDAGetLocalInfo(user->
fda, &info); CHKERRQ(ierr);
481 ierr = DMGetCoordinatesLocal(user->
da, &localCoords_from_dm); CHKERRQ(ierr);
482 if (!localCoords_from_dm) SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONGSTATE,
"DMGetCoordinatesLocal failed to return a coordinate vector. \n");
483 ierr = DMDAVecGetArrayRead(user->
fda, localCoords_from_dm, &nodal_coords_arr); CHKERRQ(ierr);
486 ierr = DMDAVecGetArray(user->
fda, user->
Csi, &csi_arr); CHKERRQ(ierr);
487 ierr = DMDAVecGetArray(user->
fda, user->
Eta, &eta_arr); CHKERRQ(ierr);
488 ierr = DMDAVecGetArray(user->
fda, user->
Zet, &zet_arr); CHKERRQ(ierr);
491 PetscInt xs = info.xs, xe = info.xs + info.xm;
492 PetscInt ys = info.ys, ye = info.ys + info.ym;
493 PetscInt zs = info.zs, ze = info.zs + info.zm;
496 PetscInt mx = info.mx;
497 PetscInt my = info.my;
498 PetscInt mz = info.mz;
502 PetscInt k_loop_start = (zs == 0) ? zs + 1 : zs;
503 PetscInt j_loop_start = (ys == 0) ? ys + 1 : ys;
504 PetscInt i_loop_start = (xs == 0) ? xs + 1 : xs;
507 for (PetscInt k_node = k_loop_start; k_node < ze; ++k_node) {
508 for (PetscInt j_node = j_loop_start; j_node < ye; ++j_node) {
509 for (PetscInt i_node = xs; i_node < xe; ++i_node) {
511 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);
512 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);
513 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);
514 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);
515 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);
516 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);
518 csi_arr[k_node][j_node][i_node].
x = dy_deta * dz_dzeta - dz_deta * dy_dzeta;
519 csi_arr[k_node][j_node][i_node].
y = dz_deta * dx_dzeta - dx_deta * dz_dzeta;
520 csi_arr[k_node][j_node][i_node].
z = dx_deta * dy_dzeta - dy_deta * dx_dzeta;
526 for (PetscInt k_node = k_loop_start; k_node < ze; ++k_node) {
527 for (PetscInt j_node = ys; j_node < ye; ++j_node) {
528 for (PetscInt i_node = i_loop_start; i_node < xe; ++i_node) {
530 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);
531 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);
532 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);
533 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);
534 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);
535 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);
537 eta_arr[k_node][j_node][i_node].
x = dy_dzeta * dz_dxi - dz_dzeta * dy_dxi;
538 eta_arr[k_node][j_node][i_node].
y = dz_dzeta * dx_dxi - dx_dzeta * dz_dxi;
539 eta_arr[k_node][j_node][i_node].
z = dx_dzeta * dy_dxi - dy_dzeta * dx_dxi;
545 for (PetscInt k_node = zs; k_node < ze; ++k_node) {
546 for (PetscInt j_node = j_loop_start; j_node < ye; ++j_node) {
547 for (PetscInt i_node = i_loop_start; i_node < xe; ++i_node) {
549 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);
550 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);
551 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);
552 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);
553 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);
554 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);
556 zet_arr[k_node][j_node][i_node].
x = dy_dxi * dz_deta - dz_dxi * dy_deta;
557 zet_arr[k_node][j_node][i_node].
y = dz_dxi * dx_deta - dx_dxi * dz_deta;
558 zet_arr[k_node][j_node][i_node].
z = dx_dxi * dy_deta - dy_dxi * dx_deta;
565 PetscInt i_bnd, j_bnd, k_bnd;
569 for (k_bnd = zs; k_bnd < ze; ++k_bnd) {
570 for (j_bnd = ys; j_bnd < ye; ++j_bnd) {
571 if (i_bnd + 1 < mx) {
572 eta_arr[k_bnd][j_bnd][i_bnd] = eta_arr[k_bnd][j_bnd][i_bnd+1];
573 zet_arr[k_bnd][j_bnd][i_bnd] = zet_arr[k_bnd][j_bnd][i_bnd+1];
580 for (k_bnd = zs; k_bnd < ze; ++k_bnd) {
581 for (j_bnd = ys; j_bnd < ye; ++j_bnd) {
582 if (i_bnd - 1 >= 0) {
583 eta_arr[k_bnd][j_bnd][i_bnd] = eta_arr[k_bnd][j_bnd][i_bnd-1];
584 zet_arr[k_bnd][j_bnd][i_bnd] = zet_arr[k_bnd][j_bnd][i_bnd-1];
591 for (k_bnd = zs; k_bnd < ze; ++k_bnd) {
592 for (i_bnd = xs; i_bnd < xe; ++i_bnd) {
593 if (j_bnd + 1 < my) {
594 csi_arr[k_bnd][j_bnd][i_bnd] = csi_arr[k_bnd][j_bnd+1][i_bnd];
595 zet_arr[k_bnd][j_bnd][i_bnd] = zet_arr[k_bnd][j_bnd+1][i_bnd];
602 for (k_bnd = zs; k_bnd < ze; ++k_bnd) {
603 for (i_bnd = xs; i_bnd < xe; ++i_bnd) {
604 if (j_bnd - 1 >= 0) {
605 csi_arr[k_bnd][j_bnd][i_bnd] = csi_arr[k_bnd][j_bnd-1][i_bnd];
606 zet_arr[k_bnd][j_bnd][i_bnd] = zet_arr[k_bnd][j_bnd-1][i_bnd];
613 for (j_bnd = ys; j_bnd < ye; ++j_bnd) {
614 for (i_bnd = xs; i_bnd < xe; ++i_bnd) {
615 if (k_bnd + 1 < mz) {
616 csi_arr[k_bnd][j_bnd][i_bnd] = csi_arr[k_bnd+1][j_bnd][i_bnd];
617 eta_arr[k_bnd][j_bnd][i_bnd] = eta_arr[k_bnd+1][j_bnd][i_bnd];
624 for (j_bnd = ys; j_bnd < ye; ++j_bnd) {
625 for (i_bnd = xs; i_bnd < xe; ++i_bnd) {
626 if (k_bnd - 1 >= 0) {
627 csi_arr[k_bnd][j_bnd][i_bnd] = csi_arr[k_bnd-1][j_bnd][i_bnd];
628 eta_arr[k_bnd][j_bnd][i_bnd] = eta_arr[k_bnd-1][j_bnd][i_bnd];
634 if (info.xs==0 && info.ys==0 && info.zs==0) {
635 PetscReal dot = zet_arr[0][0][0].
z;
640 ierr = DMDAVecRestoreArrayRead(user->
fda, localCoords_from_dm, &nodal_coords_arr); CHKERRQ(ierr);
641 ierr = DMDAVecRestoreArray(user->
fda, user->
Csi, &csi_arr); CHKERRQ(ierr);
642 ierr = DMDAVecRestoreArray(user->
fda, user->
Eta, &eta_arr); CHKERRQ(ierr);
643 ierr = DMDAVecRestoreArray(user->
fda, user->
Zet, &zet_arr); CHKERRQ(ierr);
647 ierr = VecAssemblyBegin(user->
Csi); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
Csi); CHKERRQ(ierr);
648 ierr = VecAssemblyBegin(user->
Eta); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
Eta); CHKERRQ(ierr);
649 ierr = VecAssemblyBegin(user->
Zet); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
Zet); CHKERRQ(ierr);
661 PetscFunctionReturn(0);
680 PetscScalar ***aj_arr;
681 Cmpnts ***nodal_coords_arr;
682 Vec localCoords_from_dm;
684 PetscFunctionBeginUser;
688 ierr = DMGetCoordinatesLocal(user->
da, &localCoords_from_dm); CHKERRQ(ierr);
689 ierr = DMDAVecGetArrayRead(user->
fda, localCoords_from_dm, &nodal_coords_arr); CHKERRQ(ierr);
690 ierr = DMDAGetLocalInfo(user->
da, &info); CHKERRQ(ierr);
691 ierr = DMDAVecGetArray(user->
da, user->
Aj, &aj_arr); CHKERRQ(ierr);
694 PetscInt xs = info.xs, xe = info.xs + info.xm;
695 PetscInt ys = info.ys, ye = info.ys + info.ym;
696 PetscInt zs = info.zs, ze = info.zs + info.zm;
699 PetscInt mx = info.mx;
700 PetscInt my = info.my;
701 PetscInt mz = info.mz;
705 PetscInt k_start_node = (zs == 0) ? zs + 1 : zs;
706 PetscInt j_start_node = (ys == 0) ? ys + 1 : ys;
707 PetscInt i_start_node = (xs == 0) ? xs + 1 : xs;
709 PetscInt k_end_node = (ze == mz) ? ze - 1 : ze;
710 PetscInt j_end_node = (ye == my) ? ye - 1 : ye;
711 PetscInt i_end_node = (xe == mx) ? xe - 1 : xe;
713 for (PetscInt k_node = k_start_node; k_node < k_end_node; ++k_node) {
714 for (PetscInt j_node = j_start_node; j_node < j_end_node; ++j_node) {
715 for (PetscInt i_node = i_start_node; i_node < i_end_node; ++i_node) {
717 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) );
719 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) );
721 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) );
723 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) );
725 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) );
727 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) );
729 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) );
731 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) );
733 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) );
735 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);
736 if (PetscAbsReal(jacobian_det) < 1.0e-18) { SETERRQ(PETSC_COMM_SELF, PETSC_ERR_FLOP_COUNT,
"Jacobian is near zero..."); }
737 aj_arr[k_node][j_node][i_node] = 1.0 / jacobian_det;
744 PetscInt i_bnd, j_bnd, k_bnd;
748 for (k_bnd = zs; k_bnd < ze; ++k_bnd) {
749 for (j_bnd = ys; j_bnd < ye; ++j_bnd) {
750 if (i_bnd + 1 < mx) aj_arr[k_bnd][j_bnd][i_bnd] = aj_arr[k_bnd][j_bnd][i_bnd+1];
756 for (k_bnd = zs; k_bnd < ze; ++k_bnd) {
757 for (j_bnd = ys; j_bnd < ye; ++j_bnd) {
758 if (i_bnd - 1 >= 0) aj_arr[k_bnd][j_bnd][i_bnd] = aj_arr[k_bnd][j_bnd][i_bnd-1];
765 for (k_bnd = zs; k_bnd < ze; ++k_bnd) {
766 for (i_bnd = xs; i_bnd < xe; ++i_bnd) {
767 if (j_bnd + 1 < my) aj_arr[k_bnd][j_bnd][i_bnd] = aj_arr[k_bnd][j_bnd+1][i_bnd];
773 for (k_bnd = zs; k_bnd < ze; ++k_bnd) {
774 for (i_bnd = xs; i_bnd < xe; ++i_bnd) {
775 if (j_bnd - 1 >= 0) aj_arr[k_bnd][j_bnd][i_bnd] = aj_arr[k_bnd][j_bnd-1][i_bnd];
781 for (j_bnd = ys; j_bnd < ye; ++j_bnd) {
782 for (i_bnd = xs; i_bnd < xe; ++i_bnd) {
783 if (k_bnd + 1 < mz) aj_arr[k_bnd][j_bnd][i_bnd] = aj_arr[k_bnd+1][j_bnd][i_bnd];
789 for (j_bnd = ys; j_bnd < ye; ++j_bnd) {
790 for (i_bnd = xs; i_bnd < xe; ++i_bnd) {
791 if (k_bnd - 1 >= 0) aj_arr[k_bnd][j_bnd][i_bnd] = aj_arr[k_bnd-1][j_bnd][i_bnd];
797 ierr = DMDAVecRestoreArrayRead(user->
fda, localCoords_from_dm, &nodal_coords_arr); CHKERRQ(ierr);
798 ierr = DMDAVecRestoreArray(user->
da, user->
Aj, &aj_arr); CHKERRQ(ierr);
802 ierr = VecAssemblyBegin(user->
Aj); CHKERRQ(ierr);
803 ierr = VecAssemblyEnd(user->
Aj); CHKERRQ(ierr);
810 PetscFunctionReturn(0);
836 PetscReal xcp, ycp, zcp, xcm, ycm, zcm;
838 PetscFunctionBeginUser;
844 ierr = DMDAGetLocalInfo(user->
da, &info); CHKERRQ(ierr);
845 ierr = DMGetCoordinatesLocal(user->
da, &lCoords); CHKERRQ(ierr);
846 ierr = DMDAVecGetArrayRead(user->
fda, lCoords, &coor); CHKERRQ(ierr);
848 ierr = DMDAVecGetArray(user->
fda, user->
Cent, ¢); CHKERRQ(ierr);
849 ierr = DMDAVecGetArray(user->
fda, user->
GridSpace, &gs); CHKERRQ(ierr);
852 for (PetscInt k=info.zs+1; k<info.zs+info.zm; k++) {
853 for (PetscInt j=info.ys+1; j<info.ys+info.ym; j++) {
854 for (PetscInt i=info.xs+1; i<info.xs+info.xm; i++) {
856 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);
857 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);
858 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);
861 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);
862 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);
863 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);
864 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);
865 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);
866 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);
867 gs[k][j][i].
x = PetscSqrtReal(PetscSqr(xcp-xcm) + PetscSqr(ycp-ycm) + PetscSqr(zcp-zcm));
870 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);
871 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);
872 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);
873 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);
874 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);
875 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);
876 gs[k][j][i].
y = PetscSqrtReal(PetscSqr(xcp-xcm) + PetscSqr(ycp-ycm) + PetscSqr(zcp-zcm));
879 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);
880 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);
881 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);
882 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);
883 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);
884 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);
885 gs[k][j][i].
z = PetscSqrtReal(PetscSqr(xcp-xcm) + PetscSqr(ycp-ycm) + PetscSqr(zcp-zcm));
890 ierr = DMDAVecRestoreArrayRead(user->
fda, lCoords, &coor); CHKERRQ(ierr);
891 ierr = DMDAVecRestoreArray(user->
fda, user->
Cent, ¢); CHKERRQ(ierr);
892 ierr = DMDAVecRestoreArray(user->
fda, user->
GridSpace, &gs); CHKERRQ(ierr);
895 ierr = VecAssemblyBegin(user->
Cent); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
Cent); CHKERRQ(ierr);
896 ierr = VecAssemblyBegin(user->
GridSpace); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
GridSpace); CHKERRQ(ierr);
902 PetscFunctionReturn(0);
936 const Cmpnts ***centx_const;
937 Cmpnts ***icsi, ***ieta, ***izet;
939 PetscReal dxdc, dydc, dzdc, dxde, dyde, dzde, dxdz, dydz, dzdz;
941 PetscFunctionBeginUser;
947 ierr = DMDAGetLocalInfo(user->
da, &info); CHKERRQ(ierr);
948 PetscInt xs = info.xs, xe = info.xs + info.xm, mx = info.mx;
949 PetscInt ys = info.ys, ye = info.ys + info.ym, my = info.my;
950 PetscInt zs = info.zs, ze = info.zs + info.zm, mz = info.mz;
951 PetscInt gxs = info.gxs, gxe = info.gxs + info.gxm;
952 PetscInt gys = info.gys, gye = info.gys + info.gym;
953 PetscInt gzs = info.gzs, gze = info.gzs + info.gzm;
955 PetscInt lxs = xs; PetscInt lxe = xe;
956 PetscInt lys = ys; PetscInt lye = ye;
957 PetscInt lzs = zs; PetscInt lze = ze;
959 if (xs==0) lxs = xs+1;
960 if (ys==0) lys = ys+1;
961 if (zs==0) lzs = zs+1;
963 if (xe==mx) lxe=xe-1;
964 if (ye==my) lye=ye-1;
965 if (ze==mz) lze=ze-1;
968 ierr = DMGetCoordinatesLocal(user->
da, &lCoords); CHKERRQ(ierr);
969 ierr = DMDAVecGetArrayRead(user->
fda, lCoords, &coor); CHKERRQ(ierr);
970 ierr = DMDAVecGetArray(user->
fda, user->
Centx, ¢x); CHKERRQ(ierr);
976 for (PetscInt k = gzs + 1; k < gze; k++) {
977 for (PetscInt j = gys + 1; j < gye; j++) {
978 for (PetscInt i = gxs; i < gxe; i++) {
987 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);
988 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);
989 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);
1020 ierr = DMDAVecRestoreArrayRead(user->
fda, lCoords, &coor); CHKERRQ(ierr);
1021 ierr = DMDAVecRestoreArray(user->
fda, user->
Centx, ¢x); CHKERRQ(ierr);
1028 ierr = DMDAVecGetArrayRead(user->
fda, user->
Centx, ¢x_const); CHKERRQ(ierr);
1029 ierr = DMDAVecGetArray(user->
fda, user->
ICsi, &icsi); CHKERRQ(ierr);
1030 ierr = DMDAVecGetArray(user->
fda, user->
IEta, &ieta); CHKERRQ(ierr);
1031 ierr = DMDAVecGetArray(user->
fda, user->
IZet, &izet); CHKERRQ(ierr);
1032 ierr = DMDAVecGetArray(user->
da, user->
IAj, &iaj); CHKERRQ(ierr);
1035 for (PetscInt k=lzs; k<lze; k++) {
1036 for (PetscInt j=lys; j<lye; j++) {
1037 for (PetscInt i=xs; i<lxe; i++) {
1041 dxdc = centx_const[k][j][i+1].
x - centx_const[k][j][i].
x;
1042 dydc = centx_const[k][j][i+1].
y - centx_const[k][j][i].
y;
1043 dzdc = centx_const[k][j][i+1].
z - centx_const[k][j][i].
z;
1044 }
else if (i == mx - 2) {
1045 dxdc = centx_const[k][j][i].
x - centx_const[k][j][i-1].
x;
1046 dydc = centx_const[k][j][i].
y - centx_const[k][j][i-1].
y;
1047 dzdc = centx_const[k][j][i].
z - centx_const[k][j][i-1].
z;
1049 dxdc = 0.5 * (centx_const[k][j][i+1].
x - centx_const[k][j][i-1].
x);
1050 dydc = 0.5 * (centx_const[k][j][i+1].
y - centx_const[k][j][i-1].
y);
1051 dzdc = 0.5 * (centx_const[k][j][i+1].
z - centx_const[k][j][i-1].
z);
1056 dxde = centx_const[k][j+1][i].
x - centx_const[k][j][i].
x;
1057 dyde = centx_const[k][j+1][i].
y - centx_const[k][j][i].
y;
1058 dzde = centx_const[k][j+1][i].
z - centx_const[k][j][i].
z;
1059 }
else if (j == my - 2) {
1060 dxde = centx_const[k][j][i].
x - centx_const[k][j-1][i].
x;
1061 dyde = centx_const[k][j][i].
y - centx_const[k][j-1][i].
y;
1062 dzde = centx_const[k][j][i].
z - centx_const[k][j-1][i].
z;
1064 dxde = 0.5 * (centx_const[k][j+1][i].
x - centx_const[k][j-1][i].
x);
1065 dyde = 0.5 * (centx_const[k][j+1][i].
y - centx_const[k][j-1][i].
y);
1066 dzde = 0.5 * (centx_const[k][j+1][i].
z - centx_const[k][j-1][i].
z);
1071 dxdz = centx_const[k+1][j][i].
x - centx_const[k][j][i].
x;
1072 dydz = centx_const[k+1][j][i].
y - centx_const[k][j][i].
y;
1073 dzdz = centx_const[k+1][j][i].
z - centx_const[k][j][i].
z;
1074 }
else if (k == mz - 2) {
1075 dxdz = centx_const[k][j][i].
x - centx_const[k-1][j][i].
x;
1076 dydz = centx_const[k][j][i].
y - centx_const[k-1][j][i].
y;
1077 dzdz = centx_const[k][j][i].
z - centx_const[k-1][j][i].
z;
1079 dxdz = 0.5 * (centx_const[k+1][j][i].
x - centx_const[k-1][j][i].
x);
1080 dydz = 0.5 * (centx_const[k+1][j][i].
y - centx_const[k-1][j][i].
y);
1081 dzdz = 0.5 * (centx_const[k+1][j][i].
z - centx_const[k-1][j][i].
z);
1085 icsi[k][j][i].
x = dyde * dzdz - dzde * dydz;
1086 icsi[k][j][i].
y = -dxde * dzdz + dzde * dxdz;
1087 icsi[k][j][i].
z = dxde * dydz - dyde * dxdz;
1089 ieta[k][j][i].
x = dydz * dzdc - dzdz * dydc;
1090 ieta[k][j][i].
y = -dxdz * dzdc + dzdz * dxdc;
1091 ieta[k][j][i].
z = dxdz * dydc - dydz * dxdc;
1093 izet[k][j][i].
x = dydc * dzde - dzdc * dyde;
1094 izet[k][j][i].
y = -dxdc * dzde + dzdc * dxde;
1095 izet[k][j][i].
z = dxdc * dyde - dydc * dxde;
1097 iaj[k][j][i] = dxdc * icsi[k][j][i].
x + dydc * icsi[k][j][i].
y + dzdc * icsi[k][j][i].
z;
1098 if (PetscAbsScalar(iaj[k][j][i]) > 1e-12) {
1099 iaj[k][j][i] = 1.0 / iaj[k][j][i];
1105 ierr = DMDAVecRestoreArrayRead(user->
fda, user->
Centx, ¢x_const); CHKERRQ(ierr);
1106 ierr = DMDAVecRestoreArray(user->
fda, user->
ICsi, &icsi); CHKERRQ(ierr);
1107 ierr = DMDAVecRestoreArray(user->
fda, user->
IEta, &ieta); CHKERRQ(ierr);
1108 ierr = DMDAVecRestoreArray(user->
fda, user->
IZet, &izet); CHKERRQ(ierr);
1109 ierr = DMDAVecRestoreArray(user->
da, user->
IAj, &iaj); CHKERRQ(ierr);
1112 ierr = VecAssemblyBegin(user->
ICsi); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
ICsi); CHKERRQ(ierr);
1113 ierr = VecAssemblyBegin(user->
IEta); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
IEta); CHKERRQ(ierr);
1114 ierr = VecAssemblyBegin(user->
IZet); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
IZet); CHKERRQ(ierr);
1115 ierr = VecAssemblyBegin(user->
IAj); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
IAj); CHKERRQ(ierr);
1124 PetscFunctionReturn(0);
1153 PetscErrorCode ierr;
1158 const Cmpnts ***centy_const;
1159 Cmpnts ***jcsi, ***jeta, ***jzet;
1161 PetscReal dxdc, dydc, dzdc, dxde, dyde, dzde, dxdz, dydz, dzdz;
1163 PetscFunctionBeginUser;
1169 ierr = DMDAGetLocalInfo(user->
da, &info); CHKERRQ(ierr);
1170 PetscInt xs = info.xs, xe = info.xs + info.xm, mx = info.mx;
1171 PetscInt ys = info.ys, ye = info.ys + info.ym, my = info.my;
1172 PetscInt zs = info.zs, ze = info.zs + info.zm, mz = info.mz;
1173 PetscInt gxs = info.gxs, gxe = info.gxs + info.gxm;
1174 PetscInt gys = info.gys, gye = info.gys + info.gym;
1175 PetscInt gzs = info.gzs, gze = info.gzs + info.gzm;
1177 PetscInt lxs = xs; PetscInt lxe = xe;
1178 PetscInt lys = ys; PetscInt lye = ye;
1179 PetscInt lzs = zs; PetscInt lze = ze;
1181 if (xs==0) lxs = xs+1;
1182 if (ys==0) lys = ys+1;
1183 if (zs==0) lzs = zs+1;
1185 if (xe==mx) lxe=xe-1;
1186 if (ye==my) lye=ye-1;
1187 if (ze==mz) lze=ze-1;
1190 ierr = DMGetCoordinatesLocal(user->
da, &lCoords); CHKERRQ(ierr);
1191 ierr = DMDAVecGetArrayRead(user->
fda, lCoords, &coor); CHKERRQ(ierr);
1192 ierr = DMDAVecGetArray(user->
fda, user->
Centy, ¢y); CHKERRQ(ierr);
1196 for (PetscInt k = gzs + 1; k < gze; k++) {
1197 for (PetscInt j = gys; j < gye; j++) {
1198 for (PetscInt i = gxs + 1; i < gxe; i++) {
1199 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);
1200 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);
1201 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);
1229 ierr = DMDAVecRestoreArrayRead(user->
fda, lCoords, &coor); CHKERRQ(ierr);
1230 ierr = DMDAVecRestoreArray(user->
fda, user->
Centy, ¢y); CHKERRQ(ierr);
1236 ierr = DMDAVecGetArrayRead(user->
fda, user->
Centy, ¢y_const); CHKERRQ(ierr);
1237 ierr = DMDAVecGetArray(user->
fda, user->
JCsi, &jcsi); CHKERRQ(ierr);
1238 ierr = DMDAVecGetArray(user->
fda, user->
JEta, &jeta); CHKERRQ(ierr);
1239 ierr = DMDAVecGetArray(user->
fda, user->
JZet, &jzet); CHKERRQ(ierr);
1240 ierr = DMDAVecGetArray(user->
da, user->
JAj, &jaj); CHKERRQ(ierr);
1243 for (PetscInt k=lzs; k<lze; k++) {
1244 for (PetscInt j=ys; j<lye; j++) {
1245 for (PetscInt i=lxs; i<lxe; i++) {
1249 dxdc = centy_const[k][j][i+1].
x - centy_const[k][j][i].
x;
1250 dydc = centy_const[k][j][i+1].
y - centy_const[k][j][i].
y;
1251 dzdc = centy_const[k][j][i+1].
z - centy_const[k][j][i].
z;
1252 }
else if (i == mx - 2) {
1253 dxdc = centy_const[k][j][i].
x - centy_const[k][j][i-1].
x;
1254 dydc = centy_const[k][j][i].
y - centy_const[k][j][i-1].
y;
1255 dzdc = centy_const[k][j][i].
z - centy_const[k][j][i-1].
z;
1257 dxdc = 0.5 * (centy_const[k][j][i+1].
x - centy_const[k][j][i-1].
x);
1258 dydc = 0.5 * (centy_const[k][j][i+1].
y - centy_const[k][j][i-1].
y);
1259 dzdc = 0.5 * (centy_const[k][j][i+1].
z - centy_const[k][j][i-1].
z);
1264 dxde = centy_const[k][j+1][i].
x - centy_const[k][j][i].
x;
1265 dyde = centy_const[k][j+1][i].
y - centy_const[k][j][i].
y;
1266 dzde = centy_const[k][j+1][i].
z - centy_const[k][j][i].
z;
1267 }
else if (j == my - 2) {
1268 dxde = centy_const[k][j][i].
x - centy_const[k][j-1][i].
x;
1269 dyde = centy_const[k][j][i].
y - centy_const[k][j-1][i].
y;
1270 dzde = centy_const[k][j][i].
z - centy_const[k][j-1][i].
z;
1272 dxde = 0.5 * (centy_const[k][j+1][i].
x - centy_const[k][j-1][i].
x);
1273 dyde = 0.5 * (centy_const[k][j+1][i].
y - centy_const[k][j-1][i].
y);
1274 dzde = 0.5 * (centy_const[k][j+1][i].
z - centy_const[k][j-1][i].
z);
1279 dxdz = centy_const[k+1][j][i].
x - centy_const[k][j][i].
x;
1280 dydz = centy_const[k+1][j][i].
y - centy_const[k][j][i].
y;
1281 dzdz = centy_const[k+1][j][i].
z - centy_const[k][j][i].
z;
1282 }
else if (k == mz - 2) {
1283 dxdz = centy_const[k][j][i].
x - centy_const[k-1][j][i].
x;
1284 dydz = centy_const[k][j][i].
y - centy_const[k-1][j][i].
y;
1285 dzdz = centy_const[k][j][i].
z - centy_const[k-1][j][i].
z;
1287 dxdz = 0.5 * (centy_const[k+1][j][i].
x - centy_const[k-1][j][i].
x);
1288 dydz = 0.5 * (centy_const[k+1][j][i].
y - centy_const[k-1][j][i].
y);
1289 dzdz = 0.5 * (centy_const[k+1][j][i].
z - centy_const[k-1][j][i].
z);
1293 jcsi[k][j][i].
x = dyde * dzdz - dzde * dydz;
1294 jcsi[k][j][i].
y = -dxde * dzdz + dzde * dxdz;
1295 jcsi[k][j][i].
z = dxde * dydz - dyde * dxdz;
1297 jeta[k][j][i].
x = dydz * dzdc - dzdz * dydc;
1298 jeta[k][j][i].
y = -dxdz * dzdc + dzdz * dxdc;
1299 jeta[k][j][i].
z = dxdz * dydc - dydz * dxdc;
1301 jzet[k][j][i].
x = dydc * dzde - dzdc * dyde;
1302 jzet[k][j][i].
y = -dxdc * dzde + dzdc * dxde;
1303 jzet[k][j][i].
z = dxdc * dyde - dydc * dxde;
1305 jaj[k][j][i] = dxdc * jcsi[k][j][i].
x + dydc * jcsi[k][j][i].
y + dzdc * jcsi[k][j][i].
z;
1306 if (PetscAbsScalar(jaj[k][j][i]) > 1e-12) {
1307 jaj[k][j][i] = 1.0 / jaj[k][j][i];
1313 ierr = DMDAVecRestoreArrayRead(user->
fda, user->
Centy, ¢y_const); CHKERRQ(ierr);
1314 ierr = DMDAVecRestoreArray(user->
fda, user->
JCsi, &jcsi); CHKERRQ(ierr);
1315 ierr = DMDAVecRestoreArray(user->
fda, user->
JEta, &jeta); CHKERRQ(ierr);
1316 ierr = DMDAVecRestoreArray(user->
fda, user->
JZet, &jzet); CHKERRQ(ierr);
1317 ierr = DMDAVecRestoreArray(user->
da, user->
JAj, &jaj); CHKERRQ(ierr);
1320 ierr = VecAssemblyBegin(user->
JCsi); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
JCsi); CHKERRQ(ierr);
1321 ierr = VecAssemblyBegin(user->
JEta); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
JEta); CHKERRQ(ierr);
1322 ierr = VecAssemblyBegin(user->
JZet); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
JZet); CHKERRQ(ierr);
1323 ierr = VecAssemblyBegin(user->
JAj); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
JAj); CHKERRQ(ierr);
1332 PetscFunctionReturn(0);
1361 PetscErrorCode ierr;
1366 const Cmpnts ***centz_const;
1367 Cmpnts ***kcsi, ***keta, ***kzet;
1369 PetscReal dxdc, dydc, dzdc, dxde, dyde, dzde, dxdz, dydz, dzdz;
1371 PetscFunctionBeginUser;
1377 ierr = DMDAGetLocalInfo(user->
da, &info); CHKERRQ(ierr);
1378 PetscInt xs = info.xs, xe = info.xs + info.xm, mx = info.mx;
1379 PetscInt ys = info.ys, ye = info.ys + info.ym, my = info.my;
1380 PetscInt zs = info.zs, ze = info.zs + info.zm, mz = info.mz;
1381 PetscInt gxs = info.gxs, gxe = info.gxs + info.gxm;
1382 PetscInt gys = info.gys, gye = info.gys + info.gym;
1383 PetscInt gzs = info.gzs, gze = info.gzs + info.gzm;
1385 PetscInt lxs = xs; PetscInt lxe = xe;
1386 PetscInt lys = ys; PetscInt lye = ye;
1387 PetscInt lzs = zs; PetscInt lze = ze;
1389 if (xs==0) lxs = xs+1;
1390 if (ys==0) lys = ys+1;
1391 if (zs==0) lzs = zs+1;
1393 if (xe==mx) lxe=xe-1;
1394 if (ye==my) lye=ye-1;
1395 if (ze==mz) lze=ze-1;
1398 ierr = DMGetCoordinatesLocal(user->
da, &lCoords); CHKERRQ(ierr);
1399 ierr = DMDAVecGetArrayRead(user->
fda, lCoords, &coor); CHKERRQ(ierr);
1400 ierr = DMDAVecGetArray(user->
fda, user->
Centz, ¢z); CHKERRQ(ierr);
1404 for (PetscInt k = gzs; k < gze; k++) {
1405 for (PetscInt j = gys; j < gye; j++) {
1406 for (PetscInt i = gxs + 1; i < gxe; i++) {
1407 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);
1408 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);
1409 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);
1437 ierr = DMDAVecRestoreArrayRead(user->
fda, lCoords, &coor); CHKERRQ(ierr);
1438 ierr = DMDAVecRestoreArray(user->
fda, user->
Centz, ¢z); CHKERRQ(ierr);
1444 ierr = DMDAVecGetArrayRead(user->
fda, user->
Centz, ¢z_const); CHKERRQ(ierr);
1445 ierr = DMDAVecGetArray(user->
fda, user->
KCsi, &kcsi); CHKERRQ(ierr);
1446 ierr = DMDAVecGetArray(user->
fda, user->
KEta, &keta); CHKERRQ(ierr);
1447 ierr = DMDAVecGetArray(user->
fda, user->
KZet, &kzet); CHKERRQ(ierr);
1448 ierr = DMDAVecGetArray(user->
da, user->
KAj, &kaj); CHKERRQ(ierr);
1451 for (PetscInt k=zs; k<lze; k++) {
1452 for (PetscInt j=lys; j<lye; j++) {
1453 for (PetscInt i=lxs; i<lxe; i++) {
1457 dxdc = centz_const[k][j][i+1].
x - centz_const[k][j][i].
x;
1458 dydc = centz_const[k][j][i+1].
y - centz_const[k][j][i].
y;
1459 dzdc = centz_const[k][j][i+1].
z - centz_const[k][j][i].
z;
1460 }
else if (i == mx - 2) {
1461 dxdc = centz_const[k][j][i].
x - centz_const[k][j][i-1].
x;
1462 dydc = centz_const[k][j][i].
y - centz_const[k][j][i-1].
y;
1463 dzdc = centz_const[k][j][i].
z - centz_const[k][j][i-1].
z;
1465 dxdc = 0.5 * (centz_const[k][j][i+1].
x - centz_const[k][j][i-1].
x);
1466 dydc = 0.5 * (centz_const[k][j][i+1].
y - centz_const[k][j][i-1].
y);
1467 dzdc = 0.5 * (centz_const[k][j][i+1].
z - centz_const[k][j][i-1].
z);
1472 dxde = centz_const[k][j+1][i].
x - centz_const[k][j][i].
x;
1473 dyde = centz_const[k][j+1][i].
y - centz_const[k][j][i].
y;
1474 dzde = centz_const[k][j+1][i].
z - centz_const[k][j][i].
z;
1475 }
else if (j == my - 2) {
1476 dxde = centz_const[k][j][i].
x - centz_const[k][j-1][i].
x;
1477 dyde = centz_const[k][j][i].
y - centz_const[k][j-1][i].
y;
1478 dzde = centz_const[k][j][i].
z - centz_const[k][j-1][i].
z;
1480 dxde = 0.5 * (centz_const[k][j+1][i].
x - centz_const[k][j-1][i].
x);
1481 dyde = 0.5 * (centz_const[k][j+1][i].
y - centz_const[k][j-1][i].
y);
1482 dzde = 0.5 * (centz_const[k][j+1][i].
z - centz_const[k][j-1][i].
z);
1487 dxdz = centz_const[k+1][j][i].
x - centz_const[k][j][i].
x;
1488 dydz = centz_const[k+1][j][i].
y - centz_const[k][j][i].
y;
1489 dzdz = centz_const[k+1][j][i].
z - centz_const[k][j][i].
z;
1490 }
else if (k == mz - 2) {
1491 dxdz = centz_const[k][j][i].
x - centz_const[k-1][j][i].
x;
1492 dydz = centz_const[k][j][i].
y - centz_const[k-1][j][i].
y;
1493 dzdz = centz_const[k][j][i].
z - centz_const[k-1][j][i].
z;
1495 dxdz = 0.5 * (centz_const[k+1][j][i].
x - centz_const[k-1][j][i].
x);
1496 dydz = 0.5 * (centz_const[k+1][j][i].
y - centz_const[k-1][j][i].
y);
1497 dzdz = 0.5 * (centz_const[k+1][j][i].
z - centz_const[k-1][j][i].
z);
1501 kcsi[k][j][i].
x = dyde * dzdz - dzde * dydz;
1502 kcsi[k][j][i].
y = -dxde * dzdz + dzde * dxdz;
1503 kcsi[k][j][i].
z = dxde * dydz - dyde * dxdz;
1505 keta[k][j][i].
x = dydz * dzdc - dzdz * dydc;
1506 keta[k][j][i].
y = -dxdz * dzdc + dzdz * dxdc;
1507 keta[k][j][i].
z = dxdz * dydc - dydz * dxdc;
1509 kzet[k][j][i].
x = dydc * dzde - dzdc * dyde;
1510 kzet[k][j][i].
y = -dxdc * dzde + dzdc * dxde;
1511 kzet[k][j][i].
z = dxdc * dyde - dydc * dxde;
1513 kaj[k][j][i] = dxdc * kcsi[k][j][i].
x + dydc * kcsi[k][j][i].
y + dzdc * kcsi[k][j][i].
z;
1514 if (PetscAbsScalar(kaj[k][j][i]) > 1e-12) {
1515 kaj[k][j][i] = 1.0 / kaj[k][j][i];
1521 ierr = DMDAVecRestoreArrayRead(user->
fda, user->
Centz, ¢z_const); CHKERRQ(ierr);
1522 ierr = DMDAVecRestoreArray(user->
fda, user->
KCsi, &kcsi); CHKERRQ(ierr);
1523 ierr = DMDAVecRestoreArray(user->
fda, user->
KEta, &keta); CHKERRQ(ierr);
1524 ierr = DMDAVecRestoreArray(user->
fda, user->
KZet, &kzet); CHKERRQ(ierr);
1525 ierr = DMDAVecRestoreArray(user->
da, user->
KAj, &kaj); CHKERRQ(ierr);
1528 ierr = VecAssemblyBegin(user->
KCsi); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
KCsi); CHKERRQ(ierr);
1529 ierr = VecAssemblyBegin(user->
KEta); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
KEta); CHKERRQ(ierr);
1530 ierr = VecAssemblyBegin(user->
KZet); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
KZet); CHKERRQ(ierr);
1531 ierr = VecAssemblyBegin(user->
KAj); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
KAj); CHKERRQ(ierr);
1540 PetscFunctionReturn(0);
1575 DM da = user->
da, fda = user->
fda;
1576 DMDALocalInfo info = user->
info;
1577 PetscInt xs = info.xs, xe = info.xs + info.xm;
1578 PetscInt ys = info.ys, ye = info.ys + info.ym;
1579 PetscInt zs = info.zs, ze = info.zs + info.zm;
1580 PetscInt mx = info.mx, my = info.my, mz = info.mz;
1581 PetscInt lxs, lys, lzs, lxe, lye, lze;
1584 PetscReal ***div, ***aj;
1585 Cmpnts ***csi, ***eta, ***zet;
1588 PetscFunctionBeginUser;
1596 if (xs == 0) lxs = xs + 1;
1597 if (ys == 0) lys = ys + 1;
1598 if (zs == 0) lzs = zs + 1;
1600 if (xe == mx) lxe = xe - 1;
1601 if (ye == my) lye = ye - 1;
1602 if (ze == mz) lze = ze - 1;
1604 DMDAVecGetArray(fda, user->
lCsi, &csi);
1605 DMDAVecGetArray(fda, user->
lEta, &eta);
1606 DMDAVecGetArray(fda, user->
lZet, &zet);
1607 DMDAVecGetArray(da, user->
lAj, &aj);
1609 VecDuplicate(user->
P, &Div);
1611 DMDAVecGetArray(da, Div, &div);
1613 for (k = lzs; k < lze; k++) {
1614 for (j = lys; j < lye; j++) {
1615 for (i = lxs; i < lxe; i++) {
1616 PetscReal divergence = (csi[k][j][i].
x - csi[k][j][i-1].
x +
1617 eta[k][j][i].
x - eta[k][j-1][i].
x +
1618 zet[k][j][i].
x - zet[k-1][j][i].
x +
1619 csi[k][j][i].
y - csi[k][j][i-1].
y +
1620 eta[k][j][i].
y - eta[k][j-1][i].
y +
1621 zet[k][j][i].
y - zet[k-1][j][i].
y +
1622 csi[k][j][i].
z - csi[k][j][i-1].
z +
1623 eta[k][j][i].
z - eta[k][j-1][i].
z +
1624 zet[k][j][i].
z - zet[k-1][j][i].
z) * aj[k][j][i];
1625 div[k][j][i] = fabs(divergence);
1630 DMDAVecRestoreArray(da, Div, &div);
1632 PetscReal MaxFlatIndex;
1633 VecMax(Div, &MaxFlatIndex, &maxdiv);
1636 for (k=zs; k<ze; k++) {
1637 for (j=ys; j<ye; j++) {
1638 for (i=xs; i<xe; i++) {
1639 if (
Gidx(i,j,k,user) == MaxFlatIndex) {
1647 DMDAVecRestoreArray(fda, user->
lCsi, &csi);
1648 DMDAVecRestoreArray(fda, user->
lEta, &eta);
1649 DMDAVecRestoreArray(fda, user->
lZet, &zet);
1650 DMDAVecRestoreArray(da, user->
lAj, &aj);
1656 PetscFunctionReturn(0);
1673 DMDALocalInfo info = user->
info;
1674 PetscInt xs = info.xs, xe = info.xs + info.xm;
1675 PetscInt ys = info.ys, ye = info.ys + info.ym;
1676 PetscInt zs = info.zs, ze = info.zs + info.zm;
1679 PetscFunctionBeginUser;
1683 PetscReal CsiMax, EtaMax, ZetMax;
1684 PetscReal ICsiMax, IEtaMax, IZetMax;
1685 PetscReal JCsiMax, JEtaMax, JZetMax;
1686 PetscReal KCsiMax, KEtaMax, KZetMax;
1687 PetscReal AjMax, IAjMax, JAjMax, KAjMax;
1689 PetscInt CsiMaxArg, EtaMaxArg, ZetMaxArg;
1690 PetscInt ICsiMaxArg, IEtaMaxArg, IZetMaxArg;
1691 PetscInt JCsiMaxArg, JEtaMaxArg, JZetMaxArg;
1692 PetscInt KCsiMaxArg, KEtaMaxArg, KZetMaxArg;
1693 PetscInt AjMaxArg, IAjMaxArg, JAjMaxArg, KAjMaxArg;
1696 VecMax(user->
lCsi,&CsiMaxArg,&CsiMax);
1697 VecMax(user->
lEta,&EtaMaxArg,&EtaMax);
1698 VecMax(user->
lZet,&ZetMaxArg,&ZetMax);
1700 VecMax(user->
lICsi,&ICsiMaxArg,&ICsiMax);
1701 VecMax(user->
lIEta,&IEtaMaxArg,&IEtaMax);
1702 VecMax(user->
lIZet,&IZetMaxArg,&IZetMax);
1704 VecMax(user->
lJCsi,&JCsiMaxArg,&JCsiMax);
1705 VecMax(user->
lJEta,&JEtaMaxArg,&JEtaMax);
1706 VecMax(user->
lJZet,&JZetMaxArg,&JZetMax);
1708 VecMax(user->
lKCsi,&KCsiMaxArg,&KCsiMax);
1709 VecMax(user->
lKEta,&KEtaMaxArg,&KEtaMax);
1710 VecMax(user->
lKZet,&KZetMaxArg,&KZetMax);
1712 VecMax(user->
lAj,&AjMaxArg,&AjMax);
1713 VecMax(user->
lIAj,&IAjMaxArg,&IAjMax);
1714 VecMax(user->
lJAj,&JAjMaxArg,&JAjMax);
1715 VecMax(user->
lKAj,&KAjMaxArg,&KAjMax);
1717 VecMax(user->
lAj,&AjMaxArg,&AjMax);
1718 VecMax(user->
lIAj,&IAjMaxArg,&IAjMax);
1719 VecMax(user->
lJAj,&JAjMaxArg,&JAjMax);
1720 VecMax(user->
lKAj,&KAjMaxArg,&KAjMax);
1724 LOG_ALLOW(
GLOBAL,
LOG_INFO,
"The Max Metric Values are: CsiMax = %le, EtaMax = %le, ZetMax = %le.\n",CsiMax,EtaMax,ZetMax);
1725 LOG_ALLOW(
GLOBAL,
LOG_INFO,
"The Max Metric Values are: ICsiMax = %le, IEtaMax = %le, IZetMax = %le.\n",ICsiMax,IEtaMax,IZetMax);
1726 LOG_ALLOW(
GLOBAL,
LOG_INFO,
"The Max Metric Values are: JCsiMax = %le, JEtaMax = %le, JZetMax = %le.\n",JCsiMax,JEtaMax,JZetMax);
1727 LOG_ALLOW(
GLOBAL,
LOG_INFO,
"The Max Metric Values are: KCsiMax = %le, KEtaMax = %le, KZetMax = %le.\n",KCsiMax,KEtaMax,KZetMax);
1728 LOG_ALLOW(
GLOBAL,
LOG_INFO,
"The Max Volumes(Inverse) are: Aj = %le, IAj = %le, JAj = %le, KAj = %le.\n",AjMax,IAjMax,JAjMax,KAjMax);
1730 for (k=zs; k<ze; k++) {
1731 for (j=ys; j<ye; j++) {
1732 for (i=xs; i<xe; i++) {
1733 if (
Gidx(i,j,k,user) == CsiMaxArg) {
1736 if (
Gidx(i,j,k,user) == EtaMaxArg) {
1739 if (
Gidx(i,j,k,user) == ZetMaxArg) {
1742 if (
Gidx(i,j,k,user) == ICsiMaxArg) {
1745 if (
Gidx(i,j,k,user) == IEtaMaxArg) {
1748 if (
Gidx(i,j,k,user) == IZetMaxArg) {
1751 if (
Gidx(i,j,k,user) == JCsiMaxArg) {
1754 if (
Gidx(i,j,k,user) == JEtaMaxArg) {
1757 if (
Gidx(i,j,k,user) == JZetMaxArg) {
1760 if (
Gidx(i,j,k,user) == KCsiMaxArg) {
1763 if (
Gidx(i,j,k,user) == KEtaMaxArg) {
1766 if (
Gidx(i,j,k,user) == KZetMaxArg) {
1769 if (
Gidx(i,j,k,user) == AjMaxArg) {
1772 if (
Gidx(i,j,k,user) == IAjMaxArg) {
1775 if (
Gidx(i,j,k,user) == JAjMaxArg) {
1778 if (
Gidx(i,j,k,user) == KAjMaxArg) {
1793 PetscFunctionReturn(0);