GCC Code Coverage Report


Directory: ./
File: Hyperelasticity/linearProblemHyperElasticityHelper.hpp
Date: 2024-04-14 07:32:34
Exec Total Coverage
Lines: 36 42 85.7%
Branches: 88 194 45.4%

Line Branch Exec Source
1 // ______ ______ _ _ _____ ______
2 // | ____| ____| | (_)/ ____| | ____|
3 // | |__ | |__ | | _| (___ ___| |__
4 // | __| | __| | | | |\___ \ / __| __|
5 // | | | |____| |____| |____) | (__| |____
6 // |_| |______|______|_|_____/ \___|______|
7 // Finite Elements for Life Sciences and Engineering
8 //
9 // License: LGL2.1 License
10 // FELiScE default license: LICENSE in root folder
11 //
12 // Main authors: S. Gilles
13 //
14
15 #ifndef _FELISCE_PRIVATE_LINEAR_PROBLEM_HYPER_ELASTICITY_HPP
16 # define _FELISCE_PRIVATE_LINEAR_PROBLEM_HYPER_ELASTICITY_HPP
17
18 // System includes
19
20 // External includes
21
22 // Project includes
23 #include "Core/felisce.hpp"
24 #include "Core/felisceParam.hpp"
25 #include "FiniteElement/currentFiniteElement.hpp"
26 #include "Hyperelasticity/invariants.hpp"
27 #include "Hyperelasticity/enumHyperelasticity.hpp"
28 #include "HyperelasticityLaws/HyperElasticLaw.hpp"
29
30 namespace felisce {
31
32 namespace Private {
33
34 namespace HyperElasticity {
35
36 enum ForceType {
37 volumic = 1,
38 surfacic = 2
39 };
40
41 // Assign the type of force applied from the integer read in the data file
42 ForceType AssignForceType(int data_parameter);
43
44 /*!
45 * \brief Helper method for #calculateLinearAndNonLinearMatrixAndRhs.
46 *
47 * The point is mostly to put in common most of 2D (only plane strain considered at the moment) and 3D cases.
48 */
49 template<class CauchyGreenTensorT>
50 3156000 void calculateLinearAndNonLinearMatrixAndRhsHelper(HyperElasticLaw::Pointer pLaw,
51 const CauchyGreenTensorT& rCauchyGreenTensor,
52 double pressure,
53 const UBlasMatrix& De,
54 UBlasMatrix& linearPart,
55 UBlasVector& dW,
56 UBlasVector& rhsPart,
57 const bool IsIncompressible
58 )
59 {
60 {
61 9468000 std::array<double, 3> invariants {
62
1/2
✓ Branch 1 taken 1578000 times.
✗ Branch 2 not taken.
3156000 Invariants::Invariant1(rCauchyGreenTensor),
63
1/2
✓ Branch 1 taken 1578000 times.
✗ Branch 2 not taken.
3156000 Invariants::Invariant2(rCauchyGreenTensor),
64
1/2
✓ Branch 1 taken 1578000 times.
✗ Branch 2 not taken.
3156000 Invariants::Invariant3(rCauchyGreenTensor)
65 };
66
67
1/2
✓ Branch 2 taken 1578000 times.
✗ Branch 3 not taken.
3156000 pLaw->SetInvariants(invariants);
68 }
69
70
2/4
✓ Branch 1 taken 1578000 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1578000 times.
✗ Branch 6 not taken.
3156000 const UBlasVector dI1dC = std::move(FirstDerivativeInvariant1CauchyGreen(rCauchyGreenTensor));
71
2/4
✓ Branch 1 taken 1578000 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1578000 times.
✗ Branch 6 not taken.
3156000 const UBlasVector dI2dC = std::move(FirstDerivativeInvariant2CauchyGreen(rCauchyGreenTensor));
72
2/4
✓ Branch 1 taken 1578000 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1578000 times.
✗ Branch 6 not taken.
3156000 const UBlasVector dI3dC = std::move(FirstDerivativeInvariant3CauchyGreen(rCauchyGreenTensor));
73
74
1/2
✓ Branch 2 taken 1578000 times.
✗ Branch 3 not taken.
3156000 const double dWdI1 = pLaw->FirstDerivativeWFirstInvariant();
75
1/2
✓ Branch 2 taken 1578000 times.
✗ Branch 3 not taken.
3156000 const double dWdI2 = pLaw->FirstDerivativeWSecondInvariant();
76
1/2
✓ Branch 2 taken 1578000 times.
✗ Branch 3 not taken.
3156000 const double dWdI3 = pLaw->FirstDerivativeWThirdInvariant();
77
78
1/2
✓ Branch 1 taken 1578000 times.
✗ Branch 2 not taken.
3156000 UBlasMatrix d2W;
79 {
80
2/4
✓ Branch 1 taken 1578000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1578000 times.
✗ Branch 5 not taken.
3156000 UBlasMatrix d2W_first_term, d2W_second_term;
81
82
2/4
✓ Branch 1 taken 1578000 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1578000 times.
✗ Branch 6 not taken.
3156000 const UBlasMatrix d2I1dC = std::move(Invariants::SecondDerivativeInvariant1CauchyGreen(rCauchyGreenTensor));
83
2/4
✓ Branch 1 taken 1578000 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1578000 times.
✗ Branch 6 not taken.
3156000 const UBlasMatrix d2I2dC = std::move(Invariants::SecondDerivativeInvariant2CauchyGreen(rCauchyGreenTensor));
84
2/4
✓ Branch 1 taken 1578000 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1578000 times.
✗ Branch 6 not taken.
3156000 const UBlasMatrix d2I3dC = std::move(Invariants::SecondDerivativeInvariant3CauchyGreen(rCauchyGreenTensor));
85
86
6/12
✓ Branch 1 taken 1578000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1578000 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1578000 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1578000 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1578000 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1578000 times.
✗ Branch 17 not taken.
3156000 d2W_first_term = (dWdI1 * d2I1dC + dWdI2 * d2I2dC + dWdI3 * d2I3dC);
87
88
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1578000 times.
3156000 if (IsIncompressible) {
89 double dWcdI3 = pLaw->FirstDerivativeWcThirdInvariant(pressure);
90 d2W_first_term += dWcdI3 * d2I3dC;
91 }
92
93
94 {
95
2/4
✓ Branch 1 taken 1578000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1578000 times.
✗ Branch 5 not taken.
3156000 const UBlasVector transp_dI1dC = trans(dI1dC);
96
2/4
✓ Branch 1 taken 1578000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1578000 times.
✗ Branch 5 not taken.
3156000 const UBlasVector transp_dI2dC = trans(dI2dC);
97
2/4
✓ Branch 1 taken 1578000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1578000 times.
✗ Branch 5 not taken.
3156000 const UBlasVector transp_dI3dC = trans(dI3dC);
98
99
1/2
✓ Branch 2 taken 1578000 times.
✗ Branch 3 not taken.
3156000 const double d2WdI1dI1 = pLaw->SecondDerivativeWFirstInvariant();
100
1/2
✓ Branch 2 taken 1578000 times.
✗ Branch 3 not taken.
3156000 const double d2WdI2dI2 = pLaw->SecondDerivativeWSecondInvariant();
101
1/2
✓ Branch 2 taken 1578000 times.
✗ Branch 3 not taken.
3156000 const double d2WdI3dI3 = pLaw->SecondDerivativeWThirdInvariant();
102
103
1/2
✓ Branch 2 taken 1578000 times.
✗ Branch 3 not taken.
3156000 const double d2WdI1dI2 = pLaw->SecondDerivativeWFirstAndSecondInvariant();
104
1/2
✓ Branch 2 taken 1578000 times.
✗ Branch 3 not taken.
3156000 const double d2WdI1dI3 = pLaw->SecondDerivativeWFirstAndThirdInvariant();
105
1/2
✓ Branch 2 taken 1578000 times.
✗ Branch 3 not taken.
3156000 const double d2WdI2dI3 = pLaw->SecondDerivativeWSecondAndThirdInvariant();
106
107
27/54
✓ Branch 1 taken 1578000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1578000 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1578000 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1578000 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1578000 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1578000 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 1578000 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 1578000 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 1578000 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 1578000 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 1578000 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 1578000 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 1578000 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 1578000 times.
✗ Branch 41 not taken.
✓ Branch 43 taken 1578000 times.
✗ Branch 44 not taken.
✓ Branch 46 taken 1578000 times.
✗ Branch 47 not taken.
✓ Branch 49 taken 1578000 times.
✗ Branch 50 not taken.
✓ Branch 52 taken 1578000 times.
✗ Branch 53 not taken.
✓ Branch 55 taken 1578000 times.
✗ Branch 56 not taken.
✓ Branch 58 taken 1578000 times.
✗ Branch 59 not taken.
✓ Branch 61 taken 1578000 times.
✗ Branch 62 not taken.
✓ Branch 64 taken 1578000 times.
✗ Branch 65 not taken.
✓ Branch 67 taken 1578000 times.
✗ Branch 68 not taken.
✓ Branch 70 taken 1578000 times.
✗ Branch 71 not taken.
✓ Branch 73 taken 1578000 times.
✗ Branch 74 not taken.
✓ Branch 76 taken 1578000 times.
✗ Branch 77 not taken.
✓ Branch 79 taken 1578000 times.
✗ Branch 80 not taken.
3156000 d2W_second_term = d2WdI1dI1 * outer_prod(dI1dC, transp_dI1dC)
108 + d2WdI1dI2 * outer_prod(dI1dC, transp_dI2dC)
109 + d2WdI1dI3 * outer_prod(dI1dC, transp_dI3dC)
110 + d2WdI1dI2 * outer_prod(dI2dC, transp_dI1dC)
111 + d2WdI2dI2 * outer_prod(dI2dC, transp_dI2dC)
112 + d2WdI2dI3 * outer_prod(dI2dC, transp_dI3dC)
113 + d2WdI1dI3 * outer_prod(dI3dC, transp_dI1dC)
114 + d2WdI2dI3 * outer_prod(dI3dC, transp_dI2dC)
115 + d2WdI3dI3 * outer_prod(dI3dC, transp_dI3dC);
116
117
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1578000 times.
3156000 if (IsIncompressible) {
118 const double d2WcdI3dI3 = pLaw->SecondDerivativeWcThirdInvariant(pressure);
119 d2W_second_term += d2WcdI3dI3 * d2I3dC;
120 }
121
122 }
123
124
3/6
✓ Branch 1 taken 1578000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1578000 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1578000 times.
✗ Branch 8 not taken.
3156000 d2W = 4.0 * (d2W_first_term + d2W_second_term);
125 }
126
127 {
128
3/6
✓ Branch 1 taken 1578000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1578000 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1578000 times.
✗ Branch 8 not taken.
6312000 const UBlasMatrix buf = prod(trans(De), d2W);
129
2/4
✓ Branch 1 taken 1578000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1578000 times.
✗ Branch 5 not taken.
3156000 linearPart = prod(buf, De);
130 }
131
132
7/14
✓ Branch 1 taken 1578000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1578000 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1578000 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1578000 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1578000 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1578000 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 1578000 times.
✗ Branch 20 not taken.
3156000 dW = 2.0 * (dWdI1 * dI1dC + dWdI2 * dI2dC + dWdI3 * dI3dC);
133
134
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1578000 times.
3156000 if (IsIncompressible) {
135 const double dWcdI3 = pLaw->FirstDerivativeWcThirdInvariant(pressure);
136 dW += 2.0 * dWcdI3 * dI3dC;
137 }
138
139
3/6
✓ Branch 1 taken 1578000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1578000 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1578000 times.
✗ Branch 8 not taken.
3156000 rhsPart = prod(trans(dW), De);
140 }
141
142 /*!
143 * \brief Calculates linear and non-linear part of the matrix for a given quadrature point.
144 */
145 void calculateLinearAndNonLinearMatrixAndRhs(HyperElasticLaw::Pointer pLaw,
146 const CurrentFiniteElement& feDisplacement,
147 const std::vector<UBlasVector>& displacementPreviousIterationPerComponent,
148 const UBlasVector& pressure_vector,
149 unsigned int quadraturePointIndex,
150 UBlasMatrix& linearPart,
151 UBlasMatrix& nonLinearPart,
152 UBlasVector& rhsPart,
153 const bool IsIncompressible);
154
155 } // namespace HyperElasticity
156
157 } // namespace Private
158
159 } // namespace felisce
160
161 # endif // _FELISCE_PRIVATE_LINEAR_PROBLEM_HYPER_ELASTICITY_HPP
162