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 |