73 int main(
int argc,
char *argv[])
77 MPI_Init(&argc, &argv);
78 MPI_Comm_size(MPI_COMM_WORLD, &num_procs);
79 MPI_Comm_rank(MPI_COMM_WORLD, &myid);
84 const char *mesh_file =
"../data/star-hilbert.mesh";
87 double max_elem_error = 1.0e-4;
88 double hysteresis = 0.25;
91 bool visualization =
true;
95 args.
AddOption(&mesh_file,
"-m",
"--mesh",
98 "Problem setup to use: 0 = spherical front, 1 = ball.");
100 "Number of solution features (fronts/balls).");
102 "Finite element order (polynomial degree).");
103 args.
AddOption(&max_elem_error,
"-e",
"--max-err",
104 "Maximum element error");
105 args.
AddOption(&hysteresis,
"-y",
"--hysteresis",
106 "Derefinement safety coefficient.");
107 args.
AddOption(&ref_levels,
"-r",
"--ref-levels",
108 "Number of initial uniform refinement levels.");
109 args.
AddOption(&nc_limit,
"-l",
"--nc-limit",
110 "Maximum level of hanging nodes.");
111 args.
AddOption(&t_final,
"-tf",
"--t-final",
112 "Final time; start time is 0.");
113 args.
AddOption(&visualization,
"-vis",
"--visualization",
"-no-vis",
114 "--no-visualization",
115 "Enable or disable GLVis visualization.");
116 args.
AddOption(&visit,
"-visit",
"--visit-datafiles",
"-no-visit",
117 "--no-visit-datafiles",
118 "Save data files for VisIt (visit.llnl.gov) visualization.");
137 Mesh *mesh =
new Mesh(mesh_file, 1, 1);
146 if (ref_levels > 0) { ref_levels--; }
150 for (
int l = 0; l < ref_levels; l++)
159 ParMesh pmesh(MPI_COMM_WORLD, *mesh);
163 "Boundary attributes required in the mesh.");
191 char vishost[] =
"localhost";
197 sout.
open(vishost, visport);
202 cout <<
"Unable to connect to GLVis server at "
203 << vishost <<
':' << visport << endl;
204 cout <<
"GLVis visualization disabled.\n";
206 visualization =
false;
247 for (
double time = 0.0; time < t_final + 1e-10; time += 0.01)
251 cout <<
"\nTime " << time <<
"\n\nRefinement:" << endl;
264 for (
int ref_it = 1; ; ref_it++)
269 cout <<
"Iteration: " << ref_it <<
", number of unknowns: "
270 << global_dofs << flush;
305 sout <<
"parallel " << num_procs <<
" " << myid <<
"\n";
306 sout <<
"solution\n" << pmesh << x << flush;
319 refiner.
Apply(pmesh);
322 cout <<
", total error: " << estimator.
GetTotalError() << endl;
340 if (derefiner.
Apply(pmesh))
344 cout <<
"\nDerefined elements." << endl;
394 double front(
double x,
double y,
double z,
double t,
int)
396 double r = sqrt(x*x + y*y + z*z);
397 return exp(-0.5*pow((r - t)/
alpha, 2));
402 double x2 = x*x, y2 = y*y, z2 = z*z, t2 = t*t;
403 double r = sqrt(x2 + y2 + z2);
405 return -exp(-0.5*pow((r - t)/alpha, 2)) / a4 *
406 (-2*t*(x2 + y2 + z2 - (dim-1)*a2/2)/r + x2 + y2 + z2 + t2 - dim*a2);
410 double ball(
double x,
double y,
double z,
double t,
int)
412 double r = sqrt(x*x + y*y + z*z);
413 return -atan(2*(r - t)/
alpha);
418 double x2 = x*x, y2 = y*y, z2 = z*z, t2 = 4*t*t;
419 double r = sqrt(x2 + y2 + z2);
421 double den = pow(-a2 - 4*(x2 + y2 + z2 - 2*r*t) - t2, 2.0);
422 return (dim == 2) ? 2*alpha*(a2 + t2 - 4*x2 - 4*y2)/r/den
423 : 4*alpha*(a2 + t2 - 4*r*t)/r/den;
427 template<
typename F0,
typename F1>
431 double x = pt(0), y = pt(1), z = 0.0;
432 if (dim == 3) { z = pt(2); }
438 return f0(x, y, z, t, dim);
445 double x0 = 0.5*cos(2*M_PI * i / nfeatures);
446 double y0 = 0.5*sin(2*M_PI * i / nfeatures);
447 sum += f0(x - x0, y - y0, z, t, dim);
457 double x0 = 0.5*cos(2*M_PI * i / nfeatures + M_PI*t);
458 double y0 = 0.5*sin(2*M_PI * i / nfeatures + M_PI*t);
459 sum += f1(x - x0, y - y0, z, 0.25, dim);
double front_laplace(double x, double y, double z, double t, int dim)
int Size() const
Logical size of the array.
Class for domain integration L(v) := (f, v)
virtual void GetEssentialTrueDofs(const Array< int > &bdr_attr_is_ess, Array< int > &ess_tdof_list, int component=-1)
double bdr_func(const Vector &pt, double t)
void SetCycle(int c)
Set time cycle (for time-dependent simulations)
Subclass constant coefficient.
virtual void Update(bool want_transform=true)
void SetNCLimit(int nc_limit)
Set the maximum ratio of refinement levels of adjacent elements (0 = unlimited).
int Size() const
Returns the size of the vector.
virtual void Save()
Save the collection and a VisIt root file.
bool Stop() const
Check if STOP action is requested, e.g. stopping criterion is satisfied.
Abstract parallel finite element space.
int main(int argc, char *argv[])
double rhs_func(const Vector &pt, double t)
The L2ZienkiewiczZhuEstimator class implements the Zienkiewicz-Zhu error estimation procedure where t...
void SetPrintLevel(int print_lvl)
The BoomerAMG solver in hypre.
bool Apply(Mesh &mesh)
Perform the mesh operation.
void Rebalance()
Load balance the mesh. NC meshes only.
bool Nonconforming() const
virtual void Reset()
Reset the associated estimator.
virtual void Update()
Transform by the Space UpdateMatrix (e.g., on Mesh change).
void UniformRefinement(int i, const DSTable &, int *, int *, int *)
virtual void Reset()
Reset the associated estimator.
void SetPrintLevel(int print_level)
Mesh refinement operator using an error threshold.
Data collection with VisIt I/O routines.
void SetCurvature(int order, bool discont=false, int space_dim=-1, int ordering=1)
T Max() const
Find the maximal element in the array, using the comparison operator < for class T.
HYPRE_Int GlobalTrueVSize() const
void PrintUsage(std::ostream &out) const
void SetTime(double t)
Set physical time (for time-dependent simulations)
void SetNCLimit(int nc_limit)
Set the maximum ratio of refinement levels of adjacent elements (0 = unlimited).
void SetMaxIter(int max_iter)
Arbitrary order H(div)-conforming Raviart-Thomas finite elements.
void UpdateAndRebalance(ParMesh &pmesh, ParFiniteElementSpace &fespace, ParGridFunction &x, ParBilinearForm &a, ParLinearForm &b)
int SpaceDimension() const
Array< int > bdr_attributes
A list of all unique boundary attributes used by the Mesh.
double ball_laplace(double x, double y, double z, double t, int dim)
void ProjectBdrCoefficient(Coefficient *coeff[], VectorCoefficient *vcoeff, Array< int > &attr)
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)
void PreferConformingRefinement()
Use conforming refinement, if possible (triangles, tetrahedra) – this is the default.
double GetTotalError() const
Return the total error from the last error estimate.
virtual void RegisterField(const std::string &field_name, GridFunction *gf)
Add a grid function to the collection and update the root file.
NURBSExtension * NURBSext
Optional NURBS mesh extension.
virtual void Finalize(bool refine=false, bool fix_orientation=false)
Finalize the construction of a general Mesh.
void SetPreconditioner(HypreSolver &precond)
Set the hypre solver to be used as a preconditioner.
void PrintOptions(std::ostream &out) const
void EnsureNCMesh(bool triangles_nonconforming=false)
double ball(double x, double y, double z, double t, int)
int open(const char hostname[], int port)
void SetThreshold(double thresh)
Set the de-refinement threshold. The default value is zero.
void SetLocalErrorGoal(double err_goal)
Set the local stopping criterion: stop when local_err_i <= local_err_goal. The default value is zero...
class for C-function coefficient
Arbitrary order H1-conforming (continuous) finite elements.
Class for parallel grid function.
void SetTotalErrorFraction(double fraction)
Set the total fraction used in the computation of the threshold. The default value is 1/2...
Wrapper for hypre's ParCSR matrix class.
virtual void UpdatesFinished()
Free ParGridFunction transformation matrix (if any), to save memory.
double front(double x, double y, double z, double t, int)
virtual void Mult(const HypreParVector &b, HypreParVector &x) const
Solve Ax=b with hypre's PCG.
Class for parallel meshes.
double composite_func(const Vector &pt, double t, F0 f0, F1 f1)
Arbitrary order "L2-conforming" discontinuous finite elements.
De-refinement operator using an error threshold.