static void _MDDischRouteMuskingumCoeff (int itemID) { // Input float yMean; // Average depth at mean discharge [m] float wMean; // River width at mean discharge [m] float vMean; // Mean velocity float beta; // Riverbed shape exponent [] float slope; // Riverbed slope [m/km] // Output float C0; // Muskingum C0 coefficient (current inflow) float C1; // Muskingum C1 coefficient (previous inflow) float C2; // MUskingum C2 coefficient (previous outflow) // Local float xi; // Flood-wave/flow velocity ratio float C; // Cell Courant number; float D; // Cell Reynolds number; float dt; // time step length [s] float dL; // Cell length [m] dL = MFModelGetLength (itemID); slope = MFVarGetFloat (_MDInRiverbedSlopeID, itemID, 0.0) / 1000.0; yMean = MFVarGetFloat (_MDInRiverbedAvgDepthMeanID, itemID, 0.0); wMean = MFVarGetFloat (_MDInRiverbedWidthMeanID, itemID, 0.0); vMean = MFVarGetFloat (_MDInRiverbedVelocityMeanID, itemID, 0.0); beta = MFVarGetFloat (_MDInRiverbedShapeExponentID, itemID, 0.0); if (CMmathEqualValues (vMean, 0.0)) { MFVarSetFloat (_MDOutMuskingumC0ID, itemID, 0.0); MFVarSetFloat (_MDOutMuskingumC1ID, itemID, 0.0); MFVarSetFloat (_MDOutMuskingumC2ID, itemID, 0.0); MFVarSetFloat (_MDOutCourantID, itemID, 0.0); return; } if (CMmathEqualValues (dL, 0.0) || CMmathEqualValues (slope, 0.0) || CMmathEqualValues (yMean, 0.0) || CMmathEqualValues (wMean, 0.0) || (beta < 0.0)) { // Falling back to flow-accumulation MFVarSetFloat (_MDOutMuskingumC0ID, itemID, 1.0); MFVarSetFloat (_MDOutMuskingumC1ID, itemID, 0.0); MFVarSetFloat (_MDOutMuskingumC2ID, itemID, 0.0); MFVarSetFloat (_MDOutCourantID, itemID, 0.0); return; } dt = MFModelGet_dt (); xi = 1 + beta * (2.0 / 3.0) / (beta + 1); C = xi * vMean * dt / dL; D = yMean / (dL * slope * xi); C0 = (-1 + C + D) / (1 + C + D); C1 = ( 1 + C - D) / (1 + C + D); C2 = ( 1 - C + D) / (1 + C + D); // if ((C0 < 0.0) || (C1 < 0.0) || (C2 < 0.0)) { C0 = 1.0; C1 = 0; C2 = 0; } // According to Pounce C1 and C2 can be negative MFVarSetFloat (_MDOutMuskingumC0ID, itemID, C0); MFVarSetFloat (_MDOutMuskingumC1ID, itemID, C1); MFVarSetFloat (_MDOutMuskingumC2ID, itemID, C2); MFVarSetFloat (_MDOutCourantID, itemID, C); }
static void _MDRiverbedShapeExponent (int itemID) { // Input float slope; // Riverbed slope [m/km] float discharge; // Mean annual discharge [m3/s] float eta = 0.0; float nu = 0.0; float tau = 0.0; float phi = 0.0; // Output float yMean; // River average depth at mean discharge [m] float wMean; // River width at mean discharge [m] // Local float dL; // Reach length [m] // float eta = 0.25, nu = 0.4, tau = 8.0, phi = 0.58; //old // float eta = 0.36, nu = 0.37, tau = 3.55, phi = 0.51; //new based on Knighton (avg) // float eta = 0.33, nu = 0.35, tau = 3.67, phi = 0.45; // Hey and Thorn (1986) (used for ERL 2013) eta = MFVarGetFloat (_MDInEtaID, itemID, 0.0); nu = MFVarGetFloat (_MDInNuID, itemID, 0.0); tau = MFVarGetFloat (_MDInTauID, itemID, 0.0); phi = MFVarGetFloat (_MDInPhiID, itemID, 0.0); if (MFVarTestMissingVal (_MDInDischMeanID, itemID)) { MFVarSetFloat (_MDOutRiverbedAvgDepthMeanID, itemID, 0.0); MFVarSetFloat (_MDOutRiverbedWidthMeanID, itemID, 0.0); MFVarSetFloat (_MDOutRiverbedVelocityMeanID, itemID, 0.0); MFVarSetFloat (_MDOutRiverbedShapeExponentID, itemID, 2.0); return; } discharge = fabs(MFVarGetFloat(_MDInDischMeanID, itemID, 0.0)); dL = MFModelGetLength (itemID); if (CMmathEqualValues (dL, 0.0) || (_MDInRiverbedSlopeID == MFUnset) || MFVarTestMissingVal (_MDInRiverbedSlopeID, itemID)) { // Slope independent riverbed geometry yMean = eta * pow (discharge, nu); wMean = tau * pow (discharge, phi); // printf("eta = %f, nu = %f, tau = %f, phi = %f\n", eta, nu, tau, phi); MFVarSetFloat (_MDOutRiverbedAvgDepthMeanID, itemID, yMean); MFVarSetFloat (_MDOutRiverbedWidthMeanID, itemID, wMean); MFVarSetFloat (_MDOutRiverbedVelocityMeanID, itemID, discharge / (yMean * wMean)); MFVarSetFloat (_MDOutRiverbedShapeExponentID, itemID, 2.0); return; } // Slope dependent riverbed geometry slope = MFVarGetFloat(_MDInRiverbedSlopeID, itemID, 0.01) / 1000.0; yMean = eta * pow (discharge, nu); wMean = tau * pow (discharge, phi); // printf("eta = %f, nu = %f, tau = %f, phi = %f\n", eta, nu, tau, phi); MFVarSetFloat (_MDOutRiverbedAvgDepthMeanID, itemID, yMean); MFVarSetFloat (_MDOutRiverbedWidthMeanID, itemID, wMean); MFVarSetFloat (_MDOutRiverbedVelocityMeanID, itemID, discharge / (yMean * wMean)); MFVarSetFloat (_MDOutRiverbedShapeExponentID, itemID, 2.0); }
static void _MDRiverbedShapeExponent (int itemID) { // Input float slope; // Riverbed slope [m/km] float discharge; // Mean annual discharge [m3/s] // Output float yMean; // River average depth at mean discharge [m] float wMean; // River width at mean discharge [m] // Local float dL; // Reach length [m] float eta = 0.25, nu = 0.4, tau = 8.0, phi = 0.58; if (MFVarTestMissingVal (_MDInDischMeanID, itemID)) { MFVarSetFloat (_MDOutRiverbedAvgDepthMeanID, itemID, 0.0); MFVarSetFloat (_MDOutRiverbedWidthMeanID, itemID, 0.0); MFVarSetFloat (_MDOutRiverbedVelocityMeanID, itemID, 0.0); MFVarSetFloat (_MDOutRiverbedShapeExponentID, itemID, 2.0); return; } discharge = fabs(MFVarGetFloat(_MDInDischMeanID, itemID, 0.0)); dL = MFModelGetLength (itemID); if (CMmathEqualValues (dL, 0.0) || (_MDInRiverbedSlopeID == MFUnset) || MFVarTestMissingVal (_MDInRiverbedSlopeID, itemID)) { // Slope independent riverbed geometry yMean = eta * pow (discharge, nu); wMean = tau * pow (discharge, phi); MFVarSetFloat (_MDOutRiverbedAvgDepthMeanID, itemID, yMean); MFVarSetFloat (_MDOutRiverbedWidthMeanID, itemID, wMean); MFVarSetFloat (_MDOutRiverbedVelocityMeanID, itemID, discharge / (yMean * wMean)); MFVarSetFloat (_MDOutRiverbedShapeExponentID, itemID, 2.0); return; } // Slope dependent riverbed geometry slope = MFVarGetFloat(_MDInRiverbedSlopeID, itemID, 0.01) / 1000.0; yMean = eta * pow (discharge, nu); wMean = tau * pow (discharge, phi); MFVarSetFloat (_MDOutRiverbedAvgDepthMeanID, itemID, yMean); MFVarSetFloat (_MDOutRiverbedWidthMeanID, itemID, wMean); MFVarSetFloat (_MDOutRiverbedVelocityMeanID, itemID, discharge / (yMean * wMean)); MFVarSetFloat (_MDOutRiverbedShapeExponentID, itemID, 2.0); }
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 _MDRiverLight (int itemID) { float discharge; float channelDepth; float channelWidth; float channelWidthMean; float width_canopy; // mean width of overhanging trees from each bank float canopy_proportion = 0.7; // proportion of total bank length (stream length * 2) with canopy float LAI = 0.9; // proportion of light shaded out float DOC; int koppen; //light parameters float solarRad; //MJ/m2/ float Ecan; float rad2par = 0.5; // proprotion of total radiation as PAR float reflectance = 0.9; //proportion of PAR transmitted across air-water interface float shading; float turbidity = 10; //NTU float Kturb = 0.177; // from Julian et al. 2008 float Kdoc = 0.05; //assumption: assume every mg/l of DOC leads to 1% attenuation (m-1) float Kd; // m-1 float par2bottom; float par2reach; discharge = MFVarGetFloat ( _MDInDischargeID, itemID, 0.0); solarRad = MFVarGetFloat ( _MDInSolarRadID, itemID, 0.0); //MJ/m2/d - CHECK UNITS - already accounts for clouds channelDepth = MFVarGetFloat ( _MDInRiverDepthID, itemID, 0.0); channelWidth = MFVarGetFloat ( _MDInRiverWidthID, itemID, 0.0); channelWidthMean = MFVarGetFloat (_MDInRiverbedWidthMeanID, itemID, 0.0); //assume mean width = bankfull width DOC = MFVarGetFloat (_MDInConcDOCID, itemID, 0.0) * 1000; //converts kg/m3 to mg/l koppen = MFVarGetInt (_MDInKoppenID, itemID, 0.0); // % TODO I think this is not % but category that should be read as integer FBM // KoppenID's : 1=Taiga, 2=semi-arid,3=tundra,4=temperate,5=tropics // Canopy width (m), assumption: Tundra=0,Taiga=2,Temperate=5,Semi-arid=0, WetTropics=10, DryTropics=0 switch (koppen) { // TODO Wil originally read this as float and tested for nan which should never happen particularly, when it is read as integer. case 1: width_canopy = 2; break; case 2: width_canopy = 0; break; case 3: width_canopy = 0; break; case 4: width_canopy = 5; break; case 5: width_canopy = 10; break; } Ecan = solarRad * rad2par; if (!isnan(discharge) && (channelWidthMean > 0) && (channelWidth > 0)){ if ((channelWidthMean / 2) < width_canopy){ shading = canopy_proportion * MDMinimum(1, LAI); } else { //proportion with canopy * proportion of half width not shaded // does not include effect of variable width within channel; need to scale down based on actual water surface area shading = canopy_proportion * (width_canopy / (channelWidthMean / 2)) * MDMinimum(1,LAI); } if (discharge > 0){ // turbidity = turbidity_const * pow(Q, turbidity_slope); Kd = Kturb * turbidity + Kdoc * DOC; //Figure 5; Julian et al. 2008 par2bottom = Ecan * (1 - shading) * reflectance * pow(2.71828, -1 * Kd * channelDepth); if (isnan(par2bottom)){ printf("Light: Q %f solarRad %f DOC %f Ecan %f shading %f reflectance %f Kd %f channelWidthMean %f channelDepth %f par2bottom %f \n", discharge, solarRad, DOC, Ecan, shading, reflectance, Kd, channelWidthMean, channelDepth, par2bottom); } } else { par2bottom = Ecan * shading; } par2reach = par2bottom * channelWidth * MFModelGetLength(itemID); //MJ/reach MFVarSetFloat(_MDPAR2BottomID, itemID, par2bottom); MFVarSetFloat(_MDPAR2ReachID, itemID, par2reach); } else{ MFVarSetFloat(_MDPAR2BottomID, itemID, 0.0); MFVarSetFloat(_MDPAR2ReachID, itemID, 0.0); } }
static void _MDNProcessing (int itemID) { float localLoad_DIN = 0.0; // mass of N from local non-point sources (kg/day) RJS 091108 float preFlux_DIN = 0.0; // mass of N coming from upstream (kg/day) RJS 091108 float preFluxMixing_DIN = 0.0; // mass of N coming from upstream MIXING ONLY (kg/day) RJS 091108 float storeWaterMixing_DIN = 0.0; // store water DIN MIXING ONLY (kg/day) float preConcMixingDIN = 0.0; // concentration MIXING ONLY (mg/L) float runoffVol = 0.0; // m3/sec float waterTotalVolume = 0.0; // water total volume (m3) float postFluxDIN = 0.0; // post flux of DIN (kg/day) float postFluxDINMixing = 0.0; // post flux of DIN mixing (kg/day) float storeWater_DIN = 0.0; // store water DIN (kg) ? float postStoreWater_DIN = 0.0; // store water DIN new time step (kg) // RJS 110308 float postStoreWaterMixing_DIN = 0.0; // store water DIN new time step (kg) float DINDeltaStorage = 0.0; // change in water DIN (kg) // RJS 110308 float DINDeltaStorageMixing = 0.0; // change in mixed water DIN (kg) // RJS 110508 float DINTotalIn = 0.0; // mass DIN in (kg) // RJS 110308 float DINTotalInMixing = 0.0; // mass DIN in Mixing (kg) // RJS 112008 float waterStorage = 0.0; // water storage (m3/day) float waterStorageChg = 0.0; // water storage change (m3/day) // RJS 01-06-09 float waterStoragePrev = 0.0; // water storage previous timestep (m3/day) // RJS 01-06-09 float totalMassRemovedTS_DIN = 0.0; // mass DIN removed in Transient Storage (kg/day) float preConcDIN = 0.0; // pre concentration of DIN kg/m3/day float postConcDIN = 0.0; // post concentration of DIN kg/m3/day float postConcDINMixing = 0.0; // post concentration of DIN mixing (kg/m3/day) float dischargePre = 0.0; // pre routing discharge that includes local cell runoff (m3/s) // 010609 float discharge = 0.0; // instantaneous discharge (m3/s) float dL = 0.0; // cell length (m) float transferDZ = 0.0; // probability of water transfer from MC to DZ float transferHZ = 0.0; // probability of water transfer from MC to HZ float uptakeDZ = 0.0; // probability of N uptake in DZ float uptakeHZ = 0.0; // probability of N uptake in HZ float removalTotal = 0.0; // Total removal (HZ + DZ) in grid cell reach float alphaDZ = 0.0; // exchange rate of water between MC and DZ float alphaHZ = 0.0; // exchange rate of water between MC and HZ float depth = 0.0; // river depth (m) float width = 0.0; // river width (m) float aA = 0.0; // main channel area (m2) float asDZ = 0.0; // DZ storage area (m2) float asHZ = 0.0; // HZ storage area (m2) float tStorDZ = 0.0; // time of storage or residence time in DZ (days) float tStorHZ = 0.0; // time of storage or residence time in HZ (days) float tStorMC = 0.0; // time of storage or residence time in MC (days) float vf = 0.0; // areal uptake rate (m / sec) float hydLoad = 0.0; // hydraulic load or discharge / benthic surface area (m / day) float uptakeMC = 0.0; // probability of N uptake in MC float removalDZ = 0.0; // probability that a molecule in channel removed in DZ float removalHZ = 0.0; // probability that a molecule in channel removed in HZ float removalMC = 0.0; // probability that a molecule in channel removed in MC float riverOrder = 0.0; // river order float R = 0.0; // proportional removal float totalMassRemovedDZ_DIN = 0.0; // total mass removed in DZ (kg/day) float totalMassRemovedHZ_DIN = 0.0; // total mass removed in HZ (kg/day) float totalMassRemovedMC_DIN = 0.0; // total mass removed in MC (kg/day) float totalMassRemoved_DIN = 0.0; // total mass removed (LK, DZ, MC, HZ) 032509 float waterDZ = 0.0; // water entering DZ float waterHZ = 0.0; // water entering HZ float massBalance_DIN; // RJS 110308 float massBalanceMixing_DIN; // RJS 112008 float flowPathRemoval = 0.0; // kg/day RJS 110508 --- if order<3, discharge = 0, preflux is removed via flowPathRemoval float flowPathRemovalMixing = 0.0; // kg/day RJS 112008 float velocity = 0.0; float runoffConc = 0.0; // RJS 120208 float ktMC = 0.0; // MC volumetric uptake rate (1 / day) float ktSTS = 0.0; // STS volumetric uptake rate (1 / day) float ktHTS = 0.0; // HTS volumetric uptake rate (1 / day) float tnQ10 = 2.0; //RJS 102410 float denit_int_vf = -2.975; //RJS 051011 calculated from avg vf = 0.137 m/day (LINX2), and average [] of 529 ug/L in LINX experiments, log(vf) = -m * log(C in ug/L) + e. float denit_slope = -0.493; //RJS 110110 float denit_int_kt = 0.2319; //MMM March 2013 New value calculated RJS 110110 calculated from kt = 0.64, and average [] of 529 ug/L in LINX experiments, log(kt) = -m * log(C in ug/L) + e float DIN_Vf = 0.0; //RJS 110110 float DIN_Vf_ref = 0.0; //RJS 110110 float DIN_Kt = 0.0; //RJS 110110 float DIN_Kt_ref = 0.0; //RJS 110110 float waterT = 0.0; //RJS 051211 float tnTref = 20.0; float placeHolder = 0.0; //RJS 042913 float VfAdjust = 1.0; //RJS 050213 float cell_1 = 1293; //255,138 float cell_2 = 999999; riverOrder = MFVarGetFloat (_MDInRiverOrderID, itemID, 0.0); //RJS 112211 localLoad_DIN = MFVarGetFloat (_MDInLocalLoad_DINID, itemID, 0.0); // kg/day RJS 091108 preFlux_DIN = MFVarGetFloat (_MDFlux_DINID, itemID, 0.0); // kg/day RJS 091108 storeWater_DIN = MFVarGetFloat (_MDStoreWater_DINID, itemID, 0.0); // kg/day RJS 091108 preFluxMixing_DIN = MFVarGetFloat (_MDFluxMixing_DINID, itemID, 0.0); // kg/day RJS 091108 changed from MDInFluxMixing 091408 storeWaterMixing_DIN = MFVarGetFloat (_MDStoreWaterMixing_DINID, itemID, 0.0); // kg/day RJS 091108 runoffVol = MFVarGetFloat (_MDInRunoffVolID, itemID, 0.0); // m3/sec waterStorage = MFVarGetFloat (_MDInRiverStorageID, itemID, 0.0); // m3/day RJS 01-06-09 waterStorageChg = MFVarGetFloat (_MDInRiverStorageChgID, itemID, 0.0); // m3/day RJS 01-06-09 waterStoragePrev = waterStorage - waterStorageChg; // m3/day RJS 01-06-09 discharge = MFVarGetFloat (_MDInDischargeID, itemID, 0.0); // m3/sec dischargePre = MFVarGetFloat (_MDInDischarge0ID, itemID, 0.0); // m3/sec dL = MFModelGetLength (itemID); // km converted to m // placeHolder = MFVarGetFloat (_MDInPlaceHolderID, itemID, 0.0); // run ThermalInputs tnQ10 = MFVarGetFloat (_MDInTnQ10ID, itemID, 0.0); // RJS 102410 waterT = MFVarGetFloat (_MDWTemp_QxTID, itemID, 0.0); DINTotalIn = localLoad_DIN + preFlux_DIN + storeWater_DIN; // kg/day RJS 110308 DINTotalInMixing = localLoad_DIN + preFluxMixing_DIN + storeWaterMixing_DIN; // kg/day ktMC = _MDUptakeKtMC; // RJS 033009 ktSTS = _MDUptakeKtSTS; // RJS 033009 ktHTS = _MDUptakeKtHTS; // RJS 033009 runoffConc = runoffVol > 0.0 ? (localLoad_DIN * 1000000) / (runoffVol * 86400 * 1000) : 0.0; depth = MFVarGetFloat (_MDInRiverDepthID, itemID, 0.0); // m // moved here 031209 width = MFVarGetFloat (_MDInRiverWidthID, itemID, 0.0); // m // moved here 031209 aA = width * depth; // m2 // moved here 031209 // waterTotalVolume = (waterStoragePrev) + (dischargePre * MDConst_m3PerSecTOm3PerDay); // DOES NOT INCLUDE WDLS m3/day RJS 01-06-09: using water storage from previous time step waterTotalVolume = (waterStoragePrev) + (discharge * MDConst_m3PerSecTOm3PerDay); // DOES NOT INCLUDE WDLS m3/day RJS 01-06-09: using water storage from previous time step VfAdjust = MFVarGetFloat (_MDInVfAdjustID, itemID, 1.0); // RJS 112211, adjusts loads, keep at 1 if nodata //waterT = 0.8 + ((26.2 - 0.8) / (1 + exp(0.18 * (13.3 - airT)))); // processing code if (discharge > 0.000001) { // preConcDIN = DINTotalIn / (waterTotalVolume) * 1000; // mg/L preConcMixingDIN = DINTotalInMixing / (waterTotalVolume) * 1000; // mg/L velocity = discharge / (depth * width); // m/s if (aA > 0.0) { // if aA < 0.0, then no TS should be executed. RJS 03-14-09 KYLE asDZ = aA * 0.204; // single value MEAN Scenario 061609 - ln transformed mean asHZ = aA * 0.348; // single value MEAN Scenario 061609 - ln transformed mean // alphaDZ = 0.00013; // single value MEAN Scenario 061609 - ln transformed mean // alphaHZ = 0.00000953; // single value MEAN Scenario 061609 - ln transformed mean alphaDZ = 0.0; // transient storage is off alphaHZ = 0.0; // transient storage is off ktMC = _MDUptakeKtMC; // single value MEAN Scenario 061609 - ln transformed mean ktSTS = _MDUptakeKtSTS; // single value MEAN Scenario 061609 - ln transformed mean ktHTS = _MDUptakeKtHTS; // single value MEAN Scenario 061609 - ln transformed mean tStorDZ = (asDZ / (alphaDZ * aA)) / 86400; // days if (alphaDZ == 0.0) tStorDZ = 0.0; // RJS 111710 tStorHZ = (asHZ / (alphaHZ * aA)) / 86400; // days if (alphaHZ == 0.0) tStorHZ = 0.0; // RJS 111710 transferDZ = alphaDZ * aA * dL / discharge; //RJS 072909 transferHZ = alphaHZ * aA * dL / discharge; //RJS 072909 if (preConcDIN > 0.0) { // DIN_Vf_ref = pow(10,(0.4328 + (log10(preConcDIN * 1000) * -0.479))); // based on Wollheim 2008 // DIN_Vf = DIN_Vf_ref * pow(tnQ10, (((waterT) - tnTref) / 10)); //m/d RJS 051211 // DIN_Kt_ref = pow(10,(denit_int_kt + (log10(preConcDIN * 1000) * denit_slope))); //ConcPre must be in ug/L // DIN_Kt = DIN_Kt_ref * pow(tnQ10, (((waterT) - tnTref) / 10)); //m/d RJS 051211 DIN_Vf_ref = pow(10,(denit_int_vf + (log10(preConcDIN * 1000) * denit_slope)))*86400/100; //no conversion to m/d neccesary - already in m/d DIN_Vf_ref = DIN_Vf_ref * VfAdjust; // m/d RJS 050213 DIN_Vf = DIN_Vf_ref * pow(tnQ10, (((waterT) - tnTref) / 10)); //m/d RJS 051211 DIN_Kt_ref = pow(10,(denit_int_kt + (log10(preConcDIN * 1000) * denit_slope)))*86400; //ConcPre must be in ug/L DIN_Kt = DIN_Kt_ref * pow(tnQ10, (((waterT) - tnTref) / 10)); //m/d RJS 051211 } else { DIN_Vf = 0.0; // m/d DIN_Kt = 0.0; // 1/d } waterHZ = discharge * transferHZ; // m3/s waterDZ = discharge * transferDZ; // m3/s hydLoad = discharge / (width * dL) * 86400; // m/day, vf = _MDUptakeKtMC * 0.131; // m/day... 0.131 is average depth (m) in Linx2 experiments RJS 033009 tStorMC = dL / velocity / 86400; // days, uptakeMC = 1.0 - pow(2.718281828, -1 * DIN_Vf / hydLoad); // RJS 102410 uptakeDZ = 1.0 - pow(2.718281828, -1 * DIN_Kt * tStorDZ); // RJS 102410 uptakeHZ = 1.0 - pow(2.718281828, -1 * DIN_Kt * tStorHZ); // RJS 102410 removalDZ = transferDZ * uptakeDZ; // reach scale proportional nutrient removal removalHZ = transferHZ * uptakeHZ; // reach scale proportional nutrient removal removalMC = uptakeMC; // reach scale proportional nutrient removal // **** RJS 032309 removalTotal = removalDZ + removalHZ + removalMC; totalMassRemovedDZ_DIN = (removalDZ) * DINTotalIn; // kg/day RJS 110308 totalMassRemovedHZ_DIN = (removalHZ) * DINTotalIn; // kg/day RJS 110308 totalMassRemovedMC_DIN = (removalMC) * DINTotalIn; // kg/day RJS 110308 totalMassRemovedTS_DIN = totalMassRemovedDZ_DIN + totalMassRemovedHZ_DIN; // kg/dayf } } else { flowPathRemoval = DINTotalIn; flowPathRemovalMixing = DINTotalInMixing; } if (discharge > 0.000001) { // postConcDIN = (DINTotalIn - totalMassRemovedTS_DIN - totalMassRemovedMC_DIN - flowPathRemoval) / waterTotalVolume * 1000; // mg/L postConcDINMixing = (DINTotalInMixing - flowPathRemovalMixing) / waterTotalVolume * 1000; // mg/L } else { postConcDIN = 0.0; // mg/L postConcDINMixing = 0.0; // mg/L } postFluxDIN = (discharge * MDConst_m3PerSecTOm3PerDay) * postConcDIN / 1000; // kg/day postFluxDINMixing = (discharge * MDConst_m3PerSecTOm3PerDay) * postConcDINMixing / 1000; // kg/day postStoreWater_DIN = (waterStorage * MDConst_m3PerSecTOm3PerDay) * postConcDIN / 1000; // kg/day postStoreWaterMixing_DIN = (waterStorage * MDConst_m3PerSecTOm3PerDay) * postConcDINMixing / 1000; // kg/day DINDeltaStorage = postStoreWater_DIN - storeWater_DIN; // kg/day DINDeltaStorageMixing = postStoreWaterMixing_DIN - storeWaterMixing_DIN; // kg/day if (discharge > 0.000001 && preConcDIN > 0.0) { // R = 1.0 - (postConcDIN / preConcDIN); // RJS 032409 vf = -1.0 * hydLoad * log(1.0 - R); // RJS 032409 if (R == 1.0) vf = -9999; } else { R = 0.0; vf = 0.0; } massBalance_DIN = ((localLoad_DIN + preFlux_DIN + storeWater_DIN) - (totalMassRemovedTS_DIN + totalMassRemovedMC_DIN + postFluxDIN + postStoreWater_DIN + flowPathRemoval)) / (localLoad_DIN + storeWater_DIN + preFlux_DIN); // RJS 111411 massBalanceMixing_DIN = ((localLoad_DIN + preFluxMixing_DIN) - (DINDeltaStorageMixing + flowPathRemovalMixing + postFluxDINMixing)) / (localLoad_DIN + storeWaterMixing_DIN + preFluxMixing_DIN); if (massBalance_DIN > 0.0003 && localLoad_DIN + storeWater_DIN + preFlux_DIN > 0.000001) printf("******\nmassBalance_DIN = %f, itemID = %d, postConcDIN = %f, waterStorage = %f, localLoad_DIN = %f, preFlux_DIN = %f, storeWater_DIN = %f\n totalMassRemovedTS_DIN = %f, totalMassRemovedMC_DIN = %f, postFluxDIN = %f, postStoreWater_DIN = %f, flowPathRemoval = %f", massBalance_DIN, itemID, postConcDIN, waterStorage, localLoad_DIN, preFlux_DIN, storeWater_DIN, totalMassRemovedTS_DIN, totalMassRemovedMC_DIN, postFluxDIN, postStoreWater_DIN, flowPathRemoval); //if (itemID==809) printf ("***** itemID=%d, month=%d, day=%d, year=%d, Q=%f, hydLoad=%f, waterT=%f, localLoad_DIN = %f \n",itemID,MFDateGetCurrentMonth(),MFDateGetCurrentDay(),MFDateGetCurrentYear(),discharge,hydLoad,waterT,localLoad_DIN); //if (itemID==809) printf ("preConcDIN=%f, postConcDIN=%f, preConcMixingDIN=%f, postConcMixingDIN=%f \n",preConcDIN,postConcDIN,preConcMixingDIN,postConcDINMixing); //if (itemID==809) printf ("DIN_Vf_ref=%f, DIN_Vf=%f, uptakeMC=%f, removalTotal=%f,totalMassRemovedMC_DIN=%f \n",DIN_Vf_ref,DIN_Vf,uptakeMC,removalTotal, totalMassRemovedMC_DIN); //if (itemID == cell_1 || itemID == cell_2) printf("**** itemID = %d, y = %d, m = %d, d = %d, discharge = %f, dischargePre = %f, waterStoragePrev = %f, waterTotalVolume = %f\n", itemID, MFDateGetCurrentYear(), MFDateGetCurrentMonth(), MFDateGetCurrentDay(), discharge, dischargePre, waterStoragePrev, waterTotalVolume); //if (itemID == cell_1 || itemID == cell_2) printf("ktMC = %f, DINTotalIn = %f,localLoad_DIN = %f, preFlux_DIN = %f, storeWater_DIN = %f, preConcDIN = %f\n", ktMC, DINTotalIn, localLoad_DIN, preFlux_DIN, storeWater_DIN, preConcDIN); //if (itemID == cell_1 || itemID == cell_2) printf("aA = %f, width = %f, depth = %f, dL = %f, asDZ = %f, asHZ = %f, alphaDZ = %f, alphaHZ = %f, tstorDZ = %f, tstorHZ = %f, transferDZ = %f, transferHZ = %f\n", aA, width, depth, dL, asDZ, asHZ, alphaDZ, alphaHZ, tStorDZ, tStorHZ, transferDZ, transferHZ); //if (itemID == cell_1 || itemID == cell_2) printf("DIN_Vf = %f, DIN_Kt = %f, hydLoad = %f, vf = %f, uptakeMC = %f, uptakeDZ = %f, uptakeHZ = %f, removalMC = %f, removalDZ = %f, removalHZ = %f\n", DIN_Vf, DIN_Kt, hydLoad, vf, uptakeMC, uptakeDZ, uptakeHZ, removalMC, removalDZ, removalHZ); //if (itemID == cell_1 || itemID == cell_2) printf("totalMassRemovedDZ_DIN = %f, totalMassRemovedHZ_DIN = %f, totalMassRemovedMC_DIN = %f, postConcDIN = %f, postFluxDIN = %f\n", totalMassRemovedDZ_DIN, totalMassRemovedHZ_DIN, totalMassRemovedMC_DIN, postConcDIN, postFluxDIN); //if (itemID == cell_1 || itemID == cell_2) printf("waterT = %f, postConcDINMixing = %f, tnTref = %f, DIN_Vf_ref = %f, DIN_Kt_ref = %f\n", waterT, postConcDINMixing, tnTref, DIN_Vf_ref, DIN_Kt_ref); MFVarSetFloat (_MDOutPreFlux_DINID, itemID, preFlux_DIN); // RJS 050911 MFVarSetFloat (_MDOutTotalMassRemoved_DINID, itemID, totalMassRemoved_DIN); // RJS 032509 MFVarSetFloat (_MDStoreWater_DINID, itemID, postStoreWater_DIN); MFVarSetFloat (_MDFlux_DINID, itemID, postFluxDIN); // changed from MDOutFlux_DINID 091408 MFVarSetFloat (_MDOutTotalMassRemovedTS_DINID, itemID, totalMassRemovedTS_DIN); MFVarSetFloat (_MDOutPostConc_DINID, itemID, postConcDIN); MFVarSetFloat (_MDOutPreConc_DINID, itemID, preConcDIN); // RJS 120408 MFVarSetFloat (_MDOutTotalMassRemovedDZ_DINID, itemID, totalMassRemovedDZ_DIN); MFVarSetFloat (_MDOutTotalMassRemovedHZ_DINID, itemID, totalMassRemovedHZ_DIN); MFVarSetFloat (_MDOutTotalMassRemovedMC_DINID, itemID, totalMassRemovedMC_DIN); MFVarSetFloat (_MDOutTimeOfStorageDZID, itemID, tStorDZ); MFVarSetFloat (_MDOutTimeOfStorageHZID, itemID, tStorHZ); MFVarSetFloat (_MDOutTimeOfStorageMCID, itemID, tStorMC); // RJS 120608 MFVarSetFloat (_MDOutTransferDZID, itemID, transferDZ); MFVarSetFloat (_MDOutTransferHZID, itemID, transferHZ); MFVarSetFloat (_MDOutWaterDZID, itemID, waterDZ); MFVarSetFloat (_MDOutWaterHZID, itemID, waterHZ); MFVarSetFloat (_MDOutUptakeVfID, itemID, DIN_Vf); MFVarSetFloat (_MDFluxMixing_DINID, itemID, postFluxDINMixing); // changed from MDOutFluxMixing_DINID 091408 MFVarSetFloat (_MDStoreWaterMixing_DINID, itemID, postStoreWaterMixing_DIN); MFVarSetFloat (_MDOutTotalMassPre_DINID, itemID, DINTotalIn); // RJS 091408 MFVarSetFloat (_MDOutConcMixing_DINID, itemID, postConcDINMixing); // RJS 091408 MFVarSetFloat (_MDOutMassBalance_DINID, itemID, massBalance_DIN); // RJS 110308 MFVarSetFloat (_MDOutMassBalanceMixing_DINID, itemID, massBalanceMixing_DIN); // RJS 112008 MFVarSetFloat (_MDOutRemovalDZID, itemID, removalDZ); //RJS 110708 MFVarSetFloat (_MDOutRemovalHZID, itemID, removalHZ); //RJS 110708 MFVarSetFloat (_MDOutRemovalMCID, itemID, removalMC); MFVarSetFloat (_MDOutRemovalTotalID, itemID, removalTotal); // RJS 03-01-09 MFVarSetFloat (_MDOutAaID, itemID, aA); //RJS 110808 MFVarSetFloat (_MDOutAsDZID, itemID, asDZ); //RJS 110808 MFVarSetFloat (_MDOutAsHZID, itemID, asHZ); //RJS 110808 MFVarSetFloat (_MDDeltaStoreWater_DINID, itemID, DINDeltaStorage); MFVarSetFloat (_MDDeltaStoreWaterMixing_DINID, itemID, DINDeltaStorageMixing); MFVarSetFloat (_MDFlowPathRemoval_DINID, itemID, flowPathRemoval); MFVarSetFloat (_MDFlowPathRemovalMixing_DINID, itemID, flowPathRemovalMixing); }
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); }
static void _MDRiverGPP (int itemID) { float channelWidth; //GPP drivers/parameters float par2bottom; //MJ / m2 /d float DIN = 1; //mg/l float DIP = 0.05; //mg/l float Ks_N = 0.1; float Ks_P = 0.01; float Km = 0.01; // algal mortality d-1 float Ks = 0.01; // algal sloughing d-1 float Ben_C2CHL = 50; //Benthic Carbon variables float uEinsteinperm2stoWattperm2 = 0.2174; //see websitehttp://www.seabird.com/application_notes/AN11General.htm based on Morel and Smith 1974, valid for sun altitudes > 22 degrees float daylength = 12; //hours of light per day needed to convert daily par to per second float Ed; float Ek = 100; // PAR in microEinsteins / m2/s at onset of saturation - in Table 10.1 of Kirk, ueinsteins / m2 / s float Ben_GPPmax; //g C / h / g chl at light saturation float Ben_GPP; // g C / m2 /d float Ben_MORTALITY; float Ben_Ra; float Ben_NPP; float Ben_AlgaeC; float Ben_AlgaeCHL; float Ben_AlgaeC_REACH; float Ben_GPP_REACH; float Ben_Ra_REACH; float Ben_NPP_REACH; float Ben_Mortality_REACH; float day; day = MFDateGetCurrentDay(); float month; month = MFDateGetCurrentMonth(); channelWidth = MFVarGetFloat ( _MDInRiverWidthID, itemID, 0.0); par2bottom = MFVarGetFloat ( _MDInPAR2BottomID, itemID, 0.0); Ben_AlgaeCHL = MFVarGetFloat ( _MDBenthicAlgaeCHLID, itemID, 0.0); // g Chl / m2 Ben_AlgaeC = MFVarGetFloat ( _MDBenthicAlgaeCID, itemID, 0.0); // g C / m2 //TODO: How to get Chl spun up - uptake depends on CHL, but CHL starts at 0. The following is a place holder: Ben_AlgaeC = ((day == 1 && Ben_AlgaeC == 0.0) ? 0.1 : Ben_AlgaeC); Ben_AlgaeCHL = ((day == 1 && Ben_AlgaeC == 0.0) ? 0.1 * Ben_C2CHL : Ben_AlgaeCHL); Ed = (par2bottom / (daylength * 60 * 60)) * pow(10,6) * 1 * (1 / uEinsteinperm2stoWattperm2); // uEinsteins / m2 / s, average for day assuming daylight hours and converted from radiation units of MJ/m2/d Ben_GPPmax = MDMaximum(0.0, MDMaximum(1, (3.7 - (0.1 * Ben_AlgaeCHL)))); //g C / hr / g chl at light saturation Ryther and Yentsch 1957, but add a self shading control //refs for the eqn Ryther and Yentsch 1957; Kirk 1994 (EQN 10.4) Ben_GPP = Ben_AlgaeCHL * Ben_GPPmax * daylength * DIN / (DIN + Ks_N) * DIP / (DIP + Ks_P) * (1 - exp(-Ed / Ek)); //g C / m2 / d // N limitation P limitation decay from light saturation float Ben_RespRate = 0.1; //d-1 Ben_Ra = MDMinimum(Ben_AlgaeC * 0.9, Ben_AlgaeC * Ben_RespRate); // g C / m2 / day autotrophic respiration Ks = 0.05 + 0.01 * (Ben_AlgaeC + Ben_GPP - Ben_Ra); Ben_MORTALITY = MDMinimum((Ben_AlgaeC - Ben_Ra), (Ben_AlgaeC - Ben_Ra) * (Km + Ks)); //gC / m2 / day; Ben_NPP = Ben_GPP - Ben_Ra; Ben_AlgaeC = Ben_AlgaeC + Ben_GPP - Ben_MORTALITY - Ben_Ra ; // g C / m2 / day Ben_AlgaeCHL = Ben_AlgaeC / Ben_C2CHL; //g Chl / m2 //if (par2bottom > 0.0){ if (itemID == 175){ printf("itemID %d month %f day %f par2bottom %f Ed %f Ben_GPP %f Ben_Ra %f Ben_NPP %f Ben_Mortality %f Ben_AlgaeC %f Ben_AlgaeCHL %f \n", itemID, month, day, par2bottom, Ed, Ben_GPP, Ben_Ra, Ben_NPP, Ben_MORTALITY, Ben_AlgaeC, Ben_AlgaeCHL ); } Ben_AlgaeC_REACH = Ben_AlgaeC * channelWidth * MFModelGetLength(itemID); Ben_GPP_REACH = Ben_GPP * channelWidth * MFModelGetLength(itemID); Ben_Ra_REACH = Ben_Ra * channelWidth * MFModelGetLength(itemID); Ben_NPP_REACH = Ben_NPP * channelWidth * MFModelGetLength(itemID); Ben_Mortality_REACH = Ben_MORTALITY * channelWidth * MFModelGetLength(itemID); MFVarSetFloat(_MDBenthicAlgaeCHLID, itemID, Ben_AlgaeCHL); MFVarSetFloat(_MDBenthicAlgaeCID, itemID, Ben_AlgaeC); MFVarSetFloat(_MDBenthicGPPID, itemID, Ben_GPP); MFVarSetFloat(_MDBenthicRaID, itemID, Ben_Ra); MFVarSetFloat(_MDBenthicNPPID, itemID, Ben_NPP); MFVarSetFloat(_MDBenthicMortalityID, itemID, Ben_MORTALITY); MFVarSetFloat(_MDBenthicAlgaeC_REACHID, itemID, Ben_AlgaeC_REACH); MFVarSetFloat(_MDBenthicGPP_REACHID, itemID, Ben_GPP_REACH); MFVarSetFloat(_MDBenthicRa_REACHID, itemID, Ben_Ra_REACH); MFVarSetFloat(_MDBenthicNPP_REACHID, itemID, Ben_NPP_REACH); MFVarSetFloat(_MDBenthicMortality_REACHID, itemID, Ben_Mortality_REACH); }
static void _MDMultiRiverbedShapeExponent (int itemID) { // Input float slope; // Riverbed slope [m/km] float discharge; // Mean annual discharge [m3/s] float eta = 0.0; float nu = 0.0; float tau = 0.0; float phi = 0.0; float eta2 = 0.0; float nu2 = 0.0; float tau2 = 0.0; float phi2 = 0.0; float eta3 = 0.0; float nu3 = 0.0; float tau3 = 0.0; float phi3 = 0.0; float basinID = 0.0; // Output float yMean; // River average depth at mean discharge [m] float wMean; // River width at mean discharge [m] // Local float dL; // Reach length [m] // float eta = 0.25, nu = 0.4, tau = 8.0, phi = 0.58; //old // float eta = 0.36, nu = 0.37, tau = 3.55, phi = 0.51; //new based on Knighton (avg) // float eta = 0.33, nu = 0.35, tau = 3.67, phi = 0.45; // Hey and Thorn (1986) (used for ERL 2013) eta = MFVarGetFloat (_MDInEtaID, itemID, 0.0); nu = MFVarGetFloat (_MDInNuID, itemID, 0.0); tau = MFVarGetFloat (_MDInTauID, itemID, 0.0); phi = MFVarGetFloat (_MDInPhiID, itemID, 0.0); basinID = MFVarGetFloat (_MDInBasinID, itemID, 0.0); if (basinID == 2) { eta = MFVarGetFloat (_MDInEta2ID, itemID, 0.0); nu = MFVarGetFloat (_MDInNu2ID, itemID, 0.0); tau = MFVarGetFloat (_MDInTau2ID, itemID, 0.0); phi = MFVarGetFloat (_MDInPhi2ID, itemID, 0.0); } if (basinID == 3) { eta = MFVarGetFloat (_MDInEta3ID, itemID, 0.0); nu = MFVarGetFloat (_MDInNu3ID, itemID, 0.0); tau = MFVarGetFloat (_MDInTau3ID, itemID, 0.0); phi = MFVarGetFloat (_MDInPhi3ID, itemID, 0.0); } if (MFVarTestMissingVal (_MDInDischMeanID, itemID)) { MFVarSetFloat (_MDOutRiverbedAvgDepthMeanID, itemID, 0.0); MFVarSetFloat (_MDOutRiverbedWidthMeanID, itemID, 0.0); MFVarSetFloat (_MDOutRiverbedVelocityMeanID, itemID, 0.0); MFVarSetFloat (_MDOutRiverbedShapeExponentID, itemID, 2.0); return; } discharge = fabs(MFVarGetFloat(_MDInDischMeanID, itemID, 0.0)); dL = MFModelGetLength (itemID); yMean = eta * pow (discharge, nu); wMean = tau * pow (discharge, phi); // if ((itemID == 393) || (itemID == 1374) || (itemID == 3296)) printf("basinID = %f, eta = %f, nu = %f, tau = %f, phi = %f\n", basinID, eta, nu, tau, phi); MFVarSetFloat (_MDOutRiverbedAvgDepthMeanID, itemID, yMean); MFVarSetFloat (_MDOutRiverbedWidthMeanID, itemID, wMean); MFVarSetFloat (_MDOutRiverbedVelocityMeanID, itemID, discharge / (yMean * wMean)); MFVarSetFloat (_MDOutRiverbedShapeExponentID, itemID, 2.0); }