/* * * * Copyright 1998-2013 University Corporation for Atmospheric Research/Unidata * * * * Portions of this software were developed by the Unidata Program at the * * University Corporation for Atmospheric Research. * * * * Access and use of this software shall impose the following obligations * * and understandings on the user. The user is granted the right, without * * any fee or cost, to use, copy, modify, alter, enhance and distribute * * this software, and any derivative works thereof, and its supporting * * documentation for any purpose whatsoever, provided that this entire * * notice appears in all copies of the software, derivative works and * * supporting documentation. Further, UCAR requests that the user credit * * UCAR/Unidata in any publications that result from the use of this * * software or in any product that includes this software. The names UCAR * * and/or Unidata, however, may not be used in any advertising or publicity * * to endorse or promote any products or commercial entity unless specific * * written permission is obtained from UCAR/Unidata. The user also * * understands that UCAR/Unidata is not obligated to provide the user with * * any support, consulting, training or assistance of any kind with regard * * to the use, operation and performance of this software nor to provide * * the user with any updates, revisions, new versions or "bug fixes." * * * * THIS SOFTWARE IS PROVIDED BY UCAR/UNIDATA "AS IS" AND ANY EXPRESS OR * * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * * DISCLAIMED. IN NO EVENT SHALL UCAR/UNIDATA BE LIABLE FOR ANY SPECIAL, * * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING * * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * * WITH THE ACCESS, USE OR PERFORMANCE OF THIS SOFTWARE. * */ package ucar.coord; import net.jcip.annotations.Immutable; import ucar.nc2.time.CalendarDate; import ucar.nc2.time.CalendarDateRange; import ucar.nc2.time.CalendarPeriod; import java.util.List; /** * Abstract superclass for time coordinates ( time, timeIntv, time2D) * Effectively Immutable * * @author caron * @since 1/23/14 */ @Immutable public abstract class CoordinateTimeAbstract implements Coordinate { static public final String MIXED_INTERVALS = "Mixed_intervals"; static public CalendarDateFactory cdf; protected final int code; // unit of time (Grib1 table 4, Grib2 table 4.4), eg hour, day, month protected final CalendarPeriod timeUnit; // time duration, based on code protected final String periodName; // used to create the udunit protected final CalendarDate refDate; // used to create the udunit protected final int[] time2runtime; // for each time, which runtime is used; index into master runtime protected String name = "time"; CoordinateTimeAbstract(int code, CalendarPeriod timeUnit, CalendarDate refDate, int[] time2runtime) { this.code = code; this.timeUnit = timeUnit; this.refDate = (cdf == null) ? refDate : cdf.get(refDate); this.time2runtime = time2runtime; CalendarPeriod.Field cf = timeUnit.getField(); if (cf == CalendarPeriod.Field.Month || cf == CalendarPeriod.Field.Year) this.periodName = "calendar "+ cf.toString(); else this.periodName = cf.toString(); } @Override public int getCode() { return code; } public CalendarPeriod getPeriod() { return timeUnit; } @Override public String getUnit() { return periodName; } @Override public String getName() { return name; } public void setName(String name) { if (!this.name.equals("time")) throw new IllegalStateException("Cant modify"); this.name = name; } public CalendarDate getRefDate() { return refDate; } public double getTimeUnitScale() { return timeUnit.getValue(); } public CalendarPeriod getTimeUnit() { return timeUnit; } public int[] getTime2runtime() { return time2runtime; } public int getMasterRuntimeIndex(int timeIdx) { if (time2runtime == null) return -1; if (timeIdx < 0 || timeIdx >= time2runtime.length) return -1; return time2runtime[timeIdx]; } //////////////////////////////////////// /** * Implements coverting a "complete best" to a "monotonic best". * The reftime is not allowed to decrease * @return "monotonic best" CoordinateTimeAbstract, based on this one, which is a "complete best" */ public CoordinateTimeAbstract makeBestFromComplete() { int[] best = new int[time2runtime.length]; int last = -1; int count = 0; for (int i=0; i<time2runtime.length; i++) { int time = time2runtime[i]; if (time >= last) { last = time; best[i] = time; count++; } else { best[i] = -1; } } return makeBestFromComplete(best, count); } protected abstract CoordinateTimeAbstract makeBestFromComplete(int[] best, int n); public abstract CalendarDateRange makeCalendarDateRange(ucar.nc2.time.Calendar cal); }