1#ifndef MAT_AXISYMMETRIC_HPP
2#define MAT_AXISYMMETRIC_HPP
9 boost::shared_ptr<MatrixDouble> disp_ptr,
10 boost::shared_ptr<MatrixDouble> grad_ptr,
11 boost::shared_ptr<MatrixDouble> axisymmetric_grad_ptr)
25 auto t_axisymmetric_grad =
35 for (
int gg = 0; gg != nb_gauss_pts; ++gg) {
36 const double radius = t_coords(0);
39 "Axisymmetric integration point is on or below the axis");
40 t_axisymmetric_grad(
i,
J) = 0;
41 t_axisymmetric_grad(
j,
I) = t_grad(
j,
I);
42 t_axisymmetric_grad(N2, N2) = t_disp(N0) / radius;
45 ++t_axisymmetric_grad;
59 boost::make_shared<MatrixDouble>();
61 boost::make_shared<MatrixDouble>();
67 boost::shared_ptr<MatrixDouble> stress_ptr,
68 boost::shared_ptr<AxisymmetricAssemblyData> data_ptr)
79 auto t_in_plane_stress =
81 *
dataPtr->inPlaneStress, nb_gauss_pts)();
84 for (
int gg = 0; gg != nb_gauss_pts; ++gg) {
85 t_in_plane_stress(
i,
J) = t_stress(
i,
J);
94 boost::shared_ptr<AxisymmetricAssemblyData>
dataPtr;
100 boost::shared_ptr<MatrixDouble> tangent_ptr,
101 boost::shared_ptr<AxisymmetricAssemblyData> data_ptr)
112 auto t_in_plane_tangent =
114 *
dataPtr->inPlaneTangent, nb_gauss_pts)();
119 for (
int gg = 0; gg != nb_gauss_pts; ++gg) {
120 t_in_plane_tangent(
i,
J,
k,
L) = t_tangent(
i,
J,
k,
L);
122 ++t_in_plane_tangent;
129 boost::shared_ptr<AxisymmetricAssemblyData>
dataPtr;
132template <AssemblyType A,
typename DomainEleOp>
136template <AssemblyType A,
typename DomainEleOp>
141 boost::shared_ptr<MatrixDouble> full_stress_ptr)
154 auto t_w = OpBase::getFTensor0IntegrationWeight();
159 auto t_nf = OpBase::template getNf<2>();
160 const double alpha = 2 * M_PI * t_w * OpBase::getMeasure();
163 t_nf(N0) += alpha * t_row_base * t_full_stress(N2, N2);
176template <AssemblyType A,
typename DomainEleOp>
181 boost::shared_ptr<MatrixDouble> full_tangent_ptr)
194 auto t_w = OpBase::getFTensor0IntegrationWeight();
195 auto t_coords = OpBase::getFTensor1CoordsAtGaussPts();
211 const double radius = t_coords(0);
212 const double alpha = 2 * M_PI * t_w * OpBase::getMeasure();
215 auto t_m = OpBase::template getLocMat<2>(2 * rr);
219 t_m(
j, N0) += alpha * t_col_base * t_row_diff(
I) *
220 (t_D(
j,
I,
k,
L) * t_hoop(
k,
L));
221 t_m(N0,
l) += alpha * t_row_base * t_hoop(
i,
J) *
222 (t_D(
i,
J,
l,
I) * t_col_diff(
I));
223 t_m(N0, N0) += alpha * t_row_base * t_col_base / radius *
225 (t_D(
i,
J,
k,
L) * t_hoop(
k,
L));
#define FTENSOR_INDEX(DIM, I)
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
@ MOFEM_DATA_INCONSISTENCY
#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< 'l', 3 > l
FTensor::Index< 'j', 3 > j
FTensor::Index< 'k', 3 > k
PetscErrorCode MoFEMErrorCode
MoFEM/PETSc error code.
decltype(GetFTensor4FromMatImpl< Tensor_Dim0, Tensor_Dim1, Tensor_Dim2, Tensor_Dim3, S, DL, M >::get(std::declval< M & >(), 0, 0)) GetFTensor4FromMatType
decltype(GetFTensor1FromMatImpl< Tensor_Dim, S, DL, M >::get(std::declval< M & >(), 0, 0)) GetFTensor1FromMatType
decltype(GetFTensor2FromMatImpl< Tensor_Dim0, Tensor_Dim1, S, DL, M >::get(std::declval< M & >(), 0, 0)) GetFTensor2FromMatType
constexpr IntegrationType I
constexpr auto field_name
boost::shared_ptr< MatrixDouble > inPlaneStress
boost::shared_ptr< MatrixDouble > inPlaneTangent
OpAxisymmetricLhs(const std::string field_name, boost::shared_ptr< MatrixDouble > full_tangent_ptr)
OpAxisymmetricBase< A, DomainEleOp > OpBase
boost::shared_ptr< MatrixDouble > fullTangentPtr
MoFEMErrorCode iNtegrate(EntData &row_data, EntData &col_data) override
MoFEMErrorCode iNtegrate(EntData &row_data) override
OpAxisymmetricBase< A, DomainEleOp > OpBase
OpAxisymmetricRhs(const std::string field_name, boost::shared_ptr< MatrixDouble > full_stress_ptr)
boost::shared_ptr< MatrixDouble > fullStressPtr
boost::shared_ptr< MatrixDouble > dispPtr
boost::shared_ptr< MatrixDouble > gradPtr
MoFEMErrorCode doWork(int, EntityType, EntData &)
Operator for linear form, usually to calculate values on right hand side.
boost::shared_ptr< MatrixDouble > axisymmetricGradPtr
OpCalculateAxisymmetricGradient(boost::shared_ptr< MatrixDouble > disp_ptr, boost::shared_ptr< MatrixDouble > grad_ptr, boost::shared_ptr< MatrixDouble > axisymmetric_grad_ptr)
boost::shared_ptr< AxisymmetricAssemblyData > dataPtr
MoFEMErrorCode doWork(int, EntityType, EntData &)
Operator for linear form, usually to calculate values on right hand side.
OpCalculateAxisymmetricStress(boost::shared_ptr< MatrixDouble > stress_ptr, boost::shared_ptr< AxisymmetricAssemblyData > data_ptr)
boost::shared_ptr< MatrixDouble > stressPtr
MoFEMErrorCode doWork(int, EntityType, EntData &)
Operator for linear form, usually to calculate values on right hand side.
OpCalculateAxisymmetricTangent(boost::shared_ptr< MatrixDouble > tangent_ptr, boost::shared_ptr< AxisymmetricAssemblyData > data_ptr)
boost::shared_ptr< MatrixDouble > tangentPtr
boost::shared_ptr< AxisymmetricAssemblyData > dataPtr
Data on single entity (This is passed as argument to DataOperator::doWork)
FTensor::Tensor0< FTensor::PackPtr< double *, 1 > > getFTensor0N(const FieldApproximationBase base)
Get base function as Tensor0.
auto getFTensor1DiffN(const FieldApproximationBase base)
Get derivatives of base functions.
auto getFTensor1CoordsAtGaussPts()
Get coordinates at integration points assuming linear geometry.
@ OPSPACE
operator do Work is execute on space data
MatrixDouble & getGaussPts()
matrix of integration (Gauss) points for Volume Element
structure to get information from mofem into EntitiesFieldData
int nbRows
number of dofs on rows
int nbIntegrationPts
number of integration points
int nbCols
number if dof on column
int nbRowBaseFunctions
number or row base functions