26 level_set::level_set(
const mesh &msh, dim_type deg,
29 with_secondary(with_secondary_) {
30 shift_ls = scalar_type(0);
31 primary_.resize(mf->nb_dof());
32 if (has_secondary()) secondary_.resize(mf->nb_dof());
36 void level_set::copy_from(
const level_set &ls) {
39 primary_ = ls.primary_;
40 secondary_ = ls.secondary_;
41 with_secondary = ls.with_secondary;
42 shift_ls = ls.shift_ls;
47 level_set::level_set(
const level_set &ls) : context_dependencies() {
51 level_set &level_set::operator =(
const level_set &ls) {
52 this->sup_dependency(*mf);
57 level_set::~level_set() { }
59 void level_set::reinit(
void) {
60 primary_.resize(mf->nb_dof());
61 if (has_secondary()) secondary_.resize(mf->nb_dof());
65 pmesher_signed_distance level_set::mls_of_convex(
size_type cv,
unsigned lsnum,
66 bool inverted)
const {
67 assert(
this); assert(mf);
68 GMM_ASSERT1(mf->linked_mesh().convex_index().is_in(cv),
"convex " << cv
69 <<
" is not in the level set mesh!");
70 GMM_ASSERT1(mf->fem_of_element(cv),
"Internal error");
71 GMM_ASSERT1(!mf->is_reduced(),
"Internal error");
72 std::vector<scalar_type> coeff(mf->nb_basic_dof_of_element(cv));
73 GMM_ASSERT1(values(lsnum).size() == mf->nb_dof(),
74 "Inconsistent state in the levelset: nb_dof=" <<
75 mf->nb_dof() <<
", values(" << lsnum <<
").size=" <<
76 values(lsnum).size());
77 for (
size_type i = 0; i < coeff.size(); ++i)
78 coeff[i] = (!inverted ? scalar_type(1) : scalar_type(-1)) *
79 values(lsnum)[mf->ind_basic_dof_of_element(cv)[i]];
80 return new_mesher_level_set(mf->fem_of_element(cv), coeff, shift_ls);
84 return sizeof(*this) +
85 primary_.capacity() *
sizeof(scalar_type) +
86 secondary_.capacity() *
sizeof(scalar_type);
89 void level_set::simplify(scalar_type eps) {
90 for (dal::bv_visitor cv(mf->linked_mesh().convex_index());
91 !cv.finished(); ++cv) {
92 scalar_type h = mf->linked_mesh().convex_radius_estimate(cv);
93 for (
size_type i = 0; i < mf->nb_basic_dof_of_element(cv); ++i) {
94 size_type dof = mf->ind_basic_dof_of_element(cv)[i];
95 if (gmm::abs(primary_[dof]) < h*eps) {
96 primary_[dof] = scalar_type(0);
99 if (has_secondary() && gmm::abs(secondary_[dof]) < h*eps)
100 secondary_[dof] = scalar_type(0);
108 struct dummy_level_set_ {
110 dummy_level_set_() : ls(dummy_mesh()) {}
113 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.