final boolean isCall = option.isCall();
final double expiry = option.getTimeToExpiry();
final double forward = forwardCurve.getForward(expiry);
final double strike = option.getStrike();
final double maxForward = forward * _maxMoneyness;
final BoundaryCondition lower = getLowerBoundaryCondition(option, strike);
final BoundaryCondition upper = getUpperBoundaryCondition(option, expiry);
final PDEGrid1D grid = getGrid(getTimeMesh(expiry), getSpaceMesh(maxForward, forward));
final ConvectionDiffusionPDE1DCoefficients pde = getPDEProvider().getBackwardsLocalVol(forwardCurve, expiry, localVolatility);
final Function1D<Double, Double> payoff = getInitialConditionProvider().getEuropeanPayoff(strike, isCall);
final PDE1DDataBundle<ConvectionDiffusionPDE1DCoefficients> db = new PDE1DDataBundle<>(pde, payoff, lower, upper, grid);
return (PDETerminalResults1D) getSolver().solve(db);