diff --git a/src/flib/CMakeLists.txt b/src/flib/CMakeLists.txt index 42b70edb789..d70dae8a5d5 100644 --- a/src/flib/CMakeLists.txt +++ b/src/flib/CMakeLists.txt @@ -38,6 +38,7 @@ endif () # Include flib source and binary directories (for Fortran modules) target_include_directories (piof + PUBLIC ${CMAKE_BINARY_DIR} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} PUBLIC ${CMAKE_CURRENT_BINARY_DIR}) diff --git a/src/flib/pio.F90 b/src/flib/pio.F90 index b4939e29060..75f46fc4758 100644 --- a/src/flib/pio.F90 +++ b/src/flib/pio.F90 @@ -7,6 +7,7 @@ !> !! @defgroup PIO_set_blocksize Box Rearranger Settings !! Set the box rearranger blocksize in Fortran. +#include "config.h" module pio ! Package all exposed variables and functions under one roof @@ -21,6 +22,9 @@ module pio pio_freedecomp, pio_syncfile, & pio_finalize, pio_set_hint, pio_getnumiotasks, pio_file_is_open, & PIO_deletefile, PIO_get_numiotasks, PIO_iotype_available, & +!#ifdef NETCDF_INTEGRATION +! nf_init_intracom, & +!#endif pio_set_rearr_opts use pio_types, only : io_desc_t, file_desc_t, var_desc_t, iosystem_desc_t, & diff --git a/src/flib/piolib_mod.F90 b/src/flib/piolib_mod.F90 index 11319bb603c..0cd6292054c 100644 --- a/src/flib/piolib_mod.F90 +++ b/src/flib/piolib_mod.F90 @@ -97,6 +97,9 @@ module piolib_mod PIO_deletefile, & PIO_get_numiotasks, & PIO_iotype_available, & +#ifdef NETCDF_INTEGRATION + nf_init_intracom, & +#endif PIO_set_rearr_opts !----------------------------------------------------------------------- @@ -133,6 +136,12 @@ module piolib_mod module procedure setframe end interface PIO_setframe +#ifdef NETCDF_INTEGRATION + interface nf_init_intracom + module procedure nf_init_intracom + end interface nf_init_intracom +#endif + !> !! Increment the record number for a future read/write of distributed !! arrays (see @ref PIO_write_darray, @ref PIO_read_darray). @@ -971,6 +980,59 @@ end function PIOc_Init_Intracomm_from_F90 #endif end subroutine init_intracom +#ifdef NETCDF_INTEGRATION + !> + !! @public + !! @ingroup PIO_init + !! Initialize the pio subsystem. This is a collective call. Input + !! parameters are read on comp_rank=0 values on other tasks are + !! ignored. This variation of PIO_init locates the IO tasks on a + !! subset of the compute tasks. + !! + !! @param comp_rank mpi rank of each participating task, + !! @param comp_comm the mpi communicator which defines the + !! collective. + !! @param num_iotasks the number of iotasks to define. + !! @param num_aggregator the mpi aggregator count + !! @param stride the stride in the mpi rank between io tasks. + !! @param rearr @copydoc PIO_rearr_method + !! @param iosystem a derived type which can be used in subsequent + !! pio operations (defined in PIO_types). + !! @param base @em optional argument can be used to offset the first + !! io task - default base is task 1. + !! @param rearr_opts the rearranger options. + !! @author Jim Edwards + !< + subroutine nf_init_intracom(comp_rank, comp_comm, num_iotasks, num_aggregator, stride, rearr, iosystem,base, rearr_opts) + use pio_types, only : pio_internal_error, pio_rearr_opt_t + use iso_c_binding + + integer(i4), intent(in) :: comp_rank + integer(i4), intent(in) :: comp_comm + integer(i4), intent(in) :: num_iotasks + integer(i4), intent(in) :: num_aggregator + integer(i4), intent(in) :: stride + integer(i4), intent(in) :: rearr + type (iosystem_desc_t), intent(out) :: iosystem ! io descriptor to initalize + integer(i4), intent(in),optional :: base + type (pio_rearr_opt_t), intent(in), optional :: rearr_opts + integer :: ierr + + interface + integer(C_INT) function nc_set_iosystem(iosystemid) & + bind(C,name="nc_set_iosystem") + use iso_c_binding + integer(C_INT), intent(in), value :: iosystemid + end function nc_set_iosystem + end interface + + call init_intracom(comp_rank, comp_comm, num_iotasks, num_aggregator, stride, rearr, iosystem,base, rearr_opts) + + ierr = nc_set_iosystem(iosystem%iosysid) + + end subroutine nf_init_intracom +#endif + !! @public !! @ingroup PIO_init !! Initialize the pio subsystem. This is a collective call. Input