BELFEM
0.9.0
Berkeley Lab Finite Element Framework
Toggle main menu visibility
Loading...
Searching...
No Matches
fn_fiber_polarization.hpp
Go to the documentation of this file.
1
/*
2
* BELFEM -- The Berkeley Lab Finite Element Framework
3
* Copyright (c) 2026, The Regents of the University of California,
4
* through Lawrence Berkeley National Laboratory (subject to receipt of any required
5
* approvals from the U.S. Dept. of Energy). All rights reserved.
6
*
7
* Developers: Christian Messe, Gregory Giard
8
*
9
* See the top-level LICENSE file for the complete license and disclaimer.
10
*/
11
12
#ifndef BELFEM_FN_ESHELBY_FIBER_HPP
13
#define BELFEM_FN_ESHELBY_FIBER_HPP
14
#include "assert.h"
15
#include "
cl_Tensor.hpp
"
16
17
namespace
belfem
18
{
24
template
<
typename
T >
25
inline
void
26
fiber_polarization
(
const
Matrix <T> & aC,
27
Tensor <T> & aP )
28
{
29
BELFEM_ASSERT
( aC.
n_cols
() == 6 && aC.
n_rows
() == 6,
30
"elasticity matrix must be 6x6"
);
31
32
BELFEM_ASSERT
( aP.
is_3333
(),
33
"polarization tensor must be 3x3x3x3"
);
34
35
// get data containers
36
37
T * P = aP.
data
();
38
39
const
T & C11 = aC( 2,2 );
40
const
T & C12 = aC( 1,2 );
41
const
T & C22 = aC( 1,1 );
42
//const T & C33 = aC( 0,0 );
43
44
const
T & C44 = aC( 5,5 );
45
const
T & C55 = aC( 4,4 );
46
const
T & C66 = aC( 3,3 );
47
48
T g = std::sqrt( ( C11 * C22 - C12 * C12
49
+ 2. * C66 * ( std::sqrt( C11 * C22 ) - C12 ) ) / ( C22 * C66 ) );
50
51
T b = std::sqrt( C55 / C44 );
52
T h = std::sqrt( C11 / C22 ) ;
53
T s = g * g - h - h ;
54
55
T n0 = 2. * ( h + b * ( h + g ) ) + ( g + b ) + b * b * ( g + 1.) + s * ( b + 1.) + h * g ;
56
T n2 = g + b + 1. ;
57
T n4 = b * h + h + b * g ;
58
T n6 = 2. * h * b * (1. + g + b ) + ( b * s + b * b * g + h * g ) + b * b * ( s + h * g ) + h * h * ( b + 1. );
59
60
T d1 = g * ( h + b * g + b * b ) * ( 1. + g + h ) * ( b + 1. );
61
T d2 = h * b ;
62
T r = 1.0 / ( d1 * C22 * C44 * C66 );
63
64
T P33 = r * ( C55 * C66 * n0 / d2 + ( C22 * C55 + C44 * C66 ) * n2 + C22 * C44 * n4 );
65
T P12 = 0.0 ;
66
T P13 = 0.0 ;
67
68
T P22 = r * ( C11 * C55 * n2 + ( C55 * C66 + C11 * C44 ) * n4 + C44 * C66 * n6 / d2 ) ;
69
T P23 = - r * ( C55 * ( C12 + C66 ) * n2 + C44 * ( C12 + C66 ) * n4 ) ;
70
T P11 = 0.0 ;
71
72
T P44 = r * ( C11 * C55 * n0 / d2 + ( C11 * C44 - 2.0 * C12 * C55 ) * n2
73
+ ( C22 * C55 - 2. * C12 * C44 ) * n4 + C22 * C44 * n6 );
74
75
T P55 = r * ( C11 * C66 * n0 / d2
76
+ ( C11 * C22 + C66 * C66 - ( C12 + C66 ) * ( C12 + C66 ) ) * n2 + C22 * C66 * n4 );
77
78
T P66 = r * ( C11 * C66 * n2 + ( C11 * C22 + C66 * C66 - ( C12 + C66 ) * ( C12 + C66 ) ) * n4
79
+ C22 * C66 * n6 );
80
81
// populate tensor
82
P[ 0 ] = P11;
// 1111
83
P[ 1 ] = 0.0;
// 2111
84
P[ 2 ] = 0.0;
// 3111
85
86
P[ 3 ] = 0.0;
// 1211
87
P[ 4 ] = P12;
// 2211
88
P[ 5 ] = 0.0;
// 3211
89
90
P[ 6 ] = 0.0;
// 1311
91
P[ 7 ] = 0.0;
// 2311
92
P[ 8 ] = P13;
// 3311
93
94
P[ 9 ] = 0.0;
// 1121
95
P[ 10 ] = P66;
// 2121
96
P[ 11 ] = 0.0;
// 3121
97
98
P[ 12 ] = P66;
// 1221
99
P[ 13 ] = 0.0;
// 2221
100
P[ 14 ] = 0.0;
// 3221
101
102
P[ 15 ] = 0.0;
// 1321
103
P[ 16 ] = 0.0;
// 2321
104
P[ 17 ] = 0.0;
// 3321
105
106
P[ 18 ] = 0.0;
// 1131
107
P[ 19 ] = 0.0;
// 2131
108
P[ 20 ] = P55;
// 3131
109
110
P[ 21 ] = 0.0;
// 1231
111
P[ 22 ] = 0.0;
// 2231
112
P[ 23 ] = 0.0;
// 3231
113
114
P[ 24 ] = P55;
// 1331
115
P[ 25 ] = 0.0;
// 2331
116
P[ 26 ] = 0.0;
// 3331
117
118
P[ 27 ] = 0.0;
// 1112
119
P[ 28 ] = P66;
// 2112
120
P[ 29 ] = 0.0;
// 3112
121
122
P[ 30 ] = P66;
// 1212
123
P[ 31 ] = 0.0;
// 2212
124
P[ 32 ] = 0.0;
// 3212
125
126
P[ 33 ] = 0.0;
// 1312
127
P[ 34 ] = 0.0;
// 2312
128
P[ 35 ] = 0.0;
// 3312
129
130
P[ 36 ] = P12;
// 1122
131
P[ 37 ] = 0.0;
// 2122
132
P[ 38 ] = 0.0;
// 3122
133
134
P[ 39 ] = 0.0;
// 1222
135
P[ 40 ] = P22;
// 2222
136
P[ 41 ] = 0.0;
// 3222
137
138
P[ 42 ] = 0.0;
// 1322
139
P[ 43 ] = 0.0;
// 2322
140
P[ 44 ] = P23;
// 3322
141
142
P[ 45 ] = 0.0;
// 1132
143
P[ 46 ] = 0.0;
// 2132
144
P[ 47 ] = 0.0;
// 3132
145
146
P[ 48 ] = 0.0;
// 1232
147
P[ 49 ] = 0.0;
// 2232
148
P[ 50 ] = P44;
// 3232
149
150
P[ 51 ] = 0.0;
// 1332
151
P[ 52 ] = P44;
// 2332
152
P[ 53 ] = 0.0;
// 3332
153
154
P[ 54 ] = 0.0;
// 1113
155
P[ 55 ] = 0.0;
// 2113
156
P[ 56 ] = P55;
// 3113
157
158
P[ 57 ] = 0.0;
// 1213
159
P[ 58 ] = 0.0;
// 2213
160
P[ 59 ] = 0.0;
// 3213
161
162
P[ 60 ] = P55;
// 1313
163
P[ 61 ] = 0.0;
// 2313
164
P[ 62 ] = 0.0;
// 3313
165
166
P[ 63 ] = 0.0;
// 1123
167
P[ 64 ] = 0.0;
// 2123
168
P[ 65 ] = 0.0;
// 3123
169
170
P[ 66 ] = 0.0;
// 1223
171
P[ 67 ] = 0.0;
// 2223
172
P[ 68 ] = P44;
// 3223
173
174
P[ 69 ] = 0.0;
// 1323
175
P[ 70 ] = P44;
// 2323
176
P[ 71 ] = 0.0;
// 3323
177
178
P[ 72 ] = P13;
// 1133
179
P[ 73 ] = 0.0;
// 2133
180
P[ 74 ] = 0.0;
// 3133
181
182
P[ 75 ] = 0.0;
// 1233
183
P[ 76 ] = P23;
// 2233
184
P[ 77 ] = 0.0;
// 3233
185
186
P[ 78 ] = 0.0;
// 1333
187
P[ 79 ] = 0.0;
// 2333
188
P[ 80 ] = P33;
// 3333
189
}
190
}
191
#endif
//BELFEM_FN_ESHELBY_FIBER_HPP
BELFEM_ASSERT
#define BELFEM_ASSERT(aCheck,...)
Definition
assert.hpp:244
cl_Tensor.hpp
belfem::Matrix::n_rows
size_t n_rows() const
Definition
cl_AR_Matrix.hpp:205
belfem::Matrix::n_cols
size_t n_cols() const
Definition
cl_AR_Matrix.hpp:213
belfem::Tensor::data
T * data()
expose the underlying raw pointer
Definition
cl_Tensor.hpp:211
belfem::Tensor::is_3333
bool is_3333() const
returns true if this is a 3x3x3x3 tensor
Definition
cl_Tensor.hpp:319
belfem
USER GUIDES:
Definition
cl_Capacitor.cpp:16
belfem::fiber_polarization
void fiber_polarization(const Matrix< T > &aC, Tensor< T > &aP)
create the Hill polarization tensor P for a unidirectional fiber (transversely isotropic host); the E...
Definition
fn_fiber_polarization.hpp:26
src
math
tensor
fn_fiber_polarization.hpp
Generated by
1.18.0