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: Sat, 14 Jul 2018 02:20:59 -0400 (EDT)

branch: code-cleanup
commit 19f1bd3f4682149e3f49e93931e1fe64adce4abd
Author: Konstantinos Poulios <address@hidden>
Date:   Sat Jul 14 08:20:45 2018 +0200

    Simplify geotrans_inv
---
 src/bgeot_geotrans_inv.cc       | 65 +++++++++++++++++++++++------------------
 src/getfem/bgeot_geotrans_inv.h | 37 +++++++++++------------
 2 files changed, 53 insertions(+), 49 deletions(-)

diff --git a/src/bgeot_geotrans_inv.cc b/src/bgeot_geotrans_inv.cc
index 2306c15..c60c975 100644
--- a/src/bgeot_geotrans_inv.cc
+++ b/src/bgeot_geotrans_inv.cc
@@ -113,33 +113,35 @@ namespace bgeot
     }
   };
 
-  nonlinear_storage_struct::linearised_structure::linearised_structure
-  (const convex_ind_ct &direct_points_indices,
-   const stored_point_tab &reference_nodes,
-   const std::vector<base_node> &real_nodes) :
-    diff(real_nodes.begin()->size()), diff_ref(direct_points_indices.size()-1) 
{
-    auto n_points = direct_points_indices.size();
-    std::vector<base_node> direct_points;
-    std::vector<base_node> direct_points_ref;
-    direct_points.reserve(n_points);
-    direct_points_ref.reserve(n_points);
-
-    for (auto i : direct_points_indices) {
-      direct_points.push_back(real_nodes[i]);
-      direct_points_ref.push_back(reference_nodes[i]);
+  void nonlinear_storage_struct::linearization(const convex_ind_ct &dir_pt_ind,
+                                               const stored_point_tab 
&ref_nodes,
+                                               const stored_point_tab 
&real_nodes)
+  {
+    has_linearized_approx = true;
+
+    diff_linear.resize(real_nodes.begin()->size());
+    diff_ref_linear.resize(dir_pt_ind.size()-1);
+
+    auto n_points = dir_pt_ind.size();
+
+    std::vector<base_node> dir_pts, dir_pts_ref;
+    for (auto i : dir_pt_ind) {
+      dir_pts.push_back(real_nodes[i]);
+      dir_pts_ref.push_back(ref_nodes[i]);
     }
 
-    auto N = direct_points.begin()->size();
-    auto N_ref = direct_points_ref.begin()->size();
+    auto N = dir_pts.begin()->size();
+    auto N_ref = dir_pts_ref.begin()->size();
     base_matrix K_linear(N, n_points - 1);
+
     B_linear.base_resize(N, n_points - 1);
     K_ref_linear.base_resize(N_ref, n_points - 1);
-    P_linear = direct_points[0];
-    P_ref_linear = direct_points_ref[0];
+    P_linear = dir_pts[0];
+    P_ref_linear = dir_pts_ref[0];
 
     for (size_type i = 1; i < n_points; ++i) {
-      add(direct_points[i], scaled(P_linear, -1.0), mat_col(K_linear, i - 1));
-      add(direct_points_ref[i], scaled(P_ref_linear, -1.0),
+      add(dir_pts[i], scaled(P_linear, -1.0), mat_col(K_linear, i - 1));
+      add(dir_pts_ref[i], scaled(P_ref_linear, -1.0),
           mat_col(K_ref_linear, i - 1));
     }
 
@@ -155,12 +157,14 @@ namespace bgeot
     }
   }
 
-  void nonlinear_storage_struct::linearised_structure::invert
-  (const base_node &x_real, base_node &x_ref, scalar_type /* IN_EPS */) const {
-    add(x_real, scaled(P_linear, -1.0), diff);
-    mult(transposed(B_linear), diff, diff_ref);
-    mult(K_ref_linear, diff_ref, x_ref);
-    add(P_ref_linear, x_ref);
+
+  void nonlinear_storage_struct::approx_invert(const base_node &xreal,
+                                               base_node &xref)
+  {
+      add(xreal, scaled(P_linear, -1.0), diff_linear);
+      mult(transposed(B_linear), diff_linear, diff_ref_linear);
+      mult(K_ref_linear, diff_ref_linear, xref);
+      add(P_ref_linear, xref);
   }
 
   void project_into_convex(base_node &x, const geometric_trans *pgeo_trans,
@@ -221,8 +225,10 @@ namespace bgeot
 
     res0 = std::numeric_limits<scalar_type>::max();
 
-    if (storage.plinearised_structure != nullptr) {
-      storage.plinearised_structure->invert(xreal, x, IN_EPS);
+    if (storage.has_linearized_approx) {
+
+      storage.approx_invert(xreal, x);
+
       project_into_convex(x, pgt, storage.project_into_element);
       res0 = vect_dist2(pgt->transform(x, G), xreal);
     }
@@ -238,7 +244,8 @@ namespace bgeot
   */
   bool geotrans_inv_convex::invert_nonlin(const base_node& xreal,
                                           base_node& x, scalar_type IN_EPS,
-                                          bool &converged, bool /* 
throw_except */) {
+                                          bool &converged,
+                                          bool /* throw_except */) {
     converged = true;
     find_initial_guess(x, nonlinear_storage, xreal, G, pgt.get(), IN_EPS);
     add(pgt->transform(x, G), scaled(xreal, -1.0), nonlinear_storage.diff);
diff --git a/src/getfem/bgeot_geotrans_inv.h b/src/getfem/bgeot_geotrans_inv.h
index c291d06..cfbaec3 100644
--- a/src/getfem/bgeot_geotrans_inv.h
+++ b/src/getfem/bgeot_geotrans_inv.h
@@ -65,23 +65,21 @@ namespace bgeot {
     base_node x_ref;
     bool project_into_element;
 
-    struct linearised_structure {
-      linearised_structure(
-        const convex_ind_ct &direct_points_indices,
-        const stored_point_tab &reference_nodes,
-        const std::vector<base_node> &real_nodes);
-      void invert(const base_node &x_real, base_node &x_ref,
-                  scalar_type IN_EPS) const;
-
-      base_matrix K_ref_linear;
-      base_matrix B_linear;
-      base_node P_linear;
-      base_node P_ref_linear;
-      mutable base_node diff;
-      mutable base_node diff_ref;
-    };
-
-    std::shared_ptr<linearised_structure> plinearised_structure = nullptr;
+    bool has_linearized_approx = false;
+
+  private:
+    base_matrix K_ref_linear;
+    base_matrix B_linear;
+    base_node P_linear;
+    base_node P_ref_linear;
+    mutable base_node diff_linear, diff_ref_linear;
+
+  public:
+    void linearization(const convex_ind_ct &dir_pt_ind,
+                       const stored_point_tab &ref_nodes,
+                       const stored_point_tab &real_nodes);
+    void approx_invert(const base_node &x_real, base_node &x_ref);
+
   };
   /** 
       does the inversion of the geometric transformation for a given convex
@@ -194,9 +192,8 @@ namespace bgeot {
       this->nonlinear_storage.x_ref.resize(P);
 
       if (pgt->complexity() > 1) {
-        std::vector<base_node> real_nodes(nodes.begin(), nodes.end());
-        this->nonlinear_storage.plinearised_structure
-          = std::make_shared<nonlinear_storage_struct::linearised_structure>
+        stored_point_tab real_nodes(nodes.begin(), nodes.end());
+        this->nonlinear_storage.linearization
           (pgt->structure()->ind_dir_points(), pgt->geometric_nodes(),
            real_nodes);
       }



reply via email to

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