Skip to content

Commit

Permalink
#377 Create Wanda Seawat black box wrapper, add time info to exchange…
Browse files Browse the repository at this point in the history
… items
  • Loading branch information
erikpelgrim committed Sep 10, 2024
1 parent f96feca commit 2b62d85
Show file tree
Hide file tree
Showing 6 changed files with 66 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import org.openda.exchange.AbstractDataObject;
import org.openda.exchange.DoublesExchangeItem;
import org.openda.exchange.TimeInfo;
import org.openda.interfaces.IExchangeItem;
import org.openda.utils.io.AsciiFileUtils;

Expand All @@ -11,10 +12,7 @@
import java.io.IOException;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.TreeMap;
import java.util.*;

public class WandaSeawatGridDataObject extends AbstractDataObject {
private String header;
Expand Down Expand Up @@ -100,9 +98,11 @@ public void initialize(File workingDir, String[] arguments) {
for (int datum = 0; datum < data.size(); datum++) {
dataArray[datum] = data.get(datum);
}
DoublesExchangeItem dataExchangeItem = new DoublesExchangeItem("dataExchangeItem", IExchangeItem.Role.InOut, dataArray);

exchangeItems.put("data", dataExchangeItem);
String id = filePrefix + "Grid";
DoublesExchangeItem dataExchangeItem = new DoublesExchangeItem(id, IExchangeItem.Role.InOut, dataArray);
TimeInfo timeInfo = WandaSeawatUtils.getTimeInfo(filePrefix, fileNamesToFiles);
dataExchangeItem.setTimeInfo(timeInfo);
exchangeItems.put(id, dataExchangeItem);
}

private static TreeMap<String, File> getFileNamesToFiles(File workingDir, String filePrefix) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import org.openda.exchange.AbstractDataObject;
import org.openda.exchange.DoublesExchangeItem;
import org.openda.exchange.TimeInfo;
import org.openda.interfaces.IExchangeItem;
import org.openda.utils.io.AsciiFileUtils;

Expand Down Expand Up @@ -30,7 +31,10 @@ public void initialize(File workingDir, String[] arguments) {
return;
}

findFiles(workingDir, arguments[0]);
String filePrefix = arguments[0];
findFiles(workingDir, filePrefix);

TimeInfo timeInfo = WandaSeawatUtils.getTimeInfo(filePrefix, fileNamesToFiles);

Map<String, List<Double>> keyToValues = new HashMap<>();
for (Map.Entry<String, File> entry : fileNamesToFiles.entrySet()) {
Expand All @@ -53,12 +57,12 @@ public void initialize(File workingDir, String[] arguments) {
double height = Double.parseDouble(values[0]);
heights.add(height);

readRow(keyToValues, entry, values, height);
readRow(keyToValues, entry, values, height, timeInfo);
}
}
}

private void readRow(Map<String, List<Double>> keyToValues, Map.Entry<String, File> entry, String[] values, double height) {
private void readRow(Map<String, List<Double>> keyToValues, Map.Entry<String, File> entry, String[] values, double height, TimeInfo timeInfo) {
for (int valueIndex = FIRST_VALUE_OFFSET; valueIndex < values.length; valueIndex++) {
String value = values[valueIndex];
String key = String.format("depth%s_radius%s", height, radii.get(valueIndex - FIRST_VALUE_OFFSET));
Expand All @@ -70,6 +74,8 @@ private void readRow(Map<String, List<Double>> keyToValues, Map.Entry<String, Fi
}

DoublesExchangeItem doublesExchangeItem = new DoublesExchangeItem(key, IExchangeItem.Role.InOut, valueList.stream().mapToDouble(Double::doubleValue).toArray());
doublesExchangeItem.setTimeInfo(timeInfo);

exchangeItems.putIfAbsent(key, doublesExchangeItem);
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package org.openda.model_wanda_seawat;

import org.openda.exchange.TimeInfo;
import org.openda.exchange.timeseries.TimeUtils;

import java.io.File;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.TreeMap;

public class WandaSeawatUtils {
static TimeInfo getTimeInfo(String filePrefix, TreeMap<String, File> fileNamesToFiles) {
try {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat('\'' + filePrefix + "'yyyyMMddHHmmss", Locale.US);
double[] timesArray = new double[fileNamesToFiles.size()];
String[] strings = fileNamesToFiles.keySet().toArray(new String[0]);
for (int i = 0; i < strings.length; i++) {
String fileName = strings[i];
Date dateFromFileName = simpleDateFormat.parse(fileName);
timesArray[i] = TimeUtils.date2Mjd(dateFromFileName);
}
return new TimeInfo(timesArray);
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import junit.framework.TestCase;
import org.openda.exchange.DoublesExchangeItem;
import org.openda.interfaces.ITimeInfo;
import org.openda.utils.OpenDaTestSupport;

import java.io.File;
Expand Down Expand Up @@ -31,7 +32,14 @@ public void test_givenWandaSeawatData_whenInitialized_thenExchangeItemsLoaded()
double[] values = dataExchangeItem.getValuesAsDoubles();
assertEquals("Data for 30 rows and 72 columns", 2160, values.length);
assertEquals("Get value from 20th row of 30 and 2nd column of 72", 0.10554802E+02, values[19 * 72 + 1]);


ITimeInfo timeInfo = dataExchangeItem.getTimeInfo();
assertNotNull(timeInfo);
double[] times = timeInfo.getTimes();
assertEquals(2, times.length);
assertEquals(59729.91736111111, times[0], 0.0000001d);
assertEquals(59729.95832175926, times[1], 0.0000001d);

values[1] = 123456.0;
dataExchangeItem.setValues(values);
wandaSeawatGridDataObject.finish();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ protected void setUp() {
}

public void test_givenWandaSeawatIniFile_whenInitialized_thenExchangeItemsLoaded() throws IOException {
// TODO: write start date time end date time according to dateformat
// TODO prevent new line wandaModel = .....
File file = new File(testRunDataDir, "example.ini");
WandaSeawatModelRunIniFileDataObject wandaSeawatModelRunIniFileDataObject = new WandaSeawatModelRunIniFileDataObject();
wandaSeawatModelRunIniFileDataObject.initialize(testRunDataDir, new String[]{file.getName()});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import junit.framework.TestCase;
import org.openda.exchange.DoublesExchangeItem;
import org.openda.interfaces.ITimeInfo;
import org.openda.utils.OpenDaTestSupport;

import java.io.File;
Expand Down Expand Up @@ -31,7 +32,15 @@ public void test_givenWandaSeawatData_whenInitialized_thenExchangeItemsLoaded()
DoublesExchangeItem doublesExchangeItem = (DoublesExchangeItem) exchangeItemObject;
assertEquals("Get first value from 20th row of 30 and 2nd column of 72", 0.10554802E+02, doublesExchangeItem.getValuesAsDoubles()[0]);
assertEquals("Get second value from 20th row of 30 and 2nd column of 72", 0.12345600E+02, doublesExchangeItem.getValuesAsDoubles()[1]);


ITimeInfo timeInfo = doublesExchangeItem.getTimeInfo();
assertNotNull(timeInfo);

double[] times = timeInfo.getTimes();
assertEquals(2, times.length);
assertEquals(59729.91736111111, times[0], 0.0000001d);
assertEquals(59729.91805555555, times[1], 0.0000001d);

doublesExchangeItem.setValuesAsDoubles(new double[]{0.10554802E+02, 0.65432100E+02});
wandaSeawatPointDataObject.finish();

Expand Down

0 comments on commit 2b62d85

Please sign in to comment.