Changeset 4590


Ignore:
Timestamp:
Jul 6, 2020 2:34:59 PM (4 years ago)
Author:
suehring
Message:

Biomet: Enable restart via mpi-IO; Restart: Bugfix in allocation of hom and hom_sum in case of mpi-io restart when chemistry or salsa are employed

Location:
palm/trunk/SOURCE
Files:
3 edited

Legend:

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

    r4577 r4590  
    2121! Current revisions:
    2222! ------------------
    23 ! 
    24 ! 
     23!
     24!
    2525! Former revisions:
    2626! -----------------
    2727! $Id$
     28! Enable restart via mpi-IO. Therefore, allocated array mrt_av_grid as 3D array instead of an
     29! 1D array.
     30!
     31! 4577 2020-06-25 09:53:58Z raasch
    2832! further re-formatting concerning Fortran parameter variables
    2933!
     
    183187
    184188    USE restart_data_mpi_io_mod,                                                                   &
    185         ONLY:  rrd_mpi_io, wrd_mpi_io
     189        ONLY:  rrd_mpi_io,                                                                         &
     190               rd_mpi_io_check_array,                                                              &
     191               wrd_mpi_io
    186192
    187193
     
    217223    REAL(wp)    ::  bio_output_height  !< height output is calculated in m
    218224
    219     REAL(wp), DIMENSION(:), ALLOCATABLE   ::  mrt_av_grid   !< time average mean
    220 
    221225    REAL(wp), DIMENSION(:,:), ALLOCATABLE ::  perct      !< PT results   (degree_C)
    222226    REAL(wp), DIMENSION(:,:), ALLOCATABLE ::  pet        !< PET results  (degree_C)
     
    229233    REAL(wp), DIMENSION(:,:), ALLOCATABLE ::  tmrt_av_grid  !< tmrt results (degree_C)
    230234    REAL(wp), DIMENSION(:,:), ALLOCATABLE ::  utci_av       !< UTCI results (aver. input) (degree_C)
     235
     236    REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::  mrt_av_grid   !< time average mean radiant temperature
    231237
    232238!
     
    410416    CHARACTER (LEN=*) ::  variable !< The variable in question
    411417
    412     INTEGER(iwp) ::  i        !< Running index, x-dir
    413     INTEGER(iwp) ::  j        !< Running index, y-dir
    414     INTEGER(iwp) ::  k        !< Running index, z-dir
     418    INTEGER(iwp) ::  i        !< Running index, x-direction
     419    INTEGER(iwp) ::  j        !< Running index, y-direction
     420    INTEGER(iwp) ::  k        !< Running index, z-direction
     421    INTEGER(iwp) ::  l        !< index used to link radiation arrays to 3d grid arrays
    415422
    416423
     
    422429
    423430                IF ( .NOT. ALLOCATED( mrt_av_grid ) )  THEN
    424                    ALLOCATE( mrt_av_grid(nmrtbl) )
     431                   ALLOCATE( mrt_av_grid(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
    425432                ENDIF
    426433                mrt_av_grid = 0.0_wp
     
    486493
    487494                IF ( mrt_include_sw )  THEN
    488                    mrt_av_grid(:) = mrt_av_grid(:)  +                                              &
    489                                     ( ( human_absorb * mrtinsw(:) +                                &
    490                                     mrtinlw(:) ) / ( human_emiss * sigma_sb ) )**.25_wp - degc_to_k
     495                   DO  l = 1, nmrtbl
     496                      i = mrtbl(ix,l)
     497                      j = mrtbl(iy,l)
     498                      k = mrtbl(iz,l)
     499                      mrt_av_grid(k,j,i) = mrt_av_grid(k,j,i)  +                                   &
     500                                    ( ( human_absorb * mrtinsw(l) +                                &
     501                                    mrtinlw(l) ) / ( human_emiss * sigma_sb ) )**0.25_wp - degc_to_k
     502                   ENDDO
    491503                ELSE
    492                    mrt_av_grid(:) = mrt_av_grid(:) +                                               &
    493                                     ( mrtinlw(:) / ( human_emiss * sigma_sb ) )**.25_wp - degc_to_k
     504                   DO  l = 1, nmrtbl
     505                      i = mrtbl(ix,l)
     506                      j = mrtbl(iy,l)
     507                      k = mrtbl(iz,l)
     508                      mrt_av_grid(k,j,i) = mrt_av_grid(k,j,i)  +                                   &
     509                                    ( mrtinlw(l) / ( human_emiss * sigma_sb ) )**0.25_wp - degc_to_k
     510                   ENDDO
    494511                ENDIF
    495512             ENDIF
     
    584601
    585602             IF ( .NOT. ALLOCATED( mrt_av_grid ) )  THEN
    586                 ALLOCATE( mrt_av_grid(nmrtbl) )
     603                ALLOCATE( mrt_av_grid(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
    587604                do_average_mrt = .TRUE.
    588605                mrt_av_grid = 0.0_wp
     
    591608
    592609                IF ( mrt_include_sw )  THEN
    593                    mrt_av_grid(:) = mrt_av_grid(:) +                                               &
    594                                     ( ( human_absorb * mrtinsw(:) +                                &
    595                                     mrtinlw(:) ) /                                                 &
     610                   DO  l = 1, nmrtbl
     611                      i = mrtbl(ix,l)
     612                      j = mrtbl(iy,l)
     613                      k = mrtbl(iz,l)
     614                      mrt_av_grid(k,j,i) = mrt_av_grid(k,j,i)  +                                   &
     615                                    ( ( human_absorb * mrtinsw(l) +                                &
     616                                    mrtinlw(l) ) /                                                 &
    596617                                      ( human_emiss  * sigma_sb ) )**0.25_wp - degc_to_k
    597                ELSE
    598                    mrt_av_grid(:) = mrt_av_grid(:) +                                               &
    599                                     ( mrtinlw(:) /                                                 &
     618                   ENDDO
     619                ELSE
     620                   DO  l = 1, nmrtbl
     621                      i = mrtbl(ix,l)
     622                      j = mrtbl(iy,l)
     623                      k = mrtbl(iz,l)
     624                      mrt_av_grid(k,j,i) = mrt_av_grid(k,j,i) +                                    &
     625                                    ( mrtinlw(l) /                                                 &
    600626                                    ( human_emiss * sigma_sb ) )**0.25_wp - degc_to_k
     627                   ENDDO
    601628                ENDIF
    602629             ENDIF
     
    626653!--          do_average_mrt will be .TRUE. leading to a double-averaging.
    627654             IF ( .NOT. do_average_mrt  .AND.  ALLOCATED( mrt_av_grid ) )  THEN
    628                 mrt_av_grid(:) = mrt_av_grid(:) / REAL( average_count_3d, KIND=wp )
     655                DO  i = nxl, nxr
     656                   DO  j = nys, nyn
     657                      DO  k = nzb, nzt+1
     658                         mrt_av_grid(k,j,i) = mrt_av_grid(k,j,i) / REAL( average_count_3d, KIND=wp )
     659                      ENDDO
     660                   ENDDO
     661                ENDDO
    629662             ENDIF
    630663
     
    692725
    693726             IF ( ALLOCATED( mrt_av_grid )  .AND.  do_average_mrt )  THEN
    694                 mrt_av_grid(:) = mrt_av_grid(:) / REAL( average_count_3d, KIND = wp )
     727                DO  i = nxl, nxr
     728                   DO  j = nys, nyn
     729                      DO  k = nzb, nzt+1
     730                         mrt_av_grid(k,j,i) = mrt_av_grid(k,j,i) / REAL( average_count_3d, KIND=wp )
     731                      ENDDO
     732                   ENDDO
     733                ENDDO
    695734             ENDIF
    696735
     
    942981                 ENDIF
    943982              ELSE
    944                  local_pf(i,j,k) = mrt_av_grid(l)
     983                 local_pf(i,j,k) = mrt_av_grid(k,j,i)
    945984              ENDIF
    946985           ENDDO
     
    11151154                  ENDIF
    11161155               ELSE
    1117                   local_pf(i,j,k) = REAL( mrt_av_grid(l), KIND = sp )
     1156                  local_pf(i,j,k) = REAL( mrt_av_grid(k,j,i), KIND = sp )
    11181157               ENDIF
    11191158            ENDDO
     
    14351474    SELECT CASE ( restart_string(1:length) )
    14361475
    1437        CASE ( 'nmrtbl' )
    1438           READ ( 13 )  bio_nmrtbl
    1439 
    14401476       CASE ( 'mrt_av_grid' )
    14411477          IF ( .NOT. ALLOCATED( mrt_av_grid ) )  THEN
    1442              ALLOCATE( mrt_av_grid(bio_nmrtbl) )
     1478             ALLOCATE( mrt_av_grid(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
     1479             mrt_av_grid = 0.0_wp
    14431480          ENDIF
    14441481          READ ( 13 )  mrt_av_grid
    1445 
    14461482
    14471483       CASE DEFAULT
     
    14621498 SUBROUTINE bio_rrd_local_mpi
    14631499
    1464     STOP '+++ reading restart data with MPI-IO not implemented for bio_rrd_local_mpi'
     1500    USE control_parameters
     1501
     1502    USE indices
     1503
     1504    USE kinds
     1505
     1506
     1507    IMPLICIT NONE
     1508
     1509    LOGICAL      ::  array_found  !<
     1510
     1511    CALL rd_mpi_io_check_array( 'mrt_av_grid' , found = array_found )
     1512    IF ( array_found )  THEN
     1513       IF ( .NOT. ALLOCATED( mrt_av_grid ) )  ALLOCATE( mrt_av_grid(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
     1514       CALL rrd_mpi_io( 'mrt_av_grid', mrt_av_grid )
     1515    ENDIF
    14651516
    14661517 END SUBROUTINE bio_rrd_local_mpi
     
    14731524!--------------------------------------------------------------------------------------------------!
    14741525 SUBROUTINE bio_wrd_global
    1475 
    1476     IMPLICIT NONE
    14771526
    14781527    IF ( TRIM( restart_data_format_output ) == 'fortran_binary' )  THEN
     
    15241573 SUBROUTINE bio_wrd_local
    15251574
    1526     IMPLICIT NONE
    1527 
    1528 
    15291575    IF ( TRIM( restart_data_format_output ) == 'fortran_binary' )  THEN
    1530 
    1531 !
    1532 !--    First nmrtbl has to be written/read, because it is the dimension of mrt_av_grid
    1533        CALL wrd_write_string( 'nmrtbl' )
    1534        WRITE ( 14 )  nmrtbl
    15351576
    15361577       IF ( ALLOCATED( mrt_av_grid ) )  THEN
     
    15411582    ELSEIF ( TRIM( restart_data_format_output(1:3) ) == 'mpi' )  THEN
    15421583
    1543 !
    1544 !--   TODO: the mrt_av_grid is a 1-d array and its size depends on subdomain features. This does
    1545 !--         not work with the MPI-IO concept (nor with the restart I/O concept in general.
    1546 !--         I am not sure, if this data needs to be written to the restart file at all (Siggi, 13.4.20)
    1547 !       CALL wrd_mpi_io( 'nmrtbl', nmrtbl )
    1548 !       CALL wrd_mpi_io_..... 'mrt_av_grid'
    1549        WRITE (6,*) '+++ biometeorology module does not work with MPI-IO for restart_data'
    1550        STOP
     1584       IF ( ALLOCATED( mrt_av_grid ) )  CALL wrd_mpi_io( 'mrt_av_grid', mrt_av_grid )
    15511585
    15521586    ENDIF
     
    15761610    IF ( av )  THEN
    15771611!
    1578 !-- Make sure tmrt_av_grid is present and initialize with the fill value
     1612!--    Make sure tmrt_av_grid is present and initialize with the fill value
    15791613       IF ( .NOT. ALLOCATED( tmrt_av_grid ) )  THEN
    1580           ALLOCATE( tmrt_av_grid (nys:nyn,nxl:nxr) )
     1614          ALLOCATE( tmrt_av_grid(nys:nyn,nxl:nxr) )
    15811615       ENDIF
    15821616       tmrt_av_grid = REAL( bio_fill_value, KIND = wp )
    15831617
    15841618!
    1585 !-- mrt_av_grid should always be allcoated here, but better make sure ist actually is.
     1619!--    mrt_av_grid should always be allcoated here, but better make sure ist actually is.
    15861620       IF ( ALLOCATED( mrt_av_grid ) )  THEN
    15871621!
     
    15961630!
    15971631!--             Averaging was done before, so we can just copy the result here.
    1598                 tmrt_av_grid(j,i) = mrt_av_grid(l)
     1632                tmrt_av_grid(j,i) = mrt_av_grid(k,j,i)
    15991633
    16001634             ENDIF
  • palm/trunk/SOURCE/module_interface.f90

    r4525 r4590  
    2020! Current revisions:
    2121! -----------------
    22 ! 
    23 ! 
     22!
     23!
    2424! Former revisions:
    2525! -----------------
    2626! $Id$
     27! Enable mpi-io for biomet
     28!
     29! 4525 2020-05-10 17:05:07Z raasch
    2730! added restart I/O for global salsa data,
    2831! added restart with MPI-IO for salsa
     
    20032006    CALL dynamics_rrd_local
    20042007
    2005 !    IF ( biometeorology )       CALL bio_rrd_local
     2008    IF ( biometeorology )       CALL bio_rrd_local
    20062009    IF ( bulk_cloud_model )     CALL bcm_rrd_local
    20072010    IF ( air_chemistry )        CALL chem_rrd_local
  • palm/trunk/SOURCE/read_restart_data_mod.f90

    r4580 r4590  
    2020! Current revisions:
    2121! -----------------
    22 ! 
    23 ! 
     22!
     23!
    2424! Former revisions:
    2525! -----------------
    2626! $Id$
     27! Bugfix in allocation of hom and hom_sum in case of mpi-io restart when
     28! chemistry or salsa are employed
     29!
     30! 4580 2020-06-29 07:54:21Z raasch
    2731! data handling with MPI-IO for cyclic-fill added (so far only for global data)
    2832!
     
    880884                     v_init(0:nz+1), pt_init(0:nz+1), q_init(0:nz+1),                              &
    881885                     ref_state(0:nz+1), s_init(0:nz+1), sa_init(0:nz+1),                           &
    882                      hom(0:nz+1,2,pr_palm+max_pr_user,0:statistic_regions),                        &
    883                      hom_sum(0:nz+1,pr_palm+max_pr_user,0:statistic_regions) )
     886                     hom(0:nz+1,2,pr_palm+max_pr_user+max_pr_cs+max_pr_salsa,0:statistic_regions), &
     887                     hom_sum(0:nz+1,pr_palm+max_pr_user+max_pr_cs+max_pr_salsa,0:statistic_regions) )
    884888       ENDIF
    885889
Note: See TracChangeset for help on using the changeset viewer.