public void AssertStability(SimulationParameters simulationParameters, BaseBiosensor biosensor) { var isReactionStable = GetReactionStability(biosensor.VMax, biosensor.Km, simulationParameters.t); if (!isReactionStable) { throw new Exception("Simulation scheme is not stable"); } foreach (var layer in biosensor.Layers) { if (layer.N == 0 || layer.Type == LayerType.SelectiveMembrane) { continue; } var Dmax = Math.Max(layer.Substrate.DiffusionCoefficient, layer.Product.DiffusionCoefficient); var isLayerStable = GetDiffusionStability(Dmax, layer.H, simulationParameters.t); if (!isLayerStable) { throw new Exception("Simulation scheme is not stable"); } } }
public double GetZeroOrderAnalyticalSolutionForTwoLayerModel(BaseBiosensor biosensor, SimulationParameters simulationParameters) { var S0 = biosensor.S0; var enzymeLayer = biosensor.EnzymeLayer; var diffusionLayer = biosensor.DiffusionLayer; var alpha = Math.Sqrt(biosensor.VMax * enzymeLayer.Height * enzymeLayer.Height / (biosensor.Km * enzymeLayer.Substrate.DiffusionCoefficient)); var firstMultiplier = simulationParameters.ne * simulationParameters.F * enzymeLayer.Product.DiffusionCoefficient * S0 / (enzymeLayer.Height + diffusionLayer.Height); var secondMultiplier = enzymeLayer.Height + diffusionLayer.Height * (diffusionLayer.Substrate.DiffusionCoefficient - alpha * enzymeLayer.Substrate.DiffusionCoefficient * Math.Sinh(alpha) / Math.Cosh(alpha)) / (diffusionLayer.Substrate.DiffusionCoefficient + alpha * (diffusionLayer.Height / enzymeLayer.Height) * enzymeLayer.Substrate.DiffusionCoefficient * Math.Sinh(alpha) / Math.Cosh(alpha)); var thirdMultiplier = alpha * enzymeLayer.Substrate.DiffusionCoefficient * diffusionLayer.Height * Math.Sinh(alpha) / (enzymeLayer.Height * Math.Cosh(alpha)) + enzymeLayer.Substrate.DiffusionCoefficient * diffusionLayer.Product.DiffusionCoefficient / enzymeLayer.Product.DiffusionCoefficient * (1 - 1 / Math.Cosh(alpha)); return(firstMultiplier * secondMultiplier * thirdMultiplier / (diffusionLayer.Product.DiffusionCoefficient * enzymeLayer.Height + enzymeLayer.Product.DiffusionCoefficient * diffusionLayer.Height)); }
private static double GetZeroOrderAnalyticalSolutionForSingleLayerModel(BaseBiosensor biosensor, SimulationParameters simulationParameters) { var enzymeLayer = biosensor.EnzymeLayer; var iCur = simulationParameters.ne * simulationParameters.F * biosensor.VMax * enzymeLayer.Height / 2; return(iCur); }
protected BaseSimulation( SimulationParameters simulationParameters, BaseBiosensor biosensor, IResultPrinter resultPrinter) { SimulationParameters = simulationParameters; Biosensor = biosensor; ResultPrinter = resultPrinter; }
public ImplicitSchemeParameters(BaseBiosensor biosensor, Layer layer, Substance substance) { var a = substance.DiffusionCoefficient * layer.R; var c = 1 + 2 * a; var n = layer.N; A = new double[n]; B = new double[n]; C = new double[n]; D = new double[n]; E = new double[n]; F = new double[n]; for (var i = 1; i < n - 1; i++) { A[i] = B[i] = a; C[i] = c; } if (substance is Substrate) { A[0] = 0; C[0] = 1; B[n - 1] = 0; C[n - 1] = 1; Niu1 = 0; Niu2 = biosensor.S0; Beta1 = 1; Beta2 = 0; } if (substance is Product) { A[0] = 0; C[0] = 1; B[n - 1] = 0; C[n - 1] = 1; Niu1 = 0; Niu2 = 0; Beta1 = 0; Beta2 = 0; } A[n - 1] = Beta2; B[0] = Beta1; U0 = U1 = 0; Y0 = Y1 = 0; }
private static double GetFirstOrderAnalyticSolutionForTwoLayerModel(BaseBiosensor biosensor, SimulationParameters simulationParameters) { var enzymeLayer = biosensor.EnzymeLayer; var diffusionLayer = biosensor.DiffusionLayer; var iCur = simulationParameters.ne * simulationParameters.F * biosensor.VMax * enzymeLayer.Height * (diffusionLayer.Product.DiffusionCoefficient * diffusionLayer.Height + 2 * enzymeLayer.Product.DiffusionCoefficient * diffusionLayer.Height) / (2 * (diffusionLayer.Product.DiffusionCoefficient * diffusionLayer.Height + enzymeLayer.Product.DiffusionCoefficient * diffusionLayer.Height)); return(iCur); }
private static double GetFirstOrderAnalyticSolutionForSingleLayerModel(BaseBiosensor biosensor, SimulationParameters simulationParameters) { var S0 = 0.01 * biosensor.Km; var enzymeLayer = biosensor.EnzymeLayer; var alpha = Math.Sqrt(biosensor.VMax / (biosensor.Km * enzymeLayer.Substrate.DiffusionCoefficient)); var iCur = simulationParameters.ne * simulationParameters.F * enzymeLayer.Product.DiffusionCoefficient * S0 / enzymeLayer.Height * (1 - 1 / Math.Cosh(alpha * enzymeLayer.Height)); return(iCur); }
public double GetFirstOrderAnalyticSolution(BaseBiosensor biosensor, SimulationParameters simulationParameters) { if (biosensor.Layers.Count == 1) { return(GetFirstOrderAnalyticSolutionForSingleLayerModel(biosensor, simulationParameters)); } if (biosensor.Layers.Count == 2) { return(GetFirstOrderAnalyticSolutionForTwoLayerModel(biosensor, simulationParameters)); } return(0); }
public ExplicitSchemeCalculator(BaseBiosensor biosensor, SimulationParameters simulationParameters) { Biosensor = biosensor; SimulationParameters = simulationParameters; foreach (var layer in biosensor.Layers) { layer.Product.ExplicitScheme = new ExplicitSchemeParameters(layer, layer.Product); if (layer.Type == LayerType.SelectiveMembrane) { continue; } layer.Substrate.ExplicitScheme = new ExplicitSchemeParameters(layer, layer.Substrate); } }
public SimulationParametersSuplier1(BaseBiosensor biosensor) { ne = 2; DecayRate = 1e-4; F = 96485.33289; ZeroIBond = 1e-25; t = 7.5e-6; LayersSteps = new List <KeyValuePair <LayerType, long> > { new KeyValuePair <LayerType, long>(LayerType.SelectiveMembrane, 100), new KeyValuePair <LayerType, long>(LayerType.PerforatedMembrane, 100), new KeyValuePair <LayerType, long>(LayerType.DiffusionLayer, 100), new KeyValuePair <LayerType, long>(LayerType.Enzyme, 100) }; long lastLayerMaxIndex = 0; foreach (var layer in biosensor.Layers) { layer.N = GetLayerSteps(layer.Type); N += layer.N; layer.LowerBondIndex = lastLayerMaxIndex; if (lastLayerMaxIndex == 0) { lastLayerMaxIndex--; } lastLayerMaxIndex = layer.UpperBondIndex = lastLayerMaxIndex + layer.N; if (layer.N == 0) { continue; } layer.H = layer.Height / layer.N; layer.R = t / (layer.H * layer.H); } }
public CylindricMicroreactors1D( SimulationParameters simulationParameters, BaseBiosensor biosensor, IResultPrinter resultPrinter) : base(simulationParameters, biosensor, resultPrinter) { }
public SingleLayerSimulation1D( SimulationParameters simulationParameters, BaseBiosensor biosensor, IResultPrinter resultPrinter) : base(simulationParameters, biosensor, resultPrinter) { }
public PerforatedMembrane1D( SimulationParameters simulationParameters, BaseBiosensor biosensor, IResultPrinter resultPrinter) : base(simulationParameters, biosensor, resultPrinter) { }
public CrankNicolsonScheme(BaseBiosensor biosensor, SimulationParameters simulationParameters) { Biosensor = biosensor; SimulationParameters = simulationParameters; }