341 {
343
349
350 auto get_val_grad_at_pts = MatrixSizeHelper<
352 DL>::get(*
matVals, OP::nbIntegrationPts);
353 auto get_diff_K_at_pts =
356
357
358 const double vol = OP::getMeasure();
359
360 auto t_w = OP::getFTensor0IntegrationWeight();
361
362 auto t_row_grad = row_data.getFTensor2DiffN2<
SPACE_DIM>();
363
364 auto t_val_grad_at_pts =
365 get_val_grad_at_pts();
366
367 auto t_diff_K_at_pts = get_diff_K_at_pts();
368
369 auto t_coords = OP::getFTensor1CoordsAtGaussPts();
370
371 for (int gg = 0; gg != OP::nbIntegrationPts; gg++) {
372
373 const double alpha = t_w * vol;
374
375 int rr = 0;
376 for (; rr != OP::nbRows /
FIELD_DIM; rr++) {
377
378 auto t_mat = getFTensor2FromArray<FIELD_DIM, FIELD_DIM, FIELD_DIM>(
380 auto t_col_grad = col_data.getFTensor1DiffN<
SPACE_DIM>(gg, 0);
381 for (
int bb = 0; bb != OP::nbCols /
FIELD_DIM; ++bb) {
382 t_mat(
i,
j) += alpha * (t_row_grad(
J,
K) * t_val_grad_at_pts(
i,
J,
K)) *
383 (t_diff_K_at_pts(
j,
M) * t_col_grad(
M));
384
385 ++t_mat;
386 ++t_col_grad;
387
388 }
389
390 ++t_row_grad;
391
392 }
393 for (; rr < OP::nbRowBaseFunctions; ++rr)
394 ++t_row_grad;
395
396 ++t_coords;
397 ++t_val_grad_at_pts;
398 ++t_diff_K_at_pts;
399 ++t_w;
400 }
402}
#define FTENSOR_INDEX(DIM, I)
#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< 'i', SPACE_DIM > i
FTensor::Index< 'J', DIM1 > J
FTensor::Index< 'j', 3 > j
DataLayoutTraits< DataLayout::GaussByCoeffs > DL
decltype(GetFTensor3FromMatImpl< Tensor_Dim0, Tensor_Dim1, Tensor_Dim2, S, DL, M >::get(std::declval< M & >(), 0, 0)) GetFTensor3FromMatType
decltype(GetFTensor2FromMatImpl< Tensor_Dim0, Tensor_Dim1, S, DL, M >::get(std::declval< M & >(), 0, 0)) GetFTensor2FromMatType