/Users/huttone/Devel/sedflux-new/sedflux/trunk/ew/hydrotrend/hydrosumflow.c

Go to the documentation of this file.
00001 /*
00002  *  HydroSumFlow.c
00003  *
00004  *  Sums the discharges from the snowmelt, icemelt
00005  *  and precipitation routines, calculates the
00006  *  annual peak flood.
00007  *
00008  *  Stores the lagged overflow and groundwater pool size
00009  *  for the following year.
00010  *
00011  *  Author:    M.D. Morehead  (June 1998)
00012  *  Author2:   S.D. Peckham   (December 2001)
00013  *  Author3:   A.J. Kettner   (August-October 2002)(February-April 2003)
00014  *
00015  *  Variable    Def.Location    Type    Units   Usage
00016  *  --------    ------------    ----    -----   -----
00017  *  err                 various                 int             -               error flag, halts program
00018  *  ii                  various                 int             -               temporary loop counter
00019  *  mtotal              HydroSumFlow.c  dbl             %               mass balance total
00020  *  p                   various                 int             -               temporary loop counter for events or outlets
00021  *  Qeventcounter HydroSumFlow.c int    -               
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  *  Start of HydroSumFlow
00034  *-------------------------*/
00035 int hydrosumflow()
00036 {
00037 /*-------------------
00038  *  Local Variables
00039  *-------------------*/
00040 int     err, ii, p, Qeventcounter, eventsoccure, x,y;
00041 double  mtotal, Qpeaktemp;
00042 
00043 /*------------------------
00044  *  Initialize Variables
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  *  Sum the daily flow (m^3/s) and find the annual peak.
00087  *  Sum the annual total annual flow (m^3/s) and evaporation (m^3)
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      *  Check is baseflow isn't > than Qbartotal[ep]
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      *  calculate Qsum daily with baseflow
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         } // ( end setstartmeanQandQs > 0 )     
00134         Qpeak = mx( Qpeak, Qsumtot[ii] );
00135                 
00136         /*-------------------------------------------------
00137          *  Find the largest Qpeak events of this year
00138          *  if the number of outlets is unknown or the
00139          *  Qfraction shifts per event over the outlets.
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                  *  Rearrange the events of this year
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         } /* end if ( steadyoutletpctflag == 1) */
00169         
00170         /*---------------------------------------------------
00171          *  Calculate the total discharge of the year,
00172          *  per outlet and for the total river (all outlets)
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 } /* end for daysiy */
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  *  Sum the carryover from/to the previous/next years
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  *  Set the minimum Qsum[i]
00204  *  This is done after the
00205  *  precipitation balance!!
00206  *---------------------------*/
00207 for (ii=0; ii<daysiy; ii++)
00208         if (Qsumtot[ii] < 0.1)
00209                 Qsumtot[ii] = 0.1;
00210 
00211 /*-----------------------------------------------
00212  *  Check the precipitation input balance (m^3)
00213  *-----------------------------------------------
00214  *  MPglacial  = Mass of precip as glacial/year
00215  *  MPnival    = Mass of precip as nival/year
00216  *  MPrain     = Mass of precip as rain/year
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  *  Check the mass balance (m^3)
00253  *-----------------------------------------------
00254  *  Msnowstart = Snow in basin at start of year
00255  *  Msnowend   = Snow in basin at end of year
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 }  /* end of HydroSumFlow.c */
00296 

Generated on Fri Jan 4 18:04:14 2008 for sedflux by  doxygen 1.5.2