/** * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.analytics.financial.model.finitedifference; import org.apache.commons.lang.Validate; /** * Holds the result of the PDE solver on the final time slice only */ public class PDETerminalResults1D implements PDEResults1D { private final double[] _f; private final PDEGrid1D _grid; public PDETerminalResults1D(final PDEGrid1D grid, final double[] finalTimeStep) { Validate.isTrue(grid.getNumSpaceNodes() == finalTimeStep.length, "space steps in grid not equal to that in data"); _f = finalTimeStep; _grid = grid; } @Override public double getSpaceValue(final int spaceIndex) { return _grid.getSpaceNode(spaceIndex); } @Override public double getFunctionValue(final int spaceIndex) { return _f[spaceIndex]; } @Override public double getFirstSpatialDerivative(final int spaceIndex) { checkSpaceIndex(spaceIndex); double[] coeff; double res = 0; final int n = _grid.getNumSpaceNodes(); int offset; if (spaceIndex == 0) { coeff = _grid.getFirstDerivativeForwardCoefficients(spaceIndex); offset = 0; } else if (spaceIndex == n - 1) { coeff = _grid.getFirstDerivativeBackwardCoefficients(spaceIndex); offset = -coeff.length + 1; } else { coeff = _grid.getFirstDerivativeCoefficients(spaceIndex); offset = -(coeff.length - 1) / 2; } for (int i = 0; i < coeff.length; i++) { res += coeff[i] * _f[spaceIndex + i + offset]; } return res; } @Override public double getSecondSpatialDerivative(final int spaceIndex) { checkSpaceIndex(spaceIndex); final double[] coeff = _grid.getSecondDerivativeCoefficients(spaceIndex); double res = 0; int offset; if (spaceIndex == 0) { offset = 0; } else if (spaceIndex == _grid.getNumSpaceNodes() - 1) { offset = -2; } else { offset = -1; } for (int i = 0; i < coeff.length; i++) { res += coeff[i] * _f[spaceIndex + i + offset]; } return res; } private void checkSpaceIndex(final int spaceIndex) { Validate.isTrue(spaceIndex >= 0 && spaceIndex < _grid.getNumSpaceNodes(), "spaceIndex out of range"); } @Override public int getNumberSpaceNodes() { return _grid.getNumSpaceNodes(); } @Override public PDEGrid1D getGrid() { return _grid; } @Override public double[] getTerminalResults() { return _f; } }