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); }
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); }
void SetFading(Gain::Type delta, uint_t step) { Step = Coeff(delta) / step; }