コード例 #1
0
ファイル: PlanCalculator.cs プロジェクト: prisae/extreme
        private static Complex[,] CalculateA(OmegaModel model, AuxContainer c)
        {
            var result = new Complex[c.P.Length, c.P.Length];

            int s = System.Math.Max(c.CorrBackgroundRc, c.CorrBackgroundTr);
            int r = System.Math.Min(c.CorrBackgroundRc, c.CorrBackgroundTr);

            for (int n = s; n >= r; n--)
            {
                Complex prevA = 1.0 / (c.Eta[n] * (1 - c.P[n] * c.Q[n] * c.Exp[n]));

                result[n, n] = prevA;

                for (int k = n - 1; k >= r; k--)
                {
                    var dk1 = (double)model.GetLayerDepth(k + 1);

                    var q = ((1 + c.P[k + 1]) / (1 + c.P[k] * c.Exp[k])) *
                            Complex.Exp((c.Eta[k + 1] - c.Eta[k]) * dk1);

                    Complex nextA = q * prevA;

                    result[k, n] = nextA;
                    result[n, k] = nextA;

                    prevA = nextA;
                }
            }

            return(result);
        }
コード例 #2
0
ファイル: PlanCalculator.cs プロジェクト: prisae/extreme
        public InnerResult CalculateForH(Transmitter transmitter, Receiver receiver)
        {
            var c           = AuxContainer.CreateContainer(_model, transmitter, receiver);
            var uCalculator = GetCalculatorU(_model, c);
            var result      = CalculateForH(c, uCalculator);

            return(result);
        }
コード例 #3
0
ファイル: AuxContainer.cs プロジェクト: prisae/extreme
        public static AuxContainer CreateContainer(OmegaModel model, Transmitter tr, Receiver rc)
        {
            var corrBackgroundTr = model.DetermineCorrespondingBackgroundLayer(tr.GetWorkingDepth());
            var corrBackgroundRc = model.DetermineCorrespondingBackgroundLayer(rc.GetWorkingDepth());

            var c = new AuxContainer(tr, rc, corrBackgroundTr, corrBackgroundRc);

            return(c);
        }
コード例 #4
0
 private Z GetZ(AuxContainer c)
 {
     return(new Z
     {
         s1 = (double)c.Tr.StartingDepth,
         s2 = (double)c.Tr.GetEndDepth(),
         r1 = (double)c.Rc.StartingDepth,
         r2 = (double)c.Rc.GetEndDepth()
     });
 }
コード例 #5
0
ファイル: PlanCalculator.cs プロジェクト: prisae/extreme
        private InnerResult CalculateForE(AuxContainer c, ICalculatorU u)
        {
            var e      = InitResultE(_planItem);
            var zeta   = _model.Section1D.GetAllSection1DZeta();
            var length = _planItem.Lambdas.Length;

            for (int i = 0; i < length; i++)
            {
                var lambda = _planItem.Lambdas[i];

                c.Eta = CalculateEta(_model, lambda);
                c.Exp = CalculateExp(_model, c.Eta);

                if (_planItem.CalculateI1)
                {
                    c.P     = CalculateP1(_alphaBeta, c.Eta, c.Exp);
                    c.Q     = CalculateQ1(_alphaBeta, c.Eta, c.Exp);
                    c.A     = CalculateA1(_model, c);
                    e.U1[i] = u.CalculateU1();
                }

                c.P = CalculatePSigma(zeta, c.Eta, c.Exp);
                c.Q = CalculateQSigma(c.Eta, c.Exp);
                c.A = CalculateASigma(_model, c);

                if (_planItem.CalculateI2)
                {
                    e.U2[i] = u.CalculateU2();
                }
                if (_planItem.CalculateI3)
                {
                    e.U3[i] = u.CalculateU3();
                }
                if (_planItem.CalculateI4)
                {
                    e.U4[i] = u.CalculateU4();
                }
                if (_planItem.CalculateI5)
                {
                    e.U5[i] = u.CalculateU5(lambda);
                }
            }

            var result = ScalarMathUtils.NormalizeAndPerformHankel(e, _planItem, _model, c.CorrBackgroundRc);

            return(result);
        }
コード例 #6
0
ファイル: PlanCalculator.cs プロジェクト: prisae/extreme
        private static Complex[,] CalculateASigma(OmegaModel model, AuxContainer c)
        {
            var a = CalculateA(model, c);

            int s = System.Math.Max(c.CorrBackgroundRc, c.CorrBackgroundTr);
            int r = System.Math.Min(c.CorrBackgroundRc, c.CorrBackgroundTr);

            for (int n = s; n >= r; n--)
            {
                for (int k = n - 1; k >= r; k--)
                {
                    var zetaRc = model.Section1D[k].Zeta;
                    var zetaTr = model.Section1D[n].Zeta;

                    a[n, k] = (zetaTr / zetaRc) * a[k, n];
                }
            }

            return(a);
        }
コード例 #7
0
ファイル: PlanCalculator.cs プロジェクト: prisae/extreme
        private InnerResult CalculateForH(AuxContainer c, ICalculatorU u)
        {
            var h      = InitResultH(_planItem);
            var zeta   = _model.Section1D.GetAllSection1DZeta();
            var length = _planItem.Lambdas.Length;

            for (int i = 0; i < length; i++)
            {
                c.Eta = CalculateEta(_model, _planItem.Lambdas[i]);
                c.Exp = CalculateExp(_model, c.Eta);

                c.P = CalculateP1(_alphaBeta, c.Eta, c.Exp);
                c.Q = CalculateQ1(_alphaBeta, c.Eta, c.Exp);
                c.A = CalculateA1(_model, c);
                if (_planItem.CalculateI4)
                {
                    h.U11[i] = u.CalculateU1();
                }
                if (_planItem.CalculateI1)
                {
                    h.U31[i] = u.CalculateU3();
                }

                c.P = CalculatePSigma(zeta, c.Eta, c.Exp);
                c.Q = CalculateQSigma(c.Eta, c.Exp);
                c.A = CalculateASigma(_model, c);
                if (_planItem.CalculateI3)
                {
                    h.U1Sigma[i] = u.CalculateU1();
                }
                if (_planItem.CalculateI2)
                {
                    h.U4Sigma[i] = u.CalculateU4();
                }
            }

            var result = ScalarMathUtils.NormalizeAndPerformHankel(h, _planItem);

            return(result);
        }
コード例 #8
0
 public VolumeToVolumeCalculatorU(OmegaModel model, AuxContainer container)
 {
     _model     = model;
     _container = container;
 }
コード例 #9
0
ファイル: PlanCalculator.cs プロジェクト: prisae/extreme
 protected abstract ICalculatorU GetCalculatorU(OmegaModel model, AuxContainer c);
コード例 #10
0
ファイル: PlanCalculator.cs プロジェクト: prisae/extreme
 protected override ICalculatorU GetCalculatorU(OmegaModel model, AuxContainer c)
 {
     return(new VolumeToPointCalculatorU(model, c));
 }
コード例 #11
0
ファイル: PlanCalculator.cs プロジェクト: prisae/extreme
 public static Complex[,] CalculateA1(OmegaModel model, AuxContainer c)
 => CalculateA(model, c);