private void wfFormula() { if (m_Dn.Value == fsValue.Zero) { if (m_xStar.Value == fsValue.One) { m_wf.Value = fsValue.Zero; return; } else { m_wf.Value = new fsValue(); return; } } if (fsValue.One == m_xStar.Value) { m_wf.Value = fsValue.Zero; return; } bool condEmpty = fsValue.Less(m_Dn.Value, fsValue.Zero) || fsValue.Less(fsValue.One, m_xStar.Value); if (condEmpty) { m_wf.Value = new fsValue(); } else { fsValue u = m_xStar.Value; var f = new wfCalculationFunction(m_Dn.Value, u); fsValue lowerBound; fsValue upperBound; if (fsValue.Greater(u, fsValue.Exp(m_Dn.Value) * fsValue.Erfc(fsValue.Sqrt(m_Dn.Value)))) { lowerBound = fsValue.Zero; upperBound = fsValue.Sqrt(m_Dn.Value / (fsValue.Sqr(2 / u - 1) - 1)); } else { lowerBound = -1.0 * fsValue.Max(fsValue.One, fsValue.InvErf(1.0 - u / (1.0 + fsValue.Sqrt(1.0 + m_Dn.Value))) ); upperBound = fsValue.Zero; } fsValue x = fsBisectionMethod.FindRoot(f, lowerBound, upperBound, 60); x = 2 * x / fsValue.Sqrt(m_Dn.Value); m_wf.Value = 1 + 0.5 * x * (x - fsValue.Sqrt(fsValue.Sqr(x) + 4)); } }
private void wfFormula() { if (fsValue.One == m_cStar.Value) { m_wf.Value = fsValue.Zero; return; } bool condEmpty = fsValue.Less(m_Dn.Value, fsValue.Zero) || fsValue.Less(fsValue.One, m_cStar.Value); if (condEmpty) { m_wf.Value = new fsValue(); } else { fsValue u = 2 * (1 - m_cStar.Value); var f = new wfCalculationFunction(m_Dn.Value, u); fsValue lowerBound; fsValue upperBound; if (fsValue.Less(u, 1.0 + fsValue.Exp(m_Dn.Value) * fsValue.Erfc(fsValue.Sqrt(m_Dn.Value)))) { lowerBound = fsValue.Zero; upperBound = fsValue.Max(fsValue.One, fsValue.Sqrt(fsValue.Log(2 / (u * Math.Sqrt(Math.PI)))) ); } else { lowerBound = -1.0 * fsValue.InvErf(u - 1.0); upperBound = fsValue.Zero; } fsValue x = fsBisectionMethod.FindRoot(f, lowerBound, upperBound, 60); x = 2 * x / fsValue.Sqrt(m_Dn.Value); m_wf.Value = 1 + 0.5 * x * (x - fsValue.Sqrt(fsValue.Sqr(x) + 4)); } }
private void wfFormula() { bool cwEqualsCa = (m_cw.Value == m_ca.Value); if (m_Dn.Value == fsValue.Zero) { if (cwEqualsCa) { m_wf.Value = fsValue.One; return; } else { m_wf.Value = new fsValue(); return; } } if (m_cw.Value == m_c0.Value) { if (cwEqualsCa) { m_wf.Value = fsValue.One; return; } else { m_wf.Value = new fsValue(); return; } } fsValue u = (m_ca.Value - m_c0.Value) / (m_cw.Value - m_c0.Value); bool condEmpty = fsValue.Less(m_Dn.Value, fsValue.Zero) || fsValue.Less(u, fsValue.Zero) || u == fsValue.Zero || fsValue.Less(fsValue.One, u) || u == fsValue.One; if (condEmpty) { m_wf.Value = new fsValue(); } else { var f = new wfCalculationFunction(m_Dn.Value, u); fsValue lowerBound; fsValue upperBound; if (fsValue.Less(u, fsValue.Exp(m_Dn.Value) * fsValue.Erfc(fsValue.Sqrt(m_Dn.Value)))) { lowerBound = fsValue.Zero; fsValue sqrt = 1 / fsValue.Sqrt(m_Dn.Value); fsValue b = sqrt * (1 + sqrt) / Math.Sqrt(Math.PI); upperBound = 1 + fsValue.Sqrt(fsValue.Log(b / u)); } else { lowerBound = -1.0 * fsValue.Sqrt(m_Dn.Value / (fsValue.Sqr(2 / u - 1) - 1)); upperBound = fsValue.Zero; } fsValue x = fsBisectionMethod.FindRoot(f, lowerBound, upperBound, 60); x = 2 * x / fsValue.Sqrt(m_Dn.Value); m_wf.Value = 1 + 0.5 * x * (x - fsValue.Sqrt(fsValue.Sqr(x) + 4)); } }