///
/// Copyright (c) 2023 Sensus Slovensko a.s.
///
using Common;
using Config.Entities;
namespace TBF.UI.Procedures
{
public static class Formulas
{
public static double GetTargetQ(PTest ptest, Medium medium,
double qN, double qpQiRatio, string metroClass,
double qNaux, double qpQiRatioAux, string metroClassAux)
{
switch (ptest.FlowId)
{
case FlowId.Qdetected:
case FlowId.Qrise:
case FlowId.Qfall:
return -1.0; /// Reserved value indicating flow detection
case FlowId.Q4:
case FlowId.Qmax:
case FlowId.Q4Main:
case FlowId.QmaxMain:
return GetQ4Qmax(qN, metroClass, medium, ptest.CoefQto);
case FlowId.Q4Aux:
case FlowId.QmaxAux:
return GetQ4Qmax(qNaux, metroClassAux, medium, ptest.CoefQto);
case FlowId.Q3:
case FlowId.Qn:
case FlowId.Q3Main:
case FlowId.QnMain:
return qN;
case FlowId.Q3Aux:
case FlowId.QnAux:
return qNaux;
case FlowId.Q2:
case FlowId.Qt:
case FlowId.Q2Main:
case FlowId.QtMain:
return GetQ2Qt(qN, metroClass, medium, ptest.CoefQto);
case FlowId.Q2Aux:
case FlowId.QtAux:
return GetQ2Qt(qNaux, metroClassAux, medium, ptest.CoefQto);
case FlowId.Q1:
case FlowId.Qmin:
case FlowId.Q1Main:
case FlowId.QminMain:
return GetQ1Qmin(qN, metroClass, medium, ptest.CoefQto);
case FlowId.Q1Aux:
case FlowId.QminAux:
return GetQ1Qmin(qNaux, metroClassAux, medium, ptest.CoefQto);
case FlowId.Qp10:
case FlowId.Qp10Main:
return 0.1 * qN;
case FlowId.Qp10Aux:
return 0.1 * qNaux;
case FlowId.Qi:
case FlowId.QiMain:
return qN / qpQiRatio;
case FlowId.QiAux:
return qNaux / qpQiRatioAux;
default:
return qN; /// Manual flow selection: CoefQfrom and CoefQto are used to calculate Qfrom and Qto from Qn
}
}
///
/// Get either Q1 or Qmin flow for a given Qn and metrological class
///
/// Nominal flow in m3/h
/// Metrological class ("A" ,"B", "C" or "R#")
/// NotSpecified, ColdWater or HotWater
/// Default flow when metrologic does not match pattern
/// Q1 or Qmin flow in m3/h
public static double GetQ1Qmin(double Qn, string metroClass, Medium medium = Medium.ColdWater, double Qdflt = 0)
{
if (string.IsNullOrEmpty(metroClass)) return Qdflt;
int metroClassRatio;
if ((metroClass[0] == 'R') && int.TryParse(metroClass.Substring(1), out metroClassRatio) && (metroClassRatio > 0))
{
return Qn / (double)metroClassRatio;
}
else
{
if (medium == Medium.HotWater)
{
switch (metroClass)
{
case "A": return (Qn < 15) ? (0.04 * Qn) : (0.08 * Qn);
case "B": return (Qn < 15) ? (0.02 * Qn) : (0.04 * Qn);
case "C": return (Qn < 15) ? (0.01 * Qn) : (0.02 * Qn);
case "D": return (Qn < 15) ? (0.01 * Qn) : Qdflt;
default: break;
}
}
else
{
switch (metroClass)
{
case "A": return (Qn < 15) ? (0.04 * Qn) : (0.08 * Qn);
case "B": return (Qn < 15) ? (0.02 * Qn) : (0.03 * Qn);
case "C": return (Qn < 15) ? (0.01 * Qn) : (0.006 * Qn);
default: break;
}
}
}
return Qdflt;
}
///
/// Get either Q2 or Qt flow for a given Qn and metrological class
///
/// Nominal flow in m3/h
/// Metrological class ("A" ,"B", "C" or "R#")
/// NotSpecified, ColdWater or HotWater
/// Default flow when metrologic does not match pattern
/// Q2 or Qt flow in m3/h
public static double GetQ2Qt(double Qn, string metroClass, Medium medium = Medium.ColdWater, double Qdflt = 0)
{
if (string.IsNullOrEmpty(metroClass)) return Qdflt;
int metroClassRatio;
if ((metroClass[0] == 'R') && int.TryParse(metroClass.Substring(1), out metroClassRatio) && (metroClassRatio > 0))
{
return 1.6 * Qn / (double)metroClassRatio;
}
if (medium == Medium.HotWater)
{
switch (metroClass)
{
case "A": return (Qn < 15) ? (0.1 * Qn) : (0.2 * Qn);
case "B": return (Qn < 15) ? (0.08 * Qn) : (0.15 * Qn);
case "C": return (Qn < 15) ? (0.06 * Qn) : (0.1 * Qn);
case "D": return (Qn < 15) ? (0.015 * Qn) : Qdflt;
default: break;
}
}
else
{
switch (metroClass)
{
case "A": return (Qn < 15) ? (0.1 * Qn) : (0.3 * Qn);
case "B": return (Qn < 15) ? (0.08 * Qn) : (0.2 * Qn);
case "C": return (Qn < 15) ? (0.015 * Qn) : (0.015 * Qn);
default: break;
}
}
return Qdflt;
}
///
/// Get either Q4 or Qmax flow for a given Qn and metrological class
///
/// Nominal flow in m3/h
/// Metrological class ("A" ,"B", "C" or "R#")
/// NotSpecified, ColdWater or HotWater
/// Default flow when metrologic does not match pattern
/// Q4 or Qmax flow in m3/h
public static double GetQ4Qmax(double Qn, string metroClass, Medium medium = Medium.ColdWater, double Qdflt = 0)
{
if (string.IsNullOrEmpty(metroClass)) return Qdflt;
switch (metroClass[0])
{
case 'A':
case 'B':
case 'C':
case 'D':
return 2 * Qn;
case 'R':
return 1.25 * Qn;
default:
return Qdflt;
}
}
}
}