public void Run(CartesianModel model) { FftBuffersPool.PrepareBuffersForModel(model, _memoryProvider, _mpi, _profiler); LogSettingsInfo(); _solver.SetProfiler(_profiler); _solver .WithMpi(_mpi) .With(_project.ObservationLevels); int freqCounter = 0; foreach (var frequency in _project.Frequencies) { ForwardLoggerHelper.WriteStatus(_logger, $"\t\t\tFrequecy {frequency}, {++freqCounter} of {_project.Frequencies.Count}"); var omegaModel = OmegaModelBuilder.BuildOmegaModel(model, frequency); _profiler.ClearAllRecords(); using (var rc = _solver.Solve(omegaModel)) { if (!_solver.IsParallel || _mpi.IsMaster) { ExportProfiling(model, frequency); Export(rc, frequency); } ForwardLoggerHelper.WriteStatus(_logger, "Finish"); ParallelMemoryUtils.ExportMemoryUsage(_project.ResultsPath, _mpi, _memoryProvider, frequency); } } }
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); }