108 PetscInt i,PetscInt j,PetscInt k,
109 PetscReal xi,PetscReal eta,PetscReal zta,
110 PetscReal J[3][3], PetscReal *detJ)
114 PetscFunctionBeginUser;
121 PetscReal dN_dXi[8], dN_dEta[8], dN_dZta[8];
122 for (PetscInt c=0;c<8;++c) {
123 PetscReal sx = (c & 1) ? 1.0 : -1.0;
124 PetscReal sy = (c & 2) ? 1.0 : -1.0;
125 PetscReal sz = (c & 4) ? 1.0 : -1.0;
126 dN_dXi [c] = 0.125 * sx * ( (c&2?eta:1-eta) ) * ( (c&4?zta:1-zta) );
127 dN_dEta[c] = 0.125 * sy * ( (c&1?xi :1-xi ) ) * ( (c&4?zta:1-zta) );
128 dN_dZta[c] = 0.125 * sz * ( (c&1?xi :1-xi ) ) * ( (c&2?eta:1-eta) );
132 PetscReal x_xi=0,y_xi=0,z_xi=0,
133 x_eta=0,y_eta=0,z_eta=0,
134 x_zta=0,y_zta=0,z_zta=0;
135 for (PetscInt c=0;c<8;++c) {
136 x_xi += dN_dXi [c]*V[c].
x; y_xi += dN_dXi [c]*V[c].
y; z_xi += dN_dXi [c]*V[c].
z;
137 x_eta += dN_dEta[c]*V[c].
x; y_eta += dN_dEta[c]*V[c].
y; z_eta += dN_dEta[c]*V[c].
z;
138 x_zta += dN_dZta[c]*V[c].
x; y_zta += dN_dZta[c]*V[c].
y; z_zta += dN_dZta[c]*V[c].
z;
141 J[0][0]=x_xi; J[0][1]=x_eta; J[0][2]=x_zta;
142 J[1][0]=y_xi; J[1][1]=y_eta; J[1][2]=y_zta;
143 J[2][0]=z_xi; J[2][1]=z_eta; J[2][2]=z_zta;
146 *detJ = x_xi*(y_eta*z_zta - y_zta*z_eta)
147 - x_eta*(y_xi*z_zta - y_zta*z_xi)
148 + x_zta*(y_xi*z_eta - y_eta*z_xi);
153 PetscFunctionReturn(0);
395 DMDALocalInfo info = user->
info;
396 PetscInt xs = info.xs, xe = info.xs + info.xm;
397 PetscInt ys = info.ys, ye = info.ys + info.ym;
398 PetscInt zs = info.zs, ze = info.zs + info.zm;
399 PetscInt mx = info.mx, my = info.my, mz = info.mz;
400 Cmpnts ***cent, ***lcent, ***gs;
403 PetscFunctionBeginUser;
407 PetscBool has_periodic = PETSC_FALSE;
408 for (
int i = 0; i < 6; i++) {
410 has_periodic = PETSC_TRUE;
418 PetscFunctionReturn(0);
431 ierr = DMDAVecGetArray(user->
fda, user->
Cent, ¢); CHKERRQ(ierr);
432 ierr = DMDAVecGetArray(user->
fda, user->
lCent, &lcent); CHKERRQ(ierr);
433 ierr = DMDAVecGetArray(user->
fda, user->
lGridSpace, &gs); CHKERRQ(ierr);
437 for (PetscInt k=zs; k<ze; k++) {
438 for (PetscInt j=ys; j<ye; j++) {
439 cent[k][j][0] = lcent[k][j][-2];
443 for (PetscInt k=zs; k<ze; k++) {
444 for (PetscInt j=ys; j<ye; j++) {
445 delta = (gs[k][j][1].
x + gs[k][j][-2].
x) / 2.0;
446 cent[k][j][0].
x = cent[k][j][1].
x - delta;
447 cent[k][j][0].
y = cent[k][j][1].
y;
448 cent[k][j][0].
z = cent[k][j][1].
z;
456 for (PetscInt k=zs; k<ze; k++) {
457 for (PetscInt j=ys; j<ye; j++) {
458 cent[k][j][mx-1] = lcent[k][j][mx+1];
462 for (PetscInt k=zs; k<ze; k++) {
463 for (PetscInt j=ys; j<ye; j++) {
464 delta = (gs[k][j][mx-2].
x + gs[k][j][mx+1].
x) / 2.0;
465 cent[k][j][mx-1].
x = cent[k][j][mx-2].
x + delta;
466 cent[k][j][mx-1].
y = cent[k][j][mx-2].
y;
467 cent[k][j][mx-1].
z = cent[k][j][mx-2].
z;
473 ierr = DMDAVecRestoreArray(user->
fda, user->
lGridSpace, &gs); CHKERRQ(ierr);
474 ierr = DMDAVecRestoreArray(user->
fda, user->
lCent, &lcent); CHKERRQ(ierr);
475 ierr = DMDAVecRestoreArray(user->
fda, user->
Cent, ¢); CHKERRQ(ierr);
481 ierr = DMDAVecGetArray(user->
fda, user->
Cent, ¢); CHKERRQ(ierr);
482 ierr = DMDAVecGetArray(user->
fda, user->
lCent, &lcent); CHKERRQ(ierr);
483 ierr = DMDAVecGetArray(user->
fda, user->
lGridSpace, &gs); CHKERRQ(ierr);
487 for (PetscInt k=zs; k<ze; k++) {
488 for (PetscInt i=xs; i<xe; i++) {
489 cent[k][0][i] = lcent[k][-2][i];
493 for (PetscInt k=zs; k<ze; k++) {
494 for (PetscInt i=xs; i<xe; i++) {
495 delta = (gs[k][1][i].
y + gs[k][-2][i].
y) / 2.0;
496 cent[k][0][i].
x = cent[k][1][i].
x;
497 cent[k][0][i].
y = cent[k][1][i].
y - delta;
498 cent[k][0][i].
z = cent[k][1][i].
z;
506 for (PetscInt k=zs; k<ze; k++) {
507 for (PetscInt i=xs; i<xe; i++) {
508 cent[k][my-1][i] = lcent[k][my+1][i];
512 for (PetscInt k=zs; k<ze; k++) {
513 for (PetscInt i=xs; i<xe; i++) {
514 delta = (gs[k][my-2][i].
y + gs[k][my+1][i].
y) / 2.0;
515 cent[k][my-1][i].
x = cent[k][my-2][i].
x;
516 cent[k][my-1][i].
y = cent[k][my-2][i].
y + delta;
517 cent[k][my-1][i].
z = cent[k][my-2][i].
z;
523 ierr = DMDAVecRestoreArray(user->
fda, user->
lGridSpace, &gs); CHKERRQ(ierr);
524 ierr = DMDAVecRestoreArray(user->
fda, user->
lCent, &lcent); CHKERRQ(ierr);
525 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 j=ys; j<ye; j++) {
540 for (PetscInt i=xs; i<xe; i++) {
541 cent[0][j][i] = lcent[-2][j][i];
545 for (PetscInt j=ys; j<ye; j++) {
546 for (PetscInt i=xs; i<xe; i++) {
547 delta = (gs[1][j][i].
z + gs[-2][j][i].
z) / 2.0;
548 cent[0][j][i].
x = cent[1][j][i].
x;
549 cent[0][j][i].
y = cent[1][j][i].
y;
550 cent[0][j][i].
z = cent[1][j][i].
z - delta;
558 for (PetscInt j=ys; j<ye; j++) {
559 for (PetscInt i=xs; i<xe; i++) {
560 cent[mz-1][j][i] = lcent[mz+1][j][i];
564 for (PetscInt j=ys; j<ye; j++) {
565 for (PetscInt i=xs; i<xe; i++) {
566 delta = (gs[mz-2][j][i].
z + gs[mz+1][j][i].
z) / 2.0;
567 cent[mz-1][j][i].
x = cent[mz-2][j][i].
x;
568 cent[mz-1][j][i].
y = cent[mz-2][j][i].
y;
569 cent[mz-1][j][i].
z = cent[mz-2][j][i].
z + delta;
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);
582 PetscFunctionReturn(0);
642 Cmpnts ***csi_arr, ***eta_arr, ***zet_arr;
643 Cmpnts ***nodal_coords_arr;
644 Vec localCoords_from_dm;
646 PetscFunctionBeginUser;
652 ierr = DMDAGetLocalInfo(user->
fda, &info); CHKERRQ(ierr);
655 ierr = DMGetCoordinatesLocal(user->
da, &localCoords_from_dm); CHKERRQ(ierr);
656 if (!localCoords_from_dm) SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONGSTATE,
"DMGetCoordinatesLocal failed to return a coordinate vector. \n");
657 ierr = DMDAVecGetArrayRead(user->
fda, localCoords_from_dm, &nodal_coords_arr); CHKERRQ(ierr);
660 ierr = DMDAVecGetArray(user->
fda, user->
Csi, &csi_arr); CHKERRQ(ierr);
661 ierr = DMDAVecGetArray(user->
fda, user->
Eta, &eta_arr); CHKERRQ(ierr);
662 ierr = DMDAVecGetArray(user->
fda, user->
Zet, &zet_arr); CHKERRQ(ierr);
665 PetscInt xs = info.xs, xe = info.xs + info.xm;
666 PetscInt ys = info.ys, ye = info.ys + info.ym;
667 PetscInt zs = info.zs, ze = info.zs + info.zm;
670 PetscInt mx = info.mx;
671 PetscInt my = info.my;
672 PetscInt mz = info.mz;
676 PetscInt k_loop_start = (zs == 0) ? zs + 1 : zs;
677 PetscInt j_loop_start = (ys == 0) ? ys + 1 : ys;
678 PetscInt i_loop_start = (xs == 0) ? xs + 1 : xs;
684 for (PetscInt k_node = k_loop_start; k_node < ze; ++k_node) {
685 for (PetscInt j_node = j_loop_start; j_node < ye; ++j_node) {
686 for (PetscInt i_node = xs; i_node < xe; ++i_node) {
688 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);
689 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);
690 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);
691 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);
692 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);
693 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);
695 csi_arr[k_node][j_node][i_node].
x = dy_deta * dz_dzeta - dz_deta * dy_dzeta;
696 csi_arr[k_node][j_node][i_node].
y = dz_deta * dx_dzeta - dx_deta * dz_dzeta;
697 csi_arr[k_node][j_node][i_node].
z = dx_deta * dy_dzeta - dy_deta * dx_dzeta;
703 for (PetscInt k_node = k_loop_start; k_node < ze; ++k_node) {
704 for (PetscInt j_node = ys; j_node < ye; ++j_node) {
705 for (PetscInt i_node = i_loop_start; i_node < xe; ++i_node) {
707 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);
708 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);
709 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);
710 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);
711 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);
712 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);
714 eta_arr[k_node][j_node][i_node].
x = dy_dzeta * dz_dxi - dz_dzeta * dy_dxi;
715 eta_arr[k_node][j_node][i_node].
y = dz_dzeta * dx_dxi - dx_dzeta * dz_dxi;
716 eta_arr[k_node][j_node][i_node].
z = dx_dzeta * dy_dxi - dy_dzeta * dx_dxi;
722 for (PetscInt k_node = zs; k_node < ze; ++k_node) {
723 for (PetscInt j_node = j_loop_start; j_node < ye; ++j_node) {
724 for (PetscInt i_node = i_loop_start; i_node < xe; ++i_node) {
726 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);
727 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);
728 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);
729 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);
730 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);
731 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);
733 zet_arr[k_node][j_node][i_node].
x = dy_dxi * dz_deta - dz_dxi * dy_deta;
734 zet_arr[k_node][j_node][i_node].
y = dz_dxi * dx_deta - dx_dxi * dz_deta;
735 zet_arr[k_node][j_node][i_node].
z = dx_dxi * dy_deta - dy_dxi * dx_deta;
742 PetscInt i_bnd, j_bnd, k_bnd;
746 for (k_bnd = zs; k_bnd < ze; ++k_bnd) {
747 for (j_bnd = ys; j_bnd < ye; ++j_bnd) {
748 if (i_bnd + 1 < mx) {
749 eta_arr[k_bnd][j_bnd][i_bnd] = eta_arr[k_bnd][j_bnd][i_bnd+1];
750 zet_arr[k_bnd][j_bnd][i_bnd] = zet_arr[k_bnd][j_bnd][i_bnd+1];
757 for (k_bnd = zs; k_bnd < ze; ++k_bnd) {
758 for (j_bnd = ys; j_bnd < ye; ++j_bnd) {
759 if (i_bnd - 1 >= 0) {
760 eta_arr[k_bnd][j_bnd][i_bnd] = eta_arr[k_bnd][j_bnd][i_bnd-1];
761 zet_arr[k_bnd][j_bnd][i_bnd] = zet_arr[k_bnd][j_bnd][i_bnd-1];
768 for (k_bnd = zs; k_bnd < ze; ++k_bnd) {
769 for (i_bnd = xs; i_bnd < xe; ++i_bnd) {
770 if (j_bnd + 1 < my) {
771 csi_arr[k_bnd][j_bnd][i_bnd] = csi_arr[k_bnd][j_bnd+1][i_bnd];
772 zet_arr[k_bnd][j_bnd][i_bnd] = zet_arr[k_bnd][j_bnd+1][i_bnd];
779 for (k_bnd = zs; k_bnd < ze; ++k_bnd) {
780 for (i_bnd = xs; i_bnd < xe; ++i_bnd) {
781 if (j_bnd - 1 >= 0) {
782 csi_arr[k_bnd][j_bnd][i_bnd] = csi_arr[k_bnd][j_bnd-1][i_bnd];
783 zet_arr[k_bnd][j_bnd][i_bnd] = zet_arr[k_bnd][j_bnd-1][i_bnd];
790 for (j_bnd = ys; j_bnd < ye; ++j_bnd) {
791 for (i_bnd = xs; i_bnd < xe; ++i_bnd) {
792 if (k_bnd + 1 < mz) {
793 csi_arr[k_bnd][j_bnd][i_bnd] = csi_arr[k_bnd+1][j_bnd][i_bnd];
794 eta_arr[k_bnd][j_bnd][i_bnd] = eta_arr[k_bnd+1][j_bnd][i_bnd];
801 for (j_bnd = ys; j_bnd < ye; ++j_bnd) {
802 for (i_bnd = xs; i_bnd < xe; ++i_bnd) {
803 if (k_bnd - 1 >= 0) {
804 csi_arr[k_bnd][j_bnd][i_bnd] = csi_arr[k_bnd-1][j_bnd][i_bnd];
805 eta_arr[k_bnd][j_bnd][i_bnd] = eta_arr[k_bnd-1][j_bnd][i_bnd];
811 if (info.xs==0 && info.ys==0 && info.zs==0) {
812 PetscReal dot = zet_arr[0][0][0].
z;
817 ierr = DMDAVecRestoreArrayRead(user->
fda, localCoords_from_dm, &nodal_coords_arr); CHKERRQ(ierr);
818 ierr = DMDAVecRestoreArray(user->
fda, user->
Csi, &csi_arr); CHKERRQ(ierr);
819 ierr = DMDAVecRestoreArray(user->
fda, user->
Eta, &eta_arr); CHKERRQ(ierr);
820 ierr = DMDAVecRestoreArray(user->
fda, user->
Zet, &zet_arr); CHKERRQ(ierr);
824 ierr = VecAssemblyBegin(user->
Csi); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
Csi); CHKERRQ(ierr);
825 ierr = VecAssemblyBegin(user->
Eta); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
Eta); CHKERRQ(ierr);
826 ierr = VecAssemblyBegin(user->
Zet); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
Zet); CHKERRQ(ierr);
838 PetscFunctionReturn(0);
854 PetscScalar ***aj_arr;
855 Cmpnts ***nodal_coords_arr;
856 Vec localCoords_from_dm;
858 PetscFunctionBeginUser;
862 ierr = DMGetCoordinatesLocal(user->
da, &localCoords_from_dm); CHKERRQ(ierr);
863 ierr = DMDAVecGetArrayRead(user->
fda, localCoords_from_dm, &nodal_coords_arr); CHKERRQ(ierr);
864 ierr = DMDAGetLocalInfo(user->
da, &info); CHKERRQ(ierr);
865 ierr = DMDAVecGetArray(user->
da, user->
Aj, &aj_arr); CHKERRQ(ierr);
868 PetscInt xs = info.xs, xe = info.xs + info.xm;
869 PetscInt ys = info.ys, ye = info.ys + info.ym;
870 PetscInt zs = info.zs, ze = info.zs + info.zm;
873 PetscInt mx = info.mx;
874 PetscInt my = info.my;
875 PetscInt mz = info.mz;
879 PetscInt k_start_node = (zs == 0) ? zs + 1 : zs;
880 PetscInt j_start_node = (ys == 0) ? ys + 1 : ys;
881 PetscInt i_start_node = (xs == 0) ? xs + 1 : xs;
883 PetscInt k_end_node = (ze == mz) ? ze - 1 : ze;
884 PetscInt j_end_node = (ye == my) ? ye - 1 : ye;
885 PetscInt i_end_node = (xe == mx) ? xe - 1 : xe;
887 for (PetscInt k_node = k_start_node; k_node < k_end_node; ++k_node) {
888 for (PetscInt j_node = j_start_node; j_node < j_end_node; ++j_node) {
889 for (PetscInt i_node = i_start_node; i_node < i_end_node; ++i_node) {
891 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) );
893 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) );
895 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) );
897 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) );
899 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) );
901 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) );
903 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) );
905 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) );
907 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) );
909 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);
910 if (PetscAbsReal(jacobian_det) < 1.0e-18) { SETERRQ(PETSC_COMM_SELF, PETSC_ERR_FLOP_COUNT,
"Jacobian is near zero..."); }
911 aj_arr[k_node][j_node][i_node] = 1.0 / jacobian_det;
918 PetscInt i_bnd, j_bnd, k_bnd;
922 for (k_bnd = zs; k_bnd < ze; ++k_bnd) {
923 for (j_bnd = ys; j_bnd < ye; ++j_bnd) {
924 if (i_bnd + 1 < mx) aj_arr[k_bnd][j_bnd][i_bnd] = aj_arr[k_bnd][j_bnd][i_bnd+1];
930 for (k_bnd = zs; k_bnd < ze; ++k_bnd) {
931 for (j_bnd = ys; j_bnd < ye; ++j_bnd) {
932 if (i_bnd - 1 >= 0) aj_arr[k_bnd][j_bnd][i_bnd] = aj_arr[k_bnd][j_bnd][i_bnd-1];
939 for (k_bnd = zs; k_bnd < ze; ++k_bnd) {
940 for (i_bnd = xs; i_bnd < xe; ++i_bnd) {
941 if (j_bnd + 1 < my) aj_arr[k_bnd][j_bnd][i_bnd] = aj_arr[k_bnd][j_bnd+1][i_bnd];
947 for (k_bnd = zs; k_bnd < ze; ++k_bnd) {
948 for (i_bnd = xs; i_bnd < xe; ++i_bnd) {
949 if (j_bnd - 1 >= 0) aj_arr[k_bnd][j_bnd][i_bnd] = aj_arr[k_bnd][j_bnd-1][i_bnd];
955 for (j_bnd = ys; j_bnd < ye; ++j_bnd) {
956 for (i_bnd = xs; i_bnd < xe; ++i_bnd) {
957 if (k_bnd + 1 < mz) aj_arr[k_bnd][j_bnd][i_bnd] = aj_arr[k_bnd+1][j_bnd][i_bnd];
963 for (j_bnd = ys; j_bnd < ye; ++j_bnd) {
964 for (i_bnd = xs; i_bnd < xe; ++i_bnd) {
965 if (k_bnd - 1 >= 0) aj_arr[k_bnd][j_bnd][i_bnd] = aj_arr[k_bnd-1][j_bnd][i_bnd];
971 ierr = DMDAVecRestoreArrayRead(user->
fda, localCoords_from_dm, &nodal_coords_arr); CHKERRQ(ierr);
972 ierr = DMDAVecRestoreArray(user->
da, user->
Aj, &aj_arr); CHKERRQ(ierr);
976 ierr = VecAssemblyBegin(user->
Aj); CHKERRQ(ierr);
977 ierr = VecAssemblyEnd(user->
Aj); CHKERRQ(ierr);
984 PetscFunctionReturn(0);
1001 PetscReal xcp, ycp, zcp, xcm, ycm, zcm;
1002 PetscInt xs,ys,zs,xe,ye,ze,mx,my,mz;
1004 PetscFunctionBeginUser;
1010 ierr = DMDAGetLocalInfo(user->
da, &info); CHKERRQ(ierr);
1011 ierr = DMGetCoordinatesLocal(user->
da, &lCoords); CHKERRQ(ierr);
1012 ierr = DMDAVecGetArrayRead(user->
fda, lCoords, &coor); CHKERRQ(ierr);
1014 ierr = DMDAVecGetArray(user->
fda, user->
Cent, ¢); CHKERRQ(ierr);
1015 ierr = DMDAVecGetArray(user->
fda, user->
GridSpace, &gs); CHKERRQ(ierr);
1017 xs = info.xs; xe = info.xs + info.xm;
1018 ys = info.ys; ye = info.ys + info.ym;
1019 zs = info.zs; ze = info.zs + info.zm;
1020 mx = info.mx; my = info.my; mz = info.mz;
1022 PetscInt k_start_node = (zs == 0) ? zs + 1 : zs;
1023 PetscInt j_start_node = (ys == 0) ? ys + 1 : ys;
1024 PetscInt i_start_node = (xs == 0) ? xs + 1 : xs;
1026 PetscInt k_end_node = (ze == mz) ? ze - 1 : ze;
1027 PetscInt j_end_node = (ye == my) ? ye - 1 : ye;
1028 PetscInt i_end_node = (xe == mx) ? xe - 1 : xe;
1031 for (PetscInt k=k_start_node; k<k_end_node; k++) {
1032 for (PetscInt j=j_start_node; j<j_end_node; j++) {
1033 for (PetscInt i=i_start_node; i<i_end_node; i++) {
1035 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);
1036 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);
1037 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);
1040 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);
1041 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);
1042 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);
1043 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);
1044 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);
1045 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);
1046 gs[k][j][i].
x = PetscSqrtReal(PetscSqr(xcp-xcm) + PetscSqr(ycp-ycm) + PetscSqr(zcp-zcm));
1049 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);
1050 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);
1051 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);
1052 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);
1053 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);
1054 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);
1055 gs[k][j][i].
y = PetscSqrtReal(PetscSqr(xcp-xcm) + PetscSqr(ycp-ycm) + PetscSqr(zcp-zcm));
1058 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);
1059 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);
1060 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);
1061 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);
1062 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);
1063 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);
1064 gs[k][j][i].
z = PetscSqrtReal(PetscSqr(xcp-xcm) + PetscSqr(ycp-ycm) + PetscSqr(zcp-zcm));
1069 ierr = DMDAVecRestoreArrayRead(user->
fda, lCoords, &coor); CHKERRQ(ierr);
1070 ierr = DMDAVecRestoreArray(user->
fda, user->
Cent, ¢); CHKERRQ(ierr);
1071 ierr = DMDAVecRestoreArray(user->
fda, user->
GridSpace, &gs); CHKERRQ(ierr);
1074 ierr = VecAssemblyBegin(user->
Cent); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
Cent); CHKERRQ(ierr);
1075 ierr = VecAssemblyBegin(user->
GridSpace); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
GridSpace); CHKERRQ(ierr);
1082 ierr = VecAssemblyBegin(user->
Cent); CHKERRQ(ierr);
1083 ierr = VecAssemblyEnd(user->
Cent); CHKERRQ(ierr);
1088 PetscFunctionReturn(0);
1099 PetscErrorCode ierr;
1104 const Cmpnts ***centx_const;
1105 Cmpnts ***icsi, ***ieta, ***izet;
1107 PetscReal dxdc, dydc, dzdc, dxde, dyde, dzde, dxdz, dydz, dzdz;
1109 PetscFunctionBeginUser;
1115 ierr = DMDAGetLocalInfo(user->
da, &info); CHKERRQ(ierr);
1116 PetscInt xs = info.xs, xe = info.xs + info.xm, mx = info.mx;
1117 PetscInt ys = info.ys, ye = info.ys + info.ym, my = info.my;
1118 PetscInt zs = info.zs, ze = info.zs + info.zm, mz = info.mz;
1120 PetscInt lys = ys; PetscInt lye = ye;
1121 PetscInt lzs = zs; PetscInt lze = ze;
1123 if (ys==0) lys = ys+1;
1124 if (zs==0) lzs = zs+1;
1126 if (xe==mx) lxe=xe-1;
1127 if (ye==my) lye=ye-1;
1128 if (ze==mz) lze=ze-1;
1131 ierr = DMGetCoordinatesLocal(user->
da, &lCoords); CHKERRQ(ierr);
1132 ierr = DMDAVecGetArrayRead(user->
fda, lCoords, &coor); CHKERRQ(ierr);
1133 ierr = DMDAVecGetArray(user->
fda, user->
Centx, ¢x); CHKERRQ(ierr);
1140 for (PetscInt k = PetscMax(zs, 1); k < PetscMin(ze, mz - 1); k++) {
1141 for (PetscInt j = PetscMax(ys, 1); j < PetscMin(ye, my - 1); j++) {
1142 for (PetscInt i = xs; i < PetscMin(xe, mx - 1); i++) {
1151 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);
1152 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);
1153 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);
1184 ierr = DMDAVecRestoreArrayRead(user->
fda, lCoords, &coor); CHKERRQ(ierr);
1185 ierr = DMDAVecRestoreArray(user->
fda, user->
Centx, ¢x); CHKERRQ(ierr);
1190 const char *face_centers[] = {
"Centx"};
1197 ierr = DMDAVecGetArrayRead(user->
fda, user->
lCentx, ¢x_const); CHKERRQ(ierr);
1198 ierr = DMDAVecGetArray(user->
fda, user->
ICsi, &icsi); CHKERRQ(ierr);
1199 ierr = DMDAVecGetArray(user->
fda, user->
IEta, &ieta); CHKERRQ(ierr);
1200 ierr = DMDAVecGetArray(user->
fda, user->
IZet, &izet); CHKERRQ(ierr);
1201 ierr = DMDAVecGetArray(user->
da, user->
IAj, &iaj); CHKERRQ(ierr);
1204 for (PetscInt k=lzs; k<lze; k++) {
1205 for (PetscInt j=lys; j<lye; j++) {
1206 for (PetscInt i=xs; i<lxe; i++) {
1211 dxdc = centx_const[k][j][i+1].
x - centx_const[k][j][i].
x;
1212 dydc = centx_const[k][j][i+1].
y - centx_const[k][j][i].
y;
1213 dzdc = centx_const[k][j][i+1].
z - centx_const[k][j][i].
z;
1216 dxdc = centx_const[k][j][i].
x - centx_const[k][j][i-1].
x;
1217 dydc = centx_const[k][j][i].
y - centx_const[k][j][i-1].
y;
1218 dzdc = centx_const[k][j][i].
z - centx_const[k][j][i-1].
z;
1220 dxdc = 0.5 * (centx_const[k][j][i+1].
x - centx_const[k][j][i-1].
x);
1221 dydc = 0.5 * (centx_const[k][j][i+1].
y - centx_const[k][j][i-1].
y);
1222 dzdc = 0.5 * (centx_const[k][j][i+1].
z - centx_const[k][j][i-1].
z);
1228 dxde = centx_const[k][j+1][i].
x - centx_const[k][j][i].
x;
1229 dyde = centx_const[k][j+1][i].
y - centx_const[k][j][i].
y;
1230 dzde = centx_const[k][j+1][i].
z - centx_const[k][j][i].
z;
1233 dxde = centx_const[k][j][i].
x - centx_const[k][j-1][i].
x;
1234 dyde = centx_const[k][j][i].
y - centx_const[k][j-1][i].
y;
1235 dzde = centx_const[k][j][i].
z - centx_const[k][j-1][i].
z;
1237 dxde = 0.5 * (centx_const[k][j+1][i].
x - centx_const[k][j-1][i].
x);
1238 dyde = 0.5 * (centx_const[k][j+1][i].
y - centx_const[k][j-1][i].
y);
1239 dzde = 0.5 * (centx_const[k][j+1][i].
z - centx_const[k][j-1][i].
z);
1245 dxdz = centx_const[k+1][j][i].
x - centx_const[k][j][i].
x;
1246 dydz = centx_const[k+1][j][i].
y - centx_const[k][j][i].
y;
1247 dzdz = centx_const[k+1][j][i].
z - centx_const[k][j][i].
z;
1250 dxdz = centx_const[k][j][i].
x - centx_const[k-1][j][i].
x;
1251 dydz = centx_const[k][j][i].
y - centx_const[k-1][j][i].
y;
1252 dzdz = centx_const[k][j][i].
z - centx_const[k-1][j][i].
z;
1254 dxdz = 0.5 * (centx_const[k+1][j][i].
x - centx_const[k-1][j][i].
x);
1255 dydz = 0.5 * (centx_const[k+1][j][i].
y - centx_const[k-1][j][i].
y);
1256 dzdz = 0.5 * (centx_const[k+1][j][i].
z - centx_const[k-1][j][i].
z);
1260 icsi[k][j][i].
x = dyde * dzdz - dzde * dydz;
1261 icsi[k][j][i].
y = -dxde * dzdz + dzde * dxdz;
1262 icsi[k][j][i].
z = dxde * dydz - dyde * dxdz;
1264 ieta[k][j][i].
x = dydz * dzdc - dzdz * dydc;
1265 ieta[k][j][i].
y = -dxdz * dzdc + dzdz * dxdc;
1266 ieta[k][j][i].
z = dxdz * dydc - dydz * dxdc;
1268 izet[k][j][i].
x = dydc * dzde - dzdc * dyde;
1269 izet[k][j][i].
y = -dxdc * dzde + dzdc * dxde;
1270 izet[k][j][i].
z = dxdc * dyde - dydc * dxde;
1272 iaj[k][j][i] = dxdc * icsi[k][j][i].
x + dydc * icsi[k][j][i].
y + dzdc * icsi[k][j][i].
z;
1273 if (PetscAbsScalar(iaj[k][j][i]) > 1e-12) {
1274 iaj[k][j][i] = 1.0 / iaj[k][j][i];
1280 ierr = DMDAVecRestoreArrayRead(user->
fda, user->
lCentx, ¢x_const); CHKERRQ(ierr);
1281 ierr = DMDAVecRestoreArray(user->
fda, user->
ICsi, &icsi); CHKERRQ(ierr);
1282 ierr = DMDAVecRestoreArray(user->
fda, user->
IEta, &ieta); CHKERRQ(ierr);
1283 ierr = DMDAVecRestoreArray(user->
fda, user->
IZet, &izet); CHKERRQ(ierr);
1284 ierr = DMDAVecRestoreArray(user->
da, user->
IAj, &iaj); CHKERRQ(ierr);
1287 ierr = VecAssemblyBegin(user->
ICsi); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
ICsi); CHKERRQ(ierr);
1288 ierr = VecAssemblyBegin(user->
IEta); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
IEta); CHKERRQ(ierr);
1289 ierr = VecAssemblyBegin(user->
IZet); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
IZet); CHKERRQ(ierr);
1290 ierr = VecAssemblyBegin(user->
IAj); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
IAj); CHKERRQ(ierr);
1299 PetscFunctionReturn(0);
1310 PetscErrorCode ierr;
1315 const Cmpnts ***centy_const;
1316 Cmpnts ***jcsi, ***jeta, ***jzet;
1318 PetscReal dxdc, dydc, dzdc, dxde, dyde, dzde, dxdz, dydz, dzdz;
1320 PetscFunctionBeginUser;
1326 ierr = DMDAGetLocalInfo(user->
da, &info); CHKERRQ(ierr);
1327 PetscInt xs = info.xs, xe = info.xs + info.xm, mx = info.mx;
1328 PetscInt ys = info.ys, ye = info.ys + info.ym, my = info.my;
1329 PetscInt zs = info.zs, ze = info.zs + info.zm, mz = info.mz;
1330 PetscInt lxs = xs; PetscInt lxe = xe;
1332 PetscInt lzs = zs; PetscInt lze = ze;
1334 if (xs==0) lxs = xs+1;
1335 if (zs==0) lzs = zs+1;
1337 if (xe==mx) lxe=xe-1;
1338 if (ye==my) lye=ye-1;
1339 if (ze==mz) lze=ze-1;
1342 ierr = DMGetCoordinatesLocal(user->
da, &lCoords); CHKERRQ(ierr);
1343 ierr = DMDAVecGetArrayRead(user->
fda, lCoords, &coor); CHKERRQ(ierr);
1344 ierr = DMDAVecGetArray(user->
fda, user->
Centy, ¢y); CHKERRQ(ierr);
1347 for (PetscInt k = PetscMax(zs, 1); k < PetscMin(ze, mz - 1); k++) {
1348 for (PetscInt j = ys; j < PetscMin(ye, my - 1); j++) {
1349 for (PetscInt i = PetscMax(xs, 1); i < PetscMin(xe, mx - 1); i++) {
1350 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);
1351 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);
1352 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);
1380 ierr = DMDAVecRestoreArrayRead(user->
fda, lCoords, &coor); CHKERRQ(ierr);
1381 ierr = DMDAVecRestoreArray(user->
fda, user->
Centy, ¢y); CHKERRQ(ierr);
1385 const char *face_centers[] = {
"Centy"};
1392 ierr = DMDAVecGetArrayRead(user->
fda, user->
lCenty, ¢y_const); CHKERRQ(ierr);
1393 ierr = DMDAVecGetArray(user->
fda, user->
JCsi, &jcsi); CHKERRQ(ierr);
1394 ierr = DMDAVecGetArray(user->
fda, user->
JEta, &jeta); CHKERRQ(ierr);
1395 ierr = DMDAVecGetArray(user->
fda, user->
JZet, &jzet); CHKERRQ(ierr);
1396 ierr = DMDAVecGetArray(user->
da, user->
JAj, &jaj); CHKERRQ(ierr);
1399 for (PetscInt k=lzs; k<lze; k++) {
1400 for (PetscInt j=ys; j<lye; j++) {
1401 for (PetscInt i=lxs; i<lxe; i++) {
1406 dxdc = centy_const[k][j][i+1].
x - centy_const[k][j][i].
x;
1407 dydc = centy_const[k][j][i+1].
y - centy_const[k][j][i].
y;
1408 dzdc = centy_const[k][j][i+1].
z - centy_const[k][j][i].
z;
1411 dxdc = centy_const[k][j][i].
x - centy_const[k][j][i-1].
x;
1412 dydc = centy_const[k][j][i].
y - centy_const[k][j][i-1].
y;
1413 dzdc = centy_const[k][j][i].
z - centy_const[k][j][i-1].
z;
1415 dxdc = 0.5 * (centy_const[k][j][i+1].
x - centy_const[k][j][i-1].
x);
1416 dydc = 0.5 * (centy_const[k][j][i+1].
y - centy_const[k][j][i-1].
y);
1417 dzdc = 0.5 * (centy_const[k][j][i+1].
z - centy_const[k][j][i-1].
z);
1423 dxde = centy_const[k][j+1][i].
x - centy_const[k][j][i].
x;
1424 dyde = centy_const[k][j+1][i].
y - centy_const[k][j][i].
y;
1425 dzde = centy_const[k][j+1][i].
z - centy_const[k][j][i].
z;
1428 dxde = centy_const[k][j][i].
x - centy_const[k][j-1][i].
x;
1429 dyde = centy_const[k][j][i].
y - centy_const[k][j-1][i].
y;
1430 dzde = centy_const[k][j][i].
z - centy_const[k][j-1][i].
z;
1432 dxde = 0.5 * (centy_const[k][j+1][i].
x - centy_const[k][j-1][i].
x);
1433 dyde = 0.5 * (centy_const[k][j+1][i].
y - centy_const[k][j-1][i].
y);
1434 dzde = 0.5 * (centy_const[k][j+1][i].
z - centy_const[k][j-1][i].
z);
1440 dxdz = centy_const[k+1][j][i].
x - centy_const[k][j][i].
x;
1441 dydz = centy_const[k+1][j][i].
y - centy_const[k][j][i].
y;
1442 dzdz = centy_const[k+1][j][i].
z - centy_const[k][j][i].
z;
1445 dxdz = centy_const[k][j][i].
x - centy_const[k-1][j][i].
x;
1446 dydz = centy_const[k][j][i].
y - centy_const[k-1][j][i].
y;
1447 dzdz = centy_const[k][j][i].
z - centy_const[k-1][j][i].
z;
1449 dxdz = 0.5 * (centy_const[k+1][j][i].
x - centy_const[k-1][j][i].
x);
1450 dydz = 0.5 * (centy_const[k+1][j][i].
y - centy_const[k-1][j][i].
y);
1451 dzdz = 0.5 * (centy_const[k+1][j][i].
z - centy_const[k-1][j][i].
z);
1455 jcsi[k][j][i].
x = dyde * dzdz - dzde * dydz;
1456 jcsi[k][j][i].
y = -dxde * dzdz + dzde * dxdz;
1457 jcsi[k][j][i].
z = dxde * dydz - dyde * dxdz;
1459 jeta[k][j][i].
x = dydz * dzdc - dzdz * dydc;
1460 jeta[k][j][i].
y = -dxdz * dzdc + dzdz * dxdc;
1461 jeta[k][j][i].
z = dxdz * dydc - dydz * dxdc;
1463 jzet[k][j][i].
x = dydc * dzde - dzdc * dyde;
1464 jzet[k][j][i].
y = -dxdc * dzde + dzdc * dxde;
1465 jzet[k][j][i].
z = dxdc * dyde - dydc * dxde;
1467 jaj[k][j][i] = dxdc * jcsi[k][j][i].
x + dydc * jcsi[k][j][i].
y + dzdc * jcsi[k][j][i].
z;
1468 if (PetscAbsScalar(jaj[k][j][i]) > 1e-12) {
1469 jaj[k][j][i] = 1.0 / jaj[k][j][i];
1475 ierr = DMDAVecRestoreArrayRead(user->
fda, user->
lCenty, ¢y_const); CHKERRQ(ierr);
1476 ierr = DMDAVecRestoreArray(user->
fda, user->
JCsi, &jcsi); CHKERRQ(ierr);
1477 ierr = DMDAVecRestoreArray(user->
fda, user->
JEta, &jeta); CHKERRQ(ierr);
1478 ierr = DMDAVecRestoreArray(user->
fda, user->
JZet, &jzet); CHKERRQ(ierr);
1479 ierr = DMDAVecRestoreArray(user->
da, user->
JAj, &jaj); CHKERRQ(ierr);
1482 ierr = VecAssemblyBegin(user->
JCsi); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
JCsi); CHKERRQ(ierr);
1483 ierr = VecAssemblyBegin(user->
JEta); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
JEta); CHKERRQ(ierr);
1484 ierr = VecAssemblyBegin(user->
JZet); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
JZet); CHKERRQ(ierr);
1485 ierr = VecAssemblyBegin(user->
JAj); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
JAj); CHKERRQ(ierr);
1494 PetscFunctionReturn(0);
1505 PetscErrorCode ierr;
1510 const Cmpnts ***centz_const;
1511 Cmpnts ***kcsi, ***keta, ***kzet;
1513 PetscReal dxdc, dydc, dzdc, dxde, dyde, dzde, dxdz, dydz, dzdz;
1515 PetscFunctionBeginUser;
1521 ierr = DMDAGetLocalInfo(user->
da, &info); CHKERRQ(ierr);
1522 PetscInt xs = info.xs, xe = info.xs + info.xm, mx = info.mx;
1523 PetscInt ys = info.ys, ye = info.ys + info.ym, my = info.my;
1524 PetscInt zs = info.zs, ze = info.zs + info.zm, mz = info.mz;
1525 PetscInt lxs = xs; PetscInt lxe = xe;
1526 PetscInt lys = ys; PetscInt lye = ye;
1529 if (xs==0) lxs = xs+1;
1530 if (ys==0) lys = ys+1;
1532 if (xe==mx) lxe=xe-1;
1533 if (ye==my) lye=ye-1;
1534 if (ze==mz) lze=ze-1;
1537 ierr = DMGetCoordinatesLocal(user->
da, &lCoords); CHKERRQ(ierr);
1538 ierr = DMDAVecGetArrayRead(user->
fda, lCoords, &coor); CHKERRQ(ierr);
1539 ierr = DMDAVecGetArray(user->
fda, user->
Centz, ¢z); CHKERRQ(ierr);
1542 for (PetscInt k = zs; k < PetscMin(ze, mz - 1); k++) {
1543 for (PetscInt j = PetscMax(ys, 1); j < PetscMin(ye, my - 1); j++) {
1544 for (PetscInt i = PetscMax(xs, 1); i < PetscMin(xe, mx - 1); i++) {
1545 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);
1546 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);
1547 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);
1575 ierr = DMDAVecRestoreArrayRead(user->
fda, lCoords, &coor); CHKERRQ(ierr);
1576 ierr = DMDAVecRestoreArray(user->
fda, user->
Centz, ¢z); CHKERRQ(ierr);
1580 const char *face_centers[] = {
"Centz"};
1587 ierr = DMDAVecGetArrayRead(user->
fda, user->
lCentz, ¢z_const); CHKERRQ(ierr);
1588 ierr = DMDAVecGetArray(user->
fda, user->
KCsi, &kcsi); CHKERRQ(ierr);
1589 ierr = DMDAVecGetArray(user->
fda, user->
KEta, &keta); CHKERRQ(ierr);
1590 ierr = DMDAVecGetArray(user->
fda, user->
KZet, &kzet); CHKERRQ(ierr);
1591 ierr = DMDAVecGetArray(user->
da, user->
KAj, &kaj); CHKERRQ(ierr);
1594 for (PetscInt k=zs; k<lze; k++) {
1595 for (PetscInt j=lys; j<lye; j++) {
1596 for (PetscInt i=lxs; i<lxe; i++) {
1601 dxdc = centz_const[k][j][i+1].
x - centz_const[k][j][i].
x;
1602 dydc = centz_const[k][j][i+1].
y - centz_const[k][j][i].
y;
1603 dzdc = centz_const[k][j][i+1].
z - centz_const[k][j][i].
z;
1606 dxdc = centz_const[k][j][i].
x - centz_const[k][j][i-1].
x;
1607 dydc = centz_const[k][j][i].
y - centz_const[k][j][i-1].
y;
1608 dzdc = centz_const[k][j][i].
z - centz_const[k][j][i-1].
z;
1610 dxdc = 0.5 * (centz_const[k][j][i+1].
x - centz_const[k][j][i-1].
x);
1611 dydc = 0.5 * (centz_const[k][j][i+1].
y - centz_const[k][j][i-1].
y);
1612 dzdc = 0.5 * (centz_const[k][j][i+1].
z - centz_const[k][j][i-1].
z);
1618 dxde = centz_const[k][j+1][i].
x - centz_const[k][j][i].
x;
1619 dyde = centz_const[k][j+1][i].
y - centz_const[k][j][i].
y;
1620 dzde = centz_const[k][j+1][i].
z - centz_const[k][j][i].
z;
1623 dxde = centz_const[k][j][i].
x - centz_const[k][j-1][i].
x;
1624 dyde = centz_const[k][j][i].
y - centz_const[k][j-1][i].
y;
1625 dzde = centz_const[k][j][i].
z - centz_const[k][j-1][i].
z;
1627 dxde = 0.5 * (centz_const[k][j+1][i].
x - centz_const[k][j-1][i].
x);
1628 dyde = 0.5 * (centz_const[k][j+1][i].
y - centz_const[k][j-1][i].
y);
1629 dzde = 0.5 * (centz_const[k][j+1][i].
z - centz_const[k][j-1][i].
z);
1635 dxdz = centz_const[k+1][j][i].
x - centz_const[k][j][i].
x;
1636 dydz = centz_const[k+1][j][i].
y - centz_const[k][j][i].
y;
1637 dzdz = centz_const[k+1][j][i].
z - centz_const[k][j][i].
z;
1640 dxdz = centz_const[k][j][i].
x - centz_const[k-1][j][i].
x;
1641 dydz = centz_const[k][j][i].
y - centz_const[k-1][j][i].
y;
1642 dzdz = centz_const[k][j][i].
z - centz_const[k-1][j][i].
z;
1644 dxdz = 0.5 * (centz_const[k+1][j][i].
x - centz_const[k-1][j][i].
x);
1645 dydz = 0.5 * (centz_const[k+1][j][i].
y - centz_const[k-1][j][i].
y);
1646 dzdz = 0.5 * (centz_const[k+1][j][i].
z - centz_const[k-1][j][i].
z);
1650 kcsi[k][j][i].
x = dyde * dzdz - dzde * dydz;
1651 kcsi[k][j][i].
y = -dxde * dzdz + dzde * dxdz;
1652 kcsi[k][j][i].
z = dxde * dydz - dyde * dxdz;
1654 keta[k][j][i].
x = dydz * dzdc - dzdz * dydc;
1655 keta[k][j][i].
y = -dxdz * dzdc + dzdz * dxdc;
1656 keta[k][j][i].
z = dxdz * dydc - dydz * dxdc;
1658 kzet[k][j][i].
x = dydc * dzde - dzdc * dyde;
1659 kzet[k][j][i].
y = -dxdc * dzde + dzdc * dxde;
1660 kzet[k][j][i].
z = dxdc * dyde - dydc * dxde;
1662 kaj[k][j][i] = dxdc * kcsi[k][j][i].
x + dydc * kcsi[k][j][i].
y + dzdc * kcsi[k][j][i].
z;
1663 if (PetscAbsScalar(kaj[k][j][i]) > 1e-12) {
1664 kaj[k][j][i] = 1.0 / kaj[k][j][i];
1670 ierr = DMDAVecRestoreArrayRead(user->
fda, user->
lCentz, ¢z_const); CHKERRQ(ierr);
1671 ierr = DMDAVecRestoreArray(user->
fda, user->
KCsi, &kcsi); CHKERRQ(ierr);
1672 ierr = DMDAVecRestoreArray(user->
fda, user->
KEta, &keta); CHKERRQ(ierr);
1673 ierr = DMDAVecRestoreArray(user->
fda, user->
KZet, &kzet); CHKERRQ(ierr);
1674 ierr = DMDAVecRestoreArray(user->
da, user->
KAj, &kaj); CHKERRQ(ierr);
1677 ierr = VecAssemblyBegin(user->
KCsi); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
KCsi); CHKERRQ(ierr);
1678 ierr = VecAssemblyBegin(user->
KEta); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
KEta); CHKERRQ(ierr);
1679 ierr = VecAssemblyBegin(user->
KZet); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
KZet); CHKERRQ(ierr);
1680 ierr = VecAssemblyBegin(user->
KAj); CHKERRQ(ierr); ierr = VecAssemblyEnd(user->
KAj); CHKERRQ(ierr);
1689 PetscFunctionReturn(0);
1720 DM da = user->
da, fda = user->
fda;
1721 DMDALocalInfo info = user->
info;
1722 PetscInt xs = info.xs, xe = info.xs + info.xm;
1723 PetscInt ys = info.ys, ye = info.ys + info.ym;
1724 PetscInt zs = info.zs, ze = info.zs + info.zm;
1725 PetscInt mx = info.mx, my = info.my, mz = info.mz;
1726 PetscInt lxs, lys, lzs, lxe, lye, lze;
1729 PetscReal ***div, ***aj;
1730 Cmpnts ***csi, ***eta, ***zet;
1733 PetscFunctionBeginUser;
1741 if (xs == 0) lxs = xs + 1;
1742 if (ys == 0) lys = ys + 1;
1743 if (zs == 0) lzs = zs + 1;
1745 if (xe == mx) lxe = xe - 1;
1746 if (ye == my) lye = ye - 1;
1747 if (ze == mz) lze = ze - 1;
1749 DMDAVecGetArray(fda, user->
lCsi, &csi);
1750 DMDAVecGetArray(fda, user->
lEta, &eta);
1751 DMDAVecGetArray(fda, user->
lZet, &zet);
1752 DMDAVecGetArray(da, user->
lAj, &aj);
1754 VecDuplicate(user->
P, &Div);
1756 DMDAVecGetArray(da, Div, &div);
1758 for (k = lzs; k < lze; k++) {
1759 for (j = lys; j < lye; j++) {
1760 for (i = lxs; i < lxe; i++) {
1761 PetscReal divergence = (csi[k][j][i].
x - csi[k][j][i-1].
x +
1762 eta[k][j][i].
x - eta[k][j-1][i].
x +
1763 zet[k][j][i].
x - zet[k-1][j][i].
x +
1764 csi[k][j][i].
y - csi[k][j][i-1].
y +
1765 eta[k][j][i].
y - eta[k][j-1][i].
y +
1766 zet[k][j][i].
y - zet[k-1][j][i].
y +
1767 csi[k][j][i].
z - csi[k][j][i-1].
z +
1768 eta[k][j][i].
z - eta[k][j-1][i].
z +
1769 zet[k][j][i].
z - zet[k-1][j][i].
z) * aj[k][j][i];
1770 div[k][j][i] = fabs(divergence);
1775 DMDAVecRestoreArray(da, Div, &div);
1777 PetscInt MaxFlatIndex = -1;
1778 VecMax(Div, &MaxFlatIndex, &maxdiv);
1779 LOG_ALLOW(
GLOBAL,
LOG_INFO,
"The Maximum Metric Divergence is %e at flat index %" PetscInt_FMT
".\n",maxdiv,MaxFlatIndex);
1781 for (k=zs; k<ze; k++) {
1782 for (j=ys; j<ye; j++) {
1783 for (i=xs; i<xe; i++) {
1784 if (
Gidx(i,j,k,user) == MaxFlatIndex) {
1785 LOG_ALLOW(
GLOBAL,
LOG_INFO,
"The Maximum Metric Divergence(%e) is at location [%d][%d][%d]. \n", maxdiv,(
int)k,(
int)j,(
int)i);
1792 DMDAVecRestoreArray(fda, user->
lCsi, &csi);
1793 DMDAVecRestoreArray(fda, user->
lEta, &eta);
1794 DMDAVecRestoreArray(fda, user->
lZet, &zet);
1795 DMDAVecRestoreArray(da, user->
lAj, &aj);
1801 PetscFunctionReturn(0);
1813 DMDALocalInfo info = user->
info;
1814 PetscInt xs = info.xs, xe = info.xs + info.xm;
1815 PetscInt ys = info.ys, ye = info.ys + info.ym;
1816 PetscInt zs = info.zs, ze = info.zs + info.zm;
1819 PetscFunctionBeginUser;
1823 PetscReal CsiMax, EtaMax, ZetMax;
1824 PetscReal ICsiMax, IEtaMax, IZetMax;
1825 PetscReal JCsiMax, JEtaMax, JZetMax;
1826 PetscReal KCsiMax, KEtaMax, KZetMax;
1827 PetscReal AjMax, IAjMax, JAjMax, KAjMax;
1829 PetscInt CsiMaxArg, EtaMaxArg, ZetMaxArg;
1830 PetscInt ICsiMaxArg, IEtaMaxArg, IZetMaxArg;
1831 PetscInt JCsiMaxArg, JEtaMaxArg, JZetMaxArg;
1832 PetscInt KCsiMaxArg, KEtaMaxArg, KZetMaxArg;
1833 PetscInt AjMaxArg, IAjMaxArg, JAjMaxArg, KAjMaxArg;
1836 VecMax(user->
lCsi,&CsiMaxArg,&CsiMax);
1837 VecMax(user->
lEta,&EtaMaxArg,&EtaMax);
1838 VecMax(user->
lZet,&ZetMaxArg,&ZetMax);
1840 VecMax(user->
lICsi,&ICsiMaxArg,&ICsiMax);
1841 VecMax(user->
lIEta,&IEtaMaxArg,&IEtaMax);
1842 VecMax(user->
lIZet,&IZetMaxArg,&IZetMax);
1844 VecMax(user->
lJCsi,&JCsiMaxArg,&JCsiMax);
1845 VecMax(user->
lJEta,&JEtaMaxArg,&JEtaMax);
1846 VecMax(user->
lJZet,&JZetMaxArg,&JZetMax);
1848 VecMax(user->
lKCsi,&KCsiMaxArg,&KCsiMax);
1849 VecMax(user->
lKEta,&KEtaMaxArg,&KEtaMax);
1850 VecMax(user->
lKZet,&KZetMaxArg,&KZetMax);
1852 VecMax(user->
lAj,&AjMaxArg,&AjMax);
1853 VecMax(user->
lIAj,&IAjMaxArg,&IAjMax);
1854 VecMax(user->
lJAj,&JAjMaxArg,&JAjMax);
1855 VecMax(user->
lKAj,&KAjMaxArg,&KAjMax);
1857 VecMax(user->
lAj,&AjMaxArg,&AjMax);
1858 VecMax(user->
lIAj,&IAjMaxArg,&IAjMax);
1859 VecMax(user->
lJAj,&JAjMaxArg,&JAjMax);
1860 VecMax(user->
lKAj,&KAjMaxArg,&KAjMax);
1864 LOG_ALLOW(
GLOBAL,
LOG_INFO,
"The Max Metric Values are: CsiMax = %le, EtaMax = %le, ZetMax = %le.\n",CsiMax,EtaMax,ZetMax);
1865 LOG_ALLOW(
GLOBAL,
LOG_INFO,
"The Max Metric Values are: ICsiMax = %le, IEtaMax = %le, IZetMax = %le.\n",ICsiMax,IEtaMax,IZetMax);
1866 LOG_ALLOW(
GLOBAL,
LOG_INFO,
"The Max Metric Values are: JCsiMax = %le, JEtaMax = %le, JZetMax = %le.\n",JCsiMax,JEtaMax,JZetMax);
1867 LOG_ALLOW(
GLOBAL,
LOG_INFO,
"The Max Metric Values are: KCsiMax = %le, KEtaMax = %le, KZetMax = %le.\n",KCsiMax,KEtaMax,KZetMax);
1868 LOG_ALLOW(
GLOBAL,
LOG_INFO,
"The Max Volumes(Inverse) are: Aj = %le, IAj = %le, JAj = %le, KAj = %le.\n",AjMax,IAjMax,JAjMax,KAjMax);
1870 for (k=zs; k<ze; k++) {
1871 for (j=ys; j<ye; j++) {
1872 for (i=xs; i<xe; i++) {
1873 if (
Gidx(i,j,k,user) == CsiMaxArg) {
1876 if (
Gidx(i,j,k,user) == EtaMaxArg) {
1879 if (
Gidx(i,j,k,user) == ZetMaxArg) {
1882 if (
Gidx(i,j,k,user) == ICsiMaxArg) {
1885 if (
Gidx(i,j,k,user) == IEtaMaxArg) {
1888 if (
Gidx(i,j,k,user) == IZetMaxArg) {
1891 if (
Gidx(i,j,k,user) == JCsiMaxArg) {
1894 if (
Gidx(i,j,k,user) == JEtaMaxArg) {
1897 if (
Gidx(i,j,k,user) == JZetMaxArg) {
1900 if (
Gidx(i,j,k,user) == KCsiMaxArg) {
1903 if (
Gidx(i,j,k,user) == KEtaMaxArg) {
1906 if (
Gidx(i,j,k,user) == KZetMaxArg) {
1909 if (
Gidx(i,j,k,user) == AjMaxArg) {
1912 if (
Gidx(i,j,k,user) == IAjMaxArg) {
1915 if (
Gidx(i,j,k,user) == JAjMaxArg) {
1918 if (
Gidx(i,j,k,user) == KAjMaxArg) {
1933 PetscFunctionReturn(0);