@@ -145,7 +145,7 @@ LaplacePetsc::LaplacePetsc(Options* opt, const CELL_LOC loc, Mesh* mesh_in,
145145 if (fourth_order) {
146146 // first and last 2*localmesh-LocalNz entries are the edge x-values that (may) have 'off-diagonal' components (i.e. on another processor)
147147 if (localmesh->firstX () && localmesh->lastX ()) {
148- for (int i = 0 ; i < localmesh->LocalNz ; i++) {
148+ for (int i = localmesh-> zstart ; i <= localmesh->zend ; i++) {
149149 d_nnz[i] = 15 ;
150150 d_nnz[localN - 1 - i] = 15 ;
151151 o_nnz[i] = 0 ;
@@ -158,7 +158,7 @@ LaplacePetsc::LaplacePetsc(Options* opt, const CELL_LOC loc, Mesh* mesh_in,
158158 o_nnz[localN - 1 - i] = 0 ;
159159 }
160160 } else if (localmesh->firstX ()) {
161- for (int i = 0 ; i < localmesh->LocalNz ; i++) {
161+ for (int i = localmesh-> zstart ; i <= localmesh->zend ; i++) {
162162 d_nnz[i] = 15 ;
163163 d_nnz[localN - 1 - i] = 15 ;
164164 o_nnz[i] = 0 ;
@@ -171,7 +171,7 @@ LaplacePetsc::LaplacePetsc(Options* opt, const CELL_LOC loc, Mesh* mesh_in,
171171 o_nnz[localN - 1 - i] = 5 ;
172172 }
173173 } else if (localmesh->lastX ()) {
174- for (int i = 0 ; i < localmesh->LocalNz ; i++) {
174+ for (int i = localmesh-> zstart ; i <= localmesh->zend ; i++) {
175175 d_nnz[i] = 15 ;
176176 d_nnz[localN - 1 - i] = 15 ;
177177 o_nnz[i] = 10 ;
@@ -184,7 +184,7 @@ LaplacePetsc::LaplacePetsc(Options* opt, const CELL_LOC loc, Mesh* mesh_in,
184184 o_nnz[localN - 1 - i] = 0 ;
185185 }
186186 } else {
187- for (int i = 0 ; i < localmesh->LocalNz ; i++) {
187+ for (int i = localmesh-> zstart ; i <= localmesh->zend ; i++) {
188188 d_nnz[i] = 15 ;
189189 d_nnz[localN - 1 - i] = 15 ;
190190 o_nnz[i] = 10 ;
@@ -215,28 +215,28 @@ LaplacePetsc::LaplacePetsc(Options* opt, const CELL_LOC loc, Mesh* mesh_in,
215215 } else {
216216 // first and last localmesh->LocalNz entries are the edge x-values that (may) have 'off-diagonal' components (i.e. on another processor)
217217 if (localmesh->firstX () && localmesh->lastX ()) {
218- for (int i = 0 ; i < localmesh->LocalNz ; i++) {
218+ for (int i = localmesh-> zstart ; i <= localmesh->zend ; i++) {
219219 d_nnz[i] = 6 ;
220220 d_nnz[localN - 1 - i] = 6 ;
221221 o_nnz[i] = 0 ;
222222 o_nnz[localN - 1 - i] = 0 ;
223223 }
224224 } else if (localmesh->firstX ()) {
225- for (int i = 0 ; i < localmesh->LocalNz ; i++) {
225+ for (int i = localmesh-> zstart ; i <= localmesh->zend ; i++) {
226226 d_nnz[i] = 6 ;
227227 d_nnz[localN - 1 - i] = 6 ;
228228 o_nnz[i] = 0 ;
229229 o_nnz[localN - 1 - i] = 3 ;
230230 }
231231 } else if (localmesh->lastX ()) {
232- for (int i = 0 ; i < localmesh->LocalNz ; i++) {
232+ for (int i = localmesh-> zstart ; i <= localmesh->zend ; i++) {
233233 d_nnz[i] = 6 ;
234234 d_nnz[localN - 1 - i] = 6 ;
235235 o_nnz[i] = 3 ;
236236 o_nnz[localN - 1 - i] = 0 ;
237237 }
238238 } else {
239- for (int i = 0 ; i < localmesh->LocalNz ; i++) {
239+ for (int i = localmesh-> zstart ; i <= localmesh->zend ; i++) {
240240 d_nnz[i] = 6 ;
241241 d_nnz[localN - 1 - i] = 6 ;
242242 o_nnz[i] = 3 ;
@@ -377,7 +377,7 @@ FieldPerp LaplacePetsc::solve(const FieldPerp& b, const FieldPerp& x0) {
377377 // Set the values for the inner boundary region
378378 if (localmesh->firstX ()) {
379379 for (int x = 0 ; x < localmesh->xstart ; x++) {
380- for (int z = 0 ; z < localmesh->LocalNz ; z++) {
380+ for (int z = localmesh-> zstart ; z <= localmesh->zend ; z++) {
381381 PetscScalar val; // Value of element to be set in the matrix
382382 // If Neumann Boundary Conditions are set.
383383 if (isInnerBoundaryFlagSet (INVERT_AC_GRAD)) {
@@ -461,7 +461,7 @@ FieldPerp LaplacePetsc::solve(const FieldPerp& b, const FieldPerp& x0) {
461461
462462 // Set the values for the main domain
463463 for (int x = localmesh->xstart ; x <= localmesh->xend ; x++) {
464- for (int z = 0 ; z < localmesh->LocalNz ; z++) {
464+ for (int z = localmesh-> zstart ; z <= localmesh->zend ; z++) {
465465 // NOTE: Only A0 is the A from setCoefA ()
466466 BoutReal A0, A1, A2, A3, A4, A5;
467467 A0 = A (x, y, z);
@@ -639,7 +639,7 @@ FieldPerp LaplacePetsc::solve(const FieldPerp& b, const FieldPerp& x0) {
639639 // Set the values for the outer boundary region
640640 if (localmesh->lastX ()) {
641641 for (int x = localmesh->xend + 1 ; x < localmesh->LocalNx ; x++) {
642- for (int z = 0 ; z < localmesh->LocalNz ; z++) {
642+ for (int z = localmesh-> zstart ; z <= localmesh->zend ; z++) {
643643 // Set Diagonal Values to 1
644644 PetscScalar val = 1 ;
645645 Element (i, x, z, 0 , 0 , val, MatA);
@@ -829,7 +829,7 @@ FieldPerp LaplacePetsc::solve(const FieldPerp& b, const FieldPerp& x0) {
829829 // Set the inner boundary values
830830 if (localmesh->firstX ()) {
831831 for (int x = 0 ; x < localmesh->xstart ; x++) {
832- for (int z = 0 ; z < localmesh->LocalNz ; z++) {
832+ for (int z = localmesh-> zstart ; z <= localmesh->zend ; z++) {
833833 PetscScalar val = 0 ;
834834 VecGetValues (xs, 1 , &i, &val);
835835 sol[x][z] = val;
@@ -840,7 +840,7 @@ FieldPerp LaplacePetsc::solve(const FieldPerp& b, const FieldPerp& x0) {
840840
841841 // Set the main domain values
842842 for (int x = localmesh->xstart ; x <= localmesh->xend ; x++) {
843- for (int z = 0 ; z < localmesh->LocalNz ; z++) {
843+ for (int z = localmesh-> zstart ; z <= localmesh->zend ; z++) {
844844 PetscScalar val = 0 ;
845845 VecGetValues (xs, 1 , &i, &val);
846846 sol[x][z] = val;
@@ -851,7 +851,7 @@ FieldPerp LaplacePetsc::solve(const FieldPerp& b, const FieldPerp& x0) {
851851 // Set the outer boundary values
852852 if (localmesh->lastX ()) {
853853 for (int x = localmesh->xend + 1 ; x < localmesh->LocalNx ; x++) {
854- for (int z = 0 ; z < localmesh->LocalNz ; z++) {
854+ for (int z = localmesh-> zstart ; z <= localmesh->zend ; z++) {
855855 PetscScalar val = 0 ;
856856 VecGetValues (xs, 1 , &i, &val);
857857 sol[x][z] = val;
@@ -1076,7 +1076,7 @@ void LaplacePetsc::vecToField(Vec xs, FieldPerp& f) {
10761076 int i = Istart;
10771077 if (localmesh->firstX ()) {
10781078 for (int x = 0 ; x < localmesh->xstart ; x++) {
1079- for (int z = 0 ; z < localmesh->LocalNz ; z++) {
1079+ for (int z = localmesh-> zstart ; z <= localmesh->zend ; z++) {
10801080 PetscScalar val;
10811081 VecGetValues (xs, 1 , &i, &val);
10821082 f[x][z] = val;
@@ -1086,7 +1086,7 @@ void LaplacePetsc::vecToField(Vec xs, FieldPerp& f) {
10861086 }
10871087
10881088 for (int x = localmesh->xstart ; x <= localmesh->xend ; x++) {
1089- for (int z = 0 ; z < localmesh->LocalNz ; z++) {
1089+ for (int z = localmesh-> zstart ; z <= localmesh->zend ; z++) {
10901090 PetscScalar val;
10911091 VecGetValues (xs, 1 , &i, &val);
10921092 f[x][z] = val;
@@ -1096,7 +1096,7 @@ void LaplacePetsc::vecToField(Vec xs, FieldPerp& f) {
10961096
10971097 if (localmesh->lastX ()) {
10981098 for (int x = localmesh->xend + 1 ; x < localmesh->LocalNx ; x++) {
1099- for (int z = 0 ; z < localmesh->LocalNz ; z++) {
1099+ for (int z = localmesh-> zstart ; z <= localmesh->zend ; z++) {
11001100 PetscScalar val;
11011101 VecGetValues (xs, 1 , &i, &val);
11021102 f[x][z] = val;
@@ -1113,7 +1113,7 @@ void LaplacePetsc::fieldToVec(const FieldPerp& f, Vec bs) {
11131113 int i = Istart;
11141114 if (localmesh->firstX ()) {
11151115 for (int x = 0 ; x < localmesh->xstart ; x++) {
1116- for (int z = 0 ; z < localmesh->LocalNz ; z++) {
1116+ for (int z = localmesh-> zstart ; z <= localmesh->zend ; z++) {
11171117 PetscScalar val = f[x][z];
11181118 VecSetValues (bs, 1 , &i, &val, INSERT_VALUES);
11191119 i++; // Increment row in Petsc matrix
@@ -1122,7 +1122,7 @@ void LaplacePetsc::fieldToVec(const FieldPerp& f, Vec bs) {
11221122 }
11231123
11241124 for (int x = localmesh->xstart ; x <= localmesh->xend ; x++) {
1125- for (int z = 0 ; z < localmesh->LocalNz ; z++) {
1125+ for (int z = localmesh-> zstart ; z <= localmesh->zend ; z++) {
11261126 PetscScalar val = f[x][z];
11271127 VecSetValues (bs, 1 , &i, &val, INSERT_VALUES);
11281128 i++; // Increment row in Petsc matrix
@@ -1131,7 +1131,7 @@ void LaplacePetsc::fieldToVec(const FieldPerp& f, Vec bs) {
11311131
11321132 if (localmesh->lastX ()) {
11331133 for (int x = localmesh->xend + 1 ; x < localmesh->LocalNx ; x++) {
1134- for (int z = 0 ; z < localmesh->LocalNz ; z++) {
1134+ for (int z = localmesh-> zstart ; z <= localmesh->zend ; z++) {
11351135 PetscScalar val = f[x][z];
11361136 VecSetValues (bs, 1 , &i, &val, INSERT_VALUES);
11371137 i++; // Increment row in Petsc matrix
0 commit comments