44import com .bc .fiduceo .util .NetCDFUtils ;
55import ucar .ma2 .Array ;
66import ucar .ma2 .DataType ;
7+ import ucar .ma2 .Index ;
78import ucar .ma2 .InvalidRangeException ;
89import ucar .nc2 .*;
910
1415
1516class MatchupFields {
1617
18+ private static final int SECS_PER_HOUR = 3600 ;
19+
1720 private Map <String , TemplateVariable > variables ;
1821
1922 void prepare (MatchupFieldsConfiguration matchupFieldsConfig , NetcdfFile reader , NetcdfFileWriter writer ) {
@@ -31,28 +34,53 @@ void prepare(MatchupFieldsConfiguration matchupFieldsConfig, NetcdfFile reader,
3134 addTimeVariable (matchupFieldsConfig , dimensions , writer );
3235 }
3336
34- void compute (Configuration config , NetcdfFile reader ) throws IOException , InvalidRangeException {
37+ void compute (Configuration config , NetcdfFile reader , NetcdfFileWriter writer ) throws IOException , InvalidRangeException {
3538 final Era5Archive era5Archive = new Era5Archive (config .getNWPAuxDir ());
3639 final MatchupFieldsConfiguration matchupConfig = config .getMatchupFields ();
3740
3841 // allocate cache large enough to hold the time-series for one Era-5 variable
39- final int cacheSize = matchupConfig .get_time_steps_future () + matchupConfig .get_time_steps_past () + 1 ;
40- final VariableCache variableCache = new VariableCache (era5Archive , cacheSize );
42+ final int numTimeSteps = matchupConfig .get_time_steps_future () + matchupConfig .get_time_steps_past () + 1 ;
43+ final VariableCache variableCache = new VariableCache (era5Archive , numTimeSteps );
4144
4245 try {
4346 // open input time variable
4447 // + read completely
4548 // + convert to ERA-5 time stamps
46- // - calculate time past and future timestamps for each matchup
47- // - write to MMD
48- final Array timeArray = VariableUtils .readTimeArray (matchupConfig .get_time_variable_name (), reader );
49- final Array era5TimeArray = convertToEra5TimeStamp (timeArray );
49+ // + calculate time past and future timestamps for each matchup
50+ // + write to MMD
51+ final Variable nwpTimeVariable = NetCDFUtils .getVariable (writer , matchupConfig .get_nwp_time_variable_name ());
52+ final Array targetTimeArray = createTimeArray (reader , matchupConfig , numTimeSteps , nwpTimeVariable );
53+ writer .write (nwpTimeVariable , targetTimeArray );
54+
55+ targetTimeArray .getIndex ();
5056
51- }finally {
57+ } finally {
5258 variableCache .close ();
5359 }
5460 }
5561
62+ private static Array createTimeArray (NetcdfFile reader , MatchupFieldsConfiguration matchupConfig , int numTimeSteps , Variable nwpTimeVariable ) throws IOException , InvalidRangeException {
63+ final Array timeArray = VariableUtils .readTimeArray (matchupConfig .get_time_variable_name (), reader );
64+ final Array era5TimeArray = convertToEra5TimeStamp (timeArray );
65+ final int numMatchups = era5TimeArray .getShape ()[0 ];
66+
67+ final Array targetTimeArray = Array .factory (DataType .INT , nwpTimeVariable .getShape ());
68+ final Index targetIndex = targetTimeArray .getIndex ();
69+
70+ final int offset = -matchupConfig .get_time_steps_past ();
71+ final Index index = era5TimeArray .getIndex ();
72+ for (int i = 0 ; i < numMatchups ; i ++) {
73+ index .set (i );
74+ final int timeStamp = era5TimeArray .getInt (index );
75+ for (int k = 0 ; k < numTimeSteps ; k ++) {
76+ final int timeStep = timeStamp + (offset + k ) * SECS_PER_HOUR ;
77+ targetIndex .set (i , k );
78+ targetTimeArray .setInt (targetIndex , timeStep );
79+ }
80+ }
81+ return targetTimeArray ;
82+ }
83+
5684 private void addTimeVariable (MatchupFieldsConfiguration matchupFieldsConfig , List <Dimension > dimensions , NetcdfFileWriter writer ) {
5785 final String timeVariableName = matchupFieldsConfig .get_nwp_time_variable_name ();
5886 final String escapedName = NetCDFUtils .escapeVariableName (timeVariableName );
0 commit comments