Ejemplo n.º 1
0
static void _MDWTempSurfRunoffPool (int itemID) {

	float SurfRunoffT;
    float SurfRunoffPoolT;

	float SurfRunoff;
    float SurfRunoffPool;

	SurfRunoffT     = MFVarGetFloat (_MDInWTempSurfRunoffID,      itemID, 0.0);
	SurfRunoffPoolT = MFVarGetFloat (_MDOutWTempSurfRunoffPoolID, itemID, 0.0);
	SurfRunoff      = MFVarGetFloat (_MDInRainSurfRunoffID,       itemID, 0.0);
	SurfRunoffPool  = MFVarGetFloat (_MDInRunoffPoolID,           itemID, 0.0);

	SurfRunoff      = MDMaximum(0, SurfRunoff);
	SurfRunoffPool  = MDMaximum(0, SurfRunoffPool);

	if (!isnan(SurfRunoffPool) && !isnan(SurfRunoff) &&
			((SurfRunoffPool + SurfRunoff) > 0) &&
			!isnan(SurfRunoffPoolT) && !isnan(SurfRunoffT)){

	    SurfRunoffPoolT = MDMaximum(((SurfRunoffPool * SurfRunoffPoolT) + (SurfRunoff * SurfRunoffT)) /
	                       (SurfRunoffPool + SurfRunoff), 0.0);

	    MFVarSetFloat (_MDOutWTempSurfRunoffPoolID, itemID, SurfRunoffPoolT);

	}
	else{

  	    MFVarSetMissingVal(_MDOutWTempSurfRunoffPoolID,itemID);

	}

}
Ejemplo n.º 2
0
static void _MDWTempGrdWater (int itemID) {
	float airT;
	float RechargeT;
    float GrdWaterT;

	float RainRechargeIn;
	float IrrReturnFlow;
    float GrdWaterStorage;




	airT               = MFVarGetFloat (_MDInAirTempID,         itemID, 0.0);
	RechargeT          = MFVarGetFloat (_MDInWTempSurfRunoffID, itemID, 0.0);

	RainRechargeIn     = MFVarGetFloat (_MDInRainRechargeID,    itemID, 0.0);

	if (_MDInIrrReturnFlowID != MFUnset){
	IrrReturnFlow      = MFVarGetFloat (_MDInIrrReturnFlowID,   itemID, 0.0);
	}
	else { IrrReturnFlow = 0; }

	GrdWaterStorage    = MFVarGetFloat (_MDOutGrdWaterID,         itemID, 0.0);
	GrdWaterT          = MFVarGetFloat (_MDOutWTempGrdWaterID,   itemID, 0.0);
	//if (itemID == 233){
	//        	printf("Stop itemID %d day %d \n", itemID, MFDateGetCurrentDay());
	//   	 }

	//TODO: why is RainRechargeIn < 0 sometimes?
	RainRechargeIn = MDMaximum(0, RainRechargeIn);
	IrrReturnFlow = MDMaximum(0, IrrReturnFlow);
	GrdWaterStorage = MDMaximum(0, GrdWaterStorage);

	if (!isnan(GrdWaterStorage) && !isnan(RainRechargeIn) && !isnan(IrrReturnFlow) &&
			((GrdWaterStorage + RainRechargeIn + IrrReturnFlow) > 0) &&
			!isnan(GrdWaterT) && !isnan(RechargeT) && !isnan(airT)){


	    GrdWaterT = MDMaximum( (((GrdWaterStorage * GrdWaterT) + (RainRechargeIn * RechargeT) + (IrrReturnFlow * airT)) /
	                       (GrdWaterStorage + RainRechargeIn + IrrReturnFlow)), 0.0);
       // if (GrdWaterT > 30){
       // 	printf("Stop itemID %d day %d \n", itemID, MFDateGetCurrentDay());
       // }
	   // GrdWaterT = MDMinimum(GrdWaterT, 40);
	    //does this need to be properly mass balanced?  GRdwater T might just keep going up.

	    MFVarSetFloat (_MDOutWTempGrdWaterID,itemID,GrdWaterT);
	}
	else{
  	    MFVarSetMissingVal(_MDOutWTempGrdWaterID,itemID);

	}

	if (GrdWaterT > 100) printf("m = %d, d = %d, itemID = %d, GrdWaterT = %f, RainRechargeIn = %f\n", MFDateGetCurrentMonth (), MFDateGetCurrentDay (), itemID, GrdWaterT, RainRechargeIn);
//	if (itemID == 486) printf("y = %d, m = %d, d = %d, GwT = %f, ReT = %f, AirT = %f, Recharge = %f, GW = %f\n", MFDateGetCurrentYear(), MFDateGetCurrentMonth(), MFDateGetCurrentDay(), GrdWaterT, RechargeT, airT, RainRechargeIn, GrdWaterStorage);

}
Ejemplo n.º 3
0
static void _MDRainPotETPsTaylor (int itemID) {
// Priestley and Taylor (1972) PE in mm for day
// Input
	float dayLen; // daylength in fraction of day
	float i0hDay; // daily potential insolation on horizontal [MJ/m2]
	float albedo; // albedo
	float airT;   // air temperatur [degree C]
	float solRad; // daily solar radiation on horizontal [MJ/m2]
	float vPress; // daily average vapor pressure [kPa]
	float sHeat = 0.0;  // average subsurface heat storage for day [W/m2]
// Local	
	float solNet;  // average net solar radiation for daytime [W/m2]
	float lngNet;  // average net longwave radiation for day  [W/m2]
	float aa;      // available energy [W/m2]
	float es;      // vapor pressure at airT [kPa]
	float delta;   // dEsat/dTair [kPa/K]
 	float dd;      // vapor pressure deficit [kPa]
	float le;      // latent heat [W/m2]
// Output
	float pet;

	if (MFVarTestMissingVal (_MDInDayLengthID,    itemID) ||
		 MFVarTestMissingVal (_MDInI0HDayID,       itemID) ||
		 MFVarTestMissingVal (_MDInCParamAlbedoID, itemID) ||
		 MFVarTestMissingVal (_MDInAtMeanID,       itemID) ||
		 MFVarTestMissingVal (_MDInSolRadID,       itemID) ||
		 MFVarTestMissingVal (_MDInVPressID,       itemID)) { MFVarSetMissingVal (_MDOutPetID,itemID); return; }

	dayLen  = MFVarGetFloat (_MDInDayLengthID,    itemID, 0.0);
	i0hDay  = MFVarGetFloat (_MDInI0HDayID,       itemID, 0.0);
	albedo  = MFVarGetFloat (_MDInCParamAlbedoID, itemID, 0.0);
	airT    = MFVarGetFloat (_MDInAtMeanID,       itemID, 0.0);
	solRad  = MFVarGetFloat (_MDInSolRadID,       itemID, 0.0);
	vPress  = MFVarGetFloat (_MDInVPressID,       itemID, 0.0);

	solNet = (1.0 - albedo) * solRad / MDConstIGRATE;
	lngNet = MDSRadNETLong (i0hDay,airT,solRad,vPress);

	aa     = solNet + lngNet - sHeat;
	es     = MDPETlibVPressSat (airT);
	delta  = MDPETlibVPressDelta (airT);

	dd     = es - vPress; 
   le     = MDConstPTALPHA * delta * aa / (delta + MDConstPSGAMMA);

	pet = MDConstEtoM * MDConstIGRATE * le; 
   MFVarSetFloat (_MDOutPetID,itemID,pet);
}
Ejemplo n.º 4
0
static void _MDAccumBalance (int itemID)
{
// Input
	double precip;    // Precipitation [mm/dt]
	double evap;      // Evapotranspiration [mm/dt]
	double sMoistChg; // Soil moisture change [mm/dt]
	double grdWatChg; // Groundwater change [mm/dt]
	double runoff;    // Runoff [mm/dt]

	if (MFVarTestMissingVal (_MDInAccPrecipID,    itemID) ||
	    MFVarTestMissingVal (_MDInAccEvapID,      itemID) ||
		MFVarTestMissingVal (_MDInAccSMoistChgID, itemID) ||
		MFVarTestMissingVal (_MDInAccGrdWatChgID, itemID) ||
		MFVarTestMissingVal (_MDInAccRunoffID,    itemID)) MFVarSetMissingVal (_MDOutAccBalanceID,itemID);
	else {
		precip     = MFVarGetFloat(_MDInAccPrecipID,    itemID, 0.0);
		evap       = MFVarGetFloat(_MDInAccEvapID,      itemID, 0.0);
		sMoistChg  = MFVarGetFloat(_MDInAccSMoistChgID, itemID, 0.0);
		grdWatChg  = MFVarGetFloat(_MDInAccGrdWatChgID, itemID, 0.0);
		runoff     = MFVarGetFloat(_MDInAccRunoffID,    itemID, 0.0);
		MFVarSetFloat(_MDOutAccBalanceID, itemID, precip + evap + sMoistChg + grdWatChg + runoff);
	}
}
Ejemplo n.º 5
0
static void _MDRainPotETPstd (int itemID) {
// Penman (1948) PE in mm for day also given by Chidley and Pike (1970)
// Input
    float dayLen; // daylength in fraction of day
    float i0hDay; // daily potential insolation on horizontal [MJ/m2]
    float albedo; // albedo
    float airT;   // air temperatur [degree C]
    float solRad; // daily solar radiation on horizontal [MJ/m2]
    float vPress; // daily average vapor pressure [kPa]
    float wSpeed; // average wind speed for the day [m/s]
    float sHeat = 0.0; // average subsurface heat storage for day [W/m2]
// Local
    float solNet; // average net solar radiation for day [W/m2]
    float novern; // sunshine duration fraction of daylength
    float effem;  // effective emissivity from clear sky
    float cldCor; // cloud cover correction to net longwave under clear sky
    float lngNet; // average net longwave radiation for day [W/m2]
    float aa;     // available energy [W/m2]
    float fu;     // Penman wind function, [mm d-1 kPa-1]
    float es;     // vapor pressure at airT [kPa]
    float delta;  // dEsat/dTair [kPa/K]
// Output
    float pet;

    if (MFVarTestMissingVal (_MDInDayLengthID,    itemID) ||
            MFVarTestMissingVal (_MDInI0HDayID,       itemID) ||
            MFVarTestMissingVal (_MDInCParamAlbedoID, itemID) ||
            MFVarTestMissingVal (_MDInAtMeanID,       itemID) ||
            MFVarTestMissingVal (_MDInSolRadID,       itemID) ||
            MFVarTestMissingVal (_MDInVPressID,       itemID) ||
            MFVarTestMissingVal (_MDInWSpeedID,       itemID)) {
        MFVarSetMissingVal (_MDOutPetID,itemID);
        return;
    }

    dayLen  = MFVarGetFloat (_MDInDayLengthID,    itemID, 12.0);
    i0hDay  = MFVarGetFloat (_MDInI0HDayID,       itemID,  0.0);
    albedo  = MFVarGetFloat (_MDInCParamAlbedoID, itemID,  0.0);
    airT    = MFVarGetFloat (_MDInAtMeanID,       itemID,  0.0);
    solRad  = MFVarGetFloat (_MDInSolRadID,       itemID,  0.0);
    vPress  = MFVarGetFloat (_MDInVPressID,       itemID,  0.0);
    wSpeed  = fabs (MFVarGetFloat (_MDInWSpeedID, itemID,  0.0));
    if (wSpeed < 0.2) wSpeed = 0.2;

    solNet = (1.0 - albedo) * solRad / MDConstIGRATE; // net solar with Penman (1948) albedo of 0.25

    effem = 0.44 + 0.252 * sqrt (vPress); // Brunt method for effective emissivity with Penman (1948) coefficients

    novern = ((solRad / i0hDay) - 0.18) / 0.55; // Penman's relation of SOLRAD / I0HDAY to sunshine duration n/N
    if (novern > 1.0) novern = 1.0;

    cldCor = 0.1 + 0.9 * novern; //Penman's (1948) longwave cloud correction coefficient
    lngNet = (effem - 1.0) * cldCor * MDConstSIGMA * pow (airT + 273.15,4.0);
    aa = solNet + lngNet - sHeat;
    es = MDPETlibVPressSat (airT);
    delta = MDPETlibVPressDelta (airT);

    fu = 2.6 * (1.0 + 0.54 * wSpeed); // Penman wind function given by Brutsaert (1982) eq 10.17

    // Penman equation from Brutsaert eq 10.15
    pet = (delta * MDConstEtoM * MDConstIGRATE * aa + MDConstPSGAMMA * fu * (es - vPress)) / (delta + MDConstPSGAMMA);
    MFVarSetFloat (_MDOutPetID,itemID,pet);
}
Ejemplo n.º 6
0
static void _MDRainPotETSWGday (int itemID) {
// daily Shuttleworth-Wallace-Gurney (1985, 1990) PE in mm for day
// Input
	float dayLen;  // daylength in fraction of day
 	float i0hDay;  // daily potential insolation on horizontal [MJ/m2]
	float albedo;  // albedo 
	float height;  // canopy height [m]
	float lWidth;  // average leaf width [m]
	float rss;     // soil surface resistance [s/m]
	float r5;      // solar radiation at which conductance is halved [W/m2]
	float cd;      // vpd at which conductance is halved [kPa]
	float cr;      // light extinction coefficient for projected LAI
	float glMax;   // maximum leaf surface conductance for all sides of leaf [m/s]
	float z0g;     // z0g       - ground surface roughness [m]
 	float lai;     // projected leaf area index
	float sai;     // projected stem area index
	float airT;    // air temperatur [degree C]
	float airTMin; // daily minimum air temperature [degree C] 
	float solRad;  // daily solar radiation on horizontal [MJ/m2]
	float vPress;  // daily average vapor pressure [kPa]
	float wSpeed;  // average wind speed for the day [m/s] 
	float sHeat = 0.0; // average subsurface heat storage for day [W/m2]
// Local
	float solNet;  // average net solar radiation for daytime [W/m2]
	float lngNet;  // average net longwave radiation [W/m2]
	float z0;      // roughness parameter [m] 
 	float disp;    // height of zero-plane [m]
	float z0c;     // roughness parameter (closed canopy)
	float dispc;   // zero-plane displacement (closed canopy)
	float aa;      // available energy [W/m2]
	float asubs;   // available energy at ground [W/m2]
	float es;      // vapor pressure at airT [kPa]
	float delta;   // dEsat/dTair [kPa/K]
 	float dd;      // vapor pressure deficit [kPa]
 	float rsc;     // canopy resistance [s/m]
	float le;      // latent heat [W/m2]
	float rn;      // net radiation [W/m2]
	float rns;     // net radiation at ground [W/m2]
	float raa;     // aerodynamic resistance [s/m]
	float rac;     // leaf boundary layer resistance [s/m]
	float ras;     // ground aerodynamic resistance [s/m]
// Output
	float pet;

	if (MFVarTestMissingVal (_MDInDayLengthID,    itemID) ||
		 MFVarTestMissingVal (_MDInI0HDayID,       itemID) ||
		 MFVarTestMissingVal (_MDInCParamAlbedoID, itemID) ||
		 MFVarTestMissingVal (_MDInCParamCHeightID,itemID) ||
		 MFVarTestMissingVal (_MDInCParamLWidthID, itemID) ||
		 MFVarTestMissingVal (_MDInCParamRSSID,    itemID) ||
		 MFVarTestMissingVal (_MDInCParamR5ID,     itemID) ||
		 MFVarTestMissingVal (_MDInCParamCDID,     itemID) ||
		 MFVarTestMissingVal (_MDInCParamCRID,     itemID) ||
		 MFVarTestMissingVal (_MDInCParamGLMaxID,  itemID) ||
		 MFVarTestMissingVal (_MDInCParamZ0gID,    itemID) ||
		 MFVarTestMissingVal (_MDInLeafAreaIndexID,itemID) ||
		 MFVarTestMissingVal (_MDInStemAreaIndexID,itemID) ||
		 MFVarTestMissingVal (_MDInAtMeanID,       itemID) ||
		 MFVarTestMissingVal (_MDInAtMinID,        itemID) ||
		 MFVarTestMissingVal (_MDInSolRadID,       itemID) ||
		 MFVarTestMissingVal (_MDInVPressID,       itemID) ||
		 MFVarTestMissingVal (_MDInWSpeedID,       itemID)) { MFVarSetMissingVal (_MDOutPetID,itemID); return; }

	dayLen  = MFVarGetFloat (_MDInDayLengthID,     itemID, 0.1);
	i0hDay  = MFVarGetFloat (_MDInI0HDayID,        itemID,  0.0);
	albedo  = MFVarGetFloat (_MDInCParamAlbedoID,  itemID,  0.0);
	height  = MFVarGetFloat (_MDInCParamCHeightID, itemID,  0.0);
	lWidth  = MFVarGetFloat (_MDInCParamLWidthID,  itemID,  0.0);
	rss     = MFVarGetFloat (_MDInCParamRSSID,     itemID,  0.0);
	r5      = MFVarGetFloat (_MDInCParamR5ID,      itemID,  0.0);
	cd      = MFVarGetFloat (_MDInCParamCDID,      itemID,  0.0);
	cr      = MFVarGetFloat (_MDInCParamCRID,      itemID,  0.0);
	glMax   = MFVarGetFloat (_MDInCParamGLMaxID,   itemID,  0.0);
	z0g     = MFVarGetFloat (_MDInCParamZ0gID,     itemID,  0.0);
	lai     = MFVarGetFloat (_MDInLeafAreaIndexID, itemID,  0.0);
	sai     = MFVarGetFloat (_MDInStemAreaIndexID, itemID,  0.0);
	airT    = MFVarGetFloat (_MDInAtMeanID,        itemID,  0.0);
	airTMin = MFVarGetFloat (_MDInAtMinID,         itemID,  0.0);
	solRad  = MFVarGetFloat (_MDInSolRadID,        itemID,  0.0);
	vPress  = MFVarGetFloat (_MDInVPressID,        itemID,  0.0);
	wSpeed  = fabs (MFVarGetFloat (_MDInWSpeedID,  itemID,  0.0));
	if (wSpeed < 0.2) wSpeed = 0.2;

	solNet  = (1.0 - albedo) * solRad / MDConstIGRATE;
	
	z0c     = MDPETlibRoughnessClosed (height,z0g);
	dispc   = height - z0c / 0.3;
	disp    = MDPETlibZPDisplacement (height,lai,sai,z0g);
	z0      = MDPETlibRoughness (disp,height,lai,sai,z0g);

	lngNet  = MDSRadNETLong (i0hDay,airT,solRad,vPress);
	rn      = solNet + lngNet;
	aa      = rn - sHeat;
	rns     = rn * exp (-cr * (lai + sai));
	asubs   = rns - sHeat;
	es      = MDPETlibVPressSat   (airT);
	delta   = MDPETlibVPressDelta (airT);
	dd      = es - vPress; 

	rsc     = MDPETlibCanopySurfResistance (airTMin,solRad,dd,lai,sai,r5,cd,cr,glMax);
	raa     = MDPETlibBoundaryResistance   (wSpeed,height,z0g,z0c,dispc,z0,disp);
	rac     = MDPETlibLeafResistance       (wSpeed,height,lWidth,z0g,lai,sai,z0c,dispc);
	ras     = MDPETlibGroundResistance     (wSpeed,height,z0g,z0c,dispc,z0,disp);
//	ras=70;
//	raa=50;
	rsc=70;
	le      = MDPETlibShuttleworthWallace  (rss,aa,asubs,dd,raa,rac,ras,rsc,delta);

	pet = MDConstEtoM * MDConstIGRATE * le;
//	float pet1 = MFVarGetFloat (_MDInRefETPIDDEBUG,   itemID,  0.0);
//	printf ("height %f lWidth %f rss %f r4 %f cd %f cr %f glMax %f z0g %f lai %f sai %f \n",height , lWidth ,rss, r5 ,cd ,cr, glMax ,z0g ,lai , sai );
//	printf ("pet BMF %f pet FAO %f albedo %f\n",pet,pet1,albedo);
	MFVarSetFloat (_MDOutPetID,itemID,pet);
}
Ejemplo n.º 7
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);


}
Ejemplo n.º 8
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);
}