public FireEffects(int numberOfSeverities) { ReductionsTable = new FireReductions[numberOfSeverities + 1]; //will ignore zero for (int i = 0; i <= numberOfSeverities; i++) { ReductionsTable[i] = new FireReductions(); } }
//--------------------------------------------------------------------- protected override IInputParameters Parse() { ReadLandisDataVar(); int numLitterTypes = 4; int numFunctionalTypes = 25; InputParameters parameters = new InputParameters(speciesDataset, numLitterTypes, numFunctionalTypes); InputVar <int> timestep = new InputVar <int>("Timestep"); ReadVar(timestep); parameters.Timestep = timestep.Value; InputVar <SeedingAlgorithms> seedAlg = new InputVar <SeedingAlgorithms>("SeedingAlgorithm"); ReadVar(seedAlg); parameters.SeedAlgorithm = seedAlg.Value; //--------------------------------------------------------------------------------- InputVar <string> initCommunities = new InputVar <string>("InitialCommunities"); ReadVar(initCommunities); parameters.InitialCommunities = initCommunities.Value; InputVar <string> communitiesMap = new InputVar <string>("InitialCommunitiesMap"); ReadVar(communitiesMap); parameters.InitialCommunitiesMap = communitiesMap.Value; InputVar <string> climateConfigFile = new InputVar <string>("ClimateConfigFile"); ReadVar(climateConfigFile); parameters.ClimateConfigFile = climateConfigFile.Value; InputVar <string> ageOnlyDisturbanceParms = new InputVar <string>("AgeOnlyDisturbances:BiomassParameters"); ReadVar(ageOnlyDisturbanceParms); parameters.AgeOnlyDisturbanceParms = ageOnlyDisturbanceParms.Value; InputVar <string> soilDepthMapName = new InputVar <string>("SoilDepthMapName"); ReadVar(soilDepthMapName); parameters.SoilDepthMapName = soilDepthMapName.Value; InputVar <string> soilDrainMapName = new InputVar <string>("SoilDrainMapName"); ReadVar(soilDrainMapName); parameters.SoilDrainMapName = soilDrainMapName.Value; InputVar <string> soilBaseFlowMapName = new InputVar <string>("SoilBaseFlowMapName"); ReadVar(soilBaseFlowMapName); parameters.SoilBaseFlowMapName = soilBaseFlowMapName.Value; InputVar <string> soilStormFlowMapName = new InputVar <string>("SoilStormFlowMapName"); ReadVar(soilStormFlowMapName); parameters.SoilStormFlowMapName = soilStormFlowMapName.Value; InputVar <string> soilFCMapName = new InputVar <string>("SoilFieldCapacityMapName"); ReadVar(soilFCMapName); parameters.SoilFieldCapacityMapName = soilFCMapName.Value; InputVar <string> soilWPMapName = new InputVar <string>("SoilWiltingPointMapName"); ReadVar(soilWPMapName); parameters.SoilWiltingPointMapName = soilWPMapName.Value; InputVar <string> soilSandMapName = new InputVar <string>("SoilPercentSandMapName"); ReadVar(soilSandMapName); parameters.SoilPercentSandMapName = soilSandMapName.Value; InputVar <string> soilClayMapName = new InputVar <string>("SoilPercentClayMapName"); ReadVar(soilClayMapName); parameters.SoilPercentClayMapName = soilClayMapName.Value; InputVar <string> som1CsurfMapName = new InputVar <string>("InitialSOM1CsurfMapName"); ReadVar(som1CsurfMapName); parameters.InitialSOM1CSurfaceMapName = som1CsurfMapName.Value; InputVar <string> som1NsurfMapName = new InputVar <string>("InitialSOM1NsurfMapName"); ReadVar(som1NsurfMapName); parameters.InitialSOM1NSurfaceMapName = som1NsurfMapName.Value; InputVar <string> som1CsoilMapName = new InputVar <string>("InitialSOM1CsoilMapName"); ReadVar(som1CsoilMapName); parameters.InitialSOM1CSoilMapName = som1CsoilMapName.Value; InputVar <string> som1NsoilMapName = new InputVar <string>("InitialSOM1NsoilMapName"); ReadVar(som1NsoilMapName); parameters.InitialSOM1NSoilMapName = som1NsoilMapName.Value; InputVar <string> som2CMapName = new InputVar <string>("InitialSOM2CMapName"); ReadVar(som2CMapName); parameters.InitialSOM2CMapName = som2CMapName.Value; InputVar <string> som2NMapName = new InputVar <string>("InitialSOM2NMapName"); ReadVar(som2NMapName); parameters.InitialSOM2NMapName = som2NMapName.Value; InputVar <string> som3CMapName = new InputVar <string>("InitialSOM3CMapName"); ReadVar(som3CMapName); parameters.InitialSOM3CMapName = som3CMapName.Value; InputVar <string> som3NMapName = new InputVar <string>("InitialSOM3NMapName"); ReadVar(som3NMapName); parameters.InitialSOM3NMapName = som3NMapName.Value; InputVar <string> deadSurfMapName = new InputVar <string>("InitialDeadWoodSurfaceMapName"); ReadVar(deadSurfMapName); parameters.InitialDeadSurfaceMapName = deadSurfMapName.Value; InputVar <string> deadSoilMapName = new InputVar <string>("InitialDeadCoarseRootsMapName"); ReadVar(deadSoilMapName); parameters.InitialDeadSoilMapName = deadSoilMapName.Value; InputVar <bool> calimode = new InputVar <bool>("CalibrateMode"); if (ReadOptionalVar(calimode)) { parameters.CalibrateMode = calimode.Value; } else { parameters.CalibrateMode = false; } InputVar <string> wt = new InputVar <string>("WaterDecayFunction"); ReadVar(wt); parameters.WType = WParse(wt.Value); InputVar <double> pea = new InputVar <double>("ProbabilityEstablishAdjust"); ReadVar(pea); parameters.ProbEstablishAdjustment = pea.Value; InputVar <double> iMN = new InputVar <double>("InitialMineralN"); ReadVar(iMN); parameters.SetInitMineralN(iMN.Value); InputVar <double> ans = new InputVar <double>("AtmosphericNSlope"); ReadVar(ans); parameters.SetAtmosNslope(ans.Value); InputVar <double> ani = new InputVar <double>("AtmosphericNIntercept"); ReadVar(ani); parameters.SetAtmosNintercept(ani.Value); InputVar <double> lat = new InputVar <double>("Latitude"); ReadVar(lat); parameters.SetLatitude(lat.Value); InputVar <double> denits = new InputVar <double>("DenitrificationRate"); ReadVar(denits); parameters.SetDenitrif(denits.Value); InputVar <double> drsoms = new InputVar <double>("DecayRateSurf"); ReadVar(drsoms); parameters.SetDecayRateSurf(drsoms.Value); InputVar <double> drsom1 = new InputVar <double>("DecayRateSOM1"); ReadVar(drsom1); parameters.SetDecayRateSOM1(drsom1.Value); InputVar <double> drsom2 = new InputVar <double>("DecayRateSOM2"); ReadVar(drsom2); parameters.SetDecayRateSOM2(drsom2.Value); InputVar <double> drsom3 = new InputVar <double>("DecayRateSOM3"); ReadVar(drsom3); parameters.SetDecayRateSOM3(drsom3.Value); InputVar <string> anppMaps = new InputVar <string>("ANPPMapNames"); if (ReadOptionalVar(anppMaps)) { PlugIn.ANPPMapNames = anppMaps.Value; InputVar <int> anppMapFreq = new InputVar <int>("ANPPMapFrequency"); ReadVar(anppMapFreq); PlugIn.ANPPMapFrequency = anppMapFreq.Value; } InputVar <string> aneeMaps = new InputVar <string>("ANEEMapNames"); if (ReadOptionalVar(aneeMaps)) { PlugIn.ANEEMapNames = aneeMaps.Value; InputVar <int> aneeMapFreq = new InputVar <int>("ANEEMapFrequency"); ReadVar(aneeMapFreq); PlugIn.ANEEMapFrequency = aneeMapFreq.Value; } InputVar <string> soilCarbonMaps = new InputVar <string>("SoilCarbonMapNames"); if (ReadOptionalVar(soilCarbonMaps)) { PlugIn.SoilCarbonMapNames = soilCarbonMaps.Value; InputVar <int> soilCarbonMapFreq = new InputVar <int>("SoilCarbonMapFrequency"); ReadVar(soilCarbonMapFreq); PlugIn.SoilCarbonMapFrequency = soilCarbonMapFreq.Value; } InputVar <string> soilNitrogenMaps = new InputVar <string>("SoilNitrogenMapNames"); if (ReadOptionalVar(soilNitrogenMaps)) { PlugIn.SoilNitrogenMapNames = soilNitrogenMaps.Value; InputVar <int> soilNitrogenMapFreq = new InputVar <int>("SoilNitrogenMapFrequency"); ReadVar(soilNitrogenMapFreq); PlugIn.SoilNitrogenMapFrequency = soilNitrogenMapFreq.Value; } InputVar <string> totalCMaps = new InputVar <string>("TotalCMapNames"); if (ReadOptionalVar(totalCMaps)) { PlugIn.TotalCMapNames = totalCMaps.Value; InputVar <int> totalCMapFreq = new InputVar <int>("TotalCMapFrequency"); ReadVar(totalCMapFreq); PlugIn.TotalCMapFrequency = totalCMapFreq.Value; } //-------------------------- // MinRelativeBiomass table ReadName("MaximumLAI"); InputVar <byte> shadeClassVar = new InputVar <byte>("Shade Class"); InputVar <double> maxLAI = new InputVar <double>("Maximum LAI"); for (byte shadeClass = 1; shadeClass <= 5; shadeClass++) { if (AtEndOfInput) { throw NewParseException("Expected a line with available light class {0}", shadeClass); } StringReader currentLine = new StringReader(CurrentLine); ReadValue(shadeClassVar, currentLine); if (shadeClassVar.Value.Actual != shadeClass) { throw new InputValueException(shadeClassVar.Value.String, "Expected the available light class {0}", shadeClass); } ReadValue(maxLAI, currentLine); parameters.SetMaximumShadeLAI(shadeClass, maxLAI.Value); CheckNoDataAfter("the " + maxLAI + " column", currentLine); GetNextLine(); } //---------------------------------------------------------- // Read table of sufficient light probabilities. // Available light classes are in increasing order. ReadName("LightEstablishmentTable"); InputVar <byte> sc = new InputVar <byte>("Available Light Class"); InputVar <double> pl0 = new InputVar <double>("Probability of Germination - Light Level 0"); InputVar <double> pl1 = new InputVar <double>("Probability of Germination - Light Level 1"); InputVar <double> pl2 = new InputVar <double>("Probability of Germination - Light Level 2"); InputVar <double> pl3 = new InputVar <double>("Probability of Germination - Light Level 3"); InputVar <double> pl4 = new InputVar <double>("Probability of Germination - Light Level 4"); InputVar <double> pl5 = new InputVar <double>("Probability of Germination - Light Level 5"); int previousNumber = 0; while (!AtEndOfInput && CurrentName != Names.SpeciesParameters && previousNumber != 6) { StringReader currentLine = new StringReader(CurrentLine); ISufficientLight suffLight = new SufficientLight(); ReadValue(sc, currentLine); suffLight.ShadeClass = sc.Value; // Check that the current shade class is 1 more than // the previous number (numbers are must be in increasing order). if (sc.Value.Actual != (byte)previousNumber + 1) { throw new InputValueException(sc.Value.String, "Expected the severity number {0}", previousNumber + 1); } previousNumber = (int)sc.Value.Actual; ReadValue(pl0, currentLine); suffLight.ProbabilityLight0 = pl0.Value; ReadValue(pl1, currentLine); suffLight.ProbabilityLight1 = pl1.Value; ReadValue(pl2, currentLine); suffLight.ProbabilityLight2 = pl2.Value; ReadValue(pl3, currentLine); suffLight.ProbabilityLight3 = pl3.Value; ReadValue(pl4, currentLine); suffLight.ProbabilityLight4 = pl4.Value; ReadValue(pl5, currentLine); suffLight.ProbabilityLight5 = pl5.Value; parameters.LightClassProbabilities.Add(suffLight); CheckNoDataAfter("the " + pl5.Name + " column", currentLine); GetNextLine(); } if (parameters.LightClassProbabilities.Count == 0) { throw NewParseException("No sufficient light probabilities defined."); } if (previousNumber != 5) { throw NewParseException("Expected shade class {0}", previousNumber + 1); } //------------------------- // Species Parameters table ReadName("SpeciesParameters"); speciesLineNums.Clear(); // If parser re-used (i.e., for testing purposes) InputVar <int> ft = new InputVar <int>("Functional Type"); InputVar <bool> nt = new InputVar <bool>("Nitrogen Fixer"); InputVar <int> gddmn = new InputVar <int>("Growing Degree Day Minimum"); InputVar <int> gddmx = new InputVar <int>("Growing Degree Day Maximum"); InputVar <int> mjt = new InputVar <int>("Minimum January Temperature"); InputVar <double> maxd = new InputVar <double>("Maximum Allowable Drought"); InputVar <double> leafLongevity = new InputVar <double>("Leaf Longevity"); InputVar <bool> epicorm = new InputVar <bool>("Epicormic: Y/N"); InputVar <double> leafLignin = new InputVar <double>("Leaf Percent Lignin"); InputVar <double> wLignin = new InputVar <double>("Wood Percent Lignin"); InputVar <double> crLignin = new InputVar <double>("Coarse Root Percent Lignin"); InputVar <double> frLignin = new InputVar <double>("Fine Root Percent Lignin"); InputVar <double> leafCN = new InputVar <double>("Leaf CN Ratio"); InputVar <double> woodCN = new InputVar <double>("Wood CN Ratio"); InputVar <double> cRootCN = new InputVar <double>("Coarse Root CN Ratio"); InputVar <double> foliarCN = new InputVar <double>("Foliage CN Ratio"); InputVar <double> fRootCN = new InputVar <double>("Fine Root CN Ratio"); InputVar <int> maxANPP = new InputVar <int>("Maximum ANPP"); InputVar <int> maxBiomass = new InputVar <int>("Maximum Aboveground Biomass"); string lastColumn = "the " + maxBiomass.Name + " column"; while (!AtEndOfInput && CurrentName != Names.FunctionalGroupParameters) { StringReader currentLine = new StringReader(CurrentLine); ISpecies species = ReadSpecies(currentLine); ReadValue(ft, currentLine); parameters.SetFunctionalType(species, ft.Value); ReadValue(nt, currentLine); parameters.NFixer[species] = nt.Value; ReadValue(gddmn, currentLine); parameters.SetGDDmin(species, gddmn.Value); ReadValue(gddmx, currentLine); parameters.SetGDDmax(species, gddmx.Value); ReadValue(mjt, currentLine); parameters.SetMinJanTemp(species, mjt.Value); ReadValue(maxd, currentLine); parameters.SetMaxDrought(species, maxd.Value); ReadValue(leafLongevity, currentLine); parameters.SetLeafLongevity(species, leafLongevity.Value); ReadValue(epicorm, currentLine); parameters.Epicormic[species] = epicorm.Value; ReadValue(leafLignin, currentLine); parameters.SetLeafLignin(species, leafLignin.Value); ReadValue(frLignin, currentLine); parameters.SetFineRootLignin(species, frLignin.Value); ReadValue(wLignin, currentLine); parameters.SetWoodLignin(species, wLignin.Value); ReadValue(crLignin, currentLine); parameters.SetCoarseRootLignin(species, crLignin.Value); ReadValue(leafCN, currentLine); parameters.SetLeafCN(species, leafCN.Value); ReadValue(fRootCN, currentLine); parameters.SetFineRootCN(species, fRootCN.Value); ReadValue(woodCN, currentLine); parameters.SetWoodCN(species, woodCN.Value); ReadValue(cRootCN, currentLine); parameters.SetCoarseRootCN(species, cRootCN.Value); ReadValue(foliarCN, currentLine); parameters.SetFoliageLitterCN(species, foliarCN.Value); ReadValue(maxANPP, currentLine); parameters.SetMaxANPP(species, maxANPP.Value); ReadValue(maxBiomass, currentLine); parameters.SetMaxBiomass(species, maxBiomass.Value); CheckNoDataAfter(lastColumn, currentLine); GetNextLine(); } //--------- Read In Functional Group Table ------------------------------- PlugIn.ModelCore.UI.WriteLine(" Begin parsing FUNCTIONAL GROUP table."); ReadName("FunctionalGroupParameters"); InputVar <string> ftname = new InputVar <string>("Name"); InputVar <int> ftindex = new InputVar <int>("Index (< 25)"); InputVar <double> tempcurve1 = new InputVar <double>("TempCurve(1)"); InputVar <double> tempcurve2 = new InputVar <double>("TempCurve(2)"); InputVar <double> tempcurve3 = new InputVar <double>("TempCurve(3)"); InputVar <double> tempcurve4 = new InputVar <double>("TempCurve(4)"); InputVar <double> fcfleaf = new InputVar <double>("FCFRAC: Leaf"); InputVar <double> btolai = new InputVar <double>("BTOLAI"); InputVar <double> klai = new InputVar <double>("KLAI"); InputVar <double> maxlai = new InputVar <double>("MAXLAI"); InputVar <double> mwm = new InputVar <double>("Monthly Wood Mortality"); InputVar <double> wdr = new InputVar <double>("Wood Decay Rate"); InputVar <double> mortCurveShapeParm = new InputVar <double>("Mortality Curve Shape Parameter"); InputVar <int> leafNeedleDrop = new InputVar <int>("Leaf or Needle Drop Month"); InputVar <double> ppr2 = new InputVar <double>("MoistureCurve2"); InputVar <double> ppr3 = new InputVar <double>("MoistureCurve3"); InputVar <double> coarseRootFraction = new InputVar <double>("CRootFrac"); InputVar <double> fineRootFraction = new InputVar <double>("FRootFrac"); while (!AtEndOfInput && CurrentName != Names.FireReductionParameters) { StringReader currentLine = new StringReader(CurrentLine); ReadValue(ftname, currentLine); ReadValue(ftindex, currentLine); int ln = ftindex.Value.Actual; if (ln >= numFunctionalTypes) { throw new InputValueException(ftindex.Value.String, "The index: {0} exceeds the allowable number of functional groups, {1}", ftindex.Value.String, numFunctionalTypes - 1); } FunctionalType funcTParms = new FunctionalType(); parameters.FunctionalTypes[ln] = funcTParms; ReadValue(tempcurve1, currentLine); funcTParms.TempCurve1 = tempcurve1.Value; ReadValue(tempcurve2, currentLine); funcTParms.TempCurve2 = tempcurve2.Value; ReadValue(tempcurve3, currentLine); funcTParms.TempCurve3 = tempcurve3.Value; ReadValue(tempcurve4, currentLine); funcTParms.TempCurve4 = tempcurve4.Value; ReadValue(fcfleaf, currentLine); funcTParms.FCFRACleaf = fcfleaf.Value; ReadValue(btolai, currentLine); funcTParms.BTOLAI = btolai.Value; ReadValue(klai, currentLine); funcTParms.KLAI = klai.Value; ReadValue(maxlai, currentLine); funcTParms.MAXLAI = maxlai.Value; ReadValue(ppr2, currentLine); funcTParms.MoistureCurve2 = ppr2.Value; ReadValue(ppr3, currentLine); funcTParms.MoistureCurve3 = ppr3.Value; ReadValue(wdr, currentLine); funcTParms.WoodDecayRate = wdr.Value; ReadValue(mwm, currentLine); funcTParms.MonthlyWoodMortality = mwm.Value; ReadValue(mortCurveShapeParm, currentLine); funcTParms.MortCurveShape = mortCurveShapeParm.Value; ReadValue(leafNeedleDrop, currentLine); funcTParms.LeafNeedleDrop = leafNeedleDrop.Value; ReadValue(coarseRootFraction, currentLine); funcTParms.CoarseRootFraction = coarseRootFraction.Value; ReadValue(fineRootFraction, currentLine); funcTParms.FineRootFraction = fineRootFraction.Value; CheckNoDataAfter("the " + fineRootFraction.Name + " column", currentLine); GetNextLine(); } //--------- Read In Fire Reductions Table --------------------------- PlugIn.ModelCore.UI.WriteLine(" Begin reading FIRE REDUCTION parameters."); ReadName(Names.FireReductionParameters); InputVar <int> frindex = new InputVar <int>("Fire Severity Index MUST = 1-5"); InputVar <double> wred = new InputVar <double>("Wood Reduction"); InputVar <double> lred = new InputVar <double>("Litter Reduction"); while (!AtEndOfInput && CurrentName != Names.HarvestReductionParameters && CurrentName != Names.AgeOnlyDisturbanceParms) { StringReader currentLine = new StringReader(CurrentLine); ReadValue(frindex, currentLine); int ln = frindex.Value.Actual; if (ln < 1 || ln > 5) { throw new InputValueException(ftindex.Value.String, "The fire severity index: {0} must be 1-5,", frindex.Value.String); } FireReductions inputFireReduction = new FireReductions(); // ignoring severity = zero parameters.FireReductionsTable[ln] = inputFireReduction; ReadValue(wred, currentLine); inputFireReduction.WoodReduction = wred.Value; ReadValue(lred, currentLine); inputFireReduction.LitterReduction = lred.Value; CheckNoDataAfter("the " + lred.Name + " column", currentLine); GetNextLine(); } //--------- Read In Harvest Reductions Table --------------------------- ReadOptionalName(Names.HarvestReductionParameters); { PlugIn.ModelCore.UI.WriteLine(" Begin reading HARVEST REDUCTION parameters."); InputVar <string> prescriptionName = new InputVar <string>("Prescription"); InputVar <double> wred_pr = new InputVar <double>("Wood Reduction"); InputVar <double> lred_pr = new InputVar <double>("Litter Reduction"); while (!AtEndOfInput && CurrentName != Names.AgeOnlyDisturbanceParms) { HarvestReductions harvReduction = new HarvestReductions(); parameters.HarvestReductionsTable.Add(harvReduction); StringReader currentLine = new StringReader(CurrentLine); ReadValue(prescriptionName, currentLine); harvReduction.PrescriptionName = prescriptionName.Value; ReadValue(wred_pr, currentLine); harvReduction.WoodReduction = wred.Value; ReadValue(lred_pr, currentLine); harvReduction.LitterReduction = lred.Value; GetNextLine(); } } return(parameters); }