package ucar.nc2.ft.cover.impl; import ucar.ma2.InvalidRangeException; import ucar.nc2.constants.AxisType; import ucar.nc2.dataset.*; import ucar.nc2.ft.cover.FmrcCS; import ucar.nc2.time.CalendarDate; import java.io.IOException; /** * Fmrc Coordinate System Implementation * * @author John * @since 12/25/12 */ public class FmrcCSImpl extends CoverageCSImpl implements FmrcCS { private CoordinateAxis1DTime[] timeAxisForRun; protected FmrcCSImpl(NetcdfDataset ds, CoordinateSystem cs, CoverageCSFactory fac) { super(ds, cs, fac); } @Override public CoordinateAxis2D getTimeAxis() { return (CoordinateAxis2D) cs.findAxis(AxisType.Time); } @Override public CoordinateAxis1DTime getRunTimeAxis() { return (CoordinateAxis1DTime) cs.findAxis(AxisType.RunTime); } @Override public CoordinateAxis1DTime getTimeAxisForRun(CalendarDate runTime) { CoordinateAxis1DTime runTimeAxis = getRunTimeAxis(); if (runTimeAxis == null) return null; int runIndex = runTimeAxis.findTimeIndexFromCalendarDate(runTime); int nruns = (int) runTimeAxis.getSize(); if ((runIndex < 0) || (runIndex >= nruns)) throw new IllegalArgumentException("getTimeAxisForRun index out of bounds= " + runIndex); if (timeAxisForRun == null) timeAxisForRun = new CoordinateAxis1DTime[nruns]; if (timeAxisForRun[runIndex] == null) timeAxisForRun[runIndex] = makeTimeAxisForRun(runIndex); return timeAxisForRun[runIndex]; } private CoordinateAxis1DTime makeTimeAxisForRun(int run_index) { CoordinateAxis tAxis = getTimeAxis(); VariableDS section; try { section = (VariableDS) tAxis.slice(0, run_index); return CoordinateAxis1DTime.factory(ds, section, null); } catch (InvalidRangeException | IOException e) { e.printStackTrace(); } return null; } }