// Override equals public override bool Equals(object obj) { ValueLimit other = obj as ValueLimit; if (other != null) { return(false); } if (other.MaxCompare != this.MinCompare) { return(false); } if (other.MaxCompare != this.MaxCompare) { return(false); } if (other.Min != this.Min) { return(false); } if (other.Max != this.Max) { return(false); } return(true); }
void checkRange(double val, string units, COMMODITY_GROUP grp = COMMODITY_GROUP.ANY) { // Validate and get UoM that contains the limits UnitOfMeasure uom = null; if (!uoms.TryGetValue(units.ToLower(), out uom)) { throw (new ArgumentException("Units {0} not recognized or supported")); } // If not limits defined, there is nothig to check if (uom.Limits == null || uom.Limits.Count < 1) { return; } bool isLiquidGas = (grp == COMMODITY_GROUP.LPG_NGL); bool isGeneralizedRefinedProduct = ((int)grp >= 100); // Ignore commodity if limits are for ANY commodity if (!isLiquidGas && uom.Limits.ContainsKey(COMMODITY_GROUP.ANY)) { try { uom.Limits[COMMODITY_GROUP.ANY].CheckLimits(val); } catch (ArgumentOutOfRangeException e) { throw(new ArgumentOutOfRangeException(String.Format("{0} with units={1}", e.Message, units))); } return; } // Check limit for commodity ValueLimit limit = null; var type = grp; if (isGeneralizedRefinedProduct) { type = COMMODITY_GROUP.GENERALIZED_REFINED_PRODUCT; // Needed to allow density variations within refined products group } if (!uom.Limits.TryGetValue(type, out limit)) { throw (new ArgumentException("Limits for commodity group {0} not supported")); } try { limit.CheckLimits(val); } catch (ArgumentOutOfRangeException e) { throw (new ArgumentOutOfRangeException(String.Format("{0} with units={1} and commodity group={2}", e.Message, units, grp))); } return; }
public static Dictionary <string, UnitOfMeasure> GetUoMs() { Dictionary <string, UnitOfMeasure> uoms = new Dictionary <string, UnitOfMeasure>(); // Density var densKgM3Limit1 = new ValueLimit() { Group = COMMODITY_GROUP.CRUDE_OIL, Min = 610.6, Max = 1163.5, MaxCompare = COMPARE.INSIDE }; var densKgM3Limit2 = new ValueLimit() { Group = COMMODITY_GROUP.FUEL_OILS, Min = 838.3127, Max = 1163.5 }; var densKgM3Limit3 = new ValueLimit() { Group = COMMODITY_GROUP.JET_FUELS, Min = 787.5195, Max = 838.3127, MaxCompare = COMPARE.INSIDE }; var densKgM3Limit4 = new ValueLimit() { Group = COMMODITY_GROUP.TRANSITION_ZONE, Min = 770.3520, Max = 787.5195, MaxCompare = COMPARE.INSIDE }; var densKgM3Limit5 = new ValueLimit() { Group = COMMODITY_GROUP.GASOLINES, Min = 610.6, Max = 770.3520, MaxCompare = COMPARE.INSIDE }; var densKgM3Limit6 = new ValueLimit() { Group = COMMODITY_GROUP.LUBRICATING_OIL, Min = 800.9, Max = 1163.5, MaxCompare = COMPARE.INSIDE }; var densKgM3Limit7 = new ValueLimit() { Group = COMMODITY_GROUP.GENERALIZED_REFINED_PRODUCT, Min = 610.6, Max = 1163.5 }; var densSGLimit8 = new ValueLimit() { Group = COMMODITY_GROUP.LPG_NGL, Min = 0.3500, Max = 0.6880 }; var densKgM3Limit8 = new ValueLimit() { Group = COMMODITY_GROUP.LPG_NGL, Min = Conversions.SGtoKgm3(densSGLimit8.Min), Max = Conversions.SGtoKgm3(densSGLimit8.Max) }; var densKgM3Limits = new Dictionary <COMMODITY_GROUP, ValueLimit>(); densKgM3Limits.Add(densKgM3Limit1.Group, densKgM3Limit1); densKgM3Limits.Add(densKgM3Limit2.Group, densKgM3Limit2); densKgM3Limits.Add(densKgM3Limit3.Group, densKgM3Limit3); densKgM3Limits.Add(densKgM3Limit4.Group, densKgM3Limit4); densKgM3Limits.Add(densKgM3Limit5.Group, densKgM3Limit5); densKgM3Limits.Add(densKgM3Limit6.Group, densKgM3Limit6); densKgM3Limits.Add(densKgM3Limit7.Group, densKgM3Limit7); densKgM3Limits.Add(densKgM3Limit8.Group, densKgM3Limit8); UnitOfMeasure den1 = new UnitOfMeasure() { VariableType = VARIABLE_TYPE.DENSITY, Name = "kg/m3", Precision = 0.1, Limits = densKgM3Limits }; // Since API is the inverse of density... limits are swaped Max=Min and Min=Max... Min is now to be compared for <= as well var densAPILimit1 = new ValueLimit() { Group = COMMODITY_GROUP.CRUDE_OIL, Min = Conversions.Kgm3toAPI(densKgM3Limit1.Max), Max = Conversions.Kgm3toAPI(densKgM3Limit1.Min), MinCompare = COMPARE.INSIDE }; var densAPILimit2 = new ValueLimit() { Group = COMMODITY_GROUP.FUEL_OILS, Min = Conversions.Kgm3toAPI(densKgM3Limit2.Max), Max = Conversions.Kgm3toAPI(densKgM3Limit2.Min) }; var densAPILimit3 = new ValueLimit() { Group = COMMODITY_GROUP.JET_FUELS, Min = Conversions.Kgm3toAPI(densKgM3Limit3.Max), Max = Conversions.Kgm3toAPI(densKgM3Limit3.Min), MinCompare = COMPARE.INSIDE }; var densAPILimit4 = new ValueLimit() { Group = COMMODITY_GROUP.TRANSITION_ZONE, Min = Conversions.Kgm3toAPI(densKgM3Limit4.Max), Max = Conversions.Kgm3toAPI(densKgM3Limit4.Min), MinCompare = COMPARE.INSIDE }; var densAPILimit5 = new ValueLimit() { Group = COMMODITY_GROUP.GASOLINES, Min = Conversions.Kgm3toAPI(densKgM3Limit5.Max), Max = Conversions.Kgm3toAPI(densKgM3Limit5.Min), MinCompare = COMPARE.INSIDE }; var densAPILimit6 = new ValueLimit() { Group = COMMODITY_GROUP.LUBRICATING_OIL, Min = Conversions.Kgm3toAPI(densKgM3Limit6.Max), Max = Conversions.Kgm3toAPI(densKgM3Limit6.Min), MinCompare = COMPARE.INSIDE }; var densAPILimit7 = new ValueLimit() { Group = COMMODITY_GROUP.GENERALIZED_REFINED_PRODUCT, Min = Conversions.Kgm3toAPI(densKgM3Limit7.Max), Max = Conversions.Kgm3toAPI(densKgM3Limit7.Min) }; var densAPILimit8 = new ValueLimit() { Group = COMMODITY_GROUP.LPG_NGL, Min = Conversions.Kgm3toAPI(densKgM3Limit8.Max), Max = Conversions.Kgm3toAPI(densKgM3Limit8.Min) }; var densAPILimits = new Dictionary <COMMODITY_GROUP, ValueLimit>(); densAPILimits.Add(densAPILimit1.Group, densAPILimit1); densAPILimits.Add(densAPILimit2.Group, densAPILimit2); densAPILimits.Add(densAPILimit3.Group, densAPILimit3); densAPILimits.Add(densAPILimit4.Group, densAPILimit4); densAPILimits.Add(densAPILimit5.Group, densAPILimit5); densAPILimits.Add(densAPILimit6.Group, densAPILimit6); densAPILimits.Add(densAPILimit7.Group, densAPILimit7); densAPILimits.Add(densAPILimit8.Group, densAPILimit8); UnitOfMeasure den2 = new UnitOfMeasure() { VariableType = VARIABLE_TYPE.DENSITY, Name = "API", Precision = 0.1, Limits = densAPILimits }; // Swap again limits since it is based on API var densSGLimit1 = new ValueLimit() { Group = COMMODITY_GROUP.CRUDE_OIL, Min = Conversions.APItoSG(densAPILimit1.Max), Max = Conversions.APItoSG(densAPILimit1.Min), MaxCompare = COMPARE.INSIDE }; var densSGLimit2 = new ValueLimit() { Group = COMMODITY_GROUP.FUEL_OILS, Min = Conversions.APItoSG(densAPILimit2.Max), Max = Conversions.APItoSG(densAPILimit2.Min) }; var densSGLimit3 = new ValueLimit() { Group = COMMODITY_GROUP.JET_FUELS, Min = Conversions.APItoSG(densAPILimit3.Max), Max = Conversions.APItoSG(densAPILimit3.Min), MaxCompare = COMPARE.INSIDE }; var densSGLimit4 = new ValueLimit() { Group = COMMODITY_GROUP.TRANSITION_ZONE, Min = Conversions.APItoSG(densAPILimit4.Max), Max = Conversions.APItoSG(densAPILimit4.Min), MaxCompare = COMPARE.INSIDE }; var densSGLimit5 = new ValueLimit() { Group = COMMODITY_GROUP.GASOLINES, Min = Conversions.APItoSG(densAPILimit5.Max), Max = Conversions.APItoSG(densAPILimit5.Min), MaxCompare = COMPARE.INSIDE }; var densSGLimit6 = new ValueLimit() { Group = COMMODITY_GROUP.LUBRICATING_OIL, Min = Conversions.APItoSG(densAPILimit6.Max), Max = Conversions.APItoSG(densAPILimit6.Min), MaxCompare = COMPARE.INSIDE }; var densSGLimit7 = new ValueLimit() { Group = COMMODITY_GROUP.GENERALIZED_REFINED_PRODUCT, Min = Conversions.APItoSG(densAPILimit7.Max), Max = Conversions.APItoSG(densAPILimit7.Min) }; var densSGLimits = new Dictionary <COMMODITY_GROUP, ValueLimit>(); densSGLimits.Add(densSGLimit1.Group, densSGLimit1); densSGLimits.Add(densSGLimit2.Group, densSGLimit2); densSGLimits.Add(densSGLimit3.Group, densSGLimit3); densSGLimits.Add(densSGLimit4.Group, densSGLimit4); densSGLimits.Add(densSGLimit5.Group, densSGLimit5); densSGLimits.Add(densSGLimit6.Group, densSGLimit6); densSGLimits.Add(densSGLimit7.Group, densSGLimit7); densSGLimits.Add(densSGLimit8.Group, densSGLimit8); UnitOfMeasure den3 = new UnitOfMeasure() { VariableType = VARIABLE_TYPE.DENSITY, Name = "Relative Density", Precision = 0.001, Limits = densSGLimits }; uoms.Add(den1.Name.ToLower(), den1); uoms.Add(den2.Name.ToLower(), den2); uoms.Add(den3.Name.ToLower(), den3); // Temperature var tempFLimit = new ValueLimit() { Group = COMMODITY_GROUP.ANY, Min = -58.0, Max = 302.0 }; var tempFLimit2 = new ValueLimit() { Group = COMMODITY_GROUP.LPG_NGL, Min = Conversions.DegKtoDegF(227.15), Max = Conversions.DegKtoDegF(366.15) }; var tempFLimits = new Dictionary <COMMODITY_GROUP, ValueLimit>(); tempFLimits.Add(tempFLimit.Group, tempFLimit); tempFLimits.Add(tempFLimit2.Group, tempFLimit2); UnitOfMeasure temp1 = new UnitOfMeasure() { VariableType = VARIABLE_TYPE.TEMPERATURE, Name = "degF", Precision = 0.1, Limits = tempFLimits }; var tempCLimit = new ValueLimit() { Group = COMMODITY_GROUP.ANY, Min = Conversions.DegFtoDegC(tempFLimit.Min), Max = Conversions.DegFtoDegC(tempFLimit.Max) }; var tempCLimit2 = new ValueLimit() { Group = COMMODITY_GROUP.LPG_NGL, Min = Conversions.DegFtoDegC(tempFLimit2.Min), Max = Conversions.DegFtoDegC(tempFLimit2.Max) }; var tempCLimits = new Dictionary <COMMODITY_GROUP, ValueLimit>(); tempCLimits.Add(tempCLimit.Group, tempCLimit); tempCLimits.Add(tempCLimit2.Group, tempCLimit2); UnitOfMeasure temp2 = new UnitOfMeasure() { VariableType = VARIABLE_TYPE.TEMPERATURE, Name = "degC", Precision = 0.05, Limits = tempCLimits }; uoms.Add(temp1.Name.ToLower(), temp1); uoms.Add(temp2.Name.ToLower(), temp2); // Pressure var pressPsigLimit = new ValueLimit() { Group = COMMODITY_GROUP.ANY, Min = 0, Max = 1500 }; var pressPsigLimits = new Dictionary <COMMODITY_GROUP, ValueLimit>(); pressPsigLimits.Add(pressPsigLimit.Group, pressPsigLimit); UnitOfMeasure press1 = new UnitOfMeasure() { VariableType = VARIABLE_TYPE.PRESSURE, Name = "psig", Precision = 1, Limits = pressPsigLimits }; var presskPaLimit = new ValueLimit() { Group = COMMODITY_GROUP.ANY, Min = Conversions.PSItokPa(pressPsigLimit.Min), Max = Conversions.PSItokPa(pressPsigLimit.Max) }; var presskPaLimits = new Dictionary <COMMODITY_GROUP, ValueLimit>(); presskPaLimits.Add(presskPaLimit.Group, presskPaLimit); UnitOfMeasure press2 = new UnitOfMeasure() { VariableType = VARIABLE_TYPE.PRESSURE, Name = "kPa", Precision = 5, Limits = presskPaLimits }; var pressBarLimit = new ValueLimit() { Group = COMMODITY_GROUP.ANY, Min = Conversions.PSItoBar(pressPsigLimit.Min), Max = Conversions.PSItoBar(pressPsigLimit.Max) }; var pressBarLimits = new Dictionary <COMMODITY_GROUP, ValueLimit>(); pressBarLimits.Add(pressBarLimit.Group, pressBarLimit); UnitOfMeasure press3 = new UnitOfMeasure() { VariableType = VARIABLE_TYPE.PRESSURE, Name = "bar", Precision = 0.05, Limits = pressBarLimits }; uoms.Add(press1.Name.ToLower(), press1); uoms.Add(press2.Name.ToLower(), press2); uoms.Add(press3.Name.ToLower(), press3); // Thermal Expansion Coefficient (alpha60) var expFLimit = new ValueLimit() { Group = COMMODITY_GROUP.ANY, Min = 230.0e-6, Max = 930.0e-6 }; var expFLimits = new Dictionary <COMMODITY_GROUP, ValueLimit>(); expFLimits.Add(expFLimit.Group, expFLimit); UnitOfMeasure exp1 = new UnitOfMeasure() { VariableType = VARIABLE_TYPE.THERMAL_EXPANSION_COEFF, Name = "1/degF", Precision = 0.0000001, Limits = expFLimits }; var expCLimit = new ValueLimit() { Group = COMMODITY_GROUP.ANY, Min = Conversions.CoeffThermExpFtoC(expFLimit.Min), Max = Conversions.CoeffThermExpFtoC(expFLimit.Max) }; var expCLimits = new Dictionary <COMMODITY_GROUP, ValueLimit>(); expCLimits.Add(expCLimit.Group, expCLimit); UnitOfMeasure exp2 = new UnitOfMeasure() { VariableType = VARIABLE_TYPE.THERMAL_EXPANSION_COEFF, Name = "1/degC", Precision = 0.0000002, Limits = expCLimits }; uoms.Add(exp1.Name.ToLower(), exp1); uoms.Add(exp2.Name.ToLower(), exp2); // CTL UnitOfMeasure ctl = new UnitOfMeasure() { VariableType = VARIABLE_TYPE.CTL, Name = "CTL", Precision = 0.00001 }; uoms.Add(ctl.Name.ToLower(), ctl); // Scaled Compressibility Factor (Fp) UnitOfMeasure comp1 = new UnitOfMeasure() { VariableType = VARIABLE_TYPE.SCALED_COMPRESSIBILITY_FACTOR, Name = "1/psi", Precision = 0.001 }; UnitOfMeasure comp2 = new UnitOfMeasure() { VariableType = VARIABLE_TYPE.SCALED_COMPRESSIBILITY_FACTOR, Name = "1/kPa", Precision = 0.0001 }; UnitOfMeasure comp3 = new UnitOfMeasure() { VariableType = VARIABLE_TYPE.SCALED_COMPRESSIBILITY_FACTOR, Name = "1/bar", Precision = 0.01 }; uoms.Add(comp1.Name.ToLower(), comp1); uoms.Add(comp2.Name.ToLower(), comp2); uoms.Add(comp3.Name.ToLower(), comp3); // CPL UnitOfMeasure cpl = new UnitOfMeasure() { VariableType = VARIABLE_TYPE.CPL, Name = "CPL", Precision = 0.00001 }; uoms.Add(cpl.Name.ToLower(), cpl); // CTPL UnitOfMeasure ctpl = new UnitOfMeasure() { VariableType = VARIABLE_TYPE.CTPL, Name = "CTPL", Precision = 0.00001 }; uoms.Add(ctpl.Name.ToLower(), ctpl); return(uoms); }