diff --git a/dumux/boxmodels/common/boxfvelementgeometry.hh b/dumux/boxmodels/common/boxfvelementgeometry.hh index bf0c6a22a1e1b5f2882b57553a857d36a1cb3f66..0318ea9b00924cc44041467bf913c187cc8209fe 100644 --- a/dumux/boxmodels/common/boxfvelementgeometry.hh +++ b/dumux/boxmodels/common/boxfvelementgeometry.hh @@ -456,16 +456,16 @@ class BoxFVElementGeometry void getEdgeIndices(int numVertices, int face, int vert, int& leftEdge, int& rightEdge) { static const int faceAndVertexToLeftEdgeTet[4][4] = { - { 0, 0, 2, -1}, - { 0, 0, -1, 3}, - { 1, -1, 1, 3}, - {-1, 2, 2, 4} + { 0, 0, 2, -1}, + { 0, 0, -1, 3}, + { 1, -1, 1, 3}, + {-1, 2, 2, 4} }; static const int faceAndVertexToRightEdgeTet[4][4] = { - { 1, 2, 1, -1}, - { 3, 4, -1, 4}, - { 3, -1, 5, 5}, - {-1, 4, 5, 5} + { 1, 2, 1, -1}, + { 3, 4, -1, 4}, + { 3, -1, 5, 5}, + {-1, 4, 5, 5} }; static const int faceAndVertexToLeftEdgePyramid[5][5] = { { 0, 2, 3, 1, -1}, @@ -582,17 +582,6 @@ public: int numFAP; //!< number of flux approximation points const LocalFiniteElementCache feCache_; - bool computeGradientAtScvCenters; - - BoxFVElementGeometry() - { - computeGradientAtScvCenters = false; - } - - BoxFVElementGeometry(const bool computeGradientAtCenters) - { - computeGradientAtScvCenters = computeGradientAtCenters; - }; void update(const GridView& gridView, const Element& element) { @@ -613,14 +602,14 @@ public: numEdges = referenceElement.size(dim-1); numFaces = (dim<3)?0:referenceElement.size(1); numSCV = numVertices; - - bool useTwoPointFlux - = GET_PARAM_FROM_GROUP(TypeTag, bool, Implicit, UseTwoPointFlux); + + bool useTwoPointFlux + = GET_PARAM_FROM_GROUP(TypeTag, bool, Implicit, UseTwoPointFlux); if (useTwoPointFlux) numFAP = 2; else numFAP = numVertices; - + // corners: for (int vert = 0; vert < numVertices; vert++) { subContVol[vert].local = referenceElement.position(vert, dim); @@ -701,7 +690,7 @@ public: GlobalPosition distVec = subContVol[i].global; distVec -= subContVol[j].global; distVec /= distVec.two_norm2(); - + // gradients using a two-point flux approximation for (int idx = 0; idx < 2; idx++) { @@ -709,7 +698,7 @@ public: subContVolFace[k].shapeValue[idx] = 0.5; } subContVolFace[k].grad[1] *= -1.0; - + subContVolFace[k].fapIndices[0] = subContVolFace[k].i; subContVolFace[k].fapIndices[1] = subContVolFace[k].j; } @@ -797,56 +786,135 @@ public: } } - // calculate gradients at the center of the scv - for (int scvIdx = 0; scvIdx < numVertices; scvIdx++) - if (dim == 2) - { - switch (scvIdx) + bool evalGradientsAtSCVCenter = GET_PROP_VALUE(TypeTag, EvalGradientsAtSCVCenter); + if(evalGradientsAtSCVCenter) + { + // calculate gradients at the center of the scv + for (int scvIdx = 0; scvIdx < numVertices; scvIdx++){ + if (dim == 2) + { + switch (scvIdx) + { + case 0: + if (numVertices == 4) { + subContVol[scvIdx].localCenter[0] = 0.25; + subContVol[scvIdx].localCenter[1] = 0.25; + } + else { + subContVol[scvIdx].localCenter[0] = 1.0/6.0; + subContVol[scvIdx].localCenter[1] = 1.0/6.0; + } + break; + case 1: + if (numVertices == 4) { + subContVol[scvIdx].localCenter[0] = 0.75; + subContVol[scvIdx].localCenter[1] = 0.25; + } + else { + subContVol[scvIdx].localCenter[0] = 4.0/6.0; + subContVol[scvIdx].localCenter[1] = 1.0/6.0; + } + break; + case 2: + if (numVertices == 4) { + subContVol[scvIdx].localCenter[0] = 0.25; + subContVol[scvIdx].localCenter[1] = 0.75; + } + else { + subContVol[scvIdx].localCenter[0] = 1.0/6.0; + subContVol[scvIdx].localCenter[1] = 4.0/6.0; + } + break; + case 3: + subContVol[scvIdx].localCenter[0] = 0.75; + subContVol[scvIdx].localCenter[1] = 0.75; + break; + } + } + + else if (dim == 3) { - case 0: - if (numVertices == 4) { + switch (scvIdx) + { + case 0: + if (numVertices == 8) { + subContVol[scvIdx].localCenter[0] = 0.25; + subContVol[scvIdx].localCenter[1] = 0.25; + subContVol[scvIdx].localCenter[2] = 0.25; + } + else if (numVertices == 4) { + subContVol[scvIdx].localCenter[0] = 3.0/16.0; + subContVol[scvIdx].localCenter[1] = 3.0/16.0; + subContVol[scvIdx].localCenter[2] = 3.0/16.0; + } + break; + case 1: + if (numVertices == 8) { + subContVol[scvIdx].localCenter[0] = 0.75; + subContVol[scvIdx].localCenter[1] = 0.25; + subContVol[scvIdx].localCenter[2] = 0.25; + } + else if (numVertices == 4) { + subContVol[scvIdx].localCenter[0] = 7.0/16.0; + subContVol[scvIdx].localCenter[1] = 3.0/16.0; + subContVol[scvIdx].localCenter[2] = 3.0/16.0; + } + break; + case 2: + if (numVertices == 8) { + subContVol[scvIdx].localCenter[0] = 0.25; + subContVol[scvIdx].localCenter[1] = 0.75; + subContVol[scvIdx].localCenter[2] = 0.25; + } + else if (numVertices == 4) { + subContVol[scvIdx].localCenter[0] = 3.0/16.0; + subContVol[scvIdx].localCenter[1] = 7.0/16.0; + subContVol[scvIdx].localCenter[2] = 3.0/16.0; + } + break; + case 3: + if (numVertices == 8) { + subContVol[scvIdx].localCenter[0] = 0.75; + subContVol[scvIdx].localCenter[1] = 0.75; + subContVol[scvIdx].localCenter[2] = 0.25; + } + else if (numVertices == 4) { + subContVol[scvIdx].localCenter[0] = 3.0/16.0; + subContVol[scvIdx].localCenter[1] = 3.0/16.0; + subContVol[scvIdx].localCenter[2] = 7.0/16.0; + } + break; + case 4: subContVol[scvIdx].localCenter[0] = 0.25; subContVol[scvIdx].localCenter[1] = 0.25; - } - else { - subContVol[scvIdx].localCenter[0] = 1.0/6.0; - subContVol[scvIdx].localCenter[1] = 1.0/6.0; - } - break; - case 1: - if (numVertices == 4) { + subContVol[scvIdx].localCenter[2] = 0.75; + break; + case 5: subContVol[scvIdx].localCenter[0] = 0.75; subContVol[scvIdx].localCenter[1] = 0.25; - } - else { - subContVol[scvIdx].localCenter[0] = 4.0/6.0; - subContVol[scvIdx].localCenter[1] = 1.0/6.0; - } - break; - case 2: - if (numVertices == 4) { + subContVol[scvIdx].localCenter[2] = 0.75; + break; + case 6: subContVol[scvIdx].localCenter[0] = 0.25; subContVol[scvIdx].localCenter[1] = 0.75; + subContVol[scvIdx].localCenter[2] = 0.75; + break; + case 7: + subContVol[scvIdx].localCenter[0] = 0.75; + subContVol[scvIdx].localCenter[1] = 0.75; + subContVol[scvIdx].localCenter[2] = 0.75; + break; } - else { - subContVol[scvIdx].localCenter[0] = 1.0/6.0; - subContVol[scvIdx].localCenter[1] = 4.0/6.0; - } - break; - case 3: - subContVol[scvIdx].localCenter[0] = 0.75; - subContVol[scvIdx].localCenter[1] = 0.75; - break; } - std::vector<ShapeJacobian> localJac; localFiniteElement.localBasis().evaluateJacobian(subContVol[scvIdx].localCenter, localJac); Dune::FieldMatrix<CoordScalar,dim,dim> jacInvT = - geometry.jacobianInverseTransposed(subContVol[scvIdx].localCenter); + geometry.jacobianInverseTransposed(subContVol[scvIdx].localCenter); for (int vert = 0; vert < numVertices; vert++) jacInvT.mv(localJac[vert][0], subContVol[scvIdx].gradCenter[vert]); } + } } }; diff --git a/dumux/boxmodels/common/boxproperties.hh b/dumux/boxmodels/common/boxproperties.hh index ed5e67f21f277846c446f585dbf562dc88483e72..5bb60168bbbc7496958d42230192ab68efcace44 100644 --- a/dumux/boxmodels/common/boxproperties.hh +++ b/dumux/boxmodels/common/boxproperties.hh @@ -58,6 +58,7 @@ NEW_PROP_TAG(Grid); //!< The type of the DUNE grid NEW_PROP_TAG(GridView); //!< The type of the grid view NEW_PROP_TAG(FVElementGeometry); //! The type of the finite-volume geometry in the box scheme +NEW_PROP_TAG(EvalGradientsAtSCVCenter); //! Evaluate shape function gradients additionally at the sub-control volume center NEW_PROP_TAG(Problem); //!< The type of the problem NEW_PROP_TAG(BaseModel); //!< The type of the base class of the model @@ -136,6 +137,7 @@ NEW_PROP_TAG(VertexMapper); NEW_PROP_TAG(ElementMapper); //! maper for degrees of freedom NEW_PROP_TAG(DofMapper); + } } diff --git a/dumux/boxmodels/common/boxpropertydefaults.hh b/dumux/boxmodels/common/boxpropertydefaults.hh index 6222431015e997b7f5cf00ff8c1bc2df8cede65f..3b92f1df1567ffd0d05576799fbb51f33fd09bca 100644 --- a/dumux/boxmodels/common/boxpropertydefaults.hh +++ b/dumux/boxmodels/common/boxpropertydefaults.hh @@ -72,6 +72,11 @@ SET_TYPE_PROP(BoxModel, //! Set the default for the FVElementGeometry SET_TYPE_PROP(BoxModel, FVElementGeometry, Dumux::BoxFVElementGeometry<TypeTag>); +//! Disable evaluation of shape function gradients at the sub-control volume center by default +// The shape function gradients at the sub-control volume center are currently only +// needed for the stokes and the linear elastic models +SET_BOOL_PROP(BoxModel, EvalGradientsAtSCVCenter, false); + //! Set the default for the ElementBoundaryTypes SET_TYPE_PROP(BoxModel, ElementBoundaryTypes, Dumux::BoxElementBoundaryTypes<TypeTag>); diff --git a/dumux/freeflow/stokes/stokespropertydefaults.hh b/dumux/freeflow/stokes/stokespropertydefaults.hh index 7a9f894a8181b90e4cb14bbbcdede5d2cc4983ab..0ea1b2b1881a7ac50e615cd75516b153d3048a11 100644 --- a/dumux/freeflow/stokes/stokespropertydefaults.hh +++ b/dumux/freeflow/stokes/stokespropertydefaults.hh @@ -131,6 +131,10 @@ public: }; +//! Enable evaluation of shape function gradients at the sub-control volume center by default +// Used for the computation of the pressure gradients +SET_BOOL_PROP(BoxStokes, EvalGradientsAtSCVCenter, true); + //! DEPRECATED Set the phaseIndex per default to zero (important for two-phase fluidsystems). SET_INT_PROP(BoxStokes, PhaseIndex, 0);