Real Fdm2DimSolver::thetaAt(Real x, Real y) const { QL_REQUIRE(conditions_->stoppingTimes().front() > 0.0, "stopping time at zero-> can't calculate theta"); calculate(); Matrix thetaValues(resultValues_.rows(), resultValues_.columns()); const Array& rhs = thetaCondition_->getValues(); std::copy(rhs.begin(), rhs.end(), thetaValues.begin()); return (BicubicSpline(x_.begin(), x_.end(), y_.begin(), y_.end(), thetaValues)(x, y) - interpolateAt(x, y)) / thetaCondition_->getTime(); }
template <Size N> inline Real FdmNdimSolver<N>::thetaAt(const std::vector<Real>& x) const { QL_REQUIRE(conditions_->stoppingTimes().front() > 0.0, "stopping time at zero-> can't calculate theta"); calculate(); const Array& rhs = thetaCondition_->getValues(); const boost::shared_ptr<FdmLinearOpLayout> layout = solverDesc_.mesher->layout(); data_table f(x_); const FdmLinearOpIterator endIter = layout->end(); for (FdmLinearOpIterator iter = layout->begin(); iter != endIter; ++iter) { setValue(f, iter.coordinates(), rhs[iter.index()]); } return (MultiCubicSpline<N>(x_, f)(x) - interpolateAt(x)) / thetaCondition_->getTime(); }
Real Fdm3DimSolver::thetaAt(Real x, Real y, Rate z) const { QL_REQUIRE(conditions_->stoppingTimes().front() > 0.0, "stopping time at zero-> can't calculate theta"); calculate(); const Array& rhs = thetaCondition_->getValues(); std::vector<Matrix> thetaValues(z_.size(), Matrix(y_.size(),x_.size())); for (Size i=0; i < z_.size(); ++i) { std::copy(rhs.begin()+i *y_.size()*x_.size(), rhs.begin()+(i+1)*y_.size()*x_.size(), thetaValues[i].begin()); } Array zArray(z_.size()); for (Size i=0; i < z_.size(); ++i) { zArray[i] = BicubicSpline(x_.begin(),x_.end(), y_.begin(),y_.end(), thetaValues[i])(x,y); } return (MonotonicCubicNaturalSpline(z_.begin(), z_.end(), zArray.begin())(z) - interpolateAt(x, y, z)) / thetaCondition_->getTime(); }