Ignore:
Timestamp:
Sep 28, 2020 5:42:58 PM (4 years ago)
Author:
suehring
Message:

Bugfix, correct mapping of RRTMG heating rates, as well as incoming/outgoing radiation onto the topography-following grid; add fill values to the radiation output

File:
1 edited

Legend:

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

    r4694 r4708  
    2828! -----------------
    2929! $Id$
     30! - Bugfix, correct mapping of RRTMG heating rates, as well as incoming/outgoing
     31!   radiation onto the topography-following grid
     32! - add fill values to the output
     33!
     34! 4694 2020-09-23 15:09:19Z pavelkrc
    3035! Bugfix for tracing of maximum radiative fluxes
    3136!
     
    401406    USE indices,                                                               &
    402407        ONLY:  nnx, nny, nx, nxl, nxlg, nxr, nxrg, ny, nyn, nyng, nys, nysg,   &
    403                nzb, nzt, topo_top_ind
     408               nzb, nzt, topo_top_ind, wall_flags_total_0
    404409
    405410    USE, INTRINSIC :: iso_c_binding
     
    43904395!
    43914396!--          Save fluxes
    4392              DO k = nzb, nzt+1
    4393                 rad_lw_in(k,:,:)  = rrtm_lwdflx(0,k)
    4394                 rad_lw_out(k,:,:) = rrtm_lwuflx(0,k)
     4397             DO  i = nxl, nxr
     4398                DO  j = nys, nyn
     4399                   k_topo_l = topo_top_ind(j,i,0)
     4400                   DO k = k_topo_l, nzt+1
     4401                      rad_lw_in(k,j,i)  = rrtm_lwdflx(0,k-k_topo_l+k_topo)
     4402                      rad_lw_out(k,j,i) = rrtm_lwuflx(0,k-k_topo_l+k_topo)
     4403                   ENDDO
     4404                ENDDO
    43954405             ENDDO
    4396              rad_lw_in_diff(:,:) = rad_lw_in(k_topo,:,:)
     4406             rad_lw_in_diff(:,:) = rrtm_lwdflx(0,k_topo)
    43974407!
    43984408!--          Save heating rates (convert from K/d to K/h).
     
    44044414                   k_topo_l = topo_top_ind(j,i,0)
    44054415                   DO k = k_topo_l+1, nzt+1
    4406                       rad_lw_hr(k,j,i)     = rrtm_lwhr(0,k-k_topo_l)  * d_hours_day
    4407                       rad_lw_cs_hr(k,j,i)  = rrtm_lwhrc(0,k-k_topo_l) * d_hours_day
     4416                      rad_lw_hr(k,j,i)     = rrtm_lwhr(0,k-k_topo_l+k_topo)  * d_hours_day
     4417                      rad_lw_cs_hr(k,j,i)  = rrtm_lwhrc(0,k-k_topo_l+k_topo) * d_hours_day
    44084418                   ENDDO
    44094419                ENDDO
     
    44994509!
    45004510!--          Save radiation fluxes for the entire depth of the model domain
    4501              DO k = nzb, nzt+1
    4502                 rad_sw_in(k,:,:)  = rrtm_swdflx(0,k)
    4503                 rad_sw_out(k,:,:) = rrtm_swuflx(0,k)
     4511             DO  i = nxl, nxr
     4512                DO  j = nys, nyn
     4513                   k_topo_l = topo_top_ind(j,i,0)
     4514                   DO k = k_topo_l, nzt+1
     4515                      rad_sw_in(k,j,i)  = rrtm_swdflx(0,k-k_topo_l+k_topo)
     4516                      rad_sw_out(k,j,i) = rrtm_swuflx(0,k-k_topo_l+k_topo)
     4517                   ENDDO
     4518                ENDDO
    45044519             ENDDO
    45054520!--          Save direct and diffuse SW radiation at the surface (required by RTM)
     
    45094524!
    45104525!--          Save heating rates (convert from K/d to K/s)
    4511              DO k = nzb+1, nzt+1
    4512                 rad_sw_hr(k,:,:)     = rrtm_swhr(0,k)  * d_hours_day
    4513                 rad_sw_cs_hr(k,:,:)  = rrtm_swhrc(0,k) * d_hours_day
     4526             DO  i = nxl, nxr
     4527                DO  j = nys, nyn
     4528                   k_topo_l = topo_top_ind(j,i,0)
     4529                   DO k = k_topo_l+1, nzt+1
     4530                      rad_sw_hr(k,j,i)     = rrtm_swhr(0,k-k_topo_l+k_topo)  * d_hours_day
     4531                      rad_sw_cs_hr(k,j,i)  = rrtm_swhrc(0,k-k_topo_l+k_topo) * d_hours_day
     4532                   ENDDO
     4533                ENDDO
    45144534             ENDDO
    45154535!
     
    45234543!
    45244544!--    RRTMG is called for each (j,i) grid point separately, starting at the
    4525 !--    highest topography level. Here no RTM is used since average_radiation is false
     4545!--    highest topography level. Here no RTM is used since average_radiation is false.
     4546!--    In fact, this branch is only called for homogeneous flat terrain so that the topography-top
     4547!--    index is actually alwasy zero.
    45264548       ELSE
    45274549!
     
    46944716                ENDDO
    46954717!
    4696 !--             Obtain topography top index (lower bound of RRTMG)
     4718!--             Obtain topography top index (lower bound of RRTMG). Is actually always zero.
    46974719                k_topo = topo_top_ind(j,i,0)
    46984720
     
    58295851!--    Calculate tendency based on heating rate
    58305852       DO k = nzb+1, nzt+1
    5831           tend(k,j,i) = tend(k,j,i) + (rad_lw_hr(k,j,i) + rad_sw_hr(k,j,i))    &
    5832                                          * d_exner(k) * d_seconds_hour
     5853          tend(k,j,i) = tend(k,j,i) + (rad_lw_hr(k,j,i) + rad_sw_hr(k,j,i))                        &
     5854                                         * d_exner(k) * d_seconds_hour                             &
     5855                                         * MERGE( 1.0_wp, 0.0_wp,                                  &
     5856                                                  BTEST( wall_flags_total_0(k,j,i), 0 ) )
    58335857       ENDDO
    58345858
     
    58485872 SUBROUTINE radiation_tendency ( tend )
    58495873
    5850     USE indices,                                                               &
    5851         ONLY:  nxl, nxr, nyn, nys
    5852 
    58535874    IMPLICIT NONE
    58545875
     
    58635884          DO  j = nys, nyn
    58645885             DO k = nzb+1, nzt+1
    5865                 tend(k,j,i) = tend(k,j,i) + ( rad_lw_hr(k,j,i)                 &
    5866                                           +  rad_sw_hr(k,j,i) ) * d_exner(k)   &
    5867                                           * d_seconds_hour
     5886                tend(k,j,i) = tend(k,j,i) + ( rad_lw_hr(k,j,i)                                      &
     5887                                          + rad_sw_hr(k,j,i) ) * d_exner(k)                         &
     5888                                          * d_seconds_hour                                          &
     5889                                          * MERGE( 1.0_wp, 0.0_wp,                                  &
     5890                                                   BTEST( wall_flags_total_0(k,j,i), 0 ) )
    58685891             ENDDO
    58695892          ENDDO
     
    1113711160!------------------------------------------------------------------------------!
    1113811161 SUBROUTINE radiation_data_output_2d( av, variable, found, grid, mode,         &
    11139                                       local_pf, two_d, nzb_do, nzt_do )
     11162                                      local_pf, two_d, nzb_do, nzt_do, fill_value )
    1114011163
    1114111164    USE indices
     
    1116111184    LOGICAL      ::  two_d !< flag parameter that indicates 2D variables (horizontal cross sections)
    1116211185
    11163     REAL(wp) ::  fill_value = -999.0_wp    !< value for the _FillValue attribute
     11186    REAL(wp) ::  fill_value !< value for the _FillValue attribute
    1116411187
    1116511188    REAL(wp), DIMENSION(nxl:nxr,nys:nyn,nzb_do:nzt_do) ::  local_pf !<
     
    1134011363                DO  j = nys, nyn
    1134111364                   DO  k = nzb_do, nzt_do
    11342                       local_pf(i,j,k) = rad_lw_in(k,j,i)
     11365                      local_pf(i,j,k) = MERGE( rad_lw_in(k,j,i), fill_value,                       &
     11366                                               BTEST( wall_flags_total_0(k,j,i), 0 ) )
    1134311367                   ENDDO
    1134411368                ENDDO
     
    1136411388                DO  j = nys, nyn
    1136511389                   DO  k = nzb_do, nzt_do
    11366                       local_pf(i,j,k) = rad_lw_out(k,j,i)
     11390                      local_pf(i,j,k) = MERGE( rad_lw_out(k,j,i), fill_value,                      &
     11391                                               BTEST( wall_flags_total_0(k,j,i), 0 ) )
    1136711392                   ENDDO
    1136811393                ENDDO
     
    1138811413                DO  j = nys, nyn
    1138911414                   DO  k = nzb_do, nzt_do
    11390                       local_pf(i,j,k) = rad_lw_cs_hr(k,j,i)
     11415                      local_pf(i,j,k) = MERGE( rad_lw_cs_hr(k,j,i), fill_value,                    &
     11416                                               BTEST( wall_flags_total_0(k,j,i), 0 ) )
    1139111417                   ENDDO
    1139211418                ENDDO
     
    1141211438                DO  j = nys, nyn
    1141311439                   DO  k = nzb_do, nzt_do
    11414                       local_pf(i,j,k) = rad_lw_hr(k,j,i)
     11440                      local_pf(i,j,k) = MERGE( rad_lw_hr(k,j,i), fill_value,                       &
     11441                                               BTEST( wall_flags_total_0(k,j,i), 0 ) )
    1141511442                   ENDDO
    1141611443                ENDDO
     
    1143611463                DO  j = nys, nyn
    1143711464                   DO  k = nzb_do, nzt_do
    11438                       local_pf(i,j,k) = rad_sw_in(k,j,i)
     11465                      local_pf(i,j,k) = MERGE( rad_sw_in(k,j,i), fill_value,                       &
     11466                                               BTEST( wall_flags_total_0(k,j,i), 0 ) )
    1143911467                   ENDDO
    1144011468                ENDDO
     
    1146011488                DO  j = nys, nyn
    1146111489                   DO  k = nzb_do, nzt_do
    11462                       local_pf(i,j,k) = rad_sw_out(k,j,i)
     11490                      local_pf(i,j,k) = MERGE( rad_sw_out(k,j,i), fill_value,                      &
     11491                                               BTEST( wall_flags_total_0(k,j,i), 0 ) )
    1146311492                   ENDDO
    1146411493                ENDDO
     
    1148411513                DO  j = nys, nyn
    1148511514                   DO  k = nzb_do, nzt_do
    11486                       local_pf(i,j,k) = rad_sw_cs_hr(k,j,i)
     11515                      local_pf(i,j,k) = MERGE( rad_sw_cs_hr(k,j,i), fill_value,                    &
     11516                                               BTEST( wall_flags_total_0(k,j,i), 0 ) )
    1148711517                   ENDDO
    1148811518                ENDDO
     
    1150811538                DO  j = nys, nyn
    1150911539                   DO  k = nzb_do, nzt_do
    11510                       local_pf(i,j,k) = rad_sw_hr(k,j,i)
     11540                      local_pf(i,j,k) = MERGE( rad_sw_hr(k,j,i), fill_value,                       &
     11541                                               BTEST( wall_flags_total_0(k,j,i), 0 ) )
    1151111542                   ENDDO
    1151211543                ENDDO
     
    1154211573!> Subroutine defining 3D output variables
    1154311574!------------------------------------------------------------------------------!
    11544  SUBROUTINE radiation_data_output_3d( av, variable, found, local_pf, nzb_do, nzt_do )
     11575 SUBROUTINE radiation_data_output_3d( av, variable, found, local_pf, fill_value, nzb_do, nzt_do )
    1154511576
    1154611577
     
    1156111592    LOGICAL      ::  found       !<
    1156211593
    11563     REAL(wp)     ::  fill_value = -999.0_wp    !< value for the _FillValue attribute
     11594    REAL(wp)     ::  fill_value !< value for the _FillValue attribute
    1156411595
    1156511596    REAL(sp), DIMENSION(nxl:nxr,nys:nyn,nzb_do:nzt_do) ::  local_pf !<
     
    1162611657               DO  j = nys, nyn
    1162711658                  DO  k = nzb_do, nzt_do
    11628                      local_pf(i,j,k) = rad_sw_in(k,j,i)
     11659                     local_pf(i,j,k) = MERGE( rad_sw_in(k,j,i), fill_value,                        &
     11660                                              BTEST( wall_flags_total_0(k,j,i), 0 ) )
    1162911661                  ENDDO
    1163011662               ENDDO
     
    1164911681               DO  j = nys, nyn
    1165011682                  DO  k = nzb_do, nzt_do
    11651                      local_pf(i,j,k) = rad_sw_out(k,j,i)
     11683                     local_pf(i,j,k) = MERGE( rad_sw_out(k,j,i), fill_value,                       &
     11684                                              BTEST( wall_flags_total_0(k,j,i), 0 ) )
    1165211685                  ENDDO
    1165311686               ENDDO
     
    1167211705               DO  j = nys, nyn
    1167311706                  DO  k = nzb_do, nzt_do
    11674                      local_pf(i,j,k) = rad_sw_cs_hr(k,j,i)
     11707                     local_pf(i,j,k) = MERGE( rad_sw_cs_hr(k,j,i), fill_value,                     &
     11708                                              BTEST( wall_flags_total_0(k,j,i), 0 ) )
    1167511709                  ENDDO
    1167611710               ENDDO
     
    1169511729               DO  j = nys, nyn
    1169611730                  DO  k = nzb_do, nzt_do
    11697                      local_pf(i,j,k) = rad_sw_hr(k,j,i)
     11731                     local_pf(i,j,k) = MERGE( rad_sw_hr(k,j,i), fill_value,                        &
     11732                                              BTEST( wall_flags_total_0(k,j,i), 0 ) )
    1169811733                  ENDDO
    1169911734               ENDDO
     
    1171811753               DO  j = nys, nyn
    1171911754                  DO  k = nzb_do, nzt_do
    11720                      local_pf(i,j,k) = rad_lw_in(k,j,i)
     11755                     local_pf(i,j,k) = MERGE( rad_lw_in(k,j,i), fill_value,                        &
     11756                                              BTEST( wall_flags_total_0(k,j,i), 0 ) )
    1172111757                  ENDDO
    1172211758               ENDDO
     
    1174111777               DO  j = nys, nyn
    1174211778                  DO  k = nzb_do, nzt_do
    11743                      local_pf(i,j,k) = rad_lw_out(k,j,i)
     11779                     local_pf(i,j,k) = MERGE( rad_lw_out(k,j,i), fill_value,                       &
     11780                                              BTEST( wall_flags_total_0(k,j,i), 0 ) )
    1174411781                  ENDDO
    1174511782               ENDDO
     
    1176411801               DO  j = nys, nyn
    1176511802                  DO  k = nzb_do, nzt_do
    11766                      local_pf(i,j,k) = rad_lw_cs_hr(k,j,i)
     11803                     local_pf(i,j,k) = MERGE( rad_lw_cs_hr(k,j,i), fill_value,                     &
     11804                                              BTEST( wall_flags_total_0(k,j,i), 0 ) )
    1176711805                  ENDDO
    1176811806               ENDDO
     
    1178711825               DO  j = nys, nyn
    1178811826                  DO  k = nzb_do, nzt_do
    11789                      local_pf(i,j,k) = rad_lw_hr(k,j,i)
     11827                     local_pf(i,j,k) = MERGE( rad_lw_hr(k,j,i), fill_value,                        &
     11828                                              BTEST( wall_flags_total_0(k,j,i), 0 ) )
    1179011829                  ENDDO
    1179111830               ENDDO
     
    1222712266                DO  k = 1, mask_size_l(mid,3)
    1222812267                   local_pf(i,j,k) =  to_be_resorted(mask_k(mid,k), &
    12229                                       mask_j(mid,j),mask_i(mid,i))
     12268                                                     mask_j(mid,j), &
     12269                                                     mask_i(mid,i))
    1223012270                ENDDO
    1223112271             ENDDO
Note: See TracChangeset for help on using the changeset viewer.