16 #ifndef __H2D_SOLUTION_H
17 #define __H2D_SOLUTION_H
19 #include "../function/mesh_function.h"
20 #include "../space/space.h"
21 #include "../mesh/refmap.h"
22 #include "exceptions.h"
75 template<
typename Scalar>
76 class HERMES_API Solution :
public MeshFunction<Scalar>,
public Hermes2D::Mixins::XMLParsing
80 Solution(
const Mesh *mesh);
81 Solution (Space<Scalar>* s, Vector<Scalar>* coeff_vec);
82 Solution (Space<Scalar>* s, Scalar* coeff_vec);
91 virtual void copy(
const Solution<Scalar>* sln);
94 void set_dirichlet_lift(
const Space<Scalar>* space, PrecalcShapeset* pss = NULL);
98 virtual void save(
const char* filename)
const;
102 void load(
const char* filename, Space<Scalar>* space);
108 Scalar get_ref_value(Element* e,
double xi1,
double xi2,
int component = 0,
int item = 0);
115 Scalar get_ref_value_transformed(Element* e,
double xi1,
double xi2,
int a,
int b);
122 virtual Func<Scalar>* get_pt_value(
double x,
double y);
125 void multiply(Scalar coef);
128 inline SolutionType
get_type()
const {
return sln_type; };
130 inline SpaceType get_space_type()
const {
return space_type; };
133 static void vector_to_solutions(
const Scalar* solution_vector, Hermes::vector<
const Space<Scalar> *> spaces,
134 Hermes::vector<Solution<Scalar>*> solutions,
135 Hermes::vector<bool> add_dir_lift = Hermes::vector<bool>(),
136 Hermes::vector<int> start_indices = Hermes::vector<int>());
138 static void vector_to_solution(
const Scalar* solution_vector,
const Space<Scalar>* space, Solution<Scalar>* solution,
139 bool add_dir_lift =
true,
int start_index = 0);
141 static void vector_to_solutions(
const Vector<Scalar>* vec, Hermes::vector<
const Space<Scalar> *> spaces,
142 Hermes::vector<Solution<Scalar>*> solutions,
143 Hermes::vector<bool> add_dir_lift = Hermes::vector<bool>(),
144 Hermes::vector<int> start_indices = Hermes::vector<int>());
146 static void vector_to_solutions_common_dir_lift(
const Vector<Scalar>* vec, Hermes::vector<
const Space<Scalar> *> spaces,
147 Hermes::vector<Solution<Scalar>*> solutions,
148 bool add_dir_lift =
false);
150 static void vector_to_solutions_common_dir_lift(
const Scalar* solution_vector, Hermes::vector<
const Space<Scalar> *> spaces,
151 Hermes::vector<Solution<Scalar>*> solutions,
152 bool add_dir_lift =
false);
154 static void vector_to_solution(
const Vector<Scalar>* vec,
const Space<Scalar>* space, Solution<Scalar>* solution,
155 bool add_dir_lift =
true,
int start_index = 0);
157 static void vector_to_solutions(
const Scalar* solution_vector, Hermes::vector<
const Space<Scalar> *> spaces,
158 Hermes::vector<Solution<Scalar>*> solutions, Hermes::vector<PrecalcShapeset *> pss,
159 Hermes::vector<bool> add_dir_lift = Hermes::vector<bool>(),
160 Hermes::vector<int> start_indices = Hermes::vector<int>());
162 static void vector_to_solution(
const Scalar* solution_vector,
const Space<Scalar>* space, Solution<Scalar>* solution,
163 PrecalcShapeset* pss,
bool add_dir_lift =
true,
int start_index = 0);
166 virtual void set_active_element(Element* e);
168 virtual MeshFunction<Scalar>* clone()
const;
170 static void set_static_verbose_output(
bool verbose);
173 static bool static_verbose_output;
175 virtual int get_edge_fn_order(
int edge) {
return MeshFunction<Scalar>::get_edge_fn_order(edge); }
181 void enable_transform(
bool enable =
true);
188 virtual void set_coeff_vector(
const Space<Scalar>* space,
const Vector<Scalar>* vec,
bool add_dir_lift,
int start_index);
190 virtual void set_coeff_vector(
const Space<Scalar>* space, PrecalcShapeset* pss,
const Scalar* coeffs,
bool add_dir_lift,
int start_index);
192 virtual void set_coeff_vector(
const Space<Scalar>* space,
const Scalar* coeffs,
bool add_dir_lift,
int start_index);
194 SolutionType sln_type;
195 SpaceType space_type;
213 int* elem_coeffs[H2D_MAX_SOLUTION_COMPONENTS];
216 int num_coeffs, num_elems;
221 virtual void precalculate(
int order,
int mask);
223 Scalar* dxdy_coeffs[H2D_MAX_SOLUTION_COMPONENTS][6];
227 double** calc_mono_matrix(
int o,
int*& perm);
229 void init_dxdy_buffer();
239 template<
typename T>
friend class OGProjectionNOX;
240 template<
typename T>
friend class Adapt;
241 template<
typename T>
friend class Func;