getfem-commits
[Top][All Lists]
Advanced

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

[Getfem-commits] r5287 - in /trunk/getfem: interface/src/ src/ src/getfe


From: Yves . Renard
Subject: [Getfem-commits] r5287 - in /trunk/getfem: interface/src/ src/ src/getfem/
Date: Tue, 05 Apr 2016 09:31:58 -0000

Author: renard
Date: Tue Apr  5 11:31:57 2016
New Revision: 5287

URL: http://svn.gna.org/viewcvs/getfem?rev=5287&view=rev
Log:
small optimization of enumerate_dof (precomputation of the face of dofs)

Modified:
    trunk/getfem/interface/src/getfemint.h
    trunk/getfem/interface/src/getfemint_misc.cc
    trunk/getfem/src/getfem/getfem_fem.h
    trunk/getfem/src/getfem_fem.cc
    trunk/getfem/src/getfem_mesh_fem.cc

Modified: trunk/getfem/interface/src/getfemint.h
URL: 
http://svn.gna.org/viewcvs/getfem/trunk/getfem/interface/src/getfemint.h?rev=5287&r1=5286&r2=5287&view=diff
==============================================================================
--- trunk/getfem/interface/src/getfemint.h      (original)
+++ trunk/getfem/interface/src/getfemint.h      Tue Apr  5 11:31:57 2016
@@ -141,7 +141,7 @@
     unsigned ndim_;
     unsigned sizes_[ARRAY_DIMENSIONS_MAXDIM];
   public:
-    array_dimensions(): sz(0), ndim_(0) {}
+    array_dimensions(): sz(0), ndim_(0) { sizes_[0]=0; sizes_[1]=0; }
     void push_back(unsigned d) {
       GMM_ASSERT1(ndim_ != ARRAY_DIMENSIONS_MAXDIM-1,
                   " max. nb of dimensions for an output argument exceeded!");

Modified: trunk/getfem/interface/src/getfemint_misc.cc
URL: 
http://svn.gna.org/viewcvs/getfem/trunk/getfem/interface/src/getfemint_misc.cc?rev=5287&r1=5286&r2=5287&view=diff
==============================================================================
--- trunk/getfem/interface/src/getfemint_misc.cc        (original)
+++ trunk/getfem/interface/src/getfemint_misc.cc        Tue Apr  5 11:31:57 2016
@@ -277,7 +277,7 @@
         std::vector<size_type> cvpt(m.ind_points_of_convex(cv).begin(), 
m.ind_points_of_convex(cv).end());
         bgeot::mesh_edge_list_convex(m.structure_of_convex(cv), cvpt, cv, 
elcv, merge_convex);
         if (v.getm() == 2) { /* face numbers present */
-          /* loop while the convex number is do not change */
+          /* loop while the convex number do not change */
           do {
             mesh_edge_list_merge(m, el, elcv, int(cv), 
int(v(1,unsigned(j))-config::base_index()));
             j++;

Modified: trunk/getfem/src/getfem/getfem_fem.h
URL: 
http://svn.gna.org/viewcvs/getfem/trunk/getfem/src/getfem/getfem_fem.h?rev=5287&r1=5286&r2=5287&view=diff
==============================================================================
--- trunk/getfem/src/getfem/getfem_fem.h        (original)
+++ trunk/getfem/src/getfem/getfem_fem.h        Tue Apr  5 11:31:57 2016
@@ -240,6 +240,7 @@
        inherits from dal::static_stored_object
     */
     std::shared_ptr<bgeot::convex_structure> cvs_node;
+    std::vector<std::vector<short_type>> face_tab; // face list for each dof
     bgeot::convex<base_node> cv_node;
     mutable bgeot::pstored_point_tab pspt;
     mutable bool pspt_valid;
@@ -315,6 +316,8 @@
     */
     const base_node &node_of_dof(size_type cv, size_type i) const
       { return (*(node_tab(cv)))[i];}
+    virtual const std::vector<short_type> &
+      faces_of_dof(size_type /*cv*/, size_type i) const { return face_tab[i]; }
     bool is_on_real_element(void) const { return real_element_defined; }
     bool is_equivalent(void) const { return is_equiv; }
     bool need_G(void) const
@@ -459,28 +462,7 @@
     { copy(f); DAL_STORED_OBJECT_DEBUG_CREATED(this, "Fem"); }
     virtual ~virtual_fem() { DAL_STORED_OBJECT_DEBUG_DESTROYED(this, "Fem"); }
   private:
-    void copy(const virtual_fem &f) {
-      dof_types_ = f.dof_types_;
-
-      cvs_node = bgeot::new_convex_structure();
-      *cvs_node = *f.cvs_node; // deep copy
-      cv_node = f.cv_node;
-      cv_node.structure() = cvs_node;
-      pspt = 0;
-      pspt_valid = false;
-      cvr = f.cvr;
-      dim_ = f.dim_;
-      ntarget_dim = f.ntarget_dim;
-      vtype = f.vtype;
-      is_equiv = f.is_equiv;
-      is_lag = f.is_lag;
-      is_pol = f.is_pol;
-      is_polycomp = f.is_polycomp;
-      real_element_defined = f.real_element_defined;
-      es_degree = f.es_degree;
-      hier_raff = f.hier_raff;
-      debug_name_ = f.debug_name_;
-    }
+    void copy(const virtual_fem &f);
   };
 
   /**

Modified: trunk/getfem/src/getfem_fem.cc
URL: 
http://svn.gna.org/viewcvs/getfem/trunk/getfem/src/getfem_fem.cc?rev=5287&r1=5286&r2=5287&view=diff
==============================================================================
--- trunk/getfem/src/getfem_fem.cc      (original)
+++ trunk/getfem/src/getfem_fem.cc      Tue Apr  5 11:31:57 2016
@@ -519,10 +519,13 @@
     cv_node.points().resize(nb+1);
     cv_node.points()[nb] = pt;
     dof_types_.resize(nb+1);
+    face_tab.resize(nb+1);
     dof_types_[nb] = d;
     cvs_node->add_point_adaptative(nb, short_type(-1));
-    for (dal::bv_visitor f(faces); !f.finished(); ++f)
+    for (dal::bv_visitor f(faces); !f.finished(); ++f) {
       cvs_node->add_point_adaptative(nb, short_type(f));
+      face_tab[nb].push_back(short_type(f));
+    }
     pspt_valid = false;
   }
 
@@ -538,6 +541,7 @@
   void virtual_fem::init_cvs_node(void) {
     cvs_node->init_for_adaptative(cvr->structure());
     cv_node = bgeot::convex<base_node>(cvs_node);
+    face_tab.resize(0);
     pspt_valid = false;
   }
 
@@ -546,6 +550,29 @@
     pspt_valid = false;
   }
 
+  void virtual_fem::copy(const virtual_fem &f) {
+    dof_types_ = f.dof_types_;
+    cvs_node = bgeot::new_convex_structure();
+    *cvs_node = *f.cvs_node; // deep copy
+    cv_node = f.cv_node;
+    cv_node.structure() = cvs_node;
+    pspt = 0;
+    pspt_valid = false;
+    cvr = f.cvr;
+    dim_ = f.dim_;
+    ntarget_dim = f.ntarget_dim;
+    vtype = f.vtype;
+    is_equiv = f.is_equiv;
+    is_lag = f.is_lag;
+    is_pol = f.is_pol;
+    is_polycomp = f.is_polycomp;
+    real_element_defined = f.real_element_defined;
+    es_degree = f.es_degree;
+    hier_raff = f.hier_raff;
+    debug_name_ = f.debug_name_;
+    face_tab = f.face_tab;
+  }
+  
   /* ******************************************************************** */
   /*        PK class.                                                         
*/
   /* ******************************************************************** */

Modified: trunk/getfem/src/getfem_mesh_fem.cc
URL: 
http://svn.gna.org/viewcvs/getfem/trunk/getfem/src/getfem_mesh_fem.cc?rev=5287&r1=5286&r2=5287&view=diff
==============================================================================
--- trunk/getfem/src/getfem_mesh_fem.cc (original)
+++ trunk/getfem/src/getfem_mesh_fem.cc Tue Apr  5 11:31:57 2016
@@ -315,7 +315,6 @@
     
     // Auxilliary variables
     std::vector<size_type> itab;
-    std::vector<std::vector<short_type>> ftab;
     base_node P(linked_mesh().dim());
     fem_dof fd;
     bgeot::mesh_structure::ind_set s;
@@ -336,14 +335,6 @@
       size_type nbd = pf->nb_dof(cv);
       pdof_description andof = global_dof(pf->dim());
       itab.resize(nbd);
-
-      // determine for each dof on which faces it lies
-      ftab.resize(nbd);
-      for (size_type i = 0; i < nbd; ++i) ftab[i].resize(0);
-      for (short_type f = 0; f < pf->structure(cv)->nb_faces(); ++f) {
-        for (short_type i : pf->structure(cv)->ind_points_of_face(f))
-          ftab[i].push_back(f);
-      }
 
       for (size_type i = 0; i < nbd; i++) { // Loop on dofs
        fd.pnd = pf->dof_types()[i];
@@ -363,7 +354,7 @@
         } else {                            // For a standard linkable dof
           pgp->transform(linked_mesh().points_of_convex(cv), i, P);
           size_type idof = nbdof;
-         linked_mesh().neighbours_of_convex(cv, ftab[i], s);
+         linked_mesh().neighbours_of_convex(cv, pf->faces_of_dof(cv, i), s);
          for (size_type ncv : s) { // For each neighbour
                                    // control if the dof already exists.
            fd.ind_node = dof_nodes[ncv].search_node(P);




reply via email to

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