getfem-commits
[Top][All Lists]
Advanced

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

[Getfem-commits] r5449 - in /trunk/getfem: contrib/opt_assembly/ src/ sr


From: Yves . Renard
Subject: [Getfem-commits] r5449 - in /trunk/getfem: contrib/opt_assembly/ src/ src/getfem/
Date: Thu, 27 Oct 2016 19:52:19 -0000

Author: renard
Date: Thu Oct 27 21:52:18 2016
New Revision: 5449

URL: http://svn.gna.org/viewcvs/getfem?rev=5449&view=rev
Log:
some small optimizations

Modified:
    trunk/getfem/contrib/opt_assembly/opt_assembly.cc
    trunk/getfem/src/getfem/getfem_context.h
    trunk/getfem/src/getfem/getfem_mesh_fem.h
    trunk/getfem/src/getfem_context.cc
    trunk/getfem/src/getfem_generic_assembly.cc
    trunk/getfem/src/getfem_mesh_fem.cc

Modified: trunk/getfem/contrib/opt_assembly/opt_assembly.cc
URL: 
http://svn.gna.org/viewcvs/getfem/trunk/getfem/contrib/opt_assembly/opt_assembly.cc?rev=5449&r1=5448&r2=5449&view=diff
==============================================================================
--- trunk/getfem/contrib/opt_assembly/opt_assembly.cc   (original)
+++ trunk/getfem/contrib/opt_assembly/opt_assembly.cc   Thu Oct 27 21:52:18 2016
@@ -256,7 +256,7 @@
   
   bool all = false;
   bool select = true;
-  int only_one = 2;
+  int only_one = 1;
 
   if (all || select || only_one == 1) {
     VEC_TEST_1("Test for source term", ndofu, "u.Test_u", mim, size_type(-1),

Modified: trunk/getfem/src/getfem/getfem_context.h
URL: 
http://svn.gna.org/viewcvs/getfem/trunk/getfem/src/getfem/getfem_context.h?rev=5449&r1=5448&r2=5449&view=diff
==============================================================================
--- trunk/getfem/src/getfem/getfem_context.h    (original)
+++ trunk/getfem/src/getfem/getfem_context.h    Thu Oct 27 21:52:18 2016
@@ -97,15 +97,16 @@
 
     void sup_dependent_(const context_dependencies &cd) const;
     void sup_dependency_(const context_dependencies &cd) const;
-    void invalid_context(void) const;
+    void invalid_context() const;
+    bool go_check() const;
 
   public :
     
     /** this function has to be defined and should update the object when
        the context is modified. */
-    virtual void update_from_context(void) const = 0;
+    virtual void update_from_context() const = 0;
 
-    void change_context(void) const
+    void change_context() const
     { 
       if (state == CONTEXT_NORMAL) 
       { 
@@ -125,11 +126,12 @@
     void clear_dependencies();
 
 
-    bool is_context_valid(void) const { return (state != CONTEXT_INVALID); }
+    bool is_context_valid() const { return (state != CONTEXT_INVALID); }
     bool is_context_changed() const { return (state == CONTEXT_CHANGED); }
     /** return true if update_from_context was called */
-    bool context_check(void) const;
-    void touch(void) const;
+    bool context_check() const
+    { if (state == CONTEXT_NORMAL) return false; return go_check(); }
+    void touch() const;
     virtual ~context_dependencies();
     context_dependencies() : state(CONTEXT_NORMAL), touched( ) {touched = 
false;}
     context_dependencies(const context_dependencies& cd);

Modified: trunk/getfem/src/getfem/getfem_mesh_fem.h
URL: 
http://svn.gna.org/viewcvs/getfem/trunk/getfem/src/getfem/getfem_mesh_fem.h?rev=5449&r1=5448&r2=5449&view=diff
==============================================================================
--- trunk/getfem/src/getfem/getfem_mesh_fem.h   (original)
+++ trunk/getfem/src/getfem/getfem_mesh_fem.h   Thu Oct 27 21:52:18 2016
@@ -153,7 +153,7 @@
     void copy_from(const mesh_fem &mf); /* Remember to change copy_from if
                                            adding components to mesh_fem */
 
-    dal::dynamic_array<pfem> f_elems;
+    std::vector<pfem> f_elems;
     dal::bit_vector fe_convex;
     const mesh *linked_mesh_;
     REDUCTION_MATRIX R_;
@@ -424,7 +424,7 @@
      *  vectorization due to qdim nor the optional reduction.
      */
     virtual pfem fem_of_element(size_type cv) const
-    { return  f_elems[cv]; }
+    { return f_elems[cv]; }
     /** Give an array of the dof numbers a of convex.
      *  @param cv the convex number.
      *  @return a pseudo-container of the dof number.
@@ -577,7 +577,7 @@
     size_type memsize() const {
       return dof_structure.memsize() +
         sizeof(mesh_fem) - sizeof(bgeot::mesh_structure) +
-        f_elems.memsize() + fe_convex.memsize();
+        f_elems.size() * sizeof(pfem) + fe_convex.memsize();
     }
     void init_with_mesh(const mesh &me, dim_type Q = 1);
     /** Build a new mesh_fem. A mesh object must be supplied.
@@ -660,6 +660,29 @@
     }
   }
 
+  template <typename VEC1, typename VEC2>
+  void slice_vector_on_basic_dof_of_element(const mesh_fem &mf,
+                                            const VEC1 &vec,
+                                            size_type cv, VEC2 &coeff,
+                                           size_type qmult) {
+    auto &ct = mf.ind_scalar_basic_dof_of_element(cv);
+    size_type qmult2 = mf.get_qdim();
+    if (qmult2 > 1) qmult2 /= mf.fem_of_element(cv)->target_dim();
+    size_type qmultot = qmult*qmult2;
+    gmm::resize(coeff, ct.size()*qmultot);
+ 
+    auto it = ct.begin();
+    auto itc = coeff.begin();
+    if (qmultot == 1) {
+      for (; it != ct.end(); ++it) *itc++ = vec[*it];
+    } else {
+      for (; it != ct.end(); ++it) {
+       auto itv = vec.begin()+(*it)*qmult;
+       for (size_type m = 0; m < qmultot; ++m) *itc++ = *itv++;
+      }
+    }
+  }
+
   void vectorize_base_tensor(const base_tensor &t, base_matrix &vt,
                              size_type ndof, size_type qdim, size_type N);
 

Modified: trunk/getfem/src/getfem_context.cc
URL: 
http://svn.gna.org/viewcvs/getfem/trunk/getfem/src/getfem_context.cc?rev=5449&r1=5448&r2=5449&view=diff
==============================================================================
--- trunk/getfem/src/getfem_context.cc  (original)
+++ trunk/getfem/src/getfem_context.cc  Thu Oct 27 21:52:18 2016
@@ -62,7 +62,7 @@
     dependencies.resize(s);
   }
 
-  void context_dependencies::invalid_context(void) const {
+  void context_dependencies::invalid_context() const {
     if (state != CONTEXT_INVALID) 
     {
       iterator_list it = dependent.begin(), ite = dependent.end();
@@ -84,7 +84,7 @@
     cd.dependent.push_back(this);
   }
   
-  bool context_dependencies::context_check(void) const 
+  bool context_dependencies::go_check() const 
   {
     if (state == CONTEXT_CHANGED) 
     {
@@ -103,7 +103,7 @@
     return false;
   }
   
-  void context_dependencies::touch(void) const 
+  void context_dependencies::touch() const 
   {
     if (!touched) 
     {

Modified: trunk/getfem/src/getfem_generic_assembly.cc
URL: 
http://svn.gna.org/viewcvs/getfem/trunk/getfem/src/getfem_generic_assembly.cc?rev=5449&r1=5448&r2=5449&view=diff
==============================================================================
--- trunk/getfem/src/getfem_generic_assembly.cc (original)
+++ trunk/getfem/src/getfem_generic_assembly.cc Thu Oct 27 21:52:18 2016
@@ -2708,23 +2708,26 @@
         cv_old(-1) {}
   };
 
+
   struct ga_instruction_slice_local_dofs : public ga_instruction {
     const mesh_fem &mf;
     const base_vector &U;
     const fem_interpolation_context &ctx;
     base_vector &coeff;
     const size_type &ipt;
+    size_type qmult;
     virtual int exec() {
-      GA_DEBUG_INFO("Instruction: Slice local dofs");
       if (ipt == 0) {
-       slice_vector_on_basic_dof_of_element(mf, U, ctx.convex_num(), coeff);
+       GA_DEBUG_INFO("Instruction: Slice local dofs");
+       slice_vector_on_basic_dof_of_element(mf,U,ctx.convex_num(),coeff,qmult);
       }
       return 0;
     }
     ga_instruction_slice_local_dofs(const mesh_fem &mf_, const base_vector &U_,
                                     const fem_interpolation_context &ctx_,
-                                    base_vector &coeff_, const size_type &ipt_)
-      : mf(mf_), U(U_), ctx(ctx_), coeff(coeff_), ipt(ipt_)  {}
+                                    base_vector &coeff_, const size_type &ipt_,
+                                   size_type qmult_)
+      : mf(mf_), U(U_), ctx(ctx_), coeff(coeff_), ipt(ipt_), qmult(qmult_) {}
   };
 
   struct ga_instruction_update_pfp : public ga_instruction {
@@ -10597,7 +10600,8 @@
             // cout << "local dof of " << pnode->name << endl;
             pgai = std::make_shared<ga_instruction_slice_local_dofs>
               (*mf, *(gis.extended_vars[pnode->name]), gis.ctx,
-               rmi.local_dofs[pnode->name], gis.ipt);
+               rmi.local_dofs[pnode->name], gis.ipt,
+              gis.extended_vars[pnode->name]->size() / mf->nb_basic_dof());
             rmi.instructions.push_back(std::move(pgai));
           }
 

Modified: trunk/getfem/src/getfem_mesh_fem.cc
URL: 
http://svn.gna.org/viewcvs/getfem/trunk/getfem/src/getfem_mesh_fem.cc?rev=5449&r1=5448&r2=5449&view=diff
==============================================================================
--- trunk/getfem/src/getfem_mesh_fem.cc (original)
+++ trunk/getfem/src/getfem_mesh_fem.cc Thu Oct 27 21:52:18 2016
@@ -142,11 +142,21 @@
                   "Incompatibility between Qdim=" << int(Qdim) <<
                   " and target_dim " << int(pf->target_dim()) << " of " <<
                   name_of_fem(pf));
-      if (!fe_convex.is_in(cv) || f_elems[cv] != pf) {
-        fe_convex.add(cv);
-        f_elems[cv] = pf;
-        dof_enumeration_made = false;
+
+      
+      if (cv == f_elems.size()) {
+       f_elems.push_back(pf);
+       fe_convex.add(cv);
+       dof_enumeration_made = false;
         touch(); v_num = act_counter();
+      } else {
+       if (cv > f_elems.size()) f_elems.resize(cv+1);
+       if (!fe_convex.is_in(cv) || f_elems[cv] != pf) {
+         fe_convex.add(cv);
+         f_elems[cv] = pf;
+         dof_enumeration_made = false;
+         touch(); v_num = act_counter();
+       }
       }
     }
   }




reply via email to

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