[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.