33 PetscFunctionBeginUser;
37 LibmeshPetscCallQ(DMDACreate2d(comm,
50 LibmeshPetscCallQ(DMSetFromOptions(da));
51 LibmeshPetscCallQ(DMSetUp(da));
56 LibmeshPetscCallQ(TSCreate(comm, ts));
57 LibmeshPetscCallQ(TSSetProblemType(*ts, TS_NONLINEAR));
58 LibmeshPetscCallQ(TSSetType(*ts, TSBEULER));
59 LibmeshPetscCallQ(TSSetDM(*ts, da));
60 LibmeshPetscCallQ(DMDestroy(&da));
61 LibmeshPetscCallQ(TSSetIFunction(*ts, NULL,
FormIFunction,
nullptr));
65 LibmeshPetscCallQ(TSSetIJacobian(*ts, NULL, NULL,
FormIJacobian, NULL));
70 LibmeshPetscCallQ(TSSetTimeStep(*ts, 0.2));
71 LibmeshPetscCallQ(TSSetFromOptions(*ts));
72 PetscFunctionReturn(PETSC_SUCCESS);
89 TS ts, Vec u0, Vec u, PetscReal dt, PetscReal time, PetscBool * converged)
91 TSConvergedReason reason;
92#if !PETSC_VERSION_LESS_THAN(3, 8, 0)
93 PetscInt current_step;
97 PetscFunctionBeginUser;
98 PetscValidHeaderSpecific(ts, TS_CLASSID, 1);
99 PetscValidType(ts, 1);
100 PetscValidHeaderSpecific(u0, VEC_CLASSID, 2);
101 PetscValidType(u0, 2);
102 PetscValidHeaderSpecific(u, VEC_CLASSID, 3);
103 PetscValidType(u, 3);
104#if PETSC_VERSION_LESS_THAN(3, 19, 3)
105 PetscValidPointer(converged, 6);
107 PetscAssertPointer(converged, 6);
110 LibmeshPetscCallQ(TSGetDM(ts, &da));
112#if !PETSC_VERSION_LESS_THAN(3, 7, 0)
113 LibmeshPetscCallQ(PetscOptionsSetValue(NULL,
"-ts_monitor", NULL));
114 LibmeshPetscCallQ(PetscOptionsSetValue(NULL,
"-snes_monitor", NULL));
115 LibmeshPetscCallQ(PetscOptionsSetValue(NULL,
"-ksp_monitor", NULL));
117 LibmeshPetscCallQ(PetscOptionsSetValue(
"-ts_monitor", NULL));
118 LibmeshPetscCallQ(PetscOptionsSetValue(
"-snes_monitor", NULL));
119 LibmeshPetscCallQ(PetscOptionsSetValue(
"-ksp_monitor", NULL));
123 LibmeshPetscCallQ(TSSetExactFinalTime(ts, TS_EXACTFINALTIME_STEPOVER));
125 LibmeshPetscCallQ(VecCopy(u0, u));
127 LibmeshPetscCallQ(TSSetSolution(ts, u));
128 LibmeshPetscCallQ(TSSetTimeStep(ts, dt));
129 LibmeshPetscCallQ(TSSetTime(ts, time - dt));
130#if !PETSC_VERSION_LESS_THAN(3, 8, 0)
131 LibmeshPetscCallQ(TSGetStepNumber(ts, ¤t_step));
132 LibmeshPetscCallQ(TSSetMaxSteps(ts, current_step + 1));
134 SETERRQ(PetscObjectComm((PetscObject)ts), PETSC_ERR_SUP,
"Require PETSc-3.8.x or higher ");
139 LibmeshPetscCallQ(TSSetFromOptions(ts));
143 LibmeshPetscCallQ(TSSetTimeStep(ts, dt));
147 LibmeshPetscCallQ(TSSolve(ts, u));
149 LibmeshPetscCallQ(TSGetConvergedReason(ts, &reason));
150 *converged = reason > 0 ? PETSC_TRUE : PETSC_FALSE;
152 PetscFunctionReturn(PETSC_SUCCESS);
163 PetscInt i, j, Mx, My, xs, ys, xm, ym;
164 PetscReal hx, hy, sx, sy;
165 PetscScalar u, uxx, uyy, **uarray, **
f, **udot;
169 PetscFunctionBeginUser;
170 LibmeshPetscCallQ(PetscObjectGetComm((PetscObject)ts, &comm));
171 LibmeshPetscCallQ(TSGetDM(ts, &da));
172 LibmeshPetscCallQ(DMGetLocalVector(da, &localU));
173 LibmeshPetscCallQ(DMDAGetInfo(da,
188 hx = 1.0 / (PetscReal)(Mx - 1);
189 sx = 1.0 / (hx * hx);
190 hy = 1.0 / (PetscReal)(My - 1);
191 sy = 1.0 / (hy * hy);
199 LibmeshPetscCallQ(DMGlobalToLocalBegin(da, U, INSERT_VALUES, localU));
200 LibmeshPetscCallQ(DMGlobalToLocalEnd(da, U, INSERT_VALUES, localU));
203 LibmeshPetscCallQ(DMDAVecGetArrayRead(da, localU, &uarray));
204 LibmeshPetscCallQ(DMDAVecGetArray(da, F, &
f));
205 LibmeshPetscCallQ(DMDAVecGetArray(da, Udot, &udot));
208 LibmeshPetscCallQ(DMDAGetCorners(da, &xs, &ys, NULL, &xm, &ym, NULL));
211 for (j = ys; j < ys + ym; j++)
213 for (i = xs; i < xs + xm; i++)
216 if (i == 0 || j == 0 || i == Mx - 1 || j == My - 1)
220 f[j][i] = uarray[j][i];
224 if (i == 0 && j == 0)
226 f[j][i] = uarray[j][i] - uarray[j + 1][i + 1];
228 else if (i == Mx - 1 && j == 0)
230 f[j][i] = uarray[j][i] - uarray[j + 1][i - 1];
232 else if (i == 0 && j == My - 1)
234 f[j][i] = uarray[j][i] - uarray[j - 1][i + 1];
236 else if (i == Mx - 1 && j == My - 1)
238 f[j][i] = uarray[j][i] - uarray[j - 1][i - 1];
242 f[j][i] = uarray[j][i] - uarray[j][i + 1];
244 else if (i == Mx - 1)
246 f[j][i] = uarray[j][i] - uarray[j][i - 1];
250 f[j][i] = uarray[j][i] - uarray[j + 1][i];
252 else if (j == My - 1)
254 f[j][i] = uarray[j][i] - uarray[j - 1][i];
262 uxx = (-2.0 * u + uarray[j][i - 1] + uarray[j][i + 1]);
263 uyy = (-2.0 * u + uarray[j - 1][i] + uarray[j + 1][i]);
267 uxx = 2.0 * uxx / 3.0 + (0.5 * (uarray[j - 1][i - 1] + uarray[j - 1][i + 1] +
268 uarray[j + 1][i - 1] + uarray[j + 1][i + 1]) -
271 uyy = 2.0 * uyy / 3.0 + (0.5 * (uarray[j - 1][i - 1] + uarray[j - 1][i + 1] +
272 uarray[j + 1][i - 1] + uarray[j + 1][i + 1]) -
276 f[j][i] = udot[j][i] - (uxx * sx + uyy * sy);
282 LibmeshPetscCallQ(DMDAVecRestoreArrayRead(da, localU, &uarray));
283 LibmeshPetscCallQ(DMDAVecRestoreArray(da, F, &
f));
284 LibmeshPetscCallQ(DMDAVecRestoreArray(da, Udot, &udot));
285 LibmeshPetscCallQ(DMRestoreLocalVector(da, &localU));
286 LibmeshPetscCallQ(PetscLogFlops(11.0 * ym * xm));
287 PetscFunctionReturn(PETSC_SUCCESS);
297 TS ts, PetscReal , Vec , Vec , PetscReal
a, Mat J, Mat Jpre,
void * )
299 PetscInt i, j, Mx, My, xs, ys, xm, ym, nc;
301 MatStencil col[5], row;
302 PetscScalar vals[5], hx, hy, sx, sy;
304 PetscFunctionBeginUser;
305 LibmeshPetscCallQ(TSGetDM(ts, &da));
306 LibmeshPetscCallQ(DMDAGetInfo(da,
320 LibmeshPetscCallQ(DMDAGetCorners(da, &xs, &ys, NULL, &xm, &ym, NULL));
322 hx = 1.0 / (PetscReal)(Mx - 1);
323 sx = 1.0 / (hx * hx);
324 hy = 1.0 / (PetscReal)(My - 1);
325 sy = 1.0 / (hy * hy);
327 for (j = ys; j < ys + ym; j++)
329 for (i = xs; i < xs + xm; i++)
334 if (PETSC_TRUE && (i == 0 || i == Mx - 1 || j == 0 || j == My - 1))
340 else if (PETSC_FALSE && i == 0)
349 else if (PETSC_FALSE && i == Mx - 1)
358 else if (PETSC_FALSE && j == 0)
367 else if (PETSC_FALSE && j == My - 1)
386 vals[nc++] = 2.0 * (sx + sy) +
a;
394 LibmeshPetscCallQ(MatSetValuesStencil(Jpre, 1, &row, nc, col, vals, INSERT_VALUES));
397 LibmeshPetscCallQ(MatAssemblyBegin(Jpre, MAT_FINAL_ASSEMBLY));
398 LibmeshPetscCallQ(MatAssemblyEnd(Jpre, MAT_FINAL_ASSEMBLY));
401 LibmeshPetscCallQ(MatAssemblyBegin(J, MAT_FINAL_ASSEMBLY));
402 LibmeshPetscCallQ(MatAssemblyEnd(J, MAT_FINAL_ASSEMBLY));
405 PetscFunctionReturn(PETSC_SUCCESS);
414 PetscInt i, j, xs, ys, xm, ym, Mx, My;
416 PetscReal hx, hy,
x,
y, r;
418 PetscFunctionBeginUser;
419 LibmeshPetscCallQ(TSGetDM(ts, &da));
420 LibmeshPetscCallQ(DMDAGetInfo(da,
435 hx = 1.0 / (PetscReal)(Mx - 1);
436 hy = 1.0 / (PetscReal)(My - 1);
439 LibmeshPetscCallQ(DMDAVecGetArray(da, U, &u));
442 LibmeshPetscCallQ(DMDAGetCorners(da, &xs, &ys, NULL, &xm, &ym, NULL));
445 for (j = ys; j < ys + ym; j++)
448 for (i = xs; i < xs + xm; i++)
451 r = PetscSqrtReal((
x - .5) * (
x - .5) + (
y - .5) * (
y - .5));
453 u[j][i] = PetscExpReal(
c * r * r * r);
460 LibmeshPetscCallQ(DMDAVecRestoreArray(da, U, &u));
461 PetscFunctionReturn(PETSC_SUCCESS);