getfem-commits
[Top][All Lists]
Advanced

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

[Getfem-commits] (no subject)


From: Konstantinos Poulios
Subject: [Getfem-commits] (no subject)
Date: Mon, 11 Jun 2018 05:35:34 -0400 (EDT)

branch: master
commit 3a1c26a8adfd7eacd320f6a109b9ba10557556d4
Author: Konstantinos Poulios <address@hidden>
Date:   Mon Jun 11 11:35:17 2018 +0200

    Add target region option to interpolate transformation from expression
---
 src/getfem/getfem_generic_assembly.h         | 27 +++++++++++------
 src/getfem_generic_assembly_interpolation.cc | 44 ++++++++++++++++++++--------
 2 files changed, 50 insertions(+), 21 deletions(-)

diff --git a/src/getfem/getfem_generic_assembly.h 
b/src/getfem/getfem_generic_assembly.h
index 2bd1478..ae00f13 100644
--- a/src/getfem/getfem_generic_assembly.h
+++ b/src/getfem/getfem_generic_assembly.h
@@ -659,20 +659,29 @@ namespace getfem {
   // Interpolate transformations
   //=========================================================================
 
-  /** Add a transformation to the model `md` from mesh `source_mesh` to mesh
-      `target_mesh` given by the expression `expr` which corresponds to a
-      high-level generic assembly expression which may contains some
-      variable of the model. CAUTION: For the moment, the derivative of the
-      transformation with respect to the eventual variables used is not
-      taken into account in the model solve.
+  /** Add a transformation to a workspace `workspace` or a model `md` mapping
+      point in mesh `source_mesh` to mesh `target_mesh`, optionally restricted
+      to the region `target_region`. The transformation is defined by the
+      expression `expr`, which has to be in the high-level generic assembly
+      syntax and may contain some variables of the workspace/model.
+      CAUTION: For the moment, the derivative of the transformation with
+      respect to any of these variables is not taken into account in the model
+      solve.
   */
   void add_interpolate_transformation_from_expression
-  (model &md, const std::string &transname, const mesh &source_mesh,
-   const mesh &target_mesh, const std::string &expr);
-
+  (ga_workspace &workspace, const std::string &transname,
+   const mesh &source_mesh, const mesh &target_mesh, const std::string &expr);
   void add_interpolate_transformation_from_expression
   (ga_workspace &workspace, const std::string &transname,
+   const mesh &source_mesh, const mesh &target_mesh,
+   size_type target_region, const std::string &expr);
+  void add_interpolate_transformation_from_expression
+  (model &md, const std::string &transname,
    const mesh &source_mesh, const mesh &target_mesh, const std::string &expr);
+  void add_interpolate_transformation_from_expression
+  (model &md, const std::string &transname,
+   const mesh &source_mesh, const mesh &target_mesh,
+   size_type target_region, const std::string &expr);
 
   /** Add a transformation to the workspace that creates an identity mapping
       between two meshes in deformed state. Conceptually, it can be viewed
diff --git a/src/getfem_generic_assembly_interpolation.cc 
b/src/getfem_generic_assembly_interpolation.cc
index 2a48225..c6c1563 100644
--- a/src/getfem_generic_assembly_interpolation.cc
+++ b/src/getfem_generic_assembly_interpolation.cc
@@ -489,6 +489,7 @@ namespace getfem {
 
     const mesh &source_mesh;
     const mesh &target_mesh;
+    const size_type target_region;
     std::string expr;
     mutable bgeot::rtree element_boxes;
     mutable bool recompute_elt_boxes;
@@ -579,8 +580,11 @@ namespace getfem {
 
         element_boxes.clear();
         base_node bmin(N), bmax(N);
-        for (dal::bv_visitor cv(target_mesh.convex_index());
-             !cv.finished(); ++cv) {
+        const dal::bit_vector&
+          convex_index = (target_region == mesh_region::all_convexes().id())
+                       ? target_mesh.convex_index()
+                       : target_mesh.region(target_region).index();
+        for (dal::bv_visitor cv(convex_index); !cv.finished(); ++cv) {
 
           bgeot::pgeometric_trans pgt = target_mesh.trans_of_convex(cv);
 
@@ -708,9 +712,9 @@ namespace getfem {
       return ret_type;
     }
 
-    interpolate_transformation_expression(const mesh &sm, const mesh &tm,
-                                          const std::string &expr_)
-      : source_mesh(sm), target_mesh(tm), expr(expr_),
+    interpolate_transformation_expression
+    (const mesh &sm, const mesh &tm, size_type trg, const std::string &expr_)
+      : source_mesh(sm), target_mesh(tm), target_region(trg), expr(expr_),
         recompute_elt_boxes(true), extract_variable_done(false),
         extract_data_done(false)
     { this->add_dependency(tm); }
@@ -719,21 +723,37 @@ namespace getfem {
 
 
   void add_interpolate_transformation_from_expression
-  (model &md, const std::string &name, const mesh &sm, const mesh &tm,
-   const std::string &expr) {
-    pinterpolate_transformation
-      p = std::make_shared<interpolate_transformation_expression>(sm, tm, 
expr);
-    md.add_interpolate_transformation(name, p);
+  (ga_workspace &workspace, const std::string &name, const mesh &sm,
+   const mesh &tm, const std::string &expr) {
+    add_interpolate_transformation_from_expression
+    (workspace, name, sm, tm, size_type(-1), expr);
   }
 
   void add_interpolate_transformation_from_expression
   (ga_workspace &workspace, const std::string &name, const mesh &sm,
-   const mesh &tm, const std::string &expr) {
+   const mesh &tm, size_type trg, const std::string &expr) {
     pinterpolate_transformation
-      p = std::make_shared<interpolate_transformation_expression>(sm, tm, 
expr);
+      p = std::make_shared<interpolate_transformation_expression>
+          (sm, tm, trg, expr);
     workspace.add_interpolate_transformation(name, p);
   }
 
+  void add_interpolate_transformation_from_expression
+  (model &md, const std::string &name, const mesh &sm, const mesh &tm,
+   const std::string &expr) {
+    add_interpolate_transformation_from_expression
+    (md, name, sm, tm, size_type(-1), expr);
+  }
+
+  void add_interpolate_transformation_from_expression
+  (model &md, const std::string &name, const mesh &sm, const mesh &tm,
+   size_type trg, const std::string &expr) {
+    pinterpolate_transformation
+      p = std::make_shared<interpolate_transformation_expression>
+          (sm, tm, trg, expr);
+    md.add_interpolate_transformation(name, p);
+  }
+
   //=========================================================================
   // Interpolate transformation on neighbour element (for internal faces)
   //=========================================================================



reply via email to

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