107 PetscInt i,PetscInt j,PetscInt k,
108 PetscReal xi,PetscReal eta,PetscReal zta,
109 PetscReal J[3][3], PetscReal *detJ)
113 PetscFunctionBeginUser;
120 PetscReal dN_dXi[8], dN_dEta[8], dN_dZta[8];
121 for (PetscInt c=0;c<8;++c) {
122 PetscReal sx = (c & 1) ? 1.0 : -1.0;
123 PetscReal sy = (c & 2) ? 1.0 : -1.0;
124 PetscReal sz = (c & 4) ? 1.0 : -1.0;
125 dN_dXi [c] = 0.125 * sx * ( (c&2?eta:1-eta) ) * ( (c&4?zta:1-zta) );
126 dN_dEta[c] = 0.125 * sy * ( (c&1?xi :1-xi ) ) * ( (c&4?zta:1-zta) );
127 dN_dZta[c] = 0.125 * sz * ( (c&1?xi :1-xi ) ) * ( (c&2?eta:1-eta) );
131 PetscReal x_xi=0,y_xi=0,z_xi=0,
132 x_eta=0,y_eta=0,z_eta=0,
133 x_zta=0,y_zta=0,z_zta=0;
134 for (PetscInt c=0;c<8;++c) {
135 x_xi += dN_dXi [c]*V[c].
x; y_xi += dN_dXi [c]*V[c].
y; z_xi += dN_dXi [c]*V[c].
z;
136 x_eta += dN_dEta[c]*V[c].
x; y_eta += dN_dEta[c]*V[c].
y; z_eta += dN_dEta[c]*V[c].
z;
137 x_zta += dN_dZta[c]*V[c].
x; y_zta += dN_dZta[c]*V[c].
y; z_zta += dN_dZta[c]*V[c].
z;
140 J[0][0]=x_xi; J[0][1]=x_eta; J[0][2]=x_zta;
141 J[1][0]=y_xi; J[1][1]=y_eta; J[1][2]=y_zta;
142 J[2][0]=z_xi; J[2][1]=z_eta; J[2][2]=z_zta;
145 *detJ = x_xi*(y_eta*z_zta - y_zta*z_eta)
146 - x_eta*(y_xi*z_zta - y_zta*z_xi)
147 + x_zta*(y_xi*z_eta - y_eta*z_xi);
152 PetscFunctionReturn(0);
394 DMDALocalInfo info = user->
info;
395 PetscInt xs = info.xs, xe = info.xs + info.xm;
396 PetscInt ys = info.ys, ye = info.ys + info.ym;
397 PetscInt zs = info.zs, ze = info.zs + info.zm;
398 PetscInt mx = info.mx, my = info.my, mz = info.mz;
399 Cmpnts ***cent, ***lcent, ***gs;
402 PetscFunctionBeginUser;
406 PetscBool has_periodic = PETSC_FALSE;
407 for (
int i = 0; i < 6; i++) {
409 has_periodic = PETSC_TRUE;
417 PetscFunctionReturn(0);
430 ierr = DMDAVecGetArray(user->
fda, user->
Cent, ¢); CHKERRQ(ierr);
431 ierr = DMDAVecGetArray(user->
fda, user->
lCent, &lcent); CHKERRQ(ierr);
432 ierr = DMDAVecGetArray(user->
fda, user->
lGridSpace, &gs); CHKERRQ(ierr);
436 for (PetscInt k=zs; k<ze; k++) {
437 for (PetscInt j=ys; j<ye; j++) {
438 cent[k][j][0] = lcent[k][j][-2];
442 for (PetscInt k=zs; k<ze; k++) {
443 for (PetscInt j=ys; j<ye; j++) {
444 delta = (gs[k][j][1].
x + gs[k][j][-2].
x) / 2.0;
445 cent[k][j][0].
x = cent[k][j][1].
x - delta;
446 cent[k][j][0].
y = cent[k][j][1].
y;
447 cent[k][j][0].
z = cent[k][j][1].
z;
455 for (PetscInt k=zs; k<ze; k++) {
456 for (PetscInt j=ys; j<ye; j++) {
457 cent[k][j][mx-1] = lcent[k][j][mx+1];
461 for (PetscInt k=zs; k<ze; k++) {
462 for (PetscInt j=ys; j<ye; j++) {
463 delta = (gs[k][j][mx-2].
x + gs[k][j][mx+1].
x) / 2.0;
464 cent[k][j][mx-1].
x = cent[k][j][mx-2].
x + delta;
465 cent[k][j][mx-1].
y = cent[k][j][mx-2].
y;
466 cent[k][j][mx-1].
z = cent[k][j][mx-2].
z;
472 ierr = DMDAVecRestoreArray(user->
fda, user->
lGridSpace, &gs); CHKERRQ(ierr);
473 ierr = DMDAVecRestoreArray(user->
fda, user->
lCent, &lcent); CHKERRQ(ierr);
474 ierr = DMDAVecRestoreArray(user->
fda, user->
Cent, ¢); CHKERRQ(ierr);
480 ierr = DMDAVecGetArray(user->
fda, user->
Cent, ¢); CHKERRQ(ierr);
481 ierr = DMDAVecGetArray(user->
fda, user->
lCent, &lcent); CHKERRQ(ierr);
482 ierr = DMDAVecGetArray(user->
fda, user->
lGridSpace, &gs); CHKERRQ(ierr);
486 for (PetscInt k=zs; k<ze; k++) {
487 for (PetscInt i=xs; i<xe; i++) {
488 cent[k][0][i] = lcent[k][-2][i];
492 for (PetscInt k=zs; k<ze; k++) {
493 for (PetscInt i=xs; i<xe; i++) {
494 delta = (gs[k][1][i].
y + gs[k][-2][i].
y) / 2.0;
495 cent[k][0][i].
x = cent[k][1][i].
x;
496 cent[k][0][i].
y = cent[k][1][i].
y - delta;
497 cent[k][0][i].
z = cent[k][1][i].
z;
505 for (PetscInt k=zs; k<ze; k++) {
506 for (PetscInt i=xs; i<xe; i++) {
507 cent[k][my-1][i] = lcent[k][my+1][i];
511 for (PetscInt k=zs; k<ze; k++) {
512 for (PetscInt i=xs; i<xe; i++) {
513 delta = (gs[k][my-2][i].
y + gs[k][my+1][i].
y) / 2.0;
514 cent[k][my-1][i].
x = cent[k][my-2][i].
x;
515 cent[k][my-1][i].
y = cent[k][my-2][i].
y + delta;
516 cent[k][my-1][i].
z = cent[k][my-2][i].
z;
522 ierr = DMDAVecRestoreArray(user->
fda, user->
lGridSpace, &gs); CHKERRQ(ierr);
523 ierr = DMDAVecRestoreArray(user->
fda, user->
lCent, &lcent); CHKERRQ(ierr);
524 ierr = DMDAVecRestoreArray(user->
fda, user->
Cent, ¢); CHKERRQ(ierr);
532 ierr = DMDAVecGetArray(user->
fda, user->
Cent, ¢); CHKERRQ(ierr);
533 ierr = DMDAVecGetArray(user->
fda, user->
lCent, &lcent); CHKERRQ(ierr);
534 ierr = DMDAVecGetArray(user->
fda, user->
lGridSpace, &gs); CHKERRQ(ierr);
538 for (PetscInt j=ys; j<ye; j++) {
539 for (PetscInt i=xs; i<xe; i++) {
540 cent[0][j][i] = lcent[-2][j][i];
544 for (PetscInt j=ys; j<ye; j++) {
545 for (PetscInt i=xs; i<xe; i++) {
546 delta = (gs[1][j][i].
z + gs[-2][j][i].
z) / 2.0;
547 cent[0][j][i].
x = cent[1][j][i].
x;
548 cent[0][j][i].
y = cent[1][j][i].
y;
549 cent[0][j][i].
z = cent[1][j][i].
z - delta;
557 for (PetscInt j=ys; j<ye; j++) {
558 for (PetscInt i=xs; i<xe; i++) {
559 cent[mz-1][j][i] = lcent[mz+1][j][i];
563 for (PetscInt j=ys; j<ye; j++) {
564 for (PetscInt i=xs; i<xe; i++) {
565 delta = (gs[mz-2][j][i].
z + gs[mz+1][j][i].
z) / 2.0;
566 cent[mz-1][j][i].
x = cent[mz-2][j][i].
x;
567 cent[mz-1][j][i].
y = cent[mz-2][j][i].
y;
568 cent[mz-1][j][i].
z = cent[mz-2][j][i].
z + delta;
574 ierr = DMDAVecRestoreArray(user->
fda, user->
lGridSpace, &gs); CHKERRQ(ierr);
575 ierr = DMDAVecRestoreArray(user->
fda, user->
lCent, &lcent); CHKERRQ(ierr);
576 ierr = DMDAVecRestoreArray(user->
fda, user->
Cent, ¢); CHKERRQ(ierr);
581 PetscFunctionReturn(0);
641 Cmpnts ***csi_arr, ***eta_arr, ***zet_arr;
642 Cmpnts ***nodal_coords_arr;
643 Vec localCoords_from_dm;
645 PetscFunctionBeginUser;
651 ierr = DMDAGetLocalInfo(user->
fda, &info); CHKERRQ(ierr);
654 ierr = DMGetCoordinatesLocal(user->
da, &localCoords_from_dm); CHKERRQ(ierr);
655 if (!localCoords_from_dm) SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONGSTATE,
"DMGetCoordinatesLocal failed to return a coordinate vector. \n");
656 ierr = DMDAVecGetArrayRead(user->
fda, localCoords_from_dm, &nodal_coords_arr); CHKERRQ(ierr);
659 ierr = DMDAVecGetArray(user->
fda, user->
Csi, &csi_arr); CHKERRQ(ierr);
660 ierr = DMDAVecGetArray(user->
fda, user->
Eta, &eta_arr); CHKERRQ(ierr);
661 ierr = DMDAVecGetArray(user->
fda, user->
Zet, &zet_arr); CHKERRQ(ierr);
664 PetscInt xs = info.xs, xe = info.xs + info.xm;
665 PetscInt ys = info.ys, ye = info.ys + info.ym;
666 PetscInt zs = info.zs, ze = info.zs + info.zm;
669 PetscInt mx = info.mx;
670 PetscInt my = info.my;
671 PetscInt mz = info.mz;
675 PetscInt k_loop_start = (zs == 0) ? zs + 1 : zs;
676 PetscInt j_loop_start = (ys == 0) ? ys + 1 : ys;
677 PetscInt i_loop_start = (xs == 0) ? xs + 1 : xs;
683 for (PetscInt k_node = k_loop_start; k_node < ze; ++k_node) {
684 for (PetscInt j_node = j_loop_start; j_node < ye; ++j_node) {
685 for (PetscInt i_node = xs; i_node < xe; ++i_node) {
687 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);
688 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);
689 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);
690 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);
691 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);
692 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);
694 csi_arr[k_node][j_node][i_node].
x = dy_deta * dz_dzeta - dz_deta * dy_dzeta;
695 csi_arr[k_node][j_node][i_node].
y = dz_deta * dx_dzeta - dx_deta * dz_dzeta;
696 csi_arr[k_node][j_node][i_node].
z = dx_deta * dy_dzeta - dy_deta * dx_dzeta;
702 for (PetscInt k_node = k_loop_start; k_node < ze; ++k_node) {
703 for (PetscInt j_node = ys; j_node < ye; ++j_node) {
704 for (PetscInt i_node = i_loop_start; i_node < xe; ++i_node) {
706 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);
707 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);
708 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);
709 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);
710 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);
711 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);
713 eta_arr[k_node][j_node][i_node].
x = dy_dzeta * dz_dxi - dz_dzeta * dy_dxi;
714 eta_arr[k_node][j_node][i_node].
y = dz_dzeta * dx_dxi - dx_dzeta * dz_dxi;
715 eta_arr[k_node][j_node][i_node].
z = dx_dzeta * dy_dxi - dy_dzeta * dx_dxi;
721 for (PetscInt k_node = zs; k_node < ze; ++k_node) {
722 for (PetscInt j_node = j_loop_start; j_node < ye; ++j_node) {
723 for (PetscInt i_node = i_loop_start; i_node < xe; ++i_node) {
725 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);
726 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);
727 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);
728 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);
729 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);
730 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);
732 zet_arr[k_node][j_node][i_node].
x = dy_dxi * dz_deta - dz_dxi * dy_deta;
733 zet_arr[k_node][j_node][i_node].
y = dz_dxi * dx_deta - dx_dxi * dz_deta;
734 zet_arr[k_node][j_node][i_node].
z = dx_dxi * dy_deta - dy_dxi * dx_deta;
741 PetscInt i_bnd, j_bnd, k_bnd;
745 for (k_bnd = zs; k_bnd < ze; ++k_bnd) {
746 for (j_bnd = ys; j_bnd < ye; ++j_bnd) {
747 if (i_bnd + 1 < mx) {
748 eta_arr[k_bnd][j_bnd][i_bnd] = eta_arr[k_bnd][j_bnd][i_bnd+1];
749 zet_arr[k_bnd][j_bnd][i_bnd] = zet_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) {
759 eta_arr[k_bnd][j_bnd][i_bnd] = eta_arr[k_bnd][j_bnd][i_bnd-1];
760 zet_arr[k_bnd][j_bnd][i_bnd] = zet_arr[k_bnd][j_bnd][i_bnd-1];
767 for (k_bnd = zs; k_bnd < ze; ++k_bnd) {
768 for (i_bnd = xs; i_bnd < xe; ++i_bnd) {
769 if (j_bnd + 1 < my) {
770 csi_arr[k_bnd][j_bnd][i_bnd] = csi_arr[k_bnd][j_bnd+1][i_bnd];
771 zet_arr[k_bnd][j_bnd][i_bnd] = zet_arr[k_bnd][j_bnd+1][i_bnd];
778 for (k_bnd = zs; k_bnd < ze; ++k_bnd) {
779 for (i_bnd = xs; i_bnd < xe; ++i_bnd) {
780 if (j_bnd - 1 >= 0) {
781 csi_arr[k_bnd][j_bnd][i_bnd] = csi_arr[k_bnd][j_bnd-1][i_bnd];
782 zet_arr[k_bnd][j_bnd][i_bnd] = zet_arr[k_bnd][j_bnd-1][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 < mz) {
792 csi_arr[k_bnd][j_bnd][i_bnd] = csi_arr[k_bnd+1][j_bnd][i_bnd];
793 eta_arr[k_bnd][j_bnd][i_bnd] = eta_arr[k_bnd+1][j_bnd][i_bnd];
800 for (j_bnd = ys; j_bnd < ye; ++j_bnd) {
801 for (i_bnd = xs; i_bnd < xe; ++i_bnd) {
802 if (k_bnd - 1 >= 0) {
803 csi_arr[k_bnd][j_bnd][i_bnd] = csi_arr[k_bnd-1][j_bnd][i_bnd];
804 eta_arr[k_bnd][j_bnd][i_bnd] = eta_arr[k_bnd-1][j_bnd][i_bnd];
810 if (info.xs==0 && info.ys==0 && info.zs==0) {
811 PetscReal dot = zet_arr[0][0][0].
z;
816 ierr = DMDAVecRestoreArrayRead(user->
fda, localCoords_from_dm, &nodal_coords_arr); CHKERRQ(ierr);
817 ierr = DMDAVecRestoreArray(user->
fda, user->
Csi, &csi_arr); CHKERRQ(ierr);
818 ierr = DMDAVecRestoreArray(user->
fda, user->
Eta, &eta_arr); CHKERRQ(ierr);
819 ierr = DMDAVecRestoreArray(user->
fda, user->
Zet, &zet_arr); CHKERRQ(ierr);
823 ierr = VecAssemblyBegin(user->
Csi); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
Csi); CHKERRQ(ierr);
824 ierr = VecAssemblyBegin(user->
Eta); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
Eta); CHKERRQ(ierr);
825 ierr = VecAssemblyBegin(user->
Zet); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
Zet); CHKERRQ(ierr);
837 PetscFunctionReturn(0);
853 PetscScalar ***aj_arr;
854 Cmpnts ***nodal_coords_arr;
855 Vec localCoords_from_dm;
857 PetscFunctionBeginUser;
861 ierr = DMGetCoordinatesLocal(user->
da, &localCoords_from_dm); CHKERRQ(ierr);
862 ierr = DMDAVecGetArrayRead(user->
fda, localCoords_from_dm, &nodal_coords_arr); CHKERRQ(ierr);
863 ierr = DMDAGetLocalInfo(user->
da, &info); CHKERRQ(ierr);
864 ierr = DMDAVecGetArray(user->
da, user->
Aj, &aj_arr); CHKERRQ(ierr);
867 PetscInt xs = info.xs, xe = info.xs + info.xm;
868 PetscInt ys = info.ys, ye = info.ys + info.ym;
869 PetscInt zs = info.zs, ze = info.zs + info.zm;
872 PetscInt mx = info.mx;
873 PetscInt my = info.my;
874 PetscInt mz = info.mz;
878 PetscInt k_start_node = (zs == 0) ? zs + 1 : zs;
879 PetscInt j_start_node = (ys == 0) ? ys + 1 : ys;
880 PetscInt i_start_node = (xs == 0) ? xs + 1 : xs;
882 PetscInt k_end_node = (ze == mz) ? ze - 1 : ze;
883 PetscInt j_end_node = (ye == my) ? ye - 1 : ye;
884 PetscInt i_end_node = (xe == mx) ? xe - 1 : xe;
886 for (PetscInt k_node = k_start_node; k_node < k_end_node; ++k_node) {
887 for (PetscInt j_node = j_start_node; j_node < j_end_node; ++j_node) {
888 for (PetscInt i_node = i_start_node; i_node < i_end_node; ++i_node) {
890 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) );
892 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) );
894 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) );
896 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) );
898 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) );
900 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) );
902 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) );
904 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) );
906 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) );
908 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);
909 if (PetscAbsReal(jacobian_det) < 1.0e-18) { SETERRQ(PETSC_COMM_SELF, PETSC_ERR_FLOP_COUNT,
"Jacobian is near zero..."); }
910 aj_arr[k_node][j_node][i_node] = 1.0 / jacobian_det;
917 PetscInt i_bnd, j_bnd, k_bnd;
921 for (k_bnd = zs; k_bnd < ze; ++k_bnd) {
922 for (j_bnd = ys; j_bnd < ye; ++j_bnd) {
923 if (i_bnd + 1 < mx) aj_arr[k_bnd][j_bnd][i_bnd] = aj_arr[k_bnd][j_bnd][i_bnd+1];
929 for (k_bnd = zs; k_bnd < ze; ++k_bnd) {
930 for (j_bnd = ys; j_bnd < ye; ++j_bnd) {
931 if (i_bnd - 1 >= 0) aj_arr[k_bnd][j_bnd][i_bnd] = aj_arr[k_bnd][j_bnd][i_bnd-1];
938 for (k_bnd = zs; k_bnd < ze; ++k_bnd) {
939 for (i_bnd = xs; i_bnd < xe; ++i_bnd) {
940 if (j_bnd + 1 < my) aj_arr[k_bnd][j_bnd][i_bnd] = aj_arr[k_bnd][j_bnd+1][i_bnd];
946 for (k_bnd = zs; k_bnd < ze; ++k_bnd) {
947 for (i_bnd = xs; i_bnd < xe; ++i_bnd) {
948 if (j_bnd - 1 >= 0) aj_arr[k_bnd][j_bnd][i_bnd] = aj_arr[k_bnd][j_bnd-1][i_bnd];
954 for (j_bnd = ys; j_bnd < ye; ++j_bnd) {
955 for (i_bnd = xs; i_bnd < xe; ++i_bnd) {
956 if (k_bnd + 1 < mz) aj_arr[k_bnd][j_bnd][i_bnd] = aj_arr[k_bnd+1][j_bnd][i_bnd];
962 for (j_bnd = ys; j_bnd < ye; ++j_bnd) {
963 for (i_bnd = xs; i_bnd < xe; ++i_bnd) {
964 if (k_bnd - 1 >= 0) aj_arr[k_bnd][j_bnd][i_bnd] = aj_arr[k_bnd-1][j_bnd][i_bnd];
970 ierr = DMDAVecRestoreArrayRead(user->
fda, localCoords_from_dm, &nodal_coords_arr); CHKERRQ(ierr);
971 ierr = DMDAVecRestoreArray(user->
da, user->
Aj, &aj_arr); CHKERRQ(ierr);
975 ierr = VecAssemblyBegin(user->
Aj); CHKERRQ(ierr);
976 ierr = VecAssemblyEnd(user->
Aj); CHKERRQ(ierr);
983 PetscFunctionReturn(0);
1000 PetscReal xcp, ycp, zcp, xcm, ycm, zcm;
1001 PetscInt xs,ys,zs,xe,ye,ze,mx,my,mz;
1003 PetscFunctionBeginUser;
1009 ierr = DMDAGetLocalInfo(user->
da, &info); CHKERRQ(ierr);
1010 ierr = DMGetCoordinatesLocal(user->
da, &lCoords); CHKERRQ(ierr);
1011 ierr = DMDAVecGetArrayRead(user->
fda, lCoords, &coor); CHKERRQ(ierr);
1013 ierr = DMDAVecGetArray(user->
fda, user->
Cent, ¢); CHKERRQ(ierr);
1014 ierr = DMDAVecGetArray(user->
fda, user->
GridSpace, &gs); CHKERRQ(ierr);
1016 xs = info.xs; xe = info.xs + info.xm;
1017 ys = info.ys; ye = info.ys + info.ym;
1018 zs = info.zs; ze = info.zs + info.zm;
1019 mx = info.mx; my = info.my; mz = info.mz;
1021 PetscInt k_start_node = (zs == 0) ? zs + 1 : zs;
1022 PetscInt j_start_node = (ys == 0) ? ys + 1 : ys;
1023 PetscInt i_start_node = (xs == 0) ? xs + 1 : xs;
1025 PetscInt k_end_node = (ze == mz) ? ze - 1 : ze;
1026 PetscInt j_end_node = (ye == my) ? ye - 1 : ye;
1027 PetscInt i_end_node = (xe == mx) ? xe - 1 : xe;
1030 for (PetscInt k=k_start_node; k<k_end_node; k++) {
1031 for (PetscInt j=j_start_node; j<j_end_node; j++) {
1032 for (PetscInt i=i_start_node; i<i_end_node; i++) {
1034 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);
1035 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);
1036 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);
1039 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);
1040 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);
1041 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);
1042 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);
1043 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);
1044 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);
1045 gs[k][j][i].
x = PetscSqrtReal(PetscSqr(xcp-xcm) + PetscSqr(ycp-ycm) + PetscSqr(zcp-zcm));
1048 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);
1049 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);
1050 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);
1051 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);
1052 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);
1053 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);
1054 gs[k][j][i].
y = PetscSqrtReal(PetscSqr(xcp-xcm) + PetscSqr(ycp-ycm) + PetscSqr(zcp-zcm));
1057 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);
1058 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);
1059 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);
1060 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);
1061 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);
1062 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);
1063 gs[k][j][i].
z = PetscSqrtReal(PetscSqr(xcp-xcm) + PetscSqr(ycp-ycm) + PetscSqr(zcp-zcm));
1068 ierr = DMDAVecRestoreArrayRead(user->
fda, lCoords, &coor); CHKERRQ(ierr);
1069 ierr = DMDAVecRestoreArray(user->
fda, user->
Cent, ¢); CHKERRQ(ierr);
1070 ierr = DMDAVecRestoreArray(user->
fda, user->
GridSpace, &gs); CHKERRQ(ierr);
1073 ierr = VecAssemblyBegin(user->
Cent); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
Cent); CHKERRQ(ierr);
1074 ierr = VecAssemblyBegin(user->
GridSpace); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
GridSpace); CHKERRQ(ierr);
1081 ierr = VecAssemblyBegin(user->
Cent); CHKERRQ(ierr);
1082 ierr = VecAssemblyEnd(user->
Cent); CHKERRQ(ierr);
1087 PetscFunctionReturn(0);
1098 PetscErrorCode ierr;
1103 const Cmpnts ***centx_const;
1104 Cmpnts ***icsi, ***ieta, ***izet;
1106 PetscReal dxdc, dydc, dzdc, dxde, dyde, dzde, dxdz, dydz, dzdz;
1108 PetscFunctionBeginUser;
1114 ierr = DMDAGetLocalInfo(user->
da, &info); CHKERRQ(ierr);
1115 PetscInt xs = info.xs, xe = info.xs + info.xm, mx = info.mx;
1116 PetscInt ys = info.ys, ye = info.ys + info.ym, my = info.my;
1117 PetscInt zs = info.zs, ze = info.zs + info.zm, mz = info.mz;
1119 PetscInt lys = ys; PetscInt lye = ye;
1120 PetscInt lzs = zs; PetscInt lze = ze;
1122 if (ys==0) lys = ys+1;
1123 if (zs==0) lzs = zs+1;
1125 if (xe==mx) lxe=xe-1;
1126 if (ye==my) lye=ye-1;
1127 if (ze==mz) lze=ze-1;
1130 ierr = DMGetCoordinatesLocal(user->
da, &lCoords); CHKERRQ(ierr);
1131 ierr = DMDAVecGetArrayRead(user->
fda, lCoords, &coor); CHKERRQ(ierr);
1132 ierr = DMDAVecGetArray(user->
fda, user->
Centx, ¢x); CHKERRQ(ierr);
1139 for (PetscInt k = PetscMax(zs, 1); k < PetscMin(ze, mz - 1); k++) {
1140 for (PetscInt j = PetscMax(ys, 1); j < PetscMin(ye, my - 1); j++) {
1141 for (PetscInt i = xs; i < PetscMin(xe, mx - 1); i++) {
1150 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);
1151 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);
1152 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);
1183 ierr = DMDAVecRestoreArrayRead(user->
fda, lCoords, &coor); CHKERRQ(ierr);
1184 ierr = DMDAVecRestoreArray(user->
fda, user->
Centx, ¢x); CHKERRQ(ierr);
1196 ierr = DMDAVecGetArrayRead(user->
fda, user->
lCentx, ¢x_const); CHKERRQ(ierr);
1197 ierr = DMDAVecGetArray(user->
fda, user->
ICsi, &icsi); CHKERRQ(ierr);
1198 ierr = DMDAVecGetArray(user->
fda, user->
IEta, &ieta); CHKERRQ(ierr);
1199 ierr = DMDAVecGetArray(user->
fda, user->
IZet, &izet); CHKERRQ(ierr);
1200 ierr = DMDAVecGetArray(user->
da, user->
IAj, &iaj); CHKERRQ(ierr);
1203 for (PetscInt k=lzs; k<lze; k++) {
1204 for (PetscInt j=lys; j<lye; j++) {
1205 for (PetscInt i=xs; i<lxe; i++) {
1210 dxdc = centx_const[k][j][i+1].
x - centx_const[k][j][i].
x;
1211 dydc = centx_const[k][j][i+1].
y - centx_const[k][j][i].
y;
1212 dzdc = centx_const[k][j][i+1].
z - centx_const[k][j][i].
z;
1215 dxdc = centx_const[k][j][i].
x - centx_const[k][j][i-1].
x;
1216 dydc = centx_const[k][j][i].
y - centx_const[k][j][i-1].
y;
1217 dzdc = centx_const[k][j][i].
z - centx_const[k][j][i-1].
z;
1219 dxdc = 0.5 * (centx_const[k][j][i+1].
x - centx_const[k][j][i-1].
x);
1220 dydc = 0.5 * (centx_const[k][j][i+1].
y - centx_const[k][j][i-1].
y);
1221 dzdc = 0.5 * (centx_const[k][j][i+1].
z - centx_const[k][j][i-1].
z);
1227 dxde = centx_const[k][j+1][i].
x - centx_const[k][j][i].
x;
1228 dyde = centx_const[k][j+1][i].
y - centx_const[k][j][i].
y;
1229 dzde = centx_const[k][j+1][i].
z - centx_const[k][j][i].
z;
1232 dxde = centx_const[k][j][i].
x - centx_const[k][j-1][i].
x;
1233 dyde = centx_const[k][j][i].
y - centx_const[k][j-1][i].
y;
1234 dzde = centx_const[k][j][i].
z - centx_const[k][j-1][i].
z;
1236 dxde = 0.5 * (centx_const[k][j+1][i].
x - centx_const[k][j-1][i].
x);
1237 dyde = 0.5 * (centx_const[k][j+1][i].
y - centx_const[k][j-1][i].
y);
1238 dzde = 0.5 * (centx_const[k][j+1][i].
z - centx_const[k][j-1][i].
z);
1244 dxdz = centx_const[k+1][j][i].
x - centx_const[k][j][i].
x;
1245 dydz = centx_const[k+1][j][i].
y - centx_const[k][j][i].
y;
1246 dzdz = centx_const[k+1][j][i].
z - centx_const[k][j][i].
z;
1249 dxdz = centx_const[k][j][i].
x - centx_const[k-1][j][i].
x;
1250 dydz = centx_const[k][j][i].
y - centx_const[k-1][j][i].
y;
1251 dzdz = centx_const[k][j][i].
z - centx_const[k-1][j][i].
z;
1253 dxdz = 0.5 * (centx_const[k+1][j][i].
x - centx_const[k-1][j][i].
x);
1254 dydz = 0.5 * (centx_const[k+1][j][i].
y - centx_const[k-1][j][i].
y);
1255 dzdz = 0.5 * (centx_const[k+1][j][i].
z - centx_const[k-1][j][i].
z);
1259 icsi[k][j][i].
x = dyde * dzdz - dzde * dydz;
1260 icsi[k][j][i].
y = -dxde * dzdz + dzde * dxdz;
1261 icsi[k][j][i].
z = dxde * dydz - dyde * dxdz;
1263 ieta[k][j][i].
x = dydz * dzdc - dzdz * dydc;
1264 ieta[k][j][i].
y = -dxdz * dzdc + dzdz * dxdc;
1265 ieta[k][j][i].
z = dxdz * dydc - dydz * dxdc;
1267 izet[k][j][i].
x = dydc * dzde - dzdc * dyde;
1268 izet[k][j][i].
y = -dxdc * dzde + dzdc * dxde;
1269 izet[k][j][i].
z = dxdc * dyde - dydc * dxde;
1271 iaj[k][j][i] = dxdc * icsi[k][j][i].
x + dydc * icsi[k][j][i].
y + dzdc * icsi[k][j][i].
z;
1272 if (PetscAbsScalar(iaj[k][j][i]) > 1e-12) {
1273 iaj[k][j][i] = 1.0 / iaj[k][j][i];
1279 ierr = DMDAVecRestoreArrayRead(user->
fda, user->
lCentx, ¢x_const); CHKERRQ(ierr);
1280 ierr = DMDAVecRestoreArray(user->
fda, user->
ICsi, &icsi); CHKERRQ(ierr);
1281 ierr = DMDAVecRestoreArray(user->
fda, user->
IEta, &ieta); CHKERRQ(ierr);
1282 ierr = DMDAVecRestoreArray(user->
fda, user->
IZet, &izet); CHKERRQ(ierr);
1283 ierr = DMDAVecRestoreArray(user->
da, user->
IAj, &iaj); CHKERRQ(ierr);
1286 ierr = VecAssemblyBegin(user->
ICsi); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
ICsi); CHKERRQ(ierr);
1287 ierr = VecAssemblyBegin(user->
IEta); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
IEta); CHKERRQ(ierr);
1288 ierr = VecAssemblyBegin(user->
IZet); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
IZet); CHKERRQ(ierr);
1289 ierr = VecAssemblyBegin(user->
IAj); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
IAj); CHKERRQ(ierr);
1298 PetscFunctionReturn(0);
1309 PetscErrorCode ierr;
1314 const Cmpnts ***centy_const;
1315 Cmpnts ***jcsi, ***jeta, ***jzet;
1317 PetscReal dxdc, dydc, dzdc, dxde, dyde, dzde, dxdz, dydz, dzdz;
1319 PetscFunctionBeginUser;
1325 ierr = DMDAGetLocalInfo(user->
da, &info); CHKERRQ(ierr);
1326 PetscInt xs = info.xs, xe = info.xs + info.xm, mx = info.mx;
1327 PetscInt ys = info.ys, ye = info.ys + info.ym, my = info.my;
1328 PetscInt zs = info.zs, ze = info.zs + info.zm, mz = info.mz;
1329 PetscInt lxs = xs; PetscInt lxe = xe;
1331 PetscInt lzs = zs; PetscInt lze = ze;
1333 if (xs==0) lxs = xs+1;
1334 if (zs==0) lzs = zs+1;
1336 if (xe==mx) lxe=xe-1;
1337 if (ye==my) lye=ye-1;
1338 if (ze==mz) lze=ze-1;
1341 ierr = DMGetCoordinatesLocal(user->
da, &lCoords); CHKERRQ(ierr);
1342 ierr = DMDAVecGetArrayRead(user->
fda, lCoords, &coor); CHKERRQ(ierr);
1343 ierr = DMDAVecGetArray(user->
fda, user->
Centy, ¢y); CHKERRQ(ierr);
1346 for (PetscInt k = PetscMax(zs, 1); k < PetscMin(ze, mz - 1); k++) {
1347 for (PetscInt j = ys; j < PetscMin(ye, my - 1); j++) {
1348 for (PetscInt i = PetscMax(xs, 1); i < PetscMin(xe, mx - 1); i++) {
1349 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);
1350 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);
1351 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);
1379 ierr = DMDAVecRestoreArrayRead(user->
fda, lCoords, &coor); CHKERRQ(ierr);
1380 ierr = DMDAVecRestoreArray(user->
fda, user->
Centy, ¢y); CHKERRQ(ierr);
1391 ierr = DMDAVecGetArrayRead(user->
fda, user->
lCenty, ¢y_const); CHKERRQ(ierr);
1392 ierr = DMDAVecGetArray(user->
fda, user->
JCsi, &jcsi); CHKERRQ(ierr);
1393 ierr = DMDAVecGetArray(user->
fda, user->
JEta, &jeta); CHKERRQ(ierr);
1394 ierr = DMDAVecGetArray(user->
fda, user->
JZet, &jzet); CHKERRQ(ierr);
1395 ierr = DMDAVecGetArray(user->
da, user->
JAj, &jaj); CHKERRQ(ierr);
1398 for (PetscInt k=lzs; k<lze; k++) {
1399 for (PetscInt j=ys; j<lye; j++) {
1400 for (PetscInt i=lxs; i<lxe; i++) {
1405 dxdc = centy_const[k][j][i+1].
x - centy_const[k][j][i].
x;
1406 dydc = centy_const[k][j][i+1].
y - centy_const[k][j][i].
y;
1407 dzdc = centy_const[k][j][i+1].
z - centy_const[k][j][i].
z;
1410 dxdc = centy_const[k][j][i].
x - centy_const[k][j][i-1].
x;
1411 dydc = centy_const[k][j][i].
y - centy_const[k][j][i-1].
y;
1412 dzdc = centy_const[k][j][i].
z - centy_const[k][j][i-1].
z;
1414 dxdc = 0.5 * (centy_const[k][j][i+1].
x - centy_const[k][j][i-1].
x);
1415 dydc = 0.5 * (centy_const[k][j][i+1].
y - centy_const[k][j][i-1].
y);
1416 dzdc = 0.5 * (centy_const[k][j][i+1].
z - centy_const[k][j][i-1].
z);
1422 dxde = centy_const[k][j+1][i].
x - centy_const[k][j][i].
x;
1423 dyde = centy_const[k][j+1][i].
y - centy_const[k][j][i].
y;
1424 dzde = centy_const[k][j+1][i].
z - centy_const[k][j][i].
z;
1427 dxde = centy_const[k][j][i].
x - centy_const[k][j-1][i].
x;
1428 dyde = centy_const[k][j][i].
y - centy_const[k][j-1][i].
y;
1429 dzde = centy_const[k][j][i].
z - centy_const[k][j-1][i].
z;
1431 dxde = 0.5 * (centy_const[k][j+1][i].
x - centy_const[k][j-1][i].
x);
1432 dyde = 0.5 * (centy_const[k][j+1][i].
y - centy_const[k][j-1][i].
y);
1433 dzde = 0.5 * (centy_const[k][j+1][i].
z - centy_const[k][j-1][i].
z);
1439 dxdz = centy_const[k+1][j][i].
x - centy_const[k][j][i].
x;
1440 dydz = centy_const[k+1][j][i].
y - centy_const[k][j][i].
y;
1441 dzdz = centy_const[k+1][j][i].
z - centy_const[k][j][i].
z;
1444 dxdz = centy_const[k][j][i].
x - centy_const[k-1][j][i].
x;
1445 dydz = centy_const[k][j][i].
y - centy_const[k-1][j][i].
y;
1446 dzdz = centy_const[k][j][i].
z - centy_const[k-1][j][i].
z;
1448 dxdz = 0.5 * (centy_const[k+1][j][i].
x - centy_const[k-1][j][i].
x);
1449 dydz = 0.5 * (centy_const[k+1][j][i].
y - centy_const[k-1][j][i].
y);
1450 dzdz = 0.5 * (centy_const[k+1][j][i].
z - centy_const[k-1][j][i].
z);
1454 jcsi[k][j][i].
x = dyde * dzdz - dzde * dydz;
1455 jcsi[k][j][i].
y = -dxde * dzdz + dzde * dxdz;
1456 jcsi[k][j][i].
z = dxde * dydz - dyde * dxdz;
1458 jeta[k][j][i].
x = dydz * dzdc - dzdz * dydc;
1459 jeta[k][j][i].
y = -dxdz * dzdc + dzdz * dxdc;
1460 jeta[k][j][i].
z = dxdz * dydc - dydz * dxdc;
1462 jzet[k][j][i].
x = dydc * dzde - dzdc * dyde;
1463 jzet[k][j][i].
y = -dxdc * dzde + dzdc * dxde;
1464 jzet[k][j][i].
z = dxdc * dyde - dydc * dxde;
1466 jaj[k][j][i] = dxdc * jcsi[k][j][i].
x + dydc * jcsi[k][j][i].
y + dzdc * jcsi[k][j][i].
z;
1467 if (PetscAbsScalar(jaj[k][j][i]) > 1e-12) {
1468 jaj[k][j][i] = 1.0 / jaj[k][j][i];
1474 ierr = DMDAVecRestoreArrayRead(user->
fda, user->
lCenty, ¢y_const); CHKERRQ(ierr);
1475 ierr = DMDAVecRestoreArray(user->
fda, user->
JCsi, &jcsi); CHKERRQ(ierr);
1476 ierr = DMDAVecRestoreArray(user->
fda, user->
JEta, &jeta); CHKERRQ(ierr);
1477 ierr = DMDAVecRestoreArray(user->
fda, user->
JZet, &jzet); CHKERRQ(ierr);
1478 ierr = DMDAVecRestoreArray(user->
da, user->
JAj, &jaj); CHKERRQ(ierr);
1481 ierr = VecAssemblyBegin(user->
JCsi); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
JCsi); CHKERRQ(ierr);
1482 ierr = VecAssemblyBegin(user->
JEta); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
JEta); CHKERRQ(ierr);
1483 ierr = VecAssemblyBegin(user->
JZet); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
JZet); CHKERRQ(ierr);
1484 ierr = VecAssemblyBegin(user->
JAj); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
JAj); CHKERRQ(ierr);
1493 PetscFunctionReturn(0);
1504 PetscErrorCode ierr;
1509 const Cmpnts ***centz_const;
1510 Cmpnts ***kcsi, ***keta, ***kzet;
1512 PetscReal dxdc, dydc, dzdc, dxde, dyde, dzde, dxdz, dydz, dzdz;
1514 PetscFunctionBeginUser;
1520 ierr = DMDAGetLocalInfo(user->
da, &info); CHKERRQ(ierr);
1521 PetscInt xs = info.xs, xe = info.xs + info.xm, mx = info.mx;
1522 PetscInt ys = info.ys, ye = info.ys + info.ym, my = info.my;
1523 PetscInt zs = info.zs, ze = info.zs + info.zm, mz = info.mz;
1524 PetscInt lxs = xs; PetscInt lxe = xe;
1525 PetscInt lys = ys; PetscInt lye = ye;
1528 if (xs==0) lxs = xs+1;
1529 if (ys==0) lys = ys+1;
1531 if (xe==mx) lxe=xe-1;
1532 if (ye==my) lye=ye-1;
1533 if (ze==mz) lze=ze-1;
1536 ierr = DMGetCoordinatesLocal(user->
da, &lCoords); CHKERRQ(ierr);
1537 ierr = DMDAVecGetArrayRead(user->
fda, lCoords, &coor); CHKERRQ(ierr);
1538 ierr = DMDAVecGetArray(user->
fda, user->
Centz, ¢z); CHKERRQ(ierr);
1541 for (PetscInt k = zs; k < PetscMin(ze, mz - 1); k++) {
1542 for (PetscInt j = PetscMax(ys, 1); j < PetscMin(ye, my - 1); j++) {
1543 for (PetscInt i = PetscMax(xs, 1); i < PetscMin(xe, mx - 1); i++) {
1544 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);
1545 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);
1546 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);
1574 ierr = DMDAVecRestoreArrayRead(user->
fda, lCoords, &coor); CHKERRQ(ierr);
1575 ierr = DMDAVecRestoreArray(user->
fda, user->
Centz, ¢z); CHKERRQ(ierr);
1586 ierr = DMDAVecGetArrayRead(user->
fda, user->
lCentz, ¢z_const); CHKERRQ(ierr);
1587 ierr = DMDAVecGetArray(user->
fda, user->
KCsi, &kcsi); CHKERRQ(ierr);
1588 ierr = DMDAVecGetArray(user->
fda, user->
KEta, &keta); CHKERRQ(ierr);
1589 ierr = DMDAVecGetArray(user->
fda, user->
KZet, &kzet); CHKERRQ(ierr);
1590 ierr = DMDAVecGetArray(user->
da, user->
KAj, &kaj); CHKERRQ(ierr);
1593 for (PetscInt k=zs; k<lze; k++) {
1594 for (PetscInt j=lys; j<lye; j++) {
1595 for (PetscInt i=lxs; i<lxe; i++) {
1600 dxdc = centz_const[k][j][i+1].
x - centz_const[k][j][i].
x;
1601 dydc = centz_const[k][j][i+1].
y - centz_const[k][j][i].
y;
1602 dzdc = centz_const[k][j][i+1].
z - centz_const[k][j][i].
z;
1605 dxdc = centz_const[k][j][i].
x - centz_const[k][j][i-1].
x;
1606 dydc = centz_const[k][j][i].
y - centz_const[k][j][i-1].
y;
1607 dzdc = centz_const[k][j][i].
z - centz_const[k][j][i-1].
z;
1609 dxdc = 0.5 * (centz_const[k][j][i+1].
x - centz_const[k][j][i-1].
x);
1610 dydc = 0.5 * (centz_const[k][j][i+1].
y - centz_const[k][j][i-1].
y);
1611 dzdc = 0.5 * (centz_const[k][j][i+1].
z - centz_const[k][j][i-1].
z);
1617 dxde = centz_const[k][j+1][i].
x - centz_const[k][j][i].
x;
1618 dyde = centz_const[k][j+1][i].
y - centz_const[k][j][i].
y;
1619 dzde = centz_const[k][j+1][i].
z - centz_const[k][j][i].
z;
1622 dxde = centz_const[k][j][i].
x - centz_const[k][j-1][i].
x;
1623 dyde = centz_const[k][j][i].
y - centz_const[k][j-1][i].
y;
1624 dzde = centz_const[k][j][i].
z - centz_const[k][j-1][i].
z;
1626 dxde = 0.5 * (centz_const[k][j+1][i].
x - centz_const[k][j-1][i].
x);
1627 dyde = 0.5 * (centz_const[k][j+1][i].
y - centz_const[k][j-1][i].
y);
1628 dzde = 0.5 * (centz_const[k][j+1][i].
z - centz_const[k][j-1][i].
z);
1634 dxdz = centz_const[k+1][j][i].
x - centz_const[k][j][i].
x;
1635 dydz = centz_const[k+1][j][i].
y - centz_const[k][j][i].
y;
1636 dzdz = centz_const[k+1][j][i].
z - centz_const[k][j][i].
z;
1639 dxdz = centz_const[k][j][i].
x - centz_const[k-1][j][i].
x;
1640 dydz = centz_const[k][j][i].
y - centz_const[k-1][j][i].
y;
1641 dzdz = centz_const[k][j][i].
z - centz_const[k-1][j][i].
z;
1643 dxdz = 0.5 * (centz_const[k+1][j][i].
x - centz_const[k-1][j][i].
x);
1644 dydz = 0.5 * (centz_const[k+1][j][i].
y - centz_const[k-1][j][i].
y);
1645 dzdz = 0.5 * (centz_const[k+1][j][i].
z - centz_const[k-1][j][i].
z);
1649 kcsi[k][j][i].
x = dyde * dzdz - dzde * dydz;
1650 kcsi[k][j][i].
y = -dxde * dzdz + dzde * dxdz;
1651 kcsi[k][j][i].
z = dxde * dydz - dyde * dxdz;
1653 keta[k][j][i].
x = dydz * dzdc - dzdz * dydc;
1654 keta[k][j][i].
y = -dxdz * dzdc + dzdz * dxdc;
1655 keta[k][j][i].
z = dxdz * dydc - dydz * dxdc;
1657 kzet[k][j][i].
x = dydc * dzde - dzdc * dyde;
1658 kzet[k][j][i].
y = -dxdc * dzde + dzdc * dxde;
1659 kzet[k][j][i].
z = dxdc * dyde - dydc * dxde;
1661 kaj[k][j][i] = dxdc * kcsi[k][j][i].
x + dydc * kcsi[k][j][i].
y + dzdc * kcsi[k][j][i].
z;
1662 if (PetscAbsScalar(kaj[k][j][i]) > 1e-12) {
1663 kaj[k][j][i] = 1.0 / kaj[k][j][i];
1669 ierr = DMDAVecRestoreArrayRead(user->
fda, user->
lCentz, ¢z_const); CHKERRQ(ierr);
1670 ierr = DMDAVecRestoreArray(user->
fda, user->
KCsi, &kcsi); CHKERRQ(ierr);
1671 ierr = DMDAVecRestoreArray(user->
fda, user->
KEta, &keta); CHKERRQ(ierr);
1672 ierr = DMDAVecRestoreArray(user->
fda, user->
KZet, &kzet); CHKERRQ(ierr);
1673 ierr = DMDAVecRestoreArray(user->
da, user->
KAj, &kaj); CHKERRQ(ierr);
1676 ierr = VecAssemblyBegin(user->
KCsi); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
KCsi); CHKERRQ(ierr);
1677 ierr = VecAssemblyBegin(user->
KEta); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
KEta); CHKERRQ(ierr);
1678 ierr = VecAssemblyBegin(user->
KZet); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
KZet); CHKERRQ(ierr);
1679 ierr = VecAssemblyBegin(user->
KAj); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
KAj); CHKERRQ(ierr);
1688 PetscFunctionReturn(0);
1718 DM da = user->
da, fda = user->
fda;
1719 DMDALocalInfo info = user->
info;
1720 PetscInt xs = info.xs, xe = info.xs + info.xm;
1721 PetscInt ys = info.ys, ye = info.ys + info.ym;
1722 PetscInt zs = info.zs, ze = info.zs + info.zm;
1723 PetscInt mx = info.mx, my = info.my, mz = info.mz;
1724 PetscInt lxs, lys, lzs, lxe, lye, lze;
1727 PetscReal ***div, ***aj;
1728 Cmpnts ***csi, ***eta, ***zet;
1731 PetscFunctionBeginUser;
1739 if (xs == 0) lxs = xs + 1;
1740 if (ys == 0) lys = ys + 1;
1741 if (zs == 0) lzs = zs + 1;
1743 if (xe == mx) lxe = xe - 1;
1744 if (ye == my) lye = ye - 1;
1745 if (ze == mz) lze = ze - 1;
1747 DMDAVecGetArray(fda, user->
lCsi, &csi);
1748 DMDAVecGetArray(fda, user->
lEta, &eta);
1749 DMDAVecGetArray(fda, user->
lZet, &zet);
1750 DMDAVecGetArray(da, user->
lAj, &aj);
1752 VecDuplicate(user->
P, &Div);
1754 DMDAVecGetArray(da, Div, &div);
1756 for (k = lzs; k < lze; k++) {
1757 for (j = lys; j < lye; j++) {
1758 for (i = lxs; i < lxe; i++) {
1759 PetscReal divergence = (csi[k][j][i].
x - csi[k][j][i-1].
x +
1760 eta[k][j][i].
x - eta[k][j-1][i].
x +
1761 zet[k][j][i].
x - zet[k-1][j][i].
x +
1762 csi[k][j][i].
y - csi[k][j][i-1].
y +
1763 eta[k][j][i].
y - eta[k][j-1][i].
y +
1764 zet[k][j][i].
y - zet[k-1][j][i].
y +
1765 csi[k][j][i].
z - csi[k][j][i-1].
z +
1766 eta[k][j][i].
z - eta[k][j-1][i].
z +
1767 zet[k][j][i].
z - zet[k-1][j][i].
z) * aj[k][j][i];
1768 div[k][j][i] = fabs(divergence);
1773 DMDAVecRestoreArray(da, Div, &div);
1775 PetscInt MaxFlatIndex = -1;
1776 VecMax(Div, &MaxFlatIndex, &maxdiv);
1777 LOG_ALLOW(
GLOBAL,
LOG_INFO,
"The Maximum Metric Divergence is %e at flat index %" PetscInt_FMT
".\n",maxdiv,MaxFlatIndex);
1779 for (k=zs; k<ze; k++) {
1780 for (j=ys; j<ye; j++) {
1781 for (i=xs; i<xe; i++) {
1782 if (
Gidx(i,j,k,user) == MaxFlatIndex) {
1783 LOG_ALLOW(
GLOBAL,
LOG_INFO,
"The Maximum Metric Divergence(%e) is at location [%d][%d][%d]. \n", maxdiv,(
int)k,(
int)j,(
int)i);
1790 DMDAVecRestoreArray(fda, user->
lCsi, &csi);
1791 DMDAVecRestoreArray(fda, user->
lEta, &eta);
1792 DMDAVecRestoreArray(fda, user->
lZet, &zet);
1793 DMDAVecRestoreArray(da, user->
lAj, &aj);
1799 PetscFunctionReturn(0);
1811 DMDALocalInfo info = user->
info;
1812 PetscInt xs = info.xs, xe = info.xs + info.xm;
1813 PetscInt ys = info.ys, ye = info.ys + info.ym;
1814 PetscInt zs = info.zs, ze = info.zs + info.zm;
1817 PetscFunctionBeginUser;
1821 PetscReal CsiMax, EtaMax, ZetMax;
1822 PetscReal ICsiMax, IEtaMax, IZetMax;
1823 PetscReal JCsiMax, JEtaMax, JZetMax;
1824 PetscReal KCsiMax, KEtaMax, KZetMax;
1825 PetscReal AjMax, IAjMax, JAjMax, KAjMax;
1827 PetscInt CsiMaxArg, EtaMaxArg, ZetMaxArg;
1828 PetscInt ICsiMaxArg, IEtaMaxArg, IZetMaxArg;
1829 PetscInt JCsiMaxArg, JEtaMaxArg, JZetMaxArg;
1830 PetscInt KCsiMaxArg, KEtaMaxArg, KZetMaxArg;
1831 PetscInt AjMaxArg, IAjMaxArg, JAjMaxArg, KAjMaxArg;
1834 VecMax(user->
lCsi,&CsiMaxArg,&CsiMax);
1835 VecMax(user->
lEta,&EtaMaxArg,&EtaMax);
1836 VecMax(user->
lZet,&ZetMaxArg,&ZetMax);
1838 VecMax(user->
lICsi,&ICsiMaxArg,&ICsiMax);
1839 VecMax(user->
lIEta,&IEtaMaxArg,&IEtaMax);
1840 VecMax(user->
lIZet,&IZetMaxArg,&IZetMax);
1842 VecMax(user->
lJCsi,&JCsiMaxArg,&JCsiMax);
1843 VecMax(user->
lJEta,&JEtaMaxArg,&JEtaMax);
1844 VecMax(user->
lJZet,&JZetMaxArg,&JZetMax);
1846 VecMax(user->
lKCsi,&KCsiMaxArg,&KCsiMax);
1847 VecMax(user->
lKEta,&KEtaMaxArg,&KEtaMax);
1848 VecMax(user->
lKZet,&KZetMaxArg,&KZetMax);
1850 VecMax(user->
lAj,&AjMaxArg,&AjMax);
1851 VecMax(user->
lIAj,&IAjMaxArg,&IAjMax);
1852 VecMax(user->
lJAj,&JAjMaxArg,&JAjMax);
1853 VecMax(user->
lKAj,&KAjMaxArg,&KAjMax);
1855 VecMax(user->
lAj,&AjMaxArg,&AjMax);
1856 VecMax(user->
lIAj,&IAjMaxArg,&IAjMax);
1857 VecMax(user->
lJAj,&JAjMaxArg,&JAjMax);
1858 VecMax(user->
lKAj,&KAjMaxArg,&KAjMax);
1862 LOG_ALLOW(
GLOBAL,
LOG_INFO,
"The Max Metric Values are: CsiMax = %le, EtaMax = %le, ZetMax = %le.\n",CsiMax,EtaMax,ZetMax);
1863 LOG_ALLOW(
GLOBAL,
LOG_INFO,
"The Max Metric Values are: ICsiMax = %le, IEtaMax = %le, IZetMax = %le.\n",ICsiMax,IEtaMax,IZetMax);
1864 LOG_ALLOW(
GLOBAL,
LOG_INFO,
"The Max Metric Values are: JCsiMax = %le, JEtaMax = %le, JZetMax = %le.\n",JCsiMax,JEtaMax,JZetMax);
1865 LOG_ALLOW(
GLOBAL,
LOG_INFO,
"The Max Metric Values are: KCsiMax = %le, KEtaMax = %le, KZetMax = %le.\n",KCsiMax,KEtaMax,KZetMax);
1866 LOG_ALLOW(
GLOBAL,
LOG_INFO,
"The Max Volumes(Inverse) are: Aj = %le, IAj = %le, JAj = %le, KAj = %le.\n",AjMax,IAjMax,JAjMax,KAjMax);
1868 for (k=zs; k<ze; k++) {
1869 for (j=ys; j<ye; j++) {
1870 for (i=xs; i<xe; i++) {
1871 if (
Gidx(i,j,k,user) == CsiMaxArg) {
1874 if (
Gidx(i,j,k,user) == EtaMaxArg) {
1877 if (
Gidx(i,j,k,user) == ZetMaxArg) {
1880 if (
Gidx(i,j,k,user) == ICsiMaxArg) {
1883 if (
Gidx(i,j,k,user) == IEtaMaxArg) {
1886 if (
Gidx(i,j,k,user) == IZetMaxArg) {
1889 if (
Gidx(i,j,k,user) == JCsiMaxArg) {
1892 if (
Gidx(i,j,k,user) == JEtaMaxArg) {
1895 if (
Gidx(i,j,k,user) == JZetMaxArg) {
1898 if (
Gidx(i,j,k,user) == KCsiMaxArg) {
1901 if (
Gidx(i,j,k,user) == KEtaMaxArg) {
1904 if (
Gidx(i,j,k,user) == KZetMaxArg) {
1907 if (
Gidx(i,j,k,user) == AjMaxArg) {
1910 if (
Gidx(i,j,k,user) == IAjMaxArg) {
1913 if (
Gidx(i,j,k,user) == JAjMaxArg) {
1916 if (
Gidx(i,j,k,user) == KAjMaxArg) {
1931 PetscFunctionReturn(0);