getfem-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Getfem-commits] r5209 - in /trunk/getfem/src: getfem/getfem_level_set.h


From: logari81
Subject: [Getfem-commits] r5209 - in /trunk/getfem/src: getfem/getfem_level_set.h getfem_level_set.cc getfem_mesh_fem_global_function.cc
Date: Fri, 25 Dec 2015 17:21:19 -0000

Author: logari81
Date: Fri Dec 25 18:21:18 2015
New Revision: 5209

URL: http://svn.gna.org/viewcvs/getfem?rev=5209&view=rev
Log:
remove unused class member, increase constness, reduce duplicate code

Modified:
    trunk/getfem/src/getfem/getfem_level_set.h
    trunk/getfem/src/getfem_level_set.cc
    trunk/getfem/src/getfem_mesh_fem_global_function.cc

Modified: trunk/getfem/src/getfem/getfem_level_set.h
URL: 
http://svn.gna.org/viewcvs/getfem/trunk/getfem/src/getfem/getfem_level_set.h?rev=5209&r1=5208&r2=5209&view=diff
==============================================================================
--- trunk/getfem/src/getfem/getfem_level_set.h  (original)
+++ trunk/getfem/src/getfem/getfem_level_set.h  Fri Dec 25 18:21:18 2015
@@ -41,11 +41,11 @@
 #include "getfem_mesher.h"
 
 namespace getfem {
-  /** @brief Define a level-set.  
+  /** @brief Define a level-set.
 
       In getfem, a levelset is one or two scalar functions, defined on
       a lagrange polynomial mesh_fem.
-      
+
       The (optional) second function is a way to limit the level-set
       to handle cracks for example.
   */
@@ -53,7 +53,6 @@
   class level_set : public context_dependencies, virtual public 
dal::static_stored_object {
 
   protected :
-    mesh *pmesh;
     dim_type degree_;
     const mesh_fem *mf;
     std::vector<scalar_type> primary_, secondary_;
@@ -63,7 +62,7 @@
     // Deprecated.
 
     void copy_from(const level_set &ls); // WARNING :  to be updated if
-                                         //    some components are added 
+                                         //    some components are added
 
   public :
 
@@ -79,20 +78,22 @@
     { return (i == 0) ? primary_ : secondary_; }
 
     pmesher_signed_distance mls_of_convex(size_type cv, unsigned lsnum = 0,
-                                         bool inverted = false) const;
+                                          bool inverted = false) const;
     bool has_secondary(void) const { return with_secondary; }
     const mesh_fem &get_mesh_fem(void) const { return *mf; }
     const mesh &linked_mesh() const { return mf->linked_mesh(); }
     dim_type degree() const { return degree_; }
-    level_set(mesh &msh, dim_type deg = dim_type(1),
-             bool with_secondary_ = false);
+    level_set(const mesh &msh, dim_type deg = dim_type(1),
+              bool with_secondary_ = false);
     level_set(const level_set &ls);
     level_set &operator =(const level_set &ls);
 
     ~level_set();
     size_type memsize() const;
   };
- 
+
+  /* Dummy level_set for default parameter of functions. */
+  const level_set &dummy_level_set();
 
 }  /* end of namespace getfem.                                             */
 

Modified: trunk/getfem/src/getfem_level_set.cc
URL: 
http://svn.gna.org/viewcvs/getfem/trunk/getfem/src/getfem_level_set.cc?rev=5209&r1=5208&r2=5209&view=diff
==============================================================================
--- trunk/getfem/src/getfem_level_set.cc        (original)
+++ trunk/getfem/src/getfem_level_set.cc        Fri Dec 25 18:21:18 2015
@@ -24,9 +24,9 @@
 
 namespace getfem {
 
-  level_set::level_set(mesh &msh, dim_type deg,
+  level_set::level_set(const mesh &msh, dim_type deg,
                       bool with_secondary_)
-    : pmesh(&msh), degree_(deg), mf(&classical_mesh_fem(msh, deg)),
+    : degree_(deg), mf(&classical_mesh_fem(msh, deg)),
       with_secondary(with_secondary_) {
     shift_ls = scalar_type(0);
     primary_.resize(mf->nb_dof());
@@ -35,7 +35,6 @@
   }
 
   void level_set::copy_from(const level_set &ls) {
-    pmesh = ls.pmesh;
     degree_ = ls.degree_;
     mf = ls.mf;
     primary_ = ls.primary_;
@@ -107,6 +106,15 @@
   }
 
   
+  struct dummy_level_set_ {
+    level_set ls;
+    dummy_level_set_() : ls(dummy_mesh()) {}
+  };
+
+  const level_set &dummy_level_set()
+  { return dal::singleton<dummy_level_set_>::instance().ls; }
+
+
 
 }  /* end of namespace getfem.                                             */
 

Modified: trunk/getfem/src/getfem_mesh_fem_global_function.cc
URL: 
http://svn.gna.org/viewcvs/getfem/trunk/getfem/src/getfem_mesh_fem_global_function.cc?rev=5209&r1=5208&r2=5209&view=diff
==============================================================================
--- trunk/getfem/src/getfem_mesh_fem_global_function.cc (original)
+++ trunk/getfem/src/getfem_mesh_fem_global_function.cc Fri Dec 25 18:21:18 2015
@@ -564,52 +564,75 @@
   }
 
 
-  struct global_function_on_levelset_ :
+  struct global_function_on_levelsets_ :
     public global_function, public context_dependencies {
+    const std::vector<level_set> dummy_lsets;
+    const std::vector<level_set> &lsets;
     const level_set &ls;
     mutable pmesher_signed_distance mls_x, mls_y;
     mutable size_type cv;
 
     pxy_function fn;
 
-    void update_mls(size_type cv_) const {
+    void update_mls(size_type cv_, size_type n) const {
       if (cv_ != cv) {
         cv=cv_;
-        mls_x = ls.mls_of_convex(cv, 1);
-        mls_y = ls.mls_of_convex(cv, 0);
+        if (lsets.size() == 0) {
+          mls_x = ls.mls_of_convex(cv, 1);
+          mls_y = ls.mls_of_convex(cv, 0);
+        } else {
+          base_node pt(n);
+          scalar_type d = scalar_type(-2);
+          for (const auto &ls_ : lsets) {
+            pmesher_signed_distance mls_xx, mls_yy;
+            mls_xx = ls_.mls_of_convex(cv, 1);
+            mls_yy = ls_.mls_of_convex(cv, 0);
+            scalar_type x = (*mls_xx)(pt), y = (*mls_yy)(pt);
+            scalar_type d2 = gmm::sqr(x) + gmm::sqr(y);
+            if (d < scalar_type(-1) || d2 < d) {
+              d = d2;
+              mls_x = mls_xx;
+              mls_y = mls_yy;
+           }
+          }
+        }
       }
     }
 
     virtual scalar_type val(const fem_interpolation_context& c) const {
-      update_mls(c.convex_num());
+      update_mls(c.convex_num(), c.xref().size());
       scalar_type x = (*mls_x)(c.xref());
       scalar_type y = (*mls_y)(c.xref());
       if (c.xfem_side() > 0 && y <= 0) y = 1E-13;
       if (c.xfem_side() < 0 && y >= 0) y = -1E-13;
+
       return fn->val(x,y);
     }
     virtual void grad(const fem_interpolation_context& c,
                       base_small_vector &g) const {
-      update_mls(c.convex_num());
       size_type P = c.xref().size();
       base_small_vector dx(P), dy(P), dfr(2);
+
+      update_mls(c.convex_num(), P);
       scalar_type x = mls_x->grad(c.xref(), dx);
       scalar_type y = mls_y->grad(c.xref(), dy);
       if (c.xfem_side() > 0 && y <= 0) y = 1E-13;
       if (c.xfem_side() < 0 && y >= 0) y = -1E-13;
+
       base_small_vector gfn = fn->grad(x,y);
       gmm::mult(c.B(), gfn[0]*dx + gfn[1]*dy, g);
     }
     virtual void hess(const fem_interpolation_context&c,
                       base_matrix &h) const {
-      update_mls(c.convex_num());
       size_type P = c.xref().size(), N = c.N();
-
       base_small_vector dx(P), dy(P), dfr(2),  dx_real(N), dy_real(N);
+
+      update_mls(c.convex_num(), P);
       scalar_type x = mls_x->grad(c.xref(), dx);
       scalar_type y = mls_y->grad(c.xref(), dy);
       if (c.xfem_side() > 0 && y <= 0) y = 1E-13;
       if (c.xfem_side() < 0 && y >= 0) y = -1E-13;
+
       base_small_vector gfn = fn->grad(x,y);
       base_matrix hfn = fn->hess(x,y);
 
@@ -638,109 +661,22 @@
 
     void update_from_context(void) const { cv =  size_type(-1); }
 
-    global_function_on_levelset_(const level_set &ls_, const pxy_function &fn_)
-      : ls(ls_), fn(fn_) {
-      cv = size_type(-1);
-      this->add_dependency(ls);
-    }
-
-  };
-
-  pglobal_function
-  global_function_on_level_set(const level_set &ls,
-                               const pxy_function &fn) {
-    return std::make_shared<global_function_on_levelset_>(ls, fn);
-  }
-
-
-  struct global_function_on_levelsets_ :
-    public global_function, public context_dependencies {
-    const std::vector<level_set> &lsets;
-    mutable pmesher_signed_distance mls_x, mls_y;
-    mutable size_type cv;
-
-    pxy_function fn;
-
-    void update_mls(size_type cv_, size_type n) const {
-      if (cv_ != cv) {
-        base_node pt(n);
-        cv=cv_;
-        scalar_type d = scalar_type(-2);
-        for (size_type i = 0; i < lsets.size(); ++i) {
-          pmesher_signed_distance mls_xx, mls_yy;
-          mls_xx = lsets[i].mls_of_convex(cv, 1);
-          mls_yy = lsets[i].mls_of_convex(cv, 0);
-          scalar_type x = (*mls_xx)(pt), y = (*mls_yy)(pt);
-          scalar_type d2 = gmm::sqr(x) + gmm::sqr(y);
-          if (d < scalar_type(-1) || d2 < d) {
-            d = d2;
-            mls_x = mls_xx; mls_y = mls_yy;
-          }
-        }
-      }
-    }
-
-    virtual scalar_type val(const fem_interpolation_context& c) const {
-      update_mls(c.convex_num(), c.xref().size());
-      scalar_type x = (*mls_x)(c.xref());
-      scalar_type y = (*mls_y)(c.xref());
-      return fn->val(x,y);
-    }
-    virtual void grad(const fem_interpolation_context& c,
-                      base_small_vector &g) const {
-      size_type P = c.xref().size();
-      update_mls(c.convex_num(), P);
-      base_small_vector dx(P), dy(P), dfr(2);
-      scalar_type x = mls_x->grad(c.xref(), dx);
-      scalar_type y = mls_y->grad(c.xref(), dy);
-
-      base_small_vector gfn = fn->grad(x,y);
-
-      gmm::mult(c.B(), gfn[0]*dx + gfn[1]*dy, g);
-    }
-    virtual void hess(const fem_interpolation_context&c,
-                      base_matrix &h) const {
-      size_type P = c.xref().size(), N = c.N();
-      update_mls(c.convex_num(), P);
-
-      base_small_vector dx(P), dy(P), dfr(2),  dx_real(N), dy_real(N);
-      scalar_type x = mls_x->grad(c.xref(), dx);
-      scalar_type y = mls_y->grad(c.xref(), dy);
-
-      base_small_vector gfn = fn->grad(x,y);
-      base_matrix hfn = fn->hess(x,y);
-
-      base_matrix hx, hy, hx_real(N*N, 1), hy_real(N*N, 1);
-      mls_x->hess(c.xref(), hx);
-      mls_x->hess(c.xref(), hy);
-      gmm::reshape(hx, P*P, 1);
-      gmm::reshape(hy, P*P, 1);
-
-      gmm::mult(c.B3(), hx, hx_real);
-      gmm::mult(c.B32(), gmm::scaled(dx, -1.0), gmm::mat_col(hx_real, 0));
-      gmm::mult(c.B3(), hy, hy_real);
-      gmm::mult(c.B32(), gmm::scaled(dy, -1.0), gmm::mat_col(hy_real, 0));
-      gmm::mult(c.B(), dx, dx_real);
-      gmm::mult(c.B(), dy, dy_real);
-
-      for (size_type i = 0; i < N; ++i)
-        for (size_type j = 0; j < N; ++j) {
-          h(i, j) = hfn(0,0) * dx_real[i] * dx_real[j]
-            + hfn(0,1) * dx_real[i] * dy_real[j]
-            + hfn(1,0) * dy_real[i] * dx_real[j]
-            + hfn(1,1) * dy_real[i] * dy_real[j]
-            + gfn[0] * hx_real(i * N + j, 0) + gfn[1] * hy_real(i*N+j,0);
-        }
-    }
-
-    void update_from_context(void) const { cv =  size_type(-1); }
-
     global_function_on_levelsets_(const std::vector<level_set> &lsets_,
                                   const pxy_function &fn_)
-      : lsets(lsets_), fn(fn_) {
+      : dummy_lsets(0, dummy_level_set()),
+        lsets(lsets_), ls(dummy_level_set()), fn(fn_) {
+      GMM_ASSERT1(lsets.size() > 0, "The list of level sets should"
+                                    " contain at least one level set.");
       cv = size_type(-1);
       for (size_type i = 0; i < lsets.size(); ++i)
         this->add_dependency(lsets[i]);
+    }
+
+    global_function_on_levelsets_(const level_set &ls_,
+                                  const pxy_function &fn_)
+      : dummy_lsets(0, dummy_level_set()),
+        lsets(dummy_lsets), ls(ls_), fn(fn_) {
+      cv = size_type(-1);
     }
 
   };
@@ -751,6 +687,11 @@
     return std::make_shared<global_function_on_levelsets_>(lsets, fn);
   }
 
+  pglobal_function
+  global_function_on_level_set(const level_set &ls,
+                               const pxy_function &fn) {
+    return std::make_shared<global_function_on_levelsets_>(ls, fn);
+  }
 
   // interpolator on mesh_fem
 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]