From ac1f3cdffdcb813e7189afef90a8c29babc531d5 Mon Sep 17 00:00:00 2001 From: Oliver Sander <sander@igpm.rwth-aachen.de> Date: Tue, 3 Sep 2013 16:29:39 +0000 Subject: [PATCH] less hard-coded 'double' [[Imported from SVN: r9403]] --- dune/gfe/localgeodesicfefunction.hh | 107 ++++++++++++++-------------- 1 file changed, 54 insertions(+), 53 deletions(-) diff --git a/dune/gfe/localgeodesicfefunction.hh b/dune/gfe/localgeodesicfefunction.hh index de713064..6be10f91 100644 --- a/dune/gfe/localgeodesicfefunction.hh +++ b/dune/gfe/localgeodesicfefunction.hh @@ -30,6 +30,7 @@ class LocalGfeTestFunctionBasis; template <int dim, class ctype, class LocalFiniteElement, class TargetSpace> class LocalGeodesicFEFunction { + typedef typename TargetSpace::ctype RT; typedef typename TargetSpace::EmbeddedTangentVector EmbeddedTangentVector; static const int embeddedDim = EmbeddedTangentVector::dimension; @@ -40,10 +41,10 @@ class LocalGeodesicFEFunction public: /** \brief The type used for derivatives */ - typedef Dune::FieldMatrix<ctype, embeddedDim, dim> DerivativeType; + typedef Dune::FieldMatrix<RT, embeddedDim, dim> DerivativeType; /** \brief The type used for derivatives of the gradient with respect to coefficients */ - typedef Tensor3<ctype,embeddedDim,embeddedDim,dim> DerivativeOfGradientWRTCoefficientType; + typedef Tensor3<RT,embeddedDim,embeddedDim,dim> DerivativeOfGradientWRTCoefficientType; /** \brief Constructor * \param localFiniteElement A Lagrangian finite element that provides the interpolation points @@ -88,12 +89,12 @@ public: /** \brief Evaluate the derivative of the function value with respect to a coefficient */ void evaluateDerivativeOfValueWRTCoefficient(const Dune::FieldVector<ctype, dim>& local, int coefficient, - Dune::FieldMatrix<double,embeddedDim,embeddedDim>& derivative) const; + Dune::FieldMatrix<RT,embeddedDim,embeddedDim>& derivative) const; /** \brief Evaluate the derivative of the function value with respect to a coefficient */ void evaluateFDDerivativeOfValueWRTCoefficient(const Dune::FieldVector<ctype, dim>& local, int coefficient, - Dune::FieldMatrix<double,embeddedDim,embeddedDim>& derivative) const; + Dune::FieldMatrix<RT,embeddedDim,embeddedDim>& derivative) const; /** \brief Evaluate the derivative of the gradient of the function with respect to a coefficient */ void evaluateDerivativeOfGradientWRTCoefficient(const Dune::FieldVector<ctype, dim>& local, @@ -112,16 +113,16 @@ public: } private: - static Dune::FieldMatrix<double,embeddedDim,embeddedDim> pseudoInverse(const Dune::FieldMatrix<double,embeddedDim,embeddedDim>& dFdq, + static Dune::FieldMatrix<RT,embeddedDim,embeddedDim> pseudoInverse(const Dune::FieldMatrix<RT,embeddedDim,embeddedDim>& dFdq, const TargetSpace& q) { const int shortDim = TargetSpace::TangentVector::dimension; // the orthonormal frame - Dune::FieldMatrix<ctype,shortDim,embeddedDim> O = q.orthonormalFrame(); + Dune::FieldMatrix<RT,shortDim,embeddedDim> O = q.orthonormalFrame(); // compute A = O dFDq O^T - Dune::FieldMatrix<ctype,shortDim,shortDim> A; + Dune::FieldMatrix<RT,shortDim,shortDim> A; for (int i=0; i<shortDim; i++) for (int j=0; j<shortDim; j++) { A[i][j] = 0; @@ -132,7 +133,7 @@ private: A.invert(); - Dune::FieldMatrix<ctype,embeddedDim,embeddedDim> result; + Dune::FieldMatrix<RT,embeddedDim,embeddedDim> result; for (int i=0; i<embeddedDim; i++) for (int j=0; j<embeddedDim; j++) { result[i][j] = 0; @@ -145,21 +146,21 @@ private: } /** \brief Compute derivate of F(w,q) (the derivative of the weighted distance fctl) wrt to w */ - Dune::Matrix<Dune::FieldMatrix<ctype,1,1> > computeDFdw(const TargetSpace& q) const + Dune::Matrix<Dune::FieldMatrix<RT,1,1> > computeDFdw(const TargetSpace& q) const { - Dune::Matrix<Dune::FieldMatrix<ctype,1,1> > dFdw(embeddedDim,localFiniteElement_.localBasis().size()); + Dune::Matrix<Dune::FieldMatrix<RT,1,1> > dFdw(embeddedDim,localFiniteElement_.localBasis().size()); for (size_t i=0; i<localFiniteElement_.localBasis().size(); i++) { - Dune::FieldVector<ctype,embeddedDim> tmp = TargetSpace::derivativeOfDistanceSquaredWRTSecondArgument(coefficients_[i], q); + Dune::FieldVector<RT,embeddedDim> tmp = TargetSpace::derivativeOfDistanceSquaredWRTSecondArgument(coefficients_[i], q); for (int j=0; j<embeddedDim; j++) dFdw[j][i] = tmp[j]; } return dFdw; } - Tensor3<ctype,embeddedDim,embeddedDim,embeddedDim> computeDqDqF(const std::vector<Dune::FieldVector<ctype,1> >& w, const TargetSpace& q) const + Tensor3<RT,embeddedDim,embeddedDim,embeddedDim> computeDqDqF(const std::vector<Dune::FieldVector<ctype,1> >& w, const TargetSpace& q) const { - Tensor3<ctype,embeddedDim,embeddedDim,embeddedDim> result; - result = 0; + Tensor3<RT,embeddedDim,embeddedDim,embeddedDim> result; + result = Tensor3<RT,embeddedDim,embeddedDim,embeddedDim>(RT(0)); for (size_t i=0; i<w.size(); i++) result.axpy(w[i][0], TargetSpace::thirdDerivativeOfDistanceSquaredWRTSecondArgument(coefficients_[i],q)); return result; @@ -219,7 +220,7 @@ typename LocalGeodesicFEFunction<dim,ctype,LocalFiniteElement,TargetSpace>::Deri LocalGeodesicFEFunction<dim,ctype,LocalFiniteElement,TargetSpace>:: evaluateDerivative(const Dune::FieldVector<ctype, dim>& local, const TargetSpace& q) const { - Dune::FieldMatrix<ctype, embeddedDim, dim> result; + Dune::FieldMatrix<RT, embeddedDim, dim> result; #if 0 // this is probably faster than the general implementation, but we leave it out for testing purposes if (dim==1) { @@ -246,11 +247,11 @@ evaluateDerivative(const Dune::FieldVector<ctype, dim>& local, const TargetSpace B[i][j] = BNested[i][0][j]; // compute negative derivative of F(w,q) (the derivative of the weighted distance fctl) wrt to w - Dune::Matrix<Dune::FieldMatrix<ctype,1,1> > dFdw = computeDFdw(q); + Dune::Matrix<Dune::FieldMatrix<RT,1,1> > dFdw = computeDFdw(q); dFdw *= -1; // multiply the two previous matrices: the result is the right hand side - Dune::Matrix<Dune::FieldMatrix<ctype,1,1> > RHS = dFdw * B; + Dune::Matrix<Dune::FieldMatrix<RT,1,1> > RHS = dFdw * B; // the actual system matrix std::vector<Dune::FieldVector<ctype,1> > w; @@ -258,7 +259,7 @@ evaluateDerivative(const Dune::FieldVector<ctype, dim>& local, const TargetSpace AverageDistanceAssembler<TargetSpace> assembler(coefficients_, w); - Dune::FieldMatrix<ctype,embeddedDim,embeddedDim> dFdq(0); + Dune::FieldMatrix<RT,embeddedDim,embeddedDim> dFdq(0); assembler.assembleEmbeddedHessian(q,dFdq); // //////////////////////////////////// @@ -275,10 +276,10 @@ evaluateDerivative(const Dune::FieldVector<ctype, dim>& local, const TargetSpace const int shortDim = TargetSpace::TangentVector::dimension; // the orthonormal frame - Dune::FieldMatrix<ctype,shortDim,embeddedDim> O = q.orthonormalFrame(); + Dune::FieldMatrix<RT,shortDim,embeddedDim> O = q.orthonormalFrame(); // compute A = O dFDq O^T - Dune::FieldMatrix<ctype,shortDim,shortDim> A; + Dune::FieldMatrix<RT,shortDim,shortDim> A; for (int i=0; i<shortDim; i++) for (int j=0; j<shortDim; j++) { A[i][j] = 0; @@ -289,17 +290,17 @@ evaluateDerivative(const Dune::FieldVector<ctype, dim>& local, const TargetSpace for (int i=0; i<dim; i++) { - Dune::FieldVector<ctype,embeddedDim> rhs; + Dune::FieldVector<RT,embeddedDim> rhs; for (int j=0; j<embeddedDim; j++) rhs[j] = RHS[j][i]; - Dune::FieldVector<ctype,shortDim> shortRhs; + Dune::FieldVector<RT,shortDim> shortRhs; O.mv(rhs,shortRhs); - Dune::FieldVector<ctype,shortDim> shortX; + Dune::FieldVector<RT,shortDim> shortX; A.solve(shortX,shortRhs); - Dune::FieldVector<ctype,embeddedDim> x; + Dune::FieldVector<RT,embeddedDim> x; O.mtv(shortX,x); for (int j=0; j<embeddedDim; j++) @@ -342,7 +343,7 @@ template <int dim, class ctype, class LocalFiniteElement, class TargetSpace> void LocalGeodesicFEFunction<dim,ctype,LocalFiniteElement,TargetSpace>:: evaluateDerivativeOfValueWRTCoefficient(const Dune::FieldVector<ctype, dim>& local, int coefficient, - Dune::FieldMatrix<double,embeddedDim,embeddedDim>& result) const + Dune::FieldMatrix<RT,embeddedDim,embeddedDim>& result) const { // the function value at the point where we are evaluating the derivative TargetSpace q = evaluate(local); @@ -353,16 +354,16 @@ evaluateDerivativeOfValueWRTCoefficient(const Dune::FieldVector<ctype, dim>& loc AverageDistanceAssembler<TargetSpace> assembler(coefficients_, w); - Dune::FieldMatrix<ctype,embeddedDim,embeddedDim> dFdq(0); + Dune::FieldMatrix<RT,embeddedDim,embeddedDim> dFdq(0); assembler.assembleEmbeddedHessian(q,dFdq); const int shortDim = TargetSpace::TangentVector::dimension; // the orthonormal frame - Dune::FieldMatrix<ctype,shortDim,embeddedDim> O = q.orthonormalFrame(); + Dune::FieldMatrix<RT,shortDim,embeddedDim> O = q.orthonormalFrame(); // compute A = O dFDq O^T - Dune::FieldMatrix<ctype,shortDim,shortDim> A; + Dune::FieldMatrix<RT,shortDim,shortDim> A; for (int i=0; i<shortDim; i++) for (int j=0; j<shortDim; j++) { A[i][j] = 0; @@ -372,15 +373,15 @@ evaluateDerivativeOfValueWRTCoefficient(const Dune::FieldVector<ctype, dim>& loc } // - Dune::FieldMatrix<double,embeddedDim,embeddedDim> rhs = TargetSpace::secondDerivativeOfDistanceSquaredWRTFirstAndSecondArgument(coefficients_[coefficient], q); + Dune::FieldMatrix<RT,embeddedDim,embeddedDim> rhs = TargetSpace::secondDerivativeOfDistanceSquaredWRTFirstAndSecondArgument(coefficients_[coefficient], q); rhs *= -w[coefficient]; for (int i=0; i<embeddedDim; i++) { - Dune::FieldVector<ctype,shortDim> shortRhs; + Dune::FieldVector<RT,shortDim> shortRhs; O.mv(rhs[i],shortRhs); - Dune::FieldVector<ctype,shortDim> shortX; + Dune::FieldVector<RT,shortDim> shortX; A.solve(shortX,shortRhs); O.mtv(shortX,result[i]); @@ -393,14 +394,14 @@ template <int dim, class ctype, class LocalFiniteElement, class TargetSpace> void LocalGeodesicFEFunction<dim,ctype,LocalFiniteElement,TargetSpace>:: evaluateFDDerivativeOfValueWRTCoefficient(const Dune::FieldVector<ctype, dim>& local, int coefficient, - Dune::FieldMatrix<double,embeddedDim,embeddedDim>& result) const + Dune::FieldMatrix<RT,embeddedDim,embeddedDim>& result) const { double eps = 1e-6; // the function value at the point where we are evaluating the derivative - const Dune::FieldMatrix<double,spaceDim,embeddedDim> B = coefficients_[coefficient].orthonormalFrame(); + const Dune::FieldMatrix<RT,spaceDim,embeddedDim> B = coefficients_[coefficient].orthonormalFrame(); - Dune::FieldMatrix<double,spaceDim,embeddedDim> interimResult; + Dune::FieldMatrix<RT,spaceDim,embeddedDim> interimResult; std::vector<TargetSpace> cornersPlus = coefficients_; std::vector<TargetSpace> cornersMinus = coefficients_; @@ -449,7 +450,7 @@ evaluateDerivativeOfGradientWRTCoefficient(const Dune::FieldVector<ctype, dim>& // the matrix that turns coordinates on the reference simplex into coordinates on the standard simplex std::vector<Dune::FieldMatrix<ctype,1,dim> > BNested(coefficients_.size()); localFiniteElement_.localBasis().evaluateJacobian(local, BNested); - Dune::Matrix<Dune::FieldMatrix<double,1,1> > B(coefficients_.size(), dim); + Dune::Matrix<Dune::FieldMatrix<RT,1,1> > B(coefficients_.size(), dim); for (size_t i=0; i<coefficients_.size(); i++) for (size_t j=0; j<dim; j++) B[i][j] = BNested[i][0][j]; @@ -460,12 +461,12 @@ evaluateDerivativeOfGradientWRTCoefficient(const Dune::FieldVector<ctype, dim>& AverageDistanceAssembler<TargetSpace> assembler(coefficients_, w); - Dune::FieldMatrix<ctype,embeddedDim,embeddedDim> dFdq(0); + Dune::FieldMatrix<RT,embeddedDim,embeddedDim> dFdq(0); assembler.assembleEmbeddedHessian(q,dFdq); - Dune::FieldMatrix<ctype,embeddedDim,embeddedDim> mixedDerivative = TargetSpace::secondDerivativeOfDistanceSquaredWRTFirstAndSecondArgument(coefficients_[coefficient], q); - TensorSSD<double,embeddedDim,embeddedDim> dvDwF(coefficients_.size()); + Dune::FieldMatrix<RT,embeddedDim,embeddedDim> mixedDerivative = TargetSpace::secondDerivativeOfDistanceSquaredWRTFirstAndSecondArgument(coefficients_[coefficient], q); + TensorSSD<RT,embeddedDim,embeddedDim> dvDwF(coefficients_.size()); dvDwF = 0; for (int i=0; i<embeddedDim; i++) for (int j=0; j<embeddedDim; j++) @@ -475,34 +476,34 @@ evaluateDerivativeOfGradientWRTCoefficient(const Dune::FieldVector<ctype, dim>& // dFDq is not invertible, if the target space is embedded into a higher-dimensional // Euclidean space. Therefore we use its pseudo inverse. I don't think that is the // best way, though. - Dune::FieldMatrix<ctype,embeddedDim,embeddedDim> dFdqPseudoInv = pseudoInverse(dFdq,q); + Dune::FieldMatrix<RT,embeddedDim,embeddedDim> dFdqPseudoInv = pseudoInverse(dFdq,q); // - Tensor3<double,embeddedDim,embeddedDim,embeddedDim> dvDqF + Tensor3<RT,embeddedDim,embeddedDim,embeddedDim> dvDqF = TargetSpace::thirdDerivativeOfDistanceSquaredWRTFirst1AndSecond2Argument(coefficients_[coefficient], q); - dvDqF = w[coefficient] * dvDqF; + dvDqF = RT(w[coefficient]) * dvDqF; // Put it all together // dvq[i][j] = \partial q_j / \partial v_i - Dune::FieldMatrix<double,embeddedDim,embeddedDim> dvq; + Dune::FieldMatrix<RT,embeddedDim,embeddedDim> dvq; evaluateDerivativeOfValueWRTCoefficient(local,coefficient,dvq); - Dune::FieldMatrix<ctype, embeddedDim, dim> derivative = evaluateDerivative(local); + Dune::FieldMatrix<RT, embeddedDim, dim> derivative = evaluateDerivative(local); - Tensor3<double, embeddedDim,embeddedDim,embeddedDim> dqdqF; + Tensor3<RT, embeddedDim,embeddedDim,embeddedDim> dqdqF; dqdqF = computeDqDqF(w,q); - TensorSSD<double, embeddedDim,embeddedDim> dqdwF(coefficients_.size()); + TensorSSD<RT, embeddedDim,embeddedDim> dqdwF(coefficients_.size()); for (size_t k=0; k<coefficients_.size(); k++) { - Dune::FieldMatrix<ctype,embeddedDim,embeddedDim> hesse = TargetSpace::secondDerivativeOfDistanceSquaredWRTSecondArgument(coefficients_[k], q); + Dune::FieldMatrix<RT,embeddedDim,embeddedDim> hesse = TargetSpace::secondDerivativeOfDistanceSquaredWRTSecondArgument(coefficients_[k], q); for (int i=0; i<embeddedDim; i++) for (int j=0; j<embeddedDim; j++) dqdwF(i, j, k) = hesse[i][j]; } - TensorSSD<double, embeddedDim,embeddedDim> dqdwF_times_dvq(coefficients_.size()); + TensorSSD<RT, embeddedDim,embeddedDim> dqdwF_times_dvq(coefficients_.size()); for (int i=0; i<embeddedDim; i++) for (int j=0; j<embeddedDim; j++) for (size_t k=0; k<coefficients_.size(); k++) { @@ -511,9 +512,9 @@ evaluateDerivativeOfGradientWRTCoefficient(const Dune::FieldVector<ctype, dim>& dqdwF_times_dvq(i, j, k) += dqdwF(l, j, k) * dvq[i][l]; } - Tensor3<double, embeddedDim,embeddedDim,dim> foo; + Tensor3<RT,embeddedDim,embeddedDim,dim> foo; foo = -1 * dvDqF*derivative - (dvq*dqdqF)*derivative; - TensorSSD<double,embeddedDim,embeddedDim> bar(dim); + TensorSSD<RT,embeddedDim,embeddedDim> bar(dim); bar = dvDwF * B + dqdwF_times_dvq*B; for (int i=0; i<embeddedDim; i++) @@ -521,7 +522,7 @@ evaluateDerivativeOfGradientWRTCoefficient(const Dune::FieldVector<ctype, dim>& for (int k=0; k<dim; k++) foo[i][j][k] -= bar(i, j, k); - result = 0; + result = RT(0); for (int i=0; i<embeddedDim; i++) for (int j=0; j<embeddedDim; j++) for (int k=0; k<dim; k++) @@ -553,8 +554,8 @@ evaluateFDDerivativeOfGradientWRTCoefficient(const Dune::FieldVector<ctype, dim> LocalGeodesicFEFunction<dim,ctype,LocalFiniteElement,TargetSpace> fPlus(localFiniteElement_,cornersPlus); LocalGeodesicFEFunction<dim,ctype,LocalFiniteElement,TargetSpace> fMinus(localFiniteElement_,cornersMinus); - Dune::FieldMatrix<double,embeddedDim,dim> hPlus = fPlus.evaluateDerivative(local); - Dune::FieldMatrix<double,embeddedDim,dim> hMinus = fMinus.evaluateDerivative(local); + Dune::FieldMatrix<RT,embeddedDim,dim> hPlus = fPlus.evaluateDerivative(local); + Dune::FieldMatrix<RT,embeddedDim,dim> hMinus = fMinus.evaluateDerivative(local); result[j] = hPlus; result[j] -= hMinus; @@ -565,7 +566,7 @@ evaluateFDDerivativeOfGradientWRTCoefficient(const Dune::FieldVector<ctype, dim> for (int j=0; j<embeddedDim; j++) { TargetSpace q = evaluate(local); - Dune::FieldVector<double,embeddedDim> foo; + Dune::FieldVector<RT,embeddedDim> foo; for (int l=0; l<dim; l++) { for (int k=0; k<embeddedDim; k++) -- GitLab