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);
}
Beispiel #2
0
static void _MDDischLevel1 (int itemID) {
	float discharge;

	if ((_MDInDischReleasedID != MFUnset) && (!MFVarTestMissingVal (_MDInDischReleasedID, itemID)))
		 discharge = MFVarGetFloat (_MDInDischReleasedID, itemID, 0.0);
	else discharge = MFVarGetFloat (_MDInDischLevel2ID,   itemID, 0.0);

//		if (itemID == 25014) printf("discharge= %f\n",discharge);
//	if (itemID == 1224 || itemID == 531) printf("**DischLevel1** itemID = %d, day = %d, discharge = %f\n", itemID, MFDateGetCurrentDay(), discharge);
	MFVarSetFloat (_MDOutDischLevel1ID, itemID, discharge);
}
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);
}
Beispiel #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);
	}
}
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);
}
Beispiel #6
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);
}
Beispiel #7
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);
}
Beispiel #8
0
static void _MDSPackChg (int itemID) {
// Input
	float airT;
	float precip;
	float winterOnsetDoY;
	float initialDensity = 150;
	float sDensitySlope = 3;
	if( _MDCalculateSoilTempID==1)winterOnsetDoY = MFVarGetFloat(_MDInWinterOnsetID, itemID,1.0);
//	printf ("Anf SnowPackChange \n");
	// Local
	float sPack;
	float sPackChg = 0.0;
	float sDensity=0.0;
	float sDepth = 0.0;
	int snowAge=0;
	float densityOfWater =1000;
	if (MFDateGetDayOfYear()  - winterOnsetDoY > 0){
	snowAge = MFDateGetDayOfYear() - winterOnsetDoY;
	}else{
		snowAge = 365 - winterOnsetDoY + MFDateGetDayOfYear();
	}
	
		
	
	sPack  = MFVarGetFloat (_MDOutSnowPackID, itemID, 0.0);
	if (MFVarTestMissingVal (_MDInAtMeanID,itemID) || MFVarTestMissingVal (_MDInPrecipID, itemID)) {
		MFVarSetFloat (_MDOutSnowFallID, itemID, 0.0);
		MFVarSetFloat (_MDOutSnowMeltID, itemID, 0.0);
		MFVarSetFloat (_MDOutSnowPackID, itemID, sPack);	
		MFVarSetFloat (_MDOutSPackChgID, itemID, 0.0);
		return; 
	}

//printf ("SnowMeltThreshold= %f SnoFall %f\n",_MDSnowMeltThreshold, _MDFallThreshold);
	airT   = MFVarGetFloat (_MDInAtMeanID,    itemID, 0.0);
	precip = MFVarGetFloat (_MDInPrecipID,    itemID, 0.0);

	if (airT < _MDFallThreshold) {  /* Accumulating snow pack */
		MFVarSetFloat (_MDOutSnowFallID, itemID, precip);
		MFVarSetFloat (_MDOutSnowMeltID, itemID, 0.0);
		MFVarSetFloat (_MDOutSnowPackID, itemID, sPack + precip);
		MFVarSetFloat (_MDOutSPackChgID, itemID, precip);
	}
	else if (airT > _MDSnowMeltThreshold) { /* Melting snow pack */
		sPackChg = 2.63 + 2.55 * airT + 0.0912 * airT * precip;
		sPackChg = - (sPack < sPackChg ? sPack : sPackChg);
		MFVarSetFloat (_MDOutSnowFallID, itemID, 0.0);
		MFVarSetFloat (_MDOutSnowMeltID, itemID, fabs(sPackChg));
		MFVarSetFloat (_MDOutSPackChgID, itemID, sPackChg);
		MFVarSetFloat (_MDOutSnowPackID, itemID, sPack + sPackChg);
	}
	else { /* No change when air temperature is in [-1.0,1.0] range */
		MFVarSetFloat (_MDOutSnowFallID, itemID, 0.0);
		MFVarSetFloat (_MDOutSnowMeltID, itemID, 0.0);
		MFVarSetFloat (_MDOutSnowPackID, itemID, sPack);	
		MFVarSetFloat (_MDOutSPackChgID, itemID, 0.0);
	}
	
	
		sDensity = (initialDensity + (snowAge * sDensitySlope));
		if (sPack > 0.0 ) sDepth = sPack  * densityOfWater / sDensity; //in mm
	//	printf ("sAge %i sDens %f sPack %f sDepth %f \n", snowAge, sDensity, sPack, sDepth);

		MFVarSetFloat(_MDOutSnowDensityID,itemID,sDensity);  
		MFVarSetFloat(_MDOutSnowDepthID,itemID, sDepth); 
	//	printf ("Ende SnowPackChange \n");

//		if (itemID == 54914) printf("-- m = %d, d = %d, SF = %f, SM = %f, airT = %f, precip = %f, sPack = %f, sPackChg = %f\n", MFDateGetCurrentMonth(), MFDateGetCurrentDay(), _MDFallThreshold, _MDSnowMeltThreshold, airT, precip, sPack, sPackChg);

}
Beispiel #9
0
static void _MDIrrGrossDemand (int itemID) {
//Input
	float irrEffeciency;
	float dailyPrecip    = 0.0;
	float dailyEffPrecip = 0.0;
	float refETP;
	float cropFraction [_MDNumberOfIrrCrops+1];
	float snowpackChg = 0;
	int seasStart[3];
    float dailyPercolation;
    float wltPnt;
    float fldCap;
//Output:
	float totalNetIrrDemand   = 0.0;
	float totalIrrPercolation = 0.0;
// Local
	int i;
	float ReqpondingDepth ;
	float pondingDepth;
        float irrIntensity;
	float cropDepletionFactor;
	float meanSMChange;
	float meanSMoist;
	int daysSincePlanted;
	float totAvlWater,readAvlWater, curDepl, prevSoilMstDepl;
	float addBareSoil        = 0.0;
	float bareSoilBalance    = 0.0;
	float cropCoeff;
	float croppedArea        = 0.0;
	float cropWR             = 0.0;
	float deepPercolation    = 0.0;
	float loss               = 0.0;
	float netIrrDemand       = 0.0;
	float relCropFraction    = 0.0;
	float rootDepth;
	float sumOfCropFractions = 0.0;
	float totalCropETP       = 0.0;
	float totGrossDemand     = 0.0;
	float riceWaterBalance;
	float nonRiceWaterBalance;
	float smChange;
	int   numGrowingSeasons;
	float curCropFraction;
	float returnFlow;
	float CropETPlusEPloss;
	float debug = 0.0;
	float OUT;
	float IN;
	int stage;
	int curDay;
	
	curDay = MFDateGetDayOfYear();

	//	 printf ("IrrIsDistrubted = %i\n", _MDIntensityIsDistributed ); 
    ReqpondingDepth=MFVarGetFloat(_MDRicePoindingDepthID,itemID,2.0);
	irrAreaFrac = MFVarGetFloat(_MDInIrrAreaFracID, itemID, 0.0);
	//printf ("pond%fi\n",ReqpondingDepth);
	
	switch (_MDIrrigatedAreaMap) {
	case FAO_ID:  irrIntensity = MFVarGetFloat (_MDInIrrIntensityID, itemID, 100.0) / 100.0; break;
	case IWMI_ID: irrIntensity = 1.0; _MDIntensityDistributed = true; break;
	}
	
	seasStart [0]= MFVarGetFloat (_MDGrowingSeason1ID,      itemID, -100);
	seasStart [1]= MFVarGetFloat (_MDGrowingSeason2ID,      itemID, -100);
	if ((seasStart[0] < 0) || (seasStart[0]< 0)) printf ("Growing Season! \n");

	if (irrAreaFrac > 0.0) {
		for (i = 0;i < _MDNumberOfIrrCrops + 1; ++i) { cropFraction[i] = 0.0; }
		for (i = 0;i < _MDNumberOfIrrCrops;     ++i) {
			if (MFVarTestMissingVal (_MDInCropFractionIDs [i],itemID)) {
				MFVarSetFloat(_MDInCropFractionIDs [i],itemID,0.0);
			}
		}
		irrEffeciency   = MFVarGetFloat(_MDInIrrEfficiencyID,    itemID, 38);
		dailyPrecip     = MFVarGetFloat(_MDInPrecipID,           itemID, 0.0);
		refETP          = MFVarGetFloat(_MDInIrrRefEvapotransID, itemID, 0.0);
		if (irrEffeciency == 0) irrEffeciency =38;
		if (refETP == 0.0) refETP = 0.01;

		snowpackChg = MFVarGetFloat (_MDInSPackChgID, itemID, 0.0);
		if (snowpackChg >  0.0) dailyPrecip = 0.0; //Snow Accumulation, no liquid precipitation
		if (snowpackChg <= 0.0) dailyPrecip = dailyPrecip + fabs (snowpackChg); //Add Snowmelt

		dailyEffPrecip = dailyPrecip;
 
	
	 	dailyPercolation = MFVarGetFloat(_MDRicePercolationRateID,itemID,3.0);
	 	wltPnt           = MFVarGetFloat (_MDInWltPntID,  itemID, 0.15);
		fldCap           = MFVarGetFloat (_MDInFldCapaID, itemID, 0.25);
		if (fldCap == 0.0) {
			fldCap=0.35;
			wltPnt=0.2;
		}
//		printf ("FC %f WP %f \n",fldCap,wltPnt);
		if (irrIntensity < 1.2 && irrIntensity > 1.0)irrIntensity=1.0;

		if (irrIntensity > 2.0) irrIntensity=2.0;
		curDepl=0;
//		printf("Num irr crops %i\n",_MDNumberOfIrrCrops);
		sumOfCropFractions=0;
		for (i = 0; i < _MDNumberOfIrrCrops; i++) {
			sumOfCropFractions += MFVarGetFloat(_MDInCropFractionIDs [i],itemID, 0.0);	
//			printf ("hier\n, numcrops= %i\n",_MDNumberOfIrrCrops);
		}
		if (sumOfCropFractions==0) { // No Cropdata for irrigated cell: default to some cereal crop
			MFVarSetFloat(_MDInCropFractionIDs [2],itemID, 0.3);
		}

		sumOfCropFractions=0;
	  	for (i = 0; i < _MDNumberOfIrrCrops; i++) {sumOfCropFractions += MFVarGetFloat(_MDInCropFractionIDs [i],itemID, 0.0);	}
 
		meanSMChange=0;totalCropETP=0;

		for (i = 0; i < _MDNumberOfIrrCrops; i++) { // cropFraction[_MDNumberOfIrrCrops] is bare soil Area!
			numGrowingSeasons = 2; // getNumGrowingSeasons (irrIntensity);
			if (_MDIrrigatedAreaMap == 0.0) numGrowingSeasons=getNumGrowingSeasons(irrIntensity); //FAO MAP
			curCropFraction = MFVarGetFloat (_MDInCropFractionIDs [i], itemID, 0.0);
			if (curCropFraction > 0.0) {relCropFraction = curCropFraction / sumOfCropFractions; } else { relCropFraction = 0.0; }
			daysSincePlanted = getDaysSincePlanting (curDay, seasStart, numGrowingSeasons, &_MDirrigCropStruct [i]);

			if (_MDIntensityDistributed) {
//				printf ("Distributed\n");
				if (daysSincePlanted > 0.0) {
					addBareSoil = relCropFraction - irrIntensity / ceil(irrIntensity) * relCropFraction;
//                  printf ("BareSoil = %f\n",addBareSoil);
					if (relCropFraction > 0.0) cropFraction [i] = relCropFraction - addBareSoil;
					cropFraction [_MDNumberOfIrrCrops] += addBareSoil;
			 	}
				else {
					cropFraction [i] = 0.0;
					cropFraction [_MDNumberOfIrrCrops] += relCropFraction;
				}
			}
			else { // try to grow all crops in Growing Season 1 (always assumed to be the first season!)
//				printf("first Season!\n");
				if (daysSincePlanted > 0.0) { // Growing season
//			 		printf("IrrIntensity %f\n",irrIntensity);
					if (curDay < seasStart [1] || (daysSincePlanted > seasStart[1]-seasStart[0])) { // First or perennial growing season
						if (irrIntensity < 1.0) addBareSoil = relCropFraction * (1.0 - irrIntensity);
						else                    addBareSoil = 0.0;
//						printf ("hier intensity = %f relCropFraction %f addBareSoil %f\n",irrIntensity, relCropFraction, addBareSoil);
					}
					else { // second crop
						if (irrIntensity > 1.0) addBareSoil = relCropFraction - (irrIntensity - 1.0) * relCropFraction;
						else if (irrIntensity < 1.0) addBareSoil = relCropFraction;
					}
					if (relCropFraction > 0.0) cropFraction [i] = relCropFraction - addBareSoil;
					cropFraction [_MDNumberOfIrrCrops] += addBareSoil;
				}
				else { //  Non-growing season
					cropFraction [i] = 0.0;
					cropFraction [_MDNumberOfIrrCrops] += relCropFraction;
				}
			}
		}
		croppedArea = 0.0;

		for (i = 0; i < _MDNumberOfIrrCrops; i++) croppedArea+=cropFraction[i];

	 	if (fabs ((croppedArea +cropFraction[_MDNumberOfIrrCrops] -1)) > 0.0001) printf ("Cropped  %f bare %f \n", croppedArea ,cropFraction[_MDNumberOfIrrCrops]);
		for (i = 0; i < _MDNumberOfIrrCrops; i++) {
			netIrrDemand=0;cropWR=0;deepPercolation=0;smChange=0;
			relCropFraction   = cropFraction[i];
			numGrowingSeasons = 2; //getNumGrowingSeasons (irrIntensity);
			if (_MDIrrigatedAreaMap==0) numGrowingSeasons=getNumGrowingSeasons(irrIntensity);//FAO MAP
			if (relCropFraction > 0) {
				netIrrDemand=0;
			 	daysSincePlanted = getDaysSincePlanting(curDay, seasStart,numGrowingSeasons,&_MDirrigCropStruct[i]);
			 	if (daysSincePlanted > 0) {
					prevSoilMstDepl = MFVarGetFloat(_MDOutCropDeficitIDs [i],itemID, 0.0);
//					if (daysSincePlanted==1)prevSoilMstDepl=0;
//					if (itemID==22)printf ("DP %f\n",prevSoilMstDepl);
					stage = getCropStage(&_MDirrigCropStruct[i], daysSincePlanted);
					cropCoeff =getCropKc(&_MDirrigCropStruct[i], daysSincePlanted, stage);
					cropWR    = refETP * cropCoeff;
					rootDepth = getCurCropRootingDepth (&_MDirrigCropStruct[i],daysSincePlanted);
					rootDepth = 400; // TODO
				    cropDepletionFactor=getCorrDeplFactor(&_MDirrigCropStruct[i], cropWR);
					if (_MDirrigCropStruct[i].cropIsRice==1) {
			//			printf ("Hier is rice %i\n",i);
					    pondingDepth=prevSoilMstDepl+dailyEffPrecip-cropWR-dailyPercolation;
						if (pondingDepth>=ReqpondingDepth) {
							deepPercolation=pondingDepth -ReqpondingDepth;
							pondingDepth=ReqpondingDepth;
						}
						if (pondingDepth<ReqpondingDepth) {
							netIrrDemand=ReqpondingDepth-pondingDepth;
							pondingDepth=ReqpondingDepth;
						}
						curDepl=pondingDepth; //so that current ponding depth gets set..		
						smChange=curDepl-prevSoilMstDepl;
						deepPercolation+=dailyPercolation;
						riceWaterBalance=dailyEffPrecip+netIrrDemand-cropWR-deepPercolation-smChange;
						if (fabs (riceWaterBalance) > 0.0001) printf ("RiceWaterBalance %f prevSMM %f smChange %f cropWR %f \n",riceWaterBalance, prevSoilMstDepl,smChange,cropWR);
					}
					else {
						totAvlWater  = (fldCap  -wltPnt) * rootDepth;
						 
						readAvlWater = totAvlWater * cropDepletionFactor;
					 
						curDepl  = prevSoilMstDepl - dailyEffPrecip + cropWR;
						if (curDepl < 0) {
							curDepl = 0;
//							if (itemID == 104) printf ("HIER\n");
//							if (itemID == 104) printf ("sssaaaaaaaaaaaaaaaaaaaaaasssssssssssssss!\n");
							deepPercolation = dailyEffPrecip - prevSoilMstDepl -cropWR;
						}
						if (curDepl >= totAvlWater) {
//							if (itemID == 104) printf ("HIER\n");
							curDepl =totAvlWater;
						}
						if (curDepl >= readAvlWater) {
							netIrrDemand = curDepl;
							netIrrDemand = curDepl;
							// if (cropWR > readAvlWater)cropWR = readAvlWater;
							// deepPercolation = dailyEffPrecip - prevSoilMstDepl - cropWR + netIrrDemand;
							curDepl = prevSoilMstDepl - netIrrDemand-dailyEffPrecip+cropWR;
							// deepPercolation = dailyEffPrecip - prevSoilMstDepl - cropWR; curDepl = 0.0;
							if (fabs (curDepl) > 0.001) printf ("Schieses\n"); 

							// if (netIrrDemand > readAvlWater) netIrrDemand = readAvlWater;
//							if (itemID == 104) printf ("sssssssssssssssssscur Dpl %f RAW %f TAW %f cropWR %f netDem %f!\n",curDepl, readAvlWater,totAvlWater,cropWR,netIrrDemand);//	curDepl=0+cropWR;
//							if (itemID == 104) if (netIrrDemand > readAvlWater) printf ("crop NO %i curDepl %f RAW %f TAW %f cropWR %f netDem %f dsp %i Doy %i!seasStart[0] %i seasStart[1]%i refCropF %f\n",i,curDepl, readAvlWater,totAvlWater,cropWR,netIrrDemand,daysSincePlanted, MFDateGetDayOfYear(),seasStart[0],seasStart[1],relCropFraction);//	curDepl=0+cropWR;
						}
					 
//						if (curDepl > (fldCap  -wltPnt) * rootDepth*cropDepletionFactor) printf ("F**k\n");
						smChange=prevSoilMstDepl-curDepl;
					
						nonRiceWaterBalance=dailyEffPrecip+netIrrDemand-cropWR-deepPercolation-smChange;
						if (fabs(nonRiceWaterBalance) > 0.0001)printf ("NONRiceWaterBalance %f prevSMM %f smChange %f cropWR %f TAW %f FC %f WP %f \n",nonRiceWaterBalance, prevSoilMstDepl,smChange,cropWR,totAvlWater,fldCap,wltPnt );
						smChange = dailyEffPrecip+netIrrDemand-cropWR-deepPercolation-nonRiceWaterBalance;
					}
				 	MFVarSetFloat(_MDOutCropDeficitIDs [i],itemID,curDepl);
//					if (itemID==104)printf ("hier %i frac %f %i deple %f depl[2] %f DP %f\n",itemID,relCropFraction,daysSincePlanted,curDepl, MFVarGetFloat(_MDOutCropDeficitIDs [i],itemID, 0.0),deepPercolation);
				}
				totalNetIrrDemand += netIrrDemand * relCropFraction;
//				if (itemID == 77) printf ("totalNetIrrDemand = %f cropFrac %f DSP %i\n",totalNetIrrDemand,relCropFraction,daysSincePlanted);
				totalCropETP        += cropWR   * relCropFraction;
				meanSMChange        += smChange * relCropFraction;
				totalIrrPercolation += deepPercolation * relCropFraction;
	 		}
			MFVarSetFloat (_MDOutCropETIDs [i], itemID, netIrrDemand * relCropFraction * irrAreaFrac); 		
			MFVarSetFloat (_MDOutCropGrossDemandIDs[i],itemID,netIrrDemand * relCropFraction * irrAreaFrac/(irrEffeciency/100));
		//	printf ("Hier\n");
		}//for all crops
//		Add Water Balance for bare soil
		cropWR = 0.0;
		relCropFraction = cropFraction [_MDNumberOfIrrCrops];
		if (relCropFraction > 1.01) printf("Problem relCropFraction = %f\n",relCropFraction);
		if (irrAreaFrac     > 1.01) printf("Problem irrAreaFraction = %f\n",relCropFraction);
//		if (itemID == 104) printf ("bareSoil = %f %i dsp %i inten %f\n", relCropFraction, itemID, daysSincePlanted, irrIntensity);
		curDepl=0;
		if (relCropFraction > 0.0) { //Crop is not currently grown. ET from bare soil is equal to ET (initial)
//			printf ("hier bare = %f\n",relCropFraction);
			netIrrDemand = 0.0;
			cropWR = 0.2*refETP;
			
			prevSoilMstDepl= MFVarGetFloat (_MDOutCropDeficitIDs [_MDNumberOfIrrCrops],itemID, 0.0);
			totAvlWater  = (fldCap - wltPnt) * 250;	//assumed RD = 0.25 m
			deepPercolation = 0.0;
			curDepl  = prevSoilMstDepl - dailyEffPrecip + cropWR;
			if (curDepl < 0) {	
				curDepl = 0;	
				deepPercolation=dailyEffPrecip - prevSoilMstDepl -cropWR;
				
			}
			if (curDepl >= totAvlWater) {
				cropWR = totAvlWater - prevSoilMstDepl + dailyEffPrecip;
				deepPercolation = 0.0;
				curDepl = totAvlWater;

				if (cropWR < 0)printf ("CropWR, item %i TAW %f PrevSM %f EffP %f\n",itemID,totAvlWater,prevSoilMstDepl,dailyEffPrecip);
//				printf("her FC %f WP %f curDepl %f prevDepl %f totAvlWater %f cropWR %f dailyEffPrecip %f\n",fldCap, wltPnt,curDepl,prevSoilMstDepl, totAvlWater, cropWR, dailyEffPrecip);								
			}
 			smChange = prevSoilMstDepl - curDepl;
			bareSoilBalance=dailyEffPrecip -smChange- cropWR - netIrrDemand -deepPercolation;
			if (fabs(bareSoilBalance >0.0001)) printf ("bare SMBalance!! precip %f cropWR %f smchange %f dp %f\n ",dailyEffPrecip , cropWR ,smChange, deepPercolation );
  			MFVarSetFloat (_MDOutCropDeficitIDs [_MDNumberOfIrrCrops], itemID, curDepl);	
  
		}
		else {
			cropWR          = 0.0;
			smChange        = 0.0;
			deepPercolation = 0.0;
			netIrrDemand    = 0.0;
			curDepl         = 0.0;
		}
		MFVarSetFloat (_MDOutCropETIDs [_MDNumberOfIrrCrops], itemID, cropWR);
  		MFVarSetFloat (_MDNonIrrFractionID, itemID, cropFraction [_MDNumberOfIrrCrops]);
		totalNetIrrDemand   += netIrrDemand    * relCropFraction;
		totalCropETP        += cropWR          * relCropFraction;
		meanSMoist          += curDepl         * relCropFraction;
		meanSMChange        += smChange        * relCropFraction;
		totalIrrPercolation += deepPercolation * relCropFraction;

		totGrossDemand = getIrrGrossWaterDemand (totalNetIrrDemand, irrEffeciency);

		loss = (totGrossDemand - totalNetIrrDemand) + (dailyPrecip - dailyEffPrecip);
		returnFlow = totalIrrPercolation + loss * 0.1;
		CropETPlusEPloss = totalCropETP  + loss * 0.9;
		OUT = CropETPlusEPloss + returnFlow + meanSMChange;
		IN  = totGrossDemand + dailyPrecip;

//		if (itemID == 1)   printf ("IrrSMChange in GrossDemand %f Doy %i \n",meanSMChange        * irrAreaFrac, MFDateGetDayOfYear());
//		if (itemID == 104) printf ("itemID %iGrossDemn %f DailyPrecip %f meanSMChange  %f \n",itemID,totGrossDemand,dailyPrecip,meanSMChange);
//		if (itemID == 104) printf ("ItemID %i ppt %f CropET %f perc %f loss %f \n",itemID,dailyPrecip,totalCropETP,totalIrrPercolation,loss);	
//		if (fabs (IN - OUT) > 0.1) CMmsgPrint (CMmsgAppError,"WaterBalance in MDIrrigation!!! IN %f OUT %f BALANCE %f LOSS %f %i DEMAND %f %i EffPrecip %f   itemID %i \n", IN, OUT, IN-OUT, loss, itemID, totGrossDemand, itemID, dailyEffPrecip,itemID);
//		if (totGrossDemand > 0.1)
		if (fabs (IN - OUT) > 0.001) printf ("WaterBalance in MDIrrigation!!! IN %f OUT %f BALANCE %f LOSS %f %i DEMAND %f NET %f  EffPrecip %f dailyPrecip %f cropped %f bare %f IrrARea %fitemID %i \n", IN, OUT, IN-OUT, loss, itemID, totGrossDemand, totalNetIrrDemand, dailyEffPrecip,dailyPrecip,croppedArea,cropFraction[_MDNumberOfIrrCrops],irrAreaFrac,itemID);
//		printf ("After = %f \n", MFVarGetFloat (_MDOutCropETIDs [_MDNumberOfIrrCrops], itemID, 88));
		for (i = 0; i < _MDNumberOfIrrCrops; i++) { debug += MFVarGetFloat (_MDOutCropETIDs [i], itemID, 0.0); }

		if (fabs (debug - totalNetIrrDemand * irrAreaFrac) > 0.1 ) printf ("sum of et %f netdeman = %f item %i\n", debug, totalNetIrrDemand * irrAreaFrac, itemID);	

		MFVarSetFloat(_MDOutIrrSMoistChgID,   itemID, meanSMChange      * irrAreaFrac);
		MFVarSetFloat(_MDOutIrrNetDemandID,   itemID, totalNetIrrDemand * irrAreaFrac);
		MFVarSetFloat(_MDOutIrrGrossDemandID, itemID, totGrossDemand    * irrAreaFrac);
		MFVarSetFloat(_MDOutIrrReturnFlowID,  itemID, returnFlow        * irrAreaFrac);
		MFVarSetFloat(_MDOutIrrEvapotranspID, itemID, CropETPlusEPloss  * irrAreaFrac);	
	}
	else { // cell is not irrigated
		MFVarSetFloat(_MDOutIrrSoilMoistID,   itemID, 0.0);
		MFVarSetFloat(_MDOutIrrSMoistChgID,   itemID, 0.0);
 		MFVarSetFloat(_MDOutIrrNetDemandID,   itemID, 0.0);
		MFVarSetFloat(_MDOutIrrGrossDemandID, itemID, 0.0);
		MFVarSetFloat(_MDOutIrrReturnFlowID,  itemID, 0.0);
		MFVarSetFloat(_MDOutIrrEvapotranspID, itemID, 0.0);
		for (i = 0; i < _MDNumberOfIrrCrops; i++) {MFVarSetFloat(_MDOutCropETIDs[i],itemID,0.0);}
	}
}
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);
}