18#ifndef __CRACK_FRONT_ELEMENT_HPP__
19#define __CRACK_FRONT_ELEMENT_HPP__
25template <
typename E,
typename B>
class TwoType {};
34template <
typename ELEMENT,
typename BASE_ELEMENT>
54 const bool &set_singular_coordinates,
55 const Range &crack_front_nodes,
56 const Range &crack_front_nodes_edges,
57 const Range &crack_front_elements,
58 PetscBool add_singularity)
65 CHKERRABORT(PETSC_COMM_WORLD,
ierr);
77 if (this->numeredEntFiniteElementPtr->getEntType() != MBTET)
79 "Element type not implemented");
81 this->getElementPolynomialBase() =
82 boost::shared_ptr<BaseFunction>(
new TetPolynomialBase());
84 CHKERR this->createDataOnElement(MBTET);
85 CHKERR this->calculateVolumeAndJacobian();
87 CHKERR this->setIntegrationPts();
88 CHKERR this->calculateCoordinatesAtGaussPts();
89 CHKERR this->calHierarchicalBaseFunctionsOnElement();
91 CHKERR this->transformBaseFunctions();
94 CHKERR this->loopOverOperators();
107 template <
typename E,
typename B>
109 return E::getSpaceBaseAndOrderOnElement();
113 template <
typename E>
117 CHKERR E::getSpaceBaseAndOrderOnElement();
121 EntityHandle ent = this->numeredEntFiniteElementPtr->getEnt();
124 for (
int nn = 0; nn != 4; nn++) {
131 for (
int ee = 0; ee != 6; ee++) {
133 CHKERR this->mField.get_moab().side_element(ent, 1, ee, edge);
152 template <
typename E>
168 const int edge_nodes[6][2] = {{0, 1}, {1, 2}, {2, 0},
169 {0, 3}, {1, 3}, {2, 3}};
175 this->coordsAtGaussPts.size2());
178 this->coordsAtGaussPts.size2());
181 const size_t nb_gauss_pts = this->gaussPts.size2();
182 sJac.resize(nb_gauss_pts, 9,
false);
183 double *s_jac_ptr = &
sJac(0, 0);
187 s_jac_ptr, &s_jac_ptr[1], &s_jac_ptr[2], &s_jac_ptr[3],
188 &s_jac_ptr[4], &s_jac_ptr[5], &s_jac_ptr[6], &s_jac_ptr[7],
190 for (
unsigned int gg = 0; gg != nb_gauss_pts; ++gg) {
200 double diff_base_n[12];
203 diff_base_n, &diff_base_n[1], &diff_base_n[2]);
206 diff_n, &diff_n[1], &diff_n[2]);
207 for (
int nn = 0; nn != 4; nn++) {
208 t_diff_n(
i) = this->tInvJac(
j,
i) * t_diff_base_n(
j);
212 MatrixDouble &shape_n =
213 this->dataH1.dataOnEntities[MBVERTEX][0].getN(
NOBASE);
215 const double base_coords[] = {0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1};
218 for (
int ee = 0; ee != 6; ee++) {
222 const int i0 = edge_nodes[ee][0];
223 const int i1 = edge_nodes[ee][1];
227 PetscPrintf(PETSC_COMM_SELF,
"Warning singular edge on both ends\n");
252 base_coords[3 * i1 + 0] - base_coords[3 * i0 + 0],
253 base_coords[3 * i1 + 1] - base_coords[3 * i0 + 1],
254 base_coords[3 * i1 + 2] - base_coords[3 * i0 + 2]);
261 t_dir(
i) = this->tJac(
i,
j) * t_base_dir(
j);
263 s_jac_ptr, &s_jac_ptr[1], &s_jac_ptr[2], &s_jac_ptr[3],
264 &s_jac_ptr[4], &s_jac_ptr[5], &s_jac_ptr[6], &s_jac_ptr[7],
274 for (
size_t gg = 0; gg != nb_gauss_pts; gg++) {
275 double t_n = shape_n(gg, i0) * shape_n(gg, i1);
277 shape_n(gg, i0) * diff_n[3 * i1 + 0] +
278 shape_n(gg, i1) * diff_n[3 * i0 + 0],
279 shape_n(gg, i0) * diff_n[3 * i1 + 1] +
280 shape_n(gg, i1) * diff_n[3 * i0 + 1],
281 shape_n(gg, i0) * diff_n[3 * i1 + 2] +
282 shape_n(gg, i1) * diff_n[3 * i0 + 2]);
283 t_s_jac(
i,
j) += t_dir(
i) * t_diff_n(
j);
284 t_singular_displacement(
i) += t_dir(
i) * t_n;
285 t_singular_ref_displacement(
i) += t_base_dir(
i) * t_n;
286 ++t_singular_displacement;
287 ++t_singular_ref_displacement;
295 s_jac_ptr, &s_jac_ptr[1], &s_jac_ptr[2], &s_jac_ptr[3],
296 &s_jac_ptr[4], &s_jac_ptr[5], &s_jac_ptr[6], &s_jac_ptr[7],
299 invSJac.resize(nb_gauss_pts, 9,
false);
300 double *inv_s_jac_ptr = &
invSJac(0, 0);
302 inv_s_jac_ptr, &inv_s_jac_ptr[1], &inv_s_jac_ptr[2],
303 &inv_s_jac_ptr[3], &inv_s_jac_ptr[4], &inv_s_jac_ptr[5],
304 &inv_s_jac_ptr[6], &inv_s_jac_ptr[7], &inv_s_jac_ptr[8], 9);
307 detS.resize(nb_gauss_pts,
false);
308 for (
size_t gg = 0; gg != nb_gauss_pts; gg++) {
310 CHKERR determinantTensor3by3(t_s_jac, det);
311 CHKERR invertTensor3by3(t_s_jac, det, t_inv_s_jac);
332 return E::getRule(
order);
347 template <
typename E,
typename B>
349 return E::setGaussPts(
order);
359template <
typename ELEMENT,
typename BASE_ELEMENT>
363 ierr = PetscOptionsBegin(PETSC_COMM_WORLD,
"",
"Get singular element options",
366 refinementLevels = 3;
367 ierr = PetscOptionsInt(
"-se_number_of_refinement_levels",
368 "approximation geometry order",
"", refinementLevels,
369 &refinementLevels, PETSC_NULL);
371 refineIntegration = PETSC_TRUE;
373 PetscOptionsBool(
"-se_refined_integration",
374 "if set element is subdivided to generate quadrature",
375 "", refineIntegration, &refineIntegration, PETSC_NULL);
377 ierr = PetscOptionsEnd();
386 VolumeElementForcesAndSourcesCore>::
388 VolumeElementForcesAndSourcesCore>,
395 VolumeElementForcesAndSourcesCore>::
397 VolumeElementForcesAndSourcesCore>,
401 VolumeElementForcesAndSourcesCore>
405 :
public FaceElementForcesAndSourcesCore::UserDataOperator {
409 boost::ptr_vector<NeumannForcesSurface::MethodForAnalyticalForce>
413 VolumeElementForcesAndSourcesCore>
422 const Range &crack_front_nodes,
const Range &crack_front_nodes_edges,
423 const Range &crack_front_elements, PetscBool add_singularity,
425 boost::ptr_vector<MethodForForceScaling> &methods_op,
426 boost::ptr_vector<NeumannForcesSurface::MethodForAnalyticalForce>
427 &analytical_force_op);
432 DataForcesAndSourcesCore::EntData &data);
436 using VolumeElementForcesAndSourcesCoreOnSide::
437 VolumeElementForcesAndSourcesCoreOnSide;
439 VolumeElementForcesAndSourcesCoreOnSide::UserDataOperator;
440 using VolumeElementForcesAndSourcesCoreOnSide::
441 calHierarchicalBaseFunctionsOnElement;
445 :
public FaceElementForcesAndSourcesCore::UserDataOperator {
449 boost::ptr_vector<NeumannForcesSurface::MethodForAnalyticalForce>
454 boost::shared_ptr<MatrixDouble>
hG;
455 boost::shared_ptr<MatrixDouble>
HG;
464 const Range &crack_front_nodes,
const Range &crack_front_nodes_edges,
465 const Range &crack_front_elements, PetscBool add_singularity,
467 boost::ptr_vector<MethodForForceScaling> &methods_op,
468 boost::ptr_vector<NeumannForcesSurface::MethodForAnalyticalForce>
469 &analytical_force_op,
470 Range *forces_only_on_entities_row = NULL);
475 DataForcesAndSourcesCore::EntData &data);
485 const std::string
field_name, boost::shared_ptr<MatrixDouble> data_at_pts,
486 bool &singular_element, MatrixDouble &inv_s_jac)
491 DataForcesAndSourcesCore::EntData &data);
502 std::vector<VectorDouble> &values_at_gauss_pts,
503 std::vector<MatrixDouble> &gradient_at_gauss_pts,
bool &singular_element,
504 MatrixDouble &inv_s_jac)
506 field_name, values_at_gauss_pts, gradient_at_gauss_pts),
509 DataForcesAndSourcesCore::EntData &data);
517 MatrixDouble &inv_s_jac)
521 singular_element, inv_s_jac) {}
530 boost::shared_ptr<MatrixDouble>
H;
532 MatrixDouble &singular_ref_coords,
533 moab::Interface &post_proc_mesh,
534 std::vector<EntityHandle> &map_gauss_pts,
535 boost::shared_ptr<MatrixDouble> &
H)
541 DataForcesAndSourcesCore::EntData &data);
552 bool &singular_element, VectorDouble &det_s, MatrixDouble &inv_s_jac,
554 bool apply_det =
true)
560 DataForcesAndSourcesCore::EntData &data);
589 HookeElement::DataAtIntegrationPts &common_data,
590 boost::shared_ptr<VectorDouble> rho_at_gauss_pts,
591 boost::shared_ptr<MatrixDouble> rho_grad_at_gauss_pts,
592 Range tets_in_block,
const double rho_0,
const double bone_n,
593 Range *forces_only_on_entities_row = NULL);
596 DataForcesAndSourcesCore::EntData &row_data);
626 HookeElement::DataAtIntegrationPts &common_data,
627 boost::shared_ptr<VectorDouble> rho_at_gauss_pts,
628 boost::shared_ptr<MatrixDouble> diff_rho_at_gauss_pts,
629 boost::shared_ptr<MatrixDouble> diff_diff_rho_at_gauss_pts,
630 MatrixDouble &singular_displ,
Range tets_in_block,
const double rho_0,
631 const double bone_n,
Range *forces_only_on_entities_row = NULL);
634 DataForcesAndSourcesCore::EntData &row_data,
635 DataForcesAndSourcesCore::EntData &col_data);
652 HookeElement::DataAtIntegrationPts &common_data,
653 boost::shared_ptr<VectorDouble> rho_at_gauss_pts,
654 boost::shared_ptr<MatrixDouble> diff_rho_at_gauss_pts,
655 boost::shared_ptr<MatrixDouble> diff_diff_rho_at_gauss_pts,
656 MatrixDouble &singular_displ,
Range tets_in_block,
const double rho_0,
657 const double bone_n,
Range *forces_only_on_entities_row = NULL);
660 DataForcesAndSourcesCore::EntData &row_data,
661 DataForcesAndSourcesCore::EntData &col_data);
665 :
public VolumeElementForcesAndSourcesCore::UserDataOperator {
679 boost::shared_ptr<HookeElement::DataAtIntegrationPts>
dataAtPts;
690 const std::string row_field,
const std::string col_field,
691 boost::shared_ptr<HookeElement::DataAtIntegrationPts> &data_at_pts,
692 boost::shared_ptr<VectorDouble> rho_at_gauss_pts,
693 boost::shared_ptr<MatrixDouble> rho_grad_at_gauss_pts,
const double rho_n,
695 boost::shared_ptr<MatrixDouble> singular_displacement);
700 DataForcesAndSourcesCore::EntData &row_data,
701 DataForcesAndSourcesCore::EntData &col_data);
703 MoFEMErrorCode
iNtegrate(DataForcesAndSourcesCore::EntData &row_data,
704 DataForcesAndSourcesCore::EntData &col_data);
706 MoFEMErrorCode
aSsemble(DataForcesAndSourcesCore::EntData &row_data,
707 DataForcesAndSourcesCore::EntData &col_data);
711 :
public VolumeElementForcesAndSourcesCore::UserDataOperator {
725 boost::shared_ptr<HookeElement::DataAtIntegrationPts>
dataAtPts;
736 const std::string row_field,
const std::string col_field,
737 boost::shared_ptr<HookeElement::DataAtIntegrationPts> &data_at_pts,
738 boost::shared_ptr<VectorDouble> rho_at_gauss_pts,
739 boost::shared_ptr<MatrixDouble> rho_grad_at_gauss_pts,
const double rho_n,
741 boost::shared_ptr<MatrixDouble> singular_displacement);
746 DataForcesAndSourcesCore::EntData &row_data,
747 DataForcesAndSourcesCore::EntData &col_data);
749 MoFEMErrorCode
iNtegrate(DataForcesAndSourcesCore::EntData &row_data,
750 DataForcesAndSourcesCore::EntData &col_data);
752 MoFEMErrorCode
aSsemble(DataForcesAndSourcesCore::EntData &row_data,
753 DataForcesAndSourcesCore::EntData &col_data);
770 const std::string row_field,
771 boost::shared_ptr<MatrixDouble> mat_coords_ptr,
772 boost::shared_ptr<VectorDouble> density_at_pts,
773 boost::shared_ptr<MatrixDouble> rho_grad_at_gauss_pts_ptr,
774 boost::shared_ptr<MatrixDouble> rho_grad_grad_at_gauss_pts_ptr,
775 boost::shared_ptr<CrackFrontElement> fe_singular_ptr,
776 MatrixDouble &singular_disp,
777 boost::shared_ptr<MatrixDouble> mat_grad_pos_at_pts_ptr)
786 HookeElement::EntData &row_data);
803 vector<EntityHandle> &map_gauss_pts,
Range &range_to_tag,
804 const string &tag_name,
int tag_value = 1)
811 DataForcesAndSourcesCore::EntData &row_data);
ForcesAndSourcesCore::UserDataOperator UserDataOperator
static PetscErrorCode ierr
FieldApproximationBase
approximation base
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#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()
#define CHKERR
Inline error check.
#define MoFEMFunctionBeginHot
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
FTensor::Index< 'i', SPACE_DIM > i
FTensor::Index< 'j', 3 > j
FTensor::Index< 'k', 3 > k
CrackFrontSingularBase< NonlinearElasticElement::MyVolumeFE, VolumeElementForcesAndSourcesCore > CrackFrontElement
implementation of Data Operators for Forces and Sources
constexpr auto field_name
virtual ~CrackFrontSingularBase()=default
MoFEMErrorCode operator()()
MoFEMErrorCode getSpaceBaseAndOrderOnElementImpl(TwoType< E, VolumeElementForcesAndSourcesCore >)
Partial specialization for volume elements.
MoFEMErrorCode getSpaceBaseAndOrderOnElement()
MoFEMErrorCode calculateHOJacobian()
MoFEMErrorCode setGaussPts(int order)
Generate specific user integration quadrature.
int setGaussPtsImpl(TwoType< E, B >, int order)
MoFEMErrorCode getSpaceBaseAndOrderOnElementImpl(TwoType< E, B >)
MatrixDouble refGaussCoords
PetscBool refineIntegration
Range crackFrontNodesEdges
MatrixDouble singularRefCoords
MoFEMErrorCode calculateHOJacobianImpl(TwoType< E, VolumeElementForcesAndSourcesCore >)
Partial specialization for volume element.
const bool & setSingularCoordinatesPriv
MatrixDouble singularDisp
bool setSingularCoordinates
int getRuleImpl(TwoType< E, B >, int order)
CrackFrontSingularBase(MoFEM::Interface &m_field, const bool &set_singular_coordinates, const Range &crack_front_nodes, const Range &crack_front_nodes_edges, const Range &crack_front_elements, PetscBool add_singularity)
CrackFrontSingularBase(MoFEM::Interface &m_field)
MoFEMErrorCode getElementOptions()
VolumeElementForcesAndSourcesCoreOnSide::UserDataOperator UserDataOperator
bool isDiag
true if this block is on diagonal
boost::shared_ptr< MatrixDouble > singularDisplacement
int nbCols
number if dof on column
boost::shared_ptr< MatrixDouble > rhoGradAtGaussPtsPtr
boost::shared_ptr< VectorDouble > rhoAtGaussPtsPtr
int nbIntegrationPts
number of integration points
MoFEMErrorCode iNtegrate(DataForcesAndSourcesCore::EntData &row_data, DataForcesAndSourcesCore::EntData &col_data)
int nbRows
number of dofs on rows
boost::shared_ptr< HookeElement::DataAtIntegrationPts > dataAtPts
MoFEMErrorCode aSsemble(DataForcesAndSourcesCore::EntData &row_data, DataForcesAndSourcesCore::EntData &col_data)
MoFEMErrorCode doWork(int row_side, int col_side, EntityType row_type, EntityType col_type, DataForcesAndSourcesCore::EntData &row_data, DataForcesAndSourcesCore::EntData &col_data)
MoFEMErrorCode iNtegrate(DataForcesAndSourcesCore::EntData &row_data, DataForcesAndSourcesCore::EntData &col_data)
int nbCols
number if dof on column
boost::shared_ptr< HookeElement::DataAtIntegrationPts > dataAtPts
boost::shared_ptr< VectorDouble > rhoAtGaussPtsPtr
boost::shared_ptr< MatrixDouble > rhoGradAtGaussPtsPtr
int nbRows
number of dofs on rows
boost::shared_ptr< MatrixDouble > singularDisplacement
MoFEMErrorCode doWork(int row_side, int col_side, EntityType row_type, EntityType col_type, DataForcesAndSourcesCore::EntData &row_data, DataForcesAndSourcesCore::EntData &col_data)
int nbIntegrationPts
number of integration points
MoFEMErrorCode aSsemble(DataForcesAndSourcesCore::EntData &row_data, DataForcesAndSourcesCore::EntData &col_data)
bool isDiag
true if this block is on diagonal
boost::shared_ptr< MatrixDouble > hG
spatial deformation gradient
boost::ptr_vector< NeumannForcesSurface::MethodForAnalyticalForce > & analyticalForceOp
boost::ptr_vector< MethodForForceScaling > & methodsOp
Range forcesOnlyOnEntitiesRow
VectorDouble sNrm
Length of the normal vector.
boost::shared_ptr< MatrixDouble > HG
spatial deformation gradient
MoFEMErrorCode doWork(int side, EntityType type, DataForcesAndSourcesCore::EntData &data)
CrackFrontSingularBase< FirendVolumeOnSide, VolumeElementForcesAndSourcesCore > volSideFe
bool setSingularCoordinates
boost::ptr_vector< MethodForForceScaling > & methodsOp
bool setSingularCoordinates
CrackFrontSingularBase< VolumeElementForcesAndSourcesCoreOnSide, VolumeElementForcesAndSourcesCore > volSideFe
VectorDouble sNrm
Length of the normal vector.
boost::ptr_vector< NeumannForcesSurface::MethodForAnalyticalForce > & analyticalForceOp
MoFEMErrorCode doWork(int side, EntityType type, DataForcesAndSourcesCore::EntData &data)
OpGetCrackFrontCommonDataAtGaussPts(const std::string field_name, NonlinearElasticElement::CommonData &common_data, bool &singular_element, MatrixDouble &inv_s_jac)
MoFEMErrorCode doWork(int side, EntityType type, DataForcesAndSourcesCore::EntData &data)
OpGetCrackFrontDataAtGaussPts(const std::string field_name, std::vector< VectorDouble > &values_at_gauss_pts, std::vector< MatrixDouble > &gradient_at_gauss_pts, bool &singular_element, MatrixDouble &inv_s_jac)
MoFEMErrorCode doWork(int side, EntityType type, DataForcesAndSourcesCore::EntData &data)
OpGetCrackFrontDataGradientAtGaussPts(const std::string field_name, boost::shared_ptr< MatrixDouble > data_at_pts, bool &singular_element, MatrixDouble &inv_s_jac)
Op to generate artificial density field.
MoFEMErrorCode doWork(int row_side, EntityType row_type, HookeElement::EntData &row_data)
boost::shared_ptr< MatrixDouble > matGradPosAtPtsPtr
boost::shared_ptr< CrackFrontElement > feSingularPtr
boost::shared_ptr< VectorDouble > rhoAtGaussPtsPtr
boost::shared_ptr< MatrixDouble > rhoGradAtGaussPtsPtr
boost::shared_ptr< MatrixDouble > matCoordsPtr
boost::shared_ptr< MatrixDouble > rhoGradGradAtGaussPtsPtr
MatrixDouble & singularDisp
OpGetDensityFieldForTesting(const std::string row_field, boost::shared_ptr< MatrixDouble > mat_coords_ptr, boost::shared_ptr< VectorDouble > density_at_pts, boost::shared_ptr< MatrixDouble > rho_grad_at_gauss_pts_ptr, boost::shared_ptr< MatrixDouble > rho_grad_grad_at_gauss_pts_ptr, boost::shared_ptr< CrackFrontElement > fe_singular_ptr, MatrixDouble &singular_disp, boost::shared_ptr< MatrixDouble > mat_grad_pos_at_pts_ptr)
Calculate explicit derivative of energy.
HookeElement::DataAtIntegrationPts & commonData
Range forcesOnlyOnEntitiesRow
boost::shared_ptr< MatrixDouble > diffDiffRhoAtGaussPts
boost::shared_ptr< VectorDouble > rhoAtGaussPts
MatrixDouble & singularDispl
boost::shared_ptr< MatrixDouble > diffRhoAtGaussPts
MoFEMErrorCode doWork(int row_side, int col_side, EntityType row_type, EntityType col_type, DataForcesAndSourcesCore::EntData &row_data, DataForcesAndSourcesCore::EntData &col_data)
ublas::vector< int > iNdices
MoFEMErrorCode doWork(int row_side, int col_side, EntityType row_type, EntityType col_type, DataForcesAndSourcesCore::EntData &row_data, DataForcesAndSourcesCore::EntData &col_data)
boost::shared_ptr< VectorDouble > rhoAtGaussPts
boost::shared_ptr< MatrixDouble > diffDiffRhoAtGaussPts
boost::shared_ptr< MatrixDouble > diffRhoAtGaussPts
MatrixDouble & singularDispl
Range forcesOnlyOnEntitiesRow
HookeElement::DataAtIntegrationPts & commonData
ublas::vector< int > iNdices
OpPostProcDisplacements(bool &singular_element, MatrixDouble &singular_ref_coords, moab::Interface &post_proc_mesh, std::vector< EntityHandle > &map_gauss_pts, boost::shared_ptr< MatrixDouble > &H)
moab::Interface & postProcMesh
MatrixDouble & singularDisp
MoFEMErrorCode doWork(int side, EntityType type, DataForcesAndSourcesCore::EntData &data)
std::vector< EntityHandle > & mapGaussPts
boost::shared_ptr< MatrixDouble > H
Calculate explicit derivative of energy.
ublas::vector< int > iNdices
boost::shared_ptr< MatrixDouble > rhoGradAtGaussPts
HookeElement::DataAtIntegrationPts & commonData
boost::shared_ptr< VectorDouble > rhoAtGaussPts
MoFEMErrorCode doWork(int row_side, EntityType row_type, DataForcesAndSourcesCore::EntData &row_data)
Range forcesOnlyOnEntitiesRow
Mark crack surfaces on skin.
MoFEMErrorCode doWork(int row_side, EntityType row_type, DataForcesAndSourcesCore::EntData &row_data)
OpSetTagRangeOnSkin(moab::Interface &post_proc_mesh, vector< EntityHandle > &map_gauss_pts, Range &range_to_tag, const string &tag_name, int tag_value=1)
moab::Interface & postProcMesh
std::vector< EntityHandle > & mapGaussPts
const FieldApproximationBase bAse
MoFEMErrorCode doWork(int side, EntityType type, DataForcesAndSourcesCore::EntData &data)
OpTransfromSingularBaseFunctions(bool &singular_element, VectorDouble &det_s, MatrixDouble &inv_s_jac, FieldApproximationBase base=AINSWORTH_LOBATTO_BASE, bool apply_det=true)
Deprecated interface functions.
default operator for TRI element
@ OPCOL
operator doWork function is executed on FE columns
@ OPROW
operator doWork function is executed on FE rows
common data used by volume elements
definition of volume element
OpGetDataAtGaussPts(const std::string field_name, std::vector< VectorDouble > &values_at_gauss_pts, std::vector< MatrixDouble > &gradient_at_gauss_pts)
structure grouping operators and data used for calculation of nonlinear elastic element