decomp_2decompfft.f90 Source File


This file depends on

sourcefile~~decomp_2decompfft.f90~~EfferentGraph sourcefile~decomp_2decompfft.f90 decomp_2decompfft.f90 sourcefile~logger.f90 logger.f90 sourcefile~decomp_2decompfft.f90->sourcefile~logger.f90 sourcefile~mesh_content.f90 mesh_content.f90 sourcefile~decomp_2decompfft.f90->sourcefile~mesh_content.f90 sourcefile~mesh_content.f90->sourcefile~logger.f90 sourcefile~common.f90~2 common.f90 sourcefile~mesh_content.f90->sourcefile~common.f90~2 sourcefile~common.f90~2->sourcefile~logger.f90

Files dependent on this one

sourcefile~~decomp_2decompfft.f90~~AfferentGraph sourcefile~decomp_2decompfft.f90 decomp_2decompfft.f90 sourcefile~mesh.f90 mesh.f90 sourcefile~mesh.f90->sourcefile~decomp_2decompfft.f90 sourcefile~abl.f90 abl.f90 sourcefile~abl.f90->sourcefile~mesh.f90 sourcefile~backend.f90~3 backend.f90 sourcefile~abl.f90->sourcefile~backend.f90~3 sourcefile~les.f90 les.f90 sourcefile~abl.f90->sourcefile~les.f90 sourcefile~abl.f90~2 abl.f90 sourcefile~abl.f90~2->sourcefile~mesh.f90 sourcefile~abl.f90~2->sourcefile~abl.f90 sourcefile~abl.f90~2->sourcefile~backend.f90~3 sourcefile~base_case.f90 base_case.f90 sourcefile~abl.f90~2->sourcefile~base_case.f90 sourcefile~diagnostics.f90 diagnostics.f90 sourcefile~abl.f90~2->sourcefile~diagnostics.f90 sourcefile~adm.f90 adm.f90 sourcefile~adm.f90->sourcefile~mesh.f90 sourcefile~adm.f90->sourcefile~backend.f90~3 sourcefile~turbine_model.f90 turbine_model.f90 sourcefile~adm.f90->sourcefile~turbine_model.f90 sourcefile~io_session.f90 io_session.f90 sourcefile~adm.f90->sourcefile~io_session.f90 sourcefile~allocator.f90 allocator.f90 sourcefile~allocator.f90->sourcefile~mesh.f90 sourcefile~allocator.f90~3 allocator.f90 sourcefile~allocator.f90~3->sourcefile~mesh.f90 sourcefile~backend.f90 backend.f90 sourcefile~backend.f90->sourcefile~mesh.f90 sourcefile~backend.f90->sourcefile~backend.f90~3 sourcefile~poisson_fft.f90 poisson_fft.f90 sourcefile~backend.f90->sourcefile~poisson_fft.f90 sourcefile~backend.f90~2 backend.f90 sourcefile~backend.f90~2->sourcefile~mesh.f90 sourcefile~backend.f90~2->sourcefile~backend.f90~3 sourcefile~backend.f90~3->sourcefile~mesh.f90 sourcefile~poisson_fft.f90~3 poisson_fft.f90 sourcefile~backend.f90~3->sourcefile~poisson_fft.f90~3 sourcefile~backend.f90~4 backend.f90 sourcefile~backend.f90~4->sourcefile~mesh.f90 sourcefile~backend.f90~4->sourcefile~allocator.f90 sourcefile~backend.f90~4->sourcefile~backend.f90~3 sourcefile~poisson_fft.f90~2 poisson_fft.f90 sourcefile~backend.f90~4->sourcefile~poisson_fft.f90~2 sourcefile~base_case.f90->sourcefile~mesh.f90 sourcefile~base_case.f90->sourcefile~backend.f90~3 sourcefile~solver.f90 solver.f90 sourcefile~base_case.f90->sourcefile~solver.f90 sourcefile~io_manager.f90 io_manager.f90 sourcefile~base_case.f90->sourcefile~io_manager.f90 sourcefile~monitoring.f90 monitoring.f90 sourcefile~base_case.f90->sourcefile~monitoring.f90 sourcefile~postprocess.f90 postprocess.f90 sourcefile~base_case.f90->sourcefile~postprocess.f90 sourcefile~channel.f90 channel.f90 sourcefile~channel.f90->sourcefile~mesh.f90 sourcefile~channel.f90->sourcefile~backend.f90~3 sourcefile~channel.f90->sourcefile~base_case.f90 sourcefile~channel.f90->sourcefile~solver.f90 sourcefile~cylinder.f90 cylinder.f90 sourcefile~cylinder.f90->sourcefile~mesh.f90 sourcefile~cylinder.f90->sourcefile~backend.f90~3 sourcefile~cylinder.f90->sourcefile~base_case.f90 sourcefile~cylinder.f90->sourcefile~solver.f90 sourcefile~diagnostics.f90->sourcefile~mesh.f90 sourcefile~diagnostics.f90->sourcefile~backend.f90~3 sourcefile~diagnostics.f90->sourcefile~les.f90 sourcefile~generic.f90 generic.f90 sourcefile~generic.f90->sourcefile~mesh.f90 sourcefile~generic.f90->sourcefile~backend.f90~3 sourcefile~generic.f90->sourcefile~base_case.f90 sourcefile~generic.f90->sourcefile~solver.f90 sourcefile~ibm.f90 ibm.f90 sourcefile~ibm.f90->sourcefile~mesh.f90 sourcefile~ibm.f90->sourcefile~backend.f90~3 sourcefile~ibm.f90->sourcefile~io_session.f90 sourcefile~les.f90->sourcefile~mesh.f90 sourcefile~les.f90->sourcefile~backend.f90~3 sourcefile~poisson_fft.f90->sourcefile~mesh.f90 sourcefile~poisson_fft.f90->sourcefile~poisson_fft.f90~3 sourcefile~poisson_fft.f90~2->sourcefile~mesh.f90 sourcefile~poisson_fft.f90~2->sourcefile~allocator.f90 sourcefile~poisson_fft.f90~2->sourcefile~poisson_fft.f90~3 sourcefile~poisson_fft.f90~3->sourcefile~mesh.f90 sourcefile~poisson_solver.f90 poisson_solver.f90 sourcefile~poisson_solver.f90->sourcefile~mesh.f90 sourcefile~poisson_solver.f90->sourcefile~backend.f90~3 sourcefile~setup.f90 setup.f90 sourcefile~poisson_solver.f90->sourcefile~setup.f90 sourcefile~tdsops_setup.f90 tdsops_setup.f90 sourcefile~poisson_solver.f90->sourcefile~tdsops_setup.f90 sourcefile~setup.f90->sourcefile~mesh.f90 sourcefile~setup.f90->sourcefile~allocator.f90 sourcefile~setup.f90->sourcefile~allocator.f90~3 sourcefile~setup.f90->sourcefile~backend.f90 sourcefile~setup.f90->sourcefile~backend.f90~2 sourcefile~setup.f90->sourcefile~backend.f90~3 sourcefile~setup.f90->sourcefile~backend.f90~4 sourcefile~solver.f90->sourcefile~mesh.f90 sourcefile~solver.f90->sourcefile~backend.f90~3 sourcefile~solver.f90->sourcefile~ibm.f90 sourcefile~solver.f90->sourcefile~les.f90 sourcefile~solver.f90->sourcefile~tdsops_setup.f90 sourcefile~time_integrator.f90 time_integrator.f90 sourcefile~solver.f90->sourcefile~time_integrator.f90 sourcefile~vector_calculus.f90 vector_calculus.f90 sourcefile~solver.f90->sourcefile~vector_calculus.f90 sourcefile~tdsops_setup.f90->sourcefile~mesh.f90 sourcefile~tdsops_setup.f90->sourcefile~backend.f90~3 sourcefile~tgv.f90 tgv.f90 sourcefile~tgv.f90->sourcefile~mesh.f90 sourcefile~tgv.f90->sourcefile~backend.f90~3 sourcefile~tgv.f90->sourcefile~base_case.f90 sourcefile~tgv.f90->sourcefile~solver.f90 sourcefile~turbine_dummy.f90 turbine_dummy.f90 sourcefile~turbine_dummy.f90->sourcefile~mesh.f90 sourcefile~turbine_dummy.f90->sourcefile~backend.f90~3 sourcefile~turbine_dummy.f90->sourcefile~turbine_model.f90 sourcefile~turbine_dummy.f90->sourcefile~io_session.f90 sourcefile~turbine_model.f90->sourcefile~mesh.f90 sourcefile~turbine_model.f90->sourcefile~backend.f90~3 sourcefile~checkpoint_state.f90 checkpoint_state.f90 sourcefile~turbine_model.f90->sourcefile~checkpoint_state.f90 sourcefile~wind_turbine.f90 wind_turbine.f90 sourcefile~wind_turbine.f90->sourcefile~mesh.f90 sourcefile~wind_turbine.f90->sourcefile~adm.f90 sourcefile~wind_turbine.f90->sourcefile~backend.f90~3 sourcefile~wind_turbine.f90->sourcefile~base_case.f90 sourcefile~wind_turbine.f90->sourcefile~solver.f90 sourcefile~wind_turbine.f90->sourcefile~turbine_dummy.f90 sourcefile~wind_turbine.f90->sourcefile~turbine_model.f90 sourcefile~xcompact.f90 xcompact.f90 sourcefile~xcompact.f90->sourcefile~mesh.f90 sourcefile~xcompact.f90->sourcefile~abl.f90~2 sourcefile~xcompact.f90->sourcefile~base_case.f90 sourcefile~xcompact.f90->sourcefile~channel.f90 sourcefile~xcompact.f90->sourcefile~cylinder.f90 sourcefile~xcompact.f90->sourcefile~generic.f90 sourcefile~xcompact.f90->sourcefile~setup.f90 sourcefile~xcompact.f90->sourcefile~tgv.f90 sourcefile~xcompact.f90->sourcefile~wind_turbine.f90 sourcefile~checkpoint_manager.f90 checkpoint_manager.f90 sourcefile~checkpoint_manager.f90->sourcefile~solver.f90 sourcefile~io.f90 io.f90 sourcefile~checkpoint_manager.f90->sourcefile~io.f90 sourcefile~io_field_utils.f90 io_field_utils.f90 sourcefile~checkpoint_manager.f90->sourcefile~io_field_utils.f90 sourcefile~checkpoint_manager.f90->sourcefile~io_session.f90 sourcefile~stats.f90 stats.f90 sourcefile~checkpoint_manager.f90->sourcefile~stats.f90 sourcefile~checkpoint_manager.f90->sourcefile~checkpoint_state.f90 sourcefile~io.f90->sourcefile~backend.f90~3 sourcefile~io_base.f90 io_base.f90 sourcefile~io.f90->sourcefile~io_base.f90 sourcefile~io.f90~2 io.f90 sourcefile~io.f90~2->sourcefile~backend.f90~3 sourcefile~io.f90~2->sourcefile~io_base.f90 sourcefile~io_base.f90->sourcefile~backend.f90~3 sourcefile~io_field_utils.f90->sourcefile~solver.f90 sourcefile~io_field_utils.f90->sourcefile~io_base.f90 sourcefile~io_manager.f90->sourcefile~solver.f90 sourcefile~io_manager.f90->sourcefile~checkpoint_manager.f90 sourcefile~snapshot_manager.f90 snapshot_manager.f90 sourcefile~io_manager.f90->sourcefile~snapshot_manager.f90 sourcefile~io_manager.f90->sourcefile~stats.f90 sourcefile~io_manager.f90->sourcefile~checkpoint_state.f90 sourcefile~io_session.f90->sourcefile~backend.f90~3 sourcefile~io_session.f90->sourcefile~io.f90 sourcefile~io_session.f90->sourcefile~io_base.f90 sourcefile~monitoring.f90->sourcefile~solver.f90 sourcefile~postprocess.f90->sourcefile~solver.f90 sourcefile~snapshot_manager.f90->sourcefile~solver.f90 sourcefile~snapshot_manager.f90->sourcefile~io.f90 sourcefile~snapshot_manager.f90->sourcefile~io_field_utils.f90 sourcefile~snapshot_manager.f90->sourcefile~io_session.f90 sourcefile~stats.f90->sourcefile~solver.f90 sourcefile~stats.f90->sourcefile~io_session.f90 sourcefile~time_integrator.f90->sourcefile~backend.f90~3 sourcefile~vector_calculus.f90->sourcefile~backend.f90~3 sourcefile~checkpoint_state.f90->sourcefile~io_session.f90

Source Code

module m_decomp
!! Parallel decomposition provided by 2decomp&FFT

  use m_mpi, only: MPI_COMM_WORLD, MPI_IN_PLACE, MPI_INTEGER, MPI_SUM, &
                   MPI_Allreduce, MPI_Cart_coords, MPI_Comm_rank
  use m_logger, only: log_info, abort_run

  implicit none

contains

  function is_avail_2decomp() result(avail)
    logical :: avail

    avail = .true.
  end function

  subroutine decomposition_2decomp(grid, par)
    !! Performs 2D mesh decomposition using 2decomp&fft
    use m_mesh_content, only: par_t, grid_t
    use decomp_2d, only: decomp_2d_init, DECOMP_2D_COMM_CART_X, xsize, xstart
    use decomp_2d_mpi, only: nrank, nproc

    class(grid_t), intent(inout) :: grid
    class(par_t), intent(inout) :: par
    integer :: p_col, p_row
    integer, allocatable, dimension(:, :, :) :: global_ranks
    integer, allocatable, dimension(:) :: global_ranks_lin
    logical, dimension(3) :: periodic_bc
    integer :: nx, ny, nz
    integer :: ierr
    integer :: cart_rank
    integer, dimension(2) :: coords

    call log_info("Domain decomposition by 2decomp&fft")
    nrank = par%nrank
    nproc = par%nproc

    nx = grid%global_vert_dims(1)
    ny = grid%global_vert_dims(2)
    nz = grid%global_vert_dims(3)

    p_row = par%nproc_dir(2)
    p_col = par%nproc_dir(3)
    if (p_row*p_col /= par%nproc) then
      call abort_run("Decomposition in X not supported by 2decomp&fft &
                     &backend", collective=.true.)
    end if
    periodic_bc(:) = grid%periodic_BC(:)
    call decomp_2d_init(nx, ny, nz, p_row, p_col, periodic_bc)

    ! Get global_ranks
    allocate (global_ranks(1, p_row, p_col))
    allocate (global_ranks_lin(p_row*p_col))
    global_ranks_lin(:) = 0

    call MPI_Comm_rank(DECOMP_2D_COMM_CART_X, cart_rank, ierr)
    call MPI_Cart_coords(DECOMP_2D_COMM_CART_X, cart_rank, 2, coords, ierr)

    global_ranks_lin(coords(1) + 1 + p_row*(coords(2))) = par%nrank

    call MPI_Allreduce(MPI_IN_PLACE, global_ranks_lin, p_row*p_col, &
                       MPI_INTEGER, MPI_SUM, MPI_COMM_WORLD, ierr)

    global_ranks = reshape(global_ranks_lin, shape=[1, p_row, p_col])

    ! Get local domain size and offset from 2decomp
    grid%vert_dims(:) = xsize(:)
    par%n_offset(:) = xstart(:) - 1

    call par%compute_rank_pos_from_global(global_ranks)
    call grid%copy_vert2cell_dims(par)

  end subroutine decomposition_2decomp

end module