Below function is not able to handle concurrent calls I need to Use IMemoryCache
public async Task<FlexModelTotalMassFlow> GetFlexModels(CalculationParameters calculationParameters)
{
try
{
var flex = new List<MasterModel>();
var recommendedModels = new FlexModelTotalMassFlow();
var compressorConfig = await _coefficentUtil.GetCompressorConfig(calculationParameters.LowSaturationSuctionTemp, calculationParameters.MedSaturationSuctionTemp, calculationParameters.LowTempRequiredLoad, calculationParameters.MedTempRequiredLoad);
var airOverCoilTemp = await GetPtChartByZip(calculationParameters, false);
var requiredLowTempLoadCapacityUserGap = 0;
var requiredMedTempLoadCapacityUserGap = 0;
var massFlowData = await GetRecommendedCompressorsByMassFlow(calculationParameters);
if (massFlowData == null)
{
return null;
}
var lowTempCompressorGroup = massFlowData.CompressorResults.Where((l) => l.CompressorType == CompressorType.LowTempCompressor).ToList();
var medTempCompressorGroup = massFlowData.CompressorResults.Where((l) => l.CompressorType == CompressorType.MediumTempCompressor).ToList();
var enthalpyTable = await _nistRepository.GetNistIsothermalEnthalpyTable(35, 185, compressorConfig.MedTempPressure, 25);
(double intercept, double slope) = SimpleRegression.Fit(enthalpyTable.x, enthalpyTable.y);
foreach (var e in compressorConfig.FlexModels)
{
var lowTempCompressors = _powerMassFlowUtil.GetFlexModelMassFlow(lowTempCompressorGroup, e.LtComp, int.Parse(ConfigurationManager.AppSetting["Settings:Constants:LowReturnGasTempurature"]));
var lowTempCompressorGroupMassFlow = (decimal)lowTempCompressors.Sum((e) => e.MassFlow);
var lowTempCompressorGroupPower = _powerMassFlowUtil.GetFlexModelPower(lowTempCompressorGroup, e.LtComp, int.Parse(ConfigurationManager.AppSetting["Settings:Constants:LowReturnGasTempurature"]));
var medTempCompressors = _powerMassFlowUtil.GetFlexModelMassFlow(medTempCompressorGroup, e.MtComp, 50);
var medTempCompressorGroupMassFlow = (decimal)medTempCompressors.Sum((e) => e.MassFlow);
var systemFlashGasMassFLow = _powerMassFlowUtil.GetSystemFlashGasMassFLow(medTempCompressorGroupMassFlow, massFlowData.SystemRequirments.FlashTankInletEnthalpy);
var mediumTempMassFlow = medTempCompressorGroupMassFlow - lowTempCompressorGroupMassFlow - systemFlashGasMassFLow;
var lowTempExcess = (Math.Round(massFlowData.SystemRequirments.LowTempChangeInEnthalpy * lowTempCompressorGroupMassFlow, 2) - calculationParameters.LowTempRequiredLoad) + requiredLowTempLoadCapacityUserGap;
var medTempExcess = (Math.Round(massFlowData.SystemRequirments.MedTempChangeInEnthalpy * mediumTempMassFlow, 2) - calculationParameters.MedTempRequiredLoad) + requiredMedTempLoadCapacityUserGap;
flex.Add(new MasterModel
{
Modelname = e.Modelname,
TotalLtCompMassFlow = Math.Round(lowTempCompressorGroupMassFlow, 2),
TotalMedCompMassFlow = Math.Round(medTempCompressorGroupMassFlow, 2),
LowTempCompressorCapacity = Math.Round(massFlowData.SystemRequirments.LowTempChangeInEnthalpy * lowTempCompressorGroupMassFlow, 2),
MedTempCompressorCapacity = Math.Round(massFlowData.SystemRequirments.MedTempChangeInEnthalpy * mediumTempMassFlow, 2),
LowTempExcessCapacity = lowTempExcess,
LowTempExcessPercent = calculationParameters.LowTempRequiredLoad != 0 ? Math.Round((lowTempExcess / calculationParameters.LowTempRequiredLoad) * 100, 2) : 0,
MedTempExcessCapacity = medTempExcess,
MedTempExcessPercent = calculationParameters.MedTempRequiredLoad != 0 ? Math.Round((medTempExcess / calculationParameters.MedTempRequiredLoad) * 100, 2) : 0,
GasCoolerOutletTemp = (int)airOverCoilTemp.ptChart.GasCoolerOutTemp,
GasCoolerOutletPressure = (double)airOverCoilTemp.ptChart.GasCoolerPSIA,
AmbientTemp = airOverCoilTemp.ptChart.AmbientTemp,
GasCoolerPsiA = airOverCoilTemp.ptChart.GasCoolerPSIA,
AirOverCoilTemp = airOverCoilTemp.ptChart.AirOverCoilTemp,
CondenserTemp = airOverCoilTemp.ptChart.CondenserTemp,
Cooling_DB_04 = airOverCoilTemp.ashrae.Cooling_DB_04,
Cooling_MCWB_04 = airOverCoilTemp.ashrae.Cooling_MCWB_04,
Extreme_annual_db_Max = airOverCoilTemp.ashrae.Extreme_annual_db_Max,
isCriteriaMatched = true,
});
}
if (calculationParameters.LowTempRequiredLoad == 0 || calculationParameters.MedTempRequiredLoad == 0)
{
recommendedModels = new FlexModelTotalMassFlow
{
SystemRequirments = massFlowData.SystemRequirments,
FlexModels = flex.Where((f) =>
f.TotalLtCompMassFlow >= massFlowData.SystemRequirments.LowTempMassFlow
&& f.TotalMedCompMassFlow >= massFlowData.SystemRequirments.MedTempMassFlow
&& f.LowTempCompressorCapacity >= calculationParameters.LowTempRequiredLoad
&& f.MedTempCompressorCapacity >= calculationParameters.MedTempRequiredLoad
&& f.LowTempExcessPercent < 35
&& f.MedTempExcessPercent < 35
).OrderBy((e) => e.LowTempExcessCapacity).ThenBy((e) => e.MedTempExcessCapacity).ToList()
};
}
recommendedModels = new FlexModelTotalMassFlow
{
SystemRequirments = massFlowData.SystemRequirments,
FlexModels = flex.Where((f) =>
f.TotalLtCompMassFlow >= massFlowData.SystemRequirments.LowTempMassFlow
&& f.TotalMedCompMassFlow >= massFlowData.SystemRequirments.MedTempMassFlow
&& f.LowTempCompressorCapacity >= calculationParameters.LowTempRequiredLoad
&& f.MedTempCompressorCapacity >= calculationParameters.MedTempRequiredLoad
&& f.LowTempExcessPercent < 35
&& f.LowTempExcessPercent >= calculationParameters.PercentCapacityGap
&& f.MedTempExcessPercent < 35
&& f.MedTempExcessPercent >= calculationParameters.PercentCapacityGap
).OrderBy((e) => e.LowTempExcessCapacity).ThenBy((e) => e.MedTempExcessCapacity).ToList()
};
var requiredMTLoad = calculationParameters.MedTempRequiredLoad;
var percentageMTLoad = (requiredMTLoad * 0.35) + requiredMTLoad;
var requiredLTLoad = calculationParameters.LowTempRequiredLoad;
var percentageLTLoad = (requiredLTLoad * 0.35) +requiredLTLoad;
if (recommendedModels.FlexModels.Count <= 0)
{
recommendedModels = _distanceToUtil.NoCriteriaMatchedModels(flex, massFlowData, requiredMTLoad, percentageMTLoad);
}
return recommendedModels;
}
catch (Exception ex)
{
_logger.LogError(MethodBase.GetCurrentMethod(), ex, calculationParameters);
throw;
}
}