BELFEM 0.9.0
Berkeley Lab Finite Element Framework
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
17namespace 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
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
#define BELFEM_ASSERT(aCheck,...)
Definition assert.hpp:244
size_t n_rows() const
Definition cl_AR_Matrix.hpp:205
size_t n_cols() const
Definition cl_AR_Matrix.hpp:213
T * data()
expose the underlying raw pointer
Definition cl_Tensor.hpp:211
bool is_3333() const
returns true if this is a 3x3x3x3 tensor
Definition cl_Tensor.hpp:319
USER GUIDES:
Definition cl_Capacitor.cpp:16
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