Ignore:
Timestamp:
Jul 22, 2019 8:51:35 AM (2 years ago)
Author:
gronemeier
Message:

changes in data-output module (data_output_module.f90, data_output_binary_module.f90, data_output_netcdf4_module.f90, binary_to_netcdf.f90):

  • add support for different output groups of MPI ranks (required for, e.g., nesting runs)
  • revise output messages
File:
1 edited

Legend:

Unmodified
Added
Removed
  • palm/trunk/SOURCE/data_output_netcdf4_module.f90

    r4106 r4107  
    5656
    5757   CHARACTER(LEN=800) ::  internal_error_message = ''  !< string containing the last error message
     58   CHARACTER(LEN=100) ::  file_suffix = ''             !< file suffix added to each file name
    5859   CHARACTER(LEN=800) ::  temp_string                  !< dummy string
    5960
     
    6364   INTEGER(iwp) ::  debug_output_unit       !< Fortran Unit Number of the debug-output file
    6465   INTEGER(iwp) ::  global_id_in_file = -1  !< value of global ID within a file
     66   INTEGER      ::  master_rank             !< master rank for tasks to be executed by single PE only
     67   INTEGER      ::  output_group_comm       !< MPI communicator addressing all MPI ranks which participate in output
    6568
    6669   LOGICAL ::  print_debug_output = .FALSE.  !< if true, debug output is printed
     
    126129!> Initialize data-output module.
    127130!--------------------------------------------------------------------------------------------------!
    128 SUBROUTINE netcdf4_init_module( program_debug_output_unit, debug_output, dom_global_id )
     131SUBROUTINE netcdf4_init_module( file_suffix_of_output_group, mpi_comm_of_output_group, &
     132                                master_output_rank,                                    &
     133                                program_debug_output_unit, debug_output, dom_global_id )
     134
     135   CHARACTER(LEN=*), INTENT(IN) ::  file_suffix_of_output_group  !> file-name suffix added to each file;
     136                                                                 !> must be unique for each output group
    129137
    130138   INTEGER(iwp), INTENT(IN) ::  dom_global_id              !< global id within a file defined by DOM
     139   INTEGER,      INTENT(IN) ::  master_output_rank         !< MPI rank executing tasks which must be executed by a single PE
     140   INTEGER,      INTENT(IN) ::  mpi_comm_of_output_group   !< MPI communicator specifying the rank group participating in output
    131141   INTEGER(iwp), INTENT(IN) ::  program_debug_output_unit  !< file unit number for debug output
    132142
     
    134144
    135145
     146   file_suffix = file_suffix_of_output_group
     147   output_group_comm = mpi_comm_of_output_group
     148   master_rank = master_output_rank
     149
    136150   debug_output_unit = program_debug_output_unit
    137 
    138151   print_debug_output = debug_output
    139152
     
    155168
    156169   INTEGER(iwp), INTENT(OUT) ::  file_id       !< file ID
     170   INTEGER                   ::  my_rank       !< MPI rank of processor
    157171   INTEGER(iwp)              ::  nc_stat       !< netcdf return value
    158172   INTEGER(iwp), INTENT(OUT) ::  return_value  !< return value
     
    160174
    161175   return_value = 0
     176   file_id = -1
    162177
    163178   !-- Open new file
     
    167182
    168183#if defined( __netcdf4 )
    169       nc_stat = NF90_CREATE( TRIM( filename ),                    &
    170                              IOR( NF90_NOCLOBBER, NF90_NETCDF4 ), &
    171                              file_id )
    172 #else
    173       file_id = -1
     184#if defined( __parallel )
     185      CALL MPI_COMM_RANK( output_group_comm, my_rank, return_value )
     186      IF ( return_value /= 0 )  THEN
     187         CALL internal_message( 'error', routine_name // ': MPI_COMM_RANK error' )
     188      ENDIF
     189      IF ( my_rank /= master_rank )  THEN
     190         return_value = 1
     191         CALL internal_message( 'error', routine_name // &
     192                                ': trying to define a NetCDF file in serial mode by an MPI ' // &
     193                                'rank other than the master output rank. Serial NetCDF ' // &
     194                                'files can only be defined by the master output rank!' )
     195      ENDIF
     196#else
     197      my_rank = master_rank
     198      return_value = 0
     199#endif
     200
     201      IF ( return_value == 0 )  &
     202         nc_stat = NF90_CREATE( TRIM( filename ) // TRIM( file_suffix ), &
     203                                IOR( NF90_NOCLOBBER, NF90_NETCDF4 ), &
     204                                file_id )
     205#else
    174206      nc_stat = 0
    175207      return_value = 1
     
    182214
    183215#if defined( __parallel ) && defined( __netcdf4 ) && defined( __netcdf4_parallel )
    184       nc_stat = NF90_CREATE( TRIM( filename ),                                       &
     216      nc_stat = NF90_CREATE( TRIM( filename ) // TRIM( file_suffix ),                &
    185217                             IOR( NF90_NOCLOBBER, IOR( NF90_NETCDF4, NF90_MPIIO ) ), &
    186                              file_id, COMM = MPI_COMM_WORLD, INFO = MPI_INFO_NULL )
    187 #else
    188       file_id = -1
     218                             file_id, COMM = output_group_comm, INFO = MPI_INFO_NULL )
     219#else
    189220      nc_stat = 0
    190221      return_value = 1
     
    196227
    197228   ELSE
    198       file_id = -1
    199229      nc_stat = 0
    200230      return_value = 1
     
    205235
    206236#if defined( __netcdf4 )
    207    IF ( nc_stat /= NF90_NOERR )  THEN
     237   IF ( nc_stat /= NF90_NOERR  .AND.  return_value == 0 )  THEN
    208238      return_value = 1
    209239      CALL internal_message( 'error', routine_name // ': NetCDF error while opening file "' // &
     
    477507   INTEGER(iwp)              ::  d             !< loop index
    478508   INTEGER(iwp), INTENT(IN)  ::  file_id       !< file ID
    479    INTEGER(iwp)              ::  myid          !< id number of processor element
     509   INTEGER                   ::  my_rank       !< MPI rank of processor
    480510   INTEGER(iwp)              ::  nc_stat       !< netcdf return value
    481511   INTEGER(iwp)              ::  ndim          !< number of dimensions of variable in file
     
    532562
    533563#if defined( __parallel )
    534    CALL MPI_COMM_RANK( MPI_COMM_WORLD, myid, return_value )
     564   CALL MPI_COMM_RANK( output_group_comm, my_rank, return_value )
    535565   IF ( return_value /= 0 )  THEN
    536566      CALL internal_message( 'error', routine_name // ': MPI_COMM_RANK error' )
    537567   ENDIF
    538568#else
    539    myid = 0
     569   my_rank = master_rank
    540570   return_value = 0
    541571#endif
    542572
    543    IF ( return_value == 0  .AND.  ( .NOT. is_global  .OR.  myid == 0 ) )  THEN
     573   IF ( return_value == 0  .AND.  ( .NOT. is_global  .OR.  my_rank == master_rank ) )  THEN
    544574
    545575      WRITE( temp_string, * ) var_id
Note: See TracChangeset for help on using the changeset viewer.