static void _MDWTempSurfRunoffPool (int itemID) { float SurfRunoffT; float SurfRunoffPoolT; float SurfRunoff; float SurfRunoffPool; SurfRunoffT = MFVarGetFloat (_MDInWTempSurfRunoffID, itemID, 0.0); SurfRunoffPoolT = MFVarGetFloat (_MDOutWTempSurfRunoffPoolID, itemID, 0.0); SurfRunoff = MFVarGetFloat (_MDInRainSurfRunoffID, itemID, 0.0); SurfRunoffPool = MFVarGetFloat (_MDInRunoffPoolID, itemID, 0.0); SurfRunoff = MDMaximum(0, SurfRunoff); SurfRunoffPool = MDMaximum(0, SurfRunoffPool); if (!isnan(SurfRunoffPool) && !isnan(SurfRunoff) && ((SurfRunoffPool + SurfRunoff) > 0) && !isnan(SurfRunoffPoolT) && !isnan(SurfRunoffT)){ SurfRunoffPoolT = MDMaximum(((SurfRunoffPool * SurfRunoffPoolT) + (SurfRunoff * SurfRunoffT)) / (SurfRunoffPool + SurfRunoff), 0.0); MFVarSetFloat (_MDOutWTempSurfRunoffPoolID, itemID, SurfRunoffPoolT); } else{ MFVarSetMissingVal(_MDOutWTempSurfRunoffPoolID,itemID); } }
static void _MDWTempGrdWater (int itemID) { float airT; float RechargeT; float GrdWaterT; float RainRechargeIn; float IrrReturnFlow; float GrdWaterStorage; airT = MFVarGetFloat (_MDInAirTempID, itemID, 0.0); RechargeT = MFVarGetFloat (_MDInWTempSurfRunoffID, itemID, 0.0); RainRechargeIn = MFVarGetFloat (_MDInRainRechargeID, itemID, 0.0); if (_MDInIrrReturnFlowID != MFUnset){ IrrReturnFlow = MFVarGetFloat (_MDInIrrReturnFlowID, itemID, 0.0); } else { IrrReturnFlow = 0; } GrdWaterStorage = MFVarGetFloat (_MDOutGrdWaterID, itemID, 0.0); GrdWaterT = MFVarGetFloat (_MDOutWTempGrdWaterID, itemID, 0.0); //if (itemID == 233){ // printf("Stop itemID %d day %d \n", itemID, MFDateGetCurrentDay()); // } //TODO: why is RainRechargeIn < 0 sometimes? RainRechargeIn = MDMaximum(0, RainRechargeIn); IrrReturnFlow = MDMaximum(0, IrrReturnFlow); GrdWaterStorage = MDMaximum(0, GrdWaterStorage); if (!isnan(GrdWaterStorage) && !isnan(RainRechargeIn) && !isnan(IrrReturnFlow) && ((GrdWaterStorage + RainRechargeIn + IrrReturnFlow) > 0) && !isnan(GrdWaterT) && !isnan(RechargeT) && !isnan(airT)){ GrdWaterT = MDMaximum( (((GrdWaterStorage * GrdWaterT) + (RainRechargeIn * RechargeT) + (IrrReturnFlow * airT)) / (GrdWaterStorage + RainRechargeIn + IrrReturnFlow)), 0.0); // if (GrdWaterT > 30){ // printf("Stop itemID %d day %d \n", itemID, MFDateGetCurrentDay()); // } // GrdWaterT = MDMinimum(GrdWaterT, 40); //does this need to be properly mass balanced? GRdwater T might just keep going up. MFVarSetFloat (_MDOutWTempGrdWaterID,itemID,GrdWaterT); } else{ MFVarSetMissingVal(_MDOutWTempGrdWaterID,itemID); } if (GrdWaterT > 100) printf("m = %d, d = %d, itemID = %d, GrdWaterT = %f, RainRechargeIn = %f\n", MFDateGetCurrentMonth (), MFDateGetCurrentDay (), itemID, GrdWaterT, RainRechargeIn); // if (itemID == 486) printf("y = %d, m = %d, d = %d, GwT = %f, ReT = %f, AirT = %f, Recharge = %f, GW = %f\n", MFDateGetCurrentYear(), MFDateGetCurrentMonth(), MFDateGetCurrentDay(), GrdWaterT, RechargeT, airT, RainRechargeIn, GrdWaterStorage); }
static void _MDRainPotETPsTaylor (int itemID) { // Priestley and Taylor (1972) PE in mm for day // Input float dayLen; // daylength in fraction of day float i0hDay; // daily potential insolation on horizontal [MJ/m2] float albedo; // albedo float airT; // air temperatur [degree C] float solRad; // daily solar radiation on horizontal [MJ/m2] float vPress; // daily average vapor pressure [kPa] float sHeat = 0.0; // average subsurface heat storage for day [W/m2] // Local float solNet; // average net solar radiation for daytime [W/m2] float lngNet; // average net longwave radiation for day [W/m2] float aa; // available energy [W/m2] float es; // vapor pressure at airT [kPa] float delta; // dEsat/dTair [kPa/K] float dd; // vapor pressure deficit [kPa] float le; // latent heat [W/m2] // Output float pet; if (MFVarTestMissingVal (_MDInDayLengthID, itemID) || MFVarTestMissingVal (_MDInI0HDayID, itemID) || MFVarTestMissingVal (_MDInCParamAlbedoID, itemID) || MFVarTestMissingVal (_MDInAtMeanID, itemID) || MFVarTestMissingVal (_MDInSolRadID, itemID) || MFVarTestMissingVal (_MDInVPressID, itemID)) { MFVarSetMissingVal (_MDOutPetID,itemID); return; } dayLen = MFVarGetFloat (_MDInDayLengthID, itemID, 0.0); i0hDay = MFVarGetFloat (_MDInI0HDayID, itemID, 0.0); albedo = MFVarGetFloat (_MDInCParamAlbedoID, itemID, 0.0); airT = MFVarGetFloat (_MDInAtMeanID, itemID, 0.0); solRad = MFVarGetFloat (_MDInSolRadID, itemID, 0.0); vPress = MFVarGetFloat (_MDInVPressID, itemID, 0.0); solNet = (1.0 - albedo) * solRad / MDConstIGRATE; lngNet = MDSRadNETLong (i0hDay,airT,solRad,vPress); aa = solNet + lngNet - sHeat; es = MDPETlibVPressSat (airT); delta = MDPETlibVPressDelta (airT); dd = es - vPress; le = MDConstPTALPHA * delta * aa / (delta + MDConstPSGAMMA); pet = MDConstEtoM * MDConstIGRATE * le; MFVarSetFloat (_MDOutPetID,itemID,pet); }
static void _MDAccumBalance (int itemID) { // Input double precip; // Precipitation [mm/dt] double evap; // Evapotranspiration [mm/dt] double sMoistChg; // Soil moisture change [mm/dt] double grdWatChg; // Groundwater change [mm/dt] double runoff; // Runoff [mm/dt] if (MFVarTestMissingVal (_MDInAccPrecipID, itemID) || MFVarTestMissingVal (_MDInAccEvapID, itemID) || MFVarTestMissingVal (_MDInAccSMoistChgID, itemID) || MFVarTestMissingVal (_MDInAccGrdWatChgID, itemID) || MFVarTestMissingVal (_MDInAccRunoffID, itemID)) MFVarSetMissingVal (_MDOutAccBalanceID,itemID); else { precip = MFVarGetFloat(_MDInAccPrecipID, itemID, 0.0); evap = MFVarGetFloat(_MDInAccEvapID, itemID, 0.0); sMoistChg = MFVarGetFloat(_MDInAccSMoistChgID, itemID, 0.0); grdWatChg = MFVarGetFloat(_MDInAccGrdWatChgID, itemID, 0.0); runoff = MFVarGetFloat(_MDInAccRunoffID, itemID, 0.0); MFVarSetFloat(_MDOutAccBalanceID, itemID, precip + evap + sMoistChg + grdWatChg + runoff); } }
static void _MDRainPotETPstd (int itemID) { // Penman (1948) PE in mm for day also given by Chidley and Pike (1970) // Input float dayLen; // daylength in fraction of day float i0hDay; // daily potential insolation on horizontal [MJ/m2] float albedo; // albedo float airT; // air temperatur [degree C] float solRad; // daily solar radiation on horizontal [MJ/m2] float vPress; // daily average vapor pressure [kPa] float wSpeed; // average wind speed for the day [m/s] float sHeat = 0.0; // average subsurface heat storage for day [W/m2] // Local float solNet; // average net solar radiation for day [W/m2] float novern; // sunshine duration fraction of daylength float effem; // effective emissivity from clear sky float cldCor; // cloud cover correction to net longwave under clear sky float lngNet; // average net longwave radiation for day [W/m2] float aa; // available energy [W/m2] float fu; // Penman wind function, [mm d-1 kPa-1] float es; // vapor pressure at airT [kPa] float delta; // dEsat/dTair [kPa/K] // Output float pet; if (MFVarTestMissingVal (_MDInDayLengthID, itemID) || MFVarTestMissingVal (_MDInI0HDayID, itemID) || MFVarTestMissingVal (_MDInCParamAlbedoID, itemID) || MFVarTestMissingVal (_MDInAtMeanID, itemID) || MFVarTestMissingVal (_MDInSolRadID, itemID) || MFVarTestMissingVal (_MDInVPressID, itemID) || MFVarTestMissingVal (_MDInWSpeedID, itemID)) { MFVarSetMissingVal (_MDOutPetID,itemID); return; } dayLen = MFVarGetFloat (_MDInDayLengthID, itemID, 12.0); i0hDay = MFVarGetFloat (_MDInI0HDayID, itemID, 0.0); albedo = MFVarGetFloat (_MDInCParamAlbedoID, itemID, 0.0); airT = MFVarGetFloat (_MDInAtMeanID, itemID, 0.0); solRad = MFVarGetFloat (_MDInSolRadID, itemID, 0.0); vPress = MFVarGetFloat (_MDInVPressID, itemID, 0.0); wSpeed = fabs (MFVarGetFloat (_MDInWSpeedID, itemID, 0.0)); if (wSpeed < 0.2) wSpeed = 0.2; solNet = (1.0 - albedo) * solRad / MDConstIGRATE; // net solar with Penman (1948) albedo of 0.25 effem = 0.44 + 0.252 * sqrt (vPress); // Brunt method for effective emissivity with Penman (1948) coefficients novern = ((solRad / i0hDay) - 0.18) / 0.55; // Penman's relation of SOLRAD / I0HDAY to sunshine duration n/N if (novern > 1.0) novern = 1.0; cldCor = 0.1 + 0.9 * novern; //Penman's (1948) longwave cloud correction coefficient lngNet = (effem - 1.0) * cldCor * MDConstSIGMA * pow (airT + 273.15,4.0); aa = solNet + lngNet - sHeat; es = MDPETlibVPressSat (airT); delta = MDPETlibVPressDelta (airT); fu = 2.6 * (1.0 + 0.54 * wSpeed); // Penman wind function given by Brutsaert (1982) eq 10.17 // Penman equation from Brutsaert eq 10.15 pet = (delta * MDConstEtoM * MDConstIGRATE * aa + MDConstPSGAMMA * fu * (es - vPress)) / (delta + MDConstPSGAMMA); MFVarSetFloat (_MDOutPetID,itemID,pet); }
static void _MDRainPotETSWGday (int itemID) { // daily Shuttleworth-Wallace-Gurney (1985, 1990) PE in mm for day // Input float dayLen; // daylength in fraction of day float i0hDay; // daily potential insolation on horizontal [MJ/m2] float albedo; // albedo float height; // canopy height [m] float lWidth; // average leaf width [m] float rss; // soil surface resistance [s/m] float r5; // solar radiation at which conductance is halved [W/m2] float cd; // vpd at which conductance is halved [kPa] float cr; // light extinction coefficient for projected LAI float glMax; // maximum leaf surface conductance for all sides of leaf [m/s] float z0g; // z0g - ground surface roughness [m] float lai; // projected leaf area index float sai; // projected stem area index float airT; // air temperatur [degree C] float airTMin; // daily minimum air temperature [degree C] float solRad; // daily solar radiation on horizontal [MJ/m2] float vPress; // daily average vapor pressure [kPa] float wSpeed; // average wind speed for the day [m/s] float sHeat = 0.0; // average subsurface heat storage for day [W/m2] // Local float solNet; // average net solar radiation for daytime [W/m2] float lngNet; // average net longwave radiation [W/m2] float z0; // roughness parameter [m] float disp; // height of zero-plane [m] float z0c; // roughness parameter (closed canopy) float dispc; // zero-plane displacement (closed canopy) float aa; // available energy [W/m2] float asubs; // available energy at ground [W/m2] float es; // vapor pressure at airT [kPa] float delta; // dEsat/dTair [kPa/K] float dd; // vapor pressure deficit [kPa] float rsc; // canopy resistance [s/m] float le; // latent heat [W/m2] float rn; // net radiation [W/m2] float rns; // net radiation at ground [W/m2] float raa; // aerodynamic resistance [s/m] float rac; // leaf boundary layer resistance [s/m] float ras; // ground aerodynamic resistance [s/m] // Output float pet; if (MFVarTestMissingVal (_MDInDayLengthID, itemID) || MFVarTestMissingVal (_MDInI0HDayID, itemID) || MFVarTestMissingVal (_MDInCParamAlbedoID, itemID) || MFVarTestMissingVal (_MDInCParamCHeightID,itemID) || MFVarTestMissingVal (_MDInCParamLWidthID, itemID) || MFVarTestMissingVal (_MDInCParamRSSID, itemID) || MFVarTestMissingVal (_MDInCParamR5ID, itemID) || MFVarTestMissingVal (_MDInCParamCDID, itemID) || MFVarTestMissingVal (_MDInCParamCRID, itemID) || MFVarTestMissingVal (_MDInCParamGLMaxID, itemID) || MFVarTestMissingVal (_MDInCParamZ0gID, itemID) || MFVarTestMissingVal (_MDInLeafAreaIndexID,itemID) || MFVarTestMissingVal (_MDInStemAreaIndexID,itemID) || MFVarTestMissingVal (_MDInAtMeanID, itemID) || MFVarTestMissingVal (_MDInAtMinID, itemID) || MFVarTestMissingVal (_MDInSolRadID, itemID) || MFVarTestMissingVal (_MDInVPressID, itemID) || MFVarTestMissingVal (_MDInWSpeedID, itemID)) { MFVarSetMissingVal (_MDOutPetID,itemID); return; } dayLen = MFVarGetFloat (_MDInDayLengthID, itemID, 0.1); i0hDay = MFVarGetFloat (_MDInI0HDayID, itemID, 0.0); albedo = MFVarGetFloat (_MDInCParamAlbedoID, itemID, 0.0); height = MFVarGetFloat (_MDInCParamCHeightID, itemID, 0.0); lWidth = MFVarGetFloat (_MDInCParamLWidthID, itemID, 0.0); rss = MFVarGetFloat (_MDInCParamRSSID, itemID, 0.0); r5 = MFVarGetFloat (_MDInCParamR5ID, itemID, 0.0); cd = MFVarGetFloat (_MDInCParamCDID, itemID, 0.0); cr = MFVarGetFloat (_MDInCParamCRID, itemID, 0.0); glMax = MFVarGetFloat (_MDInCParamGLMaxID, itemID, 0.0); z0g = MFVarGetFloat (_MDInCParamZ0gID, itemID, 0.0); lai = MFVarGetFloat (_MDInLeafAreaIndexID, itemID, 0.0); sai = MFVarGetFloat (_MDInStemAreaIndexID, itemID, 0.0); airT = MFVarGetFloat (_MDInAtMeanID, itemID, 0.0); airTMin = MFVarGetFloat (_MDInAtMinID, itemID, 0.0); solRad = MFVarGetFloat (_MDInSolRadID, itemID, 0.0); vPress = MFVarGetFloat (_MDInVPressID, itemID, 0.0); wSpeed = fabs (MFVarGetFloat (_MDInWSpeedID, itemID, 0.0)); if (wSpeed < 0.2) wSpeed = 0.2; solNet = (1.0 - albedo) * solRad / MDConstIGRATE; z0c = MDPETlibRoughnessClosed (height,z0g); dispc = height - z0c / 0.3; disp = MDPETlibZPDisplacement (height,lai,sai,z0g); z0 = MDPETlibRoughness (disp,height,lai,sai,z0g); lngNet = MDSRadNETLong (i0hDay,airT,solRad,vPress); rn = solNet + lngNet; aa = rn - sHeat; rns = rn * exp (-cr * (lai + sai)); asubs = rns - sHeat; es = MDPETlibVPressSat (airT); delta = MDPETlibVPressDelta (airT); dd = es - vPress; rsc = MDPETlibCanopySurfResistance (airTMin,solRad,dd,lai,sai,r5,cd,cr,glMax); raa = MDPETlibBoundaryResistance (wSpeed,height,z0g,z0c,dispc,z0,disp); rac = MDPETlibLeafResistance (wSpeed,height,lWidth,z0g,lai,sai,z0c,dispc); ras = MDPETlibGroundResistance (wSpeed,height,z0g,z0c,dispc,z0,disp); // ras=70; // raa=50; rsc=70; le = MDPETlibShuttleworthWallace (rss,aa,asubs,dd,raa,rac,ras,rsc,delta); pet = MDConstEtoM * MDConstIGRATE * le; // float pet1 = MFVarGetFloat (_MDInRefETPIDDEBUG, itemID, 0.0); // printf ("height %f lWidth %f rss %f r4 %f cd %f cr %f glMax %f z0g %f lai %f sai %f \n",height , lWidth ,rss, r5 ,cd ,cr, glMax ,z0g ,lai , sai ); // printf ("pet BMF %f pet FAO %f albedo %f\n",pet,pet1,albedo); MFVarSetFloat (_MDOutPetID,itemID,pet); }
static void _MDWTempRiverRoute (int itemID) { float Q; float Q_incoming; float RO_Vol; float RO_WTemp; float QxT_input; float QxT; float QxTnew = 0; float QxTout = 0; float Q_WTemp; float Q_WTemp_new; float StorexT; float StorexT_new; float DeltaStorexT; float SnowPack; //processing variables float channelWidth; float waterStorageChange; float waterStorage; float ResWaterStorageChange = 0; float ResWaterStorage = 0; float solarRad; float windSpeed; float cloudCover; float Tair; float Tequil = 0; float HeatLoss_int = 4396.14; // is intercept assuming no wind and clouds float HeatLoss_slope = 1465.38; // is slope assuming no wind and clouds float deltaT; float ReservoirArea; float ReservoirDepth; float ReservoirVelocity; // conservative mixing variables (parallel to those above_ float QxT_mix; float QxTnew_mix = 0; float QxTout_mix = 0; float Q_WTemp_mix; float StorexT_mix; float StorexT_new_mix; float DeltaStorexT_mix; float QxTRemoval; int day; int month; float resCapacity; //RJS 071511 Reservoir capacity [km3] float QxT_postThermal; //RJS 081311 float QxT_mix_postThermal; //RJS 081311 float Q_WTemp_postThermal; //RJS 081311 float Q_WTemp_mix_postThermal; //RJS 081311 float warmingTemp; //RJS 081311 float wdl_QxT; //RJS 081311 float thermal_wdl; //RJS 081311 float StorexT_postThermal; //RJS 081711 float DeltaStorexT_postThermal; //RJS 081711 float StorexT_mix_postThermal; //RJS 081711 float DeltaStorexT_mix_postThermal; //RJS 081711 float deltaT_postThermal; //RJS 081711 day = MFDateGetCurrentDay(); month = MFDateGetCurrentMonth(); Q = MFVarGetFloat (_MDInDischargeID, itemID, 0.0); Q_incoming = MFVarGetFloat (_MDInDischargeIncomingID, itemID, 0.0); // already includes local runoff RO_Vol = MFVarGetFloat (_MDInRunoffVolumeID, itemID, 0.0); RO_WTemp = MFVarGetFloat (_MDInWTempRiverID, itemID, 0.0); SnowPack = MFVarGetFloat (_MDInSnowPackID, itemID, 0.0); if (_MDInResStorageID != MFUnset){ ResWaterStorageChange = MFVarGetFloat ( _MDInResStorageChangeID, itemID, 0.0) * pow(1000,3); // convert to m3/ ResWaterStorage = MFVarGetFloat ( _MDInResStorageID, itemID, 0.0) * pow(1000,3); // convert to m3 resCapacity = MFVarGetFloat (_MDInResCapacityID, itemID, 0.0); //RJS 071511 } else { ResWaterStorageChange = ResWaterStorage = resCapacity = 0.0; //RJS 071511 } waterStorageChange = MFVarGetFloat ( _MDInRiverStorageChgID, itemID, 0.0); waterStorage = MFVarGetFloat ( _MDInRiverStorageID, itemID, 0.0); channelWidth = MFVarGetFloat ( _MDInRiverWidthID, itemID, 0.0); solarRad = MFVarGetFloat ( _MDInSolarRadID, itemID, 0.0); //MJ/m2/d - CHECK UNITS windSpeed = MFVarGetFloat ( _MDInWindSpeedID, itemID, 0.0); cloudCover = MFVarGetFloat ( _MDInCloudCoverID, itemID, 0.0); Tair = MFVarGetFloat ( _MDInAirTemperatureID, itemID, 0.0); QxT = MFVarGetFloat (_MDFlux_QxTID, itemID, 0.0); StorexT = MFVarGetFloat (_MDStorage_QxTID, itemID, 0.0); QxT_mix = MFVarGetFloat (_MDFluxMixing_QxTID, itemID, 0.0); StorexT_mix = MFVarGetFloat (_MDStorageMixing_QxTID, itemID, 0.0); warmingTemp = MFVarGetFloat (_MDInWarmingTempID, itemID, 0.0); //RJS 072011 wdl_QxT = MFVarGetFloat (_MDInWdl_QxTID, itemID, 0.0); //RJS 072011 thermal_wdl = MFVarGetFloat (_MDInThermalWdlID, itemID, 0.0)* 1000000 / 365 / 86400; //RJS 072011 // if (itemID == 5132){ // printf("Stop itemID %d day %d \n", itemID, MFDateGetCurrentDay()); // } //TODO: combine with reservoir check above - also make reservoir hydraulics generally accessible //TODO: add effect of water withdrawals if(Q < 0.0) Q = 0.0; //RJS 120409 if(Q_incoming < 0.0) Q_incoming = 0.0; //RJS 120409 // if(RO_Vol < 0.0) RO_Vol = 0.0; //RJS 071511 if(resCapacity > 0.0){ waterStorage = waterStorage + ResWaterStorage; waterStorageChange = waterStorageChange + ResWaterStorageChange; ReservoirArea = pow(((ResWaterStorage / pow(10,6)) / 9.208),(1 / 1.114)) * 1000 * 1000; // m2, from Takeuchi 1997 - original equation has V in 10^6 m3 and A in km2 ReservoirDepth = (ResWaterStorage / ReservoirArea); //m ReservoirVelocity = Q / (ReservoirArea); // m/s channelWidth = MDMaximum(channelWidth, (Q / (ReservoirDepth * ReservoirVelocity))); // m QxT_input = RO_Vol * RO_WTemp * 86400.0; //RJS 071511 //m3*degC/d QxTnew = QxT + QxT_input + StorexT; //RJS 071511 //m3*degC/d QxTnew_mix = QxT_mix + QxT_input + StorexT_mix; //RJS 071511 if (Q_incoming > 0.000001) { Q_WTemp = QxTnew / ((Q_incoming) * 86400 + (waterStorage - waterStorageChange)); //RJS 071511 //degC Q_WTemp_mix = QxTnew_mix / ((Q_incoming) * 86400 + (waterStorage - waterStorageChange)); //RJS 071511 //degC // if (itemID == 25014) printf("Q_incoming > 0.000001\n"); } else { if (waterStorage > 0) { Q_WTemp = StorexT / waterStorage; // RJS 071511 //degC Q_WTemp_mix = StorexT_mix / waterStorage; // RJS 071511 //degC // if (itemID == 25014) printf("waterStorage > 0\n"); } else { Q_WTemp = 0.0; //RJS 071511 Q_WTemp_mix = 0.0; //RJS 071511 // if (itemID == 25014) printf("else\n"); } } Q_WTemp_new = Q_WTemp; //RJS 071511 StorexT_new = waterStorage * Q_WTemp_new; //RJS 071511 //m3*degC DeltaStorexT = StorexT_new - StorexT; //RJS 071511 QxTout = Q * 86400.0 * Q_WTemp_new ; //RJS 071511 //m3*degC/d QxTRemoval = QxTnew - (StorexT_new + QxTout); //RJS 071511 //m3*degC/d StorexT_new_mix = waterStorage * Q_WTemp_mix; //RJS 071511 //m3*degC DeltaStorexT_mix = StorexT_new_mix - StorexT_mix; //RJS 071511 QxTout_mix = Q * 86400.0 * Q_WTemp_mix; //RJS 071511 //m3*degC/s // if (itemID == 5033) printf("m = %d, d = %d, itemID = %d, QxTout = %f, QxTout_mix = %f, Q = %f, Q_WTemp_new = %f\n", MFDateGetCurrentMonth (), MFDateGetCurrentDay (), itemID, QxTout, QxTout_mix, Q, Q_WTemp_new); // if (itemID == 4704) printf("m = %d, d = %d, itemID = %d, QxTout = %f, QxTout_mix = %f, Q = %f, Q_WTemp_new = %f\n", MFDateGetCurrentMonth (), MFDateGetCurrentDay (), itemID, QxTout, QxTout_mix, Q, Q_WTemp_new); //New experimental QxT_postThermal = thermal_wdl > Q ? 86400 * Q * (Q_WTemp_new + warmingTemp) : 86400 * ((thermal_wdl * (Q_WTemp_new + warmingTemp)) + ((Q - thermal_wdl) * Q_WTemp_new)); QxT_mix_postThermal = thermal_wdl > Q ? 86400 * Q * (Q_WTemp_mix + warmingTemp) : 86400 * ((thermal_wdl * (Q_WTemp_mix + warmingTemp)) + ((Q - thermal_wdl) * Q_WTemp_mix)); Q_WTemp_postThermal = Q > 0.000001 ? QxT_postThermal / (Q * 86400) : 0.0; Q_WTemp_mix_postThermal = Q > 0.000001 ? QxT_mix_postThermal / (Q * 86400) : 0.0; StorexT_postThermal = waterStorage * Q_WTemp_postThermal; DeltaStorexT_postThermal = StorexT_postThermal - StorexT; StorexT_mix_postThermal = waterStorage * Q_WTemp_mix_postThermal; DeltaStorexT_mix_postThermal = StorexT_mix_postThermal - StorexT_mix; deltaT_postThermal = Q_WTemp_postThermal - Q_WTemp; // if (itemID == 5033) printf("QxT_pt = %f, Q_WTemp_pt = %f\n", QxT_postThermal, Q_WTemp_postThermal); //if (itemID == 4704) printf("QxT_pt = %f, Q_WTemp_pt = %f\n", QxT_postThermal, Q_WTemp_postThermal); //end MFVarSetFloat(_MDLocalIn_QxTID, itemID, QxT_input); // MFVarSetFloat(_MDRemoval_QxTID, itemID, QxTRemoval); // MFVarSetFloat(_MDFlux_QxTID, itemID, QxTout); MFVarSetFloat(_MDFlux_QxTID, itemID, QxT_postThermal); //RJS new // MFVarSetFloat(_MDStorage_QxTID, itemID, StorexT_new); MFVarSetFloat(_MDStorage_QxTID, itemID, StorexT_postThermal); //RJS new // MFVarSetFloat(_MDDeltaStorage_QxTID, itemID, DeltaStorexT); MFVarSetFloat(_MDDeltaStorage_QxTID, itemID, DeltaStorexT_postThermal); //RJS new // MFVarSetFloat(_MDWTemp_QxTID, itemID, Q_WTemp_new); MFVarSetFloat(_MDWTemp_QxTID, itemID, Q_WTemp_postThermal); //RJS new // MFVarSetFloat(_MDWTempDeltaT_QxTID, itemID, deltaT); // MFVarSetFloat(_MDWTempDeltaT_QxTID, itemID, deltaT_postThermal); //RJS new // MFVarSetFloat(_MDFluxMixing_QxTID, itemID, QxTout_mix); MFVarSetFloat(_MDFluxMixing_QxTID, itemID, QxT_mix_postThermal); //RJS new // MFVarSetFloat(_MDStorageMixing_QxTID, itemID, StorexT_new_mix); MFVarSetFloat(_MDStorageMixing_QxTID, itemID, StorexT_mix_postThermal); //RJS new // MFVarSetFloat(_MDDeltaStorageMixing_QxTID, itemID, DeltaStorexT_mix); MFVarSetFloat(_MDDeltaStorageMixing_QxTID, itemID, DeltaStorexT_mix_postThermal); //RJS new // MFVarSetFloat(_MDWTempMixing_QxTID, itemID, Q_WTemp_mix); MFVarSetFloat(_MDWTempMixing_QxTID, itemID, Q_WTemp_mix_postThermal); //RJS new // MFVarSetFloat(_MDLocalIn_QxTID, itemID, QxT_input); //RJS 071511 //// MFVarSetFloat(_MDRemoval_QxTID, itemID, QxTRemoval); //RJS 071511 // MFVarSetFloat(_MDFlux_QxTID, itemID, QxTout); //RJS 071511 // MFVarSetFloat(_MDStorage_QxTID, itemID, StorexT_new); //RJS 071511 // MFVarSetFloat(_MDDeltaStorage_QxTID, itemID, DeltaStorexT); //RJS 071511 // MFVarSetFloat(_MDWTemp_QxTID, itemID, Q_WTemp_new); //RJS 071511 //// MFVarSetFloat(_MDWTempDeltaT_QxTID, itemID, deltaT); //RJS 071511 // MFVarSetFloat(_MDFluxMixing_QxTID, itemID, QxTout_mix); //RJS 071511 // MFVarSetFloat(_MDStorageMixing_QxTID, itemID, StorexT_new_mix); //RJS 071511 // MFVarSetFloat(_MDDeltaStorageMixing_QxTID, itemID, DeltaStorexT_mix); //RJS 071511 // MFVarSetFloat(_MDWTempMixing_QxTID, itemID, Q_WTemp_mix); //RJS 071511 } else{ ReservoirArea = 0.0; ReservoirVelocity = 0.0; ReservoirDepth = 0.0; // } = %f //RJS commented out 071511 //TODO: RO_Vol has been set to never be less than 0 in MDWRunoff QxT_input = RO_Vol * RO_WTemp * 86400.0; //m3*degC/d //if (itemID == 188 && month == 5 && day == 1){ // printf("Stop: Q %f RO_Vol %f QxT %f QxT_input %f \n", Q, RO_Vol, QxT, QxT_input); //} //note: calculation for input concentration is changed from previous iterations // to use incoming Q. Also use WaterStorage from previous time step/ // TODO: Need to include a variable that accounts for losses due to discharge disappearing (Drying) // TODO: Make all these changes for other bgc flux models // Q_incoming includes local runoff!!! if((Q_incoming) > 0.000001) { //do not include water storage in this check - will screw up mixing estimates QxTnew = QxT + QxT_input + StorexT; //m3*degC/d QxTnew_mix = QxT_mix + QxT_input + StorexT_mix; Q_WTemp = QxTnew / ((Q_incoming) * 86400 + (waterStorage - waterStorageChange)); //degC Q_WTemp_mix = QxTnew_mix / ((Q_incoming) * 86400 + (waterStorage - waterStorageChange)); //degC ///Temperature Processing using Dingman 1972 if (cloudCover < 95){ // clear skies, assume cloud cover < 95% convertcalories / cm2 /d to kJ/m2/d HeatLoss_int = (105 + 23 * windSpeed) * 4.1868 / 1000 * 100 * 100; // kJ/m2/d HeatLoss_slope = (35 + 4.2 * windSpeed) * 4.1868 / 1000 * 100 * 100;// kJ/m2/d/degC } else{ // cloudy skies, assume cloud cover > 95% HeatLoss_int = (-73 + 9.1 * windSpeed) * 4.1868 / 1000 * 100 * 100; HeatLoss_slope = (37 + 4.6 * windSpeed) * 4.1868 / 1000 * 100 * 100; } Tequil = Tair + (((solarRad * 1000) - HeatLoss_int) / HeatLoss_slope); //solar rad converted from MJ to kJ/m2/d // use exponential form //TODO channelWidth can equal 0 when waterStorage > 0.0, so need to check here // Apply model only to large enough discharges, otherwise assume temperature equils equilibrium // if (channelWidth > 0 && Q > 0.001){ if (channelWidth > 0){ Q_WTemp_new = MDMaximum(0, (((Q_WTemp - Tequil) * exp((-HeatLoss_slope * MFModelGetLength(itemID)) / (999.73 * 4.1922 * (Q * 86400.0 / channelWidth)))) + Tequil)); } else { Q_WTemp_new = MDMaximum(0, Tequil); } //if cell has reservoir, assume reservoir exchange dominates //if(ResWaterStorage > 0){ // Q_WTemp_new = MDMaximum(0, (((Q_WTemp - Tequil) * exp((-HeatLoss_slope * ReservoirArea) / (999.73 * 4.1922 * (Q * 86400.0)))) + Tequil)); //} deltaT = Q_WTemp_new - Q_WTemp; //if (Q_WTemp_new > 50){ // if (Q_WTemp_mix > 30){ // printf("Toggle"); // printf("Stop WaterTemp > 50 itemID %d XCoord %f YCoord %f month %d day %d Q %f Q_incoming %f waterStorage %f " // "RO_Vol %f RO_WTemp %f QxT %f QxT_mix %f StorexT %f Storext_mix %f QxT_input %f QxTnew %f Q_WTemp %f Q_WTemp_mix %f Q_WTemp_new %f Tequil %f \n", // itemID, MFModelGetXCoord(itemID),MFModelGetYCoord(itemID), month, day, Q, Q_incoming, waterStorage, // RO_Vol, RO_WTemp, QxT, QxT_mix, StorexT, StorexT_mix, QxT_input, QxTnew, Q_WTemp, Q_WTemp_mix, Q_WTemp_new, Tequil); // } StorexT_new = waterStorage * Q_WTemp_new; //m3*degC DeltaStorexT = StorexT_new - StorexT; // QxTout = Q * 86400.0 * Q_WTemp_new ; //m3*degC/d QxTRemoval = QxTnew - (StorexT_new + QxTout); //m3*degC/d StorexT_new_mix = waterStorage * Q_WTemp_mix; //m3*degC DeltaStorexT_mix = StorexT_new_mix - StorexT_mix; QxTout_mix = Q * 86400.0 * Q_WTemp_mix; //m3*degC/s // if (itemID == 5033) printf("m = %d, d = %d, itemID = %d, QxTout = %f, QxTout_mix = %f, Q = %f, Q_WTemp_new = %f\n", MFDateGetCurrentMonth (), MFDateGetCurrentDay (), itemID, QxTout, QxTout_mix, Q, Q_WTemp_new); // if (itemID == 4704) printf("m = %d, d = %d, itemID = %d, QxTout = %f, QxTout_mix = %f, Q = %f, Q_WTemp_new = %f\n", MFDateGetCurrentMonth (), MFDateGetCurrentDay (), itemID, QxTout, QxTout_mix, Q, Q_WTemp_new); // if (QxT_input > 1000) printf("m = %d, d = %d, itemID = %d, QxT_input = %f, RO_Vol = %f, RO_WTemp = %f, QxT = %f, QxT_mix = %f\n, QxTout = %f, QxTout_mix = %f, Q = %f\n", MFDateGetCurrentMonth (), MFDateGetCurrentDay (), itemID, QxT_input, RO_Vol, RO_WTemp, QxT, QxT_mix, QxTout, QxTout_mix, Q); // if (Q_WTemp_new > 50) printf("m = %d, d = %d, itemID = %d, QxT_input = %f, RO_Vol = %f, RO_WTemp = %f\n channelWidth = %f, Q_WTemp = %f, Q_WTemp_new = %f, Q_WTemp_mix = %f, Tair = %f, Q = %f, Q_incoming = %f\n", MFDateGetCurrentMonth (), MFDateGetCurrentDay (), itemID, QxT_input, RO_Vol, RO_WTemp, channelWidth, Q_WTemp, Q_WTemp_new, Q_WTemp_mix, Tair, Q, Q_incoming); //New experimental QxT_postThermal = thermal_wdl > Q ? 86400 * Q * (Q_WTemp_new + warmingTemp) : 86400 * ((thermal_wdl * (Q_WTemp_new + warmingTemp)) + ((Q - thermal_wdl) * Q_WTemp_new)); QxT_mix_postThermal = thermal_wdl > Q ? 86400 * Q * (Q_WTemp_mix + warmingTemp) : 86400 * ((thermal_wdl * (Q_WTemp_mix + warmingTemp)) + ((Q - thermal_wdl) * Q_WTemp_mix)); Q_WTemp_postThermal = Q > 0.000001 ? QxT_postThermal / (Q * 86400) : 0.0; Q_WTemp_mix_postThermal = Q > 0.000001 ? QxT_mix_postThermal / (Q * 86400) : 0.0; StorexT_postThermal = waterStorage * Q_WTemp_postThermal; DeltaStorexT_postThermal = StorexT_postThermal - StorexT; StorexT_mix_postThermal = waterStorage * Q_WTemp_mix_postThermal; DeltaStorexT_mix_postThermal = StorexT_mix_postThermal - StorexT_mix; deltaT_postThermal = Q_WTemp_postThermal - Q_WTemp; // if (itemID == 5033) printf("QxT_pt = %f, Q_WTemp_pt = %f\n", QxT_postThermal, Q_WTemp_postThermal); //if (itemID == 4704) printf("QxT_pt = %f, Q_WTemp_pt = %f\n", QxT_postThermal, Q_WTemp_postThermal); //end MFVarSetFloat(_MDLocalIn_QxTID, itemID, QxT_input); MFVarSetFloat(_MDRemoval_QxTID, itemID, QxTRemoval); // MFVarSetFloat(_MDFlux_QxTID, itemID, QxTout); MFVarSetFloat(_MDFlux_QxTID, itemID, QxT_postThermal); //RJS new // MFVarSetFloat(_MDStorage_QxTID, itemID, StorexT_new); MFVarSetFloat(_MDStorage_QxTID, itemID, StorexT_postThermal); //RJS new // MFVarSetFloat(_MDDeltaStorage_QxTID, itemID, DeltaStorexT); MFVarSetFloat(_MDDeltaStorage_QxTID, itemID, DeltaStorexT_postThermal); //RJS new // MFVarSetFloat(_MDWTemp_QxTID, itemID, Q_WTemp_new); MFVarSetFloat(_MDWTemp_QxTID, itemID, Q_WTemp_postThermal); //RJS new // MFVarSetFloat(_MDWTempDeltaT_QxTID, itemID, deltaT); MFVarSetFloat(_MDWTempDeltaT_QxTID, itemID, deltaT_postThermal); //RJS new // MFVarSetFloat(_MDFluxMixing_QxTID, itemID, QxTout_mix); MFVarSetFloat(_MDFluxMixing_QxTID, itemID, QxT_mix_postThermal); //RJS new // MFVarSetFloat(_MDStorageMixing_QxTID, itemID, StorexT_new_mix); MFVarSetFloat(_MDStorageMixing_QxTID, itemID, StorexT_mix_postThermal); //RJS new // MFVarSetFloat(_MDDeltaStorageMixing_QxTID, itemID, DeltaStorexT_mix); MFVarSetFloat(_MDDeltaStorageMixing_QxTID, itemID, DeltaStorexT_mix_postThermal); //RJS new // MFVarSetFloat(_MDWTempMixing_QxTID, itemID, Q_WTemp_mix); MFVarSetFloat(_MDWTempMixing_QxTID, itemID, Q_WTemp_mix_postThermal); //RJS new } else{ if (waterStorage > 0){ QxTnew = QxT_input + StorexT; //m3*degC QxTnew_mix = QxT_input + StorexT_mix; } else{ QxTnew = 0; QxTnew_mix = 0; } StorexT_new = 0.0; //m3*degC DeltaStorexT = StorexT_new - StorexT; // QxTout = 0.0; //m3*degC/dStorexT_new_mix = 0; //m3*degC QxTRemoval = 0.0; //m3*degC/d StorexT_new_mix = 0.0; //m3*degC DeltaStorexT_mix = StorexT_new_mix - StorexT_mix; QxTout_mix = 0.0; //m3*degC/s // printf("m = %d, d = %d, itemID = %d, QxT_input = %f, RO_Vol = %f, RO_WTemp = %f\n Q_WTemp = %f, Q_WTemp_new = %f, Q_WTemp_mix = %f, Q = %f, Q_incoming = %f\n", MFDateGetCurrentMonth (), MFDateGetCurrentDay (), itemID, QxT_input, RO_Vol, RO_WTemp, Q_WTemp, Q_WTemp_new, Q_WTemp_mix, Q, Q_incoming); MFVarSetFloat(_MDLocalIn_QxTID, itemID, 0.0); MFVarSetFloat(_MDRemoval_QxTID, itemID, QxTRemoval); MFVarSetFloat(_MDFlux_QxTID, itemID, QxTout); MFVarSetFloat(_MDStorage_QxTID, itemID, StorexT_new); MFVarSetFloat(_MDDeltaStorage_QxTID, itemID, DeltaStorexT); MFVarSetFloat(_MDFluxMixing_QxTID, itemID, QxTout_mix); MFVarSetFloat(_MDStorageMixing_QxTID, itemID, StorexT_new_mix); MFVarSetFloat(_MDDeltaStorageMixing_QxTID, itemID, DeltaStorexT_mix); MFVarSetMissingVal(_MDWTemp_QxTID, itemID); MFVarSetMissingVal(_MDWTempDeltaT_QxTID, itemID); MFVarSetMissingVal(_MDWTempMixing_QxTID, itemID); } float mb; float mbmix; mb = QxT_input + QxT - QxTRemoval - QxTout - DeltaStorexT; mbmix = (QxT_input + QxT_mix - QxTout_mix - DeltaStorexT_mix); } //RJS 071511 //if (mbmix > 100000){ //printf("mass balance = mb %f mbmix %f \n", mb, mbmix); //} // if (itemID == 25014) printf("Q_WTemp_new = %f, QxTnew = %f, Q_incoming = %f, Q_m3 = %f, waterStorage = %f, waterStorageChange = %f, \n", Q_WTemp_new, QxTnew, Q_incoming, Q_incoming * 86400, waterStorage, waterStorageChange); // if (itemID == 25014) printf("T_river = %f, T_runoff = %f, T_storage = %f\n", QxT/Q_incoming, RO_WTemp, StorexT/(waterStorage - waterStorageChange)); // if (itemID == 25014) printf("*** m = %d, d = %d, resCapacity = %f, waterStorage = %f, waterStorageChange = %f\n", MFDateGetCurrentMonth(), MFDateGetCurrentDay(), resCapacity, waterStorage, waterStorageChange); // if (itemID == 25014) printf("Q_incoming = %f, Q = %f, RO_vol = %f\n", Q_incoming, Q, RO_Vol); // if (itemID == 25014) printf("m = %d, d = %d, m3 degC: QxT = %f, StorexT = %f, QxT_input = %f\n", MFDateGetCurrentMonth(), MFDateGetCurrentDay(), QxT, StorexT, QxT_input); // if (itemID == 25014) printf("volume: Q_incoming = %f, waterStorage - change = %f, RO_Vol = %f\n", Q_incoming * 86400, waterStorage - waterStorageChange, RO_Vol * 86400); // if (itemID == 25014) printf("flux = %f, storage = %f, RO_WTemp = %f\n", QxT / (Q_incoming * 86400), StorexT / (waterStorage - waterStorageChange), RO_WTemp); // if (itemID == 5033) printf("END: itemID = %d, m = %d, d= %d, Q = %f, QxT_pt = %f, Q_WTemp_pt = %f, QxTout = %f, \n", itemID, MFDateGetCurrentMonth(), MFDateGetCurrentDay(), Q, QxT_postThermal, Q_WTemp_postThermal, QxTout); // if (itemID == 4704) printf("END: itemID = %d, m = %d, d= %d, Q = %f, QxT_pt = %f, Q_WTemp_pt = %f, QxTout = %f, \n", itemID, MFDateGetCurrentMonth(), MFDateGetCurrentDay(), Q, QxT_postThermal, Q_WTemp_postThermal, QxTout); }
static void _MDDINRouting (int itemID) { //input float discharge; float width; float runoff; float runoffVol; float waterStorageChange; float waterStorage; float PointScenario; float DINLocalIn; float DINFlux; float DINFluxNew = 0; float DINStorage; float DINStorageNew; float DINDeltaStorage; float DINTotalIn; float DINConcentration; // # / 100 ml float DINFluxMixing; float DINFluxNewMixing = 0; float DINStorageMixing; float DINStorageNewMixing; float DINDeltaStorageMixing; float DINTotalInMixing; float DINConcentrationMixing; float HL; float DINRemoval; float massbalance; float massbalanceMixing; float waterT; float ConcPre_DIN; //LINX2 rates, EL model (log vf = a log NO3 ^ b - vf in cm/s, NO3 in ug/l) //float denit_int = -2.975; //float denit_slope = -0.493; float denit_int = -2.206; float denit_slope = -0.462; float NonpointLoadConc_DIN; float PointLoadFlux_DIN; float TotalVol; discharge = MFVarGetFloat (_MDInDischargeID, itemID, 0.0); width = MFVarGetFloat (_MDInRiverWidthID, itemID, 0.0); runoff = MFVarGetFloat (_MDInRunoffID, itemID, 0.0); //mm runoffVol = MFVarGetFloat (_MDInRunoffVolumeID, itemID, 0.0); //m3/s waterStorageChange = MFVarGetFloat (_MDInRiverStorageChgID, itemID, 0.0); waterStorage = MFVarGetFloat (_MDInRiverStorageID, itemID, 0.0); PointScenario = MFVarGetFloat (_MDInPointScenarioID, itemID, 0.0); waterT = MFVarGetFloat (_MDInWTempRiverRouteID, itemID, 0.0); NonpointLoadConc_DIN = MFVarGetFloat (_MDNonPoint_DINID, itemID, 0.0); PointLoadFlux_DIN = MFVarGetFloat (_MDPointSources_DINID, itemID, 0.0) * PointScenario; DINFlux = MFVarGetFloat (_MDFlux_DINID, itemID, 0.0); DINStorage = MFVarGetFloat (_MDStorage_DINID, itemID, 0.0); DINFluxMixing = MFVarGetFloat (_MDFluxMixing_DINID, itemID, 0.0); DINStorageMixing = MFVarGetFloat (_MDStorageMixing_DINID, itemID, 0.0); DINLocalIn = runoffVol * 86400 * NonpointLoadConc_DIN + PointLoadFlux_DIN; //kg/d //if (!isnan(DINFlux)){ DINTotalIn = DINFlux + DINLocalIn + DINStorage; //} DINTotalInMixing = DINFluxMixing + DINLocalIn + DINStorageMixing; TotalVol = (discharge) * 86400 + waterStorage; //m3 note:local runoff already included in discharge if (!isnan(TotalVol) && TotalVol != 0){ //ConcPre_DIN = 1; ConcPre_DIN = DINTotalIn / TotalVol; //kg/m3 } else { ConcPre_DIN = 0.0; } float DIN_Tref = 20; float DIN_Q10 = 2; //float DIN_Q10 = 1; float DIN_ArealU; float DIN_Vf ; float DIN_Vf_ref; if (!isnan(ConcPre_DIN) && ConcPre_DIN > 0){ //MM function //DIN concentration needs to be in mg/l for the specified paramerters //DIN_UmaxAdj = DIN_Umax * pow(DIN_Q10, ((waterT - DIN_Tref) / 10)); //DIN_ArealU = (DIN_UmaxAdj * 24 * ConcPre_DIN * 1000 / (DIN_Ks + ConcPre_DIN * 1000)) / (1000 * 1000) ; //kg/m2/d //DIN_Vf = DIN_ArealU / ConcPre_DIN; //m/d //EL function //DIN concentration needs to be in ug/l for the specified parameters //DIN_Vf_ref = pow(10,(denit_int + (log10(ConcPre_DIN * 1000 * 1000) * denit_slope))) * 86400 / 100; //convert vf to m/d //1st order function //DIN_Vf_ref = 0.001 * 864; //LINX2 high denit-vf, m/d DIN_Vf_ref = 0.0001 * 864; //LINX2 medium denit-vf, m/d DIN_Vf = DIN_Vf_ref * pow(DIN_Q10, ((waterT - DIN_Tref) / 10)); //m/d DIN_ArealU = DIN_Vf * ConcPre_DIN; //kg/m2/d // } else { DIN_ArealU = 0; DIN_Vf = 0; } if (isnan(DIN_Vf)){ printf ("DIN_Vf_ref %f denit_int %f denit_slope %f ConcPre_DIN %f DIN_Vf %f \n", DIN_Vf_ref, denit_int, denit_slope, ConcPre_DIN, DIN_Vf); } HL = (discharge * MDConst_m3PerSecTOm3PerDay) / (MFModelGetLength(itemID) * width); //if (isnan(DINFlux) || isnan(DINRemoval) || isnan(DINConcentration)) printf ("itemID %i DINFLux %f HL %f \n", itemID, DINFlux, HL); // if (isnan(DINFlux)) printf ("itemID %i DINFLux %f HL %f \n", itemID, DINFlux, HL); //printf ("DINFLux %f \n", DINFlux); //if (itemID == 576) printf ("WaterT %f DIN_Vf %f HL %f VF_HL %f TE %f, Discharge %f MFModelGetLength %f sinuosity %f width %f runoffVol %f NonpointLoadConc_DIN %f PointLoadFlux_DIN %f DIN_TotalIn %f DINFlux %f DINFLuxMixing %f DINStorage %f waterStorage %f TotalVol %f DIN_UmaxAdj %f DIN_ArealU %f ConcPre_DIN %f waterT %f DIN_Vf %f \n", // waterT, DIN_Vf, HL, (DIN_Vf / HL), exp(-1 * DIN_Vf / HL), discharge, MFModelGetLength(itemID), sinuosity, width, runoffVol, NonpointLoadConc_DIN, PointLoadFlux_DIN, DINTotalIn, DINFlux, DINFluxMixing, DINStorage, waterStorage, TotalVol, DIN_UmaxAdj, DIN_ArealU, ConcPre_DIN, waterT, DIN_Vf); //if (itemID == 576) printf ("WaterT %f DIN_Umax %f DIN_UmaxAdj %f ConcPre_DIN %f DIN_ArealU %f DIN_Vf %f HL %f \n", // waterT, DIN_Umax, DIN_UmaxAdj, (ConcPre_DIN * 1000), DIN_ArealU, DIN_Vf, HL); if(!isnan(TotalVol) && (TotalVol != 0)) { if (!isnan(HL) && HL > 0){ DINRemoval = DINTotalIn * (1 - exp(-1 * DIN_Vf / HL)); } else DINRemoval = DINTotalIn; DINConcentration = ((DINTotalIn - DINRemoval) / (TotalVol)); // kg / m3 DINStorageNew = waterStorage * (DINConcentration); DINDeltaStorage = DINStorageNew - DINStorage; DINFluxNew = discharge * 86400 * (DINConcentration); //kg/d DINConcentrationMixing = ((DINTotalInMixing) / (TotalVol)); // kg/d DINStorageNewMixing = waterStorage * (DINConcentrationMixing); //kg DINFluxNewMixing = discharge * 86400 * (DINConcentrationMixing); //kg/d DINDeltaStorageMixing = DINStorageNewMixing - DINStorageMixing; MFVarSetFloat(_MDLocalIn_DINID,itemID,DINLocalIn); MFVarSetFloat(_MDFlux_DINID,itemID,DINFluxNew); MFVarSetFloat(_MDStorage_DINID,itemID,DINStorageNew); MFVarSetFloat(_MDDeltaStorage_DINID,itemID,DINDeltaStorage); MFVarSetFloat(_MDRemoval_DINID,itemID,DINRemoval); MFVarSetFloat(_MDConc_DINID,itemID,DINConcentration); MFVarSetFloat(_MDFluxMixing_DINID,itemID,DINFluxNewMixing); MFVarSetFloat(_MDStorageMixing_DINID,itemID,DINStorageNewMixing); MFVarSetFloat(_MDConcMixing_DINID,itemID,DINConcentrationMixing); MFVarSetFloat(_MDDeltaStorageMixing_DINID,itemID,DINDeltaStorageMixing); } else { DINRemoval = DINTotalIn; DINDeltaStorage = -DINStorage; DINDeltaStorageMixing = -DINStorageMixing; MFVarSetFloat(_MDLocalIn_DINID,itemID,DINLocalIn); MFVarSetFloat(_MDFlux_DINID,itemID,0.0); MFVarSetFloat(_MDStorage_DINID,itemID,0.0); MFVarSetFloat(_MDDeltaStorage_DINID,itemID,DINDeltaStorage); MFVarSetFloat(_MDRemoval_DINID,itemID,DINRemoval); MFVarSetMissingVal(_MDConc_DINID,itemID); MFVarSetFloat(_MDFluxMixing_DINID,itemID,0.0); MFVarSetFloat(_MDStorageMixing_DINID,itemID,0.0); MFVarSetMissingVal(_MDConcMixing_DINID,itemID); MFVarSetFloat(_MDDeltaStorageMixing_DINID,itemID,DINDeltaStorageMixing); } massbalance = (DINFlux + DINLocalIn - (DINRemoval + DINDeltaStorage + DINFluxNew)) / DINTotalIn; massbalanceMixing = (DINFluxMixing + DINLocalIn - (DINDeltaStorageMixing + DINFluxNewMixing)) / DINTotalInMixing; if(isnan(DINConcentration)) printf("discharge %f DINFlux %f \n", discharge, DINFlux); if(!isnan(discharge) && (discharge > 0.001)) { if ((massbalance > 0.001) || (massbalanceMixing > 0.001)) { //printf ("discharge %f DINFlux %f DINLocalIn %f DINStorage %f DINRemoval %f DINStorageNew %f DINFluxNew %f MassBalance %f \n", // discharge, DINFlux / 1000000, DINLocalIn / 1000000 , DINStorage / 1000000, DINRemoval / 1000000, DINStorageNew / 1000000, DINFluxNew / 1000000, massbalance); //if (itemID == 32) printf ("discharge %f DINFlux %f DINLocalIn %f DINStorage %f DINRemoval %f DINStorageNew %f DINFluxNew %f MassBalance %f \n", // discharge, DINFlux, DINLocalIn, DINStorage, DINRemoval, DINStorageNew, DINFluxNew, massbalance); printf (" MassBalance %f \n", massbalance); printf (" MassBalanceMixing %f \n", massbalanceMixing); } } //if (itemID == 576) printf ("discharge %f DINFlux %f DINLocalIn %f DINStorage %f DINRemoval %f DINStorageNew %f DINFluxNew %f MassBalance %f \n\n", // discharge, DINFlux, DINLocalIn, DINStorage, DINRemoval, DINStorageNew, DINFluxNew, massbalance); }