79 virtual void ImplicitSolve(
const double dt,
const Vector &u,
Vector &k);
82 void SetParameters(
const Vector &u);
84 virtual ~ConductionOperator();
89 int main(
int argc,
char *argv[])
92 const char *mesh_file =
"../data/star.mesh";
95 int ode_solver_type = 3;
98 double alpha = 1.0e-2;
100 bool visualization =
true;
105 cout.precision(precision);
108 args.
AddOption(&mesh_file,
"-m",
"--mesh",
109 "Mesh file to use.");
110 args.
AddOption(&ref_levels,
"-r",
"--refine",
111 "Number of times to refine the mesh uniformly.");
113 "Order (degree) of the finite elements.");
114 args.
AddOption(&ode_solver_type,
"-s",
"--ode-solver",
115 "ODE solver: 1 - Backward Euler, 2 - SDIRK2, 3 - SDIRK3,\n\t"
116 "\t 11 - Forward Euler, 12 - RK2, 13 - RK3 SSP, 14 - RK4.");
117 args.
AddOption(&t_final,
"-tf",
"--t-final",
118 "Final time; start time is 0.");
119 args.
AddOption(&dt,
"-dt",
"--time-step",
122 "Alpha coefficient.");
124 "Kappa coefficient offset.");
125 args.
AddOption(&visualization,
"-vis",
"--visualization",
"-no-vis",
126 "--no-visualization",
127 "Enable or disable GLVis visualization.");
128 args.
AddOption(&visit,
"-visit",
"--visit-datafiles",
"-no-visit",
129 "--no-visit-datafiles",
130 "Save data files for VisIt (visit.llnl.gov) visualization.");
131 args.
AddOption(&vis_steps,
"-vs",
"--visualization-steps",
132 "Visualize every n-th timestep.");
143 Mesh *mesh =
new Mesh(mesh_file, 1, 1);
150 switch (ode_solver_type)
158 case 12: ode_solver =
new RK2Solver(0.5);
break;
160 case 14: ode_solver =
new RK4Solver;
break;
167 cout <<
"Unknown ODE solver type: " << ode_solver_type <<
'\n';
175 for (
int lev = 0; lev < ref_levels; lev++)
186 cout <<
"Number of temperature unknowns: " << fe_size << endl;
198 ConductionOperator oper(fespace, alpha, kappa, u);
202 ofstream omesh(
"ex16.mesh");
203 omesh.precision(precision);
205 ofstream osol(
"ex16-init.gf");
206 osol.precision(precision);
222 char vishost[] =
"localhost";
224 sout.
open(vishost, visport);
227 cout <<
"Unable to connect to GLVis server at "
228 << vishost <<
':' << visport << endl;
229 visualization =
false;
230 cout <<
"GLVis visualization disabled.\n";
234 sout.precision(precision);
235 sout <<
"solution\n" << *mesh << u_gf;
238 cout <<
"GLVis visualization paused."
239 <<
" Press space (in the GLVis window) to resume it.\n";
245 ode_solver->
Init(oper);
248 bool last_step =
false;
249 for (
int ti = 1; !last_step; ti++)
251 if (t + dt >= t_final - dt/2)
256 ode_solver->
Step(u, t, dt);
258 if (last_step || (ti % vis_steps) == 0)
260 cout <<
"step " << ti <<
", t = " << t << endl;
265 sout <<
"solution\n" << *mesh << u_gf << flush;
275 oper.SetParameters(u);
281 ofstream osol(
"ex16-final.gf");
282 osol.precision(precision);
294 double kap,
const Vector &u)
296 T(NULL), current_dt(0.0), z(height)
298 const double rel_tol = 1e-8;
303 M->FormSystemMatrix(ess_tdof_list, Mmat);
305 M_solver.iterative_mode =
false;
306 M_solver.SetRelTol(rel_tol);
307 M_solver.SetAbsTol(0.0);
308 M_solver.SetMaxIter(30);
309 M_solver.SetPrintLevel(0);
310 M_solver.SetPreconditioner(M_prec);
311 M_solver.SetOperator(Mmat);
316 T_solver.iterative_mode =
false;
317 T_solver.SetRelTol(rel_tol);
318 T_solver.SetAbsTol(0.0);
319 T_solver.SetMaxIter(100);
320 T_solver.SetPrintLevel(0);
321 T_solver.SetPreconditioner(T_prec);
333 M_solver.Mult(z, du_dt);
336 void ConductionOperator::ImplicitSolve(
const double dt,
344 T =
Add(1.0, Mmat, dt, Kmat);
346 T_solver.SetOperator(*T);
348 MFEM_VERIFY(dt == current_dt,
"");
351 T_solver.Mult(z, du_dt);
354 void ConductionOperator::SetParameters(
const Vector &u)
357 u_alpha_gf.SetFromTrueDofs(u);
358 for (
int i = 0; i < u_alpha_gf.Size(); i++)
370 K->FormSystemMatrix(ess_tdof_list, Kmat);
375 ConductionOperator::~ConductionOperator()
virtual void Print(std::ostream &out=mfem::out) const
Conjugate gradient method.
Class for grid function - Vector with associated FE space.
double InitialTemperature(const Vector &x)
void SetCycle(int c)
Set time cycle (for time-dependent simulations)
Data type for scaled Jacobi-type smoother of sparse matrix.
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)
double Norml2() const
Returns the l2 norm of the vector.
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.
Coefficient defined by a GridFunction. This coefficient is mesh dependent.
Abstract class for solving systems of ODEs: dx/dt = f(x,t)
virtual void Save()
Save the collection and a VisIt root file.
int main(int argc, char *argv[])
Backward Euler ODE solver. L-stable.
virtual void Save(std::ostream &out) const
Save the GridFunction to an output stream.
void Add(const DenseMatrix &A, const DenseMatrix &B, double alpha, DenseMatrix &C)
C = A + alpha*B.
void UniformRefinement(int i, const DSTable &, int *, int *, int *)
Data collection with VisIt I/O routines.
void GetTrueDofs(Vector &tv) const
Extract the true-dofs from the GridFunction. If all dofs are true, then tv will be set to point to th...
virtual int GetTrueVSize() const
Return the number of vector true (conforming) dofs.
void PrintUsage(std::ostream &out) const
void SetTime(double t)
Set physical time (for time-dependent simulations)
The classical explicit forth-order Runge-Kutta method, RK4.
Class FiniteElementSpace - responsible for providing FEM view of the mesh, mainly managing the set of...
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)
Third-order, strong stability preserving (SSP) Runge-Kutta method.
virtual void RegisterField(const std::string &field_name, GridFunction *gf)
Add a grid function to the collection and update the root file.
Implicit midpoint method. A-stable, not L-stable.
void PrintOptions(std::ostream &out) const
virtual void ProjectCoefficient(Coefficient &coeff)
int open(const char hostname[], int port)
class for C-function coefficient
Arbitrary order H1-conforming (continuous) finite elements.
The classical forward Euler method.
virtual void SetFromTrueDofs(const Vector &tv)
Set the GridFunction from the given true-dof vector.