1c4762a1bSJed Brown static char help[] = "Heat Equation in 2d and 3d with finite elements.\n\ 2c4762a1bSJed Brown We solve the heat equation in a rectangular\n\ 3c4762a1bSJed Brown domain, using a parallel unstructured mesh (DMPLEX) to discretize it.\n\ 4c4762a1bSJed Brown Contributed by: Julian Andrej <juan@tf.uni-kiel.de>\n\n\n"; 5c4762a1bSJed Brown 6c4762a1bSJed Brown #include <petscdmplex.h> 7c4762a1bSJed Brown #include <petscds.h> 8c4762a1bSJed Brown #include <petscts.h> 9c4762a1bSJed Brown 10c4762a1bSJed Brown /* 11c4762a1bSJed Brown Heat equation: 12c4762a1bSJed Brown 13a3d0cf85SMatthew G. Knepley du/dt - \Delta u + f = 0 14c4762a1bSJed Brown */ 15c4762a1bSJed Brown 169371c9d4SSatish Balay typedef enum { 179371c9d4SSatish Balay SOL_QUADRATIC_LINEAR, 189371c9d4SSatish Balay SOL_QUADRATIC_TRIG, 199371c9d4SSatish Balay SOL_TRIG_LINEAR, 209371c9d4SSatish Balay SOL_TRIG_TRIG, 219371c9d4SSatish Balay NUM_SOLUTION_TYPES 229371c9d4SSatish Balay } SolutionType; 23742ee2edSMatthew G. Knepley const char *solutionTypes[NUM_SOLUTION_TYPES + 1] = {"quadratic_linear", "quadratic_trig", "trig_linear", "trig_trig", "unknown"}; 24a3d0cf85SMatthew G. Knepley 25c4762a1bSJed Brown typedef struct { 26a3d0cf85SMatthew G. Knepley SolutionType solType; /* Type of exact solution */ 27742ee2edSMatthew G. Knepley /* Solver setup */ 28742ee2edSMatthew G. Knepley PetscBool expTS; /* Flag for explicit timestepping */ 29742ee2edSMatthew G. Knepley PetscBool lumped; /* Lump the mass matrix */ 30*d9255fafSStefano Zampini PetscInt remesh_every; /* Remesh every number of steps */ 31*d9255fafSStefano Zampini DM remesh_dm; /* New DM after remeshing */ 32c4762a1bSJed Brown } AppCtx; 33c4762a1bSJed Brown 34a3d0cf85SMatthew G. Knepley /* 35a3d0cf85SMatthew G. Knepley Exact 2D solution: 36a3d0cf85SMatthew G. Knepley u = 2t + x^2 + y^2 37742ee2edSMatthew G. Knepley u_t = 2 38742ee2edSMatthew G. Knepley \Delta u = 2 + 2 = 4 39742ee2edSMatthew G. Knepley f = 2 40a3d0cf85SMatthew G. Knepley F(u) = 2 - (2 + 2) + 2 = 0 41a3d0cf85SMatthew G. Knepley 42a3d0cf85SMatthew G. Knepley Exact 3D solution: 43a3d0cf85SMatthew G. Knepley u = 3t + x^2 + y^2 + z^2 44a3d0cf85SMatthew G. Knepley F(u) = 3 - (2 + 2 + 2) + 3 = 0 45a3d0cf85SMatthew G. Knepley */ 46d71ae5a4SJacob Faibussowitsch static PetscErrorCode mms_quad_lin(PetscInt dim, PetscReal time, const PetscReal x[], PetscInt Nc, PetscScalar *u, void *ctx) 47d71ae5a4SJacob Faibussowitsch { 48c4762a1bSJed Brown PetscInt d; 49c4762a1bSJed Brown 50c4762a1bSJed Brown *u = dim * time; 51c4762a1bSJed Brown for (d = 0; d < dim; ++d) *u += x[d] * x[d]; 523ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 53c4762a1bSJed Brown } 54c4762a1bSJed Brown 55d71ae5a4SJacob Faibussowitsch static PetscErrorCode mms_quad_lin_t(PetscInt dim, PetscReal time, const PetscReal x[], PetscInt Nc, PetscScalar *u, void *ctx) 56d71ae5a4SJacob Faibussowitsch { 57a3d0cf85SMatthew G. Knepley *u = dim; 583ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 59a3d0cf85SMatthew G. Knepley } 60a3d0cf85SMatthew G. Knepley 61d71ae5a4SJacob Faibussowitsch static void f0_quad_lin_exp(PetscInt dim, PetscInt Nf, PetscInt NfAux, const PetscInt uOff[], const PetscInt uOff_x[], const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[], const PetscInt aOff[], const PetscInt aOff_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[], PetscReal t, const PetscReal x[], PetscInt numConstants, const PetscScalar constants[], PetscScalar f0[]) 62d71ae5a4SJacob Faibussowitsch { 63742ee2edSMatthew G. Knepley f0[0] = -(PetscScalar)dim; 64742ee2edSMatthew G. Knepley } 65d71ae5a4SJacob Faibussowitsch static void f0_quad_lin(PetscInt dim, PetscInt Nf, PetscInt NfAux, const PetscInt uOff[], const PetscInt uOff_x[], const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[], const PetscInt aOff[], const PetscInt aOff_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[], PetscReal t, const PetscReal x[], PetscInt numConstants, const PetscScalar constants[], PetscScalar f0[]) 66d71ae5a4SJacob Faibussowitsch { 67742ee2edSMatthew G. Knepley PetscScalar exp[1] = {0.}; 68742ee2edSMatthew G. Knepley f0_quad_lin_exp(dim, Nf, NfAux, uOff, uOff_x, u, u_t, u_x, aOff, aOff_x, a, a_t, a_x, t, x, numConstants, constants, exp); 69742ee2edSMatthew G. Knepley f0[0] = u_t[0] - exp[0]; 70c4762a1bSJed Brown } 71c4762a1bSJed Brown 72a3d0cf85SMatthew G. Knepley /* 73a3d0cf85SMatthew G. Knepley Exact 2D solution: 74a3d0cf85SMatthew G. Knepley u = 2*cos(t) + x^2 + y^2 75a3d0cf85SMatthew G. Knepley F(u) = -2*sint(t) - (2 + 2) + 2*sin(t) + 4 = 0 76a3d0cf85SMatthew G. Knepley 77a3d0cf85SMatthew G. Knepley Exact 3D solution: 78a3d0cf85SMatthew G. Knepley u = 3*cos(t) + x^2 + y^2 + z^2 79a3d0cf85SMatthew G. Knepley F(u) = -3*sin(t) - (2 + 2 + 2) + 3*sin(t) + 6 = 0 80a3d0cf85SMatthew G. Knepley */ 81d71ae5a4SJacob Faibussowitsch static PetscErrorCode mms_quad_trig(PetscInt dim, PetscReal time, const PetscReal x[], PetscInt Nc, PetscScalar *u, void *ctx) 82d71ae5a4SJacob Faibussowitsch { 83a3d0cf85SMatthew G. Knepley PetscInt d; 84a3d0cf85SMatthew G. Knepley 85a3d0cf85SMatthew G. Knepley *u = dim * PetscCosReal(time); 86a3d0cf85SMatthew G. Knepley for (d = 0; d < dim; ++d) *u += x[d] * x[d]; 873ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 88a3d0cf85SMatthew G. Knepley } 89a3d0cf85SMatthew G. Knepley 90d71ae5a4SJacob Faibussowitsch static PetscErrorCode mms_quad_trig_t(PetscInt dim, PetscReal time, const PetscReal x[], PetscInt Nc, PetscScalar *u, void *ctx) 91d71ae5a4SJacob Faibussowitsch { 92a3d0cf85SMatthew G. Knepley *u = -dim * PetscSinReal(time); 933ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 94a3d0cf85SMatthew G. Knepley } 95a3d0cf85SMatthew G. Knepley 96d71ae5a4SJacob Faibussowitsch static void f0_quad_trig_exp(PetscInt dim, PetscInt Nf, PetscInt NfAux, const PetscInt uOff[], const PetscInt uOff_x[], const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[], const PetscInt aOff[], const PetscInt aOff_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[], PetscReal t, const PetscReal x[], PetscInt numConstants, const PetscScalar constants[], PetscScalar f0[]) 97d71ae5a4SJacob Faibussowitsch { 98742ee2edSMatthew G. Knepley f0[0] = -dim * (PetscSinReal(t) + 2.0); 99742ee2edSMatthew G. Knepley } 100d71ae5a4SJacob Faibussowitsch static void f0_quad_trig(PetscInt dim, PetscInt Nf, PetscInt NfAux, const PetscInt uOff[], const PetscInt uOff_x[], const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[], const PetscInt aOff[], const PetscInt aOff_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[], PetscReal t, const PetscReal x[], PetscInt numConstants, const PetscScalar constants[], PetscScalar f0[]) 101d71ae5a4SJacob Faibussowitsch { 102742ee2edSMatthew G. Knepley PetscScalar exp[1] = {0.}; 103742ee2edSMatthew G. Knepley f0_quad_trig_exp(dim, Nf, NfAux, uOff, uOff_x, u, u_t, u_x, aOff, aOff_x, a, a_t, a_x, t, x, numConstants, constants, exp); 104742ee2edSMatthew G. Knepley f0[0] = u_t[0] - exp[0]; 105a3d0cf85SMatthew G. Knepley } 106a3d0cf85SMatthew G. Knepley 107a3d0cf85SMatthew G. Knepley /* 108a3d0cf85SMatthew G. Knepley Exact 2D solution: 109a3d0cf85SMatthew G. Knepley u = 2\pi^2 t + cos(\pi x) + cos(\pi y) 110a3d0cf85SMatthew G. Knepley F(u) = 2\pi^2 - \pi^2 (cos(\pi x) + cos(\pi y)) + \pi^2 (cos(\pi x) + cos(\pi y)) - 2\pi^2 = 0 111a3d0cf85SMatthew G. Knepley 112a3d0cf85SMatthew G. Knepley Exact 3D solution: 113a3d0cf85SMatthew G. Knepley u = 3\pi^2 t + cos(\pi x) + cos(\pi y) + cos(\pi z) 114a3d0cf85SMatthew G. Knepley F(u) = 3\pi^2 - \pi^2 (cos(\pi x) + cos(\pi y) + cos(\pi z)) + \pi^2 (cos(\pi x) + cos(\pi y) + cos(\pi z)) - 3\pi^2 = 0 115a3d0cf85SMatthew G. Knepley */ 116d71ae5a4SJacob Faibussowitsch static PetscErrorCode mms_trig_lin(PetscInt dim, PetscReal time, const PetscReal x[], PetscInt Nc, PetscScalar *u, void *ctx) 117d71ae5a4SJacob Faibussowitsch { 118a3d0cf85SMatthew G. Knepley PetscInt d; 119a3d0cf85SMatthew G. Knepley 120a3d0cf85SMatthew G. Knepley *u = dim * PetscSqr(PETSC_PI) * time; 121a3d0cf85SMatthew G. Knepley for (d = 0; d < dim; ++d) *u += PetscCosReal(PETSC_PI * x[d]); 1223ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 123a3d0cf85SMatthew G. Knepley } 124a3d0cf85SMatthew G. Knepley 125d71ae5a4SJacob Faibussowitsch static PetscErrorCode mms_trig_lin_t(PetscInt dim, PetscReal time, const PetscReal x[], PetscInt Nc, PetscScalar *u, void *ctx) 126d71ae5a4SJacob Faibussowitsch { 127a3d0cf85SMatthew G. Knepley *u = dim * PetscSqr(PETSC_PI); 1283ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 129a3d0cf85SMatthew G. Knepley } 130a3d0cf85SMatthew G. Knepley 131d71ae5a4SJacob Faibussowitsch static void f0_trig_lin(PetscInt dim, PetscInt Nf, PetscInt NfAux, const PetscInt uOff[], const PetscInt uOff_x[], const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[], const PetscInt aOff[], const PetscInt aOff_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[], PetscReal t, const PetscReal x[], PetscInt numConstants, const PetscScalar constants[], PetscScalar f0[]) 132d71ae5a4SJacob Faibussowitsch { 133a3d0cf85SMatthew G. Knepley PetscInt d; 134a3d0cf85SMatthew G. Knepley f0[0] = u_t[0]; 135a3d0cf85SMatthew G. Knepley for (d = 0; d < dim; ++d) f0[0] += PetscSqr(PETSC_PI) * (PetscCosReal(PETSC_PI * x[d]) - 1.0); 136a3d0cf85SMatthew G. Knepley } 137a3d0cf85SMatthew G. Knepley 138742ee2edSMatthew G. Knepley /* 139742ee2edSMatthew G. Knepley Exact 2D solution: 140742ee2edSMatthew G. Knepley u = pi^2 cos(t) + cos(\pi x) + cos(\pi y) 141742ee2edSMatthew G. Knepley u_t = -pi^2 sin(t) 142742ee2edSMatthew G. Knepley \Delta u = -\pi^2 (cos(\pi x) + cos(\pi y)) 143742ee2edSMatthew G. Knepley f = pi^2 sin(t) - \pi^2 (cos(\pi x) + cos(\pi y)) 144742ee2edSMatthew G. Knepley F(u) = -\pi^2 sin(t) + \pi^2 (cos(\pi x) + cos(\pi y)) - \pi^2 (cos(\pi x) + cos(\pi y)) + \pi^2 sin(t) = 0 145742ee2edSMatthew G. Knepley 146742ee2edSMatthew G. Knepley Exact 3D solution: 147742ee2edSMatthew G. Knepley u = pi^2 cos(t) + cos(\pi x) + cos(\pi y) + cos(\pi z) 148742ee2edSMatthew G. Knepley u_t = -pi^2 sin(t) 149742ee2edSMatthew G. Knepley \Delta u = -\pi^2 (cos(\pi x) + cos(\pi y) + cos(\pi z)) 150742ee2edSMatthew G. Knepley f = pi^2 sin(t) - \pi^2 (cos(\pi x) + cos(\pi y) + cos(\pi z)) 151742ee2edSMatthew G. Knepley F(u) = -\pi^2 sin(t) + \pi^2 (cos(\pi x) + cos(\pi y) + cos(\pi z)) - \pi^2 (cos(\pi x) + cos(\pi y) + cos(\pi z)) + \pi^2 sin(t) = 0 152742ee2edSMatthew G. Knepley */ 153d71ae5a4SJacob Faibussowitsch static PetscErrorCode mms_trig_trig(PetscInt dim, PetscReal time, const PetscReal x[], PetscInt Nc, PetscScalar *u, void *ctx) 154d71ae5a4SJacob Faibussowitsch { 155742ee2edSMatthew G. Knepley PetscInt d; 156742ee2edSMatthew G. Knepley 157742ee2edSMatthew G. Knepley *u = PetscSqr(PETSC_PI) * PetscCosReal(time); 158742ee2edSMatthew G. Knepley for (d = 0; d < dim; ++d) *u += PetscCosReal(PETSC_PI * x[d]); 1593ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 160742ee2edSMatthew G. Knepley } 161742ee2edSMatthew G. Knepley 162d71ae5a4SJacob Faibussowitsch static PetscErrorCode mms_trig_trig_t(PetscInt dim, PetscReal time, const PetscReal x[], PetscInt Nc, PetscScalar *u, void *ctx) 163d71ae5a4SJacob Faibussowitsch { 164742ee2edSMatthew G. Knepley *u = -PetscSqr(PETSC_PI) * PetscSinReal(time); 1653ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 166742ee2edSMatthew G. Knepley } 167742ee2edSMatthew G. Knepley 168d71ae5a4SJacob Faibussowitsch static void f0_trig_trig_exp(PetscInt dim, PetscInt Nf, PetscInt NfAux, const PetscInt uOff[], const PetscInt uOff_x[], const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[], const PetscInt aOff[], const PetscInt aOff_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[], PetscReal t, const PetscReal x[], PetscInt numConstants, const PetscScalar constants[], PetscScalar f0[]) 169d71ae5a4SJacob Faibussowitsch { 170742ee2edSMatthew G. Knepley PetscInt d; 171742ee2edSMatthew G. Knepley f0[0] -= PetscSqr(PETSC_PI) * PetscSinReal(t); 172742ee2edSMatthew G. Knepley for (d = 0; d < dim; ++d) f0[0] += PetscSqr(PETSC_PI) * PetscCosReal(PETSC_PI * x[d]); 173742ee2edSMatthew G. Knepley } 174d71ae5a4SJacob Faibussowitsch static void f0_trig_trig(PetscInt dim, PetscInt Nf, PetscInt NfAux, const PetscInt uOff[], const PetscInt uOff_x[], const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[], const PetscInt aOff[], const PetscInt aOff_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[], PetscReal t, const PetscReal x[], PetscInt numConstants, const PetscScalar constants[], PetscScalar f0[]) 175d71ae5a4SJacob Faibussowitsch { 176742ee2edSMatthew G. Knepley PetscScalar exp[1] = {0.}; 177742ee2edSMatthew G. Knepley f0_trig_trig_exp(dim, Nf, NfAux, uOff, uOff_x, u, u_t, u_x, aOff, aOff_x, a, a_t, a_x, t, x, numConstants, constants, exp); 178742ee2edSMatthew G. Knepley f0[0] = u_t[0] - exp[0]; 179742ee2edSMatthew G. Knepley } 180742ee2edSMatthew G. Knepley 181d71ae5a4SJacob Faibussowitsch static void f1_temp_exp(PetscInt dim, PetscInt Nf, PetscInt NfAux, const PetscInt uOff[], const PetscInt uOff_x[], const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[], const PetscInt aOff[], const PetscInt aOff_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[], PetscReal t, const PetscReal x[], PetscInt numConstants, const PetscScalar constants[], PetscScalar f1[]) 182d71ae5a4SJacob Faibussowitsch { 1837279ac95SMatthew G. Knepley for (PetscInt d = 0; d < dim; ++d) f1[d] = -u_x[d]; 184742ee2edSMatthew G. Knepley } 185d71ae5a4SJacob Faibussowitsch static void f1_temp(PetscInt dim, PetscInt Nf, PetscInt NfAux, const PetscInt uOff[], const PetscInt uOff_x[], const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[], const PetscInt aOff[], const PetscInt aOff_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[], PetscReal t, const PetscReal x[], PetscInt numConstants, const PetscScalar constants[], PetscScalar f1[]) 186d71ae5a4SJacob Faibussowitsch { 1877279ac95SMatthew G. Knepley for (PetscInt d = 0; d < dim; ++d) f1[d] = u_x[d]; 188c4762a1bSJed Brown } 189c4762a1bSJed Brown 190d71ae5a4SJacob Faibussowitsch static void g3_temp(PetscInt dim, PetscInt Nf, PetscInt NfAux, const PetscInt uOff[], const PetscInt uOff_x[], const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[], const PetscInt aOff[], const PetscInt aOff_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[], PetscReal t, PetscReal u_tShift, const PetscReal x[], PetscInt numConstants, const PetscScalar constants[], PetscScalar g3[]) 191d71ae5a4SJacob Faibussowitsch { 1927279ac95SMatthew G. Knepley for (PetscInt d = 0; d < dim; ++d) g3[d * dim + d] = 1.0; 193c4762a1bSJed Brown } 194c4762a1bSJed Brown 195d71ae5a4SJacob Faibussowitsch static void g0_temp(PetscInt dim, PetscInt Nf, PetscInt NfAux, const PetscInt uOff[], const PetscInt uOff_x[], const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[], const PetscInt aOff[], const PetscInt aOff_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[], PetscReal t, PetscReal u_tShift, const PetscReal x[], PetscInt numConstants, const PetscScalar constants[], PetscScalar g0[]) 196d71ae5a4SJacob Faibussowitsch { 197c4762a1bSJed Brown g0[0] = u_tShift * 1.0; 198c4762a1bSJed Brown } 199c4762a1bSJed Brown 200d71ae5a4SJacob Faibussowitsch static PetscErrorCode ProcessOptions(MPI_Comm comm, AppCtx *options) 201d71ae5a4SJacob Faibussowitsch { 202a3d0cf85SMatthew G. Knepley PetscInt sol; 203c4762a1bSJed Brown 204c4762a1bSJed Brown PetscFunctionBeginUser; 205a3d0cf85SMatthew G. Knepley options->solType = SOL_QUADRATIC_LINEAR; 206742ee2edSMatthew G. Knepley options->expTS = PETSC_FALSE; 207742ee2edSMatthew G. Knepley options->lumped = PETSC_TRUE; 208*d9255fafSStefano Zampini options->remesh_every = 0; 209c4762a1bSJed Brown 210d0609cedSBarry Smith PetscOptionsBegin(comm, "", "Heat Equation Options", "DMPLEX"); 211*d9255fafSStefano Zampini sol = options->solType; 2129566063dSJacob Faibussowitsch PetscCall(PetscOptionsEList("-sol_type", "Type of exact solution", "ex45.c", solutionTypes, NUM_SOLUTION_TYPES, solutionTypes[options->solType], &sol, NULL)); 213a3d0cf85SMatthew G. Knepley options->solType = (SolutionType)sol; 2149566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-explicit", "Use explicit timestepping", "ex45.c", options->expTS, &options->expTS, NULL)); 2159566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-lumped", "Lump the mass matrix", "ex45.c", options->lumped, &options->lumped, NULL)); 216*d9255fafSStefano Zampini PetscCall(PetscOptionsInt("-remesh_every", "Remesh every number of steps", "ex45.c", options->remesh_every, &options->remesh_every, NULL)); 217d0609cedSBarry Smith PetscOptionsEnd(); 2183ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 219c4762a1bSJed Brown } 220c4762a1bSJed Brown 221d71ae5a4SJacob Faibussowitsch static PetscErrorCode CreateMesh(MPI_Comm comm, DM *dm, AppCtx *ctx) 222d71ae5a4SJacob Faibussowitsch { 223c4762a1bSJed Brown PetscFunctionBeginUser; 2249566063dSJacob Faibussowitsch PetscCall(DMCreate(comm, dm)); 2259566063dSJacob Faibussowitsch PetscCall(DMSetType(*dm, DMPLEX)); 2269566063dSJacob Faibussowitsch PetscCall(DMSetFromOptions(*dm)); 227*d9255fafSStefano Zampini { 228*d9255fafSStefano Zampini char convType[256]; 229*d9255fafSStefano Zampini PetscBool flg; 230*d9255fafSStefano Zampini PetscOptionsBegin(comm, "", "Mesh conversion options", "DMPLEX"); 231*d9255fafSStefano Zampini PetscCall(PetscOptionsFList("-dm_plex_convert_type", "Convert DMPlex to another format", __FILE__, DMList, DMPLEX, convType, 256, &flg)); 232*d9255fafSStefano Zampini PetscOptionsEnd(); 233*d9255fafSStefano Zampini if (flg) { 234*d9255fafSStefano Zampini DM dmConv; 235*d9255fafSStefano Zampini PetscCall(DMConvert(*dm, convType, &dmConv)); 236*d9255fafSStefano Zampini if (dmConv) { 237*d9255fafSStefano Zampini PetscCall(DMDestroy(dm)); 238*d9255fafSStefano Zampini *dm = dmConv; 239*d9255fafSStefano Zampini PetscCall(DMSetFromOptions(*dm)); 240*d9255fafSStefano Zampini PetscCall(DMSetUp(*dm)); 241*d9255fafSStefano Zampini } 242*d9255fafSStefano Zampini } 243*d9255fafSStefano Zampini } 2449566063dSJacob Faibussowitsch PetscCall(DMViewFromOptions(*dm, NULL, "-dm_view")); 2453ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 246c4762a1bSJed Brown } 247c4762a1bSJed Brown 248d71ae5a4SJacob Faibussowitsch static PetscErrorCode SetupProblem(DM dm, AppCtx *ctx) 249d71ae5a4SJacob Faibussowitsch { 250a3d0cf85SMatthew G. Knepley PetscDS ds; 25145480ffeSMatthew G. Knepley DMLabel label; 252c4762a1bSJed Brown const PetscInt id = 1; 253c4762a1bSJed Brown 254c4762a1bSJed Brown PetscFunctionBeginUser; 2559566063dSJacob Faibussowitsch PetscCall(DMGetLabel(dm, "marker", &label)); 2569566063dSJacob Faibussowitsch PetscCall(DMGetDS(dm, &ds)); 2579566063dSJacob Faibussowitsch PetscCall(PetscDSSetJacobian(ds, 0, 0, g0_temp, NULL, NULL, g3_temp)); 258a3d0cf85SMatthew G. Knepley switch (ctx->solType) { 259a3d0cf85SMatthew G. Knepley case SOL_QUADRATIC_LINEAR: 2609566063dSJacob Faibussowitsch PetscCall(PetscDSSetResidual(ds, 0, f0_quad_lin, f1_temp)); 2619566063dSJacob Faibussowitsch PetscCall(PetscDSSetRHSResidual(ds, 0, f0_quad_lin_exp, f1_temp_exp)); 2629566063dSJacob Faibussowitsch PetscCall(PetscDSSetExactSolution(ds, 0, mms_quad_lin, ctx)); 2639566063dSJacob Faibussowitsch PetscCall(PetscDSSetExactSolutionTimeDerivative(ds, 0, mms_quad_lin_t, ctx)); 2649566063dSJacob Faibussowitsch PetscCall(DMAddBoundary(dm, DM_BC_ESSENTIAL, "wall", label, 1, &id, 0, 0, NULL, (void (*)(void))mms_quad_lin, (void (*)(void))mms_quad_lin_t, ctx, NULL)); 265a3d0cf85SMatthew G. Knepley break; 266a3d0cf85SMatthew G. Knepley case SOL_QUADRATIC_TRIG: 2679566063dSJacob Faibussowitsch PetscCall(PetscDSSetResidual(ds, 0, f0_quad_trig, f1_temp)); 2689566063dSJacob Faibussowitsch PetscCall(PetscDSSetRHSResidual(ds, 0, f0_quad_trig_exp, f1_temp_exp)); 2699566063dSJacob Faibussowitsch PetscCall(PetscDSSetExactSolution(ds, 0, mms_quad_trig, ctx)); 2709566063dSJacob Faibussowitsch PetscCall(PetscDSSetExactSolutionTimeDerivative(ds, 0, mms_quad_trig_t, ctx)); 2719566063dSJacob Faibussowitsch PetscCall(DMAddBoundary(dm, DM_BC_ESSENTIAL, "wall", label, 1, &id, 0, 0, NULL, (void (*)(void))mms_quad_trig, (void (*)(void))mms_quad_trig_t, ctx, NULL)); 272a3d0cf85SMatthew G. Knepley break; 273a3d0cf85SMatthew G. Knepley case SOL_TRIG_LINEAR: 2749566063dSJacob Faibussowitsch PetscCall(PetscDSSetResidual(ds, 0, f0_trig_lin, f1_temp)); 2759566063dSJacob Faibussowitsch PetscCall(PetscDSSetExactSolution(ds, 0, mms_trig_lin, ctx)); 2769566063dSJacob Faibussowitsch PetscCall(PetscDSSetExactSolutionTimeDerivative(ds, 0, mms_trig_lin_t, ctx)); 2779566063dSJacob Faibussowitsch PetscCall(DMAddBoundary(dm, DM_BC_ESSENTIAL, "wall", label, 1, &id, 0, 0, NULL, (void (*)(void))mms_trig_lin, (void (*)(void))mms_trig_lin_t, ctx, NULL)); 278a3d0cf85SMatthew G. Knepley break; 279742ee2edSMatthew G. Knepley case SOL_TRIG_TRIG: 2809566063dSJacob Faibussowitsch PetscCall(PetscDSSetResidual(ds, 0, f0_trig_trig, f1_temp)); 2819566063dSJacob Faibussowitsch PetscCall(PetscDSSetRHSResidual(ds, 0, f0_trig_trig_exp, f1_temp_exp)); 2829566063dSJacob Faibussowitsch PetscCall(PetscDSSetExactSolution(ds, 0, mms_trig_trig, ctx)); 2839566063dSJacob Faibussowitsch PetscCall(PetscDSSetExactSolutionTimeDerivative(ds, 0, mms_trig_trig_t, ctx)); 284742ee2edSMatthew G. Knepley break; 285d71ae5a4SJacob Faibussowitsch default: 286d71ae5a4SJacob Faibussowitsch SETERRQ(PetscObjectComm((PetscObject)dm), PETSC_ERR_ARG_WRONG, "Invalid solution type: %s (%d)", solutionTypes[PetscMin(ctx->solType, NUM_SOLUTION_TYPES)], ctx->solType); 287a3d0cf85SMatthew G. Knepley } 2883ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 289c4762a1bSJed Brown } 290c4762a1bSJed Brown 291d71ae5a4SJacob Faibussowitsch static PetscErrorCode SetupDiscretization(DM dm, AppCtx *ctx) 292d71ae5a4SJacob Faibussowitsch { 293*d9255fafSStefano Zampini DM plex, cdm = dm; 294c4762a1bSJed Brown PetscFE fe; 295*d9255fafSStefano Zampini PetscBool simplex; 296*d9255fafSStefano Zampini PetscInt dim; 297c4762a1bSJed Brown 298c4762a1bSJed Brown PetscFunctionBeginUser; 2999566063dSJacob Faibussowitsch PetscCall(DMGetDimension(dm, &dim)); 300*d9255fafSStefano Zampini PetscCall(DMConvert(dm, DMPLEX, &plex)); 301*d9255fafSStefano Zampini PetscCall(DMPlexIsSimplex(plex, &simplex)); 302*d9255fafSStefano Zampini PetscCall(DMDestroy(&plex)); 303*d9255fafSStefano Zampini PetscCall(PetscFECreateDefault(PETSC_COMM_SELF, dim, 1, simplex, "temp_", -1, &fe)); 3049566063dSJacob Faibussowitsch PetscCall(PetscObjectSetName((PetscObject)fe, "temperature")); 305c4762a1bSJed Brown /* Set discretization and boundary conditions for each mesh */ 3069566063dSJacob Faibussowitsch PetscCall(DMSetField(dm, 0, NULL, (PetscObject)fe)); 3079566063dSJacob Faibussowitsch PetscCall(DMCreateDS(dm)); 308742ee2edSMatthew G. Knepley if (ctx->expTS) { 309742ee2edSMatthew G. Knepley PetscDS ds; 310742ee2edSMatthew G. Knepley 3119566063dSJacob Faibussowitsch PetscCall(DMGetDS(dm, &ds)); 3129566063dSJacob Faibussowitsch PetscCall(PetscDSSetImplicit(ds, 0, PETSC_FALSE)); 313742ee2edSMatthew G. Knepley } 3149566063dSJacob Faibussowitsch PetscCall(SetupProblem(dm, ctx)); 315c4762a1bSJed Brown while (cdm) { 3169566063dSJacob Faibussowitsch PetscCall(DMCopyDisc(dm, cdm)); 3179566063dSJacob Faibussowitsch PetscCall(DMGetCoarseDM(cdm, &cdm)); 318c4762a1bSJed Brown } 3199566063dSJacob Faibussowitsch PetscCall(PetscFEDestroy(&fe)); 3203ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 321c4762a1bSJed Brown } 322c4762a1bSJed Brown 323*d9255fafSStefano Zampini #include <petsc/private/dmpleximpl.h> 324*d9255fafSStefano Zampini static PetscErrorCode Remesh(DM dm, Vec U, DM *newdm) 325*d9255fafSStefano Zampini { 326*d9255fafSStefano Zampini PetscFunctionBeginUser; 327*d9255fafSStefano Zampini PetscCall(DMViewFromOptions(dm, NULL, "-remesh_dmin_view")); 328*d9255fafSStefano Zampini *newdm = NULL; 329*d9255fafSStefano Zampini 330*d9255fafSStefano Zampini PetscInt dim; 331*d9255fafSStefano Zampini DM plex; 332*d9255fafSStefano Zampini PetscBool simplex; 333*d9255fafSStefano Zampini PetscCall(DMGetDimension(dm, &dim)); 334*d9255fafSStefano Zampini PetscCall(DMConvert(dm, DMPLEX, &plex)); 335*d9255fafSStefano Zampini PetscCall(DMPlexIsSimplex(plex, &simplex)); 336*d9255fafSStefano Zampini PetscCall(DMDestroy(&plex)); 337*d9255fafSStefano Zampini 338*d9255fafSStefano Zampini DM dmGrad; 339*d9255fafSStefano Zampini PetscFE fe; 340*d9255fafSStefano Zampini PetscCall(DMClone(dm, &dmGrad)); 341*d9255fafSStefano Zampini PetscCall(PetscFECreateDefault(PETSC_COMM_SELF, dim, dim, simplex, "grad_", -1, &fe)); 342*d9255fafSStefano Zampini PetscCall(DMSetField(dmGrad, 0, NULL, (PetscObject)fe)); 343*d9255fafSStefano Zampini PetscCall(PetscFEDestroy(&fe)); 344*d9255fafSStefano Zampini PetscCall(DMCreateDS(dmGrad)); 345*d9255fafSStefano Zampini 346*d9255fafSStefano Zampini Vec locU, locG; 347*d9255fafSStefano Zampini PetscCall(DMGetLocalVector(dm, &locU)); 348*d9255fafSStefano Zampini PetscCall(DMGetLocalVector(dmGrad, &locG)); 349*d9255fafSStefano Zampini PetscCall(DMGlobalToLocal(dm, U, INSERT_VALUES, locU)); 350*d9255fafSStefano Zampini PetscCall(VecViewFromOptions(locU, NULL, "-remesh_input_view")); 351*d9255fafSStefano Zampini PetscCall(DMPlexComputeGradientClementInterpolant(dm, locU, locG)); 352*d9255fafSStefano Zampini PetscCall(VecViewFromOptions(locG, NULL, "-remesh_grad_view")); 353*d9255fafSStefano Zampini 354*d9255fafSStefano Zampini const PetscScalar *g; 355*d9255fafSStefano Zampini PetscScalar *u; 356*d9255fafSStefano Zampini PetscInt n; 357*d9255fafSStefano Zampini PetscCall(VecGetLocalSize(locU, &n)); 358*d9255fafSStefano Zampini PetscCall(VecGetArrayWrite(locU, &u)); 359*d9255fafSStefano Zampini PetscCall(VecGetArrayRead(locG, &g)); 360*d9255fafSStefano Zampini for (PetscInt i = 0; i < n; i++) { 361*d9255fafSStefano Zampini PetscReal norm = 0.0; 362*d9255fafSStefano Zampini for (PetscInt d = 0; d < dim; d++) norm += PetscSqr(PetscRealPart(g[dim * i + d])); 363*d9255fafSStefano Zampini u[i] = PetscSqrtReal(norm); 364*d9255fafSStefano Zampini } 365*d9255fafSStefano Zampini PetscCall(VecRestoreArrayRead(locG, &g)); 366*d9255fafSStefano Zampini PetscCall(VecRestoreArrayWrite(locU, &u)); 367*d9255fafSStefano Zampini 368*d9255fafSStefano Zampini DM dmM; 369*d9255fafSStefano Zampini Vec metric; 370*d9255fafSStefano Zampini PetscCall(DMClone(dm, &dmM)); 371*d9255fafSStefano Zampini PetscCall(DMPlexMetricCreateIsotropic(dmM, 0, locU, &metric)); 372*d9255fafSStefano Zampini PetscCall(DMDestroy(&dmM)); 373*d9255fafSStefano Zampini PetscCall(DMRestoreLocalVector(dm, &locU)); 374*d9255fafSStefano Zampini PetscCall(DMRestoreLocalVector(dmGrad, &locG)); 375*d9255fafSStefano Zampini PetscCall(DMDestroy(&dmGrad)); 376*d9255fafSStefano Zampini 377*d9255fafSStefano Zampini // TODO remove? 378*d9255fafSStefano Zampini PetscScalar scale = 10.0; 379*d9255fafSStefano Zampini PetscCall(PetscOptionsGetScalar(NULL, NULL, "-metric_scale", &scale, NULL)); 380*d9255fafSStefano Zampini PetscCall(VecScale(metric, scale)); 381*d9255fafSStefano Zampini PetscCall(VecViewFromOptions(metric, NULL, "-metric_view")); 382*d9255fafSStefano Zampini 383*d9255fafSStefano Zampini DMLabel label = NULL; 384*d9255fafSStefano Zampini PetscCall(DMGetLabel(dm, "marker", &label)); 385*d9255fafSStefano Zampini PetscCall(DMAdaptMetric(dm, metric, label, NULL, newdm)); 386*d9255fafSStefano Zampini PetscCall(VecDestroy(&metric)); 387*d9255fafSStefano Zampini 388*d9255fafSStefano Zampini PetscCall(DMViewFromOptions(*newdm, NULL, "-remesh_dmout_view")); 389*d9255fafSStefano Zampini 390*d9255fafSStefano Zampini AppCtx *ctx; 391*d9255fafSStefano Zampini PetscCall(DMGetApplicationContext(dm, &ctx)); 392*d9255fafSStefano Zampini PetscCall(DMSetApplicationContext(*newdm, ctx)); 393*d9255fafSStefano Zampini PetscCall(SetupDiscretization(*newdm, ctx)); 394*d9255fafSStefano Zampini 395*d9255fafSStefano Zampini // TODO 396*d9255fafSStefano Zampini ((DM_Plex *)(*newdm)->data)->useHashLocation = ((DM_Plex *)dm->data)->useHashLocation; 397*d9255fafSStefano Zampini PetscFunctionReturn(PETSC_SUCCESS); 398*d9255fafSStefano Zampini } 399*d9255fafSStefano Zampini 400d71ae5a4SJacob Faibussowitsch static PetscErrorCode SetInitialConditions(TS ts, Vec u) 401d71ae5a4SJacob Faibussowitsch { 402a3d0cf85SMatthew G. Knepley DM dm; 403a3d0cf85SMatthew G. Knepley PetscReal t; 404a3d0cf85SMatthew G. Knepley 4057510d9b0SBarry Smith PetscFunctionBeginUser; 4069566063dSJacob Faibussowitsch PetscCall(TSGetDM(ts, &dm)); 4079566063dSJacob Faibussowitsch PetscCall(TSGetTime(ts, &t)); 4089566063dSJacob Faibussowitsch PetscCall(DMComputeExactSolution(dm, t, u, NULL)); 409*d9255fafSStefano Zampini PetscCall(VecSetOptionsPrefix(u, NULL)); 410*d9255fafSStefano Zampini PetscFunctionReturn(PETSC_SUCCESS); 411*d9255fafSStefano Zampini } 412*d9255fafSStefano Zampini 413*d9255fafSStefano Zampini static PetscErrorCode TransferSetUp(TS ts, PetscInt step, PetscReal time, Vec U, PetscBool *remesh, void *tctx) 414*d9255fafSStefano Zampini { 415*d9255fafSStefano Zampini AppCtx *ctx = (AppCtx *)tctx; 416*d9255fafSStefano Zampini 417*d9255fafSStefano Zampini PetscFunctionBeginUser; 418*d9255fafSStefano Zampini *remesh = PETSC_FALSE; 419*d9255fafSStefano Zampini if (ctx->remesh_every > 0 && step && step % ctx->remesh_every == 0) { 420*d9255fafSStefano Zampini DM dm; 421*d9255fafSStefano Zampini 422*d9255fafSStefano Zampini *remesh = PETSC_TRUE; 423*d9255fafSStefano Zampini PetscCall(TSGetDM(ts, &dm)); 424*d9255fafSStefano Zampini PetscCall(Remesh(dm, U, &ctx->remesh_dm)); 425*d9255fafSStefano Zampini } 426*d9255fafSStefano Zampini PetscFunctionReturn(PETSC_SUCCESS); 427*d9255fafSStefano Zampini } 428*d9255fafSStefano Zampini 429*d9255fafSStefano Zampini static PetscErrorCode TransferVecs(TS ts, PetscInt nv, Vec vin[], Vec vout[], void *tctx) 430*d9255fafSStefano Zampini { 431*d9255fafSStefano Zampini AppCtx *ctx = (AppCtx *)tctx; 432*d9255fafSStefano Zampini DM dm; 433*d9255fafSStefano Zampini Mat Interp; 434*d9255fafSStefano Zampini 435*d9255fafSStefano Zampini PetscFunctionBeginUser; 436*d9255fafSStefano Zampini PetscCall(TSGetDM(ts, &dm)); 437*d9255fafSStefano Zampini PetscCall(DMCreateInterpolation(dm, ctx->remesh_dm, &Interp, NULL)); 438*d9255fafSStefano Zampini for (PetscInt i = 0; i < nv; i++) { 439*d9255fafSStefano Zampini PetscCall(DMCreateGlobalVector(ctx->remesh_dm, &vout[i])); 440*d9255fafSStefano Zampini PetscCall(MatMult(Interp, vin[i], vout[i])); 441*d9255fafSStefano Zampini } 442*d9255fafSStefano Zampini PetscCall(MatDestroy(&Interp)); 443*d9255fafSStefano Zampini PetscCall(TSSetDM(ts, ctx->remesh_dm)); 444*d9255fafSStefano Zampini PetscCall(DMDestroy(&ctx->remesh_dm)); 4453ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 446a3d0cf85SMatthew G. Knepley } 447a3d0cf85SMatthew G. Knepley 448d71ae5a4SJacob Faibussowitsch int main(int argc, char **argv) 449d71ae5a4SJacob Faibussowitsch { 450c4762a1bSJed Brown DM dm; 451c4762a1bSJed Brown TS ts; 452a3d0cf85SMatthew G. Knepley Vec u; 453a3d0cf85SMatthew G. Knepley AppCtx ctx; 454c4762a1bSJed Brown 455327415f7SBarry Smith PetscFunctionBeginUser; 4569566063dSJacob Faibussowitsch PetscCall(PetscInitialize(&argc, &argv, NULL, help)); 4579566063dSJacob Faibussowitsch PetscCall(ProcessOptions(PETSC_COMM_WORLD, &ctx)); 4589566063dSJacob Faibussowitsch PetscCall(CreateMesh(PETSC_COMM_WORLD, &dm, &ctx)); 4599566063dSJacob Faibussowitsch PetscCall(DMSetApplicationContext(dm, &ctx)); 4609566063dSJacob Faibussowitsch PetscCall(SetupDiscretization(dm, &ctx)); 461c4762a1bSJed Brown 4629566063dSJacob Faibussowitsch PetscCall(TSCreate(PETSC_COMM_WORLD, &ts)); 4639566063dSJacob Faibussowitsch PetscCall(TSSetDM(ts, dm)); 4649566063dSJacob Faibussowitsch PetscCall(DMTSSetBoundaryLocal(dm, DMPlexTSComputeBoundary, &ctx)); 465742ee2edSMatthew G. Knepley if (ctx.expTS) { 4669566063dSJacob Faibussowitsch PetscCall(DMTSSetRHSFunctionLocal(dm, DMPlexTSComputeRHSFunctionFEM, &ctx)); 4679566063dSJacob Faibussowitsch if (ctx.lumped) PetscCall(DMTSCreateRHSMassMatrixLumped(dm)); 4689566063dSJacob Faibussowitsch else PetscCall(DMTSCreateRHSMassMatrix(dm)); 469742ee2edSMatthew G. Knepley } else { 4709566063dSJacob Faibussowitsch PetscCall(DMTSSetIFunctionLocal(dm, DMPlexTSComputeIFunctionFEM, &ctx)); 4719566063dSJacob Faibussowitsch PetscCall(DMTSSetIJacobianLocal(dm, DMPlexTSComputeIJacobianFEM, &ctx)); 472742ee2edSMatthew G. Knepley } 473*d9255fafSStefano Zampini PetscCall(TSSetMaxTime(ts, 1.0)); 4749566063dSJacob Faibussowitsch PetscCall(TSSetExactFinalTime(ts, TS_EXACTFINALTIME_MATCHSTEP)); 4759566063dSJacob Faibussowitsch PetscCall(TSSetFromOptions(ts)); 4769566063dSJacob Faibussowitsch PetscCall(TSSetComputeInitialCondition(ts, SetInitialConditions)); 477*d9255fafSStefano Zampini PetscCall(TSSetResize(ts, TransferSetUp, TransferVecs, &ctx)); 478c4762a1bSJed Brown 4799566063dSJacob Faibussowitsch PetscCall(DMCreateGlobalVector(dm, &u)); 4809566063dSJacob Faibussowitsch PetscCall(DMTSCheckFromOptions(ts, u)); 4819566063dSJacob Faibussowitsch PetscCall(SetInitialConditions(ts, u)); 4829566063dSJacob Faibussowitsch PetscCall(PetscObjectSetName((PetscObject)u, "temperature")); 483*d9255fafSStefano Zampini 484*d9255fafSStefano Zampini PetscCall(TSSetSolution(ts, u)); 485*d9255fafSStefano Zampini PetscCall(VecViewFromOptions(u, NULL, "-u0_view")); 486*d9255fafSStefano Zampini PetscCall(VecDestroy(&u)); 487*d9255fafSStefano Zampini PetscCall(TSSolve(ts, NULL)); 488*d9255fafSStefano Zampini 489*d9255fafSStefano Zampini PetscCall(TSGetSolution(ts, &u)); 490*d9255fafSStefano Zampini PetscCall(VecViewFromOptions(u, NULL, "-uf_view")); 4919566063dSJacob Faibussowitsch PetscCall(DMTSCheckFromOptions(ts, u)); 4929566063dSJacob Faibussowitsch if (ctx.expTS) PetscCall(DMTSDestroyRHSMassMatrix(dm)); 493c4762a1bSJed Brown 4949566063dSJacob Faibussowitsch PetscCall(TSDestroy(&ts)); 4959566063dSJacob Faibussowitsch PetscCall(DMDestroy(&dm)); 4969566063dSJacob Faibussowitsch PetscCall(PetscFinalize()); 497b122ec5aSJacob Faibussowitsch return 0; 498c4762a1bSJed Brown } 499c4762a1bSJed Brown 500c4762a1bSJed Brown /*TEST 501c4762a1bSJed Brown 502c4762a1bSJed Brown test: 503a3d0cf85SMatthew G. Knepley suffix: 2d_p1 504c4762a1bSJed Brown requires: triangle 505a3d0cf85SMatthew G. Knepley args: -sol_type quadratic_linear -dm_refine 1 -temp_petscspace_degree 1 -dmts_check .0001 \ 506a3d0cf85SMatthew G. Knepley -ts_type beuler -ts_max_steps 5 -ts_dt 0.1 -snes_error_if_not_converged -pc_type lu 507c4762a1bSJed Brown test: 508742ee2edSMatthew G. Knepley suffix: 2d_p1_exp 509742ee2edSMatthew G. Knepley requires: triangle 510742ee2edSMatthew G. Knepley args: -sol_type quadratic_linear -dm_refine 1 -temp_petscspace_degree 1 -explicit \ 511742ee2edSMatthew G. Knepley -ts_type euler -ts_max_steps 4 -ts_dt 1e-3 -ts_monitor_error 512742ee2edSMatthew G. Knepley test: 513a3d0cf85SMatthew G. Knepley # -dm_refine 2 -convest_num_refine 3 get L_2 convergence rate: [1.9] 514a3d0cf85SMatthew G. Knepley suffix: 2d_p1_sconv 515c4762a1bSJed Brown requires: triangle 516a3d0cf85SMatthew G. Knepley args: -sol_type quadratic_linear -temp_petscspace_degree 1 -ts_convergence_estimate -ts_convergence_temporal 0 -convest_num_refine 1 \ 517a3d0cf85SMatthew G. Knepley -ts_type beuler -ts_max_steps 1 -ts_dt 0.00001 -snes_error_if_not_converged -pc_type lu 518c4762a1bSJed Brown test: 519742ee2edSMatthew G. Knepley # -dm_refine 2 -convest_num_refine 3 get L_2 convergence rate: [2.1] 520742ee2edSMatthew G. Knepley suffix: 2d_p1_sconv_2 521742ee2edSMatthew G. Knepley requires: triangle 522742ee2edSMatthew G. Knepley args: -sol_type trig_trig -temp_petscspace_degree 1 -ts_convergence_estimate -ts_convergence_temporal 0 -convest_num_refine 1 \ 523742ee2edSMatthew G. Knepley -ts_type beuler -ts_max_steps 1 -ts_dt 1e-6 -snes_error_if_not_converged -pc_type lu 524742ee2edSMatthew G. Knepley test: 525a3d0cf85SMatthew G. Knepley # -dm_refine 4 -convest_num_refine 3 get L_2 convergence rate: [1.2] 526a3d0cf85SMatthew G. Knepley suffix: 2d_p1_tconv 527c4762a1bSJed Brown requires: triangle 528a3d0cf85SMatthew G. Knepley args: -sol_type quadratic_trig -temp_petscspace_degree 1 -ts_convergence_estimate -convest_num_refine 1 \ 529a3d0cf85SMatthew G. Knepley -ts_type beuler -ts_max_steps 4 -ts_dt 0.1 -snes_error_if_not_converged -pc_type lu 530c4762a1bSJed Brown test: 531742ee2edSMatthew G. Knepley # -dm_refine 6 -convest_num_refine 3 get L_2 convergence rate: [1.0] 532742ee2edSMatthew G. Knepley suffix: 2d_p1_tconv_2 533742ee2edSMatthew G. Knepley requires: triangle 534742ee2edSMatthew G. Knepley args: -sol_type trig_trig -temp_petscspace_degree 1 -ts_convergence_estimate -convest_num_refine 1 \ 535742ee2edSMatthew G. Knepley -ts_type beuler -ts_max_steps 4 -ts_dt 0.1 -snes_error_if_not_converged -pc_type lu 536742ee2edSMatthew G. Knepley test: 537742ee2edSMatthew G. Knepley # The L_2 convergence rate cannot be seen since stability of the explicit integrator requires that is be more accurate than the grid 538742ee2edSMatthew G. Knepley suffix: 2d_p1_exp_tconv_2 539742ee2edSMatthew G. Knepley requires: triangle 540742ee2edSMatthew G. Knepley args: -sol_type trig_trig -temp_petscspace_degree 1 -explicit -ts_convergence_estimate -convest_num_refine 1 \ 541742ee2edSMatthew G. Knepley -ts_type euler -ts_max_steps 4 -ts_dt 1e-4 -lumped 0 -mass_pc_type lu 542742ee2edSMatthew G. Knepley test: 543742ee2edSMatthew G. Knepley # The L_2 convergence rate cannot be seen since stability of the explicit integrator requires that is be more accurate than the grid 544742ee2edSMatthew G. Knepley suffix: 2d_p1_exp_tconv_2_lump 545742ee2edSMatthew G. Knepley requires: triangle 546742ee2edSMatthew G. Knepley args: -sol_type trig_trig -temp_petscspace_degree 1 -explicit -ts_convergence_estimate -convest_num_refine 1 \ 547742ee2edSMatthew G. Knepley -ts_type euler -ts_max_steps 4 -ts_dt 1e-4 548742ee2edSMatthew G. Knepley test: 549a3d0cf85SMatthew G. Knepley suffix: 2d_p2 550c4762a1bSJed Brown requires: triangle 551a3d0cf85SMatthew G. Knepley args: -sol_type quadratic_linear -dm_refine 0 -temp_petscspace_degree 2 -dmts_check .0001 \ 552a3d0cf85SMatthew G. Knepley -ts_type beuler -ts_max_steps 5 -ts_dt 0.1 -snes_error_if_not_converged -pc_type lu 553c4762a1bSJed Brown test: 554a3d0cf85SMatthew G. Knepley # -dm_refine 2 -convest_num_refine 3 get L_2 convergence rate: [2.9] 555a3d0cf85SMatthew G. Knepley suffix: 2d_p2_sconv 556a3d0cf85SMatthew G. Knepley requires: triangle 557a3d0cf85SMatthew G. Knepley args: -sol_type trig_linear -temp_petscspace_degree 2 -ts_convergence_estimate -ts_convergence_temporal 0 -convest_num_refine 1 \ 558a3d0cf85SMatthew G. Knepley -ts_type beuler -ts_max_steps 1 -ts_dt 0.00000001 -snes_error_if_not_converged -pc_type lu 559c4762a1bSJed Brown test: 560742ee2edSMatthew G. Knepley # -dm_refine 2 -convest_num_refine 3 get L_2 convergence rate: [3.1] 561742ee2edSMatthew G. Knepley suffix: 2d_p2_sconv_2 562742ee2edSMatthew G. Knepley requires: triangle 563742ee2edSMatthew G. Knepley args: -sol_type trig_trig -temp_petscspace_degree 2 -ts_convergence_estimate -ts_convergence_temporal 0 -convest_num_refine 1 \ 564742ee2edSMatthew G. Knepley -ts_type beuler -ts_max_steps 1 -ts_dt 0.00000001 -snes_error_if_not_converged -pc_type lu 565742ee2edSMatthew G. Knepley test: 566a3d0cf85SMatthew G. Knepley # -dm_refine 3 -convest_num_refine 3 get L_2 convergence rate: [1.0] 567a3d0cf85SMatthew G. Knepley suffix: 2d_p2_tconv 568a3d0cf85SMatthew G. Knepley requires: triangle 569a3d0cf85SMatthew G. Knepley args: -sol_type quadratic_trig -temp_petscspace_degree 2 -ts_convergence_estimate -convest_num_refine 1 \ 570a3d0cf85SMatthew G. Knepley -ts_type beuler -ts_max_steps 4 -ts_dt 0.1 -snes_error_if_not_converged -pc_type lu 571c4762a1bSJed Brown test: 572742ee2edSMatthew G. Knepley # -dm_refine 3 -convest_num_refine 3 get L_2 convergence rate: [1.0] 573742ee2edSMatthew G. Knepley suffix: 2d_p2_tconv_2 574742ee2edSMatthew G. Knepley requires: triangle 575742ee2edSMatthew G. Knepley args: -sol_type trig_trig -temp_petscspace_degree 2 -ts_convergence_estimate -convest_num_refine 1 \ 576742ee2edSMatthew G. Knepley -ts_type beuler -ts_max_steps 4 -ts_dt 0.1 -snes_error_if_not_converged -pc_type lu 577742ee2edSMatthew G. Knepley test: 578a3d0cf85SMatthew G. Knepley suffix: 2d_q1 57930602db0SMatthew G. Knepley args: -sol_type quadratic_linear -dm_plex_simplex 0 -dm_refine 1 -temp_petscspace_degree 1 -dmts_check .0001 \ 580a3d0cf85SMatthew G. Knepley -ts_type beuler -ts_max_steps 5 -ts_dt 0.1 -snes_error_if_not_converged -pc_type lu 581c4762a1bSJed Brown test: 582a3d0cf85SMatthew G. Knepley # -dm_refine 2 -convest_num_refine 3 get L_2 convergence rate: [1.9] 583a3d0cf85SMatthew G. Knepley suffix: 2d_q1_sconv 58430602db0SMatthew G. Knepley args: -sol_type quadratic_linear -dm_plex_simplex 0 -temp_petscspace_degree 1 -ts_convergence_estimate -ts_convergence_temporal 0 -convest_num_refine 1 \ 585a3d0cf85SMatthew G. Knepley -ts_type beuler -ts_max_steps 1 -ts_dt 0.00001 -snes_error_if_not_converged -pc_type lu 586c4762a1bSJed Brown test: 587a3d0cf85SMatthew G. Knepley # -dm_refine 4 -convest_num_refine 3 get L_2 convergence rate: [1.2] 588a3d0cf85SMatthew G. Knepley suffix: 2d_q1_tconv 58930602db0SMatthew G. Knepley args: -sol_type quadratic_trig -dm_plex_simplex 0 -temp_petscspace_degree 1 -ts_convergence_estimate -convest_num_refine 1 \ 590a3d0cf85SMatthew G. Knepley -ts_type beuler -ts_max_steps 4 -ts_dt 0.1 -snes_error_if_not_converged -pc_type lu 591a3d0cf85SMatthew G. Knepley test: 592a3d0cf85SMatthew G. Knepley suffix: 2d_q2 59330602db0SMatthew G. Knepley args: -sol_type quadratic_linear -dm_plex_simplex 0 -dm_refine 0 -temp_petscspace_degree 2 -dmts_check .0001 \ 594a3d0cf85SMatthew G. Knepley -ts_type beuler -ts_max_steps 5 -ts_dt 0.1 -snes_error_if_not_converged -pc_type lu 595a3d0cf85SMatthew G. Knepley test: 596a3d0cf85SMatthew G. Knepley # -dm_refine 2 -convest_num_refine 3 get L_2 convergence rate: [2.9] 597a3d0cf85SMatthew G. Knepley suffix: 2d_q2_sconv 59830602db0SMatthew G. Knepley args: -sol_type trig_linear -dm_plex_simplex 0 -temp_petscspace_degree 2 -ts_convergence_estimate -ts_convergence_temporal 0 -convest_num_refine 1 \ 599a3d0cf85SMatthew G. Knepley -ts_type beuler -ts_max_steps 1 -ts_dt 0.00000001 -snes_error_if_not_converged -pc_type lu 600a3d0cf85SMatthew G. Knepley test: 601a3d0cf85SMatthew G. Knepley # -dm_refine 3 -convest_num_refine 3 get L_2 convergence rate: [1.0] 602a3d0cf85SMatthew G. Knepley suffix: 2d_q2_tconv 60330602db0SMatthew G. Knepley args: -sol_type quadratic_trig -dm_plex_simplex 0 -temp_petscspace_degree 2 -ts_convergence_estimate -convest_num_refine 1 \ 604a3d0cf85SMatthew G. Knepley -ts_type beuler -ts_max_steps 4 -ts_dt 0.1 -snes_error_if_not_converged -pc_type lu 605a3d0cf85SMatthew G. Knepley 606a3d0cf85SMatthew G. Knepley test: 607a3d0cf85SMatthew G. Knepley suffix: 3d_p1 608c4762a1bSJed Brown requires: ctetgen 609a3d0cf85SMatthew G. Knepley args: -sol_type quadratic_linear -dm_refine 1 -temp_petscspace_degree 1 -dmts_check .0001 \ 610a3d0cf85SMatthew G. Knepley -ts_type beuler -ts_max_steps 5 -ts_dt 0.1 -snes_error_if_not_converged -pc_type lu 611c4762a1bSJed Brown test: 612a3d0cf85SMatthew G. Knepley # -dm_refine 2 -convest_num_refine 3 get L_2 convergence rate: [1.9] 613a3d0cf85SMatthew G. Knepley suffix: 3d_p1_sconv 614c4762a1bSJed Brown requires: ctetgen 615a3d0cf85SMatthew G. Knepley args: -sol_type quadratic_linear -temp_petscspace_degree 1 -ts_convergence_estimate -ts_convergence_temporal 0 -convest_num_refine 1 \ 616a3d0cf85SMatthew G. Knepley -ts_type beuler -ts_max_steps 1 -ts_dt 0.00001 -snes_error_if_not_converged -pc_type lu 617c4762a1bSJed Brown test: 618a3d0cf85SMatthew G. Knepley # -dm_refine 4 -convest_num_refine 3 get L_2 convergence rate: [1.2] 619a3d0cf85SMatthew G. Knepley suffix: 3d_p1_tconv 620c4762a1bSJed Brown requires: ctetgen 621a3d0cf85SMatthew G. Knepley args: -sol_type quadratic_trig -temp_petscspace_degree 1 -ts_convergence_estimate -convest_num_refine 1 \ 622a3d0cf85SMatthew G. Knepley -ts_type beuler -ts_max_steps 4 -ts_dt 0.1 -snes_error_if_not_converged -pc_type lu 623c4762a1bSJed Brown test: 624a3d0cf85SMatthew G. Knepley suffix: 3d_p2 625c4762a1bSJed Brown requires: ctetgen 626a3d0cf85SMatthew G. Knepley args: -sol_type quadratic_linear -dm_refine 0 -temp_petscspace_degree 2 -dmts_check .0001 \ 627a3d0cf85SMatthew G. Knepley -ts_type beuler -ts_max_steps 5 -ts_dt 0.1 -snes_error_if_not_converged -pc_type lu 628c4762a1bSJed Brown test: 629a3d0cf85SMatthew G. Knepley # -dm_refine 2 -convest_num_refine 3 get L_2 convergence rate: [2.9] 630a3d0cf85SMatthew G. Knepley suffix: 3d_p2_sconv 631a3d0cf85SMatthew G. Knepley requires: ctetgen 632a3d0cf85SMatthew G. Knepley args: -sol_type trig_linear -temp_petscspace_degree 2 -ts_convergence_estimate -ts_convergence_temporal 0 -convest_num_refine 1 \ 633a3d0cf85SMatthew G. Knepley -ts_type beuler -ts_max_steps 1 -ts_dt 0.00000001 -snes_error_if_not_converged -pc_type lu 634c4762a1bSJed Brown test: 635a3d0cf85SMatthew G. Knepley # -dm_refine 3 -convest_num_refine 3 get L_2 convergence rate: [1.0] 636a3d0cf85SMatthew G. Knepley suffix: 3d_p2_tconv 637a3d0cf85SMatthew G. Knepley requires: ctetgen 638a3d0cf85SMatthew G. Knepley args: -sol_type quadratic_trig -temp_petscspace_degree 2 -ts_convergence_estimate -convest_num_refine 1 \ 639a3d0cf85SMatthew G. Knepley -ts_type beuler -ts_max_steps 4 -ts_dt 0.1 -snes_error_if_not_converged -pc_type lu 640c4762a1bSJed Brown test: 641a3d0cf85SMatthew G. Knepley suffix: 3d_q1 64230602db0SMatthew G. Knepley args: -sol_type quadratic_linear -dm_plex_simplex 0 -dm_refine 1 -temp_petscspace_degree 1 -dmts_check .0001 \ 643a3d0cf85SMatthew G. Knepley -ts_type beuler -ts_max_steps 5 -ts_dt 0.1 -snes_error_if_not_converged -pc_type lu 644c4762a1bSJed Brown test: 645a3d0cf85SMatthew G. Knepley # -dm_refine 2 -convest_num_refine 3 get L_2 convergence rate: [1.9] 646a3d0cf85SMatthew G. Knepley suffix: 3d_q1_sconv 64730602db0SMatthew G. Knepley args: -sol_type quadratic_linear -dm_plex_simplex 0 -temp_petscspace_degree 1 -ts_convergence_estimate -ts_convergence_temporal 0 -convest_num_refine 1 \ 648a3d0cf85SMatthew G. Knepley -ts_type beuler -ts_max_steps 1 -ts_dt 0.00001 -snes_error_if_not_converged -pc_type lu 649a3d0cf85SMatthew G. Knepley test: 650a3d0cf85SMatthew G. Knepley # -dm_refine 4 -convest_num_refine 3 get L_2 convergence rate: [1.2] 651a3d0cf85SMatthew G. Knepley suffix: 3d_q1_tconv 65230602db0SMatthew G. Knepley args: -sol_type quadratic_trig -dm_plex_simplex 0 -temp_petscspace_degree 1 -ts_convergence_estimate -convest_num_refine 1 \ 653a3d0cf85SMatthew G. Knepley -ts_type beuler -ts_max_steps 4 -ts_dt 0.1 -snes_error_if_not_converged -pc_type lu 654a3d0cf85SMatthew G. Knepley test: 655a3d0cf85SMatthew G. Knepley suffix: 3d_q2 65630602db0SMatthew G. Knepley args: -sol_type quadratic_linear -dm_plex_simplex 0 -dm_refine 0 -temp_petscspace_degree 2 -dmts_check .0001 \ 657a3d0cf85SMatthew G. Knepley -ts_type beuler -ts_max_steps 5 -ts_dt 0.1 -snes_error_if_not_converged -pc_type lu 658a3d0cf85SMatthew G. Knepley test: 659a3d0cf85SMatthew G. Knepley # -dm_refine 2 -convest_num_refine 3 get L_2 convergence rate: [2.9] 660a3d0cf85SMatthew G. Knepley suffix: 3d_q2_sconv 66130602db0SMatthew G. Knepley args: -sol_type trig_linear -dm_plex_simplex 0 -temp_petscspace_degree 2 -ts_convergence_estimate -ts_convergence_temporal 0 -convest_num_refine 1 \ 662a3d0cf85SMatthew G. Knepley -ts_type beuler -ts_max_steps 1 -ts_dt 0.00000001 -snes_error_if_not_converged -pc_type lu 663a3d0cf85SMatthew G. Knepley test: 664a3d0cf85SMatthew G. Knepley # -dm_refine 3 -convest_num_refine 3 get L_2 convergence rate: [1.0] 665a3d0cf85SMatthew G. Knepley suffix: 3d_q2_tconv 66630602db0SMatthew G. Knepley args: -sol_type quadratic_trig -dm_plex_simplex 0 -temp_petscspace_degree 2 -ts_convergence_estimate -convest_num_refine 1 \ 667a3d0cf85SMatthew G. Knepley -ts_type beuler -ts_max_steps 4 -ts_dt 0.1 -snes_error_if_not_converged -pc_type lu 668a3d0cf85SMatthew G. Knepley 669a3d0cf85SMatthew G. Knepley test: 670a3d0cf85SMatthew G. Knepley # For a nice picture, -bd_dm_refine 2 -dm_refine 1 -dm_view hdf5:${PETSC_DIR}/sol.h5 -ts_monitor_solution hdf5:${PETSC_DIR}/sol.h5::append 671a3d0cf85SMatthew G. Knepley suffix: egads_sphere 672a3d0cf85SMatthew G. Knepley requires: egads ctetgen 67330602db0SMatthew G. Knepley args: -sol_type quadratic_linear \ 6747279ac95SMatthew G. Knepley -dm_plex_boundary_filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/sphere_example.egadslite -dm_plex_boundary_label marker \ 675a3d0cf85SMatthew G. Knepley -temp_petscspace_degree 2 -dmts_check .0001 \ 676a3d0cf85SMatthew G. Knepley -ts_type beuler -ts_max_steps 5 -ts_dt 0.1 -snes_error_if_not_converged -pc_type lu 677c4762a1bSJed Brown 678*d9255fafSStefano Zampini test: 679*d9255fafSStefano Zampini suffix: remesh 680*d9255fafSStefano Zampini requires: triangle mmg 681*d9255fafSStefano Zampini args: -sol_type quadratic_trig -dm_refine 2 -temp_petscspace_degree 1 -ts_type beuler -ts_dt 0.01 -snes_error_if_not_converged -pc_type lu -grad_petscspace_degree 1 -dm_adaptor mmg -dm_plex_hash_location -remesh_every 5 682*d9255fafSStefano Zampini 683c4762a1bSJed Brown TEST*/ 684