getfem-commits
[Top][All Lists]
Advanced

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

[Getfem-commits] (no subject)


From: Liang Jin Lim
Subject: [Getfem-commits] (no subject)
Date: Mon, 11 Jun 2018 02:43:20 -0400 (EDT)

branch: uniform_composite_fem
commit d21a14d99e2ffb394617b3e67452594c681b4669
Author: lj <address@hidden>
Date:   Mon Jun 11 08:43:05 2018 +0200

    Save memory usage by storing polynomial as static_stored_object and store 
its convex and key in a map.
---
 src/bgeot_poly_composite.cc       | 51 ++++++++++++++++++++++-----------------
 src/getfem/bgeot_poly.h           |  3 ++-
 src/getfem/bgeot_poly_composite.h | 15 ++++++------
 src/getfem_fem_composite.cc       |  8 +++---
 4 files changed, 42 insertions(+), 35 deletions(-)

diff --git a/src/bgeot_poly_composite.cc b/src/bgeot_poly_composite.cc
index 7ce7569..5a2fb8c 100644
--- a/src/bgeot_poly_composite.cc
+++ b/src/bgeot_poly_composite.cc
@@ -120,11 +120,8 @@ namespace bgeot {
             elt[ii] = false;
             p0 = pt; p0 -= mp->orgs[ii];
             gmm::mult(gmm::transposed(mp->gtrans[ii]), p0, p1);
-            auto it = polytab.find(ii);
-            if (it == polytab.end()) return 0.0;
             if (mp->trans_of_convex(ii)->convex_ref()->is_in(p1) < 1E-10) {
-              return local_coordinate ? to_scalar(it->second.eval(p1.begin()))
-                                      : to_scalar(it->second.eval(pt.begin()));
+              return to_scalar(poly_of_subelt(ii).eval(local_coordinate ? 
p1.begin() : pt.begin()));
             }
           }
         }
@@ -144,11 +141,8 @@ namespace bgeot {
             elt[ii] = false;
             p0 = pt; p0 -= mp->orgs[ii];
             gmm::mult(gmm::transposed(mp->gtrans[ii]), p0, p1);
-            auto it = polytab.find(ii);
-            if (it == polytab.end()) return 0.0;
             if (mp->trans_of_convex(ii)->convex_ref()->is_in(p1) < 1E-10) {
-              return  local_coordinate ? to_scalar(it->second.eval(p1.begin()))
-                                       : 
to_scalar(it->second.eval(pt.begin()));
+              return to_scalar(poly_of_subelt(ii).eval(local_coordinate ? 
p1.begin() : pt.begin()));
             }
           }
         }
@@ -157,10 +151,12 @@ namespace bgeot {
     }
     GMM_ASSERT1(false, "Element not found in composite polynomial: " << pt);
   }
-
+  
+  DAL_TRIPLE_KEY(base_poly_key, short_type, short_type, 
std::vector<opt_long_scalar_type>);
 
   polynomial_composite::polynomial_composite(
-    const mesh_precomposite &m, bool lc) : mp(&m), local_coordinate(lc) {}
+    const mesh_precomposite &m, bool lc)
+    : mp(&m), local_coordinate(lc), default_poly(mp->dim(), 0) {}
 
   void polynomial_composite::derivative(short_type k) {
     if (local_coordinate) {
@@ -171,26 +167,37 @@ namespace bgeot {
         gmm::clear(e); e[k] = 1.0;
         gmm::mult(gmm::transposed(mp->gtrans[ic]), e, f);
         P.clear();
-        for (dim_type n = 0; n < N; ++n)
-        { Q = polytab[ic];
-        Q.derivative(n);
-        P += Q * f[n];  }
-        polytab[ic] = P;
+        auto &poly = poly_of_subelt(ic);
+        for (dim_type n = 0; n < N; ++n) {
+          Q = poly;
+          Q.derivative(n);
+          P += Q * f[n];
+        }
+        if (polytab.find(ic) != polytab.end()) set_poly_of_subelt(ic, P);
       }
     }
     else
-      for (size_type ic = 0; ic < mp->nb_convex(); ++ic)
-        polytab[ic].derivative(k);
+    for (size_type ic = 0; ic < mp->nb_convex(); ++ic) {
+      auto poly = poly_of_subelt(ic);
+      poly.derivative(k);
+      if (polytab.find(ic) != polytab.end()) set_poly_of_subelt(ic, poly);
+    }
   }
 
-  base_poly &polynomial_composite::set_poly_of_subelt(size_type l) {
-    return polytab[l];
+  void polynomial_composite::set_poly_of_subelt(size_type l, const base_poly 
&poly) {
+    auto poly_key = std::make_shared<base_poly_key>(poly.degree(), poly.dim(), 
poly);
+    auto o = dal::search_stored_object(poly_key);
+    if (!o) {
+      o = std::make_shared<base_poly>(poly);
+      dal::add_stored_object(poly_key, o);
+    }
+    polytab[l] = poly_key;
   }
 
-  const base_poly *polynomial_composite::poly_of_subelt(size_type l) const {
+  const base_poly &polynomial_composite::poly_of_subelt(size_type l) const {
     auto it = polytab.find(l);
-    if (it == polytab.end()) return nullptr;
-    else return &it->second;
+    if (it == polytab.end()) return default_poly;
+    return dynamic_cast<const base_poly 
&>(*dal::search_stored_object(it->second));
   }
 
 
diff --git a/src/getfem/bgeot_poly.h b/src/getfem/bgeot_poly.h
index 67e0502..edcd7dd 100644
--- a/src/getfem/bgeot_poly.h
+++ b/src/getfem/bgeot_poly.h
@@ -40,6 +40,7 @@
 */
 
 #include "bgeot_config.h"
+#include "dal_static_stored_objects.h";
 #include <vector>
 
 namespace bgeot
@@ -176,7 +177,7 @@ namespace bgeot
    *        The resulting polynomials have a smaller degree.
    *
    */
-  template<typename T> class polynomial : public std::vector<T> {
+  template<typename T> class polynomial : public std::vector<T>, public 
dal::static_stored_object {
   protected :
     
     short_type n, d;
diff --git a/src/getfem/bgeot_poly_composite.h 
b/src/getfem/bgeot_poly_composite.h
index 2a83a70..80df3f4 100644
--- a/src/getfem/bgeot_poly_composite.h
+++ b/src/getfem/bgeot_poly_composite.h
@@ -95,17 +95,18 @@ namespace bgeot {
 
   protected :
     const mesh_precomposite *mp;
-    std::map<size_type, base_poly> polytab;
-    bool local_coordinate; // are the polynomials described on the local
-    // coordinates of each sub-element or on global coordinates.
+    std::map<size_type, dal::pstatic_stored_object_key> polytab;
+    bool local_coordinate;  // are the polynomials described on the local
+                            // coordinates of each sub-element or on global 
coordinates.
+    base_poly default_poly;
 
   public :
     
     template <class ITER> scalar_type eval(const ITER &it) const;
     scalar_type eval(const base_node &pt) const;
     void derivative(short_type k);
-    base_poly &set_poly_of_subelt(size_type l);
-    const base_poly *poly_of_subelt(size_type l) const;
+    void set_poly_of_subelt(size_type l, const base_poly &poly);
+    const base_poly &poly_of_subelt(size_type l) const;
     size_type nb_subelt() const { return polytab.size(); }
 
     polynomial_composite(bool lc = true) : local_coordinate(lc) {}
@@ -117,9 +118,7 @@ namespace bgeot {
   (std::ostream &o, const polynomial_composite& P) {
     o << "poly_composite [";
     for (size_type i = 0; i < P.nb_subelt(); ++i) {
-      if (i == 0) continue;
-      auto poly = P.poly_of_subelt(i);
-      o << ", ";  o << (poly) ? *poly : base_poly();
+      if (i != 0) o << ", " << P.poly_of_subelt(i);
     }
     o << "]";
     return o;
diff --git a/src/getfem_fem_composite.cc b/src/getfem_fem_composite.cc
index 90d9ed4..2241b98 100644
--- a/src/getfem_fem_composite.cc
+++ b/src/getfem_fem_composite.cc
@@ -59,7 +59,7 @@ namespace getfem {
       for (size_type k = 0; k < pf->nb_dof(cv); ++k) {
        size_type igl = mf.ind_basic_dof_of_element(cv)[k];
        base_poly fu = pf->base()[k];
-       base[igl].set_poly_of_subelt(cv) = fu;
+       base[igl].set_poly_of_subelt(cv, fu);
        dofd[igl] = pf->dof_types()[k];
       }
     }
@@ -189,7 +189,7 @@ namespace getfem {
       (4, bgeot::polynomial_composite(mp, false));
     for (size_type k = 0; k < 4; ++k)
       for (size_type ic = 0; ic < 3; ++ic)
-        base()[k].set_poly_of_subelt(ic) = bgeot::read_base_poly(2, s);
+        base()[k].set_poly_of_subelt(ic, bgeot::read_base_poly(2, s));
 
     for (size_type i = 0; i < 3; ++i) {
       base_node pt(0.0, 0.0);
@@ -355,7 +355,7 @@ namespace getfem {
       (12, bgeot::polynomial_composite(mp, false));
     for (size_type k = 0; k < 12; ++k)
       for (size_type ic = 0; ic < 3; ++ic)
-        base()[k].set_poly_of_subelt(ic) = bgeot::read_base_poly(2, s);
+        base()[k].set_poly_of_subelt(ic, bgeot::read_base_poly(2, s));
 
     for (size_type i = 0; i < 3; ++i) {
       base_node pt(0.0, 0.0);
@@ -621,7 +621,7 @@ namespace getfem {
       (16, bgeot::polynomial_composite(mp, false));
     for (size_type k = 0; k < 16; ++k)
       for (size_type ic = 0; ic < 4; ++ic)
-        base()[k].set_poly_of_subelt(ic) = bgeot::read_base_poly(2, s);
+        base()[k].set_poly_of_subelt(ic, bgeot::read_base_poly(2, s));
 
     for (size_type i = 0; i < 4; ++i) {
       base_node pt(0.0, 0.0);



reply via email to

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