Ignore:
Timestamp:
Mar 3, 2015 2:18:16 PM (9 years ago)
Author:
maronga
Message:

land surface model released

File:
1 edited

Legend:

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

    r1360 r1551  
    2020! Current revisions:
    2121! ------------------
    22 !
     22! Added suppport for land surface model and radiation model output. In the course
     23! of this action, the limits for vertical loops have been changed (from nzb and
     24! nzt+1 to nzb_do and nzt_do, respectively in order to allow soil model output).
     25! Moreover, a new vertical grid zs was introduced.
    2326!
    2427! Former revisions:
     
    112115    USE kinds
    113116   
     117    USE land_surface_model_mod,                                                &
     118        ONLY: m_soil, m_soil_av, nzb_soil, nzt_soil, t_soil, t_soil_av
     119
    114120    USE netcdf_control
    115121       
     
    130136    INTEGER(iwp) ::  k         !:
    131137    INTEGER(iwp) ::  n         !:
     138    INTEGER(iwp) ::  nzb_do    !: vertical lower limit for data output
     139    INTEGER(iwp) ::  nzt_do    !: vertical upper limit for data output
    132140    INTEGER(iwp) ::  pos       !:
    133141    INTEGER(iwp) ::  prec      !:
     
    183191
    184192!
    185 !-- Allocate a temporary array with the desired output dimensions.
    186     ALLOCATE( local_pf(nxlg:nxrg,nysg:nyng,nzb:nz_do3d) )
    187 
    188 !
    189193!-- Update the netCDF time axis
    190194!-- In case of parallel output, this is only done by PE0 to increase the
     
    209213!--    Store the array chosen on the temporary array.
    210214       resorted = .FALSE.
     215       nzb_do = nzb
     216       nzt_do = nz_do3d
     217
     218!
     219!--    Allocate a temporary array with the desired output dimensions.
     220       ALLOCATE( local_pf(nxlg:nxrg,nysg:nyng,nzb_do:nzt_do) )
     221
    211222       SELECT CASE ( TRIM( do3d(av,if) ) )
    212223
     
    223234             ELSE
    224235                to_be_resorted => lpt_av
     236             ENDIF
     237
     238          CASE ( 'm_soil' )
     239             nzb_do = nzb_soil
     240             nzt_do = nzt_soil
     241!
     242!--          For soil model quantities, it is required to re-allocate local_pf
     243             DEALLOCATE ( local_pf )
     244             ALLOCATE( local_pf(nxlg:nxrg,nysg:nyng,nzb_do:nzt_do) )
     245
     246             IF ( av == 0 )  THEN
     247                to_be_resorted => m_soil
     248             ELSE
     249                to_be_resorted => m_soil_av
    225250             ENDIF
    226251
     
    251276                DO  i = nxlg, nxrg
    252277                   DO  j = nysg, nyng
    253                       DO  k = nzb, nz_do3d
     278                      DO  k = nzb_do, nzt_do
    254279                         local_pf(i,j,k) = tend(k,j,i)
    255280                      ENDDO
     
    267292                   DO  i = nxl, nxr
    268293                      DO  j = nys, nyn
    269                          DO  k = nzb, nz_do3d
     294                         DO  k = nzb_do, nzt_do
    270295                            number_of_particles = prt_count(k,j,i)
    271296                            IF (number_of_particles <= 0)  CYCLE
     
    296321                DO  i = nxlg, nxrg
    297322                   DO  j = nysg, nyng
    298                       DO  k = nzb, nz_do3d
     323                      DO  k = nzb_do, nzt_do
    299324                         local_pf(i,j,k) = tend(k,j,i)
    300325                      ENDDO
     
    336361                   DO  i = nxlg, nxrg
    337362                      DO  j = nysg, nyng
    338                          DO  k = nzb, nz_do3d
     363                         DO  k = nzb_do, nzt_do
    339364                            local_pf(i,j,k) = pt(k,j,i) + l_d_cp *             &
    340365                                                          pt_d_t(k) *          &
     
    389414                   DO  i = nxl, nxr
    390415                      DO  j = nys, nyn
    391                          DO  k = nzb, nz_do3d
     416                         DO  k = nzb_do, nzt_do
    392417                            number_of_particles = prt_count(k,j,i)
    393418                            IF (number_of_particles <= 0)  CYCLE
     
    409434                DO  i = nxlg, nxrg
    410435                   DO  j = nysg, nyng
    411                       DO  k = nzb, nz_do3d
     436                      DO  k = nzb_do, nzt_do
    412437                         local_pf(i,j,k) = tend(k,j,i)
    413438                      ENDDO
     
    431456                DO  i = nxlg, nxrg
    432457                   DO  j = nysg, nyng
    433                       DO  k = nzb, nz_do3d
     458                      DO  k = nzb_do, nzt_do
    434459                         local_pf(i,j,k) = q(k,j,i) - ql(k,j,i)
    435460                      ENDDO
     
    462487             ENDIF
    463488
     489          CASE ( 't_soil' )
     490             nzb_do = nzb_soil
     491             nzt_do = nzt_soil
     492!
     493!--          For soil model quantities, it is required to re-allocate local_pf
     494             DEALLOCATE ( local_pf )
     495             ALLOCATE( local_pf(nxlg:nxrg,nysg:nyng,nzb_do:nzt_do) )
     496
     497             IF ( av == 0 )  THEN
     498                to_be_resorted => t_soil
     499             ELSE
     500                to_be_resorted => t_soil_av
     501             ENDIF
     502
    464503          CASE ( 'u' )
    465504             IF ( av == 0 )  THEN
     
    494533!--          User defined quantity
    495534             CALL user_data_output_3d( av, do3d(av,if), found, local_pf,       &
    496                                        nz_do3d )
     535                                       nzb_do, nzt_do )
    497536             resorted = .TRUE.
    498537
     
    510549          DO  i = nxlg, nxrg
    511550             DO  j = nysg, nyng
    512                 DO  k = nzb, nz_do3d
     551                DO  k = nzb_do, nzt_do
    513552                   local_pf(i,j,k) = to_be_resorted(k,j,i)
    514553                ENDDO
     
    531570          DO  i = 0, io_blocks-1
    532571             IF ( i == io_group )  THEN
    533                 WRITE ( 30 )  nxlg, nxrg, nysg, nyng, nzb, nz_do3d
    534                 WRITE ( 30 )  local_pf
     572                WRITE ( 30 )  nxlg, nxrg, nysg, nyng, nzb_do, nzt_do
     573                WRITE ( 30 )  local_pf(:,:,nzb_do:nzt_do)
    535574             ENDIF
    536575#if defined( __parallel )
     
    547586          IF ( nxr == nx  .AND.  nyn /= ny )  THEN
    548587             nc_stat = NF90_PUT_VAR( id_set_3d(av), id_var_do3d(av,if),  &
    549                                local_pf(nxl:nxr+1,nys:nyn,nzb:nz_do3d),  &
    550                 start = (/ nxl+1, nys+1, nzb+1, do3d_time_count(av) /),  &
    551                 count = (/ nxr-nxl+2, nyn-nys+1, nz_do3d-nzb+1, 1 /) )
     588                               local_pf(nxl:nxr+1,nys:nyn,nzb_do:nzt_do),    &
     589                start = (/ nxl+1, nys+1, nzb_do+1, do3d_time_count(av) /),  &
     590                count = (/ nxr-nxl+2, nyn-nys+1, nzt_do-nzb_do+1, 1 /) )
    552591          ELSEIF ( nxr /= nx  .AND.  nyn == ny )  THEN
    553592             nc_stat = NF90_PUT_VAR( id_set_3d(av), id_var_do3d(av,if),  &
    554                                local_pf(nxl:nxr,nys:nyn+1,nzb:nz_do3d),  &
    555                 start = (/ nxl+1, nys+1, nzb+1, do3d_time_count(av) /),  &
    556                 count = (/ nxr-nxl+1, nyn-nys+2, nz_do3d-nzb+1, 1 /) )
     593                               local_pf(nxl:nxr,nys:nyn+1,nzb_do:nzt_do),    &
     594                start = (/ nxl+1, nys+1, nzb_do+1, do3d_time_count(av) /),  &
     595                count = (/ nxr-nxl+1, nyn-nys+2, nzt_do-nzb_do+1, 1 /) )
    557596          ELSEIF ( nxr == nx  .AND.  nyn == ny )  THEN
    558597             nc_stat = NF90_PUT_VAR( id_set_3d(av), id_var_do3d(av,if),  &
    559                              local_pf(nxl:nxr+1,nys:nyn+1,nzb:nz_do3d),  &
    560                 start = (/ nxl+1, nys+1, nzb+1, do3d_time_count(av) /),  &
    561                 count = (/ nxr-nxl+2, nyn-nys+2, nz_do3d-nzb+1, 1 /) )
     598                             local_pf(nxl:nxr+1,nys:nyn+1,nzb_do:nzt_do  ),  &
     599                start = (/ nxl+1, nys+1, nzb_do+1, do3d_time_count(av) /),  &
     600                count = (/ nxr-nxl+2, nyn-nys+2, nzt_do-nzb_do+1, 1 /) )
    562601          ELSE
    563602             nc_stat = NF90_PUT_VAR( id_set_3d(av), id_var_do3d(av,if),  &
    564                                  local_pf(nxl:nxr,nys:nyn,nzb:nz_do3d),  &
    565                 start = (/ nxl+1, nys+1, nzb+1, do3d_time_count(av) /),  &
    566                 count = (/ nxr-nxl+1, nyn-nys+1, nz_do3d-nzb+1, 1 /) )
     603                                 local_pf(nxl:nxr,nys:nyn,nzb_do:nzt_do),    &
     604                start = (/ nxl+1, nys+1, nzb_do+1, do3d_time_count(av) /),  &
     605                count = (/ nxr-nxl+1, nyn-nys+1, nzt_do-nzb_do+1, 1 /) )
    567606          ENDIF
    568607          CALL handle_netcdf_error( 'data_output_3d', 386 )
     
    572611#if defined( __netcdf )
    573612       nc_stat = NF90_PUT_VAR( id_set_3d(av), id_var_do3d(av,if),        &
    574                          local_pf(nxl:nxr+1,nys:nyn+1,nzb:nz_do3d),      &
     613                         local_pf(nxl:nxr+1,nys:nyn+1,nzb_do:nzt_do),        &
    575614                         start = (/ 1, 1, 1, do3d_time_count(av) /),     &
    576                          count = (/ nx+2, ny+2, nz_do3d-nzb+1, 1 /) )
     615                         count = (/ nx+2, ny+2, nzt_do-nzb_do+1, 1 /) )
    577616       CALL handle_netcdf_error( 'data_output_3d', 446 )
    578617#endif
     
    581620       if = if + 1
    582621
     622!
     623!--    Deallocate temporary array
     624       DEALLOCATE ( local_pf )
     625
    583626    ENDDO
    584 
    585 !
    586 !-- Deallocate temporary array.
    587     DEALLOCATE( local_pf )
    588 
    589627
    590628    CALL cpu_log( log_point(14), 'data_output_3d', 'stop' )
Note: See TracChangeset for help on using the changeset viewer.