private static IFftBufferPlan CreatePlan3D(CustomDistributedFft fft, Mpi mpi, Complex *input, Complex *output, int nx, int ny, int nz) { var localSize = CustomDistributedFft.GetLocalSize(mpi, nx, ny, nz); var plan = fft.CreatePlan3D(input, output, mpi, nx, ny, nz); return(new CustomBuffer(input, output, localSize, plan)); }
public void AllocateBuffersAndCreatePlansParallel(int nx, int ny, int nz, Mpi mpi) { CustomFft = new CustomDistributedFft(mpi, _profiler); IsParallel = true; var localSize3Nz = CustomDistributedFft.GetLocalSize(mpi, nx * 2, ny * 2, 3 * nz); var ranks = Enumerable.Range(0, mpi.Size / 2).ToArray(); RealModelPart = mpi.Merge(ranks); _inputBuffer = _memoryProvider.AllocateComplex(localSize3Nz); _outputBuffer = _memoryProvider.AllocateComplex(localSize3Nz); Plan3Nz = CreatePlan2D(CustomFft, mpi, _inputBuffer, _outputBuffer, nx * 2, ny * 2, 3 * nz); Plan1Nz = CreatePlan2D(CustomFft, mpi, _inputBuffer, _outputBuffer, nx * 2, ny * 2, 1 * nz); Plan3 = CreatePlan2D(CustomFft, mpi, _inputBuffer, _outputBuffer, nx * 2, ny * 2, 3); Plan1 = CreatePlan2D(CustomFft, mpi, _inputBuffer, _outputBuffer, nx * 2, ny * 2, 1); }