package org.jgrasstools.hortonmachine.models.hm;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.HashMap;
import java.util.List;
import java.util.Map.Entry;
import java.util.Set;
import org.geotools.data.simple.SimpleFeatureCollection;
import org.jgrasstools.gears.io.shapefile.OmsShapefileFeatureReader;
import org.jgrasstools.gears.io.timeseries.OmsTimeSeriesReader;
import org.jgrasstools.hortonmachine.modules.networktools.trento_p.OmsTrentoP;
import org.jgrasstools.hortonmachine.modules.networktools.trento_p.utils.Constants;
import org.jgrasstools.hortonmachine.modules.networktools.trento_p.utils.DiametersReader;
import org.jgrasstools.hortonmachine.utils.HMTestCase;
import org.jgrasstools.hortonmachine.utils.HMTestMapstrentoP;
import org.joda.time.DateTime;
/**
* A test case for the trentoP-java model.
*
* @author Daniele Andreis
*
*/
public class TestTrentoP extends HMTestCase {
private final static double TOLL = 0.009;
private final static double[] INTERNAL_PARAMETERS = {1.2, 4, 40, 0.005, 0.15, 1, 30, 0.001, 0.01, 1.0, 4.43, 1.5, 0.38,
0.001, 1, 0.2, 0.4};
private final static double[] INTERNAL_PARAMETERS2 = {1.3, 4, 50, 0.001, 0.20, 1, 40, 0.001, 0.01, 1.0, 4.43, 1.5, 0.38,
0.001, 1, 0.2, 0.4};
/**
* This is a block of parameter that usually are used in the simulation of
* {@link OmsTrentoP}.
*/
private static double a = 60.4;
private static double n = 0.61;
private static double tau = 2.5;
private static double g = 0.8;
private static Integer align = 0;
/**
* Test project 1.
*
* Check the result in the project mode, for the file Mulinu.geo.
*
* @throws Exception
*/
public void testProject1() throws Exception {
double[][] result = null;
double[] globalparameters = INTERNAL_PARAMETERS;
OmsTrentoP trento_P = new OmsTrentoP();
URL diametersUrl = this.getClass().getClassLoader().getResource("diameters.csv");
DiametersReader diametersreader = new DiametersReader();
diametersreader.file = new File(diametersUrl.toURI()).getAbsolutePath();
diametersreader.pCols = 2;
diametersreader.pSeparator = "\\s+";
diametersreader.fileNovalue = "-9999.0";
diametersreader.readFile();
List<double[]> pipe = diametersreader.data;
// set parameters;
trento_P.pMode = 0; // project
trento_P.pA = a;
trento_P.pN = n;
trento_P.pTau = tau;
trento_P.pG = g;
trento_P.pAlign = align;
trento_P.pMinimumDepth = globalparameters[0];
trento_P.pMaxJunction = (int) globalparameters[1];
trento_P.pJMax = (int) globalparameters[2];
trento_P.pAccuracy = globalparameters[3];
trento_P.tDTp = globalparameters[4];
trento_P.tpMin = globalparameters[5];
trento_P.tpMax = globalparameters[6];
trento_P.pEpsilon = globalparameters[7];
trento_P.pMinG = globalparameters[8];
trento_P.pMinDischarge = globalparameters[9];
trento_P.pMaxTheta = globalparameters[10];
trento_P.pCelerityFactor = globalparameters[11];
trento_P.pExponent = globalparameters[12];
trento_P.pTolerance = globalparameters[13];
trento_P.pC = globalparameters[14];
trento_P.pGamma = globalparameters[15];
trento_P.pEspInflux = globalparameters[16];
trento_P.inDiameters = pipe;
trento_P.pOutPipe = 16;
URL net = this.getClass().getClassLoader().getResource("TestTrentoP1.shp");
File netFile = new File(net.toURI());
OmsShapefileFeatureReader netReader = new OmsShapefileFeatureReader();
netReader.file = netFile.getAbsolutePath();
netReader.readFeatureCollection();
SimpleFeatureCollection netFC = netReader.geodata;
// set global parameters
// verify
// SimpleFeatureCollection netFC=Utility.readShp(netFile);
trento_P.inPipes = netFC;
trento_P.process();
result = trento_P.getResults();
checkMatrixEqual(result, HMTestMapstrentoP.project1, TOLL);
}
/**
* Test project 1, rectangular.
*
* Check the result in the project mode, for the file Mulinu.geo.
*
* @throws Exception
*/
public void testProject1Rect() throws Exception {
double[][] result = null;
double[] globalparameters = INTERNAL_PARAMETERS;
OmsTrentoP trento_P = new OmsTrentoP();
// set parameters;
URL diametersUrl = this.getClass().getClassLoader().getResource("diameters.csv");
DiametersReader diametersreader = new DiametersReader();
diametersreader.file = new File(diametersUrl.toURI()).getAbsolutePath();
diametersreader.pCols = 2;
diametersreader.pSeparator = "\\s+";
diametersreader.fileNovalue = "-9999.0";
diametersreader.readFile();
List<double[]> pipe = diametersreader.data;
trento_P.pMode = 0; // project
trento_P.pA = a;
trento_P.pN = n;
trento_P.pTau = tau;
trento_P.pG = g;
trento_P.pAlign = align;
trento_P.pMinimumDepth = globalparameters[0];
trento_P.pMaxJunction = (int) globalparameters[1];
trento_P.pJMax = (int) globalparameters[2];
trento_P.pAccuracy = globalparameters[3];
trento_P.tDTp = globalparameters[4];
trento_P.tpMin = globalparameters[5];
trento_P.tpMax = globalparameters[6];
trento_P.pEpsilon = globalparameters[7];
trento_P.pMinG = globalparameters[8];
trento_P.pMinDischarge = globalparameters[9];
trento_P.pMaxTheta = globalparameters[10];
trento_P.pCelerityFactor = globalparameters[11];
trento_P.pExponent = globalparameters[12];
trento_P.pTolerance = globalparameters[13];
trento_P.pC = globalparameters[14];
trento_P.pGamma = globalparameters[15];
trento_P.pEspInflux = globalparameters[16];
trento_P.inDiameters = pipe;
trento_P.pOutPipe = 16;
URL net = this.getClass().getClassLoader().getResource("TestTrentoP1Rect.shp");
File netFile = new File(net.toURI());
OmsShapefileFeatureReader netReader = new OmsShapefileFeatureReader();
netReader.file = netFile.getAbsolutePath();
netReader.readFeatureCollection();
SimpleFeatureCollection netFC = netReader.geodata;
// set global parameters
// verify
// SimpleFeatureCollection netFC=Utility.readShp(netFile);
trento_P.inPipes = netFC;
trento_P.process();
result = trento_P.getResults();
checkMatrixEqual(result, HMTestMapstrentoP.project1Rectangular, TOLL);
}
/**
* Test project 1, rectangular.
*
* Check the result in the project mode, for the file Mulinu.geo.
*
* @throws Exception
*/
public void testProject1Trap() throws Exception {
double[][] result = null;
double[] globalparameters = INTERNAL_PARAMETERS;
OmsTrentoP trento_P = new OmsTrentoP();
// set parameters;
URL diametersUrl = this.getClass().getClassLoader().getResource("diameters.csv");
DiametersReader diametersreader = new DiametersReader();
diametersreader.file = new File(diametersUrl.toURI()).getAbsolutePath();
diametersreader.pCols = 2;
diametersreader.pSeparator = "\\s+";
diametersreader.fileNovalue = "-9999.0";
diametersreader.readFile();
List<double[]> pipe = diametersreader.data;
trento_P.pMode = 0; // project
trento_P.pA = a;
trento_P.pN = n;
trento_P.pTau = tau;
trento_P.pG = g;
trento_P.pAlign = align;
trento_P.pMinimumDepth = globalparameters[0];
trento_P.pMaxJunction = (int) globalparameters[1];
trento_P.pJMax = (int) globalparameters[2];
trento_P.pAccuracy = globalparameters[3];
trento_P.tDTp = globalparameters[4];
trento_P.tpMin = globalparameters[5];
trento_P.tpMax = globalparameters[6];
trento_P.pEpsilon = globalparameters[7];
trento_P.pMinG = globalparameters[8];
trento_P.pMinDischarge = globalparameters[9];
trento_P.pMaxTheta = globalparameters[10];
trento_P.pCelerityFactor = globalparameters[11];
trento_P.pExponent = globalparameters[12];
trento_P.pTolerance = globalparameters[13];
trento_P.pC = globalparameters[14];
trento_P.pGamma = globalparameters[15];
trento_P.pEspInflux = globalparameters[16];
trento_P.inDiameters = pipe;
trento_P.pOutPipe = 16;
URL net = this.getClass().getClassLoader().getResource("TestTrentoP1Trap.shp");
File netFile = new File(net.toURI());
OmsShapefileFeatureReader netReader = new OmsShapefileFeatureReader();
netReader.file = netFile.getAbsolutePath();
netReader.readFeatureCollection();
SimpleFeatureCollection netFC = netReader.geodata;
// set global parameters
// verify
// SimpleFeatureCollection netFC=Utility.readShp(netFile);
trento_P.inPipes = netFC;
trento_P.process();
result = trento_P.getResults();
checkMatrixEqual(result, HMTestMapstrentoP.project1Trapezio, TOLL);
}
/**
* Test project 1 with align set to 1.
*
* Check the result in the project mode, for the file Mulinu.geo.
*
* @throws Exception
*/
public void testProject1Align1() throws Exception {
double[][] result = null;
double[] globalparameters = INTERNAL_PARAMETERS;
URL diametersUrl = this.getClass().getClassLoader().getResource("diameters.csv");
DiametersReader diametersreader = new DiametersReader();
diametersreader.file = new File(diametersUrl.toURI()).getAbsolutePath();
diametersreader.pCols = 2;
diametersreader.pSeparator = "\\s+";
diametersreader.fileNovalue = "-9999.0";
diametersreader.readFile();
List<double[]> pipe = diametersreader.data;
OmsTrentoP trento_P = new OmsTrentoP();
// set parameters;
trento_P.pMode = 0; // project
trento_P.pA = a;
trento_P.pN = n;
trento_P.pTau = tau;
trento_P.pG = g;
trento_P.pAlign = 1;
trento_P.pMinimumDepth = globalparameters[0];
trento_P.pMaxJunction = (int) globalparameters[1];
trento_P.pJMax = (int) globalparameters[2];
trento_P.pAccuracy = globalparameters[3];
trento_P.tDTp = globalparameters[4];
trento_P.tpMin = globalparameters[5];
trento_P.tpMax = globalparameters[6];
trento_P.pEpsilon = globalparameters[7];
trento_P.pMinG = globalparameters[8];
trento_P.pMinDischarge = globalparameters[9];
trento_P.pMaxTheta = globalparameters[10];
trento_P.pCelerityFactor = globalparameters[11];
trento_P.pExponent = globalparameters[12];
trento_P.pTolerance = globalparameters[13];
trento_P.pC = globalparameters[14];
trento_P.pGamma = globalparameters[15];
trento_P.pEspInflux = globalparameters[16];
trento_P.inDiameters = pipe;
trento_P.pOutPipe = 16;
URL net = this.getClass().getClassLoader().getResource("TestTrentoP1.shp");
File netFile = new File(net.toURI());
OmsShapefileFeatureReader netReader = new OmsShapefileFeatureReader();
netReader.file = netFile.getAbsolutePath();
netReader.readFeatureCollection();
SimpleFeatureCollection netFC = netReader.geodata;
// set global parameters
// verify
// SimpleFeatureCollection netFC=Utility.readShp(netFile);
trento_P.inPipes = netFC;
trento_P.process();
result = trento_P.getResults();
checkMatrixEqual(result, HMTestMapstrentoP.project1align1, TOLL);
}
/**
*
* Check if the models work well in verify mode..
*
* @throws Exception
*
* @throws IOException
*/
public void testVerify1() throws Exception {
URL rainUrl = this.getClass().getClassLoader().getResource("rain_trentop.csv"); //$NON-NLS-1$
File rainFile = new File(rainUrl.toURI());
double[][] result = null;
double[] globalparameters = INTERNAL_PARAMETERS;
OmsTrentoP trento_P = new OmsTrentoP();
// set parameters;
trento_P.pMode = 1; // verify
trento_P.pMaxJunction = (int) globalparameters[1];
trento_P.pJMax = (int) globalparameters[2];
trento_P.pAccuracy = globalparameters[3];
trento_P.tpMax = globalparameters[6];
trento_P.pEpsilon = globalparameters[7];
trento_P.pMaxTheta = 6.28;
trento_P.pCelerityFactor = Constants.DEFAULT_CELERITY_FACTOR;
trento_P.pExponent = globalparameters[12];
trento_P.pTolerance = 0.01;
trento_P.pGamma = globalparameters[15];
trento_P.pEspInflux = globalparameters[16];
trento_P.pOutPipe = 16;
OmsTimeSeriesReader rainReader = new OmsTimeSeriesReader();
rainReader.fileNovalue = "-9999";
rainReader.file = rainFile.getAbsolutePath();
rainReader.read();
rainReader.close();
trento_P.inRain = rainReader.outData;
// set global parameters.
URL net = this.getClass().getClassLoader().getResource("TestTrentoP1Verifica.shp");
File netFile = new File(net.toURI());
OmsShapefileFeatureReader netReader = new OmsShapefileFeatureReader();
netReader.file = netFile.getAbsolutePath();
netReader.readFeatureCollection();
SimpleFeatureCollection netFC = netReader.geodata;
// set global parameters
// verify
trento_P.inPipes = netFC;
trento_P.process();
result = hashToMatrix(trento_P.outDischarge, trento_P.inRain, trento_P.getResults().length);
checkMatrixEqual(result, HMTestMapstrentoP.verify1, TOLL);
}
// /**
// * Test project 2.
// *
// * Check the result in the project mode, for the file Mulinu.geo.
// *
// * @throws Exception
// */
// public void testProject2() throws Exception {
// double[][] result = null;
// double[] globalparameters2 = INTERNAL_PARAMETERS2;
// OmsTrentoP trento_P = new OmsTrentoP();
// // set parameters;
// URL diametersUrl = this.getClass().getClassLoader().getResource("diameters.csv");
// DiametersReader diametersreader = new DiametersReader();
// diametersreader.file = new File(diametersUrl.toURI()).getAbsolutePath();
// diametersreader.pCols = 2;
// diametersreader.pSeparator = "\\s+";
// diametersreader.fileNovalue = "-9999.0";
// diametersreader.readFile();
// List<double[]> pipe = diametersreader.data;
// trento_P.pMode = 0; // project
// trento_P.pA = 60.5;
// trento_P.pN = 0.64;
// trento_P.pTau = 2.6;
// trento_P.pG = g;
// trento_P.pAlign = 1;
// trento_P.pMinimumDepth = globalparameters2[0];
// trento_P.pMaxJunction = (int) globalparameters2[1];
// trento_P.pJMax = (int) globalparameters2[2];
// trento_P.pAccuracy = globalparameters2[3];
// trento_P.tDTp = globalparameters2[4];
// trento_P.tpMin = globalparameters2[5];
// trento_P.tpMax = globalparameters2[6];
// trento_P.pEpsilon = globalparameters2[7];
// trento_P.pMinG = globalparameters2[8];
// trento_P.pMinDischarge = globalparameters2[9];
// trento_P.pMaxTheta = globalparameters2[10];
// trento_P.pCelerityFactor = globalparameters2[11];
// trento_P.pExponent = globalparameters2[12];
// trento_P.pTolerance = globalparameters2[13];
// trento_P.pC = globalparameters2[14];
// trento_P.pGamma = globalparameters2[15];
// trento_P.pEspInflux = globalparameters2[16];
// trento_P.inDiameters = pipe;
// trento_P.pOutPipe = 38;
// URL net = this.getClass().getClassLoader().getResource("TestTrentoP2Verifica.shp");
// File netFile = new File(net.toURI());
// OmsShapefileFeatureReader netReader = new OmsShapefileFeatureReader();
// netReader.file = netFile.getAbsolutePath();
// netReader.readFeatureCollection();
// SimpleFeatureCollection netFC = netReader.geodata;
// // set global parameters
// // verify
// // SimpleFeatureCollection netFC=Utility.readShp(netFile);
// trento_P.inPipes = netFC;
// trento_P.process();
// result = trento_P.getResults();
// checkMatrixEqual(result, HMTestMapstrentoP.projectTrentoP2, TOLL);
//
// }
private double[][] hashToMatrix( HashMap<DateTime, HashMap<Integer, double[]>> outDischarge,
HashMap<DateTime, double[]> inRain, int nStation ) {
// create the rains array from the input.
Set<Entry<DateTime, HashMap<Integer, double[]>>> dischargeSet = outDischarge.entrySet();
DateTime first = null;
DateTime second = null;
int l = outDischarge.size();
double[][] rainData = new double[l][nStation + 1];
int index = 0;
int dt = 0;
int n = outDischarge.size() - 1;
for( Entry<DateTime, HashMap<Integer, double[]>> dischargeRecord : dischargeSet ) {
DateTime dateTime = dischargeRecord.getKey();
HashMap<Integer, double[]> values = dischargeRecord.getValue();
if (first == null) {
first = dateTime;
rainData[index][0] = 1;
Set<Integer> tmp = values.keySet();
int i = 0;
for( Integer f : tmp ) {
rainData[index][i + 1] = values.get(f)[0];
i++;
}
} else if (second == null) {
second = dateTime;
dt = Math.abs(second.getMinuteOfDay() - first.getMinuteOfDay());
rainData[index][0] = rainData[index - 1][0] + dt;
Set<Integer> tmp = values.keySet();
int i = 0;
for( Integer f : tmp ) {
rainData[index][i + 1] = values.get(f)[0];
i++;
}
} else {
rainData[index][0] = rainData[index - 1][0] + dt;
int i = 0;
Set<Integer> tmp = values.keySet();
for( Integer f : tmp ) {
rainData[index][i + 1] = values.get(f)[0];
i++;
}
}
index++;
}
return rainData;
}
}