getfem-commits
[Top][All Lists]
Advanced

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

[Getfem-commits] (no subject)


From: Yves Renard
Subject: [Getfem-commits] (no subject)
Date: Sun, 6 May 2018 14:55:19 -0400 (EDT)

branch: devel-yves-generic-assembly-modifs
commit f9c54c1866a97b4ecfca966d8044d53fe8b496f7
Author: Yves Renard <address@hidden>
Date:   Sun May 6 13:10:49 2018 +0200

    Allowing integration of tensor quantities
---
 interface/src/gf_asm.cc                         |  5 ++-
 src/getfem/getfem_generic_assembly.h            |  7 ++--
 src/getfem_generic_assembly_compile_and_exec.cc | 44 +++++++++++++++----------
 src/getfem_generic_assembly_workspace.cc        |  4 +--
 4 files changed, 37 insertions(+), 23 deletions(-)

diff --git a/interface/src/gf_asm.cc b/interface/src/gf_asm.cc
index d3af874..2a2d3e3 100644
--- a/interface/src/gf_asm.cc
+++ b/interface/src/gf_asm.cc
@@ -480,7 +480,10 @@ static void do_high_level_generic_assembly(mexargs_in& in, 
mexargs_out& out) {
   switch (order) {
   case 0:
     workspace.assembly(0);
-    out.pop().from_scalar(workspace.assembled_potential());
+    if (workspace.assembled_tensor().size() == 1)
+      out.pop().from_scalar(workspace.assembled_potential());
+    else
+      out.pop().from_dlvector(workspace.assembled_tensor().as_vector());
     break;
 
   case 1:
diff --git a/src/getfem/getfem_generic_assembly.h 
b/src/getfem/getfem_generic_assembly.h
index 6bde7da..0f7acb7 100644
--- a/src/getfem/getfem_generic_assembly.h
+++ b/src/getfem/getfem_generic_assembly.h
@@ -347,15 +347,16 @@ namespace getfem {
     model_real_sparse_matrix unreduced_K;
     std::shared_ptr<base_vector> V;
     base_vector unreduced_V;
-    scalar_type E = scalar_type(0.);
     base_tensor assemb_t;
 
   public:
 
     const model_real_sparse_matrix &assembled_matrix() const { return *K;}
     model_real_sparse_matrix &assembled_matrix() { return *K; }
-    scalar_type &assembled_potential() { return E; }
-    const scalar_type &assembled_potential() const { return E; }
+    scalar_type &assembled_potential()
+    { GMM_ASSERT1(assemb_t.size() == 1, "Bad result size"); return 
assemb_t[0]; }
+    const scalar_type &assembled_potential() const
+    { GMM_ASSERT1(assemb_t.size() == 1, "Bad result size"); return 
assemb_t[0]; }
     const base_vector &assembled_vector() const { return *V; }
     base_vector &assembled_vector() { return *V; }
     void set_assembled_matrix(model_real_sparse_matrix &K_) {
diff --git a/src/getfem_generic_assembly_compile_and_exec.cc 
b/src/getfem_generic_assembly_compile_and_exec.cc
index 9f2c794..a341d6d 100644
--- a/src/getfem_generic_assembly_compile_and_exec.cc
+++ b/src/getfem_generic_assembly_compile_and_exec.cc
@@ -1559,6 +1559,22 @@ namespace getfem {
       : t(t_), tc1(tc1_) {}
   };
 
+  struct ga_instruction_add_to_coeff : public ga_instruction {
+    base_tensor &t;
+    const base_tensor &tc1;
+    scalar_type &coeff;
+    virtual int exec() {
+      GA_DEBUG_INFO("Instruction: addition with scale");
+      GA_DEBUG_ASSERT(t.size() == tc1.size(), "internal error " << t.size()
+                      << " incompatible with " << tc1.size());
+      gmm::add(gmm::scaled(tc1.as_vector(), coeff), t.as_vector());
+      return 0;
+    }
+    ga_instruction_add_to_coeff(base_tensor &t_, const base_tensor &tc1_,
+                               scalar_type &coeff_)
+      : t(t_), tc1(tc1_), coeff(coeff_) {}
+  };
+
   struct ga_instruction_sub : public ga_instruction {
     base_tensor &t;
     const base_tensor &tc1, &tc2;
@@ -6122,15 +6138,9 @@ namespace getfem {
 
         gis.coeff = scalar_type(1);
         pga_instruction pgai;
-        if (scalar) {
-          pgai = std::make_shared<ga_instruction_scalar_assembly>
-            (root->tensor(), workspace.assembled_potential(), gis.coeff);
-
-        } else {
-          workspace.assembled_tensor() = root->tensor();
-          pgai = std::make_shared<ga_instruction_add_to>
-            (workspace.assembled_tensor(), root->tensor());
-        }
+       workspace.assembled_tensor() = root->tensor();
+       pgai = std::make_shared<ga_instruction_add_to_coeff>
+         (workspace.assembled_tensor(), root->tensor(), gis.coeff);
         gis.whole_instructions[rm].instructions.push_back(std::move(pgai));
       }
     }
@@ -6259,7 +6269,7 @@ namespace getfem {
   }
 
   void ga_compile(ga_workspace &workspace,
-                         ga_instruction_set &gis, size_type order) {
+                 ga_instruction_set &gis, size_type order) {
     gis.transformations.clear();
     gis.whole_instructions.clear();
     for (size_type version : std::array<size_type, 3>{1, 0, 2}) {
@@ -6305,19 +6315,19 @@ namespace getfem {
                 auto *imd
                   = workspace.associated_im_data(td.varname_interpolation);
                 auto &V = const_cast<model_real_plain_vector &>
-            (workspace.value(td.varname_interpolation));
+                 (workspace.value(td.varname_interpolation));
                 GMM_ASSERT1(imd, "Internal error");
                 auto pgai = std::make_shared<ga_instruction_assignment>
-            (root->tensor(), V, gis.ctx, imd);
+                 (root->tensor(), V, gis.ctx, imd);
                 rmi.instructions.push_back(std::move(pgai));
-        }
-            } else { // assembly
-              // Addition of an assembly instruction
+             }
+            } else { // Addition of an assembly instruction
               pga_instruction pgai;
               switch(order) {
               case 0:
-                pgai = std::make_shared<ga_instruction_scalar_assembly>
-                  (root->tensor(), workspace.assembled_potential(), gis.coeff);
+               workspace.assembled_tensor() = root->tensor();
+               pgai = std::make_shared<ga_instruction_add_to_coeff>
+                 (workspace.assembled_tensor(), root->tensor(), gis.coeff);
                 break;
               case 1:
                 {
diff --git a/src/getfem_generic_assembly_workspace.cc 
b/src/getfem_generic_assembly_workspace.cc
index 0429b2e..ac86f32 100644
--- a/src/getfem_generic_assembly_workspace.cc
+++ b/src/getfem_generic_assembly_workspace.cc
@@ -739,7 +739,7 @@ namespace getfem {
       gmm::clear(unreduced_V);
       gmm::resize(unreduced_V, ndof);
     }
-    E = 0;
+    gmm::clear(assembled_tensor().as_vector());
     GA_TOCTIC("Init time");
 
     ga_exec(gis, *this);
@@ -749,7 +749,7 @@ namespace getfem {
       MPI_SUM_VECTOR(assembled_vector());
       MPI_SUM_VECTOR(unreduced_V);
     } else if (order == 0) {
-      assembled_potential() = MPI_SUM_SCALAR(assembled_potential());
+      MPI_SUM_VECTOR(assembled_tensor().as_vector());
     }
 
     // Deal with reduced fems.



reply via email to

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