void JacobianOnD(Mat J, Vec F, unsigned int i, int* pt, myCSField sf){
    if (i < sf->d){
        for (pt[i]=1;pt[i]<=sf->mesh[i];pt[i]++)
            JacobianOnD(J, F, i+1, pt, sf);
        return;
    }
    int r = linIdx_Sys(sf->d, sf->mesh, pt,0,0);
    unsigned int j;
    // a' u' + a u'' = F
    for (j=0;j<sf->d;j++){
        double ldx = dx(j, sf);
        double dx2 = ldx*ldx;
        double ap = Coeff(pt,j,+ldx/2., sf);
        double am = Coeff(pt,j,-ldx/2., sf);

        // Our operators are isotropic
        if (pt[j] > 1){
            int c = linIdx_Sys(sf->d, sf->mesh, pt, j, -1);
            MatSetValue(J, r, c, am/dx2, ADD_VALUES);
        }
        MatSetValue(J, r, r, -(am+ap)/dx2, ADD_VALUES);
        if (pt[j] < sf->mesh[j]){
            int c = linIdx_Sys(sf->d, sf->mesh, pt, j, 1);
            MatSetValue(J, r, c, ap/dx2, ADD_VALUES);
        }
    }

    double forcing = Forcing(pt, sf);
    VecSetValue(F, r, -forcing, INSERT_VALUES);
}
const Polynomial&
CoordinateChange::forwardTriangle_() {
  std::map< TriangleAddress, Polynomial >::const_iterator iterFIJ;
  const size_t wSize(wI_.size());
  for (Power j = 1; j <= currentGrade_ - 1; ++j) {
    for (Power i = 0; i <= currentGrade_ - 1 - j; ++i) {
      iterFIJ = fIJ_.find(TriangleAddress(i, j));
      if (iterFIJ == fIJ_.end()) {
        iterFIJ = fIJ_.find(TriangleAddress(i + 1, j - 1));
        assert(iterFIJ != fIJ_.end());
        Polynomial temp(iterFIJ->second);
        for (Power k = 0; k <= i; ++k) {
          assert((i + 1 - k) < wSize);
          const Polynomial& wTerm(wI_.at(i + 1 - k));
          iterFIJ = fIJ_.find(TriangleAddress(k, j - 1));
          assert(iterFIJ != fIJ_.end());
          const Polynomial& inner(iterFIJ->second);
          checkGrades_(i, j, inner, wTerm);
          temp += Coeff(binomial(i, k)) * algebra_.lieBracket(inner, wTerm);
        }
        fIJ_.insert(std::map< TriangleAddress, Polynomial >::value_type(TriangleAddress(i, j), temp));
      }
    }
  }
  iterFIJ = fIJ_.find(TriangleAddress(0, currentGrade_ - 1));
  assert(iterFIJ != fIJ_.end());
  return (iterFIJ->second);
}
Exemple #3
0
 void SetGain(Gain::Type in)
 {
   static const Gain::Type MIN(0, Gain::Type::PRECISION);
   static const Gain::Type MAX(Gain::Type::PRECISION, Gain::Type::PRECISION);
   if (in < MIN || in > MAX)
   {
     throw Error(THIS_LINE, translate("Failed to set gain value: out of range."));
   }
   Level = Coeff(in);
 }
Exemple #4
0
 void SetFading(Gain::Type delta, uint_t step)
 {
   Step = Coeff(delta) / step;
 }