1414import mil .army .usace .hec .vortex .VortexGrid ;
1515import mil .army .usace .hec .vortex .VortexPoint ;
1616import mil .army .usace .hec .vortex .VortexVariable ;
17+ import mil .army .usace .hec .vortex .convert .DataConverter ;
1718import mil .army .usace .hec .vortex .geo .RasterUtils ;
1819import mil .army .usace .hec .vortex .geo .ZonalStatistics ;
1920import mil .army .usace .hec .vortex .util .DssUtil ;
20- import mil .army .usace .hec .vortex .util .UnitUtil ;
2121
22- import javax .measure .Unit ;
2322import java .time .Duration ;
24- import java .time .LocalDateTime ;
2523import java .time .ZonedDateTime ;
2624import java .time .format .DateTimeFormatter ;
2725import java .util .*;
3028import java .util .stream .Collectors ;
3129
3230import static hec .heclib .util .Heclib .UNDEFINED_FLOAT ;
33- import static javax .measure .MetricPrefix .MILLI ;
3431import static mil .army .usace .hec .vortex .VortexVariable .*;
35- import static systems .uom .common .USCustomary .FAHRENHEIT ;
36- import static systems .uom .common .USCustomary .INCH ;
37- import static tech .units .indriya .AbstractUnit .ONE ;
38- import static tech .units .indriya .unit .Units .*;
3932
4033class DssDataWriter extends DataWriter {
4134
@@ -46,14 +39,13 @@ class DssDataWriter extends DataWriter {
4639 }
4740
4841 private static final int SECONDS_PER_MINUTE = 60 ;
49- private static final int SECONDS_PER_HOUR = 3600 ;
50- private static final int SECONDS_PER_DAY = 86400 ;
5142
5243 @ Override
5344 public void write () {
5445 List <VortexGrid > grids = data .stream ()
5546 .filter (VortexGrid .class ::isInstance )
5647 .map (VortexGrid .class ::cast )
48+ .map (DataConverter ::convert )
5749 .toList ();
5850
5951 for (VortexGrid grid : grids ) {
@@ -74,8 +66,6 @@ public void write() {
7466 }
7567 }
7668
77- Unit <?> units = UnitUtil .getUnits (grid .units ());
78-
7969 DSSPathname dssPathname = new DSSPathname ();
8070
8171 String cPart = getCPart (grid );
@@ -95,97 +85,16 @@ public void write() {
9585 options .put ("dataType" , "INST-VAL" );
9686 }
9787
98- if (cPart .equals ("PRECIPITATION" ) && !grid .interval ().isZero ()
99- && (units .equals (MILLI (METRE ).divide (SECOND ))
100- || units .equals (MILLI (METRE ).divide (HOUR ))
101- || units .equals (MILLI (METRE ).divide (DAY )))) {
102- DateTimeFormatter formatter = DateTimeFormatter .ofPattern ("d MMMM yyyy, HH:mm" , Locale .ENGLISH );
103- LocalDateTime startTime = LocalDateTime .parse (gridInfo .getStartTime (), formatter );
104- LocalDateTime endTime = LocalDateTime .parse (gridInfo .getEndTime (), formatter );
105- Duration interval = Duration .between (startTime , endTime );
106-
107- float conversion ;
108- if (units .equals (MILLI (METRE ).divide (SECOND ))) {
109- conversion = interval .getSeconds ();
110- } else if (units .equals (MILLI (METRE ).divide (HOUR ))) {
111- conversion = (float ) interval .getSeconds () / SECONDS_PER_HOUR ;
112- } else if (units .equals (MILLI (METRE ).divide (DAY ))) {
113- conversion = (float ) interval .getSeconds () / SECONDS_PER_DAY ;
114- } else {
115- conversion = 1 ;
116- }
117-
118- float [] convertedData = RasterUtils .convert (data , conversion , UNDEFINED_FLOAT );
119-
120- gridInfo .setDataUnits ("MM" );
121- gridInfo .setDataType (DssDataType .PER_CUM .value ());
122-
123- if (options .containsKey ("partF" ) && options .get ("partF" ).equals ("*" )) {
124- DSSPathname pathnameIn = new DSSPathname ();
125- int status = pathnameIn .setPathname (grid .fullName ());
126- if (status == 0 ) {
127- dssPathname .setFPart (pathnameIn .getFPart ());
128- }
129- }
130-
131- write (convertedData , gridInfo , dssPathname );
132-
133- } else if (cPart .equals ("PRECIPITATION" ) && units .equals (METRE )) {
134- float [] convertedData = RasterUtils .convert (data , 1000 , UNDEFINED_FLOAT );
135- gridInfo .setDataUnits ("MM" );
136-
137- write (convertedData , gridInfo , dssPathname );
138- } else if (units .equals (FAHRENHEIT ) || units .equals (KELVIN ) || units .equals (CELSIUS )) {
139- float [] convertedData = new float [data .length ];
140- if (units .equals (FAHRENHEIT )) {
141- System .arraycopy (data , 0 , convertedData , 0 , data .length );
142- gridInfo .setDataUnits ("DEG F" );
143- } else if (units .equals (KELVIN )) {
144- for (int i = 0 ; i < data .length ; i ++) {
145- float value = data [i ];
146- convertedData [i ] = Float .compare (UNDEFINED_FLOAT , value ) == 0 ? UNDEFINED_FLOAT : (float ) (data [i ] - 273.15 );
147- }
148- gridInfo .setDataUnits ("DEG C" );
149- } else if (units .equals (CELSIUS )) {
150- System .arraycopy (data , 0 , convertedData , 0 , data .length );
151- gridInfo .setDataUnits ("DEG C" );
152- }
153-
154- if (options .containsKey ("partF" ) && options .get ("partF" ).equals ("*" )) {
155- DSSPathname pathnameIn = new DSSPathname ();
156- int status = pathnameIn .setPathname (grid .fullName ());
157- if (status == 0 ) {
158- dssPathname .setFPart (pathnameIn .getFPart ());
159- }
88+ if (options .containsKey ("partF" ) && options .get ("partF" ).equals ("*" )) {
89+ DSSPathname pathnameIn = new DSSPathname ();
90+ int status = pathnameIn .setPathname (grid .fullName ());
91+ if (status == 0 ) {
92+ dssPathname .setFPart (pathnameIn .getFPart ());
16093 }
94+ }
16195
162- write (convertedData , gridInfo , dssPathname );
163- } else if (cPart .equals ("HUMIDITY" ) && units .equals (ONE )) {
164- float [] convertedData = RasterUtils .convert (data , 100 , UNDEFINED_FLOAT );
165- gridInfo .setDataUnits ("%" );
166-
167- write (convertedData , gridInfo , dssPathname );
168- } else if (units .equals (ONE .divide (INCH .multiply (1000 )))) {
169- float [] convertedData = RasterUtils .convert (data , 1E-3f , UNDEFINED_FLOAT );
170- gridInfo .setDataUnits ("IN" );
171-
172- write (convertedData , gridInfo , dssPathname );
173- } else if (units .equals (PASCAL )) {
174- float [] convertedData = RasterUtils .convert (data , 1E-3f , UNDEFINED_FLOAT );
175- gridInfo .setDataUnits ("KPA" );
176-
177- write (convertedData , gridInfo , dssPathname );
178- } else {
179- if (options .containsKey ("partF" ) && options .get ("partF" ).equals ("*" )) {
180- DSSPathname pathnameIn = new DSSPathname ();
181- int status = pathnameIn .setPathname (grid .fullName ());
182- if (status == 0 ) {
183- dssPathname .setFPart (pathnameIn .getFPart ());
184- }
185- }
96+ write (data , gridInfo , dssPathname );
18697
187- write (data , gridInfo , dssPathname );
188- }
18998 }
19099
191100 List <VortexPoint > points = data .stream ()
0 commit comments