private double FunctionValueHalfTime(INonlinearModel model, int rowVid, ValuesByIndex values, bool newValues) { foreach (Variable c in data.Variables) { if (c.ConstName == "T1/2") { c.ConstValue = values[model.GetIndexFromKey(c.ConstName)]; break; } } double R = data.Variables[0].ConstValue; double w = data.Variables[1].ConstValue; double Kon = data.Variables[2].ConstValue; double Koff = data.Variables[3].ConstValue; double Df = data.Variables[4].ConstValue; double Ceq = data.Variables[5].ConstValue; double Feq = 1 - Ceq; double Tht = data.Variables[6].ConstValue; data.FitYVals = new double[data.XVals.Length]; Laplace lap = new Laplace(); lap.InitStehfest(14); return(Math.Abs((R)*lap.InverseTransform(R, w, Feq, Ceq, Kon, Koff, Df, Tht) - 0.5 * R)); }
/// <summary> /// The calculation Of the dimensionless wellbore pressure drop with skin for homogeneous reservoir. /// </summary> /// <param name="td">dimensionless time</param> /// <param name="cd">dimensionless wellbore storage</param> /// <param name="skinFactor">skin factor</param> /// <returns></returns> public static double PwdR(double td, double cd, double skinFactor) { Condition.Requires(td, nameof(td)).IsGreaterOrEqual(0.0); Condition.Requires(cd, nameof(cd)).IsGreaterOrEqual(0.0); return(Laplace.InverseTransform((x) => PwdRinLaplaceSpace(x, cd, skinFactor), td)); }
private static void SolveEq(DataSet data) { if (data.XVals.Length == 0 || data.Variables.Count == 0) { return; } double R = data.Variables[0].ConstValue; double w = data.Variables[1].ConstValue; double Kon = data.Variables[2].ConstValue; double Koff = data.Variables[3].ConstValue; double Df = data.Variables[4].ConstValue; double Ceq = data.Variables[5].ConstValue; double Feq = 1 - Ceq; data.FitYVals = new double[data.XVals.Length]; Laplace lap = new Laplace(); lap.InitStehfest(14); for (int t = 1; t < data.XVals.Length; t++) { //data.FitYVals[0][t] = MathNet.Numerics.SpecialFunctions.BesselK1(data.XVals[t]); //data.YVals[0][t] = MathNet.Numerics.SpecialFunctions.BesselI1(data.XVals[t]); //data.FitYVals[0][t] = Accord.Math.Bessel.I(data.XVals[t]); //data.FitYVals[0][t] = Accord.Math.Bessel.Y(data.XVals[t]); - it is not modified!!! data.FitYVals[t] = (R)*lap.InverseTransform(R, w, Feq, Ceq, Kon, Koff, Df, data.XVals[t]); } }
/// <summary> /// Dimensionless wellbore pressure /// </summary> /// <param name="td">dimensionless time</param> /// <returns></returns> private double Pwd(double td) { return(Laplace.InverseTransform(PwdRinLaplaceSpace, td)); }