Mechanics of Defect Evolution Library
Loading...
Searching...
No Matches
TrialSum.h
Go to the documentation of this file.
1/* This file is part of MoDELib, distributed under the GNU GPL v2. */
2#ifndef model_TrialSum_H_
3#define model_TrialSum_H_
5#include <memory>
6#include <stdexcept>
7#include <type_traits>
8namespace model
9{
10 template<class T1,class T2>
11 struct TrialSum : TrialExpressionBase<TrialSum<T1,T2>>
12 {
13 using TrialFunctionType=typename T1::TrialFunctionType;
14 using ElementType=typename T1::ElementType;
15 using BaryType=typename T1::BaryType;
16 using ShapeFunctionMatrixType=typename T1::ShapeFunctionMatrixType;
17 static constexpr int rows=T1::rows;
18 static constexpr int cols=T1::cols;
19 static_assert(std::is_same_v<TrialFunctionType,typename T2::TrialFunctionType>);
20 static_assert(rows==T2::rows && cols==T2::cols);
21 const std::shared_ptr<T1> op1;
22 const std::shared_ptr<T2> op2;
23
24 TrialSum(std::shared_ptr<T1> x,std::shared_ptr<T2> y) : op1(std::move(x)),op2(std::move(y))
25 {
26 if(!op1 || !op2)
27 {
28 throw std::invalid_argument("Null FEM sum operand.");
29 }
30 if(!op1->field().sameField(op2->field()))
31 {
32 throw std::invalid_argument("Cannot add trial expressions of different FEM fields.");
33 }
34 }
35 const auto& field() const
36 {
37 return op1->field();
38 }
40 {
41 return op1->sfm(e,b)+op2->sfm(e,b);
42 }
43 auto sfmGrad(const ElementType& e,const BaryType& b) const
44 {
45 return (op1->sfmGrad(e,b)+op2->sfmGrad(e,b)).eval();
46 }
47 auto sfmDef(const ElementType& e,const BaryType& b) const
48 {
49 return (op1->sfmDef(e,b)+op2->sfmDef(e,b)).eval();
50 }
51 };
52 template<class T1,class T2, std::enable_if_t<std::is_base_of_v<TrialExpressionBase<T1>,T1> && std::is_base_of_v<TrialExpressionBase<T2>,T2>,int> = 0>
53 auto operator+(const std::shared_ptr<T1>& x,const std::shared_ptr<T2>& y)
54 {
55 return std::make_shared<TrialSum<T1,T2>>(x,y);
56 }
57}
58#endif
b
Definition int_R.m:16
x
Definition int_R.m:12
auto operator+(const std::shared_ptr< T1 > &x, const std::shared_ptr< T2 > &y)
auto sfmGrad(const ElementType &e, const BaryType &b) const
Definition TrialSum.h:43
typename T1::TrialFunctionType TrialFunctionType
Definition TrialSum.h:13
auto sfmDef(const ElementType &e, const BaryType &b) const
Definition TrialSum.h:47
TrialSum(std::shared_ptr< T1 > x, std::shared_ptr< T2 > y)
Definition TrialSum.h:24
const auto & field() const
Definition TrialSum.h:35
static constexpr int rows
Definition TrialSum.h:17
const std::shared_ptr< T1 > op1
Definition TrialSum.h:21
typename T1::ElementType ElementType
Definition TrialSum.h:14
ShapeFunctionMatrixType sfm(const ElementType &e, const BaryType &b) const
Definition TrialSum.h:39
const std::shared_ptr< T2 > op2
Definition TrialSum.h:22
static constexpr int cols
Definition TrialSum.h:18
typename T1::ShapeFunctionMatrixType ShapeFunctionMatrixType
Definition TrialSum.h:16
typename T1::BaryType BaryType
Definition TrialSum.h:15
int e