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 _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); }
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); }
static void _MDRainPotETPstd (int itemID) { // Penman (1948) PE in mm for day also given by Chidley and Pike (1970) // Input float dayLen; // daylength in fraction of day float i0hDay; // daily potential insolation on horizontal [MJ/m2] float albedo; // albedo float airT; // air temperatur [degree C] float solRad; // daily solar radiation on horizontal [MJ/m2] float vPress; // daily average vapor pressure [kPa] float wSpeed; // average wind speed for the day [m/s] float sHeat = 0.0; // average subsurface heat storage for day [W/m2] // Local float solNet; // average net solar radiation for day [W/m2] float novern; // sunshine duration fraction of daylength float effem; // effective emissivity from clear sky float cldCor; // cloud cover correction to net longwave under clear sky float lngNet; // average net longwave radiation for day [W/m2] float aa; // available energy [W/m2] float fu; // Penman wind function, [mm d-1 kPa-1] float es; // vapor pressure at airT [kPa] float delta; // dEsat/dTair [kPa/K] // Output float pet; if (MFVarTestMissingVal (_MDInDayLengthID, itemID) || MFVarTestMissingVal (_MDInI0HDayID, itemID) || MFVarTestMissingVal (_MDInCParamAlbedoID, itemID) || MFVarTestMissingVal (_MDInAtMeanID, itemID) || MFVarTestMissingVal (_MDInSolRadID, itemID) || MFVarTestMissingVal (_MDInVPressID, itemID) || MFVarTestMissingVal (_MDInWSpeedID, itemID)) { MFVarSetMissingVal (_MDOutPetID,itemID); return; } dayLen = MFVarGetFloat (_MDInDayLengthID, itemID, 12.0); i0hDay = MFVarGetFloat (_MDInI0HDayID, itemID, 0.0); albedo = MFVarGetFloat (_MDInCParamAlbedoID, itemID, 0.0); airT = MFVarGetFloat (_MDInAtMeanID, itemID, 0.0); solRad = MFVarGetFloat (_MDInSolRadID, itemID, 0.0); vPress = MFVarGetFloat (_MDInVPressID, itemID, 0.0); wSpeed = fabs (MFVarGetFloat (_MDInWSpeedID, itemID, 0.0)); if (wSpeed < 0.2) wSpeed = 0.2; solNet = (1.0 - albedo) * solRad / MDConstIGRATE; // net solar with Penman (1948) albedo of 0.25 effem = 0.44 + 0.252 * sqrt (vPress); // Brunt method for effective emissivity with Penman (1948) coefficients novern = ((solRad / i0hDay) - 0.18) / 0.55; // Penman's relation of SOLRAD / I0HDAY to sunshine duration n/N if (novern > 1.0) novern = 1.0; cldCor = 0.1 + 0.9 * novern; //Penman's (1948) longwave cloud correction coefficient lngNet = (effem - 1.0) * cldCor * MDConstSIGMA * pow (airT + 273.15,4.0); aa = solNet + lngNet - sHeat; es = MDPETlibVPressSat (airT); delta = MDPETlibVPressDelta (airT); fu = 2.6 * (1.0 + 0.54 * wSpeed); // Penman wind function given by Brutsaert (1982) eq 10.17 // Penman equation from Brutsaert eq 10.15 pet = (delta * MDConstEtoM * MDConstIGRATE * aa + MDConstPSGAMMA * fu * (es - vPress)) / (delta + MDConstPSGAMMA); MFVarSetFloat (_MDOutPetID,itemID,pet); }
static void _MDRainPotETSWGday (int itemID) { // daily Shuttleworth-Wallace-Gurney (1985, 1990) PE in mm for day // Input float dayLen; // daylength in fraction of day float i0hDay; // daily potential insolation on horizontal [MJ/m2] float albedo; // albedo float height; // canopy height [m] float lWidth; // average leaf width [m] float rss; // soil surface resistance [s/m] float r5; // solar radiation at which conductance is halved [W/m2] float cd; // vpd at which conductance is halved [kPa] float cr; // light extinction coefficient for projected LAI float glMax; // maximum leaf surface conductance for all sides of leaf [m/s] float z0g; // z0g - ground surface roughness [m] float lai; // projected leaf area index float sai; // projected stem area index float airT; // air temperatur [degree C] float airTMin; // daily minimum air temperature [degree C] float solRad; // daily solar radiation on horizontal [MJ/m2] float vPress; // daily average vapor pressure [kPa] float wSpeed; // average wind speed for the day [m/s] float sHeat = 0.0; // average subsurface heat storage for day [W/m2] // Local float solNet; // average net solar radiation for daytime [W/m2] float lngNet; // average net longwave radiation [W/m2] float z0; // roughness parameter [m] float disp; // height of zero-plane [m] float z0c; // roughness parameter (closed canopy) float dispc; // zero-plane displacement (closed canopy) float aa; // available energy [W/m2] float asubs; // available energy at ground [W/m2] float es; // vapor pressure at airT [kPa] float delta; // dEsat/dTair [kPa/K] float dd; // vapor pressure deficit [kPa] float rsc; // canopy resistance [s/m] float le; // latent heat [W/m2] float rn; // net radiation [W/m2] float rns; // net radiation at ground [W/m2] float raa; // aerodynamic resistance [s/m] float rac; // leaf boundary layer resistance [s/m] float ras; // ground aerodynamic resistance [s/m] // Output float pet; if (MFVarTestMissingVal (_MDInDayLengthID, itemID) || MFVarTestMissingVal (_MDInI0HDayID, itemID) || MFVarTestMissingVal (_MDInCParamAlbedoID, itemID) || MFVarTestMissingVal (_MDInCParamCHeightID,itemID) || MFVarTestMissingVal (_MDInCParamLWidthID, itemID) || MFVarTestMissingVal (_MDInCParamRSSID, itemID) || MFVarTestMissingVal (_MDInCParamR5ID, itemID) || MFVarTestMissingVal (_MDInCParamCDID, itemID) || MFVarTestMissingVal (_MDInCParamCRID, itemID) || MFVarTestMissingVal (_MDInCParamGLMaxID, itemID) || MFVarTestMissingVal (_MDInCParamZ0gID, itemID) || MFVarTestMissingVal (_MDInLeafAreaIndexID,itemID) || MFVarTestMissingVal (_MDInStemAreaIndexID,itemID) || MFVarTestMissingVal (_MDInAtMeanID, itemID) || MFVarTestMissingVal (_MDInAtMinID, itemID) || MFVarTestMissingVal (_MDInSolRadID, itemID) || MFVarTestMissingVal (_MDInVPressID, itemID) || MFVarTestMissingVal (_MDInWSpeedID, itemID)) { MFVarSetMissingVal (_MDOutPetID,itemID); return; } dayLen = MFVarGetFloat (_MDInDayLengthID, itemID, 0.1); i0hDay = MFVarGetFloat (_MDInI0HDayID, itemID, 0.0); albedo = MFVarGetFloat (_MDInCParamAlbedoID, itemID, 0.0); height = MFVarGetFloat (_MDInCParamCHeightID, itemID, 0.0); lWidth = MFVarGetFloat (_MDInCParamLWidthID, itemID, 0.0); rss = MFVarGetFloat (_MDInCParamRSSID, itemID, 0.0); r5 = MFVarGetFloat (_MDInCParamR5ID, itemID, 0.0); cd = MFVarGetFloat (_MDInCParamCDID, itemID, 0.0); cr = MFVarGetFloat (_MDInCParamCRID, itemID, 0.0); glMax = MFVarGetFloat (_MDInCParamGLMaxID, itemID, 0.0); z0g = MFVarGetFloat (_MDInCParamZ0gID, itemID, 0.0); lai = MFVarGetFloat (_MDInLeafAreaIndexID, itemID, 0.0); sai = MFVarGetFloat (_MDInStemAreaIndexID, itemID, 0.0); airT = MFVarGetFloat (_MDInAtMeanID, itemID, 0.0); airTMin = MFVarGetFloat (_MDInAtMinID, itemID, 0.0); solRad = MFVarGetFloat (_MDInSolRadID, itemID, 0.0); vPress = MFVarGetFloat (_MDInVPressID, itemID, 0.0); wSpeed = fabs (MFVarGetFloat (_MDInWSpeedID, itemID, 0.0)); if (wSpeed < 0.2) wSpeed = 0.2; solNet = (1.0 - albedo) * solRad / MDConstIGRATE; z0c = MDPETlibRoughnessClosed (height,z0g); dispc = height - z0c / 0.3; disp = MDPETlibZPDisplacement (height,lai,sai,z0g); z0 = MDPETlibRoughness (disp,height,lai,sai,z0g); lngNet = MDSRadNETLong (i0hDay,airT,solRad,vPress); rn = solNet + lngNet; aa = rn - sHeat; rns = rn * exp (-cr * (lai + sai)); asubs = rns - sHeat; es = MDPETlibVPressSat (airT); delta = MDPETlibVPressDelta (airT); dd = es - vPress; rsc = MDPETlibCanopySurfResistance (airTMin,solRad,dd,lai,sai,r5,cd,cr,glMax); raa = MDPETlibBoundaryResistance (wSpeed,height,z0g,z0c,dispc,z0,disp); rac = MDPETlibLeafResistance (wSpeed,height,lWidth,z0g,lai,sai,z0c,dispc); ras = MDPETlibGroundResistance (wSpeed,height,z0g,z0c,dispc,z0,disp); // ras=70; // raa=50; rsc=70; le = MDPETlibShuttleworthWallace (rss,aa,asubs,dd,raa,rac,ras,rsc,delta); pet = MDConstEtoM * MDConstIGRATE * le; // float pet1 = MFVarGetFloat (_MDInRefETPIDDEBUG, itemID, 0.0); // printf ("height %f lWidth %f rss %f r4 %f cd %f cr %f glMax %f z0g %f lai %f sai %f \n",height , lWidth ,rss, r5 ,cd ,cr, glMax ,z0g ,lai , sai ); // printf ("pet BMF %f pet FAO %f albedo %f\n",pet,pet1,albedo); MFVarSetFloat (_MDOutPetID,itemID,pet); }
static void _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); }
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); }