00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include <stdlib.h>
00026 #include <math.h>
00027 #include "hydroclimate.h"
00028 #include "hydroparams.h"
00029 #include "hydrotimeser.h"
00030 #include "hydroinout.h"
00031
00032
00033
00034
00035 int hydrosumflow()
00036 {
00037
00038
00039
00040 int err, ii, p, Qeventcounter, eventsoccure, x,y;
00041 double mtotal, Qpeaktemp;
00042
00043
00044
00045
00046 err = 0;
00047 Ewetannual = 0.0;
00048 mtotal = 0.0;
00049 Minput = 0.0;
00050 Moutput = 0.0;
00051 MEtotal = 0.0;
00052 MQprevious = 0.0;
00053 MQnext = 0.0;
00054 Qtotal = 0.0;
00055 Qeventcounter = 0;
00056 eventsperyear = 0;
00057 eventsoccure = 0;
00058
00059 if (yr == syear[ep]){
00060 Qgrandtotal[ep] = 0.0;
00061 for (x=0; x<eventsnr[ep]; x++){
00062 if ( setstartmeanQandQs > 0 ){
00063 daysievent[x] = 0;
00064 for (p=0; p<maxnoutlet; p++)
00065 Qgrandtotaloutlet[ep][p][x] = 0.0;
00066 }
00067 }
00068 }
00069 for (p=0; p<maxnoutlet; p++){
00070 Qpeakperoutlet[p] = 1.0;
00071 Qtotaloutletannual[p] = 0.0;
00072 if (setstartmeanQandQs > 0 )
00073 for (x=0; x<eventsnr[ep]; x++)
00074 Qtotaloutlet[p][x] = 0.0;
00075 }
00076 Qpeak = 1.0;
00077 if ( setstartmeanQandQs > 0 )
00078 for (p=0; p<eventsnr[ep]; p++){
00079 Qpeakevents[p] = 1.0;
00080 numberday[p] = 0;
00081 }
00082
00083 for (ii=0; ii<daysiy; ii++) {
00084
00085
00086
00087
00088
00089 if ( setstartmeanQandQs == 0 ){
00090 Qsumtot[ii] = Qice[ii] + Qnival[ii] + Qrain[ii] + Qss[ii] + Qexceedgw[ii];
00091 if ( steadyoutletpctflag == 1 )
00092 if ( floodvalue[ep] > 0.0 && Qsumtot[ii] > floodvalue[ep] ){
00093 floodcounter++;
00094 Qpeakfloodtemp[yr-syear[ep]][ii] = Qsumtot[ii];
00095 }
00096 }
00097
00098 if ( setstartmeanQandQs > 0 ){
00099
00100
00101
00102 if ( baseflowtot[ep] > Qbartotal[ep] ){
00103 fprintf( stderr, "ERROR: in HydroSumFlow.c; setstartmeanQandQs=%d \n", setstartmeanQandQs );
00104 fprintf( stderr, " baseflow is higher than your average discharge in year %d:\n",yr );
00105 fprintf( stderr, " baseflow = %e, Qbar= %e. \n",baseflowtot[ep],Qbartotal[ep] );
00106 fprintf( stderr, "Qgrandtotal[ep]=%e. \n",Qgrandtotal[ep]);
00107 exit(-1);
00108 }
00109 Qsumtot[ii] = (( Qbartotal[ep] - baseflowtot[ep])/Qbartotal[ep])* (Qice[ii] + Qnival[ii] + Qrain[ii]+ Qss[ii] + Qexceedgw[ii]) + baseflowtot[ep];
00110 if ( steadyoutletpctflag == 1 ){
00111 for ( p=0; p<eventsnr[ep]; p++ )
00112 if ( Qsumtot[ii] == Qpeakallevents[ep][p] && eventcounter < (eventsnr[ep]-1) ){
00113 eventcounter++;
00114 numberday[eventsperyear] = ii;
00115 eventsperyear++;
00116 p = eventsnr[ep];
00117 }
00118 }
00119
00120
00121
00122
00123 if ( outletmodelflag == 1 )
00124 for ( p=0; p<maxnoutlet; p++ ){
00125 Qsum[ii][p] = Qsumtot[ii] * outletpct[p][ep][eventcounter];
00126 if (Qsum[ii][p] > 10000){
00127 printf("setstartmeanQandQs=%d\n",setstartmeanQandQs);
00128 printf("outletpct[p][ep][eventcounter]=%f\n\n",outletpct[p][ep][eventcounter]);
00129 printf("Qsum=%f, outlet=%d, Qsumtot=%f\n",Qsum[ii][p],p, Qsumtot[ii]);
00130 }
00131 }
00132 daysievent[eventcounter]++;
00133 }
00134 Qpeak = mx( Qpeak, Qsumtot[ii] );
00135
00136
00137
00138
00139
00140
00141 if ( steadyoutletpctflag == 1 && setstartmeanQandQs > 0){
00142 for ( p=0; p<eventsnr[ep]; p++ ) {
00143 eventsoccure = 0;
00144 if (Qpeakevents[p] < Qsumtot[ii] && Qeventcounter == (eventsnr[ep]-1)){
00145 Qpeakevents[p] = mx(Qpeakevents[p], Qsumtot[ii]);
00146 eventsoccure = 1;
00147 p = eventsnr[ep];
00148 }
00149 if (Qpeakevents[p] < Qsumtot[ii] && Qeventcounter != (eventsnr[ep]-1) && Qpeakevents[p] == 1.0){
00150 Qpeakevents[p] = mx(Qpeakevents[p], Qsumtot[ii]);
00151 Qeventcounter++;
00152 eventsoccure = 1;
00153 p = eventsnr[ep];
00154 }
00155 }
00156
00157
00158
00159
00160 if (eventsoccure == 1)
00161 for (p=0; p<eventsnr[ep]-1; p++)
00162 while (Qpeakevents[p] > Qpeakevents[p+1]){
00163 Qpeaktemp = Qpeakevents[p+1];
00164 Qpeakevents[p+1] = Qpeakevents[p];
00165 Qpeakevents[p] = Qpeaktemp;
00166 p = 0;
00167 }
00168 }
00169
00170
00171
00172
00173
00174 Qtotal +=Qsumtot[ii];
00175 if (outletmodelflag == 1 && setstartmeanQandQs > 0){
00176 for (p=0; p<maxnoutlet; p++){
00177 Qpeakperoutlet[p] = mx( Qpeakperoutlet[p], Qsum[ii][p] );
00178 Qtotaloutlet[p][eventcounter] += Qsum[ii][p];
00179 }
00180 }
00181 Ewetannual += ( Egw[ii] * totalarea[ep] ) + ( Ecanopy[ii] * rainarea[ii] );
00182 }
00183 Qtotal *= dTOs;
00184 Qgrandtotal[ep] += Qtotal;
00185 if (outletmodelflag == 1 && setstartmeanQandQs > 0)
00186 for (p=0; p<maxnoutlet; p++)
00187 for (y=eventcounter-eventsperyear; y <eventcounter+1; y++){
00188 Qtotaloutlet[p][y] *= dTOs;
00189 Qgrandtotaloutlet[ep][p][y] += Qtotaloutlet[p][y];
00190 Qtotaloutletannual[p] += Qtotaloutlet[p][y];
00191 }
00192 MEtotal += Enivalannual*totalarea[ep] + Eiceannual*glacierarea + Ewetannual;
00193
00194
00195
00196
00197 for (ii=0; ii<maxday-daysiy; ii++)
00198 MQprevious += (Qrainwrap[ii] + Qicewrap[ii] + Qnivalwrap[ii] + Qsswrap[ii])*dTOs;
00199 for (ii=daysiy; ii<maxday; ii++)
00200 MQnext += (Qrain[ii] + Qice[ii] + Qnival[ii] + Qss[ii])*dTOs;
00201
00202
00203
00204
00205
00206
00207 for (ii=0; ii<daysiy; ii++)
00208 if (Qsumtot[ii] < 0.1)
00209 Qsumtot[ii] = 0.1;
00210
00211
00212
00213
00214
00215
00216
00217
00218 if ( setstartmeanQandQs == 0 ){
00219 Moutput = MPnival + MPglacial + MPrain;
00220 Minput = (Pannual) * totalarea[ep];
00221 mtotal = (Moutput - Minput) / Moutput;
00222
00223 if (fabs(mtotal) > masscheck ) {
00224 fprintf( stderr, "ERROR: in HydroSumFlow.c: \n" );
00225 fprintf( stderr, " Precipitation Balance Error: fabs(mtotal) > masscheck \n" );
00226 fprintf( stderr, " note: masscheck set in HydroParams.h \n" );
00227 fprintf( stderr, " masscheck = %e \n", masscheck );
00228 fprintf( stderr, " mtotal = %e (%%) \n", mtotal );
00229 fprintf( stderr, " Minput = %e (m^3/a) \n", Minput );
00230 fprintf( stderr, " Moutput = %e (m^3/a) \n", Moutput );
00231 fprintf( stderr, " out-in = %e (m^3/a) \n", Moutput-Minput );
00232
00233 fprintf( stderr, " Year = %d \n", yr );
00234 fprintf( stderr, " Epoch = %d \n\n", ep+1 );
00235
00236 fprintf( stderr," Minput = (Pannual)*totalarea[ep] \n" );
00237 fprintf( stderr," \t Minput \t = \t %e (m^3) \n", Minput );
00238 fprintf( stderr," \t Pannual \t = \t %e (m^3) \n", Pannual*totalarea[ep] );
00239 fprintf( stderr," \t Pannual \t = \t %e (m) \n", Pannual );
00240 fprintf( stderr," \t Pbaseflow \t = \t %e (m) \n\n", baseflowtot[ep]*totalarea[ep] );
00241
00242 fprintf( stderr," Moutput = MPnival + MPglacial + MPrain \n" );
00243 fprintf( stderr," \t Moutput \t = \t %e (m^3) \n", Moutput );
00244 fprintf( stderr," \t MPnival \t = \t %e (m^3) \n", MPnival );
00245 fprintf( stderr," \t MPglacial \t = \t %e (m^3) \n", MPglacial );
00246 fprintf( stderr," \t MPrain \t = \t %e (m^3) \n\n", MPrain );
00247
00248 err = 1;
00249 }
00250
00251
00252
00253
00254
00255
00256
00257 Minput = Pannual*totalarea[ep] + gwlast + Gmass + Msnowstart + MQprevious;
00258 Moutput = MEtotal + Qtotal + gwstore[daysiy-1] + Msnowend + MQnext;
00259 mtotal = (Minput - Moutput) / Moutput;
00260
00261 if (fabs(mtotal) > masscheck) {
00262 fprintf( stderr, "ERROR: in HydroSumFlow.c: \n" );
00263 fprintf( stderr, " Mass Balance Error: fabs(mtotal) > masscheck \n" );
00264 fprintf( stderr, " note: masscheck set in HydroParams.h \n" );
00265 fprintf( stderr, " masscheck = %e \n", masscheck );
00266 fprintf( stderr, " mtotal = %e (%%) \n", mtotal );
00267 fprintf( stderr, " Minput = %e (m^3/a) \n", Minput );
00268 fprintf( stderr, " Moutput = %e (m^3/a) \n", Moutput );
00269 fprintf( stderr, " out-in = %e (m^3/a) \n", Moutput-Minput );
00270
00271 fprintf( stderr, " Year = %d \n", yr );
00272 fprintf( stderr, " Epoch = %d \n", ep+1 );
00273 fprintf( stderr, " counterQandQs = %d \n\n", setstartmeanQandQs );
00274
00275 fprintf( stderr," Minput = Pannual + gwlast + previousice + previousnival + MQprevious \n" );
00276 fprintf( stderr," \t Minput \t = \t\t\t %e (m^3) \n", Minput );
00277 fprintf( stderr," \t Pannual \t = %e (m) \t %e (m^3)\n", Pannual, Pannual*totalarea[ep] );
00278 fprintf( stderr," \t gwlast \t = \t\t\t %e (m^3) \n", gwlast );
00279 fprintf( stderr," \t Gmass \t\t = \t\t\t %e (m^3) \n", Gmass );
00280 fprintf( stderr," \t Msnowstart \t = \t\t\t %e (m^3) \n", Msnowstart );
00281 fprintf( stderr," \t MQprevious \t = \t\t\t %e (m^3) \n\n", MQprevious );
00282
00283 fprintf( stderr," Moutput = MEtotal + Qtotal + gwstore + nextice + nextnival + MQnext \n" );
00284 fprintf( stderr," \t Moutput \t = \t %e (m^3) \n", Moutput );
00285 fprintf( stderr," \t MEtotal \t = \t %e (m^3)\n", MEtotal );
00286 fprintf( stderr," \t Qtotal \t = \t %e (m^3) \n", Qtotal );
00287 fprintf( stderr," \t gwstore[daysiy-1] = \t %e (m^3) \n", gwstore[daysiy-1] );
00288 fprintf( stderr," \t Msnowend \t = \t %e (m^3) \n", Msnowend );
00289 fprintf( stderr," \t MQnext \t = \t %e (m^3) \n", MQnext );
00290
00291 err = 1;
00292 }
00293 }
00294 return(err);
00295 }
00296