Пример #1
0
  void DOFVectorBase<double>::getD2AtQPs( const ElInfo* elInfo,
                                          const Quadrature* quad,
                                          const FastQuadrature* quadFast,
                                          DenseVector<D2Type<double>::type>& d2AtQPs) const
  {
    FUNCNAME("DOFVector<double>::getD2AtQPs()");

    TEST_EXIT_DBG(quad || quadFast)("neither quad nor quadFast defined\n");

    if (quad && quadFast)
    {
      TEST_EXIT_DBG(quad == quadFast->getQuadrature())
      ("quad != quadFast->quadrature\n");
    }

    TEST_EXIT_DBG(!quadFast || quadFast->getBasisFunctions() == feSpace->getBasisFcts())
    ("invalid basis functions");

    Element* el = elInfo->getElement();

    int dow = Global::getGeo(WORLD);
    int nPoints = quadFast ? quadFast->getQuadrature()->getNumPoints() : quad->getNumPoints();

    DenseVector<double> localVec(nBasFcts);
    getLocalVector(el, localVec);

    DimMat<double> D2Tmp(dim, dim, 0.0);
    int parts = Global::getGeo(PARTS, dim);
    const DimVec<WorldVector<double>>& grdLambda = elInfo->getGrdLambda();

    d2AtQPs.change_dim(nPoints);
    if (quadFast)
    {
      for (int iq = 0; iq < nPoints; iq++)
      {
        for (int k = 0; k < parts; k++)
          for (int l = 0; l < parts; l++)
            D2Tmp[k][l] = 0.0;

        for (int i = 0; i < nBasFcts; i++)
        {
          for (int k = 0; k < parts; k++)
            for (int l = 0; l < parts; l++)
              D2Tmp[k][l] += localVec[i] * quadFast->getSecDer(iq, i, k, l);
        }

        for (int i = 0; i < dow; i++)
          for (int j = 0; j < dow; j++)
          {
            d2AtQPs[iq][i][j] = 0.0;
            for (int k = 0; k < parts; k++)
              for (int l = 0; l < parts; l++)
                d2AtQPs[iq][i][j] += grdLambda[k][i]*grdLambda[l][j]*D2Tmp[k][l];
          }
      }
    }
    else
    {
      const BasisFunction* basFcts = feSpace->getBasisFcts();
      DimMat<double> D2Phi(dim, dim);

      for (int iq = 0; iq < nPoints; iq++)
      {
        for (int k = 0; k < parts; k++)
          for (int l = 0; l < parts; l++)
            D2Tmp[k][l] = 0.0;

        for (int i = 0; i < nBasFcts; i++)
        {
          WARNING("not tested after index correction\n");
          (*(basFcts->getD2Phi(i)))(quad->getLambda(iq), D2Phi);

          for (int k = 0; k < parts; k++)
            for (int l = 0; l < parts; l++)
              D2Tmp[k][l] += localVec[i] * D2Phi[k][l];
        }

        for (int i = 0; i < dow; i++)
          for (int j = 0; j < dow; j++)
          {
            d2AtQPs[iq][i][j] = 0.0;
            for (int k = 0; k < parts; k++)
              for (int l = 0; l < parts; l++)
                d2AtQPs[iq][i][j] += grdLambda[k][i] * grdLambda[l][j] * D2Tmp[k][l];
          }
      }
    }
  }