22#include <ql/instruments/payoffs.hpp>
23#include <ql/math/functional.hpp>
24#include <ql/methods/finitedifferences/meshers/fdmmesher.hpp>
25#include <ql/methods/finitedifferences/operators/fdmblackscholesop.hpp>
26#include <ql/methods/finitedifferences/operators/fdmlinearoplayout.hpp>
27#include <ql/methods/finitedifferences/operators/secondderivativeop.hpp>
33 const ext::shared_ptr<FdmMesher>& mesher,
34 const ext::shared_ptr<GeneralizedBlackScholesProcess>& bsProcess,
37 Real illegalLocalVolOverwrite,
39 ext::shared_ptr<FdmQuantoHelper> quantoHelper)
40 : mesher_(mesher), rTS_(bsProcess->riskFreeRate().currentLink()),
41 qTS_(bsProcess->dividendYield().currentLink()),
42 volTS_(bsProcess->blackVolatility().currentLink()),
43 localVol_((localVol) ? bsProcess->localVolatility().currentLink() :
45 x_((localVol) ?
Array(
Exp(mesher->locations(direction))) :
Array()),
47 mapT_(direction, mesher), strike_(strike),
48 illegalLocalVolOverwrite_(illegalLocalVolOverwrite), direction_(direction),
49 quantoHelper_(
std::move(quantoHelper)) {}
57 for (
const auto& iter : *
mesher_->layout()) {
58 const Size i = iter.index();
86 Array(1, r - q - 0.5*v)
88 Array(1, std::sqrt(v)), t1, t2),
107 const Array& r)
const {
111 return Array(r.size(), 0.0);
116 return Array(r.size(), 0.0);
1-D array used in linear algebra.
Size size() const override
Array apply_direction(Size direction, const Array &r) const override
Array preconditioner(const Array &r, Real s) const override
std::vector< SparseMatrix > toMatrixDecomp() const override
FdmBlackScholesOp(const ext::shared_ptr< FdmMesher > &mesher, const ext::shared_ptr< GeneralizedBlackScholesProcess > &process, Real strike, bool localVol=false, Real illegalLocalVolOverwrite=-Null< Real >(), Size direction=0, ext::shared_ptr< FdmQuantoHelper > quantoHelper=ext::shared_ptr< FdmQuantoHelper >())
const TripleBandLinearOp dxxMap_
const ext::shared_ptr< FdmQuantoHelper > quantoHelper_
void setTime(Time t1, Time t2) override
Time is required.
Array apply_mixed(const Array &r) const override
const ext::shared_ptr< YieldTermStructure > qTS_
const FirstDerivativeOp dxMap_
const ext::shared_ptr< FdmMesher > mesher_
Array solve_splitting(Size direction, const Array &r, Real s) const override
const ext::shared_ptr< YieldTermStructure > rTS_
const ext::shared_ptr< BlackVolTermStructure > volTS_
Array apply(const Array &r) const override
const ext::shared_ptr< LocalVolTermStructure > localVol_
const Real illegalLocalVolOverwrite_
SparseMatrix toMatrix() const override
Array solve_splitting(const Array &r, Real a, Real b=1.0) const
void axpyb(const Array &a, const TripleBandLinearOp &x, const TripleBandLinearOp &y, const Array &b)
TripleBandLinearOp mult(const Array &u) const
Array apply(const Array &r) const override
Real Time
continuous quantity with 1-year units
std::size_t Size
size of a container
Array Exp(const Array &v)
Array Sqrt(const Array &v)