Ignore:
Timestamp:
Mar 13, 2014 2:58:42 PM (8 years ago)
Author:
fricke
Message:

Adjustments for parallel NetCDF output for lccrayh/lccrayb (Cray XC30 systems)

File:
1 edited

Legend:

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

    r1116 r1308  
    2020! Current revisions:
    2121! -----------------
    22 !
     22! +local_2d_sections, local_2d_sections_l, ns
     23! Check, if the limit of the time dimension is exceeded for parallel output
     24! To increase the performance for parallel output, the following is done:
     25! - Update of time axis is only done by PE0
     26! - Cross sections are first stored on a local array and are written
     27!   collectively to the output file by all PEs.
    2328!
    2429! Former revisions:
     
    143148    CHARACTER (LEN=25) ::  section_chr
    144149    CHARACTER (LEN=50) ::  rtext
    145     INTEGER ::  av, ngp, file_id, i, if, is, iis, j, k, l, layer_xy, n, psi, &
    146                 s, sender, &
     150    INTEGER ::  av, ngp, file_id, i, if, is, iis, j, k, l, layer_xy, n, ns, &
     151                psi, s, sender, &
    147152                ind(4)
    148153    LOGICAL ::  found, resorted, two_d
     
    150155    REAL, DIMENSION(:), ALLOCATABLE ::      level_z
    151156    REAL, DIMENSION(:,:), ALLOCATABLE ::    local_2d, local_2d_l
    152     REAL, DIMENSION(:,:,:), ALLOCATABLE ::  local_pf
     157    REAL, DIMENSION(:,:,:), ALLOCATABLE ::  local_pf, local_2d_sections, &
     158                                            local_2d_sections_l
    153159#if defined( __parallel )
    154160    REAL, DIMENSION(:,:),   ALLOCATABLE ::  total_2d
     
    157163
    158164    NAMELIST /LOCAL/  rtext
    159 
    160     CALL cpu_log (log_point(3),'data_output_2d','start')
    161165
    162166!
     
    166170    IF ( mode == 'xz'  .AND.  .NOT. data_output_xz(av) )  RETURN
    167171    IF ( mode == 'yz'  .AND.  .NOT. data_output_yz(av) )  RETURN
     172!
     173!-- For parallel netcdf output the time axis must be limited. Return, if this
     174!-- limit is exceeded. This could be the case, if the simulated time exceeds
     175!-- the given end time by the length of the given output interval.
     176    IF ( netcdf_data_format > 4 )  THEN
     177       IF ( mode == 'xy'  .AND.  do2d_xy_time_count(av) + 1 > &
     178            ntdim_2d_xy(av) )  THEN
     179          WRITE ( message_string, * ) 'Output of xy cross-sections is not ', &
     180                          'given at t=', simulated_time, '&because the', &
     181                          ' maximum number of output time levels is exceeded.'
     182          CALL message( 'data_output_2d', 'PA0384', 0, 1, 0, 6, 0 )         
     183          RETURN
     184       ENDIF
     185       IF ( mode == 'xz'  .AND.  do2d_xz_time_count(av) + 1 > &
     186            ntdim_2d_xz(av) )  THEN
     187          WRITE ( message_string, * ) 'Output of xz cross-sections is not ',  &
     188                          'given at t=', simulated_time, '&because the', &
     189                          ' maximum number of output time levels is exceeded.'
     190          CALL message( 'data_output_2d', 'PA0385', 0, 1, 0, 6, 0 )         
     191          RETURN
     192       ENDIF
     193       IF ( mode == 'yz'  .AND.  do2d_yz_time_count(av) + 1 > &
     194            ntdim_2d_yz(av) )  THEN
     195          WRITE ( message_string, * ) 'Output of yz cross-sections is not ', &
     196                          'given at t=', simulated_time, '&because the', &
     197                          ' maximum number of output time levels is exceeded.'
     198          CALL message( 'data_output_2d', 'PA0386', 0, 1, 0, 6, 0 )         
     199          RETURN
     200       ENDIF
     201    ENDIF
     202
     203    CALL cpu_log (log_point(3),'data_output_2d','start')
    168204
    169205    two_d = .FALSE.    ! local variable to distinguish between output of pure 2D
     
    178214          s = 1
    179215          ALLOCATE( level_z(nzb:nzt+1), local_2d(nxlg:nxrg,nysg:nyng) )
     216
     217          IF ( netcdf_data_format > 4 )  THEN
     218             ns = 1
     219             DO WHILE ( section(ns,s) /= -9999  .AND.  ns <= 100 )
     220                ns = ns + 1
     221             ENDDO
     222             ns = ns - 1
     223             ALLOCATE( local_2d_sections(nxlg:nxrg,nysg:nyng,1:ns) )
     224             local_2d_sections = 0.0
     225          ENDIF
    180226
    181227!
     
    201247          ALLOCATE( local_2d(nxlg:nxrg,nzb:nzt+1) )
    202248
     249          IF ( netcdf_data_format > 4 )  THEN
     250             ns = 1
     251             DO WHILE ( section(ns,s) /= -9999  .AND.  ns <= 100 )
     252                ns = ns + 1
     253             ENDDO
     254             ns = ns - 1
     255             ALLOCATE( local_2d_sections(nxlg:nxrg,1:ns,nzb:nzt+1) )
     256             ALLOCATE( local_2d_sections_l(nxlg:nxrg,1:ns,nzb:nzt+1) )
     257             local_2d_sections = 0.0; local_2d_sections_l = 0.0
     258          ENDIF
     259
    203260!
    204261!--       Parallel netCDF4/HDF5 output is done on all PEs, all other on PE0 only
     
    220277
    221278       CASE ( 'yz' )
    222 
    223279          s = 3
    224280          ALLOCATE( local_2d(nysg:nyng,nzb:nzt+1) )
     281
     282          IF ( netcdf_data_format > 4 )  THEN
     283             ns = 1
     284             DO WHILE ( section(ns,s) /= -9999  .AND.  ns <= 100 )
     285                ns = ns + 1
     286             ENDDO
     287             ns = ns - 1
     288             ALLOCATE( local_2d_sections(1:ns,nysg:nyng,nzb:nzt+1) )
     289             ALLOCATE( local_2d_sections_l(1:ns,nysg:nyng,nzb:nzt+1) )
     290             local_2d_sections = 0.0; local_2d_sections_l = 0.0
     291          ENDIF
    225292
    226293!
     
    243310
    244311       CASE DEFAULT
    245 
    246312          message_string = 'unknown cross-section: ' // TRIM( mode )
    247313          CALL message( 'data_output_2d', 'PA0180', 1, 2, 0, 6, 0 )
     
    799865
    800866!
    801 !--                Update the netCDF xy cross section time axis
    802                    IF ( myid == 0  .OR.  netcdf_data_format > 4 )  THEN
    803                       IF ( simulated_time /= do2d_xy_last_time(av) )  THEN
    804                          do2d_xy_time_count(av) = do2d_xy_time_count(av) + 1
    805                          do2d_xy_last_time(av)  = simulated_time
     867!--                Update the netCDF xy cross section time axis.
     868!--                In case of parallel output, this is only done by PE0
     869!--                to increase the performance.
     870                   IF ( simulated_time /= do2d_xy_last_time(av) )  THEN
     871                      do2d_xy_time_count(av) = do2d_xy_time_count(av) + 1
     872                      do2d_xy_last_time(av)  = simulated_time
     873                      IF ( myid == 0 )  THEN
    806874                         IF ( ( .NOT. data_output_2d_on_each_pe  .AND. &
    807875                              netcdf_output )  .OR.  netcdf_data_format > 4 ) &
     
    846914!
    847915!--                   Parallel output in netCDF4/HDF5 format.
    848 !--                   Do not output redundant ghost point data except for the
    849 !--                   boundaries of the total domain.
    850916                      IF ( two_d ) THEN
    851917                         iis = 1
     
    855921
    856922#if defined( __netcdf )
    857                       IF ( nxr == nx  .AND.  nyn /= ny )  THEN
    858                          nc_stat = NF90_PUT_VAR( id_set_xy(av),                &
    859                                                  id_var_do2d(av,if),           &
    860                                                  local_2d(nxl:nxr+1,nys:nyn),  &
    861                                                  start = (/ nxl+1, nys+1, iis, &
    862                                                     do2d_xy_time_count(av) /), &
    863                                                  count = (/ nxr-nxl+2,         &
    864                                                             nyn-nys+1, 1, 1 /) )
    865                       ELSEIF ( nxr /= nx  .AND.  nyn == ny )  THEN
    866                          nc_stat = NF90_PUT_VAR( id_set_xy(av),                &
    867                                                  id_var_do2d(av,if),           &
    868                                                  local_2d(nxl:nxr,nys:nyn+1),  &
    869                                                  start = (/ nxl+1, nys+1, iis, &
    870                                                     do2d_xy_time_count(av) /), &
    871                                                  count = (/ nxr-nxl+1,         &
    872                                                             nyn-nys+2, 1, 1 /) )
    873                       ELSEIF ( nxr == nx  .AND.  nyn == ny )  THEN
    874                          nc_stat = NF90_PUT_VAR( id_set_xy(av),                &
    875                                                  id_var_do2d(av,if),           &
    876                                                  local_2d(nxl:nxr+1,nys:nyn+1),&
    877                                                  start = (/ nxl+1, nys+1, iis, &
    878                                                     do2d_xy_time_count(av) /), &
    879                                                  count = (/ nxr-nxl+2,          &
    880                                                             nyn-nys+2, 1, 1 /) )
    881                       ELSE
    882                          nc_stat = NF90_PUT_VAR( id_set_xy(av),                &
    883                                                  id_var_do2d(av,if),           &
    884                                                  local_2d(nxl:nxr,nys:nyn),    &
    885                                                  start = (/ nxl+1, nys+1, iis, &
    886                                                     do2d_xy_time_count(av) /), &
    887                                                  count = (/ nxr-nxl+1,         &
    888                                                             nyn-nys+1, 1, 1 /) )
    889                       ENDIF
    890 
    891                       CALL handle_netcdf_error( 'data_output_2d', 55 )
     923!
     924!--                   For parallel output, all cross sections are first stored
     925!--                   here on a local array and will be written to the output
     926!--                   file afterwards to increase the performance.
     927                      DO  i = nxlg, nxrg
     928                         DO  j = nysg, nyng
     929                            local_2d_sections(i,j,iis) = local_2d(i,j)
     930                         ENDDO
     931                      ENDDO
    892932#endif
    893933                   ELSE
     
    10471087                CASE ( 'xz' )
    10481088!
    1049 !--                Update the netCDF xz cross section time axis
    1050                    IF ( myid == 0  .OR.  netcdf_data_format > 4 )  THEN
    1051 
    1052                       IF ( simulated_time /= do2d_xz_last_time(av) )  THEN
    1053                          do2d_xz_time_count(av) = do2d_xz_time_count(av) + 1
    1054                          do2d_xz_last_time(av)  = simulated_time
     1089!--                Update the netCDF xz cross section time axis.
     1090!--                In case of parallel output, this is only done by PE0
     1091!--                to increase the performance.
     1092                   IF ( simulated_time /= do2d_xz_last_time(av) )  THEN
     1093                      do2d_xz_time_count(av) = do2d_xz_time_count(av) + 1
     1094                      do2d_xz_last_time(av)  = simulated_time
     1095                      IF ( myid == 0 )  THEN
    10551096                         IF ( ( .NOT. data_output_2d_on_each_pe  .AND.        &
    10561097                              netcdf_output )  .OR.  netcdf_data_format > 4 ) &
     
    10661107                         ENDIF
    10671108                      ENDIF
    1068 
    10691109                   ENDIF
    10701110
     
    11141154                   IF ( netcdf_output  .AND.  netcdf_data_format > 4 )  THEN
    11151155!
    1116 !--                   ATTENTION: The following lines are a workaround, because
    1117 !--                              independet output does not work with the
    1118 !--                              current netCDF4 installation. Therefore, data
    1119 !--                              are transferred from PEs having the cross
    1120 !--                              sections to other PEs along y having no cross
    1121 !--                              section data. Some of these data are the
    1122 !--                              output.
    1123 !--                   BEGIN WORKAROUND---------------------------------------
    1124                       IF ( npey /= 1  .AND.  section(is,s) /= -1)  THEN
    1125                          ALLOCATE( local_2d_l(nxlg:nxrg,nzb:nzt+1) )
    1126                          local_2d_l = 0.0
    1127                          IF ( section(is,s) >= nys .AND. section(is,s) <= nyn )&
    1128                          THEN
    1129                             local_2d_l = local_2d
    1130                          ENDIF
    1131 #if defined( __parallel )
    1132 !
    1133 !--                      Distribute data over all PEs along y
    1134                          ngp = ( nxrg-nxlg+1 ) * ( nzt-nzb+2 )
    1135                          IF ( collective_wait ) CALL MPI_BARRIER( comm2d, ierr )
    1136                          CALL MPI_ALLREDUCE( local_2d_l(nxlg,nzb),            &
    1137                                              local_2d(nxlg,nzb), ngp,         &
    1138                                              MPI_REAL, MPI_SUM, comm1dy, ierr )
    1139 #else
    1140                          local_2d = local_2d_l
    1141 #endif
    1142                          DEALLOCATE( local_2d_l )
    1143                       ENDIF
    1144 !--                   END WORKAROUND-----------------------------------------
    1145 
    1146 !
    11471156!--                   Output in netCDF4/HDF5 format.
    11481157!--                   Output only on those PEs where the respective cross
     
    11521161                             section(is,s) <= nyn )  .OR.  &
    11531162                           ( section(is,s) == -1  .AND.  myidy == 0 ) )  THEN
    1154 !
    1155 !--                      Do not output redundant ghost point data except for the
    1156 !--                      boundaries of the total domain.
    11571163#if defined( __netcdf )
    1158                          IF ( nxr == nx )  THEN
    1159                             nc_stat = NF90_PUT_VAR( id_set_xz(av),             &
    1160                                                 id_var_do2d(av,if),            &
    1161                                                 local_2d(nxl:nxr+1,nzb:nzt+1), &
    1162                                                 start = (/ nxl+1, is, 1,       &
    1163                                                     do2d_xz_time_count(av) /), &
    1164                                                 count = (/ nxr-nxl+2, 1,       &
    1165                                                            nzt+2, 1 /) )
    1166                          ELSE
    1167                             nc_stat = NF90_PUT_VAR( id_set_xz(av),             &
    1168                                                 id_var_do2d(av,if),            &
    1169                                                 local_2d(nxl:nxr,nzb:nzt+1),   &
    1170                                                 start = (/ nxl+1, is, 1,       &
    1171                                                     do2d_xz_time_count(av) /), &
    1172                                                 count = (/ nxr-nxl+1, 1,       &
    1173                                                            nzt+2, 1 /) )
    1174                          ENDIF
    1175 
    1176                          CALL handle_netcdf_error( 'data_output_2d', 57 )
    1177 
    1178                       ELSE
    1179 !
    1180 !--                      Output on other PEs. Only one point is output!!
    1181 !--                      ATTENTION: This is a workaround (see above)!!
    1182                          IF ( npey /= 1 )  THEN
    1183                             nc_stat = NF90_PUT_VAR( id_set_xz(av),             &
    1184                                                     id_var_do2d(av,if),        &
    1185                                                     local_2d(nxl:nxl,nzb:nzb), &
    1186                                                     start = (/ nxl+1, is, 1,   &
    1187                                                     do2d_xz_time_count(av) /), &
    1188                                                     count = (/ 1, 1, 1, 1 /) )
    1189                             CALL handle_netcdf_error( 'data_output_2d', 451 )
    1190                          ENDIF
     1164!
     1165!--                      For parallel output, all cross sections are first
     1166!--                      stored here on a local array and will be written to the
     1167!--                      output file afterwards to increase the performance.
     1168                         DO  i = nxlg, nxrg
     1169                            DO  k = nzb, nzt+1
     1170                               local_2d_sections_l(i,is,k) = local_2d(i,k)
     1171                            ENDDO
     1172                         ENDDO
    11911173#endif
    11921174                      ENDIF
     
    13571339                CASE ( 'yz' )
    13581340!
    1359 !--                Update the netCDF yz cross section time axis
    1360                    IF ( myid == 0  .OR.  netcdf_data_format > 4 )  THEN
    1361 
    1362                       IF ( simulated_time /= do2d_yz_last_time(av) )  THEN
    1363                          do2d_yz_time_count(av) = do2d_yz_time_count(av) + 1
    1364                          do2d_yz_last_time(av)  = simulated_time
     1341!--                Update the netCDF yz cross section time axis.
     1342!--                In case of parallel output, this is only done by PE0
     1343!--                to increase the performance.
     1344                   IF ( simulated_time /= do2d_yz_last_time(av) )  THEN
     1345                      do2d_yz_time_count(av) = do2d_yz_time_count(av) + 1
     1346                      do2d_yz_last_time(av)  = simulated_time
     1347                      IF ( myid == 0 )  THEN
    13651348                         IF ( ( .NOT. data_output_2d_on_each_pe  .AND.        &
    13661349                              netcdf_output )  .OR.  netcdf_data_format > 4 ) &
     
    13761359                         ENDIF
    13771360                      ENDIF
    1378 
    1379                    ENDIF
     1361                   ENDIF
     1362
    13801363!
    13811364!--                If required, carry out averaging along x
     
    14231406                   IF ( netcdf_output  .AND.  netcdf_data_format > 4 )  THEN
    14241407!
    1425 !--                   ATTENTION: The following lines are a workaround, because
    1426 !--                              independet output does not work with the
    1427 !--                              current netCDF4 installation. Therefore, data
    1428 !--                              are transferred from PEs having the cross
    1429 !--                              sections to other PEs along y having no cross
    1430 !--                              section data. Some of these data are the
    1431 !--                              output.
    1432 !--                   BEGIN WORKAROUND---------------------------------------
    1433                       IF ( npex /= 1  .AND.  section(is,s) /= -1)  THEN
    1434                          ALLOCATE( local_2d_l(nysg:nyng,nzb:nzt+1) )
    1435                          local_2d_l = 0.0
    1436                          IF ( section(is,s) >= nxl .AND. section(is,s) <= nxr )&
    1437                          THEN
    1438                             local_2d_l = local_2d
    1439                          ENDIF
    1440 #if defined( __parallel )
    1441 !
    1442 !--                      Distribute data over all PEs along x
    1443                          ngp = ( nyng-nysg+1 ) * ( nzt-nzb + 2 )
    1444                          IF ( collective_wait ) CALL MPI_BARRIER( comm2d, ierr )
    1445                          CALL MPI_ALLREDUCE( local_2d_l(nysg,nzb),            &
    1446                                              local_2d(nysg,nzb), ngp,         &
    1447                                              MPI_REAL, MPI_SUM, comm1dx, ierr )
    1448 #else
    1449                          local_2d = local_2d_l
    1450 #endif
    1451                          DEALLOCATE( local_2d_l )
    1452                       ENDIF
    1453 !--                   END WORKAROUND-----------------------------------------
    1454 
    1455 !
    14561408!--                   Output in netCDF4/HDF5 format.
    14571409!--                   Output only on those PEs where the respective cross
     
    14611413                             section(is,s) <= nxr )  .OR.  &
    14621414                           ( section(is,s) == -1  .AND.  myidx == 0 ) )  THEN
    1463 !
    1464 !--                      Do not output redundant ghost point data except for the
    1465 !--                      boundaries of the total domain.
    14661415#if defined( __netcdf )
    1467                          IF ( nyn == ny )  THEN
    1468                             nc_stat = NF90_PUT_VAR( id_set_yz(av),             &
    1469                                                 id_var_do2d(av,if),            &
    1470                                                 local_2d(nys:nyn+1,nzb:nzt+1), &
    1471                                                 start = (/ is, nys+1, 1,       &
    1472                                                     do2d_yz_time_count(av) /), &
    1473                                                 count = (/ 1, nyn-nys+2,       &
    1474                                                            nzt+2, 1 /) )
    1475                          ELSE
    1476                             nc_stat = NF90_PUT_VAR( id_set_yz(av),             &
    1477                                                 id_var_do2d(av,if),            &
    1478                                                 local_2d(nys:nyn,nzb:nzt+1),   &
    1479                                                 start = (/ is, nys+1, 1,       &
    1480                                                     do2d_yz_time_count(av) /), &
    1481                                                 count = (/ 1, nyn-nys+1,       &
    1482                                                            nzt+2, 1 /) )
    1483                          ENDIF
    1484 
    1485                          CALL handle_netcdf_error( 'data_output_2d', 60 )
    1486 
    1487                       ELSE
    1488 !
    1489 !--                      Output on other PEs. Only one point is output!!
    1490 !--                      ATTENTION: This is a workaround (see above)!!
    1491                          IF ( npex /= 1 )  THEN
    1492                             nc_stat = NF90_PUT_VAR( id_set_yz(av),             &
    1493                                                     id_var_do2d(av,if),        &
    1494                                                     local_2d(nys:nys,nzb:nzb), &
    1495                                                     start = (/ is, nys+1, 1,   &
    1496                                                     do2d_yz_time_count(av) /), &
    1497                                                     count = (/ 1, 1, 1, 1 /) )
    1498                             CALL handle_netcdf_error( 'data_output_2d', 452 )
    1499                          ENDIF
     1416!
     1417!--                      For parallel output, all cross sections are first
     1418!--                      stored here on a local array and will be written to the
     1419!--                      output file afterwards to increase the performance.
     1420                         DO  j = nysg, nyng
     1421                            DO  k = nzb, nzt+1
     1422                               local_2d_sections_l(is,j,k) = local_2d(j,k)
     1423                            ENDDO
     1424                         ENDDO
    15001425#endif
    15011426                      ENDIF
     
    16691594          ENDDO loop1
    16701595
     1596!
     1597!--       For parallel output, all data were collected before on a local array
     1598!--       and are written now to the netcdf file. This must be done to increase
     1599!--       the performance of the parallel output.
     1600#if defined( __netcdf )
     1601          IF ( netcdf_output .AND. netcdf_data_format > 4 )  THEN
     1602
     1603                SELECT CASE ( mode )
     1604
     1605                   CASE ( 'xy' )
     1606                      IF ( two_d ) THEN
     1607                         iis = 1
     1608                      ELSE
     1609                         iis = is-1
     1610                      ENDIF
     1611!
     1612!--                   Do not output redundant ghost point data except for the
     1613!--                   boundaries of the total domain.
     1614                      IF ( nxr == nx  .AND.  nyn /= ny )  THEN
     1615                         nc_stat = NF90_PUT_VAR( id_set_xy(av),                &
     1616                                                 id_var_do2d(av,if),           &
     1617                                                 local_2d_sections(nxl:nxr+1,  &
     1618                                                    nys:nyn,1:ns),             &
     1619                                                 start = (/ nxl+1, nys+1, 1,   &
     1620                                                    do2d_xy_time_count(av) /), &
     1621                                                 count = (/ nxr-nxl+2,         &
     1622                                                            nyn-nys+1, ns, 1   &
     1623                                                          /) )
     1624                      ELSEIF ( nxr /= nx  .AND.  nyn == ny )  THEN
     1625                         nc_stat = NF90_PUT_VAR( id_set_xy(av),                &
     1626                                                 id_var_do2d(av,if),           &
     1627                                                 local_2d_sections(nxl:nxr,    &
     1628                                                    nys:nyn+1,1:ns),           &
     1629                                                 start = (/ nxl+1, nys+1, 1,   &
     1630                                                    do2d_xy_time_count(av) /), &
     1631                                                 count = (/ nxr-nxl+1,         &
     1632                                                            nyn-nys+2, ns, 1   &
     1633                                                          /) )
     1634                      ELSEIF ( nxr == nx  .AND.  nyn == ny )  THEN
     1635                         nc_stat = NF90_PUT_VAR( id_set_xy(av),                &
     1636                                                 id_var_do2d(av,if),           &
     1637                                                 local_2d_sections(nxl:nxr+1,  &
     1638                                                    nys:nyn+1,1:ns),           &
     1639                                                 start = (/ nxl+1, nys+1, 1,   &
     1640                                                    do2d_xy_time_count(av) /), &
     1641                                                 count = (/ nxr-nxl+2,         &
     1642                                                            nyn-nys+2, ns, 1   &
     1643                                                          /) )
     1644                      ELSE
     1645                         nc_stat = NF90_PUT_VAR( id_set_xy(av),                &
     1646                                                 id_var_do2d(av,if),           &
     1647                                                 local_2d_sections(nxl:nxr,    &
     1648                                                    nys:nyn,1:ns),             &
     1649                                                 start = (/ nxl+1, nys+1, 1,   &
     1650                                                    do2d_xy_time_count(av) /), &
     1651                                                 count = (/ nxr-nxl+1,         &
     1652                                                            nyn-nys+1, ns, 1   &
     1653                                                          /) )
     1654                      ENDIF   
     1655
     1656                      CALL handle_netcdf_error( 'data_output_2d', 55 )
     1657
     1658                   CASE ( 'xz' )
     1659!
     1660!--                   First, all PEs get the information of all cross-sections.
     1661!--                   Then the data are written to the output file by all PEs
     1662!--                   while NF90_COLLECTIVE is set in subroutine
     1663!--                   define_netcdf_header. Although redundant information are
     1664!--                   written to the output file in that case, the performance
     1665!--                   is significantly better compared to the case where only
     1666!--                   the first row of PEs in x-direction (myidx = 0) is given
     1667!--                   the output while NF90_INDEPENDENT is set.
     1668                      IF ( npey /= 1 )  THEN
     1669                         
     1670#if defined( __parallel )
     1671!
     1672!--                      Distribute data over all PEs along y
     1673                         ngp = ( nxrg-nxlg+1 ) * ( nzt-nzb+2 ) * ns
     1674                         IF ( collective_wait ) CALL MPI_BARRIER( comm2d, ierr )
     1675                         CALL MPI_ALLREDUCE( local_2d_sections_l(nxlg,1,nzb),  &
     1676                                             local_2d_sections(nxlg,1,nzb),    &
     1677                                             ngp, MPI_REAL, MPI_SUM, comm1dy,  &
     1678                                             ierr )
     1679#else
     1680                         local_2d_sections = local_2d_sections_l
     1681#endif
     1682                      ENDIF
     1683!
     1684!--                   Do not output redundant ghost point data except for the
     1685!--                   boundaries of the total domain.
     1686                      IF ( nxr == nx )  THEN
     1687                         nc_stat = NF90_PUT_VAR( id_set_xz(av),                &
     1688                                             id_var_do2d(av,if),               &
     1689                                             local_2d_sections(nxl:nxr+1,1:ns, &
     1690                                                nzb:nzt+1),                    &
     1691                                             start = (/ nxl+1, 1, 1,           &
     1692                                                do2d_xz_time_count(av) /),     &
     1693                                             count = (/ nxr-nxl+2, ns, nzt+2,  &
     1694                                                        1 /) )
     1695                      ELSE
     1696                         nc_stat = NF90_PUT_VAR( id_set_xz(av),                &
     1697                                             id_var_do2d(av,if),               &
     1698                                             local_2d_sections(nxl:nxr,1:ns,   &
     1699                                                nzb:nzt+1),                    &
     1700                                             start = (/ nxl+1, 1, 1,           &
     1701                                                do2d_xz_time_count(av) /),     &
     1702                                             count = (/ nxr-nxl+1, ns, nzt+2,  &
     1703                                                1 /) )
     1704                      ENDIF
     1705
     1706                      CALL handle_netcdf_error( 'data_output_2d', 57 )
     1707
     1708                   CASE ( 'yz' )
     1709!
     1710!--                   First, all PEs get the information of all cross-sections.
     1711!--                   Then the data are written to the output file by all PEs
     1712!--                   while NF90_COLLECTIVE is set in subroutine
     1713!--                   define_netcdf_header. Although redundant information are
     1714!--                   written to the output file in that case, the performance
     1715!--                   is significantly better compared to the case where only
     1716!--                   the first row of PEs in y-direction (myidy = 0) is given
     1717!--                   the output while NF90_INDEPENDENT is set.
     1718                      IF ( npex /= 1 )  THEN
     1719
     1720#if defined( __parallel )
     1721!
     1722!--                      Distribute data over all PEs along x
     1723                         ngp = ( nyng-nysg+1 ) * ( nzt-nzb + 2 ) * ns
     1724                         IF ( collective_wait ) CALL MPI_BARRIER( comm2d, ierr )
     1725                         CALL MPI_ALLREDUCE( local_2d_sections_l(1,nysg,nzb),  &
     1726                                             local_2d_sections(1,nysg,nzb),    &
     1727                                             ngp, MPI_REAL, MPI_SUM, comm1dx,  &
     1728                                             ierr )
     1729#else
     1730                         local_2d_sections = local_2d_sections_l
     1731#endif
     1732                      ENDIF
     1733!
     1734!--                   Do not output redundant ghost point data except for the
     1735!--                   boundaries of the total domain.
     1736                      IF ( nyn == ny )  THEN
     1737                         nc_stat = NF90_PUT_VAR( id_set_yz(av),                &
     1738                                             id_var_do2d(av,if),               &
     1739                                             local_2d_sections(1:ns,           &
     1740                                                nys:nyn+1,nzb:nzt+1),          &
     1741                                             start = (/ 1, nys+1, 1,           &
     1742                                                do2d_yz_time_count(av) /),     &
     1743                                             count = (/ ns, nyn-nys+2,         &
     1744                                                        nzt+2, 1 /) )
     1745                      ELSE
     1746                         nc_stat = NF90_PUT_VAR( id_set_yz(av),                &
     1747                                             id_var_do2d(av,if),               &
     1748                                             local_2d_sections(1:ns,nys:nyn,   &
     1749                                                nzb:nzt+1),                    &
     1750                                             start = (/ 1, nys+1, 1,           &
     1751                                                do2d_yz_time_count(av) /),     &
     1752                                             count = (/ ns, nyn-nys+1,         &
     1753                                                        nzt+2, 1 /) )
     1754                      ENDIF
     1755
     1756                      CALL handle_netcdf_error( 'data_output_2d', 60 )
     1757
     1758                   CASE DEFAULT
     1759                      message_string = 'unknown cross-section: ' // TRIM( mode )
     1760                      CALL message( 'data_output_2d', 'PA0180', 1, 2, 0, 6, 0 )
     1761
     1762                END SELECT                     
     1763
     1764          ENDIF
     1765
    16711766       ENDIF
    16721767
     
    16801775!-- Deallocate temporary arrays.
    16811776    IF ( ALLOCATED( level_z ) )  DEALLOCATE( level_z )
    1682     DEALLOCATE( local_pf, local_2d )
     1777    IF ( netcdf_data_format > 4 )  THEN
     1778       DEALLOCATE( local_pf, local_2d, local_2d_sections )
     1779       IF( mode == 'xz' .OR. mode == 'yz' ) DEALLOCATE( local_2d_sections_l )
     1780    ENDIF
    16831781#if defined( __parallel )
    16841782    IF ( .NOT.  data_output_2d_on_each_pe  .AND.  myid == 0 )  THEN
     
    17041802    ENDIF
    17051803
    1706 
    17071804    CALL cpu_log (log_point(3),'data_output_2d','stop','nobarrier')
    17081805
Note: See TracChangeset for help on using the changeset viewer.