66 class DG_Solver :
public Solver
78 BlockILU::Reordering::MINIMUM_DISCARDED_FILL),
81 linear_solver.iterative_mode =
false;
82 linear_solver.SetRelTol(1e-9);
83 linear_solver.SetAbsTol(0.0);
84 linear_solver.SetMaxIter(100);
85 linear_solver.SetPrintLevel(0);
86 linear_solver.SetPreconditioner(prec);
89 void SetTimeStep(
double dt_)
100 linear_solver.SetOperator(A);
104 void SetOperator(
const Operator &op)
106 linear_solver.SetOperator(op);
111 linear_solver.Mult(x, y);
127 DG_Solver *dg_solver;
135 virtual void ImplicitSolve(
const double dt,
const Vector &x,
Vector &k);
141 int main(
int argc,
char *argv[])
145 const char *mesh_file =
"../data/periodic-hexagon.mesh";
151 const char *device_config =
"cpu";
152 int ode_solver_type = 4;
153 double t_final = 10.0;
155 bool visualization =
true;
157 bool paraview =
false;
162 cout.precision(precision);
165 args.
AddOption(&mesh_file,
"-m",
"--mesh",
166 "Mesh file to use.");
168 "Problem setup to use. See options in velocity_function().");
169 args.
AddOption(&ref_levels,
"-r",
"--refine",
170 "Number of times to refine the mesh uniformly.");
172 "Order (degree) of the finite elements.");
173 args.
AddOption(&pa,
"-pa",
"--partial-assembly",
"-no-pa",
174 "--no-partial-assembly",
"Enable Partial Assembly.");
175 args.
AddOption(&ea,
"-ea",
"--element-assembly",
"-no-ea",
176 "--no-element-assembly",
"Enable Element Assembly.");
177 args.
AddOption(&fa,
"-fa",
"--full-assembly",
"-no-fa",
178 "--no-full-assembly",
"Enable Full Assembly.");
179 args.
AddOption(&device_config,
"-d",
"--device",
180 "Device configuration string, see Device::Configure().");
181 args.
AddOption(&ode_solver_type,
"-s",
"--ode-solver",
182 "ODE solver: 1 - Forward Euler,\n\t"
183 " 2 - RK2 SSP, 3 - RK3 SSP, 4 - RK4, 6 - RK6,\n\t"
184 " 11 - Backward Euler,\n\t"
185 " 12 - SDIRK23 (L-stable), 13 - SDIRK33,\n\t"
186 " 22 - Implicit Midpoint Method,\n\t"
187 " 23 - SDIRK23 (A-stable), 24 - SDIRK34");
188 args.
AddOption(&t_final,
"-tf",
"--t-final",
189 "Final time; start time is 0.");
190 args.
AddOption(&dt,
"-dt",
"--time-step",
192 args.
AddOption(&visualization,
"-vis",
"--visualization",
"-no-vis",
193 "--no-visualization",
194 "Enable or disable GLVis visualization.");
195 args.
AddOption(&visit,
"-visit",
"--visit-datafiles",
"-no-visit",
196 "--no-visit-datafiles",
197 "Save data files for VisIt (visit.llnl.gov) visualization.");
198 args.
AddOption(¶view,
"-paraview",
"--paraview-datafiles",
"-no-paraview",
199 "--no-paraview-datafiles",
200 "Save data files for ParaView (paraview.org) visualization.");
201 args.
AddOption(&binary,
"-binary",
"--binary-datafiles",
"-ascii",
203 "Use binary (Sidre) or ascii format for VisIt data files.");
204 args.
AddOption(&vis_steps,
"-vs",
"--visualization-steps",
205 "Visualize every n-th timestep.");
214 Device device(device_config);
219 Mesh mesh(mesh_file, 1, 1);
225 switch (ode_solver_type)
229 case 2: ode_solver =
new RK2Solver(1.0);
break;
231 case 4: ode_solver =
new RK4Solver;
break;
232 case 6: ode_solver =
new RK6Solver;
break;
243 cout <<
"Unknown ODE solver type: " << ode_solver_type <<
'\n';
251 for (
int lev = 0; lev < ref_levels; lev++)
266 cout <<
"Number of unknowns: " << fes.
GetVSize() << endl;
317 ofstream omesh(
"ex9.mesh");
318 omesh.precision(precision);
320 ofstream osol(
"ex9-init.gf");
321 osol.precision(precision);
332 #ifdef MFEM_USE_SIDRE
335 MFEM_ABORT(
"Must build with MFEM_USE_SIDRE=YES for binary output.");
368 sout.
open(vishost, visport);
371 cout <<
"Unable to connect to GLVis server at "
372 << vishost <<
':' << visport << endl;
373 visualization =
false;
374 cout <<
"GLVis visualization disabled.\n";
378 sout.precision(precision);
379 sout <<
"solution\n" << mesh << u;
382 cout <<
"GLVis visualization paused."
383 <<
" Press space (in the GLVis window) to resume it.\n";
394 ode_solver->
Init(adv);
397 for (
int ti = 0; !done; )
399 double dt_real = min(dt, t_final - t);
400 ode_solver->
Step(u, t, dt_real);
403 done = (t >= t_final - 1e-8*dt);
405 if (done || ti % vis_steps == 0)
407 cout <<
"time step: " << ti <<
", time: " << t << endl;
411 sout <<
"solution\n" << mesh << u << flush;
433 ofstream osol(
"ex9-final.gf");
434 osol.precision(precision);
482 MFEM_VERIFY(dg_solver != NULL,
483 "Implicit time integration is not supported with partial assembly");
486 dg_solver->SetTimeStep(dt);
487 dg_solver->Mult(z, k);
503 for (
int i = 0; i <
dim; i++)
516 case 1: v(0) = 1.0;
break;
517 case 2: v(0) = sqrt(2./3.); v(1) = sqrt(1./3.);
break;
518 case 3: v(0) = sqrt(3./6.); v(1) = sqrt(2./6.); v(2) = sqrt(1./6.);
527 const double w = M_PI/2;
530 case 1: v(0) = 1.0;
break;
531 case 2: v(0) = w*X(1); v(1) = -w*X(0);
break;
532 case 3: v(0) = w*X(1); v(1) = -w*X(0); v(2) = 0.0;
break;
539 const double w = M_PI/2;
540 double d = max((X(0)+1.)*(1.-X(0)),0.) * max((X(1)+1.)*(1.-X(1)),0.);
544 case 1: v(0) = 1.0;
break;
545 case 2: v(0) = d*w*X(1); v(1) = -d*w*X(0);
break;
546 case 3: v(0) = d*w*X(1); v(1) = -d*w*X(0); v(2) = 0.0;
break;
560 for (
int i = 0; i <
dim; i++)
574 return exp(-40.*pow(X(0)-0.5,2));
578 double rx = 0.45, ry = 0.25, cx = 0., cy = -0.2, w = 10.;
581 const double s = (1. + 0.25*cos(2*M_PI*X(2)));
585 return ( erfc(w*(X(0)-cx-rx))*erfc(-w*(X(0)-cx+rx)) *
586 erfc(w*(X(1)-cy-ry))*erfc(-w*(X(1)-cy+ry)) )/16;
592 double x_ = X(0), y_ = X(1), rho, phi;
595 return pow(sin(M_PI*rho),2)*sin(3*phi);
599 const double f = M_PI;
600 return sin(f*X(0))*sin(f*X(1));
void SetPrecision(int prec)
Set the precision (number of digits) used for the text output of doubles.
int GetVSize() const
Return the number of vector dofs, i.e. GetNDofs() x GetVDim().
virtual void Print(std::ostream &out=mfem::out) const
Conjugate gradient method.
Class for grid function - Vector with associated FE space.
void SetCycle(int c)
Set time cycle (for time-dependent simulations)
Data type for scaled Jacobi-type smoother of sparse matrix.
void SetDataFormat(VTKFormat fmt)
virtual void Mult(const Vector &b, Vector &x) const
Operator application: y=A(x).
Helper class for ParaView visualization data.
Base abstract class for first order time dependent operators.
void Mult(const Table &A, const Table &B, Table &C)
C = A * B (as boolean matrices)
void GetBoundingBox(Vector &min, Vector &max, int ref=2)
Returns the minimum and maximum corners of the mesh bounding box.
virtual void Step(Vector &x, double &t, double &dt)=0
Perform a time step from time t [in] to time t [out] based on the requested step size dt [in]...
virtual void Init(TimeDependentOperator &f)
Associate a TimeDependentOperator with the ODE solver.
virtual void SetTime(const double _t)
Set the current time.
int Size() const
Returns the size of the vector.
Abstract class for solving systems of ODEs: dx/dt = f(x,t)
void Print(std::ostream &out=mfem::out)
Print the configuration of the MFEM virtual device object.
bool iterative_mode
If true, use the second argument of Mult() as an initial guess.
int main(int argc, char *argv[])
Backward Euler ODE solver. L-stable.
FE_Evolution(FiniteElementSpace &_vfes, Operator &_A, SparseMatrix &_Aflux)
Data collection with Sidre routines following the Conduit mesh blueprint specification.
virtual void Save(std::ostream &out) const
Save the GridFunction to an output stream.
virtual void RegisterField(const std::string &field_name, GridFunction *gf)
Add a grid function to the collection.
void SetPrintLevel(int print_lvl)
void Parse()
Parse the command-line options. Note that this function expects all the options provided through the ...
virtual void Save()
Save the collection to disk.
Jacobi smoothing for a given bilinear form (no matrix necessary).
void UniformRefinement(int i, const DSTable &, int *, int *, int *)
Data collection with VisIt I/O routines.
void SetMaxIter(int max_it)
virtual void SetCurvature(int order, bool discont=false, int space_dim=-1, int ordering=1)
void SetHighOrderOutput(bool high_order_output_)
void PrintUsage(std::ostream &out) const
Print the usage message.
void SetTime(double t)
Set physical time (for time-dependent simulations)
A general vector function coefficient.
The classical explicit forth-order Runge-Kutta method, RK4.
void SetAbsTol(double atol)
virtual void ImplicitSolve(const double dt, const Vector &x, Vector &k)
Solve the equation: k = f(x + dt k, t), for the unknown k at the current time t.
void SetRelTol(double rtol)
void velocity_function(const Vector &x, Vector &v)
Class FiniteElementSpace - responsible for providing FEM view of the mesh, mainly managing the set of...
int GetDof() const
Returns the number of degrees of freedom in the finite element.
void AddOption(bool *var, const char *enable_short_name, const char *enable_long_name, const char *disable_short_name, const char *disable_long_name, const char *description, bool required=false)
Add a boolean option and set 'var' to receive the value. Enable/disable tags are used to set the bool...
Third-order, strong stability preserving (SSP) Runge-Kutta method.
virtual void Mult(const Vector &x, Vector &y) const
Perform the action of the operator: y = k = f(x, t), where k solves the algebraic equation F(x...
Implicit midpoint method. A-stable, not L-stable.
NURBSExtension * NURBSext
Optional NURBS mesh extension.
const FiniteElement * GetFE(int i) const
Returns pointer to the FiniteElement in the FiniteElementCollection associated with i'th element in t...
void PrintOptions(std::ostream &out) const
Print the options.
virtual void ProjectCoefficient(Coefficient &coeff)
int open(const char hostname[], int port)
Open the socket stream on 'port' at 'hostname'.
double u0_function(const Vector &x)
void SetLevelsOfDetail(int levels_of_detail_)
virtual void SetOperator(const Operator &op)
Also calls SetOperator for the preconditioner if there is one.
A general function coefficient.
virtual void SetPreconditioner(Solver &pr)
This should be called before SetOperator.
virtual void Save() override
The MFEM Device class abstracts hardware devices such as GPUs, as well as programming models such as ...
The classical forward Euler method.
void SetPrefixPath(const std::string &prefix)
Set the path where the DataCollection will be saved.
double inflow_function(const Vector &x)
Arbitrary order "L2-conforming" discontinuous finite elements.
double f(const Vector &p)
bool Good() const
Return true if the command line options were parsed successfully.