getfem-commits
[Top][All Lists]
Advanced

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

[Getfem-commits] r5383 - in /trunk/getfem/src: getfem/getfem_generic_ass


From: logari81
Subject: [Getfem-commits] r5383 - in /trunk/getfem/src: getfem/getfem_generic_assembly.h getfem/getfem_mesh_slice.h getfem_generic_assembly.cc
Date: Wed, 05 Oct 2016 09:37:20 -0000

Author: logari81
Date: Wed Oct  5 11:37:20 2016
New Revision: 5383

URL: http://svn.gna.org/viewcvs/getfem?rev=5383&view=rev
Log:
implement interpolation of generic assembly expressions on a mesh_slice

Modified:
    trunk/getfem/src/getfem/getfem_generic_assembly.h
    trunk/getfem/src/getfem/getfem_mesh_slice.h
    trunk/getfem/src/getfem_generic_assembly.cc

Modified: trunk/getfem/src/getfem/getfem_generic_assembly.h
URL: 
http://svn.gna.org/viewcvs/getfem/trunk/getfem/src/getfem/getfem_generic_assembly.h?rev=5383&r1=5382&r2=5383&view=diff
==============================================================================
--- trunk/getfem/src/getfem/getfem_generic_assembly.h   (original)
+++ trunk/getfem/src/getfem/getfem_generic_assembly.h   Wed Oct  5 11:37:20 2016
@@ -42,6 +42,7 @@
 #include <map>
 #include "getfem/getfem_models.h"
 #include "getfem/getfem_interpolation.h"
+#include "getfem/getfem_mesh_slice.h"
 
 
 #ifdef _WIN32
@@ -497,6 +498,14 @@
   (const getfem::model &md, const std::string &expr, const im_data &imd,
    base_vector &result, const mesh_region &rg=mesh_region::all_convexes());
 
+  void ga_interpolation_mesh_slice
+  (ga_workspace &workspace, const stored_mesh_slice &sl, base_vector &result);
+
+  void ga_interpolation_mesh_slice
+  (const getfem::model &md, const std::string &expr, const stored_mesh_slice 
&sl,
+   base_vector &result, const mesh_region &rg=mesh_region::all_convexes());
+
+
   //=========================================================================
   // Local projection functions
   //=========================================================================

Modified: trunk/getfem/src/getfem/getfem_mesh_slice.h
URL: 
http://svn.gna.org/viewcvs/getfem/trunk/getfem/src/getfem/getfem_mesh_slice.h?rev=5383&r1=5382&r2=5383&view=diff
==============================================================================
--- trunk/getfem/src/getfem/getfem_mesh_slice.h (original)
+++ trunk/getfem/src/getfem/getfem_mesh_slice.h Wed Oct  5 11:37:20 2016
@@ -99,6 +99,9 @@
     /** return the original convex number of the 'ic'th convex
         referenced in the slice */
     size_type convex_num(size_type ic) const { return cvlst[ic].cv_num; }
+    /** return the position ic of the referenced convex in the slice convexes
+        list cvlist, corresponding to the original convex number cv*/
+    size_type convex_pos(size_type cv) const { return cv2pos[cv]; }
     /** change the slice dimension (append zeros or truncate node 
coordinates..) */
     void set_dim(size_type newdim);
     /** return the slice dimension */
@@ -120,8 +123,15 @@
     /** Return the list of simplexes for the 'ic'th convex of the slice. */
     const mesh_slicer::cs_simplexes_ct& simplexes(size_type ic) const { return 
cvlst[ic].simplexes; }
     size_type memsize() const;
-    void clear() { poriginal_mesh = 0; cvlst.clear(); points_cnt = 0; 
-      dim_ = size_type(-1); cv2pos.clear(); simplex_cnt.clear(); 
clear_merged_nodes(); }
+    void clear() {
+      poriginal_mesh = 0;
+      cvlst.clear();
+      points_cnt = 0; 
+      dim_ = size_type(-1);
+      gmm::fill(cv2pos, size_type(-1));
+      simplex_cnt.clear();
+      clear_merged_nodes();
+    }
     /** @brief merge with another mesh slice. */
     void merge(const stored_mesh_slice& sl);
 

Modified: trunk/getfem/src/getfem_generic_assembly.cc
URL: 
http://svn.gna.org/viewcvs/getfem/trunk/getfem/src/getfem_generic_assembly.cc?rev=5383&r1=5382&r2=5383&view=diff
==============================================================================
--- trunk/getfem/src/getfem_generic_assembly.cc (original)
+++ trunk/getfem/src/getfem_generic_assembly.cc Wed Oct  5 11:37:20 2016
@@ -11666,6 +11666,91 @@
     ga_interpolation_im_data(workspace, imd, result);
   }
 
+
+  // Interpolation on a stored_mesh_slice
+  struct ga_interpolation_context_mesh_slice
+    : public ga_interpolation_context {
+    base_vector &result;
+    const stored_mesh_slice &sl;
+    bool initialized;
+    size_type s;
+    std::vector<size_type> first_node;
+
+    virtual bgeot::pstored_point_tab
+    ppoints_for_element(size_type cv, short_type f,
+                        std::vector<size_type> &ind) const {
+      GMM_ASSERT1(f == short_type(-1), "No support for interpolation on faces"
+                                       " for a stored_mesh_slice yet.");
+      size_type ic = sl.convex_pos(cv);
+      mesh_slicer::cs_nodes_ct nodes = sl.nodes(ic);
+      std::vector<base_node> pt_tab(nodes.size());
+      for (size_type i=0; i < nodes.size(); ++i) {
+        pt_tab[i] = nodes[i].pt_ref;
+        ind.push_back(i);
+      }
+      return store_point_tab(pt_tab);
+    }
+
+    virtual bool use_pgp(size_type /* cv */) const { return false; } // why 
not?
+    virtual bool use_mim() const { return false; }
+
+    virtual void store_result(size_type cv, size_type i, base_tensor &t) {
+      size_type si = t.size();
+      if (!initialized) {
+        s = si;
+        gmm::resize(result, s * sl.nb_points());
+        gmm::clear(result);
+        initialized = true;
+        first_node.resize(sl.nb_convex());
+        for (size_type ic=0; ic < sl.nb_convex()-1; ++ic)
+          first_node[ic+1] = first_node[ic] + sl.nodes(ic).size();
+      }
+      GMM_ASSERT1(s == si && result.size() == s * sl.nb_points(), "Internal 
error");
+      size_type ic = sl.convex_pos(cv);
+      size_type ipt = first_node[ic] + i;
+      gmm::add(t.as_vector(),
+               gmm::sub_vector(result, gmm::sub_interval(s*ipt, s)));
+    }
+
+    virtual void finalize() {
+      std::vector<size_type> data(2);
+      data[0] = initialized ? result.size() : 0;
+      data[1] = initialized ? s : 0;
+      MPI_MAX_VECTOR(data);
+      if (initialized) {
+        GMM_ASSERT1(gmm::vect_size(result) == data[0] &&  s == data[1],
+                    "Incompatible sizes");
+      } else {
+        if (data[0]) {
+          gmm::resize(result, data[0]);
+          s = data[1];
+        }
+        gmm::clear(result);
+      }
+      MPI_SUM_VECTOR(result);
+    }
+
+    virtual const mesh &linked_mesh() { return sl.linked_mesh(); }
+
+    ga_interpolation_context_mesh_slice(const stored_mesh_slice &sl_, 
base_vector &r)
+      : result(r), sl(sl_), initialized(false) { }
+  };
+
+  void ga_interpolation_mesh_slice
+  (ga_workspace &workspace, const stored_mesh_slice &sl, base_vector &result) {
+    ga_interpolation_context_mesh_slice gic(sl, result);
+    ga_interpolation(workspace, gic);
+  }
+
+  void ga_interpolation_mesh_slice
+  (const getfem::model &md, const std::string &expr, const stored_mesh_slice 
&sl,
+   base_vector &result, const mesh_region &rg) {
+    ga_workspace workspace(md);
+    workspace.add_interpolation_expression(expr, sl.linked_mesh(), rg);
+    ga_interpolation_mesh_slice(workspace, sl, result);
+  }
+
+
   //=========================================================================
   // Local projection functions
   //=========================================================================




reply via email to

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