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);


}
Exemple #5
0
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);
	  }
}
Exemple #6
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);

}
Exemple #7
0
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);
}
Exemple #8
0
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);
}