829 {
831
832 using DL = DataLayoutTraits<DataLayout::GaussByCoeffs>;
833 auto get_adjoint_lambda_at_pts =
836
841
842 OP::locF.resize(row_data.getIndices().size(), false);
843 OP::locF.clear();
844
847 &
m(0, 0), &
m(0, 1), &
m(0, 2));
848 };
849
850 double d_loc_J = 0;
851
852 double triangle_scale = 1.0;
853 if (OP::getFEType() == MBTRI)
854 triangle_scale = 0.5;
855
857 auto sense = bd.getSense();
858
859
860
861
862
864 auto t_w = this->getFTensor0IntegrationWeight();
867 auto t_flux = getFTensor2FromMat<3, 3>(bd.getFlux());
868 auto t_adjoint_lambda_at_pts = get_adjoint_lambda_at_pts();
872 d_loc_J +=
873 (sense * triangle_scale * t_w) *
874 (t_adjoint_lambda_at_pts(
i) * (t_flux(
i,
J) * t_tmp_normal(
J)));
875 ++t_w;
876 ++t_t1;
877 ++t_t2;
878 ++t_flux;
879 ++t_adjoint_lambda_at_pts;
880 }
881 }
882 }
883
884
885
890 }
891
893}
#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
FTensor::Index< 'k', 3 > k
constexpr std::enable_if<(Dim0<=2 &&Dim1<=2), Tensor2_Expr< Levi_Civita< T >, T, Dim0, Dim1, i, j > >::type levi_civita(const Index< i, Dim0 > &, const Index< j, Dim1 > &)
levi_civita functions to make for easy adhoc use
DataLayoutTraits< DataLayout::GaussByCoeffs > DL
UBlasMatrix< double > MatrixDouble
decltype(GetFTensor1FromMatImpl< Tensor_Dim, S, DL, M >::get(std::declval< M & >(), 0, 0)) GetFTensor1FromMatType
FTensor::Index< 'm', 3 > m
int nbIntegrationPts
number of integration points
boost::shared_ptr< MatrixDouble > tangent2DiffPtr
boost::shared_ptr< MatrixDouble > tangent1DiffPtr