143 {
145
146 auto t_w = getFTensor0IntegrationWeight();
148
149 auto t_x0 = getFTensor1CoordsAtGaussPts();
150 auto t_x = getFTensor1FromMat<3>(*
xPtr);
151 auto t_normal = getFTensor1NormalsAtGaussPts();
152
153 auto get_t_mat = [&](const int rr) {
155 &locMat(rr + 0, 0), &locMat(rr + 0, 1), &locMat(rr + 0, 2),
156
157 &locMat(rr + 1, 0), &locMat(rr + 1, 1), &locMat(rr + 1, 2),
158
159 &locMat(rr + 2, 0), &locMat(rr + 2, 1), &locMat(rr + 2, 2)};
160 };
161
162 const double ts_a = getTSa();
163
164 for (int gg = 0; gg != nbIntegrationPts; gg++) {
165
170 t_P(
i,
j) = t_n(
i) * t_n(
j);
172
173 auto t_J_lhs =
lhs_J_dx2(t_x(0), t_x(1), t_x(2));
174 double l = std::sqrt(t_normal(
i) * t_normal(
i));
175
176 const double alpha = t_w;
179 (alpha *
l) * (t_P(
i,
k) * t_J_lhs(
k,
j) + t_Q(
i,
j) * ts_a);
180
181 int rr = 0;
182 for (; rr != nbRows / 3; rr++) {
183
185 auto t_mat = get_t_mat(3 * rr);
186
187 for (int cc = 0; cc != nbCols / 3; cc++) {
188
189 const double rc = t_row_base * t_col_base;
190 t_mat(
i,
j) += rc * t_lhs(
i,
j);
191
192 ++t_col_base;
193 ++t_mat;
194 }
195 ++t_row_base;
196 }
197
198 for (; rr < nbRowBaseFunctions; ++rr)
199 ++t_row_base;
200
201 ++t_w;
202 ++t_x;
203 ++t_x0;
204 ++t_normal;
205 }
206
208 }
FTensor::Index< 'j', 3 > j
FTensor::Index< 'i', 3 > i
FTensor::Index< 'k', 3 > k
Tensor1< T, Tensor_Dim > normalize()
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
FTensor::Index< 'l', 3 > l
FTensor::Tensor0< FTensor::PackPtr< double *, 1 > > getFTensor0N(const FieldApproximationBase base)
Get base function as Tensor0.