67 class DG_Solver :
public Solver
81 linear_solver(M.GetComm()),
83 BlockILU::Reordering::MINIMUM_DISCARDED_FILL),
86 linear_solver.iterative_mode =
false;
87 linear_solver.SetRelTol(1e-9);
88 linear_solver.SetAbsTol(0.0);
89 linear_solver.SetMaxIter(100);
90 linear_solver.SetPrintLevel(0);
91 linear_solver.SetPreconditioner(prec);
96 void SetTimeStep(
double dt_)
103 A =
Add(-dt, K, 0.0, K);
106 A_diag.
Add(1.0, M_diag);
108 linear_solver.SetOperator(*A);
112 void SetOperator(
const Operator &op)
114 linear_solver.SetOperator(op);
119 linear_solver.Mult(x, y);
140 DG_Solver *dg_solver;
148 virtual void ImplicitSolve(
const double dt,
const Vector &x,
Vector &k);
154 int main(
int argc,
char *argv[])
158 MPI_Init(&argc, &argv);
159 MPI_Comm_size(MPI_COMM_WORLD, &num_procs);
160 MPI_Comm_rank(MPI_COMM_WORLD, &myid);
164 const char *mesh_file =
"../data/periodic-hexagon.mesh";
165 int ser_ref_levels = 2;
166 int par_ref_levels = 0;
171 const char *device_config =
"cpu";
172 int ode_solver_type = 4;
173 double t_final = 10.0;
175 bool visualization =
true;
177 bool paraview =
false;
183 cout.precision(precision);
186 args.
AddOption(&mesh_file,
"-m",
"--mesh",
187 "Mesh file to use.");
189 "Problem setup to use. See options in velocity_function().");
190 args.
AddOption(&ser_ref_levels,
"-rs",
"--refine-serial",
191 "Number of times to refine the mesh uniformly in serial.");
192 args.
AddOption(&par_ref_levels,
"-rp",
"--refine-parallel",
193 "Number of times to refine the mesh uniformly in parallel.");
195 "Order (degree) of the finite elements.");
196 args.
AddOption(&pa,
"-pa",
"--partial-assembly",
"-no-pa",
197 "--no-partial-assembly",
"Enable Partial Assembly.");
198 args.
AddOption(&ea,
"-ea",
"--element-assembly",
"-no-ea",
199 "--no-element-assembly",
"Enable Element Assembly.");
200 args.
AddOption(&fa,
"-fa",
"--full-assembly",
"-no-fa",
201 "--no-full-assembly",
"Enable Full Assembly.");
202 args.
AddOption(&device_config,
"-d",
"--device",
203 "Device configuration string, see Device::Configure().");
204 args.
AddOption(&ode_solver_type,
"-s",
"--ode-solver",
205 "ODE solver: 1 - Forward Euler,\n\t"
206 " 2 - RK2 SSP, 3 - RK3 SSP, 4 - RK4, 6 - RK6,\n\t"
207 " 11 - Backward Euler,\n\t"
208 " 12 - SDIRK23 (L-stable), 13 - SDIRK33,\n\t"
209 " 22 - Implicit Midpoint Method,\n\t"
210 " 23 - SDIRK23 (A-stable), 24 - SDIRK34");
211 args.
AddOption(&t_final,
"-tf",
"--t-final",
212 "Final time; start time is 0.");
213 args.
AddOption(&dt,
"-dt",
"--time-step",
215 args.
AddOption(&visualization,
"-vis",
"--visualization",
"-no-vis",
216 "--no-visualization",
217 "Enable or disable GLVis visualization.");
218 args.
AddOption(&visit,
"-visit",
"--visit-datafiles",
"-no-visit",
219 "--no-visit-datafiles",
220 "Save data files for VisIt (visit.llnl.gov) visualization.");
221 args.
AddOption(¶view,
"-paraview",
"--paraview-datafiles",
"-no-paraview",
222 "--no-paraview-datafiles",
223 "Save data files for ParaView (paraview.org) visualization.");
224 args.
AddOption(&adios2,
"-adios2",
"--adios2-streams",
"-no-adios2",
225 "--no-adios2-streams",
226 "Save data using adios2 streams.");
227 args.
AddOption(&binary,
"-binary",
"--binary-datafiles",
"-ascii",
229 "Use binary (Sidre) or ascii format for VisIt data files.");
230 args.
AddOption(&vis_steps,
"-vs",
"--visualization-steps",
231 "Visualize every n-th timestep.");
247 Device device(device_config);
248 if (myid == 0) { device.
Print(); }
252 Mesh *mesh =
new Mesh(mesh_file, 1, 1);
258 switch (ode_solver_type)
262 case 2: ode_solver =
new RK2Solver(1.0);
break;
264 case 4: ode_solver =
new RK4Solver;
break;
265 case 6: ode_solver =
new RK6Solver;
break;
277 cout <<
"Unknown ODE solver type: " << ode_solver_type <<
'\n';
288 for (
int lev = 0; lev < ser_ref_levels; lev++)
303 for (
int lev = 0; lev < par_ref_levels; lev++)
316 cout <<
"Number of unknowns: " << global_vSize << endl;
373 ostringstream mesh_name, sol_name;
374 mesh_name <<
"ex9-mesh." << setfill(
'0') << setw(6) << myid;
375 sol_name <<
"ex9-init." << setfill(
'0') << setw(6) << myid;
376 ofstream omesh(mesh_name.str().c_str());
377 omesh.precision(precision);
379 ofstream osol(sol_name.str().c_str());
380 osol.precision(precision);
391 #ifdef MFEM_USE_SIDRE
394 MFEM_ABORT(
"Must build with MFEM_USE_SIDRE=YES for binary output.");
426 #ifdef MFEM_USE_ADIOS2
430 std::string postfix(mesh_file);
431 postfix.erase(0, std::string(
"../data/").size() );
433 const std::string collection_name =
"ex9-p-" + postfix +
".bp";
451 sout.
open(vishost, visport);
455 cout <<
"Unable to connect to GLVis server at "
456 << vishost <<
':' << visport << endl;
457 visualization =
false;
460 cout <<
"GLVis visualization disabled.\n";
465 sout <<
"parallel " << num_procs <<
" " << myid <<
"\n";
466 sout.precision(precision);
467 sout <<
"solution\n" << *pmesh << *u;
471 cout <<
"GLVis visualization paused."
472 <<
" Press space (in the GLVis window) to resume it.\n";
483 ode_solver->
Init(adv);
486 for (
int ti = 0; !done; )
488 double dt_real = min(dt, t_final - t);
489 ode_solver->
Step(*U, t, dt_real);
492 done = (t >= t_final - 1e-8*dt);
494 if (done || ti % vis_steps == 0)
498 cout <<
"time step: " << ti <<
", time: " << t << endl;
507 sout <<
"parallel " << num_procs <<
" " << myid <<
"\n";
508 sout <<
"solution\n" << *pmesh << *u << flush;
525 #ifdef MFEM_USE_ADIOS2
541 ostringstream sol_name;
542 sol_name <<
"ex9-final." << setfill(
'0') << setw(6) << myid;
543 ofstream osol(sol_name.str().c_str());
544 osol.precision(precision);
559 #ifdef MFEM_USE_ADIOS2
577 M_solver(_M.ParFESpace()->GetComm()),
601 dg_solver =
new DG_Solver(M_mat, K_mat, *_M.
FESpace());
621 dg_solver->SetTimeStep(dt);
622 dg_solver->Mult(z, k);
647 for (
int i = 0; i <
dim; i++)
660 case 1: v(0) = 1.0;
break;
661 case 2: v(0) = sqrt(2./3.); v(1) = sqrt(1./3.);
break;
662 case 3: v(0) = sqrt(3./6.); v(1) = sqrt(2./6.); v(2) = sqrt(1./6.);
671 const double w = M_PI/2;
674 case 1: v(0) = 1.0;
break;
675 case 2: v(0) = w*X(1); v(1) = -w*X(0);
break;
676 case 3: v(0) = w*X(1); v(1) = -w*X(0); v(2) = 0.0;
break;
683 const double w = M_PI/2;
684 double d = max((X(0)+1.)*(1.-X(0)),0.) * max((X(1)+1.)*(1.-X(1)),0.);
688 case 1: v(0) = 1.0;
break;
689 case 2: v(0) = d*w*X(1); v(1) = -d*w*X(0);
break;
690 case 3: v(0) = d*w*X(1); v(1) = -d*w*X(0); v(2) = 0.0;
break;
704 for (
int i = 0; i <
dim; i++)
718 return exp(-40.*pow(X(0)-0.5,2));
722 double rx = 0.45, ry = 0.25, cx = 0., cy = -0.2, w = 10.;
725 const double s = (1. + 0.25*cos(2*M_PI*X(2)));
729 return ( erfc(w*(X(0)-cx-rx))*erfc(-w*(X(0)-cx+rx)) *
730 erfc(w*(X(1)-cy-ry))*erfc(-w*(X(1)-cy+ry)) )/16;
736 double x_ = X(0), y_ = X(1), rho, phi;
739 return pow(sin(M_PI*rho),2)*sin(3*phi);
743 const double f = M_PI;
744 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.
void Add(const int i, const int j, const double a)
Conjugate gradient method.
void SetCycle(int c)
Set time cycle (for time-dependent simulations)
void SetDataFormat(VTKFormat fmt)
virtual void Mult(const Vector &b, Vector &x) const
Operator application: y=A(x).
std::string to_string(int i)
Convert an integer to an std::string.
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.
Pointer to an Operator of a specified type.
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)
virtual void Save(std::ostream &out) const
void Print(std::ostream &out=mfem::out)
Print the configuration of the MFEM virtual device object.
Abstract parallel finite element space.
virtual void ProjectCoefficient(Coefficient &coeff)
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.
void Add(const DenseMatrix &A, const DenseMatrix &B, double alpha, DenseMatrix &C)
C = A + alpha*B.
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)
HYPRE_Int GlobalTrueVSize() const
virtual void Print(std::ostream &out=mfem::out) const
void SetParameter(const std::string key, const std::string value) noexcept
Parallel smoothers in hypre.
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.
Wrapper for hypre's parallel vector class.
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.
void GetDiag(Vector &d) const
Returns the Diagonal of A.
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.
HypreParVector * GetTrueDofs() const
Returns the true dofs in a new HypreParVector.
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
Class for parallel grid function.
The MFEM Device class abstracts hardware devices such as GPUs, as well as programming models such as ...
The classical forward Euler method.
Wrapper for hypre's ParCSR matrix class.
Class for parallel meshes.
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.