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);
447 DMDALocalInfo info = user->
info;
448 PetscInt xs = info.xs, xe = info.xs + info.xm;
449 PetscInt ys = info.ys, ye = info.ys + info.ym;
450 PetscInt zs = info.zs, ze = info.zs + info.zm;
451 PetscInt mx = info.mx, my = info.my, mz = info.mz;
452 Cmpnts ***cent, ***lcent, ***gs;
455 PetscFunctionBeginUser;
459 PetscBool has_periodic = PETSC_FALSE;
460 for (
int i = 0; i < 6; i++) {
462 has_periodic = PETSC_TRUE;
470 PetscFunctionReturn(0);
483 ierr = DMDAVecGetArray(user->
fda, user->
Cent, ¢); CHKERRQ(ierr);
484 ierr = DMDAVecGetArray(user->
fda, user->
lCent, &lcent); CHKERRQ(ierr);
485 ierr = DMDAVecGetArray(user->
fda, user->
lGridSpace, &gs); CHKERRQ(ierr);
489 for (PetscInt k=zs; k<ze; k++) {
490 for (PetscInt j=ys; j<ye; j++) {
491 cent[k][j][0] = lcent[k][j][-2];
495 for (PetscInt k=zs; k<ze; k++) {
496 for (PetscInt j=ys; j<ye; j++) {
497 delta = (gs[k][j][1].
x + gs[k][j][-2].
x) / 2.0;
498 cent[k][j][0].
x = cent[k][j][1].
x - delta;
499 cent[k][j][0].
y = cent[k][j][1].
y;
500 cent[k][j][0].
z = cent[k][j][1].
z;
508 for (PetscInt k=zs; k<ze; k++) {
509 for (PetscInt j=ys; j<ye; j++) {
510 cent[k][j][mx-1] = lcent[k][j][mx+1];
514 for (PetscInt k=zs; k<ze; k++) {
515 for (PetscInt j=ys; j<ye; j++) {
516 delta = (gs[k][j][mx-2].
x + gs[k][j][mx+1].
x) / 2.0;
517 cent[k][j][mx-1].
x = cent[k][j][mx-2].
x + delta;
518 cent[k][j][mx-1].
y = cent[k][j][mx-2].
y;
519 cent[k][j][mx-1].
z = cent[k][j][mx-2].
z;
525 ierr = DMDAVecRestoreArray(user->
fda, user->
lGridSpace, &gs); CHKERRQ(ierr);
526 ierr = DMDAVecRestoreArray(user->
fda, user->
lCent, &lcent); CHKERRQ(ierr);
527 ierr = DMDAVecRestoreArray(user->
fda, user->
Cent, ¢); CHKERRQ(ierr);
533 ierr = DMDAVecGetArray(user->
fda, user->
Cent, ¢); CHKERRQ(ierr);
534 ierr = DMDAVecGetArray(user->
fda, user->
lCent, &lcent); CHKERRQ(ierr);
535 ierr = DMDAVecGetArray(user->
fda, user->
lGridSpace, &gs); CHKERRQ(ierr);
539 for (PetscInt k=zs; k<ze; k++) {
540 for (PetscInt i=xs; i<xe; i++) {
541 cent[k][0][i] = lcent[k][-2][i];
545 for (PetscInt k=zs; k<ze; k++) {
546 for (PetscInt i=xs; i<xe; i++) {
547 delta = (gs[k][1][i].
y + gs[k][-2][i].
y) / 2.0;
548 cent[k][0][i].
x = cent[k][1][i].
x;
549 cent[k][0][i].
y = cent[k][1][i].
y - delta;
550 cent[k][0][i].
z = cent[k][1][i].
z;
558 for (PetscInt k=zs; k<ze; k++) {
559 for (PetscInt i=xs; i<xe; i++) {
560 cent[k][my-1][i] = lcent[k][my+1][i];
564 for (PetscInt k=zs; k<ze; k++) {
565 for (PetscInt i=xs; i<xe; i++) {
566 delta = (gs[k][my-2][i].
y + gs[k][my+1][i].
y) / 2.0;
567 cent[k][my-1][i].
x = cent[k][my-2][i].
x;
568 cent[k][my-1][i].
y = cent[k][my-2][i].
y + delta;
569 cent[k][my-1][i].
z = cent[k][my-2][i].
z;
575 ierr = DMDAVecRestoreArray(user->
fda, user->
lGridSpace, &gs); CHKERRQ(ierr);
576 ierr = DMDAVecRestoreArray(user->
fda, user->
lCent, &lcent); CHKERRQ(ierr);
577 ierr = DMDAVecRestoreArray(user->
fda, user->
Cent, ¢); CHKERRQ(ierr);
585 ierr = DMDAVecGetArray(user->
fda, user->
Cent, ¢); CHKERRQ(ierr);
586 ierr = DMDAVecGetArray(user->
fda, user->
lCent, &lcent); CHKERRQ(ierr);
587 ierr = DMDAVecGetArray(user->
fda, user->
lGridSpace, &gs); CHKERRQ(ierr);
591 for (PetscInt j=ys; j<ye; j++) {
592 for (PetscInt i=xs; i<xe; i++) {
593 cent[0][j][i] = lcent[-2][j][i];
597 for (PetscInt j=ys; j<ye; j++) {
598 for (PetscInt i=xs; i<xe; i++) {
599 delta = (gs[1][j][i].
z + gs[-2][j][i].
z) / 2.0;
600 cent[0][j][i].
x = cent[1][j][i].
x;
601 cent[0][j][i].
y = cent[1][j][i].
y;
602 cent[0][j][i].
z = cent[1][j][i].
z - delta;
610 for (PetscInt j=ys; j<ye; j++) {
611 for (PetscInt i=xs; i<xe; i++) {
612 cent[mz-1][j][i] = lcent[mz+1][j][i];
616 for (PetscInt j=ys; j<ye; j++) {
617 for (PetscInt i=xs; i<xe; i++) {
618 delta = (gs[mz-2][j][i].
z + gs[mz+1][j][i].
z) / 2.0;
619 cent[mz-1][j][i].
x = cent[mz-2][j][i].
x;
620 cent[mz-1][j][i].
y = cent[mz-2][j][i].
y;
621 cent[mz-1][j][i].
z = cent[mz-2][j][i].
z + delta;
627 ierr = DMDAVecRestoreArray(user->
fda, user->
lGridSpace, &gs); CHKERRQ(ierr);
628 ierr = DMDAVecRestoreArray(user->
fda, user->
lCent, &lcent); CHKERRQ(ierr);
629 ierr = DMDAVecRestoreArray(user->
fda, user->
Cent, ¢); CHKERRQ(ierr);
634 PetscFunctionReturn(0);
694 Cmpnts ***csi_arr, ***eta_arr, ***zet_arr;
695 Cmpnts ***nodal_coords_arr;
696 Vec localCoords_from_dm;
698 PetscFunctionBeginUser;
704 ierr = DMDAGetLocalInfo(user->
fda, &info); CHKERRQ(ierr);
707 ierr = DMGetCoordinatesLocal(user->
da, &localCoords_from_dm); CHKERRQ(ierr);
708 if (!localCoords_from_dm) SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONGSTATE,
"DMGetCoordinatesLocal failed to return a coordinate vector. \n");
709 ierr = DMDAVecGetArrayRead(user->
fda, localCoords_from_dm, &nodal_coords_arr); CHKERRQ(ierr);
712 ierr = DMDAVecGetArray(user->
fda, user->
Csi, &csi_arr); CHKERRQ(ierr);
713 ierr = DMDAVecGetArray(user->
fda, user->
Eta, &eta_arr); CHKERRQ(ierr);
714 ierr = DMDAVecGetArray(user->
fda, user->
Zet, &zet_arr); CHKERRQ(ierr);
717 PetscInt xs = info.xs, xe = info.xs + info.xm;
718 PetscInt ys = info.ys, ye = info.ys + info.ym;
719 PetscInt zs = info.zs, ze = info.zs + info.zm;
722 PetscInt mx = info.mx;
723 PetscInt my = info.my;
724 PetscInt mz = info.mz;
728 PetscInt k_loop_start = (zs == 0) ? zs + 1 : zs;
729 PetscInt j_loop_start = (ys == 0) ? ys + 1 : ys;
730 PetscInt i_loop_start = (xs == 0) ? xs + 1 : xs;
736 for (PetscInt k_node = k_loop_start; k_node < ze; ++k_node) {
737 for (PetscInt j_node = j_loop_start; j_node < ye; ++j_node) {
738 for (PetscInt i_node = xs; i_node < xe; ++i_node) {
740 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);
741 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);
742 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);
743 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);
744 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);
745 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);
747 csi_arr[k_node][j_node][i_node].
x = dy_deta * dz_dzeta - dz_deta * dy_dzeta;
748 csi_arr[k_node][j_node][i_node].
y = dz_deta * dx_dzeta - dx_deta * dz_dzeta;
749 csi_arr[k_node][j_node][i_node].
z = dx_deta * dy_dzeta - dy_deta * dx_dzeta;
755 for (PetscInt k_node = k_loop_start; k_node < ze; ++k_node) {
756 for (PetscInt j_node = ys; j_node < ye; ++j_node) {
757 for (PetscInt i_node = i_loop_start; i_node < xe; ++i_node) {
759 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);
760 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);
761 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);
762 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);
763 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);
764 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);
766 eta_arr[k_node][j_node][i_node].
x = dy_dzeta * dz_dxi - dz_dzeta * dy_dxi;
767 eta_arr[k_node][j_node][i_node].
y = dz_dzeta * dx_dxi - dx_dzeta * dz_dxi;
768 eta_arr[k_node][j_node][i_node].
z = dx_dzeta * dy_dxi - dy_dzeta * dx_dxi;
774 for (PetscInt k_node = zs; k_node < ze; ++k_node) {
775 for (PetscInt j_node = j_loop_start; j_node < ye; ++j_node) {
776 for (PetscInt i_node = i_loop_start; i_node < xe; ++i_node) {
778 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);
779 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);
780 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);
781 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);
782 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);
783 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);
785 zet_arr[k_node][j_node][i_node].
x = dy_dxi * dz_deta - dz_dxi * dy_deta;
786 zet_arr[k_node][j_node][i_node].
y = dz_dxi * dx_deta - dx_dxi * dz_deta;
787 zet_arr[k_node][j_node][i_node].
z = dx_dxi * dy_deta - dy_dxi * dx_deta;
794 PetscInt i_bnd, j_bnd, k_bnd;
798 for (k_bnd = zs; k_bnd < ze; ++k_bnd) {
799 for (j_bnd = ys; j_bnd < ye; ++j_bnd) {
800 if (i_bnd + 1 < mx) {
801 eta_arr[k_bnd][j_bnd][i_bnd] = eta_arr[k_bnd][j_bnd][i_bnd+1];
802 zet_arr[k_bnd][j_bnd][i_bnd] = zet_arr[k_bnd][j_bnd][i_bnd+1];
809 for (k_bnd = zs; k_bnd < ze; ++k_bnd) {
810 for (j_bnd = ys; j_bnd < ye; ++j_bnd) {
811 if (i_bnd - 1 >= 0) {
812 eta_arr[k_bnd][j_bnd][i_bnd] = eta_arr[k_bnd][j_bnd][i_bnd-1];
813 zet_arr[k_bnd][j_bnd][i_bnd] = zet_arr[k_bnd][j_bnd][i_bnd-1];
820 for (k_bnd = zs; k_bnd < ze; ++k_bnd) {
821 for (i_bnd = xs; i_bnd < xe; ++i_bnd) {
822 if (j_bnd + 1 < my) {
823 csi_arr[k_bnd][j_bnd][i_bnd] = csi_arr[k_bnd][j_bnd+1][i_bnd];
824 zet_arr[k_bnd][j_bnd][i_bnd] = zet_arr[k_bnd][j_bnd+1][i_bnd];
831 for (k_bnd = zs; k_bnd < ze; ++k_bnd) {
832 for (i_bnd = xs; i_bnd < xe; ++i_bnd) {
833 if (j_bnd - 1 >= 0) {
834 csi_arr[k_bnd][j_bnd][i_bnd] = csi_arr[k_bnd][j_bnd-1][i_bnd];
835 zet_arr[k_bnd][j_bnd][i_bnd] = zet_arr[k_bnd][j_bnd-1][i_bnd];
842 for (j_bnd = ys; j_bnd < ye; ++j_bnd) {
843 for (i_bnd = xs; i_bnd < xe; ++i_bnd) {
844 if (k_bnd + 1 < mz) {
845 csi_arr[k_bnd][j_bnd][i_bnd] = csi_arr[k_bnd+1][j_bnd][i_bnd];
846 eta_arr[k_bnd][j_bnd][i_bnd] = eta_arr[k_bnd+1][j_bnd][i_bnd];
853 for (j_bnd = ys; j_bnd < ye; ++j_bnd) {
854 for (i_bnd = xs; i_bnd < xe; ++i_bnd) {
855 if (k_bnd - 1 >= 0) {
856 csi_arr[k_bnd][j_bnd][i_bnd] = csi_arr[k_bnd-1][j_bnd][i_bnd];
857 eta_arr[k_bnd][j_bnd][i_bnd] = eta_arr[k_bnd-1][j_bnd][i_bnd];
863 if (info.xs==0 && info.ys==0 && info.zs==0) {
864 PetscReal dot = zet_arr[0][0][0].
z;
869 ierr = DMDAVecRestoreArrayRead(user->
fda, localCoords_from_dm, &nodal_coords_arr); CHKERRQ(ierr);
870 ierr = DMDAVecRestoreArray(user->
fda, user->
Csi, &csi_arr); CHKERRQ(ierr);
871 ierr = DMDAVecRestoreArray(user->
fda, user->
Eta, &eta_arr); CHKERRQ(ierr);
872 ierr = DMDAVecRestoreArray(user->
fda, user->
Zet, &zet_arr); CHKERRQ(ierr);
876 ierr = VecAssemblyBegin(user->
Csi); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
Csi); CHKERRQ(ierr);
877 ierr = VecAssemblyBegin(user->
Eta); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
Eta); CHKERRQ(ierr);
878 ierr = VecAssemblyBegin(user->
Zet); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
Zet); CHKERRQ(ierr);
890 PetscFunctionReturn(0);
906 PetscScalar ***aj_arr;
907 Cmpnts ***nodal_coords_arr;
908 Vec localCoords_from_dm;
910 PetscFunctionBeginUser;
914 ierr = DMGetCoordinatesLocal(user->
da, &localCoords_from_dm); CHKERRQ(ierr);
915 ierr = DMDAVecGetArrayRead(user->
fda, localCoords_from_dm, &nodal_coords_arr); CHKERRQ(ierr);
916 ierr = DMDAGetLocalInfo(user->
da, &info); CHKERRQ(ierr);
917 ierr = DMDAVecGetArray(user->
da, user->
Aj, &aj_arr); CHKERRQ(ierr);
920 PetscInt xs = info.xs, xe = info.xs + info.xm;
921 PetscInt ys = info.ys, ye = info.ys + info.ym;
922 PetscInt zs = info.zs, ze = info.zs + info.zm;
925 PetscInt mx = info.mx;
926 PetscInt my = info.my;
927 PetscInt mz = info.mz;
931 PetscInt k_start_node = (zs == 0) ? zs + 1 : zs;
932 PetscInt j_start_node = (ys == 0) ? ys + 1 : ys;
933 PetscInt i_start_node = (xs == 0) ? xs + 1 : xs;
935 PetscInt k_end_node = (ze == mz) ? ze - 1 : ze;
936 PetscInt j_end_node = (ye == my) ? ye - 1 : ye;
937 PetscInt i_end_node = (xe == mx) ? xe - 1 : xe;
939 for (PetscInt k_node = k_start_node; k_node < k_end_node; ++k_node) {
940 for (PetscInt j_node = j_start_node; j_node < j_end_node; ++j_node) {
941 for (PetscInt i_node = i_start_node; i_node < i_end_node; ++i_node) {
943 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) );
945 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) );
947 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) );
949 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) );
951 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) );
953 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) );
955 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) );
957 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) );
959 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) );
961 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);
962 if (PetscAbsReal(jacobian_det) < 1.0e-18) { SETERRQ(PETSC_COMM_SELF, PETSC_ERR_FLOP_COUNT,
"Jacobian is near zero..."); }
963 aj_arr[k_node][j_node][i_node] = 1.0 / jacobian_det;
970 PetscInt i_bnd, j_bnd, k_bnd;
974 for (k_bnd = zs; k_bnd < ze; ++k_bnd) {
975 for (j_bnd = ys; j_bnd < ye; ++j_bnd) {
976 if (i_bnd + 1 < mx) aj_arr[k_bnd][j_bnd][i_bnd] = aj_arr[k_bnd][j_bnd][i_bnd+1];
982 for (k_bnd = zs; k_bnd < ze; ++k_bnd) {
983 for (j_bnd = ys; j_bnd < ye; ++j_bnd) {
984 if (i_bnd - 1 >= 0) aj_arr[k_bnd][j_bnd][i_bnd] = aj_arr[k_bnd][j_bnd][i_bnd-1];
991 for (k_bnd = zs; k_bnd < ze; ++k_bnd) {
992 for (i_bnd = xs; i_bnd < xe; ++i_bnd) {
993 if (j_bnd + 1 < my) aj_arr[k_bnd][j_bnd][i_bnd] = aj_arr[k_bnd][j_bnd+1][i_bnd];
999 for (k_bnd = zs; k_bnd < ze; ++k_bnd) {
1000 for (i_bnd = xs; i_bnd < xe; ++i_bnd) {
1001 if (j_bnd - 1 >= 0) aj_arr[k_bnd][j_bnd][i_bnd] = aj_arr[k_bnd][j_bnd-1][i_bnd];
1007 for (j_bnd = ys; j_bnd < ye; ++j_bnd) {
1008 for (i_bnd = xs; i_bnd < xe; ++i_bnd) {
1009 if (k_bnd + 1 < mz) aj_arr[k_bnd][j_bnd][i_bnd] = aj_arr[k_bnd+1][j_bnd][i_bnd];
1015 for (j_bnd = ys; j_bnd < ye; ++j_bnd) {
1016 for (i_bnd = xs; i_bnd < xe; ++i_bnd) {
1017 if (k_bnd - 1 >= 0) aj_arr[k_bnd][j_bnd][i_bnd] = aj_arr[k_bnd-1][j_bnd][i_bnd];
1023 ierr = DMDAVecRestoreArrayRead(user->
fda, localCoords_from_dm, &nodal_coords_arr); CHKERRQ(ierr);
1024 ierr = DMDAVecRestoreArray(user->
da, user->
Aj, &aj_arr); CHKERRQ(ierr);
1028 ierr = VecAssemblyBegin(user->
Aj); CHKERRQ(ierr);
1029 ierr = VecAssemblyEnd(user->
Aj); CHKERRQ(ierr);
1036 PetscFunctionReturn(0);
1048 PetscErrorCode ierr;
1053 PetscReal xcp, ycp, zcp, xcm, ycm, zcm;
1054 PetscInt xs,ys,zs,xe,ye,ze,mx,my,mz;
1056 PetscFunctionBeginUser;
1062 ierr = DMDAGetLocalInfo(user->
da, &info); CHKERRQ(ierr);
1063 ierr = DMGetCoordinatesLocal(user->
da, &lCoords); CHKERRQ(ierr);
1064 ierr = DMDAVecGetArrayRead(user->
fda, lCoords, &coor); CHKERRQ(ierr);
1066 ierr = DMDAVecGetArray(user->
fda, user->
Cent, ¢); CHKERRQ(ierr);
1067 ierr = DMDAVecGetArray(user->
fda, user->
GridSpace, &gs); CHKERRQ(ierr);
1069 xs = info.xs; xe = info.xs + info.xm;
1070 ys = info.ys; ye = info.ys + info.ym;
1071 zs = info.zs; ze = info.zs + info.zm;
1072 mx = info.mx; my = info.my; mz = info.mz;
1074 PetscInt k_start_node = (zs == 0) ? zs + 1 : zs;
1075 PetscInt j_start_node = (ys == 0) ? ys + 1 : ys;
1076 PetscInt i_start_node = (xs == 0) ? xs + 1 : xs;
1078 PetscInt k_end_node = (ze == mz) ? ze - 1 : ze;
1079 PetscInt j_end_node = (ye == my) ? ye - 1 : ye;
1080 PetscInt i_end_node = (xe == mx) ? xe - 1 : xe;
1083 for (PetscInt k=k_start_node; k<k_end_node; k++) {
1084 for (PetscInt j=j_start_node; j<j_end_node; j++) {
1085 for (PetscInt i=i_start_node; i<i_end_node; i++) {
1087 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);
1088 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);
1089 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);
1092 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);
1093 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);
1094 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);
1095 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);
1096 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);
1097 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);
1098 gs[k][j][i].
x = PetscSqrtReal(PetscSqr(xcp-xcm) + PetscSqr(ycp-ycm) + PetscSqr(zcp-zcm));
1101 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);
1102 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);
1103 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);
1104 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);
1105 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);
1106 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);
1107 gs[k][j][i].
y = PetscSqrtReal(PetscSqr(xcp-xcm) + PetscSqr(ycp-ycm) + PetscSqr(zcp-zcm));
1110 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);
1111 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);
1112 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);
1113 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);
1114 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);
1115 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);
1116 gs[k][j][i].
z = PetscSqrtReal(PetscSqr(xcp-xcm) + PetscSqr(ycp-ycm) + PetscSqr(zcp-zcm));
1121 ierr = DMDAVecRestoreArrayRead(user->
fda, lCoords, &coor); CHKERRQ(ierr);
1122 ierr = DMDAVecRestoreArray(user->
fda, user->
Cent, ¢); CHKERRQ(ierr);
1123 ierr = DMDAVecRestoreArray(user->
fda, user->
GridSpace, &gs); CHKERRQ(ierr);
1126 ierr = VecAssemblyBegin(user->
Cent); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
Cent); CHKERRQ(ierr);
1127 ierr = VecAssemblyBegin(user->
GridSpace); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
GridSpace); CHKERRQ(ierr);
1134 ierr = VecAssemblyBegin(user->
Cent); CHKERRQ(ierr);
1135 ierr = VecAssemblyEnd(user->
Cent); CHKERRQ(ierr);
1140 PetscFunctionReturn(0);
1151 PetscErrorCode ierr;
1156 const Cmpnts ***centx_const;
1157 Cmpnts ***icsi, ***ieta, ***izet;
1159 PetscReal dxdc, dydc, dzdc, dxde, dyde, dzde, dxdz, dydz, dzdz;
1161 PetscFunctionBeginUser;
1167 ierr = DMDAGetLocalInfo(user->
da, &info); CHKERRQ(ierr);
1168 PetscInt xs = info.xs, xe = info.xs + info.xm, mx = info.mx;
1169 PetscInt ys = info.ys, ye = info.ys + info.ym, my = info.my;
1170 PetscInt zs = info.zs, ze = info.zs + info.zm, mz = info.mz;
1172 PetscInt lys = ys; PetscInt lye = ye;
1173 PetscInt lzs = zs; PetscInt lze = ze;
1175 if (ys==0) lys = ys+1;
1176 if (zs==0) lzs = zs+1;
1178 if (xe==mx) lxe=xe-1;
1179 if (ye==my) lye=ye-1;
1180 if (ze==mz) lze=ze-1;
1183 ierr = DMGetCoordinatesLocal(user->
da, &lCoords); CHKERRQ(ierr);
1184 ierr = DMDAVecGetArrayRead(user->
fda, lCoords, &coor); CHKERRQ(ierr);
1185 ierr = DMDAVecGetArray(user->
fda, user->
Centx, ¢x); CHKERRQ(ierr);
1192 for (PetscInt k = PetscMax(zs, 1); k < PetscMin(ze, mz - 1); k++) {
1193 for (PetscInt j = PetscMax(ys, 1); j < PetscMin(ye, my - 1); j++) {
1194 for (PetscInt i = xs; i < PetscMin(xe, mx - 1); i++) {
1203 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);
1204 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);
1205 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);
1236 ierr = DMDAVecRestoreArrayRead(user->
fda, lCoords, &coor); CHKERRQ(ierr);
1237 ierr = DMDAVecRestoreArray(user->
fda, user->
Centx, ¢x); CHKERRQ(ierr);
1249 ierr = DMDAVecGetArrayRead(user->
fda, user->
lCentx, ¢x_const); CHKERRQ(ierr);
1250 ierr = DMDAVecGetArray(user->
fda, user->
ICsi, &icsi); CHKERRQ(ierr);
1251 ierr = DMDAVecGetArray(user->
fda, user->
IEta, &ieta); CHKERRQ(ierr);
1252 ierr = DMDAVecGetArray(user->
fda, user->
IZet, &izet); CHKERRQ(ierr);
1253 ierr = DMDAVecGetArray(user->
da, user->
IAj, &iaj); CHKERRQ(ierr);
1256 for (PetscInt k=lzs; k<lze; k++) {
1257 for (PetscInt j=lys; j<lye; j++) {
1258 for (PetscInt i=xs; i<lxe; i++) {
1263 dxdc = centx_const[k][j][i+1].
x - centx_const[k][j][i].
x;
1264 dydc = centx_const[k][j][i+1].
y - centx_const[k][j][i].
y;
1265 dzdc = centx_const[k][j][i+1].
z - centx_const[k][j][i].
z;
1268 dxdc = centx_const[k][j][i].
x - centx_const[k][j][i-1].
x;
1269 dydc = centx_const[k][j][i].
y - centx_const[k][j][i-1].
y;
1270 dzdc = centx_const[k][j][i].
z - centx_const[k][j][i-1].
z;
1272 dxdc = 0.5 * (centx_const[k][j][i+1].
x - centx_const[k][j][i-1].
x);
1273 dydc = 0.5 * (centx_const[k][j][i+1].
y - centx_const[k][j][i-1].
y);
1274 dzdc = 0.5 * (centx_const[k][j][i+1].
z - centx_const[k][j][i-1].
z);
1280 dxde = centx_const[k][j+1][i].
x - centx_const[k][j][i].
x;
1281 dyde = centx_const[k][j+1][i].
y - centx_const[k][j][i].
y;
1282 dzde = centx_const[k][j+1][i].
z - centx_const[k][j][i].
z;
1285 dxde = centx_const[k][j][i].
x - centx_const[k][j-1][i].
x;
1286 dyde = centx_const[k][j][i].
y - centx_const[k][j-1][i].
y;
1287 dzde = centx_const[k][j][i].
z - centx_const[k][j-1][i].
z;
1289 dxde = 0.5 * (centx_const[k][j+1][i].
x - centx_const[k][j-1][i].
x);
1290 dyde = 0.5 * (centx_const[k][j+1][i].
y - centx_const[k][j-1][i].
y);
1291 dzde = 0.5 * (centx_const[k][j+1][i].
z - centx_const[k][j-1][i].
z);
1297 dxdz = centx_const[k+1][j][i].
x - centx_const[k][j][i].
x;
1298 dydz = centx_const[k+1][j][i].
y - centx_const[k][j][i].
y;
1299 dzdz = centx_const[k+1][j][i].
z - centx_const[k][j][i].
z;
1302 dxdz = centx_const[k][j][i].
x - centx_const[k-1][j][i].
x;
1303 dydz = centx_const[k][j][i].
y - centx_const[k-1][j][i].
y;
1304 dzdz = centx_const[k][j][i].
z - centx_const[k-1][j][i].
z;
1306 dxdz = 0.5 * (centx_const[k+1][j][i].
x - centx_const[k-1][j][i].
x);
1307 dydz = 0.5 * (centx_const[k+1][j][i].
y - centx_const[k-1][j][i].
y);
1308 dzdz = 0.5 * (centx_const[k+1][j][i].
z - centx_const[k-1][j][i].
z);
1312 icsi[k][j][i].
x = dyde * dzdz - dzde * dydz;
1313 icsi[k][j][i].
y = -dxde * dzdz + dzde * dxdz;
1314 icsi[k][j][i].
z = dxde * dydz - dyde * dxdz;
1316 ieta[k][j][i].
x = dydz * dzdc - dzdz * dydc;
1317 ieta[k][j][i].
y = -dxdz * dzdc + dzdz * dxdc;
1318 ieta[k][j][i].
z = dxdz * dydc - dydz * dxdc;
1320 izet[k][j][i].
x = dydc * dzde - dzdc * dyde;
1321 izet[k][j][i].
y = -dxdc * dzde + dzdc * dxde;
1322 izet[k][j][i].
z = dxdc * dyde - dydc * dxde;
1324 iaj[k][j][i] = dxdc * icsi[k][j][i].
x + dydc * icsi[k][j][i].
y + dzdc * icsi[k][j][i].
z;
1325 if (PetscAbsScalar(iaj[k][j][i]) > 1e-12) {
1326 iaj[k][j][i] = 1.0 / iaj[k][j][i];
1332 ierr = DMDAVecRestoreArrayRead(user->
fda, user->
lCentx, ¢x_const); CHKERRQ(ierr);
1333 ierr = DMDAVecRestoreArray(user->
fda, user->
ICsi, &icsi); CHKERRQ(ierr);
1334 ierr = DMDAVecRestoreArray(user->
fda, user->
IEta, &ieta); CHKERRQ(ierr);
1335 ierr = DMDAVecRestoreArray(user->
fda, user->
IZet, &izet); CHKERRQ(ierr);
1336 ierr = DMDAVecRestoreArray(user->
da, user->
IAj, &iaj); CHKERRQ(ierr);
1339 ierr = VecAssemblyBegin(user->
ICsi); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
ICsi); CHKERRQ(ierr);
1340 ierr = VecAssemblyBegin(user->
IEta); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
IEta); CHKERRQ(ierr);
1341 ierr = VecAssemblyBegin(user->
IZet); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
IZet); CHKERRQ(ierr);
1342 ierr = VecAssemblyBegin(user->
IAj); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
IAj); CHKERRQ(ierr);
1351 PetscFunctionReturn(0);
1362 PetscErrorCode ierr;
1367 const Cmpnts ***centy_const;
1368 Cmpnts ***jcsi, ***jeta, ***jzet;
1370 PetscReal dxdc, dydc, dzdc, dxde, dyde, dzde, dxdz, dydz, dzdz;
1372 PetscFunctionBeginUser;
1378 ierr = DMDAGetLocalInfo(user->
da, &info); CHKERRQ(ierr);
1379 PetscInt xs = info.xs, xe = info.xs + info.xm, mx = info.mx;
1380 PetscInt ys = info.ys, ye = info.ys + info.ym, my = info.my;
1381 PetscInt zs = info.zs, ze = info.zs + info.zm, mz = info.mz;
1382 PetscInt lxs = xs; PetscInt lxe = xe;
1384 PetscInt lzs = zs; PetscInt lze = ze;
1386 if (xs==0) lxs = xs+1;
1387 if (zs==0) lzs = zs+1;
1389 if (xe==mx) lxe=xe-1;
1390 if (ye==my) lye=ye-1;
1391 if (ze==mz) lze=ze-1;
1394 ierr = DMGetCoordinatesLocal(user->
da, &lCoords); CHKERRQ(ierr);
1395 ierr = DMDAVecGetArrayRead(user->
fda, lCoords, &coor); CHKERRQ(ierr);
1396 ierr = DMDAVecGetArray(user->
fda, user->
Centy, ¢y); CHKERRQ(ierr);
1399 for (PetscInt k = PetscMax(zs, 1); k < PetscMin(ze, mz - 1); k++) {
1400 for (PetscInt j = ys; j < PetscMin(ye, my - 1); j++) {
1401 for (PetscInt i = PetscMax(xs, 1); i < PetscMin(xe, mx - 1); i++) {
1402 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);
1403 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);
1404 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);
1432 ierr = DMDAVecRestoreArrayRead(user->
fda, lCoords, &coor); CHKERRQ(ierr);
1433 ierr = DMDAVecRestoreArray(user->
fda, user->
Centy, ¢y); CHKERRQ(ierr);
1444 ierr = DMDAVecGetArrayRead(user->
fda, user->
lCenty, ¢y_const); CHKERRQ(ierr);
1445 ierr = DMDAVecGetArray(user->
fda, user->
JCsi, &jcsi); CHKERRQ(ierr);
1446 ierr = DMDAVecGetArray(user->
fda, user->
JEta, &jeta); CHKERRQ(ierr);
1447 ierr = DMDAVecGetArray(user->
fda, user->
JZet, &jzet); CHKERRQ(ierr);
1448 ierr = DMDAVecGetArray(user->
da, user->
JAj, &jaj); CHKERRQ(ierr);
1451 for (PetscInt k=lzs; k<lze; k++) {
1452 for (PetscInt j=ys; j<lye; j++) {
1453 for (PetscInt i=lxs; i<lxe; i++) {
1458 dxdc = centy_const[k][j][i+1].
x - centy_const[k][j][i].
x;
1459 dydc = centy_const[k][j][i+1].
y - centy_const[k][j][i].
y;
1460 dzdc = centy_const[k][j][i+1].
z - centy_const[k][j][i].
z;
1463 dxdc = centy_const[k][j][i].
x - centy_const[k][j][i-1].
x;
1464 dydc = centy_const[k][j][i].
y - centy_const[k][j][i-1].
y;
1465 dzdc = centy_const[k][j][i].
z - centy_const[k][j][i-1].
z;
1467 dxdc = 0.5 * (centy_const[k][j][i+1].
x - centy_const[k][j][i-1].
x);
1468 dydc = 0.5 * (centy_const[k][j][i+1].
y - centy_const[k][j][i-1].
y);
1469 dzdc = 0.5 * (centy_const[k][j][i+1].
z - centy_const[k][j][i-1].
z);
1475 dxde = centy_const[k][j+1][i].
x - centy_const[k][j][i].
x;
1476 dyde = centy_const[k][j+1][i].
y - centy_const[k][j][i].
y;
1477 dzde = centy_const[k][j+1][i].
z - centy_const[k][j][i].
z;
1480 dxde = centy_const[k][j][i].
x - centy_const[k][j-1][i].
x;
1481 dyde = centy_const[k][j][i].
y - centy_const[k][j-1][i].
y;
1482 dzde = centy_const[k][j][i].
z - centy_const[k][j-1][i].
z;
1484 dxde = 0.5 * (centy_const[k][j+1][i].
x - centy_const[k][j-1][i].
x);
1485 dyde = 0.5 * (centy_const[k][j+1][i].
y - centy_const[k][j-1][i].
y);
1486 dzde = 0.5 * (centy_const[k][j+1][i].
z - centy_const[k][j-1][i].
z);
1492 dxdz = centy_const[k+1][j][i].
x - centy_const[k][j][i].
x;
1493 dydz = centy_const[k+1][j][i].
y - centy_const[k][j][i].
y;
1494 dzdz = centy_const[k+1][j][i].
z - centy_const[k][j][i].
z;
1497 dxdz = centy_const[k][j][i].
x - centy_const[k-1][j][i].
x;
1498 dydz = centy_const[k][j][i].
y - centy_const[k-1][j][i].
y;
1499 dzdz = centy_const[k][j][i].
z - centy_const[k-1][j][i].
z;
1501 dxdz = 0.5 * (centy_const[k+1][j][i].
x - centy_const[k-1][j][i].
x);
1502 dydz = 0.5 * (centy_const[k+1][j][i].
y - centy_const[k-1][j][i].
y);
1503 dzdz = 0.5 * (centy_const[k+1][j][i].
z - centy_const[k-1][j][i].
z);
1507 jcsi[k][j][i].
x = dyde * dzdz - dzde * dydz;
1508 jcsi[k][j][i].
y = -dxde * dzdz + dzde * dxdz;
1509 jcsi[k][j][i].
z = dxde * dydz - dyde * dxdz;
1511 jeta[k][j][i].
x = dydz * dzdc - dzdz * dydc;
1512 jeta[k][j][i].
y = -dxdz * dzdc + dzdz * dxdc;
1513 jeta[k][j][i].
z = dxdz * dydc - dydz * dxdc;
1515 jzet[k][j][i].
x = dydc * dzde - dzdc * dyde;
1516 jzet[k][j][i].
y = -dxdc * dzde + dzdc * dxde;
1517 jzet[k][j][i].
z = dxdc * dyde - dydc * dxde;
1519 jaj[k][j][i] = dxdc * jcsi[k][j][i].
x + dydc * jcsi[k][j][i].
y + dzdc * jcsi[k][j][i].
z;
1520 if (PetscAbsScalar(jaj[k][j][i]) > 1e-12) {
1521 jaj[k][j][i] = 1.0 / jaj[k][j][i];
1527 ierr = DMDAVecRestoreArrayRead(user->
fda, user->
lCenty, ¢y_const); CHKERRQ(ierr);
1528 ierr = DMDAVecRestoreArray(user->
fda, user->
JCsi, &jcsi); CHKERRQ(ierr);
1529 ierr = DMDAVecRestoreArray(user->
fda, user->
JEta, &jeta); CHKERRQ(ierr);
1530 ierr = DMDAVecRestoreArray(user->
fda, user->
JZet, &jzet); CHKERRQ(ierr);
1531 ierr = DMDAVecRestoreArray(user->
da, user->
JAj, &jaj); CHKERRQ(ierr);
1534 ierr = VecAssemblyBegin(user->
JCsi); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
JCsi); CHKERRQ(ierr);
1535 ierr = VecAssemblyBegin(user->
JEta); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
JEta); CHKERRQ(ierr);
1536 ierr = VecAssemblyBegin(user->
JZet); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
JZet); CHKERRQ(ierr);
1537 ierr = VecAssemblyBegin(user->
JAj); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
JAj); CHKERRQ(ierr);
1546 PetscFunctionReturn(0);
1557 PetscErrorCode ierr;
1562 const Cmpnts ***centz_const;
1563 Cmpnts ***kcsi, ***keta, ***kzet;
1565 PetscReal dxdc, dydc, dzdc, dxde, dyde, dzde, dxdz, dydz, dzdz;
1567 PetscFunctionBeginUser;
1573 ierr = DMDAGetLocalInfo(user->
da, &info); CHKERRQ(ierr);
1574 PetscInt xs = info.xs, xe = info.xs + info.xm, mx = info.mx;
1575 PetscInt ys = info.ys, ye = info.ys + info.ym, my = info.my;
1576 PetscInt zs = info.zs, ze = info.zs + info.zm, mz = info.mz;
1577 PetscInt lxs = xs; PetscInt lxe = xe;
1578 PetscInt lys = ys; PetscInt lye = ye;
1581 if (xs==0) lxs = xs+1;
1582 if (ys==0) lys = ys+1;
1584 if (xe==mx) lxe=xe-1;
1585 if (ye==my) lye=ye-1;
1586 if (ze==mz) lze=ze-1;
1589 ierr = DMGetCoordinatesLocal(user->
da, &lCoords); CHKERRQ(ierr);
1590 ierr = DMDAVecGetArrayRead(user->
fda, lCoords, &coor); CHKERRQ(ierr);
1591 ierr = DMDAVecGetArray(user->
fda, user->
Centz, ¢z); CHKERRQ(ierr);
1594 for (PetscInt k = zs; k < PetscMin(ze, mz - 1); k++) {
1595 for (PetscInt j = PetscMax(ys, 1); j < PetscMin(ye, my - 1); j++) {
1596 for (PetscInt i = PetscMax(xs, 1); i < PetscMin(xe, mx - 1); i++) {
1597 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);
1598 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);
1599 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);
1627 ierr = DMDAVecRestoreArrayRead(user->
fda, lCoords, &coor); CHKERRQ(ierr);
1628 ierr = DMDAVecRestoreArray(user->
fda, user->
Centz, ¢z); CHKERRQ(ierr);
1639 ierr = DMDAVecGetArrayRead(user->
fda, user->
lCentz, ¢z_const); CHKERRQ(ierr);
1640 ierr = DMDAVecGetArray(user->
fda, user->
KCsi, &kcsi); CHKERRQ(ierr);
1641 ierr = DMDAVecGetArray(user->
fda, user->
KEta, &keta); CHKERRQ(ierr);
1642 ierr = DMDAVecGetArray(user->
fda, user->
KZet, &kzet); CHKERRQ(ierr);
1643 ierr = DMDAVecGetArray(user->
da, user->
KAj, &kaj); CHKERRQ(ierr);
1646 for (PetscInt k=zs; k<lze; k++) {
1647 for (PetscInt j=lys; j<lye; j++) {
1648 for (PetscInt i=lxs; i<lxe; i++) {
1653 dxdc = centz_const[k][j][i+1].
x - centz_const[k][j][i].
x;
1654 dydc = centz_const[k][j][i+1].
y - centz_const[k][j][i].
y;
1655 dzdc = centz_const[k][j][i+1].
z - centz_const[k][j][i].
z;
1658 dxdc = centz_const[k][j][i].
x - centz_const[k][j][i-1].
x;
1659 dydc = centz_const[k][j][i].
y - centz_const[k][j][i-1].
y;
1660 dzdc = centz_const[k][j][i].
z - centz_const[k][j][i-1].
z;
1662 dxdc = 0.5 * (centz_const[k][j][i+1].
x - centz_const[k][j][i-1].
x);
1663 dydc = 0.5 * (centz_const[k][j][i+1].
y - centz_const[k][j][i-1].
y);
1664 dzdc = 0.5 * (centz_const[k][j][i+1].
z - centz_const[k][j][i-1].
z);
1670 dxde = centz_const[k][j+1][i].
x - centz_const[k][j][i].
x;
1671 dyde = centz_const[k][j+1][i].
y - centz_const[k][j][i].
y;
1672 dzde = centz_const[k][j+1][i].
z - centz_const[k][j][i].
z;
1675 dxde = centz_const[k][j][i].
x - centz_const[k][j-1][i].
x;
1676 dyde = centz_const[k][j][i].
y - centz_const[k][j-1][i].
y;
1677 dzde = centz_const[k][j][i].
z - centz_const[k][j-1][i].
z;
1679 dxde = 0.5 * (centz_const[k][j+1][i].
x - centz_const[k][j-1][i].
x);
1680 dyde = 0.5 * (centz_const[k][j+1][i].
y - centz_const[k][j-1][i].
y);
1681 dzde = 0.5 * (centz_const[k][j+1][i].
z - centz_const[k][j-1][i].
z);
1687 dxdz = centz_const[k+1][j][i].
x - centz_const[k][j][i].
x;
1688 dydz = centz_const[k+1][j][i].
y - centz_const[k][j][i].
y;
1689 dzdz = centz_const[k+1][j][i].
z - centz_const[k][j][i].
z;
1692 dxdz = centz_const[k][j][i].
x - centz_const[k-1][j][i].
x;
1693 dydz = centz_const[k][j][i].
y - centz_const[k-1][j][i].
y;
1694 dzdz = centz_const[k][j][i].
z - centz_const[k-1][j][i].
z;
1696 dxdz = 0.5 * (centz_const[k+1][j][i].
x - centz_const[k-1][j][i].
x);
1697 dydz = 0.5 * (centz_const[k+1][j][i].
y - centz_const[k-1][j][i].
y);
1698 dzdz = 0.5 * (centz_const[k+1][j][i].
z - centz_const[k-1][j][i].
z);
1702 kcsi[k][j][i].
x = dyde * dzdz - dzde * dydz;
1703 kcsi[k][j][i].
y = -dxde * dzdz + dzde * dxdz;
1704 kcsi[k][j][i].
z = dxde * dydz - dyde * dxdz;
1706 keta[k][j][i].
x = dydz * dzdc - dzdz * dydc;
1707 keta[k][j][i].
y = -dxdz * dzdc + dzdz * dxdc;
1708 keta[k][j][i].
z = dxdz * dydc - dydz * dxdc;
1710 kzet[k][j][i].
x = dydc * dzde - dzdc * dyde;
1711 kzet[k][j][i].
y = -dxdc * dzde + dzdc * dxde;
1712 kzet[k][j][i].
z = dxdc * dyde - dydc * dxde;
1714 kaj[k][j][i] = dxdc * kcsi[k][j][i].
x + dydc * kcsi[k][j][i].
y + dzdc * kcsi[k][j][i].
z;
1715 if (PetscAbsScalar(kaj[k][j][i]) > 1e-12) {
1716 kaj[k][j][i] = 1.0 / kaj[k][j][i];
1722 ierr = DMDAVecRestoreArrayRead(user->
fda, user->
lCentz, ¢z_const); CHKERRQ(ierr);
1723 ierr = DMDAVecRestoreArray(user->
fda, user->
KCsi, &kcsi); CHKERRQ(ierr);
1724 ierr = DMDAVecRestoreArray(user->
fda, user->
KEta, &keta); CHKERRQ(ierr);
1725 ierr = DMDAVecRestoreArray(user->
fda, user->
KZet, &kzet); CHKERRQ(ierr);
1726 ierr = DMDAVecRestoreArray(user->
da, user->
KAj, &kaj); CHKERRQ(ierr);
1729 ierr = VecAssemblyBegin(user->
KCsi); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
KCsi); CHKERRQ(ierr);
1730 ierr = VecAssemblyBegin(user->
KEta); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
KEta); CHKERRQ(ierr);
1731 ierr = VecAssemblyBegin(user->
KZet); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
KZet); CHKERRQ(ierr);
1732 ierr = VecAssemblyBegin(user->
KAj); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
KAj); CHKERRQ(ierr);
1741 PetscFunctionReturn(0);
1771 DM da = user->
da, fda = user->
fda;
1772 DMDALocalInfo info = user->
info;
1773 PetscInt xs = info.xs, xe = info.xs + info.xm;
1774 PetscInt ys = info.ys, ye = info.ys + info.ym;
1775 PetscInt zs = info.zs, ze = info.zs + info.zm;
1776 PetscInt mx = info.mx, my = info.my, mz = info.mz;
1777 PetscInt lxs, lys, lzs, lxe, lye, lze;
1780 PetscReal ***div, ***aj;
1781 Cmpnts ***csi, ***eta, ***zet;
1784 PetscFunctionBeginUser;
1792 if (xs == 0) lxs = xs + 1;
1793 if (ys == 0) lys = ys + 1;
1794 if (zs == 0) lzs = zs + 1;
1796 if (xe == mx) lxe = xe - 1;
1797 if (ye == my) lye = ye - 1;
1798 if (ze == mz) lze = ze - 1;
1800 DMDAVecGetArray(fda, user->
lCsi, &csi);
1801 DMDAVecGetArray(fda, user->
lEta, &eta);
1802 DMDAVecGetArray(fda, user->
lZet, &zet);
1803 DMDAVecGetArray(da, user->
lAj, &aj);
1805 VecDuplicate(user->
P, &Div);
1807 DMDAVecGetArray(da, Div, &div);
1809 for (k = lzs; k < lze; k++) {
1810 for (j = lys; j < lye; j++) {
1811 for (i = lxs; i < lxe; i++) {
1812 PetscReal divergence = (csi[k][j][i].
x - csi[k][j][i-1].
x +
1813 eta[k][j][i].
x - eta[k][j-1][i].
x +
1814 zet[k][j][i].
x - zet[k-1][j][i].
x +
1815 csi[k][j][i].
y - csi[k][j][i-1].
y +
1816 eta[k][j][i].
y - eta[k][j-1][i].
y +
1817 zet[k][j][i].
y - zet[k-1][j][i].
y +
1818 csi[k][j][i].
z - csi[k][j][i-1].
z +
1819 eta[k][j][i].
z - eta[k][j-1][i].
z +
1820 zet[k][j][i].
z - zet[k-1][j][i].
z) * aj[k][j][i];
1821 div[k][j][i] = fabs(divergence);
1826 DMDAVecRestoreArray(da, Div, &div);
1828 PetscInt MaxFlatIndex = -1;
1829 VecMax(Div, &MaxFlatIndex, &maxdiv);
1830 LOG_ALLOW(
GLOBAL,
LOG_INFO,
"The Maximum Metric Divergence is %e at flat index %" PetscInt_FMT
".\n",maxdiv,MaxFlatIndex);
1832 for (k=zs; k<ze; k++) {
1833 for (j=ys; j<ye; j++) {
1834 for (i=xs; i<xe; i++) {
1835 if (
Gidx(i,j,k,user) == MaxFlatIndex) {
1836 LOG_ALLOW(
GLOBAL,
LOG_INFO,
"The Maximum Metric Divergence(%e) is at location [%d][%d][%d]. \n", maxdiv,(
int)k,(
int)j,(
int)i);
1843 DMDAVecRestoreArray(fda, user->
lCsi, &csi);
1844 DMDAVecRestoreArray(fda, user->
lEta, &eta);
1845 DMDAVecRestoreArray(fda, user->
lZet, &zet);
1846 DMDAVecRestoreArray(da, user->
lAj, &aj);
1852 PetscFunctionReturn(0);
1864 DMDALocalInfo info = user->
info;
1865 PetscInt xs = info.xs, xe = info.xs + info.xm;
1866 PetscInt ys = info.ys, ye = info.ys + info.ym;
1867 PetscInt zs = info.zs, ze = info.zs + info.zm;
1870 PetscFunctionBeginUser;
1874 PetscReal CsiMax, EtaMax, ZetMax;
1875 PetscReal ICsiMax, IEtaMax, IZetMax;
1876 PetscReal JCsiMax, JEtaMax, JZetMax;
1877 PetscReal KCsiMax, KEtaMax, KZetMax;
1878 PetscReal AjMax, IAjMax, JAjMax, KAjMax;
1880 PetscInt CsiMaxArg, EtaMaxArg, ZetMaxArg;
1881 PetscInt ICsiMaxArg, IEtaMaxArg, IZetMaxArg;
1882 PetscInt JCsiMaxArg, JEtaMaxArg, JZetMaxArg;
1883 PetscInt KCsiMaxArg, KEtaMaxArg, KZetMaxArg;
1884 PetscInt AjMaxArg, IAjMaxArg, JAjMaxArg, KAjMaxArg;
1887 VecMax(user->
lCsi,&CsiMaxArg,&CsiMax);
1888 VecMax(user->
lEta,&EtaMaxArg,&EtaMax);
1889 VecMax(user->
lZet,&ZetMaxArg,&ZetMax);
1891 VecMax(user->
lICsi,&ICsiMaxArg,&ICsiMax);
1892 VecMax(user->
lIEta,&IEtaMaxArg,&IEtaMax);
1893 VecMax(user->
lIZet,&IZetMaxArg,&IZetMax);
1895 VecMax(user->
lJCsi,&JCsiMaxArg,&JCsiMax);
1896 VecMax(user->
lJEta,&JEtaMaxArg,&JEtaMax);
1897 VecMax(user->
lJZet,&JZetMaxArg,&JZetMax);
1899 VecMax(user->
lKCsi,&KCsiMaxArg,&KCsiMax);
1900 VecMax(user->
lKEta,&KEtaMaxArg,&KEtaMax);
1901 VecMax(user->
lKZet,&KZetMaxArg,&KZetMax);
1903 VecMax(user->
lAj,&AjMaxArg,&AjMax);
1904 VecMax(user->
lIAj,&IAjMaxArg,&IAjMax);
1905 VecMax(user->
lJAj,&JAjMaxArg,&JAjMax);
1906 VecMax(user->
lKAj,&KAjMaxArg,&KAjMax);
1908 VecMax(user->
lAj,&AjMaxArg,&AjMax);
1909 VecMax(user->
lIAj,&IAjMaxArg,&IAjMax);
1910 VecMax(user->
lJAj,&JAjMaxArg,&JAjMax);
1911 VecMax(user->
lKAj,&KAjMaxArg,&KAjMax);
1915 LOG_ALLOW(
GLOBAL,
LOG_INFO,
"The Max Metric Values are: CsiMax = %le, EtaMax = %le, ZetMax = %le.\n",CsiMax,EtaMax,ZetMax);
1916 LOG_ALLOW(
GLOBAL,
LOG_INFO,
"The Max Metric Values are: ICsiMax = %le, IEtaMax = %le, IZetMax = %le.\n",ICsiMax,IEtaMax,IZetMax);
1917 LOG_ALLOW(
GLOBAL,
LOG_INFO,
"The Max Metric Values are: JCsiMax = %le, JEtaMax = %le, JZetMax = %le.\n",JCsiMax,JEtaMax,JZetMax);
1918 LOG_ALLOW(
GLOBAL,
LOG_INFO,
"The Max Metric Values are: KCsiMax = %le, KEtaMax = %le, KZetMax = %le.\n",KCsiMax,KEtaMax,KZetMax);
1919 LOG_ALLOW(
GLOBAL,
LOG_INFO,
"The Max Volumes(Inverse) are: Aj = %le, IAj = %le, JAj = %le, KAj = %le.\n",AjMax,IAjMax,JAjMax,KAjMax);
1921 for (k=zs; k<ze; k++) {
1922 for (j=ys; j<ye; j++) {
1923 for (i=xs; i<xe; i++) {
1924 if (
Gidx(i,j,k,user) == CsiMaxArg) {
1927 if (
Gidx(i,j,k,user) == EtaMaxArg) {
1930 if (
Gidx(i,j,k,user) == ZetMaxArg) {
1933 if (
Gidx(i,j,k,user) == ICsiMaxArg) {
1936 if (
Gidx(i,j,k,user) == IEtaMaxArg) {
1939 if (
Gidx(i,j,k,user) == IZetMaxArg) {
1942 if (
Gidx(i,j,k,user) == JCsiMaxArg) {
1945 if (
Gidx(i,j,k,user) == JEtaMaxArg) {
1948 if (
Gidx(i,j,k,user) == JZetMaxArg) {
1951 if (
Gidx(i,j,k,user) == KCsiMaxArg) {
1954 if (
Gidx(i,j,k,user) == KEtaMaxArg) {
1957 if (
Gidx(i,j,k,user) == KZetMaxArg) {
1960 if (
Gidx(i,j,k,user) == AjMaxArg) {
1963 if (
Gidx(i,j,k,user) == IAjMaxArg) {
1966 if (
Gidx(i,j,k,user) == JAjMaxArg) {
1969 if (
Gidx(i,j,k,user) == KAjMaxArg) {
1984 PetscFunctionReturn(0);