Ignore:
Timestamp:
Jul 27, 2016 1:28:04 PM (8 years ago)
Author:
maronga
Message:

further modularization of land surface model (2D/3D output and restart data). Bugfix for restart runs without land surface model

File:
1 edited

Legend:

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

    r1973 r1976  
    1919! Current revisions:
    2020! -----------------
    21 !
     21! Parts of the code have been reformatted. Use of radiation model output is
     22! generalized and simplified. Added more output quantities due to modularization
    2223!
    2324! Former revisions:
     
    178179
    179180    USE radiation_model_mod,                                                   &
    180         ONLY:  force_radiation_call, radiation_scheme, rad_net, rad_sw_in,     &
    181                rad_lw_out, rad_lw_out_change_0, sigma_sb,                      &
    182                unscheduled_radiation_calls
     181        ONLY:  force_radiation_call, rad_net, rad_sw_in, rad_lw_out,           &
     182               rad_lw_out_change_0, unscheduled_radiation_calls
    183183       
    184 #if defined ( __rrtmg )
    185     USE radiation_model_mod,                                                   &
    186         ONLY:  rrtm_idrv
    187 #endif
    188 
    189184    USE statistics,                                                            &
    190185        ONLY:  hom, statistic_regions
     
    636631    END INTERFACE lsm_read_restart_data
    637632
    638 
    639633    INTERFACE lsm_last_actions
    640634       MODULE PROCEDURE lsm_last_actions
     
    648642!> Check data output for land surface model
    649643!------------------------------------------------------------------------------!
    650     SUBROUTINE lsm_check_data_output( var, unit, i, ilen, k )
     644 SUBROUTINE lsm_check_data_output( var, unit, i, ilen, k )
    651645 
    652646 
    653        USE control_parameters,                                                 &
    654            ONLY: data_output, message_string
    655 
    656        IMPLICIT NONE
    657 
    658        CHARACTER (LEN=*) ::  unit     !<
    659        CHARACTER (LEN=*) ::  var !<
    660 
    661        INTEGER(iwp) :: i
    662        INTEGER(iwp) :: ilen   
    663        INTEGER(iwp) :: k
    664 
    665        SELECT CASE ( TRIM( var ) )
    666 
    667           CASE ( 'm_soil' )
    668              IF (  .NOT.  land_surface )  THEN
    669                 message_string = 'output of "' // TRIM( var ) // '" requi' //  &
    670                          'res land_surface = .TRUE.'
    671                 CALL message( 'check_parameters', 'PA0404', 1, 2, 0, 6, 0 )
    672              ENDIF
    673              unit = 'm3/m3'
     647    USE control_parameters,                                                 &
     648        ONLY:  data_output, message_string
     649
     650    IMPLICIT NONE
     651
     652    CHARACTER (LEN=*) ::  unit     !<
     653    CHARACTER (LEN=*) ::  var !<
     654
     655    INTEGER(iwp) :: i
     656    INTEGER(iwp) :: ilen   
     657    INTEGER(iwp) :: k
     658
     659    SELECT CASE ( TRIM( var ) )
     660
     661       CASE ( 'm_soil' )
     662          IF (  .NOT.  land_surface )  THEN
     663             message_string = 'output of "' // TRIM( var ) // '" requi' //  &
     664                      'res land_surface = .TRUE.'
     665             CALL message( 'check_parameters', 'PA0404', 1, 2, 0, 6, 0 )
     666          ENDIF
     667          unit = 'm3/m3'
     668           
     669       CASE ( 't_soil' )
     670          IF (  .NOT.  land_surface )  THEN
     671             message_string = 'output of "' // TRIM( var ) // '" requi' //  &
     672                      'res land_surface = .TRUE.'
     673             CALL message( 'check_parameters', 'PA0404', 1, 2, 0, 6, 0 )
     674          ENDIF
     675          unit = 'K'   
    674676             
    675           CASE ( 't_soil' )
    676              IF (  .NOT.  land_surface )  THEN
    677                 message_string = 'output of "' // TRIM( var ) // '" requi' //  &
    678                          'res land_surface = .TRUE.'
    679                 CALL message( 'check_parameters', 'PA0404', 1, 2, 0, 6, 0 )
    680              ENDIF
    681              unit = 'K'   
     677       CASE ( 'lai*', 'c_liq*', 'c_soil*', 'c_veg*', 'ghf_eb*', 'm_liq_eb*',&
     678              'qsws_eb*', 'qsws_liq_eb*', 'qsws_soil_eb*', 'qsws_veg_eb*',  &
     679              'r_a*', 'r_s*', 'shf_eb*' )
     680          IF ( k == 0  .OR.  data_output(i)(ilen-2:ilen) /= '_xy' )  THEN
     681             message_string = 'illegal value for data_output: "' //         &
     682                              TRIM( var ) // '" & only 2d-horizontal ' //   &
     683                              'cross sections are allowed for this value'
     684             CALL message( 'check_parameters', 'PA0111', 1, 2, 0, 6, 0 )
     685          ENDIF
     686          IF ( TRIM( var ) == 'lai*'  .AND.  .NOT.  land_surface )  THEN
     687             message_string = 'output of "' // TRIM( var ) // '" requi' //  &
     688                              'res land_surface = .TRUE.'
     689             CALL message( 'check_parameters', 'PA0404', 1, 2, 0, 6, 0 )
     690          ENDIF
     691          IF ( TRIM( var ) == 'c_liq*'  .AND.  .NOT.  land_surface )  THEN
     692             message_string = 'output of "' // TRIM( var ) // '" requi' //  &
     693                              'res land_surface = .TRUE.'
     694             CALL message( 'check_parameters', 'PA0404', 1, 2, 0, 6, 0 )
     695          ENDIF
     696          IF ( TRIM( var ) == 'c_soil*'  .AND.  .NOT.  land_surface )  THEN
     697             message_string = 'output of "' // TRIM( var ) // '" requi' //  &
     698                              'res land_surface = .TRUE.'
     699             CALL message( 'check_parameters', 'PA0404', 1, 2, 0, 6, 0 )
     700          ENDIF
     701          IF ( TRIM( var ) == 'c_veg*'  .AND.  .NOT. land_surface )  THEN
     702             message_string = 'output of "' // TRIM( var ) // '" requi' //  &
     703                              'res land_surface = .TRUE.'
     704             CALL message( 'check_parameters', 'PA0401', 1, 2, 0, 6, 0 )
     705          ENDIF
     706          IF ( TRIM( var ) == 'ghf_eb*'  .AND.  .NOT.  land_surface )  THEN
     707             message_string = 'output of "' // TRIM( var ) // '" requi' //  &
     708                              'res land_surface = .TRUE.'
     709             CALL message( 'check_parameters', 'PA0404', 1, 2, 0, 6, 0 )
     710          ENDIF
     711          IF ( TRIM( var ) == 'm_liq_eb*'  .AND.  .NOT.  land_surface )  THEN
     712             message_string = 'output of "' // TRIM( var ) // '" requi' //  &
     713                              'res land_surface = .TRUE.'
     714             CALL message( 'check_parameters', 'PA0404', 1, 2, 0, 6, 0 )
     715          ENDIF
     716          IF ( TRIM( var ) == 'qsws_eb*'  .AND.  .NOT.  land_surface )  THEN
     717             message_string = 'output of "' // TRIM( var ) // '" requi' //  &
     718                              'res land_surface = .TRUE.'
     719             CALL message( 'check_parameters', 'PA0404', 1, 2, 0, 6, 0 )
     720          ENDIF
     721          IF ( TRIM( var ) == 'qsws_liq_eb*'  .AND.  .NOT. land_surface )   &
     722          THEN
     723             message_string = 'output of "' // TRIM( var ) // '" requi' //  &
     724                              'res land_surface = .TRUE.'
     725             CALL message( 'check_parameters', 'PA0404', 1, 2, 0, 6, 0 )
     726          ENDIF
     727          IF ( TRIM( var ) == 'qsws_soil_eb*'  .AND.  .NOT.  land_surface ) &
     728          THEN
     729             message_string = 'output of "' // TRIM( var ) // '" requi' //  &
     730                              'res land_surface = .TRUE.'
     731             CALL message( 'check_parameters', 'PA0404', 1, 2, 0, 6, 0 )
     732          ENDIF
     733          IF ( TRIM( var ) == 'qsws_veg_eb*'  .AND.  .NOT. land_surface )   &
     734          THEN
     735             message_string = 'output of "' // TRIM( var ) // '" requi' //  &
     736                              'res land_surface = .TRUE.'
     737             CALL message( 'check_parameters', 'PA0404', 1, 2, 0, 6, 0 )
     738          ENDIF
     739          IF ( TRIM( var ) == 'r_a*'  .AND.  .NOT.  land_surface ) &
     740          THEN
     741             message_string = 'output of "' // TRIM( var ) // '" requi' //  &
     742                              'res land_surface = .TRUE.'
     743             CALL message( 'check_parameters', 'PA0404', 1, 2, 0, 6, 0 )
     744          ENDIF
     745          IF ( TRIM( var ) == 'r_s*'  .AND.  .NOT.  land_surface ) &
     746          THEN
     747             message_string = 'output of "' // TRIM( var ) // '" requi' //  &
     748                              'res land_surface = .TRUE.'
     749             CALL message( 'check_parameters', 'PA0404', 1, 2, 0, 6, 0 )
     750          ENDIF
     751
     752          IF ( TRIM( var ) == 'lai*'   )  unit = 'none'
     753          IF ( TRIM( var ) == 'c_liq*' )  unit = 'none'
     754          IF ( TRIM( var ) == 'c_soil*')  unit = 'none'
     755          IF ( TRIM( var ) == 'c_veg*' )  unit = 'none'
     756          IF ( TRIM( var ) == 'ghf_eb*')  unit = 'W/m2'
     757          IF ( TRIM( var ) == 'm_liq_eb*'     )  unit = 'm'
     758          IF ( TRIM( var ) == 'qsws_eb*'      ) unit = 'W/m2'
     759          IF ( TRIM( var ) == 'qsws_liq_eb*'  ) unit = 'W/m2'
     760          IF ( TRIM( var ) == 'qsws_soil_eb*' ) unit = 'W/m2'
     761          IF ( TRIM( var ) == 'qsws_veg_eb*'  ) unit = 'W/m2'
     762          IF ( TRIM( var ) == 'r_a*')     unit = 's/m'     
     763          IF ( TRIM( var ) == 'r_s*')     unit = 's/m'
     764          IF ( TRIM( var ) == 'shf_eb*')  unit = 'W/m2'
    682765             
    683           CASE ( 'lai*', 'c_liq*', 'c_soil*', 'c_veg*', 'ghf_eb*', 'm_liq_eb*',&
    684                  'qsws_eb*', 'qsws_liq_eb*', 'qsws_soil_eb*', 'qsws_veg_eb*',  &
    685                  'r_a*', 'r_s*', 'shf_eb*' )
    686              IF ( k == 0  .OR.  data_output(i)(ilen-2:ilen) /= '_xy' )  THEN
    687                 message_string = 'illegal value for data_output: "' //         &
    688                                  TRIM( var ) // '" & only 2d-horizontal ' //   &
    689                                  'cross sections are allowed for this value'
    690                 CALL message( 'check_parameters', 'PA0111', 1, 2, 0, 6, 0 )
    691              ENDIF
    692              IF ( TRIM( var ) == 'lai*'  .AND.  .NOT.  land_surface )  THEN
    693                 message_string = 'output of "' // TRIM( var ) // '" requi' //  &
    694                                  'res land_surface = .TRUE.'
    695                 CALL message( 'check_parameters', 'PA0404', 1, 2, 0, 6, 0 )
    696              ENDIF
    697              IF ( TRIM( var ) == 'c_liq*'  .AND.  .NOT.  land_surface )  THEN
    698                 message_string = 'output of "' // TRIM( var ) // '" requi' //  &
    699                                  'res land_surface = .TRUE.'
    700                 CALL message( 'check_parameters', 'PA0404', 1, 2, 0, 6, 0 )
    701              ENDIF
    702              IF ( TRIM( var ) == 'c_soil*'  .AND.  .NOT.  land_surface )  THEN
    703                 message_string = 'output of "' // TRIM( var ) // '" requi' //  &
    704                                  'res land_surface = .TRUE.'
    705                 CALL message( 'check_parameters', 'PA0404', 1, 2, 0, 6, 0 )
    706              ENDIF
    707              IF ( TRIM( var ) == 'c_veg*'  .AND.  .NOT. land_surface )  THEN
    708                 message_string = 'output of "' // TRIM( var ) // '" requi' //  &
    709                                  'res land_surface = .TRUE.'
    710                 CALL message( 'check_parameters', 'PA0401', 1, 2, 0, 6, 0 )
    711              ENDIF
    712              IF ( TRIM( var ) == 'ghf_eb*'  .AND.  .NOT.  land_surface )  THEN
    713                 message_string = 'output of "' // TRIM( var ) // '" requi' //  &
    714                                  'res land_surface = .TRUE.'
    715                 CALL message( 'check_parameters', 'PA0404', 1, 2, 0, 6, 0 )
    716              ENDIF
    717              IF ( TRIM( var ) == 'm_liq_eb*'  .AND.  .NOT.  land_surface )  THEN
    718                 message_string = 'output of "' // TRIM( var ) // '" requi' //  &
    719                                  'res land_surface = .TRUE.'
    720                 CALL message( 'check_parameters', 'PA0404', 1, 2, 0, 6, 0 )
    721              ENDIF
    722              IF ( TRIM( var ) == 'qsws_eb*'  .AND.  .NOT.  land_surface )  THEN
    723                 message_string = 'output of "' // TRIM( var ) // '" requi' //  &
    724                                  'res land_surface = .TRUE.'
    725                 CALL message( 'check_parameters', 'PA0404', 1, 2, 0, 6, 0 )
    726              ENDIF
    727              IF ( TRIM( var ) == 'qsws_liq_eb*'  .AND.  .NOT. land_surface )   &
    728              THEN
    729                 message_string = 'output of "' // TRIM( var ) // '" requi' //  &
    730                                  'res land_surface = .TRUE.'
    731                 CALL message( 'check_parameters', 'PA0404', 1, 2, 0, 6, 0 )
    732              ENDIF
    733              IF ( TRIM( var ) == 'qsws_soil_eb*'  .AND.  .NOT.  land_surface ) &
    734              THEN
    735                 message_string = 'output of "' // TRIM( var ) // '" requi' //  &
    736                                  'res land_surface = .TRUE.'
    737                 CALL message( 'check_parameters', 'PA0404', 1, 2, 0, 6, 0 )
    738              ENDIF
    739              IF ( TRIM( var ) == 'qsws_veg_eb*'  .AND.  .NOT. land_surface )   &
    740              THEN
    741                 message_string = 'output of "' // TRIM( var ) // '" requi' //  &
    742                                  'res land_surface = .TRUE.'
    743                 CALL message( 'check_parameters', 'PA0404', 1, 2, 0, 6, 0 )
    744              ENDIF
    745              IF ( TRIM( var ) == 'r_a*'  .AND.  .NOT.  land_surface ) &
    746              THEN
    747                 message_string = 'output of "' // TRIM( var ) // '" requi' //  &
    748                                  'res land_surface = .TRUE.'
    749                 CALL message( 'check_parameters', 'PA0404', 1, 2, 0, 6, 0 )
    750              ENDIF
    751              IF ( TRIM( var ) == 'r_s*'  .AND.  .NOT.  land_surface ) &
    752              THEN
    753                 message_string = 'output of "' // TRIM( var ) // '" requi' //  &
    754                                  'res land_surface = .TRUE.'
    755                 CALL message( 'check_parameters', 'PA0404', 1, 2, 0, 6, 0 )
    756              ENDIF
    757 
    758              IF ( TRIM( var ) == 'lai*'   )  unit = 'none'
    759              IF ( TRIM( var ) == 'c_liq*' )  unit = 'none'
    760              IF ( TRIM( var ) == 'c_soil*')  unit = 'none'
    761              IF ( TRIM( var ) == 'c_veg*' )  unit = 'none'
    762              IF ( TRIM( var ) == 'ghf_eb*')  unit = 'W/m2'
    763              IF ( TRIM( var ) == 'm_liq_eb*'     )  unit = 'm'
    764              IF ( TRIM( var ) == 'qsws_eb*'      ) unit = 'W/m2'
    765              IF ( TRIM( var ) == 'qsws_liq_eb*'  ) unit = 'W/m2'
    766              IF ( TRIM( var ) == 'qsws_soil_eb*' ) unit = 'W/m2'
    767              IF ( TRIM( var ) == 'qsws_veg_eb*'  ) unit = 'W/m2'
    768              IF ( TRIM( var ) == 'r_a*')     unit = 's/m'     
    769              IF ( TRIM( var ) == 'r_s*')     unit = 's/m'
    770              IF ( TRIM( var ) == 'shf_eb*')  unit = 'W/m2'
    771              
    772           CASE DEFAULT
    773              unit = 'illegal'
    774 
    775        END SELECT
    776 
    777 
    778     END SUBROUTINE lsm_check_data_output
    779 
     766       CASE DEFAULT
     767          unit = 'illegal'
     768
     769    END SELECT
     770
     771
     772 END SUBROUTINE lsm_check_data_output
     773
     774
     775!------------------------------------------------------------------------------!
     776! Description:
     777! ------------
     778!> Check data output of profiles for land surface model
     779!------------------------------------------------------------------------------!
    780780 SUBROUTINE lsm_check_data_output_pr( variable, var_count, unit, dopr_unit )
    781781 
    782        USE control_parameters,                                                 &
    783            ONLY: data_output_pr, message_string
    784 
    785        USE indices
    786 
    787        USE profil_parameter
    788 
    789        USE statistics
    790 
    791        IMPLICIT NONE
     782    USE control_parameters,                                                 &
     783        ONLY: data_output_pr, message_string
     784
     785    USE indices
     786
     787    USE profil_parameter
     788
     789    USE statistics
     790
     791    IMPLICIT NONE
    792792   
    793        CHARACTER (LEN=*) ::  unit      !<
    794        CHARACTER (LEN=*) ::  variable  !<
    795        CHARACTER (LEN=*) ::  dopr_unit !< local value of dopr_unit
     793    CHARACTER (LEN=*) ::  unit      !<
     794    CHARACTER (LEN=*) ::  variable  !<
     795    CHARACTER (LEN=*) ::  dopr_unit !< local value of dopr_unit
    796796 
    797        INTEGER(iwp) ::  user_pr_index !<
    798        INTEGER(iwp) ::  var_count     !<
    799 
    800        SELECT CASE ( TRIM( variable ) )
     797    INTEGER(iwp) ::  user_pr_index !<
     798    INTEGER(iwp) ::  var_count     !<
     799
     800    SELECT CASE ( TRIM( variable ) )
    801801       
    802           CASE ( 't_soil', '#t_soil' )
    803              IF (  .NOT.  land_surface )  THEN
    804                 message_string = 'data_output_pr = ' //                        &
    805                                  TRIM( data_output_pr(var_count) ) // ' is' // &
    806                                  'not implemented for land_surface = .FALSE.'
    807                 CALL message( 'check_parameters', 'PA0402', 1, 2, 0, 6, 0 )
    808              ELSE
    809                 dopr_index(var_count) = 89
    810                 dopr_unit     = 'K'
    811                 hom(0:nzs-1,2,89,:)  = SPREAD( - zs, 2, statistic_regions+1 )
    812                 IF ( data_output_pr(var_count)(1:1) == '#' )  THEN
    813                    dopr_initial_index(var_count) = 90
    814                    hom(0:nzs-1,2,90,:)   = SPREAD( - zs, 2, statistic_regions+1 )
    815                    data_output_pr(var_count)     = data_output_pr(var_count)(2:)
    816                 ENDIF
    817                 unit = dopr_unit
     802       CASE ( 't_soil', '#t_soil' )
     803          IF (  .NOT.  land_surface )  THEN
     804             message_string = 'data_output_pr = ' //                        &
     805                              TRIM( data_output_pr(var_count) ) // ' is' // &
     806                              'not implemented for land_surface = .FALSE.'
     807             CALL message( 'check_parameters', 'PA0402', 1, 2, 0, 6, 0 )
     808          ELSE
     809             dopr_index(var_count) = 89
     810             dopr_unit     = 'K'
     811             hom(0:nzs-1,2,89,:)  = SPREAD( - zs, 2, statistic_regions+1 )
     812             IF ( data_output_pr(var_count)(1:1) == '#' )  THEN
     813                dopr_initial_index(var_count) = 90
     814                hom(0:nzs-1,2,90,:)   = SPREAD( - zs, 2, statistic_regions+1 )
     815                data_output_pr(var_count)     = data_output_pr(var_count)(2:)
    818816             ENDIF
    819 
    820           CASE ( 'm_soil', '#m_soil' )
    821              IF (  .NOT.  land_surface )  THEN
    822                 message_string = 'data_output_pr = ' //                        &
    823                                  TRIM( data_output_pr(var_count) ) // ' is' // &
    824                                  ' not implemented for land_surface = .FALSE.'
    825                 CALL message( 'check_parameters', 'PA0402', 1, 2, 0, 6, 0 )
    826              ELSE
    827                 dopr_index(var_count) = 91
    828                 dopr_unit     = 'm3/m3'
    829                 hom(0:nzs-1,2,91,:)  = SPREAD( - zs, 2, statistic_regions+1 )
    830                 IF ( data_output_pr(var_count)(1:1) == '#' )  THEN
    831                    dopr_initial_index(var_count) = 92
    832                    hom(0:nzs-1,2,92,:)   = SPREAD( - zs, 2, statistic_regions+1 )
    833                    data_output_pr(var_count)     = data_output_pr(var_count)(2:)
    834                 ENDIF
    835                  unit = dopr_unit
     817             unit = dopr_unit
     818          ENDIF
     819
     820       CASE ( 'm_soil', '#m_soil' )
     821          IF (  .NOT.  land_surface )  THEN
     822             message_string = 'data_output_pr = ' //                        &
     823                              TRIM( data_output_pr(var_count) ) // ' is' // &
     824                              ' not implemented for land_surface = .FALSE.'
     825             CALL message( 'check_parameters', 'PA0402', 1, 2, 0, 6, 0 )
     826          ELSE
     827             dopr_index(var_count) = 91
     828             dopr_unit     = 'm3/m3'
     829             hom(0:nzs-1,2,91,:)  = SPREAD( - zs, 2, statistic_regions+1 )
     830             IF ( data_output_pr(var_count)(1:1) == '#' )  THEN
     831                dopr_initial_index(var_count) = 92
     832                hom(0:nzs-1,2,92,:)   = SPREAD( - zs, 2, statistic_regions+1 )
     833                data_output_pr(var_count)     = data_output_pr(var_count)(2:)
    836834             ENDIF
    837 
    838 
    839           CASE DEFAULT
    840              unit = 'illegal'
    841 
    842        END SELECT
    843 
    844 
    845     END SUBROUTINE lsm_check_data_output_pr
     835             unit = dopr_unit
     836          ENDIF
     837
     838
     839       CASE DEFAULT
     840          unit = 'illegal'
     841
     842    END SELECT
     843
     844
     845 END SUBROUTINE lsm_check_data_output_pr
    846846 
    847847 
     
    851851!> Check parameters routine for land surface model
    852852!------------------------------------------------------------------------------!
    853     SUBROUTINE lsm_check_parameters
    854 
    855        USE control_parameters,                                                 &
    856            ONLY: bc_pt_b, bc_q_b, constant_flux_layer, message_string,         &
    857                  most_method, topography
     853 SUBROUTINE lsm_check_parameters
     854
     855    USE control_parameters,                                                    &
     856        ONLY:  bc_pt_b, bc_q_b, constant_flux_layer, message_string,           &
     857               most_method, topography
    858858                 
    859        USE radiation_model_mod,                                                &
    860            ONLY: radiation
     859    USE radiation_model_mod,                                                   &
     860        ONLY: radiation
    861861   
    862862   
    863        IMPLICIT NONE
     863    IMPLICIT NONE
    864864
    865865 
    866866!
    867 !--    Dirichlet boundary conditions are required as the surface fluxes are
    868 !--    calculated from the temperature/humidity gradients in the land surface
    869 !--    model
    870        IF ( bc_pt_b == 'neumann'  .OR.  bc_q_b == 'neumann' )  THEN
    871           message_string = 'lsm requires setting of'//                         &
    872                            'bc_pt_b = "dirichlet" and '//                      &
    873                            'bc_q_b  = "dirichlet"'
    874           CALL message( 'check_parameters', 'PA0399', 1, 2, 0, 6, 0 )
     867!-- Dirichlet boundary conditions are required as the surface fluxes are
     868!-- calculated from the temperature/humidity gradients in the land surface
     869!-- model
     870    IF ( bc_pt_b == 'neumann'  .OR.  bc_q_b == 'neumann' )  THEN
     871       message_string = 'lsm requires setting of'//                         &
     872                        'bc_pt_b = "dirichlet" and '//                      &
     873                        'bc_q_b  = "dirichlet"'
     874       CALL message( 'check_parameters', 'PA0399', 1, 2, 0, 6, 0 )
     875    ENDIF
     876
     877    IF (  .NOT.  constant_flux_layer )  THEN
     878       message_string = 'lsm requires '//                                   &
     879                        'constant_flux_layer = .T.'
     880       CALL message( 'check_parameters', 'PA0400', 1, 2, 0, 6, 0 )
     881    ENDIF
     882
     883    IF ( topography /= 'flat' )  THEN
     884       message_string = 'lsm cannot be used ' //                            &
     885                        'in combination with  topography /= "flat"'
     886       CALL message( 'check_parameters', 'PA0415', 1, 2, 0, 6, 0 )
     887    ENDIF
     888
     889    IF ( ( veg_type == 14  .OR.  veg_type == 15 ) .AND.                     &
     890           most_method == 'lookup' )  THEN
     891        WRITE( message_string, * ) 'veg_type = ', veg_type, ' is not ',     &
     892                                   'allowed in combination with ',          &
     893                                   'most_method = ', most_method
     894       CALL message( 'check_parameters', 'PA0417', 1, 2, 0, 6, 0 )
     895    ENDIF
     896
     897    IF ( veg_type == 0 )  THEN
     898       IF ( SUM( root_fraction ) /= 1.0_wp )  THEN
     899          message_string = 'veg_type = 0 (user_defined)'//                  &
     900                           'requires setting of root_fraction(0:3)'//       &
     901                           '/= 9999999.9 and SUM(root_fraction) = 1'
     902          CALL message( 'check_parameters', 'PA0401', 1, 2, 0, 6, 0 )
    875903       ENDIF
    876 
    877        IF (  .NOT.  constant_flux_layer )  THEN
    878           message_string = 'lsm requires '//                                   &
    879                            'constant_flux_layer = .T.'
    880           CALL message( 'check_parameters', 'PA0400', 1, 2, 0, 6, 0 )
     904 
     905       IF ( min_canopy_resistance == 9999999.9_wp )  THEN
     906          message_string = 'veg_type = 0 (user defined)'//                  &
     907                           'requires setting of min_canopy_resistance'//    &
     908                           '/= 9999999.9'
     909          CALL message( 'check_parameters', 'PA0401', 1, 2, 0, 6, 0 )
    881910       ENDIF
    882911
    883        IF ( topography /= 'flat' )  THEN
    884           message_string = 'lsm cannot be used ' //                            &
    885                            'in combination with  topography /= "flat"'
    886           CALL message( 'check_parameters', 'PA0415', 1, 2, 0, 6, 0 )
     912       IF ( leaf_area_index == 9999999.9_wp )  THEN
     913          message_string = 'veg_type = 0 (user_defined)'//                  &
     914                           'requires setting of leaf_area_index'//          &
     915                           '/= 9999999.9'
     916          CALL message( 'check_parameters', 'PA0401', 1, 2, 0, 6, 0 )
    887917       ENDIF
    888918
    889        IF ( ( veg_type == 14  .OR.  veg_type == 15 ) .AND.                     &
    890               most_method == 'lookup' )  THEN
    891            WRITE( message_string, * ) 'veg_type = ', veg_type, ' is not ',     &
    892                                       'allowed in combination with ',          &
    893                                       'most_method = ', most_method
    894           CALL message( 'check_parameters', 'PA0417', 1, 2, 0, 6, 0 )
     919       IF ( vegetation_coverage == 9999999.9_wp )  THEN
     920          message_string = 'veg_type = 0 (user_defined)'//                  &
     921                           'requires setting of vegetation_coverage'//      &
     922                           '/= 9999999.9'
     923             CALL message( 'check_parameters', 'PA0401', 1, 2, 0, 6, 0 )
    895924       ENDIF
    896925
    897        IF ( veg_type == 0 )  THEN
    898           IF ( SUM( root_fraction ) /= 1.0_wp )  THEN
    899              message_string = 'veg_type = 0 (user_defined)'//                  &
    900                               'requires setting of root_fraction(0:3)'//       &
    901                               '/= 9999999.9 and SUM(root_fraction) = 1'
    902              CALL message( 'check_parameters', 'PA0401', 1, 2, 0, 6, 0 )
    903           ENDIF
    904  
    905           IF ( min_canopy_resistance == 9999999.9_wp )  THEN
    906              message_string = 'veg_type = 0 (user defined)'//                  &
    907                               'requires setting of min_canopy_resistance'//    &
    908                               '/= 9999999.9'
    909              CALL message( 'check_parameters', 'PA0401', 1, 2, 0, 6, 0 )
    910           ENDIF
    911 
    912           IF ( leaf_area_index == 9999999.9_wp )  THEN
    913              message_string = 'veg_type = 0 (user_defined)'//                  &
    914                               'requires setting of leaf_area_index'//          &
    915                               '/= 9999999.9'
    916              CALL message( 'check_parameters', 'PA0401', 1, 2, 0, 6, 0 )
    917           ENDIF
    918 
    919           IF ( vegetation_coverage == 9999999.9_wp )  THEN
    920              message_string = 'veg_type = 0 (user_defined)'//                  &
    921                               'requires setting of vegetation_coverage'//      &
    922                               '/= 9999999.9'
    923              CALL message( 'check_parameters', 'PA0401', 1, 2, 0, 6, 0 )
    924           ENDIF
    925 
    926           IF ( canopy_resistance_coefficient == 9999999.9_wp)  THEN
    927              message_string = 'veg_type = 0 (user_defined)'//                  &
    928                               'requires setting of'//                          &
    929                               'canopy_resistance_coefficient /= 9999999.9'
    930              CALL message( 'check_parameters', 'PA0401', 1, 2, 0, 6, 0 )
    931           ENDIF
    932 
    933           IF ( lambda_surface_stable == 9999999.9_wp )  THEN
    934              message_string = 'veg_type = 0 (user_defined)'//                  &
    935                               'requires setting of lambda_surface_stable'//    &
    936                               '/= 9999999.9'
    937              CALL message( 'check_parameters', 'PA0401', 1, 2, 0, 6, 0 )
    938           ENDIF
    939 
    940           IF ( lambda_surface_unstable == 9999999.9_wp )  THEN
    941              message_string = 'veg_type = 0 (user_defined)'//                  &
    942                               'requires setting of lambda_surface_unstable'//  &
    943                               '/= 9999999.9'
    944              CALL message( 'check_parameters', 'PA0401', 1, 2, 0, 6, 0 )
    945           ENDIF
    946 
    947           IF ( f_shortwave_incoming == 9999999.9_wp )  THEN
    948              message_string = 'veg_type = 0 (user_defined)'//                  &
    949                               'requires setting of f_shortwave_incoming'//     &
    950                               '/= 9999999.9'
    951              CALL message( 'check_parameters', 'PA0401', 1, 2, 0, 6, 0 )
    952           ENDIF
    953 
    954           IF ( z0_eb == 9999999.9_wp )  THEN
    955              message_string = 'veg_type = 0 (user_defined)'//                  &
    956                               'requires setting of z0_eb'//                    &
    957                               '/= 9999999.9'
    958              CALL message( 'check_parameters', 'PA0401', 1, 2, 0, 6, 0 )
    959           ENDIF
    960 
    961           IF ( z0h_eb == 9999999.9_wp )  THEN
    962              message_string = 'veg_type = 0 (user_defined)'//                  &
    963                               'requires setting of z0h_eb'//                   &
    964                               '/= 9999999.9'
    965              CALL message( 'check_parameters', 'PA0401', 1, 2, 0, 6, 0 )
    966           ENDIF
    967 
    968 
     926       IF ( canopy_resistance_coefficient == 9999999.9_wp)  THEN
     927          message_string = 'veg_type = 0 (user_defined)'//                  &
     928                           'requires setting of'//                          &
     929                           'canopy_resistance_coefficient /= 9999999.9'
     930          CALL message( 'check_parameters', 'PA0401', 1, 2, 0, 6, 0 )
    969931       ENDIF
    970932
    971        IF ( soil_type == 0 )  THEN
    972 
    973           IF ( alpha_vangenuchten == 9999999.9_wp )  THEN
    974              message_string = 'soil_type = 0 (user_defined)'//                 &
    975                               'requires setting of alpha_vangenuchten'//       &
    976                               '/= 9999999.9'
    977              CALL message( 'check_parameters', 'PA0403', 1, 2, 0, 6, 0 )
    978           ENDIF
    979 
    980           IF ( l_vangenuchten == 9999999.9_wp )  THEN
    981              message_string = 'soil_type = 0 (user_defined)'//                 &
    982                               'requires setting of l_vangenuchten'//           &
    983                               '/= 9999999.9'
    984              CALL message( 'check_parameters', 'PA0403', 1, 2, 0, 6, 0 )
    985           ENDIF
    986 
    987           IF ( n_vangenuchten == 9999999.9_wp )  THEN
    988              message_string = 'soil_type = 0 (user_defined)'//                 &
    989                               'requires setting of n_vangenuchten'//           &
    990                               '/= 9999999.9'
    991              CALL message( 'check_parameters', 'PA0403', 1, 2, 0, 6, 0 )
    992           ENDIF
    993 
    994           IF ( hydraulic_conductivity == 9999999.9_wp )  THEN
    995              message_string = 'soil_type = 0 (user_defined)'//                 &
    996                               'requires setting of hydraulic_conductivity'//   &
    997                               '/= 9999999.9'
    998              CALL message( 'check_parameters', 'PA0403', 1, 2, 0, 6, 0 )
    999           ENDIF
    1000 
    1001           IF ( saturation_moisture == 9999999.9_wp )  THEN
    1002              message_string = 'soil_type = 0 (user_defined)'//                 &
    1003                               'requires setting of saturation_moisture'//      &
    1004                               '/= 9999999.9'
    1005              CALL message( 'check_parameters', 'PA0403', 1, 2, 0, 6, 0 )
    1006           ENDIF
    1007 
    1008           IF ( field_capacity == 9999999.9_wp )  THEN
    1009              message_string = 'soil_type = 0 (user_defined)'//                 &
    1010                               'requires setting of field_capacity'//           &
    1011                               '/= 9999999.9'
    1012              CALL message( 'check_parameters', 'PA0403', 1, 2, 0, 6, 0 )
    1013           ENDIF
    1014 
    1015           IF ( wilting_point == 9999999.9_wp )  THEN
    1016              message_string = 'soil_type = 0 (user_defined)'//                 &
    1017                               'requires setting of wilting_point'//            &
    1018                               '/= 9999999.9'
    1019              CALL message( 'check_parameters', 'PA0403', 1, 2, 0, 6, 0 )
    1020           ENDIF
    1021 
    1022           IF ( residual_moisture == 9999999.9_wp )  THEN
    1023              message_string = 'soil_type = 0 (user_defined)'//                 &
    1024                               'requires setting of residual_moisture'//        &
    1025                               '/= 9999999.9'
    1026              CALL message( 'check_parameters', 'PA0403', 1, 2, 0, 6, 0 )
    1027           ENDIF
    1028 
     933       IF ( lambda_surface_stable == 9999999.9_wp )  THEN
     934          message_string = 'veg_type = 0 (user_defined)'//                  &
     935                           'requires setting of lambda_surface_stable'//    &
     936                           '/= 9999999.9'
     937          CALL message( 'check_parameters', 'PA0401', 1, 2, 0, 6, 0 )
    1029938       ENDIF
    1030939
    1031        IF (  .NOT.  radiation )  THEN
    1032           message_string = 'lsm requires '//                                   &
    1033                            'radiation = .T.'
    1034           CALL message( 'check_parameters', 'PA0400', 1, 2, 0, 6, 0 )
     940       IF ( lambda_surface_unstable == 9999999.9_wp )  THEN
     941          message_string = 'veg_type = 0 (user_defined)'//                  &
     942                           'requires setting of lambda_surface_unstable'//  &
     943                           '/= 9999999.9'
     944          CALL message( 'check_parameters', 'PA0401', 1, 2, 0, 6, 0 )
    1035945       ENDIF
     946
     947       IF ( f_shortwave_incoming == 9999999.9_wp )  THEN
     948          message_string = 'veg_type = 0 (user_defined)'//                  &
     949                           'requires setting of f_shortwave_incoming'//     &
     950                           '/= 9999999.9'
     951          CALL message( 'check_parameters', 'PA0401', 1, 2, 0, 6, 0 )
     952       ENDIF
     953
     954       IF ( z0_eb == 9999999.9_wp )  THEN
     955          message_string = 'veg_type = 0 (user_defined)'//                  &
     956                           'requires setting of z0_eb'//                    &
     957                           '/= 9999999.9'
     958          CALL message( 'check_parameters', 'PA0401', 1, 2, 0, 6, 0 )
     959       ENDIF
     960
     961       IF ( z0h_eb == 9999999.9_wp )  THEN
     962          message_string = 'veg_type = 0 (user_defined)'//                  &
     963                           'requires setting of z0h_eb'//                   &
     964                           '/= 9999999.9'
     965          CALL message( 'check_parameters', 'PA0401', 1, 2, 0, 6, 0 )
     966       ENDIF
     967
     968
     969    ENDIF
     970
     971    IF ( soil_type == 0 )  THEN
     972
     973       IF ( alpha_vangenuchten == 9999999.9_wp )  THEN
     974          message_string = 'soil_type = 0 (user_defined)'//                 &
     975                           'requires setting of alpha_vangenuchten'//       &
     976                           '/= 9999999.9'
     977          CALL message( 'check_parameters', 'PA0403', 1, 2, 0, 6, 0 )
     978       ENDIF
     979
     980       IF ( l_vangenuchten == 9999999.9_wp )  THEN
     981          message_string = 'soil_type = 0 (user_defined)'//                 &
     982                           'requires setting of l_vangenuchten'//           &
     983                           '/= 9999999.9'
     984          CALL message( 'check_parameters', 'PA0403', 1, 2, 0, 6, 0 )
     985       ENDIF
     986
     987       IF ( n_vangenuchten == 9999999.9_wp )  THEN
     988          message_string = 'soil_type = 0 (user_defined)'//                 &
     989                           'requires setting of n_vangenuchten'//           &
     990                           '/= 9999999.9'
     991          CALL message( 'check_parameters', 'PA0403', 1, 2, 0, 6, 0 )
     992       ENDIF
     993
     994       IF ( hydraulic_conductivity == 9999999.9_wp )  THEN
     995          message_string = 'soil_type = 0 (user_defined)'//                 &
     996                           'requires setting of hydraulic_conductivity'//   &
     997                           '/= 9999999.9'
     998          CALL message( 'check_parameters', 'PA0403', 1, 2, 0, 6, 0 )
     999       ENDIF
     1000
     1001       IF ( saturation_moisture == 9999999.9_wp )  THEN
     1002          message_string = 'soil_type = 0 (user_defined)'//                 &
     1003                           'requires setting of saturation_moisture'//      &
     1004                           '/= 9999999.9'
     1005          CALL message( 'check_parameters', 'PA0403', 1, 2, 0, 6, 0 )
     1006       ENDIF
     1007
     1008       IF ( field_capacity == 9999999.9_wp )  THEN
     1009          message_string = 'soil_type = 0 (user_defined)'//                 &
     1010                           'requires setting of field_capacity'//           &
     1011                           '/= 9999999.9'
     1012          CALL message( 'check_parameters', 'PA0403', 1, 2, 0, 6, 0 )
     1013       ENDIF
     1014
     1015       IF ( wilting_point == 9999999.9_wp )  THEN
     1016          message_string = 'soil_type = 0 (user_defined)'//                 &
     1017                           'requires setting of wilting_point'//            &
     1018                           '/= 9999999.9'
     1019          CALL message( 'check_parameters', 'PA0403', 1, 2, 0, 6, 0 )
     1020       ENDIF
     1021
     1022       IF ( residual_moisture == 9999999.9_wp )  THEN
     1023          message_string = 'soil_type = 0 (user_defined)'//                 &
     1024                           'requires setting of residual_moisture'//        &
     1025                           '/= 9999999.9'
     1026          CALL message( 'check_parameters', 'PA0403', 1, 2, 0, 6, 0 )
     1027       ENDIF
     1028
     1029    ENDIF
     1030
     1031    IF (  .NOT.  radiation )  THEN
     1032       message_string = 'lsm requires '//                                   &
     1033                        'radiation = .T.'
     1034       CALL message( 'check_parameters', 'PA0400', 1, 2, 0, 6, 0 )
     1035    ENDIF
    10361036       
    10371037       
    1038     END SUBROUTINE lsm_check_parameters
     1038 END SUBROUTINE lsm_check_parameters
    10391039 
    10401040!------------------------------------------------------------------------------!
     
    10431043!> Solver for the energy balance at the surface.
    10441044!------------------------------------------------------------------------------!
    1045     SUBROUTINE lsm_energy_balance
    1046 
    1047 
    1048        IMPLICIT NONE
    1049 
    1050        INTEGER(iwp) ::  i         !< running index
    1051        INTEGER(iwp) ::  j         !< running index
    1052        INTEGER(iwp) ::  k, ks     !< running index
    1053 
    1054        REAL(wp) :: c_surface_tmp,& !< temporary variable for storing the volumetric heat capacity of the surface
    1055                    f1,          & !< resistance correction term 1
    1056                    f2,          & !< resistance correction term 2
    1057                    f3,          & !< resistance correction term 3
    1058                    m_min,       & !< minimum soil moisture
    1059                    e,           & !< water vapour pressure
    1060                    e_s,         & !< water vapour saturation pressure
    1061                    e_s_dt,      & !< derivate of e_s with respect to T
    1062                    tend,        & !< tendency
    1063                    dq_s_dt,     & !< derivate of q_s with respect to T
    1064                    coef_1,      & !< coef. for prognostic equation
    1065                    coef_2,      & !< coef. for prognostic equation
    1066                    f_qsws,      & !< factor for qsws_eb
    1067                    f_qsws_veg,  & !< factor for qsws_veg_eb
    1068                    f_qsws_soil, & !< factor for qsws_soil_eb
    1069                    f_qsws_liq,  & !< factor for qsws_liq_eb
    1070                    f_shf,       & !< factor for shf_eb
    1071                    lambda_surface, & !< Current value of lambda_surface
    1072                    m_liq_eb_max,   & !< maxmimum value of the liq. water reservoir
    1073                    pt1,         & !< potential temperature at first grid level
    1074                    qv1            !< specific humidity at first grid level
    1075 
    1076 !
    1077 !--    Calculate the exner function for the current time step
    1078        exn = ( surface_pressure / 1000.0_wp )**0.286_wp
    1079 
    1080        DO  i = nxlg, nxrg
    1081           DO  j = nysg, nyng
    1082              k = nzb_s_inner(j,i)
    1083 
    1084 !
    1085 !--          Set lambda_surface according to stratification between skin layer and soil
    1086              IF (  .NOT.  pave_surface(j,i) )  THEN
    1087 
    1088                 c_surface_tmp = c_surface
    1089 
    1090                 IF ( t_surface(j,i) >= t_soil(nzb_soil,j,i))  THEN
    1091                    lambda_surface = lambda_surface_s(j,i)
    1092                 ELSE
    1093                    lambda_surface = lambda_surface_u(j,i)
    1094                 ENDIF
     1045 SUBROUTINE lsm_energy_balance
     1046
     1047
     1048    IMPLICIT NONE
     1049
     1050    INTEGER(iwp) ::  i         !< running index
     1051    INTEGER(iwp) ::  j         !< running index
     1052    INTEGER(iwp) ::  k, ks     !< running index
     1053
     1054    REAL(wp) :: c_surface_tmp,& !< temporary variable for storing the volumetric heat capacity of the surface
     1055                f1,          & !< resistance correction term 1
     1056                f2,          & !< resistance correction term 2
     1057                f3,          & !< resistance correction term 3
     1058                m_min,       & !< minimum soil moisture
     1059                e,           & !< water vapour pressure
     1060                e_s,         & !< water vapour saturation pressure
     1061                e_s_dt,      & !< derivate of e_s with respect to T
     1062                tend,        & !< tendency
     1063                dq_s_dt,     & !< derivate of q_s with respect to T
     1064                coef_1,      & !< coef. for prognostic equation
     1065                coef_2,      & !< coef. for prognostic equation
     1066                f_qsws,      & !< factor for qsws_eb
     1067                f_qsws_veg,  & !< factor for qsws_veg_eb
     1068                f_qsws_soil, & !< factor for qsws_soil_eb
     1069                f_qsws_liq,  & !< factor for qsws_liq_eb
     1070                f_shf,       & !< factor for shf_eb
     1071                lambda_surface, & !< Current value of lambda_surface
     1072                m_liq_eb_max,   & !< maxmimum value of the liq. water reservoir
     1073                pt1,         & !< potential temperature at first grid level
     1074                qv1            !< specific humidity at first grid level
     1075
     1076!
     1077!-- Calculate the exner function for the current time step
     1078    exn = ( surface_pressure / 1000.0_wp )**0.286_wp
     1079
     1080    DO  i = nxlg, nxrg
     1081       DO  j = nysg, nyng
     1082          k = nzb_s_inner(j,i)
     1083
     1084!
     1085!--       Set lambda_surface according to stratification between skin layer and soil
     1086          IF (  .NOT.  pave_surface(j,i) )  THEN
     1087
     1088             c_surface_tmp = c_surface
     1089
     1090             IF ( t_surface(j,i) >= t_soil(nzb_soil,j,i))  THEN
     1091                lambda_surface = lambda_surface_s(j,i)
    10951092             ELSE
    1096 
    1097                 c_surface_tmp = pave_heat_capacity * dz_soil(nzb_soil) * 0.5_wp
    1098                 lambda_surface = pave_heat_conductivity * ddz_soil(nzb_soil)
    1099 
     1093                lambda_surface = lambda_surface_u(j,i)
    11001094             ENDIF
    1101 
    1102 !
    1103 !--          First step: calculate aerodyamic resistance. As pt, us, ts
    1104 !--          are not available for the prognostic time step, data from the last
    1105 !--          time step is used here. Note that this formulation is the
    1106 !--          equivalent to the ECMWF formulation using drag coefficients
    1107              IF ( cloud_physics )  THEN
    1108                 pt1 = pt(k+1,j,i) + l_d_cp * pt_d_t(k+1) * ql(k+1,j,i)
    1109                 qv1 = q(k+1,j,i) - ql(k+1,j,i)
    1110              ELSE
    1111                 pt1 = pt(k+1,j,i)
    1112                 qv1 = q(k+1,j,i)
    1113              ENDIF
    1114 
    1115              r_a(j,i) = (pt1 - pt(k,j,i)) / (ts(j,i) * us(j,i) + 1.0E-20_wp)
    1116 
    1117 !
    1118 !--          Make sure that the resistance does not drop to zero for neutral
    1119 !--          stratification
    1120              IF ( ABS(r_a(j,i)) < 1.0_wp )  r_a(j,i) = 1.0_wp
    1121 
    1122 !
    1123 !--          Second step: calculate canopy resistance r_canopy
    1124 !--          f1-f3 here are defined as 1/f1-f3 as in ECMWF documentation
     1095          ELSE
     1096
     1097             c_surface_tmp = pave_heat_capacity * dz_soil(nzb_soil) * 0.5_wp
     1098             lambda_surface = pave_heat_conductivity * ddz_soil(nzb_soil)
     1099
     1100          ENDIF
     1101
     1102!
     1103!--       First step: calculate aerodyamic resistance. As pt, us, ts
     1104!--       are not available for the prognostic time step, data from the last
     1105!--       time step is used here. Note that this formulation is the
     1106!--       equivalent to the ECMWF formulation using drag coefficients
     1107          IF ( cloud_physics )  THEN
     1108             pt1 = pt(k+1,j,i) + l_d_cp * pt_d_t(k+1) * ql(k+1,j,i)
     1109             qv1 = q(k+1,j,i) - ql(k+1,j,i)
     1110          ELSE
     1111             pt1 = pt(k+1,j,i)
     1112             qv1 = q(k+1,j,i)
     1113          ENDIF
     1114
     1115          r_a(j,i) = (pt1 - pt(k,j,i)) / (ts(j,i) * us(j,i) + 1.0E-20_wp)
     1116
     1117!
     1118!--       Make sure that the resistance does not drop to zero for neutral
     1119!--       stratification
     1120          IF ( ABS(r_a(j,i)) < 1.0_wp )  r_a(j,i) = 1.0_wp
     1121
     1122!
     1123!--       Second step: calculate canopy resistance r_canopy
     1124!--       f1-f3 here are defined as 1/f1-f3 as in ECMWF documentation
    11251125 
    1126 !--          f1: correction for incoming shortwave radiation (stomata close at
    1127 !--          night)
    1128              IF ( radiation_scheme /= 'constant' )  THEN
    1129                 f1 = MIN( 1.0_wp, ( 0.004_wp * rad_sw_in(k,j,i) + 0.05_wp ) /  &
    1130                               (0.81_wp * (0.004_wp * rad_sw_in(k,j,i)          &
    1131                                + 1.0_wp)) )
    1132              ELSE
    1133                 f1 = 1.0_wp
    1134              ENDIF
    1135 
    1136 
    1137 !
    1138 !--          f2: correction for soil moisture availability to plants (the
    1139 !--          integrated soil moisture must thus be considered here)
    1140 !--          f2 = 0 for very dry soils
    1141              m_total = 0.0_wp
    1142              DO  ks = nzb_soil, nzt_soil
    1143                  m_total = m_total + root_fr(ks,j,i)                           &
    1144                            * MAX(m_soil(ks,j,i),m_wilt(j,i))
    1145              ENDDO
    1146 
    1147              IF ( m_total > m_wilt(j,i)  .AND.  m_total < m_fc(j,i) )  THEN
    1148                 f2 = ( m_total - m_wilt(j,i) ) / (m_fc(j,i) - m_wilt(j,i) )
    1149              ELSEIF ( m_total >= m_fc(j,i) )  THEN
    1150                 f2 = 1.0_wp
    1151              ELSE
    1152                 f2 = 1.0E-20_wp
    1153              ENDIF
    1154 
    1155 !
    1156 !--          Calculate water vapour pressure at saturation
    1157              e_s = 0.01_wp * 610.78_wp * EXP( 17.269_wp * ( t_surface(j,i)     &
    1158                            - 273.16_wp ) / ( t_surface(j,i) - 35.86_wp ) )
    1159 
    1160 !
    1161 !--          f3: correction for vapour pressure deficit
    1162              IF ( g_d(j,i) /= 0.0_wp )  THEN
    1163 !
    1164 !--             Calculate vapour pressure
    1165                 e  = qv1 * surface_pressure / 0.622_wp
    1166                 f3 = EXP ( -g_d(j,i) * (e_s - e) )
    1167              ELSE
    1168                 f3 = 1.0_wp
    1169              ENDIF
    1170 
    1171 !
    1172 !--          Calculate canopy resistance. In case that c_veg is 0 (bare soils),
    1173 !--          this calculation is obsolete, as r_canopy is not used below.
    1174 !--          To do: check for very dry soil -> r_canopy goes to infinity
    1175              r_canopy(j,i) = r_canopy_min(j,i) / (lai(j,i) * f1 * f2 * f3      &
    1176                                              + 1.0E-20_wp)
    1177 
    1178 !
    1179 !--          Third step: calculate bare soil resistance r_soil. The Clapp &
    1180 !--          Hornberger parametrization does not consider c_veg.
    1181              IF ( soil_type_2d(j,i) /= 7 )  THEN
    1182                 m_min = c_veg(j,i) * m_wilt(j,i) + (1.0_wp - c_veg(j,i)) *     &
    1183                         m_res(j,i)
    1184              ELSE
    1185                 m_min = m_wilt(j,i)
    1186              ENDIF
    1187 
    1188              f2 = ( m_soil(nzb_soil,j,i) - m_min ) / ( m_fc(j,i) - m_min )
    1189              f2 = MAX(f2,1.0E-20_wp)
    1190              f2 = MIN(f2,1.0_wp)
    1191 
    1192              r_soil(j,i) = r_soil_min(j,i) / f2
    1193 
    1194 !
    1195 !--          Calculate the maximum possible liquid water amount on plants and
    1196 !--          bare surface. For vegetated surfaces, a maximum depth of 0.2 mm is
    1197 !--          assumed, while paved surfaces might hold up 1 mm of water. The
    1198 !--          liquid water fraction for paved surfaces is calculated after
    1199 !--          Noilhan & Planton (1989), while the ECMWF formulation is used for
    1200 !--          vegetated surfaces and bare soils.
    1201              IF ( pave_surface(j,i) )  THEN
    1202                 m_liq_eb_max = m_max_depth * 5.0_wp
    1203                 c_liq(j,i) = MIN( 1.0_wp, (m_liq_eb(j,i) / m_liq_eb_max)**0.67 )
    1204              ELSE
    1205                 m_liq_eb_max = m_max_depth * ( c_veg(j,i) * lai(j,i)           &
    1206                                + (1.0_wp - c_veg(j,i)) )
    1207                 c_liq(j,i) = MIN( 1.0_wp, m_liq_eb(j,i) / m_liq_eb_max )
    1208              ENDIF
    1209 
    1210 !
    1211 !--          Calculate saturation specific humidity
    1212              q_s = 0.622_wp * e_s / surface_pressure
    1213 
    1214 !
    1215 !--          In case of dewfall, set evapotranspiration to zero
    1216 !--          All super-saturated water is then removed from the air
    1217              IF ( humidity  .AND.  q_s <= qv1 )  THEN
    1218                 r_canopy(j,i) = 0.0_wp
    1219                 r_soil(j,i)   = 0.0_wp
    1220              ENDIF
    1221 
    1222 !
    1223 !--          Calculate coefficients for the total evapotranspiration
    1224 !--          In case of water surface, set vegetation and soil fluxes to zero.
    1225 !--          For pavements, only evaporation of liquid water is possible.
    1226              IF ( water_surface(j,i) )  THEN
    1227                 f_qsws_veg  = 0.0_wp
    1228                 f_qsws_soil = 0.0_wp
    1229                 f_qsws_liq  = rho_lv / r_a(j,i)
    1230              ELSEIF ( pave_surface (j,i) )  THEN
    1231                 f_qsws_veg  = 0.0_wp
    1232                 f_qsws_soil = 0.0_wp
    1233                 f_qsws_liq  = rho_lv * c_liq(j,i) / r_a(j,i)
    1234              ELSE
    1235                 f_qsws_veg  = rho_lv * c_veg(j,i) * (1.0_wp - c_liq(j,i))/     &
    1236                               (r_a(j,i) + r_canopy(j,i))
    1237                 f_qsws_soil = rho_lv * (1.0_wp - c_veg(j,i)) / (r_a(j,i) +     &
    1238                                                           r_soil(j,i))
    1239                 f_qsws_liq  = rho_lv * c_veg(j,i) * c_liq(j,i) / r_a(j,i)
    1240              ENDIF
    1241 !
    1242 !--          If soil moisture is below wilting point, plants do no longer
    1243 !--          transpirate.
    1244 !              IF ( m_soil(k,j,i) < m_wilt(j,i) )  THEN
    1245 !                 f_qsws_veg = 0.0_wp
    1246 !              ENDIF
    1247 
    1248              f_shf  = rho_cp / r_a(j,i)
    1249              f_qsws = f_qsws_veg + f_qsws_soil + f_qsws_liq
    1250 
    1251 !
    1252 !--          Calculate derivative of q_s for Taylor series expansion
    1253              e_s_dt = e_s * ( 17.269_wp / (t_surface(j,i) - 35.86_wp) -        &
    1254                               17.269_wp*(t_surface(j,i) - 273.16_wp)           &
    1255                               / (t_surface(j,i) - 35.86_wp)**2 )
    1256 
    1257              dq_s_dt = 0.622_wp * e_s_dt / surface_pressure
    1258 
    1259 !
    1260 !--          Add LW up so that it can be removed in prognostic equation
    1261              rad_net_l(j,i) = rad_net(j,i) + rad_lw_out(nzb,j,i)
    1262 
    1263 !
    1264 !--          Calculate new skin temperature
    1265              IF ( humidity )  THEN
    1266 #if defined ( __rrtmg )
    1267 !
    1268 !--             Numerator of the prognostic equation
    1269                 coef_1 = rad_net_l(j,i) + rad_lw_out_change_0(j,i)             &
    1270                          * t_surface(j,i) - rad_lw_out(nzb,j,i)                &
    1271                          + f_shf * pt1 + f_qsws * ( qv1 - q_s                  &
    1272                          + dq_s_dt * t_surface(j,i) ) + lambda_surface         &
    1273                          * t_soil(nzb_soil,j,i)
    1274 
    1275 !
    1276 !--             Denominator of the prognostic equation
    1277                 coef_2 = rad_lw_out_change_0(j,i) + f_qsws * dq_s_dt           &
    1278                          + lambda_surface + f_shf / exn
    1279 #else
    1280 
    1281 !
    1282 !--             Numerator of the prognostic equation
    1283                 coef_1 = rad_net_l(j,i) + 3.0_wp * sigma_sb                    &
    1284                          * t_surface(j,i) ** 4                                 &
    1285                          + f_shf * pt1 + f_qsws * ( qv1                        &
    1286                          - q_s + dq_s_dt * t_surface(j,i) )                    &
    1287                          + lambda_surface * t_soil(nzb_soil,j,i)
    1288 
    1289 !
    1290 !--             Denominator of the prognostic equation
    1291                 coef_2 = 4.0_wp * sigma_sb * t_surface(j,i) ** 3 + f_qsws      &
    1292                          * dq_s_dt + lambda_surface + f_shf / exn
    1293  
    1294 #endif
    1295              ELSE
    1296 
    1297 #if defined ( __rrtmg )
    1298 !
    1299 !--             Numerator of the prognostic equation
    1300                 coef_1 = rad_net_l(j,i) + rad_lw_out_change_0(j,i)             &
    1301                          * t_surface(j,i) - rad_lw_out(nzb,j,i)                &
    1302                          + f_shf * pt1  + lambda_surface                       &
    1303                          * t_soil(nzb_soil,j,i)
    1304 
    1305 !
    1306 !--             Denominator of the prognostic equation
    1307                 coef_2 = rad_lw_out_change_0(j,i) + lambda_surface + f_shf / exn
    1308 #else
    1309 
    1310 !
    1311 !--             Numerator of the prognostic equation
    1312                 coef_1 = rad_net_l(j,i) + 3.0_wp * sigma_sb                    &
    1313                           * t_surface(j,i) ** 4 + f_shf * pt1                  &
    1314                           + lambda_surface * t_soil(nzb_soil,j,i)
    1315 
    1316 !
    1317 !--             Denominator of the prognostic equation
    1318                 coef_2 = 4.0_wp * sigma_sb * t_surface(j,i) ** 3               &
    1319                          + lambda_surface + f_shf / exn
    1320 #endif
    1321              ENDIF
    1322 
    1323              tend = 0.0_wp
    1324 
    1325 !
    1326 !--          Implicit solution when the surface layer has no heat capacity,
    1327 !--          otherwise use RK3 scheme.
    1328              t_surface_p(j,i) = ( coef_1 * dt_3d * tsc(2) + c_surface_tmp *    &
    1329                                 t_surface(j,i) ) / ( c_surface_tmp + coef_2    &
     1126!--       f1: correction for incoming shortwave radiation (stomata close at
     1127!--       night)
     1128          f1 = MIN( 1.0_wp, ( 0.004_wp * rad_sw_in(k,j,i) + 0.05_wp ) /        &
     1129                           (0.81_wp * (0.004_wp * rad_sw_in(k,j,i)             &
     1130                            + 1.0_wp)) )
     1131
     1132
     1133
     1134!
     1135!--       f2: correction for soil moisture availability to plants (the
     1136!--       integrated soil moisture must thus be considered here)
     1137!--       f2 = 0 for very dry soils
     1138          m_total = 0.0_wp
     1139          DO  ks = nzb_soil, nzt_soil
     1140              m_total = m_total + root_fr(ks,j,i)                              &
     1141                        * MAX(m_soil(ks,j,i),m_wilt(j,i))
     1142          ENDDO
     1143
     1144          IF ( m_total > m_wilt(j,i)  .AND.  m_total < m_fc(j,i) )  THEN
     1145             f2 = ( m_total - m_wilt(j,i) ) / (m_fc(j,i) - m_wilt(j,i) )
     1146          ELSEIF ( m_total >= m_fc(j,i) )  THEN
     1147             f2 = 1.0_wp
     1148          ELSE
     1149             f2 = 1.0E-20_wp
     1150          ENDIF
     1151
     1152!
     1153!--       Calculate water vapour pressure at saturation
     1154          e_s = 0.01_wp * 610.78_wp * EXP( 17.269_wp * ( t_surface(j,i)        &
     1155                        - 273.16_wp ) / ( t_surface(j,i) - 35.86_wp ) )
     1156
     1157!
     1158!--       f3: correction for vapour pressure deficit
     1159          IF ( g_d(j,i) /= 0.0_wp )  THEN
     1160!
     1161!--          Calculate vapour pressure
     1162             e  = qv1 * surface_pressure / 0.622_wp
     1163             f3 = EXP ( -g_d(j,i) * (e_s - e) )
     1164          ELSE
     1165             f3 = 1.0_wp
     1166          ENDIF
     1167
     1168!
     1169!--       Calculate canopy resistance. In case that c_veg is 0 (bare soils),
     1170!--       this calculation is obsolete, as r_canopy is not used below.
     1171!--       To do: check for very dry soil -> r_canopy goes to infinity
     1172          r_canopy(j,i) = r_canopy_min(j,i) / (lai(j,i) * f1 * f2 * f3         &
     1173                                          + 1.0E-20_wp)
     1174
     1175!
     1176!--       Third step: calculate bare soil resistance r_soil. The Clapp &
     1177!--       Hornberger parametrization does not consider c_veg.
     1178          IF ( soil_type_2d(j,i) /= 7 )  THEN
     1179             m_min = c_veg(j,i) * m_wilt(j,i) + (1.0_wp - c_veg(j,i)) *        &
     1180                     m_res(j,i)
     1181          ELSE
     1182             m_min = m_wilt(j,i)
     1183          ENDIF
     1184
     1185          f2 = ( m_soil(nzb_soil,j,i) - m_min ) / ( m_fc(j,i) - m_min )
     1186          f2 = MAX(f2,1.0E-20_wp)
     1187          f2 = MIN(f2,1.0_wp)
     1188
     1189          r_soil(j,i) = r_soil_min(j,i) / f2
     1190
     1191!
     1192!--       Calculate the maximum possible liquid water amount on plants and
     1193!--       bare surface. For vegetated surfaces, a maximum depth of 0.2 mm is
     1194!--       assumed, while paved surfaces might hold up 1 mm of water. The
     1195!--       liquid water fraction for paved surfaces is calculated after
     1196!--       Noilhan & Planton (1989), while the ECMWF formulation is used for
     1197!--       vegetated surfaces and bare soils.
     1198          IF ( pave_surface(j,i) )  THEN
     1199             m_liq_eb_max = m_max_depth * 5.0_wp
     1200             c_liq(j,i) = MIN( 1.0_wp, (m_liq_eb(j,i) / m_liq_eb_max)**0.67 )
     1201          ELSE
     1202             m_liq_eb_max = m_max_depth * ( c_veg(j,i) * lai(j,i)              &
     1203                            + (1.0_wp - c_veg(j,i)) )
     1204             c_liq(j,i) = MIN( 1.0_wp, m_liq_eb(j,i) / m_liq_eb_max )
     1205          ENDIF
     1206
     1207!
     1208!--       Calculate saturation specific humidity
     1209          q_s = 0.622_wp * e_s / surface_pressure
     1210
     1211!
     1212!--       In case of dewfall, set evapotranspiration to zero
     1213!--       All super-saturated water is then removed from the air
     1214          IF ( humidity  .AND.  q_s <= qv1 )  THEN
     1215             r_canopy(j,i) = 0.0_wp
     1216             r_soil(j,i)   = 0.0_wp
     1217          ENDIF
     1218
     1219!
     1220!--       Calculate coefficients for the total evapotranspiration
     1221!--       In case of water surface, set vegetation and soil fluxes to zero.
     1222!--       For pavements, only evaporation of liquid water is possible.
     1223          IF ( water_surface(j,i) )  THEN
     1224             f_qsws_veg  = 0.0_wp
     1225             f_qsws_soil = 0.0_wp
     1226             f_qsws_liq  = rho_lv / r_a(j,i)
     1227          ELSEIF ( pave_surface (j,i) )  THEN
     1228             f_qsws_veg  = 0.0_wp
     1229             f_qsws_soil = 0.0_wp
     1230             f_qsws_liq  = rho_lv * c_liq(j,i) / r_a(j,i)
     1231          ELSE
     1232             f_qsws_veg  = rho_lv * c_veg(j,i) * (1.0_wp - c_liq(j,i))/        &
     1233                           (r_a(j,i) + r_canopy(j,i))
     1234             f_qsws_soil = rho_lv * (1.0_wp - c_veg(j,i)) / (r_a(j,i) +        &
     1235                                                             r_soil(j,i))
     1236             f_qsws_liq  = rho_lv * c_veg(j,i) * c_liq(j,i) / r_a(j,i)
     1237          ENDIF
     1238!
     1239!--       If soil moisture is below wilting point, plants do no longer
     1240!--       transpirate.
     1241!           IF ( m_soil(k,j,i) < m_wilt(j,i) )  THEN
     1242!              f_qsws_veg = 0.0_wp
     1243!           ENDIF
     1244
     1245          f_shf  = rho_cp / r_a(j,i)
     1246          f_qsws = f_qsws_veg + f_qsws_soil + f_qsws_liq
     1247
     1248!
     1249!--       Calculate derivative of q_s for Taylor series expansion
     1250          e_s_dt = e_s * ( 17.269_wp / (t_surface(j,i) - 35.86_wp) -           &
     1251                           17.269_wp*(t_surface(j,i) - 273.16_wp)              &
     1252                           / (t_surface(j,i) - 35.86_wp)**2 )
     1253
     1254          dq_s_dt = 0.622_wp * e_s_dt / surface_pressure
     1255
     1256!
     1257!--       Add LW up so that it can be removed in prognostic equation
     1258          rad_net_l(j,i) = rad_net(j,i) + rad_lw_out(nzb,j,i)
     1259
     1260!
     1261!--       Calculate new skin temperature
     1262          IF ( humidity )  THEN
     1263
     1264!
     1265!--          Numerator of the prognostic equation
     1266             coef_1 = rad_net_l(j,i) + rad_lw_out_change_0(j,i)                &
     1267                      * t_surface(j,i) - rad_lw_out(nzb,j,i)                   &
     1268                      + f_shf * pt1 + f_qsws * ( qv1 - q_s                     &
     1269                      + dq_s_dt * t_surface(j,i) ) + lambda_surface            &
     1270                      * t_soil(nzb_soil,j,i)
     1271
     1272!
     1273!--          Denominator of the prognostic equation
     1274             coef_2 = rad_lw_out_change_0(j,i) + f_qsws * dq_s_dt              &
     1275                      + lambda_surface + f_shf / exn
     1276          ELSE
     1277
     1278!
     1279!--          Numerator of the prognostic equation
     1280             coef_1 = rad_net_l(j,i) + rad_lw_out_change_0(j,i)                &
     1281                      * t_surface(j,i) - rad_lw_out(nzb,j,i)                   &
     1282                      + f_shf * pt1  + lambda_surface                          &
     1283                      * t_soil(nzb_soil,j,i)
     1284
     1285!
     1286!--          Denominator of the prognostic equation
     1287             coef_2 = rad_lw_out_change_0(j,i) + lambda_surface + f_shf / exn
     1288
     1289          ENDIF
     1290
     1291          tend = 0.0_wp
     1292
     1293!
     1294!--       Implicit solution when the surface layer has no heat capacity,
     1295!--       otherwise use RK3 scheme.
     1296          t_surface_p(j,i) = ( coef_1 * dt_3d * tsc(2) + c_surface_tmp *       &
     1297                             t_surface(j,i) ) / ( c_surface_tmp + coef_2       &
    13301298                                * dt_3d * tsc(2) )
    13311299
    13321300!
    1333 !--          Add RK3 term
    1334              IF ( c_surface_tmp /= 0.0_wp )  THEN
    1335 
    1336                 t_surface_p(j,i) = t_surface_p(j,i) + dt_3d * tsc(3)           &
    1337                                    * tt_surface_m(j,i)
    1338 
    1339 !
    1340 !--             Calculate true tendency
    1341                 tend = (t_surface_p(j,i) - t_surface(j,i) - dt_3d * tsc(3)     &
    1342                        * tt_surface_m(j,i)) / (dt_3d  * tsc(2))
    1343 !
    1344 !--             Calculate t_surface tendencies for the next Runge-Kutta step
    1345                 IF ( timestep_scheme(1:5) == 'runge' )  THEN
    1346                    IF ( intermediate_timestep_count == 1 )  THEN
    1347                       tt_surface_m(j,i) = tend
    1348                    ELSEIF ( intermediate_timestep_count <                      &
    1349                             intermediate_timestep_count_max )  THEN
    1350                       tt_surface_m(j,i) = -9.5625_wp * tend + 5.3125_wp        &
    1351                                           * tt_surface_m(j,i)
    1352                    ENDIF
     1301!--       Add RK3 term
     1302          IF ( c_surface_tmp /= 0.0_wp )  THEN
     1303
     1304             t_surface_p(j,i) = t_surface_p(j,i) + dt_3d * tsc(3)              &
     1305                                * tt_surface_m(j,i)
     1306
     1307!
     1308!--          Calculate true tendency
     1309             tend = (t_surface_p(j,i) - t_surface(j,i) - dt_3d * tsc(3)        &
     1310                    * tt_surface_m(j,i)) / (dt_3d  * tsc(2))
     1311!
     1312!--          Calculate t_surface tendencies for the next Runge-Kutta step
     1313             IF ( timestep_scheme(1:5) == 'runge' )  THEN
     1314                IF ( intermediate_timestep_count == 1 )  THEN
     1315                   tt_surface_m(j,i) = tend
     1316                ELSEIF ( intermediate_timestep_count <                         &
     1317                         intermediate_timestep_count_max )  THEN
     1318                   tt_surface_m(j,i) = -9.5625_wp * tend + 5.3125_wp           &
     1319                                       * tt_surface_m(j,i)
    13531320                ENDIF
    13541321             ENDIF
    1355 
    1356 !
    1357 !--          In case of fast changes in the skin temperature, it is possible to
    1358 !--          update the radiative fluxes independently from the prescribed
    1359 !--          radiation call frequency. This effectively prevents oscillations,
    1360 !--          especially when setting skip_time_do_radiation /= 0. The threshold
    1361 !--          value of 0.2 used here is just a first guess. This method should be
    1362 !--          revised in the future as tests have shown that the threshold is
    1363 !--          often reached, when no oscillations would occur (causes immense
    1364 !--          computing time for the radiation code).
    1365              IF ( ABS( t_surface_p(j,i) - t_surface(j,i) ) > 0.2_wp  .AND.     &
    1366                   unscheduled_radiation_calls )  THEN
    1367                 force_radiation_call_l = .TRUE.
     1322          ENDIF
     1323
     1324!
     1325!--       In case of fast changes in the skin temperature, it is possible to
     1326!--       update the radiative fluxes independently from the prescribed
     1327!--       radiation call frequency. This effectively prevents oscillations,
     1328!--       especially when setting skip_time_do_radiation /= 0. The threshold
     1329!--       value of 0.2 used here is just a first guess. This method should be
     1330!--       revised in the future as tests have shown that the threshold is
     1331!--       often reached, when no oscillations would occur (causes immense
     1332!--       computing time for the radiation code).
     1333          IF ( ABS( t_surface_p(j,i) - t_surface(j,i) ) > 0.2_wp  .AND.        &
     1334               unscheduled_radiation_calls )  THEN
     1335             force_radiation_call_l = .TRUE.
     1336          ENDIF
     1337
     1338          pt(k,j,i) = t_surface_p(j,i) / exn
     1339
     1340!
     1341!--       Calculate fluxes
     1342          rad_net_l(j,i)   = rad_net_l(j,i) + rad_lw_out_change_0(j,i)         &
     1343                             * t_surface(j,i) - rad_lw_out(nzb,j,i)            &
     1344                             - rad_lw_out_change_0(j,i) * t_surface_p(j,i)
     1345
     1346          rad_net(j,i) = rad_net_l(j,i)
     1347          rad_lw_out(nzb,j,i) = rad_lw_out(nzb,j,i) + rad_lw_out_change_0(j,i) &
     1348                                * ( t_surface_p(j,i) - t_surface(j,i) )
     1349
     1350          ghf_eb(j,i)    = lambda_surface * (t_surface_p(j,i)                  &
     1351                           - t_soil(nzb_soil,j,i))
     1352
     1353          shf_eb(j,i)    = - f_shf * ( pt1 - pt(k,j,i) )
     1354
     1355          shf(j,i) = shf_eb(j,i) / rho_cp
     1356
     1357          IF ( humidity )  THEN
     1358             qsws_eb(j,i)  = - f_qsws    * ( qv1 - q_s + dq_s_dt               &
     1359                             * t_surface(j,i) - dq_s_dt * t_surface_p(j,i) )
     1360
     1361             qsws(j,i) = qsws_eb(j,i) / rho_lv
     1362
     1363             qsws_veg_eb(j,i)  = - f_qsws_veg  * ( qv1 - q_s                   &
     1364                                 + dq_s_dt * t_surface(j,i) - dq_s_dt          &
     1365                                 * t_surface_p(j,i) )
     1366
     1367             qsws_soil_eb(j,i) = - f_qsws_soil * ( qv1 - q_s                   &
     1368                                 + dq_s_dt * t_surface(j,i) - dq_s_dt          &
     1369                                 * t_surface_p(j,i) )
     1370
     1371             qsws_liq_eb(j,i)  = - f_qsws_liq  * ( qv1 - q_s                   &
     1372                                 + dq_s_dt * t_surface(j,i) - dq_s_dt          &
     1373                                 * t_surface_p(j,i) )
     1374          ENDIF
     1375
     1376!
     1377!--       Calculate the true surface resistance
     1378          IF ( qsws_eb(j,i) == 0.0_wp )  THEN
     1379             r_s(j,i) = 1.0E10_wp
     1380          ELSE
     1381             r_s(j,i) = - rho_lv * ( qv1 - q_s + dq_s_dt                       &
     1382                        * t_surface(j,i) - dq_s_dt * t_surface_p(j,i) )        &
     1383                        / qsws_eb(j,i) - r_a(j,i)
     1384          ENDIF
     1385
     1386!
     1387!--       Calculate change in liquid water reservoir due to dew fall or
     1388!--       evaporation of liquid water
     1389          IF ( humidity )  THEN
     1390!
     1391!--          If precipitation is activated, add rain water to qsws_liq_eb
     1392!--          and qsws_soil_eb according the the vegetation coverage.
     1393!--          precipitation_rate is given in mm.
     1394             IF ( precipitation )  THEN
     1395
     1396!
     1397!--             Add precipitation to liquid water reservoir, if possible.
     1398!--             Otherwise, add the water to soil. In case of
     1399!--             pavements, the exceeding water amount is implicitely removed
     1400!--             as runoff as qsws_soil_eb is then not used in the soil model
     1401                IF ( m_liq_eb(j,i) /= m_liq_eb_max )  THEN
     1402                   qsws_liq_eb(j,i) = qsws_liq_eb(j,i)                         &
     1403                                    + c_veg(j,i) * prr(k,j,i) * hyrho(k)       &
     1404                                    * 0.001_wp * rho_l * l_v
     1405                ELSE
     1406                   qsws_soil_eb(j,i) = qsws_soil_eb(j,i)                       &
     1407                                     + c_veg(j,i) * prr(k,j,i) * hyrho(k)      &
     1408                                     * 0.001_wp * rho_l * l_v
     1409                ENDIF
     1410
     1411!--             Add precipitation to bare soil according to the bare soil
     1412!--             coverage.
     1413                qsws_soil_eb(j,i) = qsws_soil_eb(j,i) + (1.0_wp                &
     1414                                    - c_veg(j,i)) * prr(k,j,i) * hyrho(k)      &
     1415                                    * 0.001_wp * rho_l * l_v
    13681416             ENDIF
    13691417
    1370              pt(k,j,i) = t_surface_p(j,i) / exn
    1371 
    1372 !
    1373 !--          Calculate fluxes
    1374 #if defined ( __rrtmg )
    1375              rad_net_l(j,i)   = rad_net_l(j,i) + rad_lw_out_change_0(j,i)      &
    1376                                 * t_surface(j,i) - rad_lw_out(nzb,j,i)         &
    1377                                 - rad_lw_out_change_0(j,i) * t_surface_p(j,i)
    1378 
    1379              IF ( rrtm_idrv == 1 )  THEN
    1380                 rad_net(j,i) = rad_net_l(j,i)
    1381                 rad_lw_out(nzb,j,i) = rad_lw_out(nzb,j,i)                      &
    1382                                       + rad_lw_out_change_0(j,i)               &
    1383                                       * ( t_surface_p(j,i) - t_surface(j,i) )
     1418!
     1419!--          If the air is saturated, check the reservoir water level
     1420             IF ( qsws_eb(j,i) < 0.0_wp )  THEN
     1421
     1422!
     1423!--             Check if reservoir is full (avoid values > m_liq_eb_max)
     1424!--             In that case, qsws_liq_eb goes to qsws_soil_eb. In this
     1425!--             case qsws_veg_eb is zero anyway (because c_liq = 1),       
     1426!--             so that tend is zero and no further check is needed
     1427                IF ( m_liq_eb(j,i) == m_liq_eb_max )  THEN
     1428                   qsws_soil_eb(j,i) = qsws_soil_eb(j,i)                       &
     1429                                        + qsws_liq_eb(j,i)
     1430
     1431                   qsws_liq_eb(j,i)  = 0.0_wp
     1432                ENDIF
     1433
     1434!
     1435!--             In case qsws_veg_eb becomes negative (unphysical behavior),
     1436!--             let the water enter the liquid water reservoir as dew on the
     1437!--             plant
     1438                IF ( qsws_veg_eb(j,i) < 0.0_wp )  THEN
     1439                   qsws_liq_eb(j,i) = qsws_liq_eb(j,i) + qsws_veg_eb(j,i)
     1440                   qsws_veg_eb(j,i) = 0.0_wp
     1441                ENDIF
     1442             ENDIF                   
     1443 
     1444             tend = - qsws_liq_eb(j,i) * drho_l_lv
     1445             m_liq_eb_p(j,i) = m_liq_eb(j,i) + dt_3d * ( tsc(2) * tend         &
     1446                                                + tsc(3) * tm_liq_eb_m(j,i) )
     1447
     1448!
     1449!--          Check if reservoir is overfull -> reduce to maximum
     1450!--          (conservation of water is violated here)
     1451             m_liq_eb_p(j,i) = MIN(m_liq_eb_p(j,i),m_liq_eb_max)
     1452
     1453!
     1454!--          Check if reservoir is empty (avoid values < 0.0)
     1455!--          (conservation of water is violated here)
     1456             m_liq_eb_p(j,i) = MAX(m_liq_eb_p(j,i),0.0_wp)
     1457
     1458
     1459!
     1460!--          Calculate m_liq_eb tendencies for the next Runge-Kutta step
     1461             IF ( timestep_scheme(1:5) == 'runge' )  THEN
     1462                IF ( intermediate_timestep_count == 1 )  THEN
     1463                   tm_liq_eb_m(j,i) = tend
     1464                ELSEIF ( intermediate_timestep_count <                         &
     1465                         intermediate_timestep_count_max )  THEN
     1466                   tm_liq_eb_m(j,i) = -9.5625_wp * tend + 5.3125_wp            &
     1467                                    * tm_liq_eb_m(j,i)
     1468                ENDIF
    13841469             ENDIF
     1470
     1471          ENDIF
     1472
     1473       ENDDO
     1474    ENDDO
     1475
     1476!
     1477!-- Make a logical OR for all processes. Force radiation call if at
     1478!-- least one processor reached the threshold change in skin temperature
     1479    IF ( unscheduled_radiation_calls  .AND.  intermediate_timestep_count       &
     1480         == intermediate_timestep_count_max-1 )  THEN
     1481#if defined( __parallel )
     1482       IF ( collective_wait )  CALL MPI_BARRIER( comm2d, ierr )
     1483       CALL MPI_ALLREDUCE( force_radiation_call_l, force_radiation_call,    &
     1484                           1, MPI_LOGICAL, MPI_LOR, comm2d, ierr )
    13851485#else
    1386              rad_net_l(j,i)   = rad_net_l(j,i) + 3.0_wp * sigma_sb             &
    1387                                 * t_surface(j,i)**4 - 4.0_wp * sigma_sb        &
    1388                                 * t_surface(j,i)**3 * t_surface_p(j,i)
     1486       force_radiation_call = force_radiation_call_l
    13891487#endif
    1390 
    1391              ghf_eb(j,i)    = lambda_surface * (t_surface_p(j,i)               &
    1392                               - t_soil(nzb_soil,j,i))
    1393 
    1394              shf_eb(j,i)    = - f_shf * ( pt1 - pt(k,j,i) )
    1395 
    1396              shf(j,i) = shf_eb(j,i) / rho_cp
    1397 
    1398              IF ( humidity )  THEN
    1399                 qsws_eb(j,i)  = - f_qsws    * ( qv1 - q_s + dq_s_dt            &
    1400                                 * t_surface(j,i) - dq_s_dt * t_surface_p(j,i) )
    1401 
    1402                 qsws(j,i) = qsws_eb(j,i) / rho_lv
    1403 
    1404                 qsws_veg_eb(j,i)  = - f_qsws_veg  * ( qv1 - q_s                &
    1405                                     + dq_s_dt * t_surface(j,i) - dq_s_dt       &
    1406                                     * t_surface_p(j,i) )
    1407 
    1408                 qsws_soil_eb(j,i) = - f_qsws_soil * ( qv1 - q_s                &
    1409                                     + dq_s_dt * t_surface(j,i) - dq_s_dt       &
    1410                                     * t_surface_p(j,i) )
    1411 
    1412                 qsws_liq_eb(j,i)  = - f_qsws_liq  * ( qv1 - q_s                &
    1413                                     + dq_s_dt * t_surface(j,i) - dq_s_dt       &
    1414                                     * t_surface_p(j,i) )
    1415              ENDIF
    1416 
    1417 !
    1418 !--          Calculate the true surface resistance
    1419              IF ( qsws_eb(j,i) == 0.0_wp )  THEN
    1420                 r_s(j,i) = 1.0E10_wp
    1421              ELSE
    1422                 r_s(j,i) = - rho_lv * ( qv1 - q_s + dq_s_dt                    &
    1423                            * t_surface(j,i) - dq_s_dt * t_surface_p(j,i) )     &
    1424                            / qsws_eb(j,i) - r_a(j,i)
    1425              ENDIF
    1426 
    1427 !
    1428 !--          Calculate change in liquid water reservoir due to dew fall or
    1429 !--          evaporation of liquid water
    1430              IF ( humidity )  THEN
    1431 !
    1432 !--             If precipitation is activated, add rain water to qsws_liq_eb
    1433 !--             and qsws_soil_eb according the the vegetation coverage.
    1434 !--             precipitation_rate is given in mm.
    1435                 IF ( precipitation )  THEN
    1436 
    1437 !
    1438 !--                Add precipitation to liquid water reservoir, if possible.
    1439 !--                Otherwise, add the water to soil. In case of
    1440 !--                pavements, the exceeding water amount is implicitely removed
    1441 !--                as runoff as qsws_soil_eb is then not used in the soil model
    1442                    IF ( m_liq_eb(j,i) /= m_liq_eb_max )  THEN
    1443                       qsws_liq_eb(j,i) = qsws_liq_eb(j,i)                      &
    1444                                        + c_veg(j,i) * prr(k,j,i) * hyrho(k)    &
    1445                                        * 0.001_wp * rho_l * l_v
    1446                    ELSE
    1447                       qsws_soil_eb(j,i) = qsws_soil_eb(j,i)                    &
    1448                                         + c_veg(j,i) * prr(k,j,i) * hyrho(k)   &
    1449                                         * 0.001_wp * rho_l * l_v
    1450                    ENDIF
    1451 
    1452 !--                Add precipitation to bare soil according to the bare soil
    1453 !--                coverage.
    1454                    qsws_soil_eb(j,i) = qsws_soil_eb(j,i) + (1.0_wp             &
    1455                                        - c_veg(j,i)) * prr(k,j,i) * hyrho(k)   &
    1456                                        * 0.001_wp * rho_l * l_v
    1457                 ENDIF
    1458 
    1459 !
    1460 !--             If the air is saturated, check the reservoir water level
    1461                 IF ( qsws_eb(j,i) < 0.0_wp )  THEN
    1462 
    1463 !
    1464 !--                Check if reservoir is full (avoid values > m_liq_eb_max)
    1465 !--                In that case, qsws_liq_eb goes to qsws_soil_eb. In this
    1466 !--                case qsws_veg_eb is zero anyway (because c_liq = 1),       
    1467 !--                so that tend is zero and no further check is needed
    1468                    IF ( m_liq_eb(j,i) == m_liq_eb_max )  THEN
    1469                       qsws_soil_eb(j,i) = qsws_soil_eb(j,i)                    &
    1470                                            + qsws_liq_eb(j,i)
    1471 
    1472                       qsws_liq_eb(j,i)  = 0.0_wp
    1473                    ENDIF
    1474 
    1475 !
    1476 !--                In case qsws_veg_eb becomes negative (unphysical behavior),
    1477 !--                let the water enter the liquid water reservoir as dew on the
    1478 !--                plant
    1479                    IF ( qsws_veg_eb(j,i) < 0.0_wp )  THEN
    1480                       qsws_liq_eb(j,i) = qsws_liq_eb(j,i) + qsws_veg_eb(j,i)
    1481                       qsws_veg_eb(j,i) = 0.0_wp
    1482                    ENDIF
    1483                 ENDIF                   
    1484  
    1485                 tend = - qsws_liq_eb(j,i) * drho_l_lv
    1486 
    1487                 m_liq_eb_p(j,i) = m_liq_eb(j,i) + dt_3d * ( tsc(2) * tend      &
    1488                                                    + tsc(3) * tm_liq_eb_m(j,i) )
    1489 
    1490 !
    1491 !--             Check if reservoir is overfull -> reduce to maximum
    1492 !--             (conservation of water is violated here)
    1493                 m_liq_eb_p(j,i) = MIN(m_liq_eb_p(j,i),m_liq_eb_max)
    1494 
    1495 !
    1496 !--             Check if reservoir is empty (avoid values < 0.0)
    1497 !--             (conservation of water is violated here)
    1498                 m_liq_eb_p(j,i) = MAX(m_liq_eb_p(j,i),0.0_wp)
    1499 
    1500 
    1501 !
    1502 !--             Calculate m_liq_eb tendencies for the next Runge-Kutta step
    1503                 IF ( timestep_scheme(1:5) == 'runge' )  THEN
    1504                    IF ( intermediate_timestep_count == 1 )  THEN
    1505                       tm_liq_eb_m(j,i) = tend
    1506                    ELSEIF ( intermediate_timestep_count <                      &
    1507                             intermediate_timestep_count_max )  THEN
    1508                       tm_liq_eb_m(j,i) = -9.5625_wp * tend + 5.3125_wp         &
    1509                                       * tm_liq_eb_m(j,i)
    1510                    ENDIF
    1511                 ENDIF
    1512 
    1513              ENDIF
    1514 
    1515           ENDDO
    1516        ENDDO
    1517 
    1518 !
    1519 !--    Make a logical OR for all processes. Force radiation call if at
    1520 !--    least one processor reached the threshold change in skin temperature
    1521        IF ( unscheduled_radiation_calls  .AND.  intermediate_timestep_count    &
    1522             == intermediate_timestep_count_max-1 )  THEN
    1523 #if defined( __parallel )
    1524           IF ( collective_wait )  CALL MPI_BARRIER( comm2d, ierr )
    1525           CALL MPI_ALLREDUCE( force_radiation_call_l, force_radiation_call,    &
    1526                               1, MPI_LOGICAL, MPI_LOR, comm2d, ierr )
    1527 #else
    1528           force_radiation_call = force_radiation_call_l
    1529 #endif
    1530           force_radiation_call_l = .FALSE.
    1531        ENDIF
    1532 
    1533 !
    1534 !--    Calculate surface specific humidity
    1535        IF ( humidity )  THEN
    1536           CALL calc_q_surface
    1537        ENDIF
    1538 
    1539 !
    1540 !--    Calculate new roughness lengths (for water surfaces only)
    1541        CALL calc_z0_water_surface
    1542 
    1543 
    1544     END SUBROUTINE lsm_energy_balance
     1488       force_radiation_call_l = .FALSE.
     1489    ENDIF
     1490
     1491!
     1492!-- Calculate surface specific humidity
     1493    IF ( humidity )  THEN
     1494       CALL calc_q_surface
     1495    ENDIF
     1496
     1497!
     1498!-- Calculate new roughness lengths (for water surfaces only)
     1499    CALL calc_z0_water_surface
     1500
     1501
     1502 END SUBROUTINE lsm_energy_balance
     1503
    15451504
    15461505!------------------------------------------------------------------------------!
     
    24512410! Description:
    24522411! ------------
    2453 !> Soubroutine for averaging 3D data
     2412!> Subroutine for averaging 3D data
    24542413!------------------------------------------------------------------------------!
    24552414SUBROUTINE lsm_3d_data_averaging( mode, variable )
     
    28052764! Description:
    28062765! ------------
    2807 !> Soubroutine defines appropriate grid for netcdf variables.
     2766!> Subroutine defining appropriate grid for netcdf variables.
    28082767!> It is called out from subroutine netcdf.
    28092768!------------------------------------------------------------------------------!
    2810     SUBROUTINE lsm_define_netcdf_grid( var, found, grid_x, grid_y, grid_z )
     2769 SUBROUTINE lsm_define_netcdf_grid( var, found, grid_x, grid_y, grid_z )
    28112770   
    2812         IMPLICIT NONE
    2813 
    2814         CHARACTER (LEN=*), INTENT(IN)  ::  var         !<
    2815         LOGICAL, INTENT(OUT)           ::  found       !<
    2816         CHARACTER (LEN=*), INTENT(OUT) ::  grid_x      !<
    2817         CHARACTER (LEN=*), INTENT(OUT) ::  grid_y      !<
    2818         CHARACTER (LEN=*), INTENT(OUT) ::  grid_z      !<
    2819 
    2820 
    2821 
    2822 !
    2823 !--     Check for the grid
    2824         SELECT CASE ( TRIM( var ) )
    2825 
    2826            CASE ( 'm_soil', 't_soil' )
    2827               found  = .TRUE.
    2828               grid_x = 'x'
    2829               grid_y = 'y'
    2830               grid_z = 'zs'
    2831 
    2832            CASE DEFAULT
    2833               found  = .FALSE.
    2834               grid_x = 'none'
    2835               grid_y = 'none'
    2836               grid_z = 'none'
    2837         END SELECT
    2838 
    2839     END SUBROUTINE lsm_define_netcdf_grid
     2771     IMPLICIT NONE
     2772
     2773     CHARACTER (LEN=*), INTENT(IN)  ::  var         !<
     2774     LOGICAL, INTENT(OUT)           ::  found       !<
     2775     CHARACTER (LEN=*), INTENT(OUT) ::  grid_x      !<
     2776     CHARACTER (LEN=*), INTENT(OUT) ::  grid_y      !<
     2777     CHARACTER (LEN=*), INTENT(OUT) ::  grid_z      !<
     2778
     2779     found  = .TRUE.
     2780
     2781!
     2782!--  Check for the grid
     2783     SELECT CASE ( TRIM( var ) )
     2784
     2785        CASE ( 'm_soil', 't_soil', 'm_soil_xy', 't_soil_xy', 'm_soil_xz',      &
     2786               't_soil_xz', 'm_soil_yz', 't_soil_yz' )
     2787           grid_x = 'x'
     2788           grid_y = 'y'
     2789           grid_z = 'zs'
     2790
     2791        CASE DEFAULT
     2792           found  = .FALSE.
     2793           grid_x = 'none'
     2794           grid_y = 'none'
     2795           grid_z = 'none'
     2796     END SELECT
     2797
     2798 END SUBROUTINE lsm_define_netcdf_grid
    28402799
    28412800!------------------------------------------------------------------------------!
     
    28432802! Description:
    28442803! ------------
    2845 !> Soubroutine defines 3D output variables
     2804!> Subroutine defining 3D output variables
    28462805!------------------------------------------------------------------------------!
    28472806 SUBROUTINE lsm_data_output_2d( av, variable, found, grid, mode, local_pf,     &
    28482807                                two_d, nzb_do, nzt_do )
    28492808 
    2850 
    28512809    USE indices
    28522810
    28532811    USE kinds
    28542812
    2855     USE user
    28562813
    28572814    IMPLICIT NONE
     
    31743131! Description:
    31753132! ------------
    3176 !> Soubroutine defines 3D output variables
     3133!> Subroutine defining 3D output variables
    31773134!------------------------------------------------------------------------------!
    31783135 SUBROUTINE lsm_data_output_3d( av, variable, found, local_pf )
Note: See TracChangeset for help on using the changeset viewer.