コード例 #1
0
        private ScalarSegments CalculateParallelScalars(ScalarPlan plan, Transceiver[] transceivers)
        {
            var pm = new ParallelManager <Transceiver>(Mpi).WithTasks(transceivers);

            GreenScalars   gs            = null;
            ScalarSegments localSegments = null;

            pm.Run(tasks =>
            {
                using (Profiler?.StartAuto(ProfilerEvent.GreenScalarAtoACalc))
                {
                    gs = _scalarCalc.Calculate(plan, tasks, Profiler);
                }

                using (Profiler?.StartAuto(ProfilerEvent.GreenScalarAtoASegments))
                {
                    localSegments = ScalarSegments.AllocateAndConvert(MemoryProvider, plan, gs);
                }
            });

            using (Profiler?.StartAuto(ProfilerEvent.GreenScalarAtoACommunicate))
            {
                var allSegments1 = ScalarSegments.AllocateScalarSegments(MemoryProvider, plan, gs, transceivers.Length);
                var allSegments2 = ScalarSegments.AllocateScalarSegments(MemoryProvider, plan, gs, transceivers.Length);

                DistributeSegments(plan, pm, gs, localSegments, allSegments1, allSegments2);
                localSegments.Dispose();

                allSegments1.Dispose();
                return(allSegments2);
            }
        }
コード例 #2
0
        public GreenTensor CalculateSymmAtoA(ScalarSegments segments, MemoryLayoutOrder layoutOrder, bool mirrorPart)
        {
            if (segments == null)
            {
                throw new ArgumentNullException(nameof(segments));
            }
            _mirrorPart = mirrorPart;
            SetSegments(segments);
            _symmGreenTensor = AllocateNewSymm("xx", "yy", "zz", "xy");
            SetGreenTensorAndRadii(_symmGreenTensor, segments.Radii);

            if (_calcLength != 0)
            {
                if (!KnotsAreReady)
                {
                    PrepareKnotsAtoA(segments.Radii, _nxStart, _calcLength);
                }

                PrepareValuesForSymmAtoA(layoutOrder);


                RunAlongXElectric(_nxStart, _calcLength);
                RunAlongYElectric(_nxStart, _calcLength);
            }

            return(_symmGreenTensor);
        }
コード例 #3
0
        public GreenTensor CalculateAtoOMagnetic(ScalarSegments segments, MemoryLayoutOrder layoutOrder, TensorPlan plan)
        {
            if (segments == null)
            {
                throw new ArgumentNullException(nameof(segments));
            }
            _plan = plan;
            _useLocalTransofrmForI = _plan.NxTotalLength == 2 * Model.Nx;

            var greenTensor = AllocateNew("xx", "yx", "xy", "xz", "yz", "zx", "zy");

            SetSegments(segments);
            SetGreenTensorAndRadii(greenTensor, segments.Radii);

            if (_plan.NxCalcLength != 0)
            {
                PrepareValuesForAtoOMagneticLevel(layoutOrder);
                PrepareKnotsAtoO(segments.Radii, _plan.NxStart, _plan.NxCalcLength);

                RunAlongXMagnetic(_plan.NxStart, _plan.NxCalcLength);
                RunAlongYMagnetic(_plan.NxStart, _plan.NxCalcLength);
            }

            return(greenTensor);
        }
コード例 #4
0
        private ScalarSegments CalculateLocalScalars(ScalarPlan plan, Transceiver[] transceivers)
        {
            GreenScalars gs;

            using (Profiler?.StartAuto(ProfilerEvent.GreenScalarAtoACalc))
            {
                gs = _scalarCalc.Calculate(plan, transceivers, Profiler);
            }

            using (Profiler?.StartAuto(ProfilerEvent.GreenScalarAtoASegments))
            {
                var segments = ScalarSegments.AllocateAndConvert(MemoryProvider, plan, gs);
                return(segments);
            }
        }
コード例 #5
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);
        }
コード例 #6
0
ファイル: StoOCalculator.cs プロジェクト: prisae/extreme
        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);
            }
        }
コード例 #7
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);
                }
            }
        }
コード例 #8
0
        public GreenTensor CalculateAtoOMagnetic(ScalarSegments segments, ObservationSite site, MemoryLayoutOrder layoutOrder)
        {
            if (segments == null)
            {
                throw new ArgumentNullException(nameof(segments));
            }

            var greenTensor = AllocateNew("xx", "yx", "xy", "xz", "yz", "zx", "zy");

            SetSegments(segments);
            SetGreenTensorAndRadii(greenTensor, segments.Radii);

            PrepareValuesForAtoOMagneticSite(layoutOrder);
            PrepareKnotsAtoO(segments.Radii, site);

            RunAlongXMagnetic(site);
            RunAlongYMagnetic(site);

            return(greenTensor);
        }
コード例 #9
0
 protected void SetSegments(ScalarSegments segments)
 {
     _segments = segments;
 }
コード例 #10
0
        private void DistributeSegments(ScalarPlan plan, ParallelManager <Transceiver> pm, GreenScalars gs, ScalarSegments local, ScalarSegments all, ScalarSegments result)
        {
            var starts     = pm.GetAllStartIndecies();
            var lengths    = pm.GetAllLength();
            var fullStarts = new int[lengths.Length];
            var fullLength = new int[lengths.Length];

            var localLength = gs.SingleScalars.Length;

            int nComp = gs.GetNumberOfAvailableIs(plan);
            int nRho  = local.Radii.Length - 1;

            var localSize = localLength * nComp * 2 * nRho;

            for (int i = 0; i < starts.Length; i++)
            {
                fullStarts[i] = starts[i] * nComp * 2 * nRho;
                fullLength[i] = lengths[i] * nComp * 2 * nRho;
            }

            Mpi.AllGatherV(local.Ptr, localSize, all.Ptr, fullLength, fullStarts);

            using (Profiler?.StartAuto(ProfilerEvent.GreenScalarAtoATrans))
            {
                for (int i = 0; i < starts.Length; i++)
                {
                    int start  = starts[i];
                    int length = lengths[i];

                    var tmp = ScalarSegments.ReUseScalarSegments(all.Ptr + fullStarts[i], plan, gs, length);

                    for (int j = 0; j < result.SingleSegment.Length; j++)
                    {
                        var src = tmp.SingleSegment[j];
                        var dst = result.SingleSegment[j];

                        if (src.I1A != null)
                        {
                            for (int k = 0; k < length; k++)
                            {
                                dst.I1A[k + start] = src.I1A[k];
                            }
                        }
                        if (src.I2A != null)
                        {
                            for (int k = 0; k < length; k++)
                            {
                                dst.I2A[k + start] = src.I2A[k];
                            }
                        }
                        if (src.I3A != null)
                        {
                            for (int k = 0; k < length; k++)
                            {
                                dst.I3A[k + start] = src.I3A[k];
                            }
                        }
                        if (src.I4A != null)
                        {
                            for (int k = 0; k < length; k++)
                            {
                                dst.I4A[k + start] = src.I4A[k];
                            }
                        }
                        if (src.I5A != null)
                        {
                            for (int k = 0; k < length; k++)
                            {
                                dst.I5A[k + start] = src.I5A[k];
                            }
                        }

                        if (src.I1B != null)
                        {
                            for (int k = 0; k < length; k++)
                            {
                                dst.I1B[k + start] = src.I1B[k];
                            }
                        }
                        if (src.I2B != null)
                        {
                            for (int k = 0; k < length; k++)
                            {
                                dst.I2B[k + start] = src.I2B[k];
                            }
                        }
                        if (src.I3B != null)
                        {
                            for (int k = 0; k < length; k++)
                            {
                                dst.I3B[k + start] = src.I3B[k];
                            }
                        }
                        if (src.I4B != null)
                        {
                            for (int k = 0; k < length; k++)
                            {
                                dst.I4B[k + start] = src.I4B[k];
                            }
                        }
                        if (src.I5B != null)
                        {
                            for (int k = 0; k < length; k++)
                            {
                                dst.I5B[k + start] = src.I5B[k];
                            }
                        }
                    }
                }
            }
        }