getfem-commits
[Top][All Lists]
Advanced

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

[Getfem-commits] r5076 - in /trunk/getfem/src: getfem/bgeot_tensor.h get


From: Yves . Renard
Subject: [Getfem-commits] r5076 - in /trunk/getfem/src: getfem/bgeot_tensor.h getfem/getfem_level_set.h getfem/getfem_mesher.h getfem_fem_level_set.cc
Date: Wed, 02 Sep 2015 14:43:01 -0000

Author: renard
Date: Wed Sep  2 16:43:00 2015
New Revision: 5076

URL: http://svn.gna.org/viewcvs/getfem?rev=5076&view=rev
Log:
slight optimization of fem_level_set eval

Modified:
    trunk/getfem/src/getfem/bgeot_tensor.h
    trunk/getfem/src/getfem/getfem_level_set.h
    trunk/getfem/src/getfem/getfem_mesher.h
    trunk/getfem/src/getfem_fem_level_set.cc

Modified: trunk/getfem/src/getfem/bgeot_tensor.h
URL: 
http://svn.gna.org/viewcvs/getfem/trunk/getfem/src/getfem/bgeot_tensor.h?rev=5076&r1=5075&r2=5076&view=diff
==============================================================================
--- trunk/getfem/src/getfem/bgeot_tensor.h      (original)
+++ trunk/getfem/src/getfem/bgeot_tensor.h      Wed Sep  2 16:43:00 2015
@@ -221,6 +221,20 @@
       this->resize(i*j);
     }
 
+    void init(size_type i, size_type j, size_type k) {
+      sizes_.resize(3); sizes_[0] = i; sizes_[1] = j; sizes_[2] = k; 
+      coeff.resize(3); coeff[0] = 1; coeff[1] = i; coeff[2] = i*j;
+      this->resize(i*j*k);
+    }
+
+    void init(size_type i, size_type j, size_type k, size_type l) {
+      sizes_.resize(4);
+      sizes_[0] = i; sizes_[1] = j; sizes_[2] = k; sizes_[3] = k; 
+      coeff.resize(4);
+      coeff[0] = 1; coeff[1] = i; coeff[2] = i*j; coeff[3] = i*j*k;
+      this->resize(i*j*k*l);
+    }
+
     void adjust_sizes(const multi_index &mi) {
       if (!mi.size() || (mi.size() != sizes().size())
           || !(std::equal(mi.begin(), mi.end(), sizes().begin())))
@@ -234,6 +248,17 @@
 
     void adjust_sizes(size_type i, size_type j)
     { if (sizes_.size() != 2 || sizes_[0] != i || sizes_[1] != j) init(i, j); }
+
+    void adjust_sizes(size_type i, size_type j, size_type k) {
+      if (sizes_.size() != 3 || sizes_[0] != i || sizes_[1] != j
+          || sizes_[2] != k)
+        init(i, j, k);
+    }
+    void adjust_sizes(size_type i, size_type j, size_type k, size_type l) {
+      if (sizes_.size() != 3 || sizes_[0] != i || sizes_[1] != j
+          || sizes_[2] != k || sizes_[3] != l)
+        init(i, j, k, l);
+    }
 
     tensor(const multi_index &c) { init(c); }
     tensor(size_type i, size_type j, size_type k, size_type l)

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=5076&r1=5075&r2=5076&view=diff
==============================================================================
--- trunk/getfem/src/getfem/getfem_level_set.h  (original)
+++ trunk/getfem/src/getfem/getfem_level_set.h  Wed Sep  2 16:43:00 2015
@@ -67,6 +67,7 @@
   public :
 
     void set_shift(scalar_type shift_ls_) { shift_ls = shift_ls_; }
+    scalar_type get_shift(void) const { return shift_ls; } 
     void simplify(scalar_type eps = 0.01);
     void update_from_context(void) const { }
     void reinit(void);

Modified: trunk/getfem/src/getfem/getfem_mesher.h
URL: 
http://svn.gna.org/viewcvs/getfem/trunk/getfem/src/getfem/getfem_mesher.h?rev=5076&r1=5075&r2=5076&view=diff
==============================================================================
--- trunk/getfem/src/getfem/getfem_mesher.h     (original)
+++ trunk/getfem/src/getfem/getfem_mesher.h     Wed Sep  2 16:43:00 2015
@@ -127,7 +127,11 @@
     template <typename VECT>
     mesher_level_set(pfem pf_, const VECT &coeff_,
                     scalar_type shift_ls_ = scalar_type(0)) {
-      shift_ls = shift_ls_; init_base(pf_, coeff_);
+      init_base(pf_, coeff_);
+      set_shift(shift_ls_);
+    }
+    void set_shift(scalar_type shift_ls_) {
+      shift_ls = shift_ls_; 
       if (shift_ls != scalar_type(0)) {
        base_node P(pf->dim()); base_small_vector G(pf->dim());
        grad(P, G);

Modified: trunk/getfem/src/getfem_fem_level_set.cc
URL: 
http://svn.gna.org/viewcvs/getfem/trunk/getfem/src/getfem_fem_level_set.cc?rev=5076&r1=5075&r2=5076&view=diff
==============================================================================
--- trunk/getfem/src/getfem_fem_level_set.cc    (original)
+++ trunk/getfem/src/getfem_fem_level_set.cc    Wed Sep  2 16:43:00 2015
@@ -1,3 +1,4 @@
+/* -*- c++ -*- (enables emacs c++ mode) */
 /*===========================================================================
 
  Copyright (C) 1999-2015 Yves Renard
@@ -94,17 +95,24 @@
 
   void fem_level_set::find_zone_id(const fem_interpolation_context &c, 
                                   std::vector<bool> &ids) const {
-    size_type s = 0;
+    size_type s = 0, cv = c.convex_num();
     for (size_type i = 0; i < dofzones.size(); ++i)
       if (dofzones[i]) s += dofzones[i]->size();
     ids.resize(0); ids.resize(dofzones.size()+1, false);
     // cout << "dofzones.size() = " << dofzones.size() << endl;
     std::string z(common_ls_zones);
+    base_vector coeff(32);
+    
+    mesher_level_set eval;
     for (dal::bv_visitor i(ls_index); !i.finished(); ++i) {
-      mesher_level_set eval = mls.get_level_set(i)->
-       mls_of_convex(c.convex_num());
+      const level_set *ls = mls.get_level_set(i);
+      const mesh_fem &mf = ls->get_mesh_fem();
+      slice_vector_on_basic_dof_of_element(mf, ls->values(), cv, coeff);
+      eval.init_base(mf.fem_of_element(cv), coeff);
+      eval.set_shift(ls->get_shift());
+
+      // mesher_level_set eval = mls.get_level_set(i)->mls_of_convex(cv);
       scalar_type v = eval(c.xref());
-      // z[i] = (v > 1e-9) ? '+' : ((v < -1e-9) ? '-' : '0');
       z[(size_t)i] = (v > 0.) ? '+' : '-';
     }
     unsigned cnt = 0;
@@ -112,7 +120,6 @@
       if (!dofzones[d]) continue;
       for (mesh_level_set::zoneset::const_iterator it = dofzones[d]->begin();
           it != dofzones[d]->end(); ++it, ++cnt) {
-        // cout << "cnt = " << cnt << endl;
        ids[cnt] = false;
        for (mesh_level_set::zone::const_iterator it2 = (*it)->begin();
             it2 != (*it)->end(); ++it2) {
@@ -124,9 +131,9 @@
 
   void fem_level_set::real_base_value(const fem_interpolation_context &c,
                                      base_tensor &t, bool) const {
-    bgeot::multi_index mi(2);
-    mi[1] = target_dim(); mi[0] = short_type(nb_base(0));
-    t.adjust_sizes(mi);
+    // bgeot::multi_index mi(2);
+    // mi[1] = target_dim(); mi[0] = short_type(nb_base(0));
+    t.adjust_sizes(nb_base(0), target_dim());
     base_tensor::iterator it = t.begin();
     fem_interpolation_context c0 = c;
     if (c0.have_pfp())
@@ -151,10 +158,10 @@
 
   void fem_level_set::real_grad_base_value(const fem_interpolation_context &c,
                                           base_tensor &t, bool) const {
-    bgeot::multi_index mi(3);
-    mi[2] = short_type(c.N()); mi[1] = target_dim();
-    mi[0] = short_type(nb_base(0));
-    t.adjust_sizes(mi);
+    // bgeot::multi_index mi(3);
+    // mi[2] = short_type(c.N()); mi[1] = target_dim();
+    // mi[0] = short_type(nb_base(0));
+    t.adjust_sizes(nb_base(0), target_dim(), c.N());
     fem_interpolation_context c0 = c;
     if (c0.have_pfp())
       c0.set_pfp(fem_precomp(bfem, &c0.pfp()->get_point_tab(), c0.pfp()));
@@ -182,11 +189,11 @@
   }
   
   void fem_level_set::real_hess_base_value(const fem_interpolation_context &c,
-                                 base_tensor &t, bool) const {
-    bgeot::multi_index mi(4);
-    mi[3] = mi[2] = short_type(c.N()); mi[1] = target_dim();
-    mi[0] = short_type(nb_base(0));
-    t.adjust_sizes(mi);
+                                           base_tensor &t, bool) const {
+    // bgeot::multi_index mi(4);
+    // mi[3] = mi[2] = short_type(c.N()); mi[1] = target_dim();
+    // mi[0] = short_type(nb_base(0));
+    t.adjust_sizes(nb_base(0), target_dim(), c.N(), c.N());
     fem_interpolation_context c0 = c;
     if (c0.have_pfp())
       c0.set_pfp(fem_precomp(bfem, &c0.pfp()->get_point_tab(), c0.pfp()));




reply via email to

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