25 void mesh_fem_level_set::clear_build_methods() {
26 for (
size_type i = 0; i < build_methods.size(); ++i)
28 build_methods.clear();
30 void mesh_fem_level_set::clear() {
32 clear_build_methods();
36 mesh_fem_level_set::mesh_fem_level_set(
const mesh_level_set &me,
38 : mesh_fem(mef.linked_mesh()), mls(me), mf(mef) {
39 xfem_index = reserve_xfem_index();
40 GMM_ASSERT1(mf.get_qdim() == 1,
"base mesh_fem for mesh_fem_level_set has "
41 "to be of qdim one for the moment ...");
47 DAL_SIMPLE_KEY(special_mfls_key,
pfem);
49 void mesh_fem_level_set::build_method_of_convex(
size_type cv) {
50 pfem pf = std::make_shared<fem_level_set>
51 (gmm::index_ref_iterator(dof_enrichments.begin(),
52 mf.ind_basic_dof_of_element(cv).begin()) ,
53 mf.fem_of_element(cv), mls, xfem_index);
54 dal::pstatic_stored_object_key
55 pk = std::make_shared<special_mfls_key>(pf);
57 build_methods.push_back(pf);
58 set_finite_element(cv, pf);
61 void mesh_fem_level_set::adapt() {
64 GMM_ASSERT1(!mf.is_reduced(),
"Mesh fem level set not defined for reduced "
65 "mesh fems (difficult or impossible to define it in the "
67 enriched_dofs.clear(); enriched_elements.clear();
68 dof_enrichments.resize(0);
69 dof_enrichments.resize(mf.nb_basic_dof(), 0);
71 for (
size_type i = 0; i < mf.nb_basic_dof(); ++i) {
72 const mesh::ind_cv_ct &ct = mf.convex_to_basic_dof(i);
73 bool touch_cut =
false;
74 for (mesh::ind_cv_ct::const_iterator it = ct.begin();
76 if (mls.is_convex_cut(*it)) { touch_cut =
true;
break; }
80 mesh_level_set::zoneset zones;
82 for (mesh::ind_cv_ct::const_iterator it = ct.begin();
83 it != ct.end(); ++it) {
84 if (mls.is_convex_cut(*it)) {
85 mls.merge_zoneset(zones, mls.zoneset_of_convex(*it));
88 mls.merge_zoneset(zones, mls.primary_zone_of_convex(*it));
92 if (zones.size() != 1) {
93 dof_enrichments[i] = &(*(enrichments.insert(zones).first));
95 for (mesh::ind_cv_ct::const_iterator it = ct.begin();
96 it != ct.end(); ++it) enriched_elements.add(*it);
104 for (dal::bv_visitor i(mf.convex_index()); !i.finished(); ++i) {
105 if (enriched_elements[i]) build_method_of_convex(i);
else
106 set_finite_element(i, mf.fem_of_element(i));
108 is_adapted =
true; touch();
a subclass of mesh_fem which is conformal to a number of level sets.
void clear(L &l)
clear (fill with zeros) a vector or matrix.
std::shared_ptr< const getfem::virtual_fem > pfem
type of pointer on a fem description
size_t size_type
used as the common size type in the library
void add_stored_object(pstatic_stored_object_key k, pstatic_stored_object o, permanence perm)
Add an object with two optional dependencies.
void add_dependency(pstatic_stored_object o1, pstatic_stored_object o2)
Add a dependency, object o1 will depend on object o2.
void del_stored_object(const pstatic_stored_object &o, bool ignore_unstored)
Delete an object and the object which depend on it.
GEneric Tool for Finite Element Methods.