public PDETerminalResults1D runPDESolver(final LocalVolatilitySurfaceStrike localVolatility, final ForwardCurve forwardCurve, final EuropeanVanillaOption option) {
final boolean isCall = option.isCall();
final double expiry = option.getTimeToExpiry();
final double minMoneyness = Math.exp(-_maxProxyDelta * Math.sqrt(expiry));
final double maxMoneyness = 1.0 / minMoneyness;
final PDEGrid1D grid = getGrid(getTimeMesh(expiry), getSpaceMesh(minMoneyness, maxMoneyness));
final BoundaryCondition lower = getLowerBoundaryCondition(option, minMoneyness);
final BoundaryCondition upper = getUpperBoundaryCondition(option, maxMoneyness);
final ConvectionDiffusionPDE1DCoefficients pde = getPDEProvider().getForwardLocalVol(forwardCurve, localVolatility);
final Function1D<Double, Double> intCond = getInitialConditionProvider().getForwardCallPut(isCall);
final PDE1DDataBundle<ConvectionDiffusionPDE1DCoefficients> db = new PDE1DDataBundle<>(pde, intCond, lower, upper, grid);