78 virtual void ImplicitSolve(
const double dt,
const Vector &u,
Vector &k);
81 void SetParameters(
const Vector &u);
83 virtual ~ConductionOperator();
88 int main(
int argc,
char *argv[])
91 const char *mesh_file =
"../data/star.mesh";
94 int ode_solver_type = 3;
97 double alpha = 1.0e-2;
99 bool visualization =
true;
104 cout.precision(precision);
107 args.
AddOption(&mesh_file,
"-m",
"--mesh",
108 "Mesh file to use.");
109 args.
AddOption(&ref_levels,
"-r",
"--refine",
110 "Number of times to refine the mesh uniformly.");
112 "Order (degree) of the finite elements.");
113 args.
AddOption(&ode_solver_type,
"-s",
"--ode-solver",
114 "ODE solver: 1 - Backward Euler, 2 - SDIRK2, 3 - SDIRK3,\n\t"
115 "\t 11 - Forward Euler, 12 - RK2, 13 - RK3 SSP, 14 - RK4.");
116 args.
AddOption(&t_final,
"-tf",
"--t-final",
117 "Final time; start time is 0.");
118 args.
AddOption(&dt,
"-dt",
"--time-step",
121 "Alpha coefficient.");
123 "Kappa coefficient offset.");
124 args.
AddOption(&visualization,
"-vis",
"--visualization",
"-no-vis",
125 "--no-visualization",
126 "Enable or disable GLVis visualization.");
127 args.
AddOption(&visit,
"-visit",
"--visit-datafiles",
"-no-visit",
128 "--no-visit-datafiles",
129 "Save data files for VisIt (visit.llnl.gov) visualization.");
130 args.
AddOption(&vis_steps,
"-vs",
"--visualization-steps",
131 "Visualize every n-th timestep.");
142 Mesh *mesh =
new Mesh(mesh_file, 1, 1);
149 switch (ode_solver_type)
157 case 12: ode_solver =
new RK2Solver(0.5);
break;
159 case 14: ode_solver =
new RK4Solver;
break;
165 cout <<
"Unknown ODE solver type: " << ode_solver_type <<
'\n';
172 for (
int lev = 0; lev < ref_levels; lev++)
183 cout <<
"Number of temperature unknowns: " << fe_size << endl;
195 ConductionOperator oper(fespace, alpha, kappa, u);
199 ofstream omesh(
"ex16.mesh");
200 omesh.precision(precision);
202 ofstream osol(
"ex16-init.gf");
203 osol.precision(precision);
219 char vishost[] =
"localhost";
221 sout.
open(vishost, visport);
224 cout <<
"Unable to connect to GLVis server at "
225 << vishost <<
':' << visport << endl;
226 visualization =
false;
227 cout <<
"GLVis visualization disabled.\n";
231 sout.precision(precision);
232 sout <<
"solution\n" << *mesh << u_gf;
235 cout <<
"GLVis visualization paused."
236 <<
" Press space (in the GLVis window) to resume it.\n";
242 ode_solver->
Init(oper);
245 bool last_step =
false;
246 for (
int ti = 1; !last_step; ti++)
248 if (t + dt >= t_final - dt/2)
253 ode_solver->
Step(u, t, dt);
255 if (last_step || (ti % vis_steps) == 0)
257 cout <<
"step " << ti <<
", t = " << t << endl;
262 sout <<
"solution\n" << *mesh << u_gf << flush;
272 oper.SetParameters(u);
278 ofstream osol(
"ex16-final.gf");
279 osol.precision(precision);
291 double kap,
const Vector &u)
293 T(NULL), current_dt(0.0), z(height)
295 const double rel_tol = 1e-8;
300 M->FormSystemMatrix(ess_tdof_list, Mmat);
302 M_solver.iterative_mode =
false;
303 M_solver.SetRelTol(rel_tol);
304 M_solver.SetAbsTol(0.0);
305 M_solver.SetMaxIter(30);
306 M_solver.SetPrintLevel(0);
307 M_solver.SetPreconditioner(M_prec);
308 M_solver.SetOperator(Mmat);
313 T_solver.iterative_mode =
false;
314 T_solver.SetRelTol(rel_tol);
315 T_solver.SetAbsTol(0.0);
316 T_solver.SetMaxIter(100);
317 T_solver.SetPrintLevel(0);
318 T_solver.SetPreconditioner(T_prec);
330 M_solver.Mult(z, du_dt);
333 void ConductionOperator::ImplicitSolve(
const double dt,
341 T =
Add(1.0, Mmat, dt, Kmat);
343 T_solver.SetOperator(*T);
345 MFEM_VERIFY(dt == current_dt,
"");
348 T_solver.Mult(z, du_dt);
351 void ConductionOperator::SetParameters(
const Vector &u)
354 u_alpha_gf.SetFromTrueDofs(u);
355 for (
int i = 0; i < u_alpha_gf.Size(); i++)
367 K->FormSystemMatrix(ess_tdof_list, Kmat);
372 ConductionOperator::~ConductionOperator()
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.
virtual void Init(TimeDependentOperator &f)
Associate a TimeDependentOperator with the ODE solver.
Base abstract class for 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]...
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...
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.
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.
virtual int GetTrueVSize()
Return the number of vector true (conforming) dofs.
void PrintOptions(std::ostream &out) const
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.
virtual void Print(std::ostream &out=std::cout) const