12 #ifdef LIBMESH_HAVE_PETSC
36 PetscFunctionBeginUser;
40 ierr = DMDACreate2d(comm,
54 ierr = DMSetFromOptions(da);
62 ierr = TSCreate(comm, ts);
64 ierr = TSSetProblemType(*ts, TS_NONLINEAR);
66 ierr = TSSetType(*ts, TSBEULER);
68 ierr = TSSetDM(*ts, da);
70 ierr = DMDestroy(&da);
80 PetscFunctionReturn(0);
88 PetscFunctionBeginUser;
89 ierr = TSDestroy(&ts);
91 PetscFunctionReturn(0);
102 #if !PETSC_VERSION_LESS_THAN(3, 8, 0)
103 PetscInt current_step;
107 PetscFunctionBeginUser;
109 ierr = TSGetDM(ts, &da);
112 #if !PETSC_VERSION_LESS_THAN(3, 7, 0)
113 PetscOptionsSetValue(NULL,
"-ts_monitor", NULL);
114 PetscOptionsSetValue(NULL,
"-snes_monitor", NULL);
115 PetscOptionsSetValue(NULL,
"-ksp_monitor", NULL);
117 PetscOptionsSetValue(
"-ts_monitor", NULL);
118 PetscOptionsSetValue(
"-snes_monitor", NULL);
119 PetscOptionsSetValue(
"-ksp_monitor", NULL);
123 ierr = TSSetExactFinalTime(ts, TS_EXACTFINALTIME_STEPOVER);
126 ierr = TSSetSolution(ts, u);
128 ierr = TSSetTimeStep(ts, dt);
130 ierr = TSSetTime(ts, time - dt);
132 #if !PETSC_VERSION_LESS_THAN(3, 8, 0)
133 ierr = TSGetStepNumber(ts, ¤t_step);
135 ierr = TSSetMaxSteps(ts, current_step + 1);
138 SETERRQ(PetscObjectComm((PetscObject)ts), PETSC_ERR_SUP,
"Require PETSc-3.8.x or higher ");
143 ierr = TSSetFromOptions(ts);
148 ierr = TSSolve(ts, u);
150 PetscFunctionReturn(0);
162 PetscInt i, j, Mx, My, xs, ys, xm, ym;
163 PetscReal hx, hy, sx, sy;
164 PetscScalar u, uxx, uyy, **uarray, **f, **udot;
168 PetscFunctionBeginUser;
169 ierr = PetscObjectGetComm((PetscObject)ts, &comm);
170 ierr = TSGetDM(ts, &da);
172 ierr = DMGetLocalVector(da, &localU);
174 ierr = DMDAGetInfo(da,
190 hx = 1.0 / (PetscReal)(Mx - 1);
191 sx = 1.0 / (hx * hx);
192 hy = 1.0 / (PetscReal)(My - 1);
193 sy = 1.0 / (hy * hy);
201 ierr = DMGlobalToLocalBegin(da, U, INSERT_VALUES, localU);
203 ierr = DMGlobalToLocalEnd(da, U, INSERT_VALUES, localU);
207 ierr = DMDAVecGetArrayRead(da, localU, &uarray);
209 ierr = DMDAVecGetArray(da, F, &f);
211 ierr = DMDAVecGetArray(da, Udot, &udot);
215 ierr = DMDAGetCorners(da, &xs, &ys, NULL, &xm, &ym, NULL);
219 for (j = ys; j < ys + ym; j++)
221 for (i = xs; i < xs + xm; i++)
224 if (i == 0 || j == 0 || i == Mx - 1 || j == My - 1)
228 f[j][i] = uarray[j][i];
232 if (i == 0 && j == 0)
234 f[j][i] = uarray[j][i] - uarray[j + 1][i + 1];
236 else if (i == Mx - 1 && j == 0)
238 f[j][i] = uarray[j][i] - uarray[j + 1][i - 1];
240 else if (i == 0 && j == My - 1)
242 f[j][i] = uarray[j][i] - uarray[j - 1][i + 1];
244 else if (i == Mx - 1 && j == My - 1)
246 f[j][i] = uarray[j][i] - uarray[j - 1][i - 1];
250 f[j][i] = uarray[j][i] - uarray[j][i + 1];
252 else if (i == Mx - 1)
254 f[j][i] = uarray[j][i] - uarray[j][i - 1];
258 f[j][i] = uarray[j][i] - uarray[j + 1][i];
260 else if (j == My - 1)
262 f[j][i] = uarray[j][i] - uarray[j - 1][i];
270 uxx = (-2.0 * u + uarray[j][i - 1] + uarray[j][i + 1]);
271 uyy = (-2.0 * u + uarray[j - 1][i] + uarray[j + 1][i]);
275 uxx = 2.0 * uxx / 3.0 + (0.5 * (uarray[j - 1][i - 1] + uarray[j - 1][i + 1] +
276 uarray[j + 1][i - 1] + uarray[j + 1][i + 1]) -
279 uyy = 2.0 * uyy / 3.0 + (0.5 * (uarray[j - 1][i - 1] + uarray[j - 1][i + 1] +
280 uarray[j + 1][i - 1] + uarray[j + 1][i + 1]) -
284 f[j][i] = udot[j][i] - (uxx * sx + uyy * sy);
290 ierr = DMDAVecRestoreArrayRead(da, localU, &uarray);
292 ierr = DMDAVecRestoreArray(da, F, &f);
294 ierr = DMDAVecRestoreArray(da, Udot, &udot);
296 ierr = DMRestoreLocalVector(da, &localU);
298 ierr = PetscLogFlops(11.0 * ym * xm);
300 PetscFunctionReturn(0);
310 TS ts, PetscReal , Vec , Vec , PetscReal a, Mat J, Mat Jpre,
void * )
313 PetscInt i, j, Mx, My, xs, ys, xm, ym, nc;
315 MatStencil col[5], row;
316 PetscScalar vals[5], hx, hy, sx, sy;
318 PetscFunctionBeginUser;
319 ierr = TSGetDM(ts, &da);
321 ierr = DMDAGetInfo(da,
336 ierr = DMDAGetCorners(da, &xs, &ys, NULL, &xm, &ym, NULL);
339 hx = 1.0 / (PetscReal)(Mx - 1);
340 sx = 1.0 / (hx * hx);
341 hy = 1.0 / (PetscReal)(My - 1);
342 sy = 1.0 / (hy * hy);
344 for (j = ys; j < ys + ym; j++)
346 for (i = xs; i < xs + xm; i++)
351 if (PETSC_TRUE && (i == 0 || i == Mx - 1 || j == 0 || j == My - 1))
357 else if (PETSC_FALSE && i == 0)
366 else if (PETSC_FALSE && i == Mx - 1)
375 else if (PETSC_FALSE && j == 0)
384 else if (PETSC_FALSE && j == My - 1)
403 vals[nc++] = 2.0 * (sx + sy) + a;
411 ierr = MatSetValuesStencil(Jpre, 1, &row, nc, col, vals, INSERT_VALUES);
415 ierr = MatAssemblyBegin(Jpre, MAT_FINAL_ASSEMBLY);
417 ierr = MatAssemblyEnd(Jpre, MAT_FINAL_ASSEMBLY);
421 ierr = MatAssemblyBegin(J, MAT_FINAL_ASSEMBLY);
423 ierr = MatAssemblyEnd(J, MAT_FINAL_ASSEMBLY);
427 PetscFunctionReturn(0);
437 PetscInt i, j, xs, ys, xm, ym, Mx, My;
439 PetscReal hx, hy, x, y, r;
441 PetscFunctionBeginUser;
442 ierr = TSGetDM(ts, &da);
444 ierr = DMDAGetInfo(da,
460 hx = 1.0 / (PetscReal)(Mx - 1);
461 hy = 1.0 / (PetscReal)(My - 1);
464 ierr = DMDAVecGetArray(da, U, &u);
468 ierr = DMDAGetCorners(da, &xs, &ys, NULL, &xm, &ym, NULL);
472 for (j = ys; j < ys + ym; j++)
475 for (i = xs; i < xs + xm; i++)
478 r = PetscSqrtReal((x - .5) * (x - .5) + (y - .5) * (y - .5));
480 u[j][i] = PetscExpReal(c * r * r * r);
487 ierr = DMDAVecRestoreArray(da, U, &u);
489 PetscFunctionReturn(0);