Esempio n. 1
0
        private static double[] CalculateLambdasForLog10(HankelCoefficients hankel, double[] rho)
        {
            var rhoLength = rho.Length;

            var k = new double[hankel.GetLengthOfLambdaWithRespectTo(rhoLength)];

            var rhoMin  = rho[0];
            var rhoStep = hankel.GetLog10RhoStep();

            int n1 = hankel.GetN1WithRespectTo(rhoLength);
            int n2 = hankel.GetN2WithRespectTo(rhoLength);

            k[-n1] = 1 / rhoMin;

            for (int i = -n1 + 1; i <= n2 - n1; i++)
            {
                k[i] = k[i - 1] / rhoStep;
            }

            for (int i = -n1 - 1; i >= 0; i--)
            {
                k[i] = k[i + 1] * rhoStep;
            }

            return(k);
        }
Esempio n. 2
0
        public ScalarPlansCreater(LateralDimensions lateral, HankelCoefficients hankel, int numberOfHankels)
        {
            _lateral = lateral;
            _hankel  = hankel;

            _numberOfHankels = Math.Abs(numberOfHankels);
        }
Esempio n. 3
0
        public void AddNewLog10PlanItem(HankelCoefficients hankelCoefficients, double[] rho)
        {
            if (hankelCoefficients == null)
            {
                throw new ArgumentNullException(nameof(hankelCoefficients));
            }
            if (rho == null)
            {
                throw new ArgumentNullException(nameof(rho));
            }

            var lambdas = CalculateLambdasForLog10(hankelCoefficients, rho);

            _items.Add(new ScalarPlanItem(this, hankelCoefficients, rho, lambdas));
        }
        public AtoAGreenTensorCalculatorComponent(ForwardSolver solver) : base(solver)
        {
            if (Solver.Engine == ForwardSolverEngine.Giem2g)
            {
                if (!Solver.IsParallel)
                {
                    throw new NotImplementedException("GIEM2G works only in parallel mode!");
                }
                _plan            = null;
                _scalarCalc      = null;
                _tensorCalc      = null;
                _mirroringX      = false;
                _realCalcNxStart = -1;
                _totalNxLength   = -1;
                _calcNxLength    = -1;
                return;
            }

            _plan = new ScalarPlansCreater(Model.LateralDimensions, HankelCoefficients.LoadN40(), Solver.Settings.NumberOfHankels)
                    .CreateForAnomalyToAnomaly();

            _scalarCalc = GreenScalarCalculator.NewAtoACalculator(Logger, Model);
            _tensorCalc = new AtoAGreenTensorCalculator(Logger, Model, MemoryProvider);

            if (Solver.IsParallel)
            {
                var localNxStart = Mpi.CalcLocalNxStart(Model.LateralDimensions);
                _totalNxLength = Mpi.CalcLocalNxLength(Model.LateralDimensions);

                _mirroringX      = localNxStart >= Model.Nx;
                _realCalcNxStart = _mirroringX ? 2 * Model.Nx - localNxStart - _totalNxLength + 1 : localNxStart;

                _calcNxLength = _totalNxLength;
                if (_realCalcNxStart + _totalNxLength == Model.Nx + 1)
                {
                    _calcNxLength--;
                }
            }
            else
            {
                _mirroringX      = false;
                _realCalcNxStart = 0;
                _totalNxLength   = 2 * Model.Nx;
                _calcNxLength    = Model.Nx;
            }
        }
Esempio n. 5
0
        private static void AddLog10Plans(ScalarPlan plan, HankelCoefficients hankel, double rhoMin, double rhoMax, double rhoStep, int n)
        {
            var rho1 = CreateRhoFromMin(rhoMin, rhoMax, rhoStep);

            var r2 = rho1[rho1.Length - 1];
            var r1 = rho1[rho1.Length - 2];

            var step = (r2 - r1) / n;


            plan.AddNewLog10PlanItem(hankel, rho1);

            for (int i = 1; i < n; i++)
            {
                var rhoN = CreateRhoFromMax(rhoMin, r2 - i * step, rhoStep);
                plan.AddNewLog10PlanItem(hankel, rhoN);
            }
        }
Esempio n. 6
0
        public ScalarPlanItem(ScalarPlan parent, HankelCoefficients hankelCoefficients, double[] rho, double[] lambdas)
        {
            if (parent == null)
            {
                throw new ArgumentNullException(nameof(parent));
            }
            if (hankelCoefficients == null)
            {
                throw new ArgumentNullException(nameof(hankelCoefficients));
            }
            if (rho == null)
            {
                throw new ArgumentNullException(nameof(rho));
            }
            if (lambdas == null)
            {
                throw new ArgumentNullException(nameof(lambdas));
            }

            _parent            = parent;
            Lambdas            = lambdas;
            HankelCoefficients = hankelCoefficients;
            Rho = rho;
        }
Esempio n. 7
0
 public StoOCalculator(ForwardSolver solver) : base(solver)
 {
     _templateTensorPlan = DistibutedUtils.CreateTensorPlanAtoO(Mpi, Model, 1, 1);
     _gtc          = new AtoOLevelGreenTensorCalculator(Logger, Model, MemoryProvider);
     _plansCreater = new ScalarPlansCreater(Model.LateralDimensions, HankelCoefficients.LoadN40(), Solver.Settings.NumberOfHankels);
 }