throw new IllegalArgumentException("sd does not give boundaries that contain the strike. Use a minimum value of " + minSD);
}
// centre the nodes around the spot
final double[] fixedPoints = k == 0.0 ? new double[] {s0} : new double[] {s0, k};
final MeshingFunction xMesh = new HyperbolicMeshing(sMin, sMax, s0, spaceNodes, beta, fixedPoints);
MeshingFunction tMesh = new ExponentialMeshing(0, t, timeNodes, lambda);
final PDEGrid1D[] grid;
final double[] theta;
if (_useBurnin) {
final int tBurnNodes = (int) Math.max(2, timeNodes * _burninFrac);
final double dt = tMesh.evaluate(1) - tMesh.evaluate(0);
final double tBurn = tBurnNodes * dt * dt;
final MeshingFunction tBurnMesh = new ExponentialMeshing(0, tBurn, tBurnNodes, 0.0);
tMesh = new ExponentialMeshing(tBurn, t, timeNodes - tBurnNodes, lambda);
grid = new PDEGrid1D[2];
grid[0] = new PDEGrid1D(tBurnMesh, xMesh);
grid[1] = new PDEGrid1D(tMesh, xMesh);
theta = new double[] {_burninTheta, _mainRunTheta};