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");
                }
            }
        }
示例#2
0
        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));
        }
示例#3
0
        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);
        }
示例#4
0
 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;
        }
示例#6
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);
        }
示例#7
0
        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);
        }
示例#8
0
        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);
        }
示例#9
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);
            }
        }
示例#10
0
        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)
 {
 }
示例#12
0
 public SingleLayerSimulation1D(
     SimulationParameters simulationParameters,
     BaseBiosensor biosensor,
     IResultPrinter resultPrinter) : base(simulationParameters, biosensor, resultPrinter)
 {
 }
示例#13
0
 public PerforatedMembrane1D(
     SimulationParameters simulationParameters,
     BaseBiosensor biosensor,
     IResultPrinter resultPrinter) : base(simulationParameters, biosensor, resultPrinter)
 {
 }
 public CrankNicolsonScheme(BaseBiosensor biosensor, SimulationParameters simulationParameters)
 {
     Biosensor            = biosensor;
     SimulationParameters = simulationParameters;
 }