static void _MDBedloadFlux (int itemID) { float trnfac, rslope,Qday, alphabed,pixel_length; float rhofluid, rhosand, trneff,rhosed,rhowater,anglerep,degTOr; float Qb_kg_sec, Qb_kg_day; float upstream_Qb, deltaQb,i; char string [256]; // Set parameters rhofluid = 1000; // Fluid density rhosand = 2670; // Sand density trneff = 0.1; // Bedload efficency anglerep = 32.21; // Limiting angle degTOr = 1.745329252e-2; // 2.0*PI/360.0 convert degrees to radians alphabed = 1.0; trnfac = ( rhofluid * rhosand * trneff ) / ((rhosand - rhofluid) * tan( anglerep*degTOr )); //printf("Bedload,trnfac: %f\n",trnfac); pixel_length = pow( MFModelGetArea(itemID), 0.5 ); //printf("pixel_length: %f\n",pixel_length); rslope = MFVarGetFloat (_MDInMinSlopeID,itemID, 0.0)/pixel_length;// in % Qday = MFVarGetFloat (_MDInDischargeID ,itemID, 0.0); // in m3/s Qb_kg_sec = trnfac * rslope * pow( Qday, alphabed ); // in kg/s Qb_kg_day = Qb_kg_sec * (24*60*60); // in kg/s MFVarSetFloat (_MDOutBedloadFluxID, itemID, Qb_kg_sec); // Calculate Qb budget upstream_Qb = MFVarGetFloat (_MDInUpStreamQbID,itemID, 0.0); deltaQb = upstream_Qb - Qb_kg_sec; //local bedload budget MFVarSetFloat (_MDOutDeltaBedloadID, itemID, deltaQb); MFVarSetFloat (_MDInUpStreamQbID , itemID, (upstream_Qb*-1)); MFVarSetFloat (_MDInUpStreamQbID , itemID, Qb_kg_sec); }
static void _MDRunoffVolume (int itemID) { // Input float runoff; runoff = MFVarGetFloat (_MDInRunoffID, itemID, 0.0) * MFModelGetArea (itemID) / (MFModelGet_dt () * 1000.0); // if((itemID == 25014) && (runoff * 86400 < -0.000009)) printf("############ runoff = %f\n", runoff * 86400); //runoff = 0.0; //RJS 071511 MFVarSetFloat (_MDOutRunoffVolumeID, itemID, runoff); }
static void _MDQBARTpreprocess (int itemID) { int TimeStep,p,i,d,j; float Qday, Qbar,Qacc, Qbar_km3y,Qbar_m3s; float Qmax = 0; float Tday,Tbar,Tacc,A,T_time,T_old; float TupSlop,PixSize_km2; int n, nA; float mu, muA, M2, M2A, M3, M3A, del; float logQmax; float dummy; /*static int Max_itemID = 0;*/ //static int year_count=1; /*static float *PixelmaxQ;*/ /*static float **dailyQ; */ /*if (itemID > Max_itemID) {*/ /*Max_itemID=itemID+1;*/ /*printf("Max_itemID:%d\n",Max_itemID);*/ /*PixelmaxQ = (float*)malloc(Max_itemID*sizeof(float));*/ /*dailyQ = (float**) malloc(Max_itemID*sizeof(float*));*/ /*for (i = 1; i < Max_itemID+1; i++)*/ /*dailyQ[i] = (float*) malloc(366*sizeof(float));*/ /*for (i = 1; i < 366; i++)*/ /*for (j = 1; j < Max_itemID; j++)*/ /*dailyQ[j][i] = 0.0; */ /*} */ //printf("sizeof(Max_itemID):%d\n",(sizeof(PixelmaxQ)/sizeof(float))); /*static int pix=1;*/ /*static int day=1;*/ /*FILE * textfile;*/ //printf ("itemID:%d\n ", itemID); //printf("Max_itemID:%d\n",Max_itemID); if (MFDateGetDayOfYear() == 1) { MFVarSetFloat(_MDOutDischMaxID, itemID, 0.0); } Qday = MFVarGetFloat (_MDInDischargeID , itemID, 0.0); // in m3/s Qmax = MFVarGetFloat(_MDOutDischMaxID, itemID, 0.0); if (Qday > Qmax) { MFVarSetFloat(_MDOutDischMaxID, itemID, Qday); } else { MFVarSetFloat(_MDOutDischMaxID, itemID, Qmax); } if (MFDateGetDayOfYear() == 365) { //MFDateGetYearLength()) { Qmax = MFVarGetFloat(_MDOutDischMaxID, itemID, 0.0); logQmax = 0; if (Qmax > 0) logQmax = log10(Qmax); // online (onepass) variance calculation, continues in MDBankfullQcalc.c (T.Terriberry) nA = MFVarGetInt(_MDOutYearCountID, itemID, 0); n = nA + 1; muA = MFVarGetFloat(_MDOutMeanLogQMaxID, itemID, 0.0); M2A = MFVarGetFloat(_MDOutLogQMaxM2ID, itemID, 0.0); M3A = MFVarGetFloat(_MDOutLogQMaxM3ID, itemID, 0.0); del = logQmax - muA; mu = muA + del / n; M2 = M2A + (del * del * nA / n); M3 = M3A + (del * del * del * nA * (nA - 1) / (n * n)) + (3 * -M2A * del / n); MFVarSetInt(_MDOutYearCountID, itemID, n); MFVarSetFloat(_MDOutMeanLogQMaxID, itemID, mu); MFVarSetFloat(_MDOutLogQMaxM2ID, itemID, M2); MFVarSetFloat(_MDOutLogQMaxM3ID, itemID, M3); // call this just to make bankfull calcs and save vals dummy = MFVarGetFloat(_MDInBankfullQ5ID, itemID, 0.0); } // don't need to set missing vals to anything, dsAggregate annual in // postproc should just skip them. /*else {*/ /*MFVarSetInt(_MDOutYearsCountID, itemID, MFVarGetInt(_MDOutYearsCountID, itemID, 0));*/ /*MFVarSetFloat(_MDOutDischMaxMeanID, itemID, MFVarGetFloat(_MDOutDischMaxMeanID, itemID, 0.0));*/ /*}*/ //printf ("pix:%d\n ", pix); /*dailyQ[pix][day]=Qday;*/ //if (pix==1) printf ("pix=1. Qday=:%f\n ", Qday); /*pix++;*/ /*if (itemID==1){ //last pixelID*/ /*//printf ("day:%d\n ", day);*/ /*[>if (day==365){<]*/ /*if (MFDateGetDayOfYear() == MFDateGetYearLength()) {*/ /*printf("year count\n ");*/ /*//year_count++;*/ /*textfile = fopen("year_max_logQ.txt","a");*/ /*printf ("Writing to Scripts/year_max_logQ.txt\n");*/ /*for (p=1;p<Max_itemID;p++){*/ /*PixelmaxQ[p] = dailyQ[p][1];*/ /*//printf ("PixelmaxQ[p]:%f\n ", PixelmaxQ[p]);*/ /*for (d=2; d<366; d++){*/ /*if (PixelmaxQ[p] < dailyQ[p][d]) PixelmaxQ[p] = dailyQ[p][d];*/ /*}*/ /*if (PixelmaxQ[p]>0) PixelmaxQ[p]=log10(PixelmaxQ[p]);*/ /*fprintf (textfile,"%f ", PixelmaxQ[p]);*/ /*}*/ /*fprintf (textfile,"\n");*/ /*fclose (textfile);*/ /*Max_itemID = 0;*/ /*day = 0;*/ /*}*/ /*day++;*/ /*pix=1;*/ /*} */ //Geting the values of these parameters Qbar = MFVarGetFloat (_MDInDischMeanID , itemID, 0.0); // in m3/s Tday = MFVarGetFloat (_MDInAirTempID , itemID, 0.0); // in C // A = MFVarGetFloat (_MDInContributingAreaID, itemID, 0.0); //in km2 A = MFVarGetFloat (_MDInContributingAreaAccID, itemID, 0.0) + (MFModelGetArea (itemID)/(pow(1000,2)));// convert from m2 to km2 //calculating the contributing area MFVarSetFloat (_MDInContributingAreaAccID, itemID, A); PixSize_km2 =(MFModelGetArea(itemID)/pow(1000,2)); // printf("PixSize_km2: %f\n",PixSize_km2); // printf("A: %f\n",A); //Calculate Relief // LocalElev = MFVarGetFloat (_MDInElevationID , itemID, 0.0)/1000;//convert to km // printf("LocalElev: %f\n",LocalElev); // MaxElev = MFVarGetFloat (_MDOutElevationMaxID, itemID, 0.0); // if (A == PixSize_km2) MaxElev=LocalElev; // MFVarSetFloat (_MDOutElevationMaxID, itemID, -MaxElev); // MFVarSetFloat (_MDOutElevationMaxID, itemID, LocalElev); // printf("MaxElev: %f\n",MaxElev); // R = MaxElev-LocalElev; // printf("R: %f\n",R); MFVarSetInt (_MDOutBQART_AID, itemID, A); //MFVarSetInt (_MDOutBQART_RID, itemID, R); //Accumulate temperature TupSlop = MFVarGetFloat (_MDInAirTempAcc_spaceID, itemID, 0.0); T_old = MFVarGetFloat (_MDInAirTempAcc_timeID, itemID, 0.0) ; T_time = T_old+ Tday; Tacc = TupSlop + (T_time * PixSize_km2); MFVarSetFloat (_MDInAirTempAcc_spaceID, itemID, Tacc); MFVarSetFloat (_MDInAirTempAcc_timeID, itemID, T_time); //Accumulate discharge Qacc = (MFVarGetFloat (_MDInDischargeAccID, itemID, 0.0)+ Qday);// in m3/s MFVarSetFloat (_MDInDischargeAccID, itemID, Qacc); // Accumulate time steps TimeStep = (MFVarGetInt (_MDInTimeStepsID, itemID, 0.0)+1); MFVarSetInt (_MDInTimeStepsID, itemID, TimeStep); //Calculate moving avarege temperature (Tbar) and discharge Tbar = Tacc/TimeStep/A; Qbar_m3s = Qacc/TimeStep; //in m3/s MFVarSetFloat (_MDOutBQART_Qbar_m3sID, itemID, Qbar_m3s); if (Qbar_m3s > 0){ //convert to km3/y Qbar_km3y = (Qbar_m3s/(pow(1000,3)))*(365*24*60*60); }else Qbar_km3y = 0; // exporting outputs flux to files MFVarSetFloat (_MDOutBQART_TID, itemID, Tbar); MFVarSetFloat (_MDOutBQART_Qbar_km3yID, itemID, Qbar_km3y); }
static void _MDSpecCond (int itemID) { float stormflowVol = 0.0; float baseflowVol = 0.0; float runoffpoolreleaseVol = 0.0; float discharge = 0.0; float waterStorage = 0.0; // New Variables // float Developed = 0.0; float preFlux_SC = 0.0; float postFlux_SC = 0.0; float storeWater_SC = 0.0; float postStoreWater_SC = 0.0; float SCTotalIn = 0.0; float postConc_SC = 0.0; float massBalance_SC = 0.0; float localLoad_SC = 0.0; float baseflowConc_SC = 0.0; float stormflowConc_SC = 0.0; float surfflowConc_SC = 0.0; float clean_intrcp = 0.0; float airTemperature = 0.0; baseflowVol = MFVarGetFloat (_MDInBaseFlowID, itemID,0.0) * MFModelGetArea (itemID) / (MFModelGet_dt () * 1000.0); // TODO: Either need to define BaseFlowVolumeDef or calculate internally here. stormflowVol = MFVarGetFloat (_MDInStormRunoffTotalID, itemID,0.0) * MFModelGetArea (itemID) / (MFModelGet_dt () * 1000.0); runoffpoolreleaseVol = MFVarGetFloat (_MDInRunoffPoolReleaseID, itemID,0.0) * MFModelGetArea (itemID) / (MFModelGet_dt () * 1000.0); discharge = MFVarGetFloat (_MDInDischargeID, itemID, 0.0); // m3/sec, discharge leaving the grid cell, after routing! waterStorage = MFVarGetFloat (_MDInRiverStorageID, itemID, 0.0); // m3/sec, storage rate remaining in grid cell at end of timestep - routed to retention airTemperature = MFVarGetFloat (_MDInAirTemperatureID, itemID, 0.0); // degrees C // New Variables // Developed = MFVarGetFloat (_MDInSubFractionID, itemID, 0.0); // proportion developed land // DEFINE IONIC CONTENT: ic = m3*(uS/cm) // Assumes that ionic strength behaves linearly and conservatively. Strictly this is only valid when // ionic strength is controlled by a few conservative ions. Therefore, this is valid for salt impacted // streams; however, this breaks down at low ionic strength waters. Therefore - this deep in the chloride analysis // we are operating with the understanding that we are only really looking at chloride impacts - not chloride itself. - SZ 6/12/2014 preFlux_SC = MFVarGetFloat (_MDOutFlux_SCID, itemID, 0.0); // ic/day storeWater_SC = MFVarGetFloat (_MDOutStoreWater_SCID, itemID, 0.0); // ic/day /// BASEFLOW LOADING OF SPECIFIC CONDUCTANCE /// /// attributed to the groundwater and surface runoff pools - impervious runof is attributed with clean water /// [email protected] for details on loading estimation /// //baseflowConc_SC = 25.94 + 13.32 * (Developed); // Baseflow_SC relation (0.9 Quantile based) to Developed area. Developed should already be in PER clean_intrcp = 21.72;//25.94; baseflowConc_SC = clean_intrcp + 9.602 * (Developed); // Baseflow SC relation (regression to zero storm flow) to Devloped area. // Predicting dilution rate based on AWC and Ksat does not help time-series predictions. Though there is an apparent dependence on these factors in the lovotecs data. surfflowConc_SC = MDMaximum(0.64 * baseflowConc_SC,clean_intrcp); // 0.8244 // Average fraction of baseflow SC exhibited during storm events (at daily flow exceedance of 1% P1) stormflowConc_SC = (airTemperature < 2.0) ? 15.0*Developed/100.*baseflowConc_SC : MDMaximum(0.20 * baseflowConc_SC,0.8*clean_intrcp); // Winter-time salting. // Calculate input loadings localLoad_SC = (baseflowConc_SC * baseflowVol + surfflowConc_SC * runoffpoolreleaseVol + stormflowVol*stormflowConc_SC ) * 86400 ; // ic/day SCTotalIn = localLoad_SC + preFlux_SC + storeWater_SC; // ic/day if (discharge > 0.0000001) { // Calculate pre-tranformation concentration - for cells with accumulated discharge postConc_SC = SCTotalIn / (discharge * 86400.); // uS/cm } else { // Force concentrations to local values for minimal accumulation / dessicated cells postConc_SC = baseflowConc_SC; // Force negligible discharge to the baseflow concentration } //Calculates the fluxes/storage for the mixing (appropriate for speccond) case postFlux_SC = (discharge * MDConst_m3PerSecTOm3PerDay) * postConc_SC ; // ic/day postStoreWater_SC = (waterStorage ) * postConc_SC ; // ic/day // Calculates the mass balances massBalance_SC = (SCTotalIn - (postFlux_SC + postStoreWater_SC )) / SCTotalIn; // Print mass balance errors if (MFDateGetCurrentYear() > 0){ if ( (massBalance_SC > 0.001)) { printf("itemID = %d, %d-%d-%d, MB_SC = %f\n",itemID, MFDateGetCurrentYear(), MFDateGetCurrentMonth(), MFDateGetCurrentDay(), massBalance_SC); printf("\tTotalIn: %f, Local: %f , UpFlux: %f, InStore: %f\n",SCTotalIn,localLoad_SC,preFlux_SC,storeWater_SC); printf("\tDownFlux: %f, discharge; %f, OutStore: %f , storage: %f\n",postFlux_SC,discharge, postStoreWater_SC,waterStorage); } // Debug prints //if ((itemID == 8310)) { //printf("itemID = %d, order %f, Store_SC %f, Store %f Store2 %f StoreDelta %f StorePrev %f StoreSCconc %f \n ",itemID, order, storeWater_SC, waterStorage*86400.,(discharge - dischargePre)*86400.,waterStorageChange*86400.,waterStoragePrev, storeWater_SC / waterStoragePrev ) ; //} //if (postConc_SC < 21.70){ //printf("itemID = %d, order %f, Store_SC %f, Store %f Store2 %f StoreDelta %f StorePrev %f StoreSCconc %f \n ",itemID, order, storeWater_SC, waterStorage*86400.,(discharge - dischargePre)*86400.,waterStorageChange*86400.,waterStoragePrev, storeWater_SC / waterStoragePrev ) ; // printf("itemID %d ro %f bf %f srf %f str %f bfSC %f srfSC %f strSC %f \n",itemID,runoffVol,baseflowVol,runoffpoolreleaseVol,stormflowVol,baseflowConc_SC,stormflowConc_SC,clean_intrcp); //} } // Set Output MFVarSetFloat (_MDOutFlux_SCID, itemID, postFlux_SC); MFVarSetFloat (_MDOutLocalLoadSCID, itemID, localLoad_SC); MFVarSetFloat (_MDOutPostConc_SCID, itemID, postConc_SC); MFVarSetFloat (_MDOutStoreWater_SCID, itemID, postStoreWater_SC); }