78#define ENUM_TYPE VariableType
79#define ENUM_DEF ENUM_ITEM(scalar) ENUM_ITEM(vector)
83#define ENUM_TYPE VariableQuantity
84#define ENUM_DEF ENUM_ITEM(Displacement) ENUM_ITEM(Velocity) ENUM_ITEM(Temperature) ENUM_ITEM(Pressure) ENUM_ITEM(VolumeFraction)
175 this->
field->interpolation->initializeCell(&cell);
176 this->
testField->interpolation->initializeCell(&cell);
179 IntArray enodes, einteranlnodes, dofIDs;
181 dofIDs = this->
field->getDofManDofIDs();
182 this->
field->interpolation->giveCellDofMans(enodes, einteranlnodes, &cell);
183 for (
auto i: enodes) {
185 for (
auto d: dofIDs) {
193 for (
auto i: einteranlnodes) {
195 for (
auto d: dofIDs) {
204 dofIDs = this->
testField->getDofManDofIDs();
205 this->
testField->interpolation->giveCellDofMans(enodes, einteranlnodes, &cell);
206 for (
auto i: enodes) {
208 for (
auto d: dofIDs) {
216 for (
auto i: einteranlnodes) {
218 for (
auto d: dofIDs) {
228 int myorder = this->
field->interpolation->giveInterpolationOrder() * this->
testField->interpolation->giveInterpolationOrder();
237 int size = irvec.size();
238 for (
int i = 0; i< size; i++) {
239 if (irvec[i].get()->giveNumberOfIntegrationPoints() ==
nip) {
246 irvec.resize( size +1);
247 irvec [ size] = std::make_unique<GaussIntegrationRule>(size, &cell);
254 int myorder = this->
field->interpolation->giveInterpolationOrder() * this->
testField->interpolation->giveInterpolationOrder();
261 int size = irvec.size();
262 for (
int i = 0; i< size; i++) {
263 if (irvec[i].get()->giveNumberOfIntegrationPoints() ==
nip) {
264 return irvec[i].get();
311 term.
evaluate(dw, *
this, igp, tstep);
335 term.
evaluate(dw, *
this, igp, tstep);
359 term.
evaluate(dw, *
this, igp, tstep);
434 std::list<double> ans;
435 for (
int i : bNodes) {
437 for(
const double& u: uloc){ ans.push_back(u); }
450 answer.
assemble(contrib, tloc, uloc);
474 IntArray nodes, internalNodes, dofs;
476 std::vector<double> ans;
477 for (
int i : nodes) {
481 ans.insert(ans.end(),uloc.
begin(),uloc.
end());
483 for (
int i : internalNodes) {
487 ans.insert(ans.end(),uloc.
begin(),uloc.
end());
bool hasDofID(DofIDItem id) const
void giveUnknownVector(FloatArray &answer, const IntArray &dofMask, ValueModeType mode, TimeStep *tStep, bool padding=false)
virtual int giveNumberOfInternalDofManagers() const
std::vector< std ::unique_ptr< IntegrationRule > > & giveIntegrationRulesArray()
virtual const FEInterpolation * getGeometryInterpolation() const
virtual integrationDomain giveIntegrationDomain() const
virtual DofManager * giveInternalDofManager(int i) const
virtual int giveNumberOfDofManagers() const
DofManager * giveDofManager(int i) const
Element(int n, Domain *aDomain)
virtual Element_Geometry_Type giveGeometryType() const =0
virtual IntArray boundaryEdgeGiveNodes(int boundary, const Element_Geometry_Type, bool includeHierarchical=false) const =0
virtual double boundarySurfaceGiveTransformationJacobian(int isurf, const FloatArray &lcoords, const FEICellGeometry &cellgeo) const =0
virtual double boundaryEdgeGiveTransformationJacobian(int boundary, const FloatArray &lcoords, const FEICellGeometry &cellgeo) const =0
virtual double giveTransformationJacobian(const FloatArray &lcoords, const FEICellGeometry &cellgeo) const
virtual IntArray boundarySurfaceGiveNodes(int boundary, const Element_Geometry_Type, bool includeHierarchical=false) const =0
virtual void giveCellDofMans(IntArray &nodes, IntArray &internalDofMans, Element *elem) const
Returns list of element nodes (and list of internal dof managers) (including on edges and surfaces) d...
void assemble(const FloatArray &fe, const IntArray &loc)
std::vector< double >::iterator begin()
static FloatArray fromVector(const std::vector< double > &v)
static FloatArray fromList(const std::list< double > &l)
void add(const FloatArray &src)
std::vector< double >::iterator end()
void add(const FloatMatrix &a)
*Sets size of receiver to be an empty matrix It will have zero rows and zero columns size void clear()
void assembleT(const FloatMatrix &src, const IntArray &rowind, const IntArray &colind)
void assemble(const FloatMatrix &src, const IntArray &loc)
int getRequiredNumberOfIntegrationPoints(integrationDomain dType, int approxOrder) override
const FloatArray & giveNaturalCoordinates() const
Returns coordinate array of receiver.
double giveWeight()
Returns integration weight of receiver.
void followedBy(const IntArray &b, int allocChunk=0)
Base class for elements based on mp (multi-physics) concept.
virtual void getSurfaceElementCodeNumbers(IntArray &answer, const Variable::VariableQuantity q, int isurf) const
Returns element code numbers of the unknowns associated with given boundary entity.
virtual void getEdgeElementCodeNumbers(IntArray &answer, const Variable::VariableQuantity q, int isurf) const
void assembleTermContribution(FloatMatrix &answer, FloatMatrix &contrib, const Term &t)
Assembles the partial element contribution into local element matrix.
virtual int getNumberOfSurfaceDOFs() const =0
virtual void getEdgeLocalCodeNumbers(IntArray &answer, const Variable::VariableQuantity q) const =0
virtual void getLocalCodeNumbers(IntArray &answer, const Variable::VariableQuantity q) const
virtual void getInternalDofManLocalCodeNumbers(IntArray &answer, const Variable::VariableQuantity q, int n) const =0
void integrateEdgeTerm_dw(FloatMatrix &answer, const Term &term, IntegrationRule *iRule, int iedge, TimeStep *tstep)
void assembleTermContributionT(FloatMatrix &answer, FloatMatrix &contrib, const Term &t)
FEInterpolation * giveInterpolation() const override
virtual int getNumberOfEdgeDOFs() const =0
void integrateSurfaceTerm_c(FloatArray &answer, const Term &term, IntegrationRule *iRule, int isurf, TimeStep *tstep)
virtual void giveCharacteristicMatrixFromBC(FloatMatrix &answer, CharType type, TimeStep *tStep, GeneralBoundaryCondition *bc, int boundaryID)
IntArray giveBoundaryEdgeNodes(int boundary, bool includeHierarchical=false) const override
virtual void getSurfaceLocalCodeNumbers(IntArray &answer, const Variable::VariableQuantity q) const =0
virtual int computeFluxLBToLRotationMatrix(FloatMatrix &answer, int iSurf, const FloatArray &lc, const Variable::VariableQuantity q, char btype)
IntArray giveBoundarySurfaceNodes(int boundary, bool includeHierarchical=false) const override
MPElement(int n, Domain *aDomain)
virtual void getBoundaryUnknownVector(FloatArray &answer, const Variable *field, ValueModeType mode, int ibc, char bt, TimeStep *tStep)
virtual void giveCharacteristicVectorFromBC(FloatArray &answer, CharType type, ValueModeType mode, TimeStep *tStep, GeneralBoundaryCondition *bc, int boundaryID)
void assembleTermContribution(FloatArray &answer, FloatArray &contrib, const Term &t)
void integrateEdgeTerm_c(FloatArray &answer, const Term &term, IntegrationRule *iRule, int iedge, TimeStep *tstep)
virtual double computeSurfaceVolumeAround(GaussPoint *igp, int iSurf)
virtual double computeEdgeVolumeAround(GaussPoint *igp, int iEdge)
void integrateTerm_c(FloatArray &answer, const Term &term, IntegrationRule *iRule, TimeStep *tstep)
void integrateSurfaceTerm_dw(FloatMatrix &answer, const Term &term, IntegrationRule *iRule, int isurf, TimeStep *tstep)
virtual void getDofManLocalCodeNumbers(IntArray &answer, const Variable::VariableQuantity q, int n) const =0
virtual double computeVolumeAround(GaussPoint *igp) override
void integrateTerm_dw(FloatMatrix &answer, const Term &term, IntegrationRule *iRule, TimeStep *tstep)
virtual const void getUnknownVector(FloatArray &answer, const Variable *field, ValueModeType mode, TimeStep *tstep)
Returns vector of nodal unknowns for given Variable.
MPMSymbolicTerm(const Variable *testField, const Variable *unknownField, MaterialMode m)
void initializeFrom(InputRecord &ir, EngngModel *problem) override
void initializeCell(Element &cell) const override
IntegrationRule * giveElementIntegrationRule(Element *e) const override
Class representing a weak form expression to be evaluated (integrated). It defines two key methods:
virtual void evaluate(FloatArray &, MPElement &cell, GaussPoint *gp, TimeStep *tStep) const =0
virtual IntegrationRule * giveElementIntegrationRule(Element *e) const
virtual void initializeFrom(InputRecord &ir, EngngModel *problem)
virtual void evaluate_lin(FloatMatrix &, MPElement &cell, GaussPoint *gp, TimeStep *tStep) const =0
const Variable * testField
virtual void getDimensions(Element &cell) const =0
Term(const Variable *testField, const Variable *unknownField, MaterialMode m=MaterialMode::_Unknown)
virtual void initializeCell(Element &cell) const =0
oofem::VariableQuantity VariableQuantity
oofem::VariableType VariableType
const IntArray & getDofManDofIDs() const
Returns DodIF mask in node; need generalization (which dofMan).
Variable(const FEInterpolation *i, Variable::VariableQuantity q, Variable::VariableType t, int size, IntArray &dofIDs, Variable *dual=NULL)
const FEInterpolation * interpolation
Variable(const FEInterpolation *i, Variable::VariableQuantity q, Variable::VariableType t, int size, Variable *dual=NULL, std ::initializer_list< int > dofIDs={})
void initializeFrom(InputRecord &ir)
#define OOFEM_LOG_INFO(...)