17 #include "exact_solution.h"
19 #include "../weakform_library/weakforms_h1.h"
21 #include "../solver/linear_solver.h"
31 template<
typename Scalar>
32 ExactSolution<Scalar>::ExactSolution(MeshSharedPtr mesh) : Solution<Scalar>(mesh)
34 this->sln_type = HERMES_EXACT;
36 this->exact_multiplicator = 1.0;
39 template<
typename Scalar>
42 if (this->sln_type == HERMES_SLN)
48 throw Exceptions::Exception(
"Arbitrary exact solution can not be saved to disk. Only constant one can. Project to a space to get a saveable solution.");
52 template<
typename Scalar>
55 if (this->sln_type == HERMES_SLN)
61 throw Exceptions::Exception(
"Arbitrary exact solution can not be saved to disk. Only constant one can. Project to a space to get a saveable solution.");
65 template<
typename Scalar>
68 throw Hermes::Exceptions::Exception(
"Solution<Scalar>::clone() must be overridden in the case of exact solutions.");
72 template<
typename Scalar>
75 return "ExactSolution";
78 template<
typename Scalar>
79 ExactSolutionScalar<Scalar>::ExactSolutionScalar(MeshSharedPtr mesh) : ExactSolution<Scalar>(mesh)
84 template<
typename Scalar>
90 template<
typename Scalar,
typename ValueType>
95 template<
typename Scalar,
typename ValueType>
98 if (this->deleteArray)
99 free_with_check(this->valueArray);
102 template<
typename Scalar,
typename ValueType>
108 template<
typename Scalar,
typename ValueType>
111 return this->valueArray[this->element->id];
114 template<
typename Scalar,
typename ValueType>
119 template<
typename Scalar,
typename ValueType>
122 valueArray = valueArray;
125 template<
typename Scalar,
typename ValueType>
131 template<
typename Scalar>
137 template<
typename Scalar>
146 if (this->sln_type == HERMES_SLN)
155 xmlsolution.
exactCXR() = this->constant;
158 solution_schema_location.append(
"/solution_h2d_xml.xsd");
162 namespace_info_map.insert(std::pair<std::basic_string<char>,
xml_schema::namespace_info>(
"solution", namespace_info_solution));
164 std::ofstream out(filename);
172 throw Hermes::Exceptions::SolutionSaveFailureException(e.what());
179 if (this->sln_type == HERMES_SLN)
188 xmlsolution.
exactCXR() = this->constant.real();
189 xmlsolution.
exactCXC() = this->constant.imag();
192 solution_schema_location.append(
"/solution_h2d_xml.xsd");
196 namespace_info_map.insert(std::pair<std::basic_string<char>,
xml_schema::namespace_info>(
"solution", namespace_info_solution));
198 std::ofstream out(filename);
205 throw Hermes::Exceptions::SolutionSaveFailureException(e.what());
213 if (this->sln_type == HERMES_SLN)
223 bson_append_bool(&bw,
"exact",
true);
224 bson_append_bool(&bw,
"complex",
false);
226 bson_append_start_array(&bw,
"values");
227 bson_append_double(&bw,
"c", this->constant);
228 bson_append_double(&bw,
"c", 0.);
229 bson_append_double(&bw,
"c", 0.);
230 bson_append_double(&bw,
"c", 0.);
231 bson_append_finish_array(&bw);
233 bson_append_int(&bw,
"components_count", this->num_components);
238 fpw = fopen(filename,
"wb");
239 const char *dataw = (
const char *)bson_data(&bw);
240 fwrite(dataw, bson_size(&bw), 1, fpw);
247 void ConstantSolution<std::complex<double> >::save_bson(
const char* filename)
const
249 if (this->sln_type == HERMES_SLN)
251 Solution<std::complex<double> >::save_bson(filename);
259 bson_append_bool(&bw,
"exact",
true);
260 bson_append_bool(&bw,
"complex",
true);
262 bson_append_start_array(&bw,
"values");
263 bson_append_double(&bw,
"c", this->constant.real());
264 bson_append_double(&bw,
"c", 0.);
265 bson_append_double(&bw,
"c", this->constant.imag());
266 bson_append_double(&bw,
"c", 0.);
267 bson_append_finish_array(&bw);
269 bson_append_int(&bw,
"components_count", this->num_components);
274 fpw = fopen(filename,
"wb");
275 const char *dataw = (
const char *)bson_data(&bw);
276 fwrite(dataw, bson_size(&bw), 1, fpw);
283 template<
typename Scalar>
284 ConstantSolution<Scalar>::ConstantSolution(MeshSharedPtr mesh, Scalar constant) : ExactSolutionScalar<Scalar>(mesh), constant(constant)
289 template<
typename Scalar>
294 template<
typename Scalar>
297 if (this->sln_type == HERMES_SLN)
302 template<
typename Scalar>
308 template<
typename Scalar>
313 template<
typename Scalar>
319 template<
typename Scalar>
324 template<
typename Scalar>
327 if (this->sln_type == HERMES_SLN)
332 template<
typename Scalar>
338 template<
typename Scalar>
346 if (this->sln_type == HERMES_SLN)
355 xmlsolution.
exactCXR() = this->constantX;
356 xmlsolution.
exactCYR() = this->constantY;
359 solution_schema_location.append(
"/solution_h2d_xml.xsd");
363 namespace_info_map.insert(std::pair<std::basic_string<char>,
xml_schema::namespace_info>(
"solution", namespace_info_solution));
365 std::ofstream out(filename);
372 throw Hermes::Exceptions::SolutionSaveFailureException(e.what());
379 if (this->sln_type == HERMES_SLN)
388 xmlsolution.
exactCXR() = this->constantX.real();
389 xmlsolution.
exactCXC() = this->constantX.imag();
390 xmlsolution.
exactCYR() = this->constantY.real();
391 xmlsolution.
exactCYC() = this->constantY.imag();
394 solution_schema_location.append(
"/solution_h2d_xml.xsd");
398 namespace_info_map.insert(std::pair<std::basic_string<char>,
xml_schema::namespace_info>(
"solution", namespace_info_solution));
400 std::ofstream out(filename);
410 throw Hermes::Exceptions::SolutionSaveFailureException(e.what());
414 template<
typename Scalar>
420 template<
typename Scalar>
423 if (this->sln_type == HERMES_SLN)
429 template<
typename Scalar>
431 return Scalar2<Scalar>(constantX, constantY);
434 template<
typename Scalar>
436 dx = Scalar2<Scalar>(Scalar(0.0), Scalar(0.0));
437 dy = Scalar2<Scalar>(Scalar(0.0), Scalar(0.0));
440 template<
typename Scalar>
449 if (this->sln_type == HERMES_SLN)
459 bson_append_bool(&bw,
"exact",
true);
460 bson_append_bool(&bw,
"complex",
false);
462 bson_append_start_array(&bw,
"values");
463 bson_append_double(&bw,
"c", this->constantX);
464 bson_append_double(&bw,
"c", this->constantY);
465 bson_append_double(&bw,
"c", 0.);
466 bson_append_double(&bw,
"c", 0.);
467 bson_append_finish_array(&bw);
469 bson_append_int(&bw,
"components_count", this->num_components);
474 fpw = fopen(filename,
"wb");
475 const char *dataw = (
const char *)bson_data(&bw);
476 fwrite(dataw, bson_size(&bw), 1, fpw);
483 void ConstantSolutionVector<std::complex<double> >::save_bson(
const char* filename)
const
485 if (this->sln_type == HERMES_SLN)
487 Solution<std::complex<double> >::save_bson(filename);
495 bson_append_bool(&bw,
"exact",
true);
496 bson_append_bool(&bw,
"complex",
true);
498 bson_append_start_array(&bw,
"values");
499 bson_append_double(&bw,
"c", this->constantX.real());
500 bson_append_double(&bw,
"c", this->constantY.real());
501 bson_append_double(&bw,
"c", this->constantX.imag());
502 bson_append_double(&bw,
"c", this->constantY.imag());
503 bson_append_finish_array(&bw);
505 bson_append_int(&bw,
"components_count", this->num_components);
510 fpw = fopen(filename,
"wb");
511 const char *dataw = (
const char *)bson_data(&bw);
512 fwrite(dataw, bson_size(&bw), 1, fpw);
519 template<
typename Scalar>
520 ZeroSolutionVector<Scalar>::ZeroSolutionVector(MeshSharedPtr mesh) : ExactSolutionVector<Scalar>(mesh)
525 template<
typename Scalar>
527 return Scalar2<Scalar>(0.0, 0.0);
530 template<
typename Scalar>
532 dx = Scalar2<Scalar>(0.0, 0.0);
533 dy = Scalar2<Scalar>(0.0, 0.0);
536 template<
typename Scalar>
541 template<
typename Scalar>
544 if (this->sln_type == HERMES_SLN)
553 std::vector<EssentialBoundaryCondition<double>*> bcVector;
560 linear_solver.
solve();
562 this->
copy(sln.get());
567 throw Exceptions::Exception(
"ExactSolutionEggShell::value should never be called.");
573 throw Exceptions::Exception(
"ExactSolutionEggShell::derivatives should never be called.");
578 throw Exceptions::Exception(
"ExactSolutionEggShell::ord should never be called.");
579 return Hermes::Ord(0);
589 template<
typename Scalar>
596 template<
typename Scalar>
599 throw Exceptions::Exception(
"UExtFunction is only usable in assembling, not for getting point values.");
603 template<
typename Scalar>
608 template<
typename Scalar>
613 template<
typename Scalar>
618 template<
typename Scalar>
619 UExtFunctionSharedPtr<Scalar>::UExtFunctionSharedPtr(
const UExtFunctionSharedPtr& other) :
std::tr1::shared_ptr<
Hermes::Hermes2D::UExtFunction<Scalar> >(other)
623 template<
typename Scalar>
624 void UExtFunctionSharedPtr<Scalar>::operator=(
const UExtFunctionSharedPtr& other)
626 std::tr1::shared_ptr<Hermes::Hermes2D::UExtFunction<Scalar> >::operator=(other);
629 template class HERMES_API UExtFunctionSharedPtr < double > ;
630 template class HERMES_API UExtFunctionSharedPtr < std::complex<double> > ;
632 template HERMES_API
class ExactSolutionScalar < double > ;
633 template HERMES_API
class ExactSolutionScalar < std::complex<double> > ;
635 template HERMES_API
class ExactSolutionConstantArray < double, double > ;
636 template HERMES_API
class ExactSolutionConstantArray < double, int > ;
637 template HERMES_API
class ExactSolutionConstantArray < double, unsigned int > ;
638 template HERMES_API
class ExactSolutionConstantArray < double, bool > ;
639 template HERMES_API
class ExactSolutionConstantArray < std::complex<double>, std::complex<double> > ;
641 template HERMES_API
class ExactSolutionVector < double > ;
642 template HERMES_API
class ExactSolutionVector < std::complex<double> > ;
643 template HERMES_API
class ConstantSolution < double > ;
644 template HERMES_API
class ConstantSolution < std::complex<double> > ;
645 template HERMES_API
class ConstantSolutionVector < double > ;
646 template HERMES_API
class ConstantSolutionVector < std::complex<double> > ;
647 template HERMES_API
class ZeroSolution < double > ;
648 template HERMES_API
class ZeroSolution < std::complex<double> > ;
649 template HERMES_API
class ZeroSolutionVector < double > ;
650 template HERMES_API
class ZeroSolutionVector < std::complex<double> > ;
652 template HERMES_API
class UExtFunction < double > ;
653 template HERMES_API
class UExtFunction < std::complex<double> > ;
virtual MeshFunction< Scalar > * clone() const
ExactSolutionConstantArray(MeshSharedPtr mesh, ValueType *valueArray, bool deleteArray=false)
void save(const char *filename) const
Saves the exact solution to an XML file.
void free(void)
Frees all precalculated tables.
virtual Ord ord(double x, double y) const
Function operating on previous nonlinear solutions in assembling (u_ext)
virtual void copy(const MeshFunction< double > *sln)
HERMES_API Hermes::Hermes2D::Api2D Hermes2DApi
Global instance used inside Hermes which is also accessible to users.
::xsd::cxx::tree::flags flags
Parsing and serialization flags.
Stores one element of a mesh.
Scalar * get_sln_vector()
Get sln vector.
virtual void save(const char *filename) const
Saves the exact solution to an XML file.
Represents a function defined on a mesh.
virtual Scalar value(double x, double y) const
Function returning the value.
virtual void derivatives(double x, double y, Scalar2< Scalar > &dx, Scalar2< Scalar > &dy) const
Function returning the derivatives.
::xsd::cxx::tree::exception< char > exception
Root of the C++/Tree exception hierarchy.
virtual double value(double x, double y) const
Function returning the value.
Used to pass the instances of Space around.
virtual Hermes::Ord ord(double x, double y) const
::std::auto_ptr< ::XMLSolution::solution > solution_(const ::std::string &uri,::xml_schema::flags f=0, const ::xml_schema::properties &p=::xml_schema::properties())
Parse a URI or a local file.
virtual void derivatives(double x, double y, Scalar &dx, Scalar &dy) const
Function returning the derivatives.
virtual void precalculate(unsigned short order, unsigned short mask)
precalculates the current function at the current integration points.
Class corresponding to the solution schema type.
ExactSolutionEggShell(MeshSharedPtr mesh, int polynomialOrder)
virtual MeshFunction< Scalar > * clone() const
virtual MeshFunction< Scalar > * clone() const
virtual void derivatives(double x, double y, Scalar2< Scalar > &dx, Scalar2< Scalar > &dy) const
Function returning the derivatives.
virtual MeshFunction< Scalar > * clone() const
MeshFunction< double > * clone() const
::xsd::cxx::xml::dom::namespace_info< char > namespace_info
Namespace serialization information.
const exactCXR_optional & exactCXR() const
Return a read-only (constant) reference to the attribute container.
virtual unsigned int get_dimension() const
For Scalar-valued solutions this returns 1.
::xsd::cxx::xml::dom::namespace_infomap< char > namespace_infomap
Namespace serialization information map.
virtual void derivatives(double x, double y, double &dx, double &dy) const
Function returning the derivatives.
static const std::string eggShell0Marker
The mesh returned from get_egg_shell has this marker on the "0" boundary.
virtual void save(const char *filename) const
virtual void solve(Scalar *coeff_vec)
virtual MeshFunction< Scalar > * clone() const
Represents an arbitrary function defined on an element.
const exactCYR_optional & exactCYR() const
Return a read-only (constant) reference to the attribute container.
virtual Ord ord(double x, double y) const
virtual void derivatives(double x, double y, Scalar &dx, Scalar &dy) const
Function returning the derivatives.
Represents an exact solution of a PDE.
virtual Ord ord(double x, double y) const
virtual MeshFunction< Scalar > * clone() const
static const std::string eggShell1Marker
The mesh returned from get_egg_shell has this marker on the "1" boundary.
virtual Scalar2< Scalar > value(double x, double y) const
Function returning the value.
::xsd::cxx::tree::string< char, simple_type > string
C++ type corresponding to the string XML Schema built-in type.
void save(const char *filename) const
Saves the exact solution to an XML file.
Generated from solution_h2d_xml.xsd.
virtual void derivatives(double x, double y, Scalar &dx, Scalar &dy) const
Function returning the derivatives.
virtual Scalar2< Scalar > value(double x, double y) const
Function returning the value.
unsigned char num_components
Number of vector components.
virtual Ord ord(double x, double y) const
const exactCXC_optional & exactCXC() const
Return a read-only (constant) reference to the attribute container.
virtual void set_quad_2d(Quad2D *quad_2d)
Selects the quadrature points in which the function will be evaluated.
virtual MeshFunction< Scalar > * clone() const
const exactCYC_optional & exactCYC() const
Return a read-only (constant) reference to the attribute container.
Class representing constant essential boundary condition.
virtual unsigned int get_dimension() const
For vector-valued solutions this returns 2.
Represents the solution of a PDE.
int order
Current function polynomial order.
virtual Ord ord(double x, double y) const
virtual Scalar value(double x, double y) const
Function returning the value.
virtual Scalar value(double x, double y) const
Function returning the value.