Exemplo n.º 1
0
        public AnomalyCurrentFgmresSolver(ForwardSolver solver)
        {
            if (solver == null)
            {
                throw new ArgumentNullException(nameof(solver));
            }

            _solver      = solver;
            _problemSize = Model.Anomaly.LocalSize.Nx * Model.Anomaly.LocalSize.Ny * Model.Nz * 3;

            var settings = _solver.Settings;

            var fgmresParams = new GmresParams(_problemSize, settings.OuterBufferLength)
            {
                Tolerance         = settings.Residual,
                MaxRepeatNumber   = settings.MaxRepeatsNumber,
                ResidualAtRestart = ResidualAtRestart.ComputeTheTrue,
                InitialGuess      = InitialGuess.UserSupplied,
                GramSchmidtType   = GramSchmidtType.IterativeClassical,
            };

            _fgmres = new FlexibleGmresWithGmresPreconditioner(_solver.Logger, _solver.MemoryProvider,
                                                               fgmresParams, settings.InnerBufferLength);

            _fgmres.MatrixVectorMultRequest += _solver_MatrixVectorMultRequest;
            _fgmres.DotProductRequest       += _solver_DotProductRequest;
            _fgmres.IterationComplete       += solver_IterationComplete;
        }
Exemplo n.º 2
0
        static void PrepareBkgAndAnomaly(ForwardSolver solver, ref giem2g_background bkg, ref giem2g_anomaly anomaly)
        {
            int nz = solver.Model.Nz;
            int nx = solver.Model.Nx;
            int ny = solver.Model.Ny;

            var model   = solver.Model;
            var section = model.Section1D;



            var n     = section.NumberOfLayers;
            int first = 0;

            if (model.GetLayerDepth(0) < 0)
            {
                n     = n - 1;
                first = 1;
            }

            bkg.nl = n - 1;
            var thick = solver.MemoryProvider.AllocateDouble(bkg.nl - 1);
            var csigb = solver.MemoryProvider.AllocateComplex(bkg.nl + 1);

            for (int i = 0; i < bkg.nl - 1; i++)
            {
                thick [i] = (double)section [i + 1 + first].Thickness;
            }
            for (int i = 0; i < bkg.nl + 1; i++)
            {
                csigb [i] = section [i + first].Zeta;
            }

            bkg.thickness = new IntPtr(thick);
            bkg.csigb     = new IntPtr(csigb);
            var z  = solver.MemoryProvider.AllocateDouble(nz + 1);
            var dz = solver.MemoryProvider.AllocateDouble(nz);

            for (int i = 0; i < nz; i++)
            {
                z [i]  = (double)model.Anomaly.Layers [i].Depth;
                dz [i] = (double)model.Anomaly.Layers [i].Thickness;
            }
            z [nz] = z [nz - 1] + dz [nz - 1];



            anomaly.nz = nz;
            // ATTENTION ! formal transpose in horizontal dimensions!!
            anomaly.nx = ny;
            anomaly.ny = nx;
            anomaly.z  = new IntPtr(z);
            anomaly.dz = new IntPtr(dz);
            anomaly.dx = (double)model.LateralDimensions.CellSizeX;
            anomaly.dy = (double)model.LateralDimensions.CellSizeY;
        }
Exemplo n.º 3
0
        //	public static ForwardSolver current_solver;

        public static GreenTensor CalcAtoATensor(ForwardSolver solver, GreenTensor gt)
        {
            var giem2g_ie_op = new giem2g_data();
            var bkg          = new giem2g_background();
            var anomaly      = new giem2g_anomaly();

            GreenTensor gt_new;

            //	current_solver = solver;


            PrepareBkgAndAnomaly(solver, ref bkg, ref anomaly);



            //giem2g_set_logger(GIEM2G_LOGGER);

            IntPtr ie_op_ptr;

            if (gt == null || !gt.Has("giem2g"))
            {
                gt_new    = PrepareGIEM2GTensor(solver, ref giem2g_ie_op, anomaly);
                ie_op_ptr = giem2g_ie_op.giem2g_tensor;
            }
            else
            {
                ie_op_ptr = new IntPtr(gt ["giem2g"].Ptr);
                gt_new    = gt;
            }



            var omega = solver.Model.Omega;

            giem2g_calc_ie_kernel(ie_op_ptr, bkg, anomaly, omega);

            solver.MemoryProvider.Release((void *)bkg.csigb);
            solver.MemoryProvider.Release((void *)bkg.thickness);
            solver.MemoryProvider.Release((void *)anomaly.z);
            solver.MemoryProvider.Release((void *)anomaly.dz);



            return(gt_new);
        }
Exemplo n.º 4
0
        static GreenTensor PrepareGIEM2GTensor(ForwardSolver solver, ref giem2g_data giem2g_ie_op, giem2g_anomaly anomaly)
        {
            int nz = solver.Model.Nz;
            int nx = solver.Model.Nx;
            int ny = solver.Model.Ny;

            giem2g_ie_op.comm = solver.Mpi.CommunicatorC2Fortran();
            giem2g_calc_data_sizes(anomaly, ref giem2g_ie_op);



            var buff = FftBuffersPool.GetBuffer(solver.Model);

            if (buff.Plan3Nz.BufferLength >= giem2g_ie_op.fft_buffers_length)
            {
                giem2g_ie_op.fft_buffer_in  = buff.Plan3Nz.Buffer1Ptr;
                giem2g_ie_op.fft_buffer_out = buff.Plan3Nz.Buffer2Ptr;
            }
            else
            {
                var len = giem2g_ie_op.fft_buffers_length;
                giem2g_ie_op.fft_buffer_in  = solver.MemoryProvider.AllocateComplex(len);
                giem2g_ie_op.fft_buffer_out = solver.MemoryProvider.AllocateComplex(len);
                solver.Logger.WriteError("Allocate additional memory for FFT inside GIEM2G!!");
            }
            var giem2g_ptrs = AllocateGiem2gDataBuffers(solver.MemoryProvider, ref giem2g_ie_op, nz);


            giem2g_prepare_ie_kernel(anomaly, giem2g_ie_op);



            var gt = GreenTensor.CreateGiem2gTensor(solver.MemoryProvider, nx, ny, nz, nz, giem2g_ptrs);

            return(gt);
        }
 public override void Init()
 {
     Evaluator   = new ForwardEvaluator(nodeFactory);
     Solver      = new ForwardSolver(nodeFactory, this);
     WorkerState = Solver.Init(Command);
 }
 public override void Init()
 {
     Evaluator = new ForwardEvaluator();
     Solver = new ForwardSolver()
     {
         Worker = this
     };
     WorkerCommandResult = Solver.Init(Command);
 }