Statistics
| Revision:

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
}