/****************************************************************************** * * AMDiS - Adaptive multidimensional simulations * * Copyright (C) 2013 Dresden University of Technology. All Rights Reserved. * Web: https://fusionforge.zih.tu-dresden.de/projects/amdis * * Authors: * Simon Vey, Thomas Witkowski, Andreas Naumann, Simon Praetorius, et al. * * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. * * * This file is part of AMDiS * * See also license.opensource.txt in the distribution. * ******************************************************************************/ #include "BasisFunction.h" namespace AMDiS { template T BasisFunction::evalUh(const DimVec& lambda, const mtl::dense_vector& uh_loc) const { T val; nullify(val); for (int i = 0; i < nBasFcts; i++) val += uh_loc[i] * (*(*phi)[i])(lambda); return val; } template typename GradientType::type& BasisFunction::evalGrdUh(const DimVec& lambda, const DimVec >& grd_lambda, const mtl::dense_vector& uh_loc, typename GradientType::type& val) const { mtl::dense_vector grdTmp1(dim + 1); T null; nullify(null); mtl::dense_vector grdTmp2(dim + 1, null); for (int i = 0; i < nBasFcts; i++) { (*(*grdPhi)[i])(lambda, grdTmp1); for (int j = 0; j < dim + 1; j++) grdTmp2[j] += uh_loc[i] * grdTmp1[j]; } nullify(val); for (int i = 0; i < dow; i++) { for (int j = 0; j < dim + 1; j++) val[i] += grd_lambda[j][i] * grdTmp2[j]; } return val; } // template // typename D2Type::type& BasisFunction::evalD2Uh(const DimVec& lambda, // const DimVec >& grd_lambda, // const mtl::dense_vector& uh_loc, // D2Type::type& val) const // { // DimMat D2_b(dim, DEFAULT_VALUE, 0.0); // DimMat D2_tmp(dim, DEFAULT_VALUE, 0.0); // // for (int i = 0; i < nBasFcts; i++) { // (*(*d2Phi)[i])(lambda, D2_b); // for (int k = 0; k < dim + 1; k++) // for (int l = 0; l < dim + 1; l++) // D2_tmp[k][l] += uh_loc[i] * D2_b[k][l]; // } // // for (int i = 0; i < dow; i++) // for (int j = 0; j < dow; j++) { // val[i][j] = 0.0; // for (int k = 0; k < dim + 1; k++) // for (int l = 0; l < dim + 1; l++) // val[i][j] += grd_lambda[k][i] * grd_lambda[l][j] * D2_tmp[k][l]; // } // // return val; // } }