diff --git a/dumux/boxmodels/common/boxlocaljacobian.hh b/dumux/boxmodels/common/boxlocaljacobian.hh index f8742a08c20a872fa06ec6609777020f332a3415..e6aa5100c33342d9146c0c4d1224ec8fad86a365 100644 --- a/dumux/boxmodels/common/boxlocaljacobian.hh +++ b/dumux/boxmodels/common/boxlocaljacobian.hh @@ -35,6 +35,33 @@ namespace Dumux /*! * \ingroup BoxModel * \brief Caculates the Jacobian of the local residual for box models + * + * The default behaviour is to use numeric differentiation, i.e. + * forward or backward differences (2nd order), or central + * differences (3rd order). The method used is determined by the + * "NumericDifferenceMethod" property: + * + * - if the value of this property is smaller than 0, backward + * differences are used, i.e.: + * \f[ + \frac{\partial f(x)}{\partial x} \approx \frac{f(x) - f(x - \epsilon)}{\epsilon} + * \f] + * + * - if the value of this property is 0, central + * differences are used, i.e.: + * \f[ + \frac{\partial f(x)}{\partial x} \approx \frac{f(x + \epsilon) - f(x - \epsilon)}{2 \epsilon} + * \f] + * + * - if the value of this property is larger than 0, forward + * differences are used, i.e.: + * \f[ + \frac{\partial f(x)}{\partial x} \approx \frac{f(x + \epsilon) - f(x)}{\epsilon} + * \f] + * + * Here, \f$ f \f$ is the residual function for all equations, \f$x\f$ + * is the value of a sub-control volume's primary variable at the + * evaluation point and \f$\epsilon\f$ is a small value larger than 0. */ template<class TypeTag> class BoxLocalJacobian @@ -286,6 +313,43 @@ protected: * * This method can be overwritten by the implementation if a * better scheme than central differences ought to be used. + * + * The default implementation of this method uses numeric + * differentiation, i.e. forward or backward differences (2nd + * order), or central differences (3rd order). The method used is + * determined by the "NumericDifferenceMethod" property: + * + * - if the value of this property is smaller than 0, backward + * differences are used, i.e.: + * \f[ + \frac{\partial f(x)}{\partial x} \approx \frac{f(x) - f(x - \epsilon)}{\epsilon} + * \f] + * + * - if the value of this property is 0, central + * differences are used, i.e.: + * \f[ + \frac{\partial f(x)}{\partial x} \approx \frac{f(x + \epsilon) - f(x - \epsilon)}{2 \epsilon} + * \f] + * + * - if the value of this property is larger than 0, forward + * differences are used, i.e.: + * \f[ + \frac{\partial f(x)}{\partial x} \approx \frac{f(x + \epsilon) - f(x)}{\epsilon} + * \f] + * + * Here, \f$ f \f$ is the residual function for all equations, \f$x\f$ + * is the value of a sub-control volume's primary variable at the + * evaluation point and \f$\epsilon\f$ is a small value larger than 0. + * + * \param dest The vector storing the partial derivatives of all + * equations + * \param scvIdx The sub-control volume index of the current + * finite element for which the partial derivative + * ought to be calculated + * \param pvIdx The index of the primary variable at the scvIdx' + * sub-control volume of the current finite element + * for which the partial derivative ought to be + * calculated */ void evalPartialDerivative_(ElementSolutionVector &dest, int scvIdx, @@ -299,7 +363,10 @@ protected: Scalar eps = asImp_().numericEpsilon_(scvIdx, pvIdx); Scalar delta = 0; - if (numDiffMethod >= 0) { // not backward differences + if (numDiffMethod >= 0) { + // we are not using backward differences, i.e. we need to + // calculate f(x - \epsilon) + // deflect primary variables priVars[pvIdx] += eps; delta += eps; @@ -321,12 +388,17 @@ protected: dest = localResidual().residual(); } else { - // backward differences + // we are using backward differences, i.e. we don't need + // to calculate f(x - \epsilon) and we can recycle the + // (already calculated) residual f(x) dest = residual_; } - if (numDiffMethod <= 0) { // not forward differences + if (numDiffMethod <= 0) { + // we are not using forward differences, i.e. we don't + // need to calculate f(x + \epsilon) + // deflect the primary variables priVars[pvIdx] -= delta + eps; delta += eps; @@ -346,14 +418,17 @@ protected: dest -= localResidual().residual(); } else { - // forward differences + // we are using forward differences, i.e. we don't need to + // calculate f(x + \epsilon) and we can recycle the + // (already calculated) residual f(x) dest -= residual_; } + // divide difference in residuals by the magnitude of the + // deflections between the two function evaluation dest /= delta; - // restore the orignal state of the element's secondary - // variables + // restore the orignal state of the element's volume variables curVolVars_[scvIdx] = origVolVars; #if HAVE_VALGRIND @@ -378,9 +453,9 @@ protected: } /*! - * \brief Updates the current local stiffness matrix with the + * \brief Updates the current local Jacobian matrix with the * partial derivatives of all equations in regard to the - * primary variable 'pvIdx' at vertex j . + * primary variable 'pvIdx' at vertex 'scvIdx' . */ void updateLocalJacobian_(int scvIdx, int pvIdx,