getfem-commits
[Top][All Lists]
Advanced

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

[Getfem-commits] r4914 - /trunk/getfem/src/getfem_generic_assembly.cc


From: logari81
Subject: [Getfem-commits] r4914 - /trunk/getfem/src/getfem_generic_assembly.cc
Date: Thu, 26 Mar 2015 14:49:21 -0000

Author: logari81
Date: Thu Mar 26 15:49:21 2015
New Revision: 4914

URL: http://svn.gna.org/viewcvs/getfem?rev=4914&view=rev
Log:
finish code refactoring, reduce code duplication in interpolate instructions

Modified:
    trunk/getfem/src/getfem_generic_assembly.cc

Modified: trunk/getfem/src/getfem_generic_assembly.cc
URL: 
http://svn.gna.org/viewcvs/getfem/trunk/getfem/src/getfem_generic_assembly.cc?rev=4914&r1=4913&r2=4914&view=diff
==============================================================================
--- trunk/getfem/src/getfem_generic_assembly.cc (original)
+++ trunk/getfem/src/getfem_generic_assembly.cc Thu Mar 26 15:49:21 2015
@@ -2787,6 +2787,7 @@
     ga_instruction_set::interpolate_info &inin;
     size_type pt_type;
     int nb;
+
     virtual int exec(void) {
       GA_DEBUG_INFO("Instruction: interpolated filter");
       if ((pt_type == size_type(-1) && inin.pt_type) ||
@@ -2801,6 +2802,7 @@
       }
       return 0;
     }
+
     ga_instruction_interpolate_filter
     (base_tensor &t_, ga_instruction_set::interpolate_info &inin_,
      size_type ind_, int nb_)
@@ -2840,6 +2842,7 @@
   };
 
   struct ga_instruction_interpolate_val : public ga_instruction_interpolate {
+
     virtual int exec(void) {
       GA_DEBUG_INFO("Instruction: interpolated variable value");
       ga_instruction_interpolate::exec();
@@ -2852,6 +2855,7 @@
   };
 
   struct ga_instruction_interpolate_grad : public ga_instruction_interpolate {
+
     virtual int exec(void) {
       GA_DEBUG_INFO("Instruction: interpolated variable grad");
       ga_instruction_interpolate::exec();
@@ -2865,6 +2869,7 @@
   };
 
   struct ga_instruction_interpolate_hess : public ga_instruction_interpolate {
+
     virtual int exec(void) {
       GA_DEBUG_INFO("Instruction: interpolated variable hessian");
       ga_instruction_interpolate::exec();
@@ -2877,15 +2882,13 @@
     using ga_instruction_interpolate::ga_instruction_interpolate;
   };
 
-  struct ga_instruction_interpolate_val_base : public ga_instruction {
-    base_tensor &t;
-    base_tensor Z;
+  struct ga_instruction_interpolate_base {
+    base_tensor ZZ;
     const mesh **m;
     const mesh_fem *mfn, **mfg;
     fem_interpolation_context &ctx;
-    size_type qdim;
+
     virtual int exec(void) {
-      GA_DEBUG_INFO("Instruction: interpolated base value");
       GMM_ASSERT1(ctx.is_convex_num_valid(), "No valid element for the "
                   "transformation. Probably transformation failed");
       const mesh_fem &mf = *(mfg ? *mfg : mfn);
@@ -2893,146 +2896,64 @@
         "on another mesh than the one it is defined on");
       ctx.set_pf(mf.fem_of_element(ctx.convex_num()));
       GMM_ASSERT1(ctx.pf(), "Undefined finite element method");
-      ctx.pf()->real_base_value(ctx, Z);
-
-      size_type ndof = Z.sizes()[0];
-      size_type target_dim = Z.sizes()[1];
-      size_type Qmult = qdim / target_dim;
-      GA_DEBUG_ASSERT(t.size() == Z.size() * Qmult * Qmult,
-                      "Wrong size for base vector");
-      if (Qmult == 1) {
-        gmm::copy(Z.as_vector(), t.as_vector());
-      } else {
-        gmm::clear(t.as_vector());
-        base_tensor::iterator itZ = Z.begin();
-        size_type s = t.sizes()[0], ss = s * Qmult, sss = s+1;
-
-        // Performs t(i*Qmult+j, k*Qmult + j) = Z(i,k);
-        for (size_type k = 0; k < target_dim; ++k) {
-          base_tensor::iterator it = t.begin() + (ss * k);
-          for (size_type i = 0; i < ndof; ++i, ++itZ) {
-            if (i) it += Qmult;
-            base_tensor::iterator it2 = it;
-            *it2 = *itZ;
-            for (size_type j = 1; j < Qmult; ++j) { it2 += sss; *it2 = *itZ; }
-          }
-        }
-      }
       return 0;
     }
 
+    ga_instruction_interpolate_base
+    (const mesh **m_, const mesh_fem *mfn_, const mesh_fem **mfg_,
+     fem_interpolation_context &ctx_)
+      : m(m_), mfn(mfn_), mfg(mfg_), ctx(ctx_) {}
+  };
+
+  struct ga_instruction_interpolate_val_base
+    : public ga_instruction_copy_val_base, ga_instruction_interpolate_base {
+
+    virtual int exec(void) {
+      GA_DEBUG_INFO("Instruction: interpolated base value");
+      ga_instruction_interpolate_base::exec();
+      ctx.pf()->real_base_value(ctx, Z); // remember Z == ZZ
+      return ga_instruction_copy_val_base::exec();
+    }
+
     ga_instruction_interpolate_val_base
-    (base_tensor &tt, const mesh **m_, const mesh_fem *mfn_,
-     const mesh_fem **mfg_,
-     fem_interpolation_context &ctx_, size_type q)
-      : t(tt), m(m_), mfn(mfn_), mfg(mfg_), ctx(ctx_), qdim(q) {}
-  };
-
-  struct ga_instruction_interpolate_grad_base : public ga_instruction {
-    base_tensor &t;
-    base_tensor Z;
-    const mesh **m;
-    const mesh_fem *mfn, **mfg;
-    fem_interpolation_context &ctx;
-    size_type qdim;
+    (base_tensor &t_, const mesh **m_, const mesh_fem *mfn_,
+     const mesh_fem **mfg_, fem_interpolation_context &ctx_, size_type q)
+      : ga_instruction_copy_val_base(t_, ZZ, q),
+        ga_instruction_interpolate_base(m_, mfn_, mfg_, ctx_) {}
+  };
+
+  struct ga_instruction_interpolate_grad_base
+    : public ga_instruction_copy_grad_base, ga_instruction_interpolate_base {
+
     virtual int exec(void) {
       GA_DEBUG_INFO("Instruction: interpolated base vgrad");
-      GMM_ASSERT1(ctx.is_convex_num_valid(), "No valid element for the "
-                  "transformation. Probably transformation failed");
-      const mesh_fem &mf = *(mfg ? *mfg : mfn);
-      GMM_ASSERT1(&(mf.linked_mesh()) == *m, "Interpolatation of a variable "
-        "on another mesh than the one it is defined on");
-      ctx.set_pf(mf.fem_of_element(ctx.convex_num()));
-      GMM_ASSERT1(ctx.pf(), "Undefined finite element method");
-      ctx.pf()->real_grad_base_value(ctx, Z);
-
-      size_type ndof = Z.sizes()[0];
-      size_type target_dim = Z.sizes()[1];
-      size_type N = Z.sizes()[2];
-      size_type Qmult = qdim / target_dim;
-      GA_DEBUG_ASSERT(t.size() == Z.size() * Qmult * Qmult,
-                      "Wrong size for gradient vector");
-      if (Qmult == 1) {
-        gmm::copy(Z.as_vector(), t.as_vector());
-      } else {
-        gmm::clear(t.as_vector());
-        base_tensor::const_iterator itZ = Z.begin();
-        size_type s = t.sizes()[0], ss = s * Qmult, sss = s+1;
-        size_type ssss=ss*target_dim;
-
-        // Performs t(i*Qmult+j, k*Qmult + j, l) = Z(i,k,l);
-        for (size_type l = 0; l < N; ++l)
-          for (size_type k = 0; k < target_dim; ++k) {
-            base_tensor::iterator it = t.begin() + (ss * k + ssss*l);
-            for (size_type i = 0; i < ndof; ++i, ++itZ) {
-              if (i) it += Qmult;
-              base_tensor::iterator it2 = it;
-              *it2 = *itZ;
-              for (size_type j = 1; j < Qmult; ++j) { it2 += sss; *it2 = *itZ; 
}
-            }
-          }
-      }
-      return 0;
-    }
+      ga_instruction_interpolate_base::exec();
+      ctx.pf()->real_grad_base_value(ctx, Z); // remember Z == ZZ
+      return ga_instruction_copy_grad_base::exec();
+    }
+
     ga_instruction_interpolate_grad_base
-    (base_tensor &tt, const mesh **m_, const mesh_fem *mfn_,
-     const mesh_fem **mfg_,
-     fem_interpolation_context &ctx_, size_type q)
-      : t(tt), m(m_), mfn(mfn_), mfg(mfg_), ctx(ctx_), qdim(q) {}
-  };
-
-  struct ga_instruction_interpolate_hess_base : public ga_instruction {
-    base_tensor &t;
-    base_tensor Z;
-    const mesh **m;
-    const mesh_fem *mfn, **mfg;
-    fem_interpolation_context &ctx;
-    size_type qdim;
+    (base_tensor &t_, const mesh **m_, const mesh_fem *mfn_,
+     const mesh_fem **mfg_, fem_interpolation_context &ctx_, size_type q)
+      : ga_instruction_copy_grad_base(t_, ZZ, q),
+        ga_instruction_interpolate_base(m_, mfn_, mfg_, ctx_) {}
+  };
+
+  struct ga_instruction_interpolate_hess_base
+    : public ga_instruction_copy_hess_base, ga_instruction_interpolate_base {
+
     virtual int exec(void) {
       GA_DEBUG_INFO("Instruction: interpolated base hessian");
-      GMM_ASSERT1(ctx.is_convex_num_valid(), "No valid element for the "
-                  "transformation. Probably transformation failed");
-      const mesh_fem &mf = *(mfg ? *mfg : mfn);
-      GMM_ASSERT1(&(mf.linked_mesh()) == *m, "Interpolatation of a variable "
-        "on another mesh than the one it is defined on");
-      ctx.set_pf(mf.fem_of_element(ctx.convex_num()));
-      GMM_ASSERT1(ctx.pf(), "Undefined finite element method");
-      ctx.pf()->real_hess_base_value(ctx, Z);
-
-      size_type ndof = Z.sizes()[0];
-      size_type target_dim = Z.sizes()[1];
-      size_type N2 = Z.sizes()[2];
-      size_type Qmult = qdim / target_dim;
-      GA_DEBUG_ASSERT(t.size() == Z.size() * Qmult * Qmult,
-                      "Wrong size for Hessian vector");
-      if (Qmult == 1) {
-        gmm::copy(Z.as_vector(), t.as_vector());
-      } else {
-        gmm::clear(t.as_vector());
-
-        base_tensor::const_iterator itZ = Z.begin();
-        size_type s = t.sizes()[0], ss = s * Qmult, sss = s+1;
-        size_type ssss=ss*target_dim;
-
-        // Performs t(i*Qmult+j, k*Qmult + j, l, m) = Z(i,k,l*N+m);
-        for (size_type l = 0; l < N2; ++l)
-          for (size_type k = 0; k < target_dim; ++k) {
-            base_tensor::iterator it = t.begin() + (ss * k + ssss*l);
-            for (size_type i = 0; i < ndof; ++i, ++itZ) {
-              if (i) it += Qmult;
-              base_tensor::iterator it2 = it;
-              *it2 = *itZ;
-              for (size_type j = 1; j < Qmult; ++j) { it2 += sss; *it2 = *itZ; 
}
-            }
-          }
-      }
-      return 0;
-    }
+      ga_instruction_interpolate_base::exec();
+      ctx.pf()->real_hess_base_value(ctx, Z); // remember Z == ZZ
+      return ga_instruction_copy_hess_base::exec();
+    }
+
     ga_instruction_interpolate_hess_base
-    (base_tensor &tt, const mesh **m_, const mesh_fem *mfn_,
-     const mesh_fem **mfg_,
-     fem_interpolation_context &ctx_, size_type q)
-      : t(tt), m(m_), mfn(mfn_), mfg(mfg_), ctx(ctx_), qdim(q) {}
+    (base_tensor &t_, const mesh **m_, const mesh_fem *mfn_,
+     const mesh_fem **mfg_, fem_interpolation_context &ctx_, size_type q)
+      : ga_instruction_copy_hess_base(t_, ZZ, q),
+        ga_instruction_interpolate_base(m_, mfn_, mfg_, ctx_) {}
   };
 
 




reply via email to

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