Ejemplo n.º 1
0
        private GreenTensor CalculateGreenTensorAtoOSiteElectric(ObservationSite site)
        {
            var plan             = _plansCreater.CreateForAnomalyToObservationSites(site);
            var transceiver      = TranceiverUtils.CreateAnomalyToObservation(Model.Anomaly, site);
            var scalarCalculator = GreenScalarCalculator.NewAtoOElectricCalculator(Logger, Model);
            var scalars          = scalarCalculator.Calculate(plan, transceiver);

            var calc     = new AtoOSiteGreenTensorCalculator(Logger, Model, MemoryProvider);
            var segments = ScalarSegments.AllocateAndConvert(MemoryProvider, plan, scalars);

            var gt = calc.CalculateAtoOElectric(segments, site, MemoryLayoutOrder.AlongLateral);

            segments.Dispose();

            return(gt);
        }
Ejemplo n.º 2
0
        private GreenTensor CalculateGreenTensorElectric(SourceLayer layer, ObservationLevel level)
        {
            var plan             = _plansCreater.CreateForSourceToObservation(layer, level);
            var transceiver      = TranceiverUtils.CreateSourceToObservations(SourceThickness, layer, level);
            var scalarCalculator = GreenScalarCalculator.NewAtoOElectricCalculator(Logger, Model);
            var scalars          = scalarCalculator.Calculate(plan, transceiver);

            using (var segments = ScalarSegments.AllocateAndConvert(MemoryProvider, plan, scalars))
            {
                var tensorPlan = new TensorPlan(_templateTensorPlan, layer, level);
                _gtc.ResetKnots();
                var gt = _gtc.CalculateAtoOElectric(segments, MemoryLayoutOrder.AlongVertical, tensorPlan);

                PerformGreenTensorFft(gt);
                return(gt);
            }
        }
        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;
            }
        }
Ejemplo n.º 4
0
        private unsafe GreenTensor CalculateGreenTensorAtoOLevelElectric(ObservationLevel level)
        {
            using (Solver.Profiler?.StartAuto(ProfilerEvent.AtoOGreenCalc))
            {
                var plan             = _plansCreater.CreateForAnomalyToObservationLevels(level);
                var transceiver      = TranceiverUtils.CreateAnomalyToObservation(Model.Anomaly, level);
                var scalarCalculator = GreenScalarCalculator.NewAtoOElectricCalculator(Logger, Model);
                var scalars          = scalarCalculator.Calculate(plan, transceiver);

                using (var segments = ScalarSegments.AllocateAndConvert(MemoryProvider, plan, scalars))
                {
                    var tensorPlan = new TensorPlan(_templateTensorPlan, level);
                    _gtc.ResetKnots();
                    var gt = _gtc.CalculateAtoOElectric(segments, MemoryLayoutOrder.AlongVertical, tensorPlan);

                    PerformGreenTensorFft(gt);
                    return(gt);
                }
            }
        }