Ignore:
Timestamp:
Oct 26, 2018 6:25:44 PM (6 years ago)
Author:
gronemeier
Message:

new: terrain-following masked output; bugfixes: increase vertical dimension of gamma_w_green_sat by 1, add checks for masked output for chemistry_model and radiation_model, reordered calls to xxx_define_netcdf_grid in masked output part

File:
1 edited

Legend:

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

    r3424 r3435  
    2828! -----------------
    2929! $Id$
     30! - workaround: return unit=illegal in check_data_output for certain variables
     31!   when check called from init_masks
     32! - Use pointer in masked output to reduce code redundancies
     33! - Add terrain-following masked output
     34!
     35! 3424 2018-10-25 07:29:10Z gronemeier
    3036! bugfix: add rad_lw_in, rad_lw_out, rad_sw_out to radiation_check_data_output
    3137!
     
    12501256                 'rrtm_asdir*', 'rad_lw_in*', 'rad_lw_out*', 'rad_sw_in*',     &
    12511257                 'rad_sw_out*')
     1258             IF ( i == 0 .AND. ilen == 0 .AND. k == 0)  THEN
     1259                ! Workaround for masked output (calls with i=ilen=k=0)
     1260                unit = 'illegal'
     1261                RETURN
     1262             ENDIF
    12521263             IF ( k == 0  .OR.  data_output(i)(ilen-2:ilen) /= '_xy' )  THEN
    12531264                message_string = 'illegal value for data_output: "' //         &
     
    12811292
    12821293          CASE ( 'rad_mrt', 'rad_mrt_sw', 'rad_mrt_lw'  )
     1294
     1295             IF ( i == 0 .AND. ilen == 0 .AND. k == 0)  THEN
     1296                ! Workaround for masked output (calls with i=ilen=k=0)
     1297                unit = 'illegal'
     1298                RETURN
     1299             ENDIF
     1300
    12831301             IF ( .NOT.  radiation ) THEN
    12841302                message_string = 'output of "' // TRIM( var ) // '" require'&
     
    88908908    found  = .TRUE.
    88918909
    8892 
    88938910!
    88948911!-- Check for the grid
     
    96349651    CHARACTER (LEN=*) ::  variable   !<
    96359652
    9636     INTEGER(iwp) ::  av   !<
    9637     INTEGER(iwp) ::  i    !<
    9638     INTEGER(iwp) ::  j    !<
    9639     INTEGER(iwp) ::  k    !<
    9640 
    9641     LOGICAL ::  found     !<
     9653    CHARACTER(LEN=5) ::  grid        !< flag to distinquish between staggered grids
     9654
     9655    INTEGER(iwp) ::  av              !<
     9656    INTEGER(iwp) ::  i               !<
     9657    INTEGER(iwp) ::  j               !<
     9658    INTEGER(iwp) ::  k               !<
     9659    INTEGER(iwp) ::  topo_top_ind    !< k index of highest horizontal surface
     9660
     9661    LOGICAL ::  found                !< true if output array was found
     9662    LOGICAL ::  resorted             !< true if array is resorted
     9663
    96429664
    96439665    REAL(wp),                                                                  &
     
    96459667          local_pf   !<
    96469668
    9647 
    9648     found = .TRUE.
     9669    REAL(wp), DIMENSION(:,:,:), POINTER ::  to_be_resorted  !< points to array which needs to be resorted for output
     9670
     9671
     9672    found    = .TRUE.
     9673    grid     = 's'
     9674    resorted = .FALSE.
    96499675
    96509676    SELECT CASE ( TRIM( variable ) )
     
    96539679       CASE ( 'rad_lw_in' )
    96549680          IF ( av == 0 )  THEN
    9655              DO  i = 1, mask_size_l(mid,1)
    9656                 DO  j = 1, mask_size_l(mid,2)
    9657                    DO  k = 1, mask_size_l(mid,3)
    9658                        local_pf(i,j,k) = rad_lw_in(mask_k(mid,k),              &
    9659                                             mask_j(mid,j),mask_i(mid,i))
    9660                     ENDDO
    9661                  ENDDO
    9662               ENDDO
     9681             to_be_resorted => rad_lw_in
    96639682          ELSE
    9664              DO  i = 1, mask_size_l(mid,1)
    9665                 DO  j = 1, mask_size_l(mid,2)
    9666                    DO  k = 1, mask_size_l(mid,3)
    9667                        local_pf(i,j,k) = rad_lw_in_av(mask_k(mid,k),           &
    9668                                                mask_j(mid,j),mask_i(mid,i))
    9669                    ENDDO
     9683             to_be_resorted => rad_lw_in_av
     9684          ENDIF
     9685
     9686       CASE ( 'rad_lw_out' )
     9687          IF ( av == 0 )  THEN
     9688             to_be_resorted => rad_lw_out
     9689          ELSE
     9690             to_be_resorted => rad_lw_out_av
     9691          ENDIF
     9692
     9693       CASE ( 'rad_lw_cs_hr' )
     9694          IF ( av == 0 )  THEN
     9695             to_be_resorted => rad_lw_cs_hr
     9696          ELSE
     9697             to_be_resorted => rad_lw_cs_hr_av
     9698          ENDIF
     9699
     9700       CASE ( 'rad_lw_hr' )
     9701          IF ( av == 0 )  THEN
     9702             to_be_resorted => rad_lw_hr
     9703          ELSE
     9704             to_be_resorted => rad_lw_hr_av
     9705          ENDIF
     9706
     9707       CASE ( 'rad_sw_in' )
     9708          IF ( av == 0 )  THEN
     9709             to_be_resorted => rad_sw_in
     9710          ELSE
     9711             to_be_resorted => rad_sw_in_av
     9712          ENDIF
     9713
     9714       CASE ( 'rad_sw_out' )
     9715          IF ( av == 0 )  THEN
     9716             to_be_resorted => rad_sw_out
     9717          ELSE
     9718             to_be_resorted => rad_sw_out_av
     9719          ENDIF
     9720
     9721       CASE ( 'rad_sw_cs_hr' )
     9722          IF ( av == 0 )  THEN
     9723             to_be_resorted => rad_sw_cs_hr
     9724          ELSE
     9725             to_be_resorted => rad_sw_cs_hr_av
     9726          ENDIF
     9727
     9728       CASE ( 'rad_sw_hr' )
     9729          IF ( av == 0 )  THEN
     9730             to_be_resorted => rad_sw_hr
     9731          ELSE
     9732             to_be_resorted => rad_sw_hr_av
     9733          ENDIF
     9734
     9735       CASE DEFAULT
     9736          found = .FALSE.
     9737
     9738    END SELECT
     9739
     9740!
     9741!-- Resort the array to be output, if not done above
     9742    IF ( .NOT. resorted )  THEN
     9743       IF ( .NOT. mask_surface(mid) )  THEN
     9744!
     9745!--       Default masked output
     9746          DO  i = 1, mask_size_l(mid,1)
     9747             DO  j = 1, mask_size_l(mid,2)
     9748                DO  k = 1, mask_size_l(mid,3)
     9749                   local_pf(i,j,k) =  to_be_resorted(mask_k(mid,k), &
     9750                                      mask_j(mid,j),mask_i(mid,i))
    96709751                ENDDO
    96719752             ENDDO
    9672           ENDIF
    9673 
    9674        CASE ( 'rad_lw_out' )
    9675           IF ( av == 0 )  THEN
    9676              DO  i = 1, mask_size_l(mid,1)
    9677                 DO  j = 1, mask_size_l(mid,2)
    9678                    DO  k = 1, mask_size_l(mid,3)
    9679                        local_pf(i,j,k) = rad_lw_out(mask_k(mid,k),             &
    9680                                             mask_j(mid,j),mask_i(mid,i))
    9681                     ENDDO
    9682                  ENDDO
    9683               ENDDO
    9684           ELSE
    9685              DO  i = 1, mask_size_l(mid,1)
    9686                 DO  j = 1, mask_size_l(mid,2)
    9687                    DO  k = 1, mask_size_l(mid,3)
    9688                        local_pf(i,j,k) = rad_lw_out_av(mask_k(mid,k),          &
    9689                                                mask_j(mid,j),mask_i(mid,i))
    9690                    ENDDO
     9753          ENDDO
     9754
     9755       ELSE
     9756!
     9757!--       Terrain-following masked output
     9758          DO  i = 1, mask_size_l(mid,1)
     9759             DO  j = 1, mask_size_l(mid,2)
     9760!
     9761!--             Get k index of highest horizontal surface
     9762                topo_top_ind = get_topography_top_index_ji( mask_j(mid,j), &
     9763                                                            mask_i(mid,i), &
     9764                                                            grid )
     9765!
     9766!--             Save output array
     9767                DO  k = 1, mask_size_l(mid,3)
     9768                   local_pf(i,j,k) = to_be_resorted(                       &
     9769                                          MIN( topo_top_ind+mask_k(mid,k), &
     9770                                               nzt+1 ),                    &
     9771                                          mask_j(mid,j),                   &
     9772                                          mask_i(mid,i)                     )
    96919773                ENDDO
    96929774             ENDDO
    9693           ENDIF
    9694 
    9695        CASE ( 'rad_lw_cs_hr' )
    9696           IF ( av == 0 )  THEN
    9697              DO  i = 1, mask_size_l(mid,1)
    9698                 DO  j = 1, mask_size_l(mid,2)
    9699                    DO  k = 1, mask_size_l(mid,3)
    9700                        local_pf(i,j,k) = rad_lw_cs_hr(mask_k(mid,k),           &
    9701                                             mask_j(mid,j),mask_i(mid,i))
    9702                     ENDDO
    9703                  ENDDO
    9704               ENDDO
    9705           ELSE
    9706              DO  i = 1, mask_size_l(mid,1)
    9707                 DO  j = 1, mask_size_l(mid,2)
    9708                    DO  k = 1, mask_size_l(mid,3)
    9709                        local_pf(i,j,k) = rad_lw_cs_hr_av(mask_k(mid,k),        &
    9710                                                mask_j(mid,j),mask_i(mid,i))
    9711                    ENDDO
    9712                 ENDDO
    9713              ENDDO
    9714           ENDIF
    9715 
    9716        CASE ( 'rad_lw_hr' )
    9717           IF ( av == 0 )  THEN
    9718              DO  i = 1, mask_size_l(mid,1)
    9719                 DO  j = 1, mask_size_l(mid,2)
    9720                    DO  k = 1, mask_size_l(mid,3)
    9721                        local_pf(i,j,k) = rad_lw_hr(mask_k(mid,k),              &
    9722                                             mask_j(mid,j),mask_i(mid,i))
    9723                     ENDDO
    9724                  ENDDO
    9725               ENDDO
    9726           ELSE
    9727              DO  i = 1, mask_size_l(mid,1)
    9728                 DO  j = 1, mask_size_l(mid,2)
    9729                    DO  k = 1, mask_size_l(mid,3)
    9730                        local_pf(i,j,k) = rad_lw_hr_av(mask_k(mid,k),           &
    9731                                                mask_j(mid,j),mask_i(mid,i))
    9732                    ENDDO
    9733                 ENDDO
    9734              ENDDO
    9735           ENDIF
    9736 
    9737        CASE ( 'rad_sw_in' )
    9738           IF ( av == 0 )  THEN
    9739              DO  i = 1, mask_size_l(mid,1)
    9740                 DO  j = 1, mask_size_l(mid,2)
    9741                    DO  k = 1, mask_size_l(mid,3)
    9742                        local_pf(i,j,k) = rad_sw_in(mask_k(mid,k),              &
    9743                                             mask_j(mid,j),mask_i(mid,i))
    9744                     ENDDO
    9745                  ENDDO
    9746               ENDDO
    9747           ELSE
    9748              DO  i = 1, mask_size_l(mid,1)
    9749                 DO  j = 1, mask_size_l(mid,2)
    9750                    DO  k = 1, mask_size_l(mid,3)
    9751                        local_pf(i,j,k) = rad_sw_in_av(mask_k(mid,k),           &
    9752                                                mask_j(mid,j),mask_i(mid,i))
    9753                    ENDDO
    9754                 ENDDO
    9755              ENDDO
    9756           ENDIF
    9757 
    9758        CASE ( 'rad_sw_out' )
    9759           IF ( av == 0 )  THEN
    9760              DO  i = 1, mask_size_l(mid,1)
    9761                 DO  j = 1, mask_size_l(mid,2)
    9762                    DO  k = 1, mask_size_l(mid,3)
    9763                        local_pf(i,j,k) = rad_sw_out(mask_k(mid,k),             &
    9764                                             mask_j(mid,j),mask_i(mid,i))
    9765                     ENDDO
    9766                  ENDDO
    9767               ENDDO
    9768           ELSE
    9769              DO  i = 1, mask_size_l(mid,1)
    9770                 DO  j = 1, mask_size_l(mid,2)
    9771                    DO  k = 1, mask_size_l(mid,3)
    9772                        local_pf(i,j,k) = rad_sw_out_av(mask_k(mid,k),          &
    9773                                                mask_j(mid,j),mask_i(mid,i))
    9774                    ENDDO
    9775                 ENDDO
    9776              ENDDO
    9777           ENDIF
    9778 
    9779        CASE ( 'rad_sw_cs_hr' )
    9780           IF ( av == 0 )  THEN
    9781              DO  i = 1, mask_size_l(mid,1)
    9782                 DO  j = 1, mask_size_l(mid,2)
    9783                    DO  k = 1, mask_size_l(mid,3)
    9784                        local_pf(i,j,k) = rad_sw_cs_hr(mask_k(mid,k),           &
    9785                                             mask_j(mid,j),mask_i(mid,i))
    9786                     ENDDO
    9787                  ENDDO
    9788               ENDDO
    9789           ELSE
    9790              DO  i = 1, mask_size_l(mid,1)
    9791                 DO  j = 1, mask_size_l(mid,2)
    9792                    DO  k = 1, mask_size_l(mid,3)
    9793                        local_pf(i,j,k) = rad_sw_cs_hr_av(mask_k(mid,k),        &
    9794                                                mask_j(mid,j),mask_i(mid,i))
    9795                    ENDDO
    9796                 ENDDO
    9797              ENDDO
    9798           ENDIF
    9799 
    9800        CASE ( 'rad_sw_hr' )
    9801           IF ( av == 0 )  THEN
    9802              DO  i = 1, mask_size_l(mid,1)
    9803                 DO  j = 1, mask_size_l(mid,2)
    9804                    DO  k = 1, mask_size_l(mid,3)
    9805                        local_pf(i,j,k) = rad_sw_hr(mask_k(mid,k),              &
    9806                                             mask_j(mid,j),mask_i(mid,i))
    9807                     ENDDO
    9808                  ENDDO
    9809               ENDDO
    9810           ELSE
    9811              DO  i = 1, mask_size_l(mid,1)
    9812                 DO  j = 1, mask_size_l(mid,2)
    9813                    DO  k = 1, mask_size_l(mid,3)
    9814                        local_pf(i,j,k) = rad_sw_hr_av(mask_k(mid,k),           &
    9815                                                mask_j(mid,j),mask_i(mid,i))
    9816                    ENDDO
    9817                 ENDDO
    9818              ENDDO
    9819           ENDIF
    9820 
    9821        CASE DEFAULT
    9822           found = .FALSE.
    9823 
    9824     END SELECT
     9775          ENDDO
     9776
     9777       ENDIF
     9778    ENDIF
     9779
    98259780
    98269781
Note: See TracChangeset for help on using the changeset viewer.