root / org.gvsig.toolbox / trunk / org.gvsig.toolbox / org.gvsig.toolbox.algorithm / src / main / java / es / unex / sextante / hydrology / modelling / Hydrograph.java @ 59
History | View | Annotate | Download (6.32 KB)
1 |
package es.unex.sextante.hydrology.modelling; |
---|---|
2 |
|
3 |
public class Hydrograph { |
4 |
|
5 |
protected double m_dFlow[]; // in m3 |
6 |
protected int m_iTimeInterval; // in seconds |
7 |
private String m_sName; |
8 |
|
9 |
|
10 |
public Hydrograph(final int iInterval) { |
11 |
|
12 |
m_dFlow = new double[1]; |
13 |
m_iTimeInterval = iInterval; |
14 |
|
15 |
} |
16 |
|
17 |
|
18 |
public Hydrograph(final double[] H, |
19 |
final int iInterval) { |
20 |
|
21 |
m_dFlow = H; |
22 |
m_iTimeInterval = iInterval; |
23 |
|
24 |
} |
25 |
|
26 |
|
27 |
public void delay(final int iTime) {//in seconds |
28 |
|
29 |
int i;
|
30 |
final int iDelayIntervals = (int) ((double) iTime / (double) m_iTimeInterval); |
31 |
final double dFlow[] = new double[m_dFlow.length + iDelayIntervals]; |
32 |
|
33 |
for (i = 0; i < iDelayIntervals + 1; i++) { |
34 |
dFlow[i] = 0;
|
35 |
} |
36 |
for (i = 0; i < m_dFlow.length; i++) { |
37 |
dFlow[i + iDelayIntervals] = m_dFlow[i]; |
38 |
} |
39 |
m_dFlow = dFlow; |
40 |
|
41 |
} |
42 |
|
43 |
|
44 |
public void add(final Hydrograph Hyd) { |
45 |
|
46 |
double dFlow1 = 0; |
47 |
double dFlow2 = 0; |
48 |
|
49 |
if (Hyd.getTimeInterval() == m_iTimeInterval) {
|
50 |
final int iLength = Math.max(Hyd.getLengthInIntervals(), m_dFlow.length); |
51 |
final double dFlow[] = new double[iLength]; |
52 |
|
53 |
for (int i = 0; i < iLength; i++) { |
54 |
if (i >= Hyd.getLengthInIntervals()) {
|
55 |
dFlow1 = 0;
|
56 |
} |
57 |
else {
|
58 |
dFlow1 = Hyd.getFlow(m_iTimeInterval * i); |
59 |
} |
60 |
if (i >= m_dFlow.length) {
|
61 |
dFlow2 = 0;
|
62 |
} |
63 |
else {
|
64 |
dFlow2 = m_dFlow[i]; |
65 |
} |
66 |
dFlow[i] = dFlow1 + dFlow2; |
67 |
} |
68 |
m_dFlow = dFlow; |
69 |
} |
70 |
|
71 |
} |
72 |
|
73 |
|
74 |
public void add(final float fFlow) { |
75 |
|
76 |
for (int i = 0; i < m_dFlow.length; i++) { |
77 |
m_dFlow[i] += fFlow; |
78 |
} |
79 |
|
80 |
} |
81 |
|
82 |
|
83 |
/*public void MuskingumRouting(
|
84 |
float fK,
|
85 |
float fX) {
|
86 |
|
87 |
ArrayList RoutedHydrograph = new ArrayList();
|
88 |
int j = 0;
|
89 |
float fFlow1 = 0;
|
90 |
float fFlow0 = 0;
|
91 |
float fRoutedFlow = 0;
|
92 |
|
93 |
float fD = m_iTimeInterval / 3600f;
|
94 |
int iReaches = 1 + (int) (fK * 2f * fX * fD);
|
95 |
|
96 |
fK /= (float) iReaches;
|
97 |
for (int i = 0; i < iReaches; i++) {
|
98 |
float fC3 = fK - fK * fX + 0.5f * fD;
|
99 |
float fC0 = (-fK * fX + 0.5f * fD) / fC3;
|
100 |
float fC1 = (fK * fX + 0.5f * fD) / fC3;
|
101 |
float fC2 = (fK - fK * fX - 0.5f * fD) / fC3;
|
102 |
|
103 |
j = 0;
|
104 |
boolean bIn = false;
|
105 |
|
106 |
fRoutedFlow = m_fFlow[0];
|
107 |
RoutedHydrograph.clear();
|
108 |
RoutedHydrograph.add(new Float(fRoutedFlow));
|
109 |
do {
|
110 |
j++;
|
111 |
if (j < m_fFlow.length) {
|
112 |
fFlow1 = m_fFlow[j];
|
113 |
}// if
|
114 |
else {
|
115 |
fFlow1 = 0;
|
116 |
if (!bIn) {
|
117 |
break;// exit if Hydrogram is null//
|
118 |
}// if
|
119 |
}// else
|
120 |
if (j - 1 < m_fFlow.length) {
|
121 |
fFlow0 = m_fFlow[j - 1];
|
122 |
}// if
|
123 |
else {
|
124 |
fFlow0 = 0;
|
125 |
}// else
|
126 |
fRoutedFlow = Math.max(0,
|
127 |
fC0 * fFlow1 + fC1 * fFlow0 + fC2 * fRoutedFlow);
|
128 |
RoutedHydrograph.add(new Float(fRoutedFlow));
|
129 |
if (fRoutedFlow > 0.25f) {
|
130 |
bIn = true;
|
131 |
}// if
|
132 |
}while (fRoutedFlow > 0.25f || !bIn);
|
133 |
m_fFlow = new float[RoutedHydrograph.size()];
|
134 |
for (int k = 0; k < RoutedHydrograph.size(); k++) {
|
135 |
m_fFlow[k] = ((Float) RoutedHydrograph.get(k)).floatValue();
|
136 |
}// for
|
137 |
}// for
|
138 |
|
139 |
}// method*/
|
140 |
|
141 |
public double getFlow(final int iTime) { |
142 |
|
143 |
final int iIndex = (int) ((double) iTime / (double) m_iTimeInterval); |
144 |
|
145 |
return m_dFlow[iIndex];
|
146 |
|
147 |
} |
148 |
|
149 |
|
150 |
public int getTimeInterval() { |
151 |
|
152 |
return m_iTimeInterval;
|
153 |
|
154 |
} |
155 |
|
156 |
|
157 |
public int getLengthInIntervals() { |
158 |
|
159 |
return m_dFlow.length;
|
160 |
|
161 |
} |
162 |
|
163 |
|
164 |
public double getTotalRunoff() {// im m3 |
165 |
|
166 |
double dRunoff = 0; |
167 |
|
168 |
for (int i = 0; i < m_dFlow.length - 1; i++) { |
169 |
dRunoff += (m_dFlow[i] + m_dFlow[i + 1]) / 2.0 * m_iTimeInterval; |
170 |
} |
171 |
|
172 |
return dRunoff;
|
173 |
|
174 |
} |
175 |
|
176 |
|
177 |
public double getPeak() {// in m3 |
178 |
|
179 |
double dMax = Double.NEGATIVE_INFINITY; |
180 |
|
181 |
for (int i = 0; i < m_dFlow.length; i++) { |
182 |
if (m_dFlow[i] > dMax) {
|
183 |
dMax = m_dFlow[i]; |
184 |
} |
185 |
} |
186 |
|
187 |
return dMax;
|
188 |
|
189 |
} |
190 |
|
191 |
|
192 |
public int getPeakTime() {// in seconds |
193 |
|
194 |
double dMax = Double.NEGATIVE_INFINITY; |
195 |
int iMaxTime = 0; |
196 |
|
197 |
for (int i = 0; i < m_dFlow.length; i++) { |
198 |
if (m_dFlow[i] > dMax) {
|
199 |
dMax = m_dFlow[i]; |
200 |
iMaxTime = i * m_iTimeInterval; |
201 |
} |
202 |
} |
203 |
|
204 |
return iMaxTime;
|
205 |
|
206 |
} |
207 |
|
208 |
|
209 |
public double[] getFlowArray() { |
210 |
|
211 |
return m_dFlow;
|
212 |
|
213 |
} |
214 |
|
215 |
|
216 |
/*public Pt[] getPtArray() {
|
217 |
|
218 |
Pt PtArray[] = new Pt[m_fFlow.length];
|
219 |
|
220 |
for (int i = 0; i < m_fFlow.length; i++) {
|
221 |
PtArray[i] = new Pt((float) (m_iTimeInterval * i), m_fFlow[i]);
|
222 |
}// for
|
223 |
|
224 |
return PtArray;
|
225 |
|
226 |
}// method*/
|
227 |
|
228 |
public void multiply(final double fFactor) { |
229 |
|
230 |
for (int i = 0; i < m_dFlow.length; i++) { |
231 |
m_dFlow[i] *= fFactor; |
232 |
} |
233 |
|
234 |
} |
235 |
|
236 |
|
237 |
@Override
|
238 |
public String toString() { |
239 |
|
240 |
final StringBuffer sb = new StringBuffer(); |
241 |
|
242 |
sb.append("Caudal Punta : " + getPeak() + " m3/s\n"); |
243 |
sb.append("Tiempo al Pico : " + transformSecToHourMin(getPeakTime()) + " \n"); |
244 |
sb.append("Volumen total de escorrent?a : " + getTotalRunoff() + " m3\n"); |
245 |
sb.append("Duraci?n total del hidrograma : " + transformSecToHourMin(getLengthInIntervals() * m_iTimeInterval) + "\n"); |
246 |
|
247 |
return sb.toString();
|
248 |
|
249 |
} |
250 |
|
251 |
|
252 |
public static String transformSecToHourMin(final int iSec) { |
253 |
|
254 |
final int iHours = (int) ((double) iSec / 3600f); |
255 |
final int iMin = (int) ((double) (iSec - iHours * 3600) / 60.0); |
256 |
|
257 |
return new String(Integer.toString(iHours) + "h" + Integer.toString(iMin) + "min"); |
258 |
|
259 |
} |
260 |
|
261 |
|
262 |
public void setName(final String sName) { |
263 |
|
264 |
m_sName = sName; |
265 |
|
266 |
} |
267 |
|
268 |
|
269 |
public String getName() { |
270 |
|
271 |
return m_sName;
|
272 |
|
273 |
} |
274 |
|
275 |
|
276 |
} |