package ucar.coord;
import org.junit.Test;
import ucar.nc2.grib.grib1.Grib1Record;
import ucar.nc2.time.CalendarDate;
import ucar.nc2.time.CalendarPeriod;
import ucar.nc2.util.Indent;
import java.util.*;
/**
* Describe
*
* @author caron
* @since 11/25/2014
*/
public class TestCoordinateTime2DUnionizer {
static int code = 0;
static CalendarPeriod timeUnit = CalendarPeriod.of("1 hour");
static CalendarDate startDate = CalendarDate.parseISOformat(null, "1970-01-01T00:00:00");
@Test
public void testOrthoginalization() {
List<CoordinateTimeAbstract> coords = new ArrayList<>();
coords.add(makeTimeCoordinate(startDate, 12, 6));
coords.add(makeTimeCoordinate(startDate, 4, 24));
CoordinateTimeAbstract result = CoordinateTime2DUnionizer.testOrthogonal(coords);
Formatter f = new Formatter(System.out);
f.format("Original%n");
for (CoordinateTimeAbstract coord : coords) {
coord.showInfo(f, new Indent(2));
}
f.format("%nResult%n");
if (result == null) f.format("not orthogonal");
else result.showInfo(f, new Indent(2));
}
@Test
public void testMakeCoordinate2D() {
List<CoordinateTime2D> coords = new ArrayList<>();
coords.add(makeTimeCoordinate2D( 12, 6));
coords.add(makeTimeCoordinate2D( 4, 24));
int count = 0;
Formatter f = new Formatter(System.out);
f.format("Original%n");
for (CoordinateTime2D coord : coords) {
f.format("CoordinateTime2D %d%n", count++);
coord.showInfo(f, new Indent(2));
f.format("%n%n");
}
f.format("Orthononalize%n");
for (CoordinateTime2D coord : coords) {
f.format("CoordinateTime2D %d%n", count++);
CoordinateTime2D result = testOrthogonalizaition(coord);
result.showInfo(f, new Indent(2));
f.format("%n%n");
assert result.isOrthogonal();
}
}
CoordinateTime2D testOrthogonalizaition(CoordinateTime2D coord2D) {
CoordinateTime2DUnionizer unionizer = new CoordinateTime2DUnionizer(false, timeUnit, code, false);
unionizer.addAll(coord2D);
unionizer.finish();
return (CoordinateTime2D) unionizer.getCoordinate();
}
@Test
public void testCoordinateUnionizer() {
List<CoordinateTime2D> coord2Ds = new ArrayList<>();
for (int i = 5; i < 15; i += 2) {
coord2Ds.add(makeTimeCoordinate2D(i, 3));
}
CoordinateTime2DUnionizer unionizer = new CoordinateTime2DUnionizer(false, timeUnit, code, false);
for (CoordinateTime2D coord2D : coord2Ds) {
unionizer.addAll(coord2D);
}
unionizer.finish();
CoordinateTime2D result = (CoordinateTime2D) unionizer.getCoordinate();
Formatter f = new Formatter();
f.format("Original%n");
for (CoordinateTime2D coord2D : coord2Ds) {
coord2D.showInfo(f, new Indent(2));
}
f.format("%nResult%n");
result.showInfo(f, new Indent(2));
}
static public CoordinateTime makeTimeCoordinate(CalendarDate refDate, int size, int spacing) {
List<Integer> offsetSorted = new ArrayList<>();
for (int i=0; i<size; i++) offsetSorted.add(i * spacing);
return new CoordinateTime(code, timeUnit, refDate, offsetSorted, null);
}
static public CoordinateTime2D makeTimeCoordinate2D(int nruns, int ntimes) {
CoordinateRuntime.Builder1 runBuilder = new CoordinateRuntime.Builder1(timeUnit);
Map<Object, CoordinateBuilderImpl<Grib1Record>> timeBuilders = new HashMap<>();
List<CoordinateTime2D.Time2D> vals = new ArrayList<>(nruns*ntimes);
for (int j=0; j<nruns; j++) {
CalendarDate runDate = startDate.add(j, CalendarPeriod.Field.Hour);
for (int i = 0; i < ntimes; i++) {
CoordinateTime2D.Time2D time2D = new CoordinateTime2D.Time2D(runDate, i, null);
vals.add(time2D);
runBuilder.add( time2D.run);
CoordinateBuilderImpl<Grib1Record> timeBuilder = timeBuilders.get(time2D.run);
if (timeBuilder == null) {
timeBuilder = new CoordinateTime.Builder1(null, code, timeUnit, time2D.getRefDate());
timeBuilders.put(time2D.run, timeBuilder);
}
timeBuilder.add(time2D.time);
}
}
CoordinateRuntime runCoord = (CoordinateRuntime) runBuilder.finish();
List<Coordinate> times = new ArrayList<>(runCoord.getSize());
for (int idx=0; idx<runCoord.getSize(); idx++) {
long runtime = runCoord.getRuntime(idx);
CoordinateBuilderImpl<Grib1Record> timeBuilder = timeBuilders.get(runtime);
times.add(timeBuilder.finish());
}
Collections.sort(vals);
return new CoordinateTime2D(code, timeUnit, vals, runCoord, times);
}
}