27 level_set::level_set(
const mesh &msh, dim_type deg,
30 with_secondary(with_secondary_) {
31 shift_ls = scalar_type(0);
32 primary_.resize(mf->nb_dof());
33 if (has_secondary()) secondary_.resize(mf->nb_dof());
37 void level_set::copy_from(
const level_set &ls) {
40 primary_ = ls.primary_;
41 secondary_ = ls.secondary_;
42 with_secondary = ls.with_secondary;
43 shift_ls = ls.shift_ls;
48 level_set::level_set(
const level_set &ls) : context_dependencies() {
52 level_set &level_set::operator =(
const level_set &ls) {
53 this->sup_dependency(*mf);
58 level_set::~level_set() { }
60 void level_set::reinit(
void) {
61 primary_.resize(mf->nb_dof());
62 if (has_secondary()) secondary_.resize(mf->nb_dof());
66 pmesher_signed_distance level_set::mls_of_convex(
size_type cv,
unsigned lsnum,
67 bool inverted)
const {
68 assert(
this); assert(mf);
69 GMM_ASSERT1(mf->linked_mesh().convex_index().is_in(cv),
"convex " << cv
70 <<
" is not in the level set mesh!");
71 GMM_ASSERT1(mf->fem_of_element(cv),
"Internal error");
72 GMM_ASSERT1(!mf->is_reduced(),
"Internal error");
73 std::vector<scalar_type> coeff(mf->nb_basic_dof_of_element(cv));
74 GMM_ASSERT1(values(lsnum).size() == mf->nb_dof(),
75 "Inconsistent state in the levelset: nb_dof=" <<
76 mf->nb_dof() <<
", values(" << lsnum <<
").size=" <<
77 values(lsnum).size());
78 for (
size_type i = 0; i < coeff.size(); ++i)
79 coeff[i] = (!inverted ? scalar_type(1) : scalar_type(-1)) *
80 values(lsnum)[mf->ind_basic_dof_of_element(cv)[i]];
81 return new_mesher_level_set(mf->fem_of_element(cv), coeff, shift_ls);
85 return sizeof(*this) +
86 primary_.capacity() *
sizeof(scalar_type) +
87 secondary_.capacity() *
sizeof(scalar_type);
90 void level_set::simplify(scalar_type eps) {
91 for (dal::bv_visitor cv(mf->linked_mesh().convex_index());
92 !cv.finished(); ++cv) {
93 scalar_type h = mf->linked_mesh().convex_radius_estimate(cv);
94 for (
size_type i = 0; i < mf->nb_basic_dof_of_element(cv); ++i) {
95 size_type dof = mf->ind_basic_dof_of_element(cv)[i];
96 if (gmm::abs(primary_[dof]) < h*eps) {
97 primary_[dof] = scalar_type(0);
100 if (has_secondary() && gmm::abs(secondary_[dof]) < h*eps)
101 secondary_[dof] = scalar_type(0);
109 struct dummy_level_set_ {
111 dummy_level_set_() : ls(dummy_mesh()) {}
114 const level_set &dummy_level_set()
static T & instance()
Instance from the current thread.
size_t size_type
used as the common size type in the library
void add_dependency(pstatic_stored_object o1, pstatic_stored_object o2)
Add a dependency, object o1 will depend on object o2.
GEneric Tool for Finite Element Methods.
const mesh_fem & classical_mesh_fem(const mesh &mesh, dim_type degree, dim_type qdim=1, bool complete=false)
Gives the descriptor of a classical finite element method of degree K on mesh.