[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
//=========================================================================
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Getfem-commits] r5383 - in /trunk/getfem/src: getfem/getfem_generic_assembly.h getfem/getfem_mesh_slice.h getfem_generic_assembly.cc,
logari81 <=