38 #ifndef GETFEM_GENERIC_ASSEMBLY_H__
39 #define GETFEM_GENERIC_ASSEMBLY_H__
51 #define INFINITY std::numeric_limits<scalar_type>::infinity()
62 typedef std::vector<scalar_type> model_real_plain_vector;
63 typedef std::vector<complex_type> model_complex_plain_vector;
65 typedef gmm::col_matrix<model_real_sparse_vector> model_real_sparse_matrix;
66 typedef gmm::col_matrix<model_complex_sparse_vector>
67 model_complex_sparse_matrix;
69 typedef gmm::row_matrix<model_real_sparse_vector>
70 model_real_row_sparse_matrix;
71 typedef gmm::row_matrix<model_complex_sparse_vector>
72 model_complex_row_sparse_matrix;
77 int ga_check_name_validity(
const std::string &name);
83 struct var_trans_pair {
84 std::string varname, transname;
85 bool operator <(
const var_trans_pair &vt)
const {
86 return (varname < vt.varname) ||
87 (!(varname > vt.varname) && transname < vt.transname);
89 var_trans_pair() : varname(), transname() {}
90 var_trans_pair(
const std::string &v,
const std::string &t)
91 : varname(v), transname(t) {}
94 class APIDECL virtual_interpolate_transformation {
97 virtual void extract_variables
98 (
const ga_workspace &workspace, std::set<var_trans_pair> &vars,
99 bool ignore_data,
const mesh &m,
100 const std::string &interpolate_name)
const = 0;
101 virtual void init(
const ga_workspace &workspace)
const = 0;
102 virtual int transform
103 (
const ga_workspace &workspace,
const mesh &m,
104 fem_interpolation_context &ctx_x,
const base_small_vector &Normal,
106 base_node &P_ref, base_small_vector &N_y,
107 std::map<var_trans_pair, base_tensor> &derivatives,
108 bool compute_derivatives)
const = 0;
109 virtual void finalize()
const = 0;
110 virtual std::string expression()
const {
return std::string(); }
112 virtual ~virtual_interpolate_transformation() {}
115 typedef std::shared_ptr<const virtual_interpolate_transformation>
116 pinterpolate_transformation;
122 class APIDECL virtual_elementary_transformation {
126 virtual void give_transformation(
const mesh_fem &mf1,
const mesh_fem &mf2,
128 virtual ~virtual_elementary_transformation() {}
131 typedef std::shared_ptr<const virtual_elementary_transformation>
132 pelementary_transformation;
138 class APIDECL virtual_secondary_domain {
141 const mesh_region region;
145 const mesh_im &mim()
const {
return mim_; }
146 virtual const mesh_region &give_region(
const mesh &m,
151 virtual_secondary_domain(
const mesh_im &mim__,
const mesh_region ®ion_)
152 : mim_(mim__), region(region_) {}
153 virtual ~virtual_secondary_domain() {}
156 typedef std::shared_ptr<const virtual_secondary_domain> psecondary_domain;
166 std::string macro_name_;
171 ga_macro(
const std::string &name,
const ga_tree &t,
size_type nbp_);
172 ga_macro(
const ga_macro &);
174 ga_macro &operator =(
const ga_macro &);
176 const std::string &name()
const {
return macro_name_; }
177 std::string &name() {
return macro_name_; }
178 size_type nb_params()
const {
return nbp; }
180 const ga_tree& tree()
const {
return *ptree; }
181 ga_tree& tree() {
return *ptree; }
185 class ga_macro_dictionary {
188 const ga_macro_dictionary *parent;
189 std::map<std::string, ga_macro> macros;
192 bool macro_exists(
const std::string &name)
const;
193 const ga_macro &get_macro(
const std::string &name)
const;
195 void add_macro(
const ga_macro &gam);
196 void add_macro(
const std::string &name,
const std::string &expr);
197 void del_macro(
const std::string &name);
199 ga_macro_dictionary() : parent(0) {}
200 ga_macro_dictionary(
bool,
const ga_macro_dictionary& gamd)
210 struct ga_nonlinear_operator {
212 typedef std::vector<const base_tensor *> arg_list;
214 virtual bool result_size(
const arg_list &args,
215 bgeot::multi_index &sizes)
const = 0;
217 virtual void value(
const arg_list &args, base_tensor &result)
const = 0;
219 virtual void derivative(
const arg_list &args,
size_type i,
220 base_tensor &result)
const = 0;
222 virtual void second_derivative(
const arg_list &args,
size_type i,
223 size_type j, base_tensor &result)
const = 0;
225 virtual ~ga_nonlinear_operator() {}
228 struct ga_predef_operator_tab {
229 typedef std::map<std::string, std::shared_ptr<ga_nonlinear_operator>> T;
232 void add_method(
const std::string &name,
233 const std::shared_ptr<ga_nonlinear_operator> &pt)
235 ga_predef_operator_tab();
242 typedef scalar_type (*pscalar_func_onearg)(scalar_type);
243 typedef scalar_type (*pscalar_func_twoargs)(scalar_type, scalar_type);
245 void ga_define_function(
const std::string &name,
size_type nb_args,
246 const std::string &expr,
const std::string &der1=
"",
247 const std::string &der2=
"");
248 void ga_define_function(
const std::string &name, pscalar_func_onearg f,
249 const std::string &der1=
"");
250 void ga_define_function(
const std::string &name, pscalar_func_twoargs f2,
251 const std::string &der1=
"",
252 const std::string &der2=
"");
254 void ga_undefine_function(
const std::string &name);
255 bool ga_function_exists(
const std::string &name);
265 const ga_workspace *parent_workspace;
266 bool with_parent_variables;
267 size_type nb_prim_dof, nb_intern_dof, first_intern_dof, nb_tmp_dof;
271 struct var_description {
277 const model_real_plain_vector *V;
278 bgeot::multi_index qdims;
285 for (
size_type i = 0; i < qdims.size(); ++i) q *= qdims[i];
289 var_description(
bool is_var,
const mesh_fem *mf_,
const im_data *imd_,
290 gmm::sub_interval I_,
const model_real_plain_vector *V_,
292 : is_variable(is_var), mf(mf_), imd(imd_),
293 I(I_), V(V_), qdims(1), is_internal(is_intern_)
295 GMM_ASSERT1(Q > 0,
"Bad dimension");
302 enum operation_type {ASSEMBLY,
306 struct tree_description {
311 operation_type operation;
312 std::string varname_interpolation;
313 std::string name_test1, name_test2;
314 std::string interpolate_name_test1, interpolate_name_test2;
315 std::string secondary_domain;
318 const mesh_region *rg;
321 : operation(ASSEMBLY), varname_interpolation(
""),
322 name_test1(
""), name_test2(
""),
323 interpolate_name_test1(
""), interpolate_name_test2(
""),
324 mim(0), m(0), rg(0), ptree(0) {}
325 void copy(
const tree_description& td);
326 tree_description(
const tree_description& td) {
copy(td); }
327 tree_description &operator =(
const tree_description& td);
331 mutable std::set<var_trans_pair> test1, test2;
332 var_trans_pair selected_test1, selected_test2;
337 std::map<const mesh *, std::list<mesh_region> > registered_mesh_regions;
339 const mesh_region ®ister_region(
const mesh &m,
const mesh_region &rg);
342 typedef std::map<std::string, var_description> VAR_SET;
345 std::map<std::string, gmm::sub_interval> reenabled_var_intervals,
348 std::map<std::string, pinterpolate_transformation> transformations;
349 std::map<std::string, pelementary_transformation> elem_transformations;
350 std::map<std::string, psecondary_domain> secondary_domains;
352 std::vector<tree_description> trees;
354 std::map<std::string, std::vector<std::string> > variable_groups;
356 ga_macro_dictionary macro_dict;
360 void add_tree(ga_tree &tree,
const mesh &m,
const mesh_im &mim,
361 const mesh_region &rg,
size_type add_derivative_order,
362 bool scalar_expr, operation_type op_type=ASSEMBLY,
363 const std::string varname_interpolation=
"");
365 std::shared_ptr<model_real_sparse_matrix> K, KQJpr;
366 std::shared_ptr<base_vector> V;
369 model_real_sparse_matrix col_unreduced_K,
372 base_vector unreduced_V, cached_V;
373 base_tensor assemb_t;
374 bool include_empty_int_pts =
false;
378 void set_assembled_matrix(model_real_sparse_matrix &K_) {
379 K = std::shared_ptr<model_real_sparse_matrix>
380 (std::shared_ptr<model_real_sparse_matrix>(), &K_);
382 void set_assembled_vector(base_vector &V_) {
383 V = std::shared_ptr<base_vector>
384 (std::shared_ptr<base_vector>(), &V_);
387 const model_real_sparse_matrix &assembled_matrix()
const {
return *K; }
388 model_real_sparse_matrix &assembled_matrix() {
return *K; }
389 const base_vector &assembled_vector()
const {
return *V; }
390 base_vector &assembled_vector() {
return *V; }
391 const base_vector &cached_vector()
const {
return cached_V; }
392 const base_tensor &assembled_tensor()
const {
return assemb_t; }
393 base_tensor &assembled_tensor() {
return assemb_t; }
394 const scalar_type &assembled_potential()
const {
395 GMM_ASSERT1(assemb_t.size() == 1,
"Bad result size");
398 scalar_type &assembled_potential() {
399 GMM_ASSERT1(assemb_t.size() == 1,
"Bad result size");
402 model_real_sparse_matrix &row_unreduced_matrix()
403 {
return row_unreduced_K; }
404 model_real_sparse_matrix &col_unreduced_matrix()
405 {
return col_unreduced_K; }
406 model_real_sparse_matrix &row_col_unreduced_matrix()
407 {
return row_col_unreduced_K; }
408 base_vector &unreduced_vector() {
return unreduced_V; }
410 void set_internal_coupling_matrix(model_real_sparse_matrix &KQJpr_) {
411 KQJpr = std::shared_ptr<model_real_sparse_matrix>
412 (std::shared_ptr<model_real_sparse_matrix>(), &KQJpr_);
417 const model_real_sparse_matrix &internal_coupling_matrix()
const
419 model_real_sparse_matrix &internal_coupling_matrix() {
return *KQJpr; }
425 size_type add_expression(
const std::string &expr,
const mesh_im &mim,
428 const std::string &secondary_dom =
"");
430 void add_function_expression(
const std::string &expr);
432 void add_interpolation_expression
433 (
const std::string &expr,
const mesh &m,
435 void add_interpolation_expression
436 (
const std::string &expr,
const mesh_im &mim,
438 void add_assignment_expression
439 (
const std::string &dataname,
const std::string &expr,
441 size_type order = 1,
bool before =
false);
444 void clear_expressions();
447 void print(std::ostream &str);
449 size_type nb_trees()
const {
return trees.size(); }
450 const tree_description &tree_info(
size_type i)
const {
return trees[i]; }
453 void add_fem_variable(
const std::string &name,
const mesh_fem &mf,
454 const gmm::sub_interval &I,
455 const model_real_plain_vector &VV);
456 void add_im_variable(
const std::string &name,
const im_data &imd,
457 const gmm::sub_interval &I,
458 const model_real_plain_vector &VV);
459 void add_internal_im_variable(
const std::string &name,
const im_data &imd,
460 const gmm::sub_interval &I,
461 const model_real_plain_vector &VV);
462 void add_fixed_size_variable(
const std::string &name,
463 const gmm::sub_interval &I,
464 const model_real_plain_vector &VV);
465 void add_fem_constant(
const std::string &name,
const mesh_fem &mf,
466 const model_real_plain_vector &VV);
467 void add_fixed_size_constant(
const std::string &name,
468 const model_real_plain_vector &VV);
469 void add_im_data(
const std::string &name,
const im_data &imd,
470 const model_real_plain_vector &VV);
472 bool used_variables(std::vector<std::string> &vl,
473 std::vector<std::string> &vl_test1,
474 std::vector<std::string> &vl_test2,
475 std::vector<std::string> &dl,
479 bool variable_exists(
const std::string &name)
const;
481 bool is_internal_variable(
const std::string &name)
const;
483 const std::string &variable_in_group(
const std::string &group_name,
484 const mesh &m)
const;
486 void define_variable_group(
const std::string &group_name,
487 const std::vector<std::string> &nl);
489 bool variable_group_exists(
const std::string &name)
const;
491 bool variable_or_group_exists(
const std::string &name)
const
492 {
return variable_exists(name) || variable_group_exists(name); }
494 const std::vector<std::string> &
495 variable_group(
const std::string &group_name)
const;
497 const std::string& first_variable_of_group(
const std::string &name)
const;
499 bool is_constant(
const std::string &name)
const;
501 bool is_disabled_variable(
const std::string &name)
const;
503 const scalar_type &factor_of_variable(
const std::string &name)
const;
505 const gmm::sub_interval &
506 interval_of_variable(
const std::string &name)
const;
508 const mesh_fem *associated_mf(
const std::string &name)
const;
510 const im_data *associated_im_data(
const std::string &name)
const;
512 size_type qdim(
const std::string &name)
const;
514 bgeot::multi_index qdims(
const std::string &name)
const;
516 const model_real_plain_vector &value(
const std::string &name)
const;
517 scalar_type get_time_step()
const;
520 bool macro_exists(
const std::string &name)
const
521 {
return macro_dict.macro_exists(name); }
523 void add_macro(
const std::string &name,
const std::string &expr)
524 { macro_dict.add_macro(name, expr); }
526 void del_macro(
const std::string &name) { macro_dict.del_macro(name); }
528 const std::string& get_macro(
const std::string &name)
const;
530 const ga_macro_dictionary ¯o_dictionary()
const {
return macro_dict; }
534 void add_interpolate_transformation(
const std::string &name,
535 pinterpolate_transformation ptrans);
537 bool interpolate_transformation_exists(
const std::string &name)
const;
539 pinterpolate_transformation
540 interpolate_transformation(
const std::string &name)
const;
542 void add_elementary_transformation(
const std::string &name,
543 pelementary_transformation ptrans)
544 { elem_transformations[name] = ptrans; }
546 bool elementary_transformation_exists(
const std::string &name)
const;
548 pelementary_transformation
549 elementary_transformation(
const std::string &name)
const;
551 void add_secondary_domain(
const std::string &name,
552 psecondary_domain psecdom);
554 bool secondary_domain_exists(
const std::string &name)
const;
556 psecondary_domain secondary_domain(
const std::string &name)
const;
559 std::string extract_constant_term(
const mesh &m);
560 std::string extract_order1_term(
const std::string &varname);
561 std::string extract_order0_term();
562 std::string extract_Neumann_term(
const std::string &varname);
564 void assembly(
size_type order,
bool condensation=
false);
566 void set_include_empty_int_points(
bool include);
567 bool include_empty_int_points()
const;
569 size_type nb_primary_dof()
const {
return nb_prim_dof; }
570 size_type nb_internal_dof()
const {
return nb_intern_dof; }
571 size_type first_internal_dof()
const {
return first_intern_dof; }
572 size_type nb_temporary_dof()
const {
return nb_tmp_dof; }
574 void add_temporary_interval_for_unreduced_variable(
const std::string &name);
576 void clear_temporary_variable_intervals() {
577 tmp_var_intervals.clear();
581 const gmm::sub_interval &
582 temporary_interval_of_variable(
const std::string &name)
const {
583 static const gmm::sub_interval empty_interval;
584 const auto it = tmp_var_intervals.find(name);
585 return (it != tmp_var_intervals.end()) ? it->second : empty_interval;
588 enum class inherit { NONE, ENABLED, ALL };
591 const inherit var_inherit=inherit::ENABLED);
592 explicit ga_workspace(
const ga_workspace &gaw,
593 const inherit var_inherit);
600 std::string ga_substitute(
const std::string &expr,
601 const std::map<std::string, std::string> &dict);
603 inline std::string ga_substitute(
const std::string &expr,
604 const std::string &o1,
const std::string &s1) {
605 std::map<std::string, std::string> dict;
607 return ga_substitute(expr, dict);
610 inline std::string ga_substitute(
const std::string &expr,
611 const std::string &o1,
const std::string &s1,
612 const std::string &o2,
const std::string &s2) {
613 std::map<std::string, std::string> dict;
614 dict[o1] = s1; dict[o2] = s2;
615 return ga_substitute(expr, dict);
618 inline std::string ga_substitute(
const std::string &expr,
619 const std::string &o1,
const std::string &s1,
620 const std::string &o2,
const std::string &s2,
621 const std::string &o3,
const std::string &s3) {
622 std::map<std::string, std::string> dict;
623 dict[o1] = s1; dict[o2] = s2; dict[o3] = s3;
624 return ga_substitute(expr, dict);
627 inline std::string ga_substitute(
const std::string &expr,
628 const std::string &o1,
const std::string &s1,
629 const std::string &o2,
const std::string &s2,
630 const std::string &o3,
const std::string &s3,
631 const std::string &o4,
const std::string &s4) {
632 std::map<std::string, std::string> dict;
633 dict[o1] = s1; dict[o2] = s2; dict[o3] = s3; dict[o4] = s4;
634 return ga_substitute(expr, dict);
642 struct ga_instruction_set;
645 mutable ga_workspace local_workspace;
647 mutable ga_instruction_set *gis;
650 ga_function() : local_workspace(), expr(
""), gis(0) {}
651 ga_function(
const model &md,
const std::string &e);
652 ga_function(
const ga_workspace &workspace_,
const std::string &e);
653 ga_function(
const std::string &e);
654 ga_function(
const ga_function &gaf);
655 ga_function &operator =(
const ga_function &gaf);
657 const std::string &expression()
const {
return expr; }
658 const base_tensor &eval()
const;
659 void derivative(
const std::string &variable);
660 void compile()
const;
661 ga_workspace &workspace()
const {
return local_workspace; }
669 struct ga_interpolation_context {
671 virtual bgeot::pstored_point_tab
673 std::vector<size_type> &ind)
const = 0;
676 {
return *ppoints_for_element(cv, f, ind); }
677 virtual bool use_pgp(
size_type cv)
const = 0;
678 virtual bool use_mim()
const = 0;
680 virtual void finalize() = 0;
681 virtual const mesh &linked_mesh() = 0;
682 virtual ~ga_interpolation_context() {}
689 void ga_interpolation(ga_workspace &workspace,
690 ga_interpolation_context &gic);
692 void ga_interpolation_Lagrange_fem
693 (ga_workspace &workspace,
const mesh_fem &mf, base_vector &result);
695 void ga_interpolation_Lagrange_fem
696 (
const getfem::model &md,
const std::string &expr,
const mesh_fem &mf,
699 void ga_interpolation_mti
700 (
const getfem::model &md,
const std::string &expr, mesh_trans_inv &mti,
702 int extrapolation = 0,
706 void ga_interpolation_im_data
707 (ga_workspace &workspace,
const im_data &imd, base_vector &result);
709 void ga_interpolation_im_data
710 (
const getfem::model &md,
const std::string &expr,
const im_data &imd,
713 void ga_interpolation_mesh_slice
714 (ga_workspace &workspace,
const stored_mesh_slice &sl, base_vector &result);
716 void ga_interpolation_mesh_slice
717 (
const getfem::model &md,
const std::string &expr,
const stored_mesh_slice &sl,
732 const std::string &expr,
const mesh_fem &mf,
750 (ga_workspace &workspace,
const std::string &transname,
751 const mesh &source_mesh,
const mesh &target_mesh,
const std::string &expr);
753 (ga_workspace &workspace,
const std::string &transname,
754 const mesh &source_mesh,
const mesh &target_mesh,
755 size_type target_region,
const std::string &expr);
757 (model &md,
const std::string &transname,
758 const mesh &source_mesh,
const mesh &target_mesh,
const std::string &expr);
760 (model &md,
const std::string &transname,
761 const mesh &source_mesh,
const mesh &target_mesh,
762 size_type target_region,
const std::string &expr);
773 (ga_workspace &workspace,
const std::string &transname,
774 const mesh &source_mesh,
const std::string &source_displacements,
775 const mesh_region &source_region,
const mesh &target_mesh,
776 const std::string &target_displacements,
const mesh_region &target_region);
781 (model &md,
const std::string &transname,
782 const mesh &source_mesh,
const std::string &source_displacements,
783 const mesh_region &source_region,
const mesh &target_mesh,
784 const std::string &target_displacements,
const mesh_region &target_region);
802 void add_element_extrapolation_transformation
803 (model &md,
const std::string &name,
const mesh &sm,
804 std::map<size_type, size_type> &elt_corr);
806 void add_element_extrapolation_transformation
807 (ga_workspace &workspace,
const std::string &name,
const mesh &sm,
808 std::map<size_type, size_type> &elt_corr);
813 void set_element_extrapolation_correspondence
814 (model &md,
const std::string &name,
815 std::map<size_type, size_type> &elt_corr);
817 void set_element_extrapolation_correspondence
818 (ga_workspace &workspace,
const std::string &name,
819 std::map<size_type, size_type> &elt_corr);
825 void add_standard_secondary_domain
826 (model &md,
const std::string &name,
const mesh_im &mim,
829 void add_standard_secondary_domain
830 (ga_workspace &workspace,
const std::string &name,
const mesh_im &mim,
static mesh_region all_convexes()
provide a default value for the mesh_region parameters of assembly procedures etc.
`‘Model’' variables store the variables, the data and the description of a model.
sparse vector built upon std::vector.
Interpolation of fields from a mesh_fem onto another.
Define the class getfem::stored_mesh_slice.
void copy(const L1 &l1, L2 &l2)
*/
gmm::uint16_type short_type
used as the common short type integer in the library
size_t size_type
used as the common size type in the library
GEneric Tool for Finite Element Methods.
pinterpolate_transformation interpolate_transformation_neighbor_instance()
Create a new instance of a transformation corresponding to the interpolation on the neighbor element.
void add_interpolate_transformation_on_deformed_domains(ga_workspace &workspace, const std::string &transname, const mesh &source_mesh, const std::string &source_displacements, const mesh_region &source_region, const mesh &target_mesh, const std::string &target_displacements, const mesh_region &target_region)
Add a transformation to the workspace that creates an identity mapping between two meshes in deformed...
void add_interpolate_transformation_from_expression(ga_workspace &workspace, const std::string &transname, const mesh &source_mesh, const mesh &target_mesh, const std::string &expr)
Add a transformation to a workspace workspace or a model md mapping point in mesh source_mesh to mesh...
void ga_local_projection(const getfem::model &md, const mesh_im &mim, const std::string &expr, const mesh_fem &mf, base_vector &result, const mesh_region &rg=mesh_region::all_convexes())
Make an elementwise L2 projection of an expression with respect to the mesh_fem mf.