source: palm/trunk/SOURCE/plant_canopy_model_mod.f90 @ 3176

Last change on this file since 3176 was 3065, checked in by Giersch, 6 years ago

New vertical stretching procedure has been introduced

  • Property svn:keywords set to Id
File size: 75.6 KB
RevLine 
[1826]1!> @file plant_canopy_model_mod.f90
[2000]2!------------------------------------------------------------------------------!
[2696]3! This file is part of the PALM model system.
[1036]4!
[2000]5! PALM is free software: you can redistribute it and/or modify it under the
6! terms of the GNU General Public License as published by the Free Software
7! Foundation, either version 3 of the License, or (at your option) any later
8! version.
[1036]9!
10! PALM is distributed in the hope that it will be useful, but WITHOUT ANY
11! WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
12! A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
13!
14! You should have received a copy of the GNU General Public License along with
15! PALM. If not, see <http://www.gnu.org/licenses/>.
16!
[2718]17! Copyright 1997-2018 Leibniz Universitaet Hannover
[2000]18!------------------------------------------------------------------------------!
[1036]19!
[257]20! Current revisions:
[2977]21! ------------------
[2214]22!
[3049]23!
[2214]24! Former revisions:
25! -----------------
26! $Id: plant_canopy_model_mod.f90 3065 2018-06-12 07:03:02Z suehring $
[3065]27! dz was replaced by the help of zw to allow for vertical stretching
28!
29! 3049 2018-05-29 13:52:36Z Giersch
[3049]30! Error messages revised
31!
32! 3045 2018-05-28 07:55:41Z Giersch
[3045]33! Error message revised
34!
35! 3022 2018-05-18 11:12:35Z suehring
[3022]36! Bugfix in allocation of transpiration rate
37!
38! 3014 2018-05-09 08:42:38Z maronga
[3014]39! Bugfix: nzb_do and nzt_do were not used for 3d data output
40! Added pc_transpiration_rate
41!
42! 2977 2018-04-17 10:27:57Z kanani
[2977]43! Implement changes from branch radiation (r2948-2971) with minor modifications,
44! plus some formatting.
45! (moh.hefny):
46! Add plant canopy type to account for changes in LAD (based on the changes
47! done by Resler & Pavel) and correct the error message to PALM Standard.
48!
49! 2932 2018-03-26 09:39:22Z maronga
[2932]50! renamed canopy_par to plant_canopy_parameters
51!
52! 2920 2018-03-22 11:22:01Z kanani
[2920]53! Move usm_lad_rma and prototype_lad to radiation_model (moh.hefny)
54!
55! 2892 2018-03-14 15:06:29Z suehring
[2892]56! Bugfix, read separate ASCII LAD files for parent and child model.
57!
58! 2770 2018-01-25 15:10:09Z kanani
[2770]59! Correction of parameter check
60!
61! 2768 2018-01-24 15:38:29Z kanani
[2768]62! Added check for output quantity pcm_heatrate, some formatting
63!
64! 2766 2018-01-22 17:17:47Z kanani
[2766]65! Increased LEN of canopy mode to 30
66!
67! 2746 2018-01-15 12:06:04Z suehring
[2746]68! Move flag plant canopy to modules
69!
70! 2718 2018-01-02 08:49:38Z maronga
[2716]71! Corrected "Former revisions" section
72!
73! 2701 2017-12-15 15:40:50Z suehring
74! Changes from last commit documented
75!
76! 2698 2017-12-14 18:46:24Z suehring
[2701]77! Bugfix in get_topography_top_index
78!
[2716]79! 2696 2017-12-14 17:12:51Z kanani
80! Change in file header (GPL part)
[2696]81! Bugfix for vertical loop index pch_index in case of Netcdf input
82! Introduce 2D index array incorporate canopy top index
83! Check if canopy on top of topography do not exceed vertical dimension
84! Add check for canopy_mode in case of Netcdf input.
85! Enable _FillValue output for 3d quantities
86! Bugfix in reading of PIDS leaf area density (MS)
87!
88! 2669 2017-12-06 16:03:27Z raasch
[2669]89! coupling_char removed
90!
91! 2512 2017-10-04 08:26:59Z raasch
[2512]92! upper bounds of 3d output changed from nx+1,ny+1 to nx,ny
93! no output of ghost layer data
94!
95! 2318 2017-07-20 17:27:44Z suehring
[2318]96! Get topography top index via Function call
97!
98! 2317 2017-07-20 17:27:19Z suehring
[2274]99! Changed error messages
100!
101! 2233 2017-05-30 18:08:54Z suehring
[2214]102!
[2233]103! 2232 2017-05-30 17:47:52Z suehring
104! Adjustments to new topography concept
105!
[2214]106! 2213 2017-04-24 15:10:35Z kanani
[2213]107! Bugfix: exchange of ghost points in array pc_heating_rate needed for output
108! of pcm_heatrate, onetime ghost point exchange of lad_s after initialization.
109! Formatting and clean-up of subroutine pcm_read_plant_canopy_3d,
110! minor re-organization of canopy-heating initialization.
[2008]111!
[2210]112! 2209 2017-04-19 09:34:46Z kanani
113! Added 3d output of leaf area density (pcm_lad) and canopy
114! heat rate (pcm_heatrate)
115!
[2025]116! 2024 2016-10-12 16:42:37Z kanani
117! Added missing lad_s initialization
118!
[2012]119! 2011 2016-09-19 17:29:57Z kanani
120! Renamed canopy_heat_flux to pc_heating_rate, since the original meaning/
121! calculation of the quantity has changed, related to the urban surface model
122! and similar future applications.
123!
[2008]124! 2007 2016-08-24 15:47:17Z kanani
[2007]125! Added SUBROUTINE pcm_read_plant_canopy_3d for reading 3d plant canopy data
126! from file (new case canopy_mode=read_from_file_3d) in the course of
127! introduction of urban surface model,
128! introduced variable ext_coef,
129! resorted SUBROUTINEs to alphabetical order
[1827]130!
[2001]131! 2000 2016-08-20 18:09:15Z knoop
132! Forced header and separation lines into 80 columns
133!
[1961]134! 1960 2016-07-12 16:34:24Z suehring
135! Separate humidity and passive scalar
136!
[1954]137! 1953 2016-06-21 09:28:42Z suehring
138! Bugfix, lad_s and lad must be public
139!
[1827]140! 1826 2016-04-07 12:01:39Z maronga
141! Further modularization
142!
[1722]143! 1721 2015-11-16 12:56:48Z raasch
144! bugfixes: shf is reduced in areas covered with canopy only,
145!           canopy is set on top of topography
146!
[1683]147! 1682 2015-10-07 23:56:08Z knoop
148! Code annotations made doxygen readable
149!
[1485]150! 1484 2014-10-21 10:53:05Z kanani
[1484]151! Changes due to new module structure of the plant canopy model:
152!   module plant_canopy_model_mod now contains a subroutine for the
[1826]153!   initialization of the canopy model (pcm_init),
[1484]154!   limitation of the canopy drag (previously accounted for by calculation of
155!   a limiting canopy timestep for the determination of the maximum LES timestep
156!   in subroutine timestep) is now realized by the calculation of pre-tendencies
[1826]157!   and preliminary velocities in subroutine pcm_tendency,
158!   some redundant MPI communication removed in subroutine pcm_init
[1484]159!   (was previously in init_3d_model),
160!   unnecessary 3d-arrays lad_u, lad_v, lad_w removed - lad information on the
161!   respective grid is now provided only by lad_s (e.g. in the calculation of
162!   the tendency terms or of cum_lai_hf),
163!   drag_coefficient, lai, leaf_surface_concentration,
164!   scalar_exchange_coefficient, sec and sls renamed to canopy_drag_coeff,
165!   cum_lai_hf, leaf_surface_conc, leaf_scalar_exch_coeff, lsec and lsc,
166!   respectively,
167!   unnecessary 3d-arrays cdc, lsc and lsec now defined as single-value constants,
168!   USE-statements and ONLY-lists modified accordingly
[1341]169!
170! 1340 2014-03-25 19:45:13Z kanani
171! REAL constants defined as wp-kind
172!
[1321]173! 1320 2014-03-20 08:40:49Z raasch
[1320]174! ONLY-attribute added to USE-statements,
175! kind-parameters added to all INTEGER and REAL declaration statements,
176! kinds are defined in new module kinds,
177! old module precision_kind is removed,
178! revision history before 2012 removed,
179! comment fields (!:) to be used for variable explanations added to
180! all variable declaration statements
[153]181!
[1037]182! 1036 2012-10-22 13:43:42Z raasch
183! code put under GPL (PALM 3.9)
184!
[139]185! 138 2007-11-28 10:03:58Z letzel
186! Initial revision
187!
[138]188! Description:
189! ------------
[1682]190!> 1) Initialization of the canopy model, e.g. construction of leaf area density
[1826]191!> profile (subroutine pcm_init).
[1682]192!> 2) Calculation of sinks and sources of momentum, heat and scalar concentration
[1826]193!> due to canopy elements (subroutine pcm_tendency).
[138]194!------------------------------------------------------------------------------!
[1682]195 MODULE plant_canopy_model_mod
196 
[1484]197    USE arrays_3d,                                                             &
[2232]198        ONLY:  dzu, dzw, e, q, s, tend, u, v, w, zu, zw 
[138]199
[1484]200    USE indices,                                                               &
201        ONLY:  nbgp, nxl, nxlg, nxlu, nxr, nxrg, nyn, nyng, nys, nysg, nysv,   &
[2317]202               nz, nzb, nzt
[1484]203
204    USE kinds
205
[2317]206    USE surface_mod,                                                           &
[2698]207        ONLY:  get_topography_top_index_ji
[1484]208
[2317]209
[1484]210    IMPLICIT NONE
211
212
[2766]213    CHARACTER (LEN=30)   ::  canopy_mode = 'block' !< canopy coverage
[1484]214
[2696]215    INTEGER(iwp) ::  pch_index = 0                               !< plant canopy height/top index
216    INTEGER(iwp) ::  lad_vertical_gradient_level_ind(10) = -9999 !< lad-profile levels (index)
[1484]217
[2696]218    INTEGER(iwp), DIMENSION(:,:), ALLOCATABLE ::  pch_index_ji   !< local plant canopy top
219
[1682]220    LOGICAL ::  calc_beta_lad_profile = .FALSE. !< switch for calc. of lad from beta func.
[1484]221
[2696]222    REAL(wp) ::  alpha_lad = 9999999.9_wp         !< coefficient for lad calculation
223    REAL(wp) ::  beta_lad = 9999999.9_wp          !< coefficient for lad calculation
224    REAL(wp) ::  canopy_drag_coeff = 0.0_wp       !< canopy drag coefficient (parameter)
225    REAL(wp) ::  cdc = 0.0_wp                     !< canopy drag coeff. (abbreviation used in equations)
226    REAL(wp) ::  cthf = 0.0_wp                    !< canopy top heat flux
227    REAL(wp) ::  dt_plant_canopy = 0.0_wp         !< timestep account. for canopy drag
228    REAL(wp) ::  ext_coef = 0.6_wp                !< extinction coefficient
229    REAL(wp) ::  lad_surface = 0.0_wp             !< lad surface value
230    REAL(wp) ::  lai_beta = 0.0_wp                !< leaf area index (lai) for lad calc.
231    REAL(wp) ::  leaf_scalar_exch_coeff = 0.0_wp  !< canopy scalar exchange coeff.
232    REAL(wp) ::  leaf_surface_conc = 0.0_wp       !< leaf surface concentration
[2768]233    REAL(wp) ::  lsc = 0.0_wp                     !< leaf surface concentration
[2696]234    REAL(wp) ::  lsec = 0.0_wp                    !< leaf scalar exchange coeff.
[1484]235
[2696]236    REAL(wp) ::  lad_vertical_gradient(10) = 0.0_wp              !< lad gradient
237    REAL(wp) ::  lad_vertical_gradient_level(10) = -9999999.9_wp !< lad-prof. levels (in m)
[1484]238
[2977]239    REAL(wp) ::  lad_type_coef(0:10) = 1.0_wp   !< multiplicative coeficients for particular types
240                                                !< of plant canopy (e.g. deciduous tree during winter)
241
[1682]242    REAL(wp), DIMENSION(:), ALLOCATABLE ::  lad            !< leaf area density
243    REAL(wp), DIMENSION(:), ALLOCATABLE ::  pre_lad        !< preliminary lad
[1484]244   
[2768]245    REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::  cum_lai_hf       !< cumulative lai for heatflux calc.
246    REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::  lad_s            !< lad on scalar-grid
247    REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::  pc_heating_rate  !< plant canopy heating rate
[3014]248    REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::  pc_transpiration_rate  !< plant canopy transpiration rate
[1484]249
250    SAVE
251
252
[138]253    PRIVATE
[1826]254 
255!
256!-- Public functions
[2209]257    PUBLIC pcm_check_data_output, pcm_check_parameters, pcm_data_output_3d,    &
258           pcm_define_netcdf_grid, pcm_header, pcm_init, pcm_parin, pcm_tendency
[138]259
[1826]260!
261!-- Public variables and constants
[3014]262    PUBLIC pc_heating_rate, pc_transpiration_rate, canopy_mode, cthf, dt_plant_canopy, lad, lad_s,   &
[2920]263           pch_index
[2007]264           
[1484]265
[2209]266    INTERFACE pcm_check_data_output
267       MODULE PROCEDURE pcm_check_data_output
268    END INTERFACE pcm_check_data_output
269   
[1826]270    INTERFACE pcm_check_parameters
271       MODULE PROCEDURE pcm_check_parameters
[2209]272    END INTERFACE pcm_check_parameters
273
274    INTERFACE pcm_data_output_3d
275       MODULE PROCEDURE pcm_data_output_3d
276    END INTERFACE pcm_data_output_3d
277
278    INTERFACE pcm_define_netcdf_grid
279       MODULE PROCEDURE pcm_define_netcdf_grid
280    END INTERFACE pcm_define_netcdf_grid
[1826]281   
282     INTERFACE pcm_header
283       MODULE PROCEDURE pcm_header
284    END INTERFACE pcm_header       
285   
286    INTERFACE pcm_init
287       MODULE PROCEDURE pcm_init
288    END INTERFACE pcm_init
[138]289
[1826]290    INTERFACE pcm_parin
291       MODULE PROCEDURE pcm_parin
[2007]292    END INTERFACE pcm_parin
293
294    INTERFACE pcm_read_plant_canopy_3d
295       MODULE PROCEDURE pcm_read_plant_canopy_3d
296    END INTERFACE pcm_read_plant_canopy_3d
[1826]297   
298    INTERFACE pcm_tendency
299       MODULE PROCEDURE pcm_tendency
300       MODULE PROCEDURE pcm_tendency_ij
301    END INTERFACE pcm_tendency
[1484]302
303
[138]304 CONTAINS
305
[2209]306
307!------------------------------------------------------------------------------!
308! Description:
309! ------------
310!> Check data output for plant canopy model
311!------------------------------------------------------------------------------!
312 SUBROUTINE pcm_check_data_output( var, unit )
[1826]313 
[2209]314 
315    USE control_parameters,                                                 &
[2770]316        ONLY:  data_output, message_string, urban_surface
[2209]317
318    IMPLICIT NONE
319
320    CHARACTER (LEN=*) ::  unit  !<
321    CHARACTER (LEN=*) ::  var   !<
322
323
324    SELECT CASE ( TRIM( var ) )
325
326       CASE ( 'pcm_heatrate' )
[2770]327          IF ( cthf == 0.0_wp  .AND. .NOT.  urban_surface )  THEN
[2768]328             message_string = 'output of "' // TRIM( var ) // '" requi' //  &
329                              'res setting of parameter cthf /= 0.0'
330             CALL message( 'pcm_check_data_output', 'PA1000', 1, 2, 0, 6, 0 )
331          ENDIF
[2209]332          unit = 'K s-1'
333   
[3014]334       CASE ( 'pcm_transpirationrate' )
335          unit = 'kg kg-1 s-1'
336
[2209]337       CASE ( 'pcm_lad' )
338          unit = 'm2 m-3'
339
340
341       CASE DEFAULT
342          unit = 'illegal'
343
344    END SELECT
345
346
347 END SUBROUTINE pcm_check_data_output
348 
349 
[1826]350!------------------------------------------------------------------------------!
351! Description:
352! ------------
353!> Check parameters routine for plant canopy model
354!------------------------------------------------------------------------------!
355    SUBROUTINE pcm_check_parameters
[138]356
[1826]357       USE control_parameters,                                                 &
[2696]358           ONLY: cloud_physics, coupling_char, message_string,                 &
359                 microphysics_seifert
360
361       USE netcdf_data_input_mod,                                              &
362           ONLY:  input_file_static, input_pids_static
[1826]363                 
364   
365       IMPLICIT NONE
366
367   
368       IF ( canopy_drag_coeff == 0.0_wp )  THEN
369          message_string = 'plant_canopy = .TRUE. requires a non-zero drag '// &
[3046]370                           'coefficient & given value is canopy_drag_coeff = 0.0'
[2768]371          CALL message( 'pcm_check_parameters', 'PA0041', 1, 2, 0, 6, 0 )
[1826]372       ENDIF
373   
[3045]374       IF ( ( alpha_lad /= 9999999.9_wp  .AND.  beta_lad == 9999999.9_wp ) .OR.&
[1826]375              beta_lad /= 9999999.9_wp   .AND.  alpha_lad == 9999999.9_wp )  THEN
376          message_string = 'using the beta function for the construction ' //  &
377                           'of the leaf area density profile requires '    //  &
378                           'both alpha_lad and beta_lad to be /= 9999999.9'
[2768]379          CALL message( 'pcm_check_parameters', 'PA0118', 1, 2, 0, 6, 0 )
[1826]380       ENDIF
381   
382       IF ( calc_beta_lad_profile  .AND.  lai_beta == 0.0_wp )  THEN
383          message_string = 'using the beta function for the construction ' //  &
384                           'of the leaf area density profile requires '    //  &
385                           'a non-zero lai_beta, but given value is '      //  &
386                           'lai_beta = 0.0'
[2768]387          CALL message( 'pcm_check_parameters', 'PA0119', 1, 2, 0, 6, 0 )
[1826]388       ENDIF
389
390       IF ( calc_beta_lad_profile  .AND.  lad_surface /= 0.0_wp )  THEN
[2274]391          message_string = 'simultaneous setting of alpha_lad /= 9999999.9 '// &
392                           'combined with beta_lad /= 9999999.9 '           // &
[1826]393                           'and lad_surface /= 0.0 is not possible, '       // &
394                           'use either vertical gradients or the beta '     // &
395                           'function for the construction of the leaf area '// &
396                           'density profile'
[2768]397          CALL message( 'pcm_check_parameters', 'PA0120', 1, 2, 0, 6, 0 )
[1826]398       ENDIF
399
400       IF ( cloud_physics  .AND.  microphysics_seifert )  THEN
401          message_string = 'plant_canopy = .TRUE. requires cloud_scheme /=' // &
402                          ' seifert_beheng'
[2768]403          CALL message( 'pcm_check_parameters', 'PA0360', 1, 2, 0, 6, 0 )
[1826]404       ENDIF
[2696]405!
406!--    If dynamic input file is used, canopy need to be read from file
407       IF ( input_pids_static  .AND.                                           &
408            TRIM( canopy_mode ) /= 'read_from_file_3d' )  THEN
409          message_string = 'Usage of dynamic input file ' //                   &
410                           TRIM( input_file_static ) //                        &
411                           TRIM( coupling_char ) // ' requires ' //            &
412                           'canopy_mode = read_from_file_3d'
[2768]413          CALL message( 'pcm_check_parameters', 'PA0999', 1, 2, 0, 6, 0 )
[2696]414       ENDIF
[1826]415
416 
417    END SUBROUTINE pcm_check_parameters 
418 
419
[138]420!------------------------------------------------------------------------------!
[2209]421!
[1484]422! Description:
423! ------------
[2209]424!> Subroutine defining 3D output variables
425!------------------------------------------------------------------------------!
[3014]426 SUBROUTINE pcm_data_output_3d( av, variable, found, local_pf, fill_value,     &
427                                nzb_do, nzt_do )
428 
[2209]429    USE indices
430
431    USE kinds
432
433
434    IMPLICIT NONE
435
436    CHARACTER (LEN=*) ::  variable !<
437
[2696]438    INTEGER(iwp) ::  av     !<
439    INTEGER(iwp) ::  i      !<
440    INTEGER(iwp) ::  j      !<
441    INTEGER(iwp) ::  k      !<
442    INTEGER(iwp) ::  k_topo !< topography top index
[3014]443    INTEGER(iwp) ::  nzb_do !< lower limit of the data output (usually 0)
444    INTEGER(iwp) ::  nzt_do !< vertical upper limit of the data output (usually nz_do3d)
[2209]445
446    LOGICAL      ::  found !<
447
[2696]448    REAL(wp)     ::  fill_value
[3014]449    REAL(sp), DIMENSION(nxl:nxr,nys:nyn,nzb_do:nzt_do) ::  local_pf !<
[2209]450
451
452    found = .TRUE.
453
[2696]454    local_pf = REAL( fill_value, KIND = 4 )
[2209]455
456    SELECT CASE ( TRIM( variable ) )
457
458      CASE ( 'pcm_heatrate' )
459         IF ( av == 0 )  THEN
[2512]460            DO  i = nxl, nxr
461               DO  j = nys, nyn
[2696]462                  IF ( pch_index_ji(j,i) /= 0 )  THEN
[2698]463                     k_topo = get_topography_top_index_ji( j, i, 's' )
[2696]464                     DO  k = k_topo, k_topo + pch_index_ji(j,i)
465                        local_pf(i,j,k) = pc_heating_rate(k-k_topo,j,i)
466                     ENDDO
467                  ENDIF
[2209]468               ENDDO
469            ENDDO
470         ENDIF
[3014]471   
472       CASE ( 'pcm_transpirationrate' )
473         IF ( av == 0 )  THEN
474            DO  i = nxl, nxr
475               DO  j = nys, nyn
476                  IF ( pch_index_ji(j,i) /= 0 )  THEN
477                     k_topo = get_topography_top_index_ji( j, i, 's' )
478                     DO  k = k_topo, k_topo + pch_index_ji(j,i)
479                        local_pf(i,j,k) = pc_transpiration_rate(k-k_topo,j,i)
480                     ENDDO
481                  ENDIF
482               ENDDO
483            ENDDO
484         ENDIF
[2209]485   
486      CASE ( 'pcm_lad' )
487         IF ( av == 0 )  THEN
[2512]488            DO  i = nxl, nxr
489               DO  j = nys, nyn
[2696]490                  IF ( pch_index_ji(j,i) /= 0 )  THEN
[2698]491                     k_topo = get_topography_top_index_ji( j, i, 's' )
[2696]492                     DO  k = k_topo, k_topo + pch_index_ji(j,i)
493                        local_pf(i,j,k) = lad_s(k-k_topo,j,i)
494                     ENDDO
495                  ENDIF
[2209]496               ENDDO
497            ENDDO
498         ENDIF
499                 
500         
501       CASE DEFAULT
502          found = .FALSE.
503
504    END SELECT
505
506
507 END SUBROUTINE pcm_data_output_3d 
508         
509!------------------------------------------------------------------------------!
510!
511! Description:
512! ------------
513!> Subroutine defining appropriate grid for netcdf variables.
514!> It is called from subroutine netcdf.
515!------------------------------------------------------------------------------!
516 SUBROUTINE pcm_define_netcdf_grid( var, found, grid_x, grid_y, grid_z )
517   
518     IMPLICIT NONE
519
520     CHARACTER (LEN=*), INTENT(IN)  ::  var         !<
521     LOGICAL, INTENT(OUT)           ::  found       !<
522     CHARACTER (LEN=*), INTENT(OUT) ::  grid_x      !<
523     CHARACTER (LEN=*), INTENT(OUT) ::  grid_y      !<
524     CHARACTER (LEN=*), INTENT(OUT) ::  grid_z      !<
525
526     found  = .TRUE.
527
528!
529!--  Check for the grid
530     SELECT CASE ( TRIM( var ) )
531
[3014]532        CASE ( 'pcm_heatrate', 'pcm_lad', 'pcm_transpirationrate')
[2209]533           grid_x = 'x'
534           grid_y = 'y'
535           grid_z = 'zu'
536
537        CASE DEFAULT
538           found  = .FALSE.
539           grid_x = 'none'
540           grid_y = 'none'
541           grid_z = 'none'
542     END SELECT
543
544 END SUBROUTINE pcm_define_netcdf_grid
545 
546 
547!------------------------------------------------------------------------------!
548! Description:
549! ------------
[1826]550!> Header output for plant canopy model
551!------------------------------------------------------------------------------!
552    SUBROUTINE pcm_header ( io )
553
554       USE control_parameters,                                                 &
[3065]555           ONLY: passive_scalar
[1826]556
557
558       IMPLICIT NONE
559 
560       CHARACTER (LEN=10) ::  coor_chr            !<
561
562       CHARACTER (LEN=86) ::  coordinates         !<
563       CHARACTER (LEN=86) ::  gradients           !<
564       CHARACTER (LEN=86) ::  leaf_area_density   !<
565       CHARACTER (LEN=86) ::  slices              !<
566 
567       INTEGER(iwp) :: i                !<
568       INTEGER(iwp),  INTENT(IN) ::  io !< Unit of the output file
569       INTEGER(iwp) :: k                !<       
570   
571       REAL(wp) ::  canopy_height       !< canopy height (in m)
572       
[3065]573       canopy_height = zw(pch_index)
[1826]574
575       WRITE ( io, 1 )  canopy_mode, canopy_height, pch_index,                 &
576                          canopy_drag_coeff
577       IF ( passive_scalar )  THEN
578          WRITE ( io, 2 )  leaf_scalar_exch_coeff,                             &
579                             leaf_surface_conc
580       ENDIF
581
582!
583!--    Heat flux at the top of vegetation
584       WRITE ( io, 3 )  cthf
585
586!
587!--    Leaf area density profile, calculated either from given vertical
588!--    gradients or from beta probability density function.
589       IF (  .NOT.  calc_beta_lad_profile )  THEN
590
591!--       Building output strings, starting with surface value
592          WRITE ( leaf_area_density, '(F7.4)' )  lad_surface
593          gradients = '------'
594          slices = '     0'
595          coordinates = '   0.0'
596          i = 1
597          DO  WHILE ( i < 11  .AND.  lad_vertical_gradient_level_ind(i)        &
598                      /= -9999 )
599
600             WRITE (coor_chr,'(F7.2)')  lad(lad_vertical_gradient_level_ind(i))
601             leaf_area_density = TRIM( leaf_area_density ) // ' ' //           &
602                                 TRIM( coor_chr )
603 
604             WRITE (coor_chr,'(F7.2)')  lad_vertical_gradient(i)
605             gradients = TRIM( gradients ) // ' ' // TRIM( coor_chr )
606
607             WRITE (coor_chr,'(I7)')  lad_vertical_gradient_level_ind(i)
608             slices = TRIM( slices ) // ' ' // TRIM( coor_chr )
609
610             WRITE (coor_chr,'(F7.1)')  lad_vertical_gradient_level(i)
611             coordinates = TRIM( coordinates ) // ' '  // TRIM( coor_chr )
612
613             i = i + 1
614          ENDDO
615
616          WRITE ( io, 4 )  TRIM( coordinates ), TRIM( leaf_area_density ),     &
617                             TRIM( gradients ), TRIM( slices )
618
619       ELSE
620       
621          WRITE ( leaf_area_density, '(F7.4)' )  lad_surface
622          coordinates = '   0.0'
623         
624          DO  k = 1, pch_index
625
626             WRITE (coor_chr,'(F7.2)')  lad(k)
627             leaf_area_density = TRIM( leaf_area_density ) // ' ' //           &
628                                 TRIM( coor_chr )
629 
630             WRITE (coor_chr,'(F7.1)')  zu(k)
631             coordinates = TRIM( coordinates ) // ' '  // TRIM( coor_chr )
632
633          ENDDO       
634
635          WRITE ( io, 5 ) TRIM( coordinates ), TRIM( leaf_area_density ),      &
636                          alpha_lad, beta_lad, lai_beta
637
638       ENDIF 
639
6401 FORMAT (//' Vegetation canopy (drag) model:'/                                &
641              ' ------------------------------'//                              &
642              ' Canopy mode: ', A /                                            &
643              ' Canopy height: ',F6.2,'m (',I4,' grid points)' /               &
644              ' Leaf drag coefficient: ',F6.2 /)
6452 FORMAT (/ ' Scalar exchange coefficient: ',F6.2 /                            &
646              ' Scalar concentration at leaf surfaces in kg/m**3: ',F6.2 /)
6473 FORMAT (' Predefined constant heatflux at the top of the vegetation: ',F6.2, &
648          ' K m/s')
6494 FORMAT (/ ' Characteristic levels of the leaf area density:'//               &
650              ' Height:              ',A,'  m'/                                &
651              ' Leaf area density:   ',A,'  m**2/m**3'/                        &
652              ' Gradient:            ',A,'  m**2/m**4'/                        &
653              ' Gridpoint:           ',A)
6545 FORMAT (//' Characteristic levels of the leaf area density and coefficients:'&
655          //  ' Height:              ',A,'  m'/                                &
656              ' Leaf area density:   ',A,'  m**2/m**3'/                        &
657              ' Coefficient alpha: ',F6.2 /                                    &
658              ' Coefficient beta: ',F6.2 /                                     &
659              ' Leaf area index: ',F6.2,'  m**2/m**2' /)   
660       
661    END SUBROUTINE pcm_header
662 
663 
664!------------------------------------------------------------------------------!
665! Description:
666! ------------
[1682]667!> Initialization of the plant canopy model
[138]668!------------------------------------------------------------------------------!
[1826]669    SUBROUTINE pcm_init
[1484]670   
671
672       USE control_parameters,                                                 &
[3065]673           ONLY: humidity, io_blocks, io_group, message_string, ocean,         &
[2669]674                 passive_scalar, urban_surface
[1484]675
[2696]676       USE netcdf_data_input_mod,                                              &
677           ONLY:  leaf_area_density_f
678
[2232]679       USE surface_mod,                                                        &
680           ONLY: surf_def_h, surf_lsm_h, surf_usm_h
[1484]681
682       IMPLICIT NONE
683
[2007]684       CHARACTER(10) :: pct
685       
686       INTEGER(iwp) ::  i   !< running index
687       INTEGER(iwp) ::  ii  !< index       
688       INTEGER(iwp) ::  j   !< running index
689       INTEGER(iwp) ::  k   !< running index
[2232]690       INTEGER(iwp) ::  m   !< running index
[1484]691
[2007]692       REAL(wp) ::  int_bpdf        !< vertical integral for lad-profile construction
693       REAL(wp) ::  dzh             !< vertical grid spacing in units of canopy height
694       REAL(wp) ::  gradient        !< gradient for lad-profile construction
695       REAL(wp) ::  canopy_height   !< canopy height for lad-profile construction
696       REAL(wp) ::  pcv(nzb:nzt+1)  !<
697       
[1484]698!
699!--    Allocate one-dimensional arrays for the computation of the
700!--    leaf area density (lad) profile
701       ALLOCATE( lad(0:nz+1), pre_lad(0:nz+1) )
702       lad = 0.0_wp
703       pre_lad = 0.0_wp
704
705!
[1826]706!--    Set flag that indicates that the lad-profile shall be calculated by using
707!--    a beta probability density function
708       IF ( alpha_lad /= 9999999.9_wp  .AND.  beta_lad /= 9999999.9_wp )  THEN
709          calc_beta_lad_profile = .TRUE.
710       ENDIF
711       
712       
713!
[1484]714!--    Compute the profile of leaf area density used in the plant
715!--    canopy model. The profile can either be constructed from
716!--    prescribed vertical gradients of the leaf area density or by
717!--    using a beta probability density function (see e.g. Markkanen et al.,
718!--    2003: Boundary-Layer Meteorology, 106, 437-459)
719       IF (  .NOT.  calc_beta_lad_profile )  THEN   
720
721!
722!--       Use vertical gradients for lad-profile construction   
723          i = 1
724          gradient = 0.0_wp
725
726          IF (  .NOT.  ocean )  THEN
727
728             lad(0) = lad_surface
729             lad_vertical_gradient_level_ind(1) = 0
730 
731             DO k = 1, pch_index
732                IF ( i < 11 )  THEN
733                   IF ( lad_vertical_gradient_level(i) < zu(k)  .AND.          &
734                        lad_vertical_gradient_level(i) >= 0.0_wp )  THEN
735                      gradient = lad_vertical_gradient(i)
736                      lad_vertical_gradient_level_ind(i) = k - 1
737                      i = i + 1
738                   ENDIF
739                ENDIF
740                IF ( gradient /= 0.0_wp )  THEN
741                   IF ( k /= 1 )  THEN
742                      lad(k) = lad(k-1) + dzu(k) * gradient
743                   ELSE
744                      lad(k) = lad_surface + dzu(k) * gradient
745                   ENDIF
746                ELSE
747                   lad(k) = lad(k-1)
748                ENDIF
749             ENDDO
750
751          ENDIF
752
753!
754!--       In case of no given leaf area density gradients, choose a vanishing
755!--       gradient. This information is used for the HEADER and the RUN_CONTROL
756!--       file.
757          IF ( lad_vertical_gradient_level(1) == -9999999.9_wp )  THEN
758             lad_vertical_gradient_level(1) = 0.0_wp
759          ENDIF
760
761       ELSE
762
763!
764!--       Use beta function for lad-profile construction
765          int_bpdf = 0.0_wp
[3065]766          canopy_height = zw(pch_index)
[1484]767
[2232]768          DO k = 0, pch_index
[1484]769             int_bpdf = int_bpdf +                                             &
[1826]770                      ( ( ( zw(k) / canopy_height )**( alpha_lad-1.0_wp ) ) *  &
771                      ( ( 1.0_wp - ( zw(k) / canopy_height ) )**(              &
772                          beta_lad-1.0_wp ) )                                  &
773                      * ( ( zw(k+1)-zw(k) ) / canopy_height ) )
[1484]774          ENDDO
775
776!
777!--       Preliminary lad profile (defined on w-grid)
[2232]778          DO k = 0, pch_index
[1826]779             pre_lad(k) =  lai_beta *                                          &
780                        ( ( ( zw(k) / canopy_height )**( alpha_lad-1.0_wp ) )  &
781                        * ( ( 1.0_wp - ( zw(k) / canopy_height ) )**(          &
782                              beta_lad-1.0_wp ) ) / int_bpdf                   &
783                        ) / canopy_height
[1484]784          ENDDO
785
786!
787!--       Final lad profile (defined on scalar-grid level, since most prognostic
788!--       quantities are defined there, hence, less interpolation is required
789!--       when calculating the canopy tendencies)
790          lad(0) = pre_lad(0)
[2232]791          DO k = 1, pch_index
[1484]792             lad(k) = 0.5 * ( pre_lad(k-1) + pre_lad(k) )
793          ENDDO         
794
795       ENDIF
796
797!
[2213]798!--    Allocate 3D-array for the leaf area density (lad_s).
[1484]799       ALLOCATE( lad_s(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
800
801!
802!--    Initialize canopy parameters cdc (canopy drag coefficient),
803!--    lsec (leaf scalar exchange coefficient), lsc (leaf surface concentration)
804!--    with the prescribed values
805       cdc = canopy_drag_coeff
806       lsec = leaf_scalar_exch_coeff
807       lsc = leaf_surface_conc
808
809!
810!--    Initialization of the canopy coverage in the model domain:
811!--    Setting the parameter canopy_mode = 'block' initializes a canopy, which
812!--    fully covers the domain surface
813       SELECT CASE ( TRIM( canopy_mode ) )
814
815          CASE( 'block' )
816
817             DO  i = nxlg, nxrg
818                DO  j = nysg, nyng
819                   lad_s(:,j,i) = lad(:)
820                ENDDO
821             ENDDO
822
[2007]823          CASE ( 'read_from_file_3d' )
824!
[2696]825!--          Initialize LAD with data from file. If LAD is given in NetCDF file,
826!--          use these values, else take LAD profiles from ASCII file.
827!--          Please note, in NetCDF file LAD is only given up to the maximum
828!--          canopy top, indicated by leaf_area_density_f%nz. 
829             lad_s = 0.0_wp
830             IF ( leaf_area_density_f%from_file )  THEN
831!
832!--             Set also pch_index, used to be the upper bound of the vertical
833!--             loops. Therefore, use the global top of the canopy layer.
834                pch_index = leaf_area_density_f%nz - 1
835
836                DO  i = nxl, nxr
837                   DO  j = nys, nyn
838                      DO  k = 0, leaf_area_density_f%nz - 1
839                      IF ( leaf_area_density_f%var(k,j,i) /=                   &
840                           leaf_area_density_f%fill )                          &
841                         lad_s(k,j,i) = leaf_area_density_f%var(k,j,i)
842                      ENDDO
843                   ENDDO
844                ENDDO
845                CALL exchange_horiz( lad_s, nbgp )
846!
847!            ASCII file
[2007]848!--          Initialize canopy parameters cdc (canopy drag coefficient),
849!--          lsec (leaf scalar exchange coefficient), lsc (leaf surface concentration)
850!--          from file which contains complete 3D data (separate vertical profiles for
851!--          each location).
[2696]852             ELSE
853                CALL pcm_read_plant_canopy_3d
854             ENDIF
[2007]855
[1484]856          CASE DEFAULT
857!
[2007]858!--          The DEFAULT case is reached either if the parameter
859!--          canopy mode contains a wrong character string or if the
860!--          user has coded a special case in the user interface.
861!--          There, the subroutine user_init_plant_canopy checks
862!--          which of these two conditions applies.
863             CALL user_init_plant_canopy
[1484]864 
865       END SELECT
[2696]866!
867!--    Initialize 2D index array indicating canopy top index.
868       ALLOCATE( pch_index_ji(nysg:nyng,nxlg:nxrg) )
869       pch_index_ji = 0
[1484]870
[2696]871       DO  i = nxl, nxr
872          DO  j = nys, nyn
873             DO  k = 0, pch_index
874                IF ( lad_s(k,j,i) /= 0 )  pch_index_ji(j,i) = k
875             ENDDO
[1484]876!
[2696]877!--          Check whether topography and local vegetation on top exceed
878!--          height of the model domain.
[2698]879             k = get_topography_top_index_ji( j, i, 's' )
[2696]880             IF ( k + pch_index_ji(j,i) >= nzt + 1 )  THEN
881                message_string =  'Local vegetation height on top of ' //      &
882                                  'topography exceeds height of model domain.'
883                CALL message( 'pcm_init', 'PA0999', 2, 2, 0, 6, 0 )
884             ENDIF
885
886          ENDDO
887       ENDDO
888
889       CALL exchange_horiz_2d_int( pch_index_ji, nys, nyn, nxl, nxr, nbgp )
890
891!
[2011]892!--    Initialization of the canopy heat source distribution due to heating
893!--    of the canopy layers by incoming solar radiation, in case that a non-zero
894!--    value is set for the canopy top heat flux (cthf), which equals the
895!--    available net radiation at canopy top.
896!--    The heat source distribution is calculated by a decaying exponential
897!--    function of the downward cumulative leaf area index (cum_lai_hf),
898!--    assuming that the foliage inside the plant canopy is heated by solar
899!--    radiation penetrating the canopy layers according to the distribution
900!--    of net radiation as suggested by Brown & Covey (1966; Agric. Meteorol. 3,
901!--    73–96). This approach has been applied e.g. by Shaw & Schumann (1992;
[2213]902!--    Bound.-Layer Meteorol. 61, 47–64).
903!--    When using the urban surface model (USM), canopy heating (pc_heating_rate)
904!--    by radiation is calculated in the USM.
[2768]905       IF ( cthf /= 0.0_wp  .AND. .NOT.  urban_surface )  THEN
[2213]906
907          ALLOCATE( cum_lai_hf(nzb:nzt+1,nysg:nyng,nxlg:nxrg),                 &
[3022]908                    pc_heating_rate(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
[1484]909!
[2011]910!--       Piecewise calculation of the cumulative leaf area index by vertical
[1484]911!--       integration of the leaf area density
912          cum_lai_hf(:,:,:) = 0.0_wp
913          DO  i = nxlg, nxrg
914             DO  j = nysg, nyng
[2696]915                DO  k = pch_index_ji(j,i)-1, 0, -1
916                   IF ( k == pch_index_ji(j,i)-1 )  THEN
[1484]917                      cum_lai_hf(k,j,i) = cum_lai_hf(k+1,j,i) +                &
918                         ( 0.5_wp * lad_s(k+1,j,i) *                           &
919                           ( zw(k+1) - zu(k+1) ) )  +                          &
920                         ( 0.5_wp * ( 0.5_wp * ( lad_s(k+1,j,i) +              &
921                                                 lad_s(k,j,i) ) +              &
922                                      lad_s(k+1,j,i) ) *                       &
923                           ( zu(k+1) - zw(k) ) ) 
924                   ELSE
925                      cum_lai_hf(k,j,i) = cum_lai_hf(k+1,j,i) +                &
926                         ( 0.5_wp * ( 0.5_wp * ( lad_s(k+2,j,i) +              &
927                                                 lad_s(k+1,j,i) ) +            &
928                                      lad_s(k+1,j,i) ) *                       &
929                           ( zw(k+1) - zu(k+1) ) )  +                          &
930                         ( 0.5_wp * ( 0.5_wp * ( lad_s(k+1,j,i) +              &
931                                                 lad_s(k,j,i) ) +              &
932                                      lad_s(k+1,j,i) ) *                       &
933                           ( zu(k+1) - zw(k) ) )
934                   ENDIF
935                ENDDO
936             ENDDO
937          ENDDO
938
[2232]939!           
940!--       In areas with canopy the surface value of the canopy heat
941!--       flux distribution overrides the surface heat flux (shf)
942!--       Start with default surface type
943          DO  m = 1, surf_def_h(0)%ns
944             k = surf_def_h(0)%k(m)
945             IF ( cum_lai_hf(0,j,i) /= 0.0_wp )                                &
946                surf_def_h(0)%shf(m) = cthf * exp( -ext_coef * cum_lai_hf(0,j,i) )
947          ENDDO
[1484]948!
[2232]949!--       Natural surfaces
950          DO  m = 1, surf_lsm_h%ns
951             k = surf_lsm_h%k(m)
952             IF ( cum_lai_hf(0,j,i) /= 0.0_wp )                                &
953                surf_lsm_h%shf(m) = cthf * exp( -ext_coef * cum_lai_hf(0,j,i) )
954          ENDDO
955!
956!--       Urban surfaces
957          DO  m = 1, surf_usm_h%ns
958             k = surf_usm_h%k(m)
959             IF ( cum_lai_hf(0,j,i) /= 0.0_wp )                                &
960                surf_usm_h%shf(m) = cthf * exp( -ext_coef * cum_lai_hf(0,j,i) )
961          ENDDO
962!
963!
[2011]964!--       Calculation of the heating rate (K/s) within the different layers of
[2232]965!--       the plant canopy. Calculation is only necessary in areas covered with
966!--       canopy.
967!--       Within the different canopy layers the plant-canopy heating
968!--       rate (pc_heating_rate) is calculated as the vertical
969!--       divergence of the canopy heat fluxes at the top and bottom
970!--       of the respective layer
[1484]971          DO  i = nxlg, nxrg
972             DO  j = nysg, nyng
[2696]973                DO  k = 1, pch_index_ji(j,i)
[2232]974                   IF ( cum_lai_hf(0,j,i) /= 0.0_wp )  THEN
[3022]975                      pc_heating_rate(k,j,i) = cthf *                          &
976                                ( exp(-ext_coef*cum_lai_hf(k,j,i)) -           &
[2232]977                                  exp(-ext_coef*cum_lai_hf(k-1,j,i) ) ) / dzw(k)
978                   ENDIF
979                ENDDO
[1721]980             ENDDO
981          ENDDO
[1484]982
983       ENDIF
[3022]984!
985!--    Allocate transpiration rate
986       IF ( humidity )                                                         &
987          ALLOCATE( pc_transpiration_rate(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
[1484]988
989
990
[1826]991    END SUBROUTINE pcm_init
[1484]992
993
[2007]994!------------------------------------------------------------------------------!
995! Description:
996! ------------
[2932]997!> Parin for &plant_canopy_parameters for plant canopy model
[2007]998!------------------------------------------------------------------------------!
999    SUBROUTINE pcm_parin
[1484]1000
[2746]1001       USE control_parameters,                                                 &
[2932]1002           ONLY:  message_string, plant_canopy
[2007]1003
1004       IMPLICIT NONE
1005
1006       CHARACTER (LEN=80) ::  line  !< dummy string that contains the current line of the parameter file
1007       
[2932]1008       NAMELIST /plant_canopy_parameters/                                      &
1009                                  alpha_lad, beta_lad, canopy_drag_coeff,      &
1010                                  canopy_mode, cthf,                           &
[2977]1011                                  lad_surface, lad_type_coef,                  & 
[2932]1012                                  lad_vertical_gradient,                       &
1013                                  lad_vertical_gradient_level,                 &
1014                                  lai_beta,                                    &
1015                                  leaf_scalar_exch_coeff,                      &
1016                                  leaf_surface_conc, pch_index
1017
[2007]1018       NAMELIST /canopy_par/      alpha_lad, beta_lad, canopy_drag_coeff,      &
1019                                  canopy_mode, cthf,                           &
[2977]1020                                  lad_surface, lad_type_coef,                  & 
[2007]1021                                  lad_vertical_gradient,                       &
1022                                  lad_vertical_gradient_level,                 &
1023                                  lai_beta,                                    &
1024                                  leaf_scalar_exch_coeff,                      &
1025                                  leaf_surface_conc, pch_index
[2932]1026                                 
[2007]1027       line = ' '
1028       
1029!
1030!--    Try to find radiation model package
1031       REWIND ( 11 )
1032       line = ' '
[2932]1033       DO   WHILE ( INDEX( line, '&plant_canopy_parameters' ) == 0 )
[2007]1034          READ ( 11, '(A)', END=10 )  line
1035       ENDDO
1036       BACKSPACE ( 11 )
1037
1038!
1039!--    Read user-defined namelist
[2932]1040       READ ( 11, plant_canopy_parameters )
1041
1042!
1043!--    Set flag that indicates that the radiation model is switched on
1044       plant_canopy = .TRUE.
1045       
1046       GOTO 12
1047!
1048!--    Try to find old namelist
1049 10    REWIND ( 11 )
1050       line = ' '
1051       DO   WHILE ( INDEX( line, '&canopy_par' ) == 0 )
1052          READ ( 11, '(A)', END=12 )  line
1053       ENDDO
1054       BACKSPACE ( 11 )
1055
1056!
1057!--    Read user-defined namelist
[2007]1058       READ ( 11, canopy_par )
1059
[2932]1060       message_string = 'namelist canopy_par is deprecated and will be ' // &
[3046]1061                     'removed in near future. Please use namelist ' //      &
[2932]1062                     'plant_canopy_parameters instead'
1063       CALL message( 'pcm_parin', 'PA0487', 0, 1, 0, 6, 0 )
1064       
[2007]1065!
1066!--    Set flag that indicates that the radiation model is switched on
1067       plant_canopy = .TRUE.
1068
[2932]1069 12    CONTINUE
[2007]1070       
1071
1072    END SUBROUTINE pcm_parin
1073
1074
1075
[1484]1076!------------------------------------------------------------------------------!
1077! Description:
1078! ------------
[2007]1079!
1080!> Loads 3D plant canopy data from file. File format is as follows:
1081!>
1082!> num_levels
[2977]1083!> dtype,x,y,pctype,value(nzb),value(nzb+1), ... ,value(nzb+num_levels-1)
1084!> dtype,x,y,pctype,value(nzb),value(nzb+1), ... ,value(nzb+num_levels-1)
1085!> dtype,x,y,pctype,value(nzb),value(nzb+1), ... ,value(nzb+num_levels-1)
[2007]1086!> ...
1087!>
1088!> i.e. first line determines number of levels and further lines represent plant
1089!> canopy data, one line per column and variable. In each data line,
1090!> dtype represents variable to be set:
1091!>
1092!> dtype=1: leaf area density (lad_s)
[2213]1093!> dtype=2....n: some additional plant canopy input data quantity
[2007]1094!>
1095!> Zeros are added automatically above num_levels until top of domain.  Any
1096!> non-specified (x,y) columns have zero values as default.
1097!------------------------------------------------------------------------------!
1098    SUBROUTINE pcm_read_plant_canopy_3d
[2213]1099   
1100       USE control_parameters,                                                 &
[2892]1101           ONLY:  coupling_char, message_string, passive_scalar
[2007]1102
[2213]1103       USE indices,                                                            &
1104           ONLY:  nbgp
1105           
1106       IMPLICIT NONE
[2007]1107
[2213]1108       INTEGER(iwp)                        ::  dtype     !< type of input data (1=lad)
[2977]1109       INTEGER(iwp)                        ::  pctype    !< type of plant canopy (deciduous,non-deciduous,...)
[2213]1110       INTEGER(iwp)                        ::  i, j      !< running index
1111       INTEGER(iwp)                        ::  nzp       !< number of vertical layers of plant canopy
1112       INTEGER(iwp)                        ::  nzpltop   !<
1113       INTEGER(iwp)                        ::  nzpl      !<
1114       
1115       REAL(wp), DIMENSION(:), ALLOCATABLE ::  col   !< vertical column of input data
[2007]1116
[2213]1117!
1118!--    Initialize lad_s array
1119       lad_s = 0.0_wp
1120       
1121!
1122!--    Open and read plant canopy input data
[2977]1123       OPEN(152, FILE='PLANT_CANOPY_DATA_3D' // TRIM( coupling_char ),         &
1124                 ACCESS='SEQUENTIAL', ACTION='READ', STATUS='OLD',             &
1125                 FORM='FORMATTED', ERR=515)
1126       READ(152, *, ERR=516, END=517)  nzp   !< read first line = number of vertical layers
[2213]1127       
[2977]1128       ALLOCATE( col(0:nzp-1) )
[2007]1129
[2213]1130       DO
[2977]1131          READ(152, *, ERR=516, END=517) dtype, i, j, pctype, col(:)
1132          IF ( i < nxlg  .OR.  i > nxrg  .OR.  j < nysg  .OR.  j > nyng )  CYCLE
1133         
1134          SELECT CASE (dtype)
1135             CASE( 1 )   !< leaf area density
[2213]1136!
[2977]1137!--             This is just the pure canopy layer assumed to be grounded to
1138!--             a flat domain surface. At locations where plant canopy sits
1139!--             on top of any kind of topography, the vertical plant column
1140!--             must be "lifted", which is done in SUBROUTINE pcm_tendency.           
1141                IF ( pctype < 0  .OR.  pctype > 10 )  THEN   !< incorrect plant canopy type
1142                   WRITE( message_string, * ) 'Incorrect type of plant canopy. '   //  &
1143                                              'Allowed values 0 <= pctype <= 10, ' //  &
1144                                              'but pctype is ', pctype
1145                   CALL message( 'pcm_read_plant_canopy_3d', 'PA0349', 1, 2, 0, 6, 0 )
1146                ENDIF
1147                lad_s(0:nzp-1,j,i) = col(0:nzp-1) * lad_type_coef(pctype)
1148               
1149             CASE DEFAULT
1150                WRITE(message_string, '(a,i2,a)')   &
1151                     'Unknown record type in file PLANT_CANOPY_DATA_3D: "', dtype, '"'
1152                CALL message( 'pcm_read_plant_canopy_3d', 'PA0530', 1, 2, 0, 6, 0 )
1153          END SELECT
[2213]1154       ENDDO
[2007]1155
[2213]1156515    message_string = 'error opening file PLANT_CANOPY_DATA_3D'
1157       CALL message( 'pcm_read_plant_canopy_3d', 'PA0531', 1, 2, 0, 6, 0 )
[2007]1158
[2213]1159516    message_string = 'error reading file PLANT_CANOPY_DATA_3D'
1160       CALL message( 'pcm_read_plant_canopy_3d', 'PA0532', 1, 2, 0, 6, 0 )
1161
1162517    CLOSE(152)
[2977]1163       DEALLOCATE( col )
[2213]1164       
1165       CALL exchange_horiz( lad_s, nbgp )
[2007]1166       
1167    END SUBROUTINE pcm_read_plant_canopy_3d
1168   
1169   
1170
1171!------------------------------------------------------------------------------!
1172! Description:
1173! ------------
[1682]1174!> Calculation of the tendency terms, accounting for the effect of the plant
1175!> canopy on momentum and scalar quantities.
1176!>
1177!> The canopy is located where the leaf area density lad_s(k,j,i) > 0.0
[1826]1178!> (defined on scalar grid), as initialized in subroutine pcm_init.
[1682]1179!> The lad on the w-grid is vertically interpolated from the surrounding
1180!> lad_s. The upper boundary of the canopy is defined on the w-grid at
1181!> k = pch_index. Here, the lad is zero.
1182!>
1183!> The canopy drag must be limited (previously accounted for by calculation of
1184!> a limiting canopy timestep for the determination of the maximum LES timestep
1185!> in subroutine timestep), since it is physically impossible that the canopy
1186!> drag alone can locally change the sign of a velocity component. This
1187!> limitation is realized by calculating preliminary tendencies and velocities.
1188!> It is subsequently checked if the preliminary new velocity has a different
1189!> sign than the current velocity. If so, the tendency is limited in a way that
1190!> the velocity can at maximum be reduced to zero by the canopy drag.
1191!>
1192!>
1193!> Call for all grid points
[1484]1194!------------------------------------------------------------------------------!
[1826]1195    SUBROUTINE pcm_tendency( component )
[138]1196
1197
[1320]1198       USE control_parameters,                                                 &
[1484]1199           ONLY:  dt_3d, message_string
[1320]1200
1201       USE kinds
1202
[138]1203       IMPLICIT NONE
1204
[1682]1205       INTEGER(iwp) ::  component !< prognostic variable (u,v,w,pt,q,e)
1206       INTEGER(iwp) ::  i         !< running index
1207       INTEGER(iwp) ::  j         !< running index
1208       INTEGER(iwp) ::  k         !< running index
[2232]1209       INTEGER(iwp) ::  k_wall    !< vertical index of topography top
[1721]1210       INTEGER(iwp) ::  kk        !< running index for flat lad arrays
[1484]1211
[1682]1212       REAL(wp) ::  ddt_3d    !< inverse of the LES timestep (dt_3d)
1213       REAL(wp) ::  lad_local !< local lad value
1214       REAL(wp) ::  pre_tend  !< preliminary tendency
1215       REAL(wp) ::  pre_u     !< preliminary u-value
1216       REAL(wp) ::  pre_v     !< preliminary v-value
1217       REAL(wp) ::  pre_w     !< preliminary w-value
[1484]1218
1219
1220       ddt_3d = 1.0_wp / dt_3d
[138]1221 
1222!
[1484]1223!--    Compute drag for the three velocity components and the SGS-TKE:
[138]1224       SELECT CASE ( component )
1225
1226!
1227!--       u-component
1228          CASE ( 1 )
1229             DO  i = nxlu, nxr
1230                DO  j = nys, nyn
[2232]1231!
1232!--                Determine topography-top index on u-grid
[2698]1233                   k_wall = get_topography_top_index_ji( j, i, 'u' )
[2696]1234                   DO  k = k_wall+1, k_wall + pch_index_ji(j,i)
[1484]1235
[2232]1236                      kk = k - k_wall   !- lad arrays are defined flat
[1484]1237!
1238!--                   In order to create sharp boundaries of the plant canopy,
1239!--                   the lad on the u-grid at index (k,j,i) is equal to
1240!--                   lad_s(k,j,i), rather than being interpolated from the
1241!--                   surrounding lad_s, because this would yield smaller lad
1242!--                   at the canopy boundaries than inside of the canopy.
1243!--                   For the same reason, the lad at the rightmost(i+1)canopy
1244!--                   boundary on the u-grid equals lad_s(k,j,i).
[1721]1245                      lad_local = lad_s(kk,j,i)
1246                      IF ( lad_local == 0.0_wp .AND. lad_s(kk,j,i-1) > 0.0_wp )&
1247                      THEN
1248                         lad_local = lad_s(kk,j,i-1)
[1484]1249                      ENDIF
1250
1251                      pre_tend = 0.0_wp
1252                      pre_u = 0.0_wp
1253!
1254!--                   Calculate preliminary value (pre_tend) of the tendency
1255                      pre_tend = - cdc *                                       &
1256                                   lad_local *                                 &
1257                                   SQRT( u(k,j,i)**2 +                         &
1258                                         ( 0.25_wp * ( v(k,j,i-1) +            &
1259                                                       v(k,j,i)   +            &
1260                                                       v(k,j+1,i) +            &
1261                                                       v(k,j+1,i-1) )          &
1262                                         )**2 +                                &
1263                                         ( 0.25_wp * ( w(k-1,j,i-1) +          &
1264                                                       w(k-1,j,i)   +          &
1265                                                       w(k,j,i-1)   +          &
1266                                                       w(k,j,i) )              &
1267                                         )**2                                  &
1268                                       ) *                                     &
1269                                   u(k,j,i)
1270
1271!
1272!--                   Calculate preliminary new velocity, based on pre_tend
1273                      pre_u = u(k,j,i) + dt_3d * pre_tend
1274!
1275!--                   Compare sign of old velocity and new preliminary velocity,
1276!--                   and in case the signs are different, limit the tendency
1277                      IF ( SIGN(pre_u,u(k,j,i)) /= pre_u )  THEN
1278                         pre_tend = - u(k,j,i) * ddt_3d
1279                      ELSE
1280                         pre_tend = pre_tend
1281                      ENDIF
1282!
1283!--                   Calculate final tendency
1284                      tend(k,j,i) = tend(k,j,i) + pre_tend
1285
[138]1286                   ENDDO
1287                ENDDO
1288             ENDDO
1289
1290!
1291!--       v-component
1292          CASE ( 2 )
1293             DO  i = nxl, nxr
1294                DO  j = nysv, nyn
[2232]1295!
1296!--                Determine topography-top index on v-grid
[2698]1297                   k_wall = get_topography_top_index_ji( j, i, 'v' )
[2317]1298
[2696]1299                   DO  k = k_wall+1, k_wall + pch_index_ji(j,i)
[1484]1300
[2232]1301                      kk = k - k_wall   !- lad arrays are defined flat
[1484]1302!
1303!--                   In order to create sharp boundaries of the plant canopy,
1304!--                   the lad on the v-grid at index (k,j,i) is equal to
1305!--                   lad_s(k,j,i), rather than being interpolated from the
1306!--                   surrounding lad_s, because this would yield smaller lad
1307!--                   at the canopy boundaries than inside of the canopy.
1308!--                   For the same reason, the lad at the northmost(j+1) canopy
1309!--                   boundary on the v-grid equals lad_s(k,j,i).
[1721]1310                      lad_local = lad_s(kk,j,i)
1311                      IF ( lad_local == 0.0_wp .AND. lad_s(kk,j-1,i) > 0.0_wp )&
1312                      THEN
1313                         lad_local = lad_s(kk,j-1,i)
[1484]1314                      ENDIF
1315
1316                      pre_tend = 0.0_wp
1317                      pre_v = 0.0_wp
1318!
1319!--                   Calculate preliminary value (pre_tend) of the tendency
1320                      pre_tend = - cdc *                                       &
1321                                   lad_local *                                 &
1322                                   SQRT( ( 0.25_wp * ( u(k,j-1,i)   +          &
1323                                                       u(k,j-1,i+1) +          &
1324                                                       u(k,j,i)     +          &
1325                                                       u(k,j,i+1) )            &
1326                                         )**2 +                                &
1327                                         v(k,j,i)**2 +                         &
1328                                         ( 0.25_wp * ( w(k-1,j-1,i) +          &
1329                                                       w(k-1,j,i)   +          &
1330                                                       w(k,j-1,i)   +          &
1331                                                       w(k,j,i) )              &
1332                                         )**2                                  &
1333                                       ) *                                     &
1334                                   v(k,j,i)
1335
1336!
1337!--                   Calculate preliminary new velocity, based on pre_tend
1338                      pre_v = v(k,j,i) + dt_3d * pre_tend
1339!
1340!--                   Compare sign of old velocity and new preliminary velocity,
1341!--                   and in case the signs are different, limit the tendency
1342                      IF ( SIGN(pre_v,v(k,j,i)) /= pre_v )  THEN
1343                         pre_tend = - v(k,j,i) * ddt_3d
1344                      ELSE
1345                         pre_tend = pre_tend
1346                      ENDIF
1347!
1348!--                   Calculate final tendency
1349                      tend(k,j,i) = tend(k,j,i) + pre_tend
1350
[138]1351                   ENDDO
1352                ENDDO
1353             ENDDO
1354
1355!
1356!--       w-component
1357          CASE ( 3 )
1358             DO  i = nxl, nxr
1359                DO  j = nys, nyn
[2232]1360!
1361!--                Determine topography-top index on w-grid
[2698]1362                   k_wall = get_topography_top_index_ji( j, i, 'w' )
[2317]1363
[2696]1364                   DO  k = k_wall+1, k_wall + pch_index_ji(j,i) - 1
[1484]1365
[2232]1366                      kk = k - k_wall   !- lad arrays are defined flat
[1721]1367
[1484]1368                      pre_tend = 0.0_wp
1369                      pre_w = 0.0_wp
1370!
1371!--                   Calculate preliminary value (pre_tend) of the tendency
1372                      pre_tend = - cdc *                                       &
1373                                   (0.5_wp *                                   &
[1721]1374                                      ( lad_s(kk+1,j,i) + lad_s(kk,j,i) )) *   &
[1484]1375                                   SQRT( ( 0.25_wp * ( u(k,j,i)   +            &
1376                                                       u(k,j,i+1) +            &
1377                                                       u(k+1,j,i) +            &
1378                                                       u(k+1,j,i+1) )          &
1379                                         )**2 +                                &
1380                                         ( 0.25_wp * ( v(k,j,i)   +            &
1381                                                       v(k,j+1,i) +            &
1382                                                       v(k+1,j,i) +            &
1383                                                       v(k+1,j+1,i) )          &
1384                                         )**2 +                                &
1385                                         w(k,j,i)**2                           &
1386                                       ) *                                     &
1387                                   w(k,j,i)
1388!
1389!--                   Calculate preliminary new velocity, based on pre_tend
1390                      pre_w = w(k,j,i) + dt_3d * pre_tend
1391!
1392!--                   Compare sign of old velocity and new preliminary velocity,
1393!--                   and in case the signs are different, limit the tendency
1394                      IF ( SIGN(pre_w,w(k,j,i)) /= pre_w )  THEN
1395                         pre_tend = - w(k,j,i) * ddt_3d
1396                      ELSE
1397                         pre_tend = pre_tend
1398                      ENDIF
1399!
1400!--                   Calculate final tendency
1401                      tend(k,j,i) = tend(k,j,i) + pre_tend
1402
[138]1403                   ENDDO
1404                ENDDO
1405             ENDDO
1406
1407!
[153]1408!--       potential temperature
[138]1409          CASE ( 4 )
1410             DO  i = nxl, nxr
1411                DO  j = nys, nyn
[2232]1412!
1413!--                Determine topography-top index on scalar-grid
[2698]1414                   k_wall = get_topography_top_index_ji( j, i, 's' )
[2317]1415
[2696]1416                   DO  k = k_wall+1, k_wall + pch_index_ji(j,i)
[2232]1417
1418                      kk = k - k_wall   !- lad arrays are defined flat
[2011]1419                      tend(k,j,i) = tend(k,j,i) + pc_heating_rate(kk,j,i)
[153]1420                   ENDDO
1421                ENDDO
1422             ENDDO
1423
1424!
[1960]1425!--       humidity
[153]1426          CASE ( 5 )
1427             DO  i = nxl, nxr
1428                DO  j = nys, nyn
[2232]1429!
1430!--                Determine topography-top index on scalar-grid
[2698]1431                   k_wall = get_topography_top_index_ji( j, i, 's' )
[2317]1432
[2696]1433                   DO  k = k_wall+1, k_wall + pch_index_ji(j,i)
[2232]1434
1435                      kk = k - k_wall   !- lad arrays are defined flat
[3014]1436                      pc_transpiration_rate(kk,j,i) =  - lsec                  &
1437                                       * lad_s(kk,j,i) *                       &
[1484]1438                                       SQRT( ( 0.5_wp * ( u(k,j,i) +           &
1439                                                          u(k,j,i+1) )         &
1440                                             )**2 +                            &
1441                                             ( 0.5_wp * ( v(k,j,i) +           &
1442                                                          v(k,j+1,i) )         &
1443                                             )**2 +                            &
1444                                             ( 0.5_wp * ( w(k-1,j,i) +         & 
1445                                                          w(k,j,i) )           &
1446                                             )**2                              &
1447                                           ) *                                 &
1448                                       ( q(k,j,i) - lsc )
[3014]1449
1450                      tend(k,j,i) = tend(k,j,i) + pc_transpiration_rate(kk,j,i)
[153]1451                   ENDDO
1452                ENDDO
1453             ENDDO
1454
1455!
1456!--       sgs-tke
1457          CASE ( 6 )
1458             DO  i = nxl, nxr
1459                DO  j = nys, nyn
[2232]1460!
1461!--                Determine topography-top index on scalar-grid
[2698]1462                   k_wall = get_topography_top_index_ji( j, i, 's' )
[2317]1463
[2696]1464                   DO  k = k_wall+1, k_wall + pch_index_ji(j,i)
[2232]1465
1466                      kk = k - k_wall   !- lad arrays are defined flat
[1484]1467                      tend(k,j,i) = tend(k,j,i) -                              &
1468                                       2.0_wp * cdc *                          &
[1721]1469                                       lad_s(kk,j,i) *                         &
[1484]1470                                       SQRT( ( 0.5_wp * ( u(k,j,i) +           &
1471                                                          u(k,j,i+1) )         &
1472                                             )**2 +                            &
1473                                             ( 0.5_wp * ( v(k,j,i) +           &
1474                                                          v(k,j+1,i) )         &
1475                                             )**2 +                            &
1476                                             ( 0.5_wp * ( w(k,j,i) +           &
1477                                                          w(k+1,j,i) )         &
1478                                             )**2                              &
1479                                           ) *                                 &
1480                                       e(k,j,i)
[138]1481                   ENDDO
1482                ENDDO
1483             ENDDO 
[1960]1484!
1485!--       scalar concentration
1486          CASE ( 7 )
1487             DO  i = nxl, nxr
1488                DO  j = nys, nyn
[2232]1489!
1490!--                Determine topography-top index on scalar-grid
[2698]1491                   k_wall = get_topography_top_index_ji( j, i, 's' )
[2317]1492
[2696]1493                   DO  k = k_wall+1, k_wall + pch_index_ji(j,i)
[2232]1494
1495                      kk = k - k_wall   !- lad arrays are defined flat
[1960]1496                      tend(k,j,i) = tend(k,j,i) -                              &
1497                                       lsec *                                  &
1498                                       lad_s(kk,j,i) *                         &
1499                                       SQRT( ( 0.5_wp * ( u(k,j,i) +           &
1500                                                          u(k,j,i+1) )         &
1501                                             )**2 +                            &
1502                                             ( 0.5_wp * ( v(k,j,i) +           &
1503                                                          v(k,j+1,i) )         &
1504                                             )**2 +                            &
1505                                             ( 0.5_wp * ( w(k-1,j,i) +         & 
1506                                                          w(k,j,i) )           &
1507                                             )**2                              &
1508                                           ) *                                 &
1509                                       ( s(k,j,i) - lsc )
1510                   ENDDO
1511                ENDDO
1512             ENDDO   
[1484]1513
1514
[1960]1515
[138]1516          CASE DEFAULT
1517
[257]1518             WRITE( message_string, * ) 'wrong component: ', component
[1826]1519             CALL message( 'pcm_tendency', 'PA0279', 1, 2, 0, 6, 0 ) 
[138]1520
1521       END SELECT
1522
[1826]1523    END SUBROUTINE pcm_tendency
[138]1524
1525
1526!------------------------------------------------------------------------------!
[1484]1527! Description:
1528! ------------
[1682]1529!> Calculation of the tendency terms, accounting for the effect of the plant
1530!> canopy on momentum and scalar quantities.
1531!>
1532!> The canopy is located where the leaf area density lad_s(k,j,i) > 0.0
[1826]1533!> (defined on scalar grid), as initialized in subroutine pcm_init.
[1682]1534!> The lad on the w-grid is vertically interpolated from the surrounding
1535!> lad_s. The upper boundary of the canopy is defined on the w-grid at
1536!> k = pch_index. Here, the lad is zero.
1537!>
1538!> The canopy drag must be limited (previously accounted for by calculation of
1539!> a limiting canopy timestep for the determination of the maximum LES timestep
1540!> in subroutine timestep), since it is physically impossible that the canopy
1541!> drag alone can locally change the sign of a velocity component. This
1542!> limitation is realized by calculating preliminary tendencies and velocities.
1543!> It is subsequently checked if the preliminary new velocity has a different
1544!> sign than the current velocity. If so, the tendency is limited in a way that
1545!> the velocity can at maximum be reduced to zero by the canopy drag.
1546!>
1547!>
1548!> Call for grid point i,j
[138]1549!------------------------------------------------------------------------------!
[1826]1550    SUBROUTINE pcm_tendency_ij( i, j, component )
[138]1551
1552
[1320]1553       USE control_parameters,                                                 &
[1484]1554           ONLY:  dt_3d, message_string
[1320]1555
1556       USE kinds
1557
[138]1558       IMPLICIT NONE
1559
[1682]1560       INTEGER(iwp) ::  component !< prognostic variable (u,v,w,pt,q,e)
1561       INTEGER(iwp) ::  i         !< running index
1562       INTEGER(iwp) ::  j         !< running index
1563       INTEGER(iwp) ::  k         !< running index
[2232]1564       INTEGER(iwp) ::  k_wall    !< vertical index of topography top
[1721]1565       INTEGER(iwp) ::  kk        !< running index for flat lad arrays
[138]1566
[1682]1567       REAL(wp) ::  ddt_3d    !< inverse of the LES timestep (dt_3d)
1568       REAL(wp) ::  lad_local !< local lad value
1569       REAL(wp) ::  pre_tend  !< preliminary tendency
1570       REAL(wp) ::  pre_u     !< preliminary u-value
1571       REAL(wp) ::  pre_v     !< preliminary v-value
1572       REAL(wp) ::  pre_w     !< preliminary w-value
[1484]1573
1574
1575       ddt_3d = 1.0_wp / dt_3d
[138]1576!
[1484]1577!--    Compute drag for the three velocity components and the SGS-TKE
[142]1578       SELECT CASE ( component )
[138]1579
1580!
[142]1581!--       u-component
[1484]1582          CASE ( 1 )
[2232]1583!
1584!--          Determine topography-top index on u-grid
[2698]1585             k_wall = get_topography_top_index_ji( j, i, 'u' )
[2696]1586             DO  k = k_wall + 1, k_wall + pch_index_ji(j,i)
[2317]1587
[2696]1588                kk = k - k_wall  !- lad arrays are defined flat
[138]1589
1590!
[1484]1591!--             In order to create sharp boundaries of the plant canopy,
1592!--             the lad on the u-grid at index (k,j,i) is equal to lad_s(k,j,i),
1593!--             rather than being interpolated from the surrounding lad_s,
1594!--             because this would yield smaller lad at the canopy boundaries
1595!--             than inside of the canopy.
1596!--             For the same reason, the lad at the rightmost(i+1)canopy
1597!--             boundary on the u-grid equals lad_s(k,j,i).
[1721]1598                lad_local = lad_s(kk,j,i)
1599                IF ( lad_local == 0.0_wp .AND. lad_s(kk,j,i-1) > 0.0_wp )  THEN
1600                   lad_local = lad_s(kk,j,i-1)
[1484]1601                ENDIF
1602
1603                pre_tend = 0.0_wp
1604                pre_u = 0.0_wp
1605!
1606!--             Calculate preliminary value (pre_tend) of the tendency
1607                pre_tend = - cdc *                                             &
1608                             lad_local *                                       &   
1609                             SQRT( u(k,j,i)**2 +                               &
1610                                   ( 0.25_wp * ( v(k,j,i-1)  +                 &
1611                                                 v(k,j,i)    +                 &
1612                                                 v(k,j+1,i)  +                 &
1613                                                 v(k,j+1,i-1) )                &
1614                                   )**2 +                                      &
1615                                   ( 0.25_wp * ( w(k-1,j,i-1) +                &
1616                                                 w(k-1,j,i)   +                &
1617                                                 w(k,j,i-1)   +                &
1618                                                 w(k,j,i) )                    &
1619                                   )**2                                        &
1620                                 ) *                                           &
1621                             u(k,j,i)
1622
1623!
1624!--             Calculate preliminary new velocity, based on pre_tend
1625                pre_u = u(k,j,i) + dt_3d * pre_tend
1626!
1627!--             Compare sign of old velocity and new preliminary velocity,
1628!--             and in case the signs are different, limit the tendency
1629                IF ( SIGN(pre_u,u(k,j,i)) /= pre_u )  THEN
1630                   pre_tend = - u(k,j,i) * ddt_3d
1631                ELSE
1632                   pre_tend = pre_tend
1633                ENDIF
1634!
1635!--             Calculate final tendency
1636                tend(k,j,i) = tend(k,j,i) + pre_tend
1637             ENDDO
1638
1639
1640!
[142]1641!--       v-component
[1484]1642          CASE ( 2 )
[2232]1643!
1644!--          Determine topography-top index on v-grid
[2698]1645             k_wall = get_topography_top_index_ji( j, i, 'v' )
[2317]1646
[2696]1647             DO  k = k_wall + 1, k_wall + pch_index_ji(j,i)
[138]1648
[2232]1649                kk = k - k_wall  !- lad arrays are defined flat
[138]1650!
[1484]1651!--             In order to create sharp boundaries of the plant canopy,
1652!--             the lad on the v-grid at index (k,j,i) is equal to lad_s(k,j,i),
1653!--             rather than being interpolated from the surrounding lad_s,
1654!--             because this would yield smaller lad at the canopy boundaries
1655!--             than inside of the canopy.
1656!--             For the same reason, the lad at the northmost(j+1)canopy
1657!--             boundary on the v-grid equals lad_s(k,j,i).
[1721]1658                lad_local = lad_s(kk,j,i)
1659                IF ( lad_local == 0.0_wp .AND. lad_s(kk,j-1,i) > 0.0_wp )  THEN
1660                   lad_local = lad_s(kk,j-1,i)
[1484]1661                ENDIF
1662
1663                pre_tend = 0.0_wp
1664                pre_v = 0.0_wp
1665!
1666!--             Calculate preliminary value (pre_tend) of the tendency
1667                pre_tend = - cdc *                                             &
1668                             lad_local *                                       &
1669                             SQRT( ( 0.25_wp * ( u(k,j-1,i)   +                &
1670                                                 u(k,j-1,i+1) +                &
1671                                                 u(k,j,i)     +                &
1672                                                 u(k,j,i+1) )                  &
1673                                   )**2 +                                      &
1674                                   v(k,j,i)**2 +                               &
1675                                   ( 0.25_wp * ( w(k-1,j-1,i) +                &
1676                                                 w(k-1,j,i)   +                &
1677                                                 w(k,j-1,i)   +                &
1678                                                 w(k,j,i) )                    &
1679                                   )**2                                        &
1680                                 ) *                                           &
1681                             v(k,j,i)
1682
1683!
1684!--             Calculate preliminary new velocity, based on pre_tend
1685                pre_v = v(k,j,i) + dt_3d * pre_tend
1686!
1687!--             Compare sign of old velocity and new preliminary velocity,
1688!--             and in case the signs are different, limit the tendency
1689                IF ( SIGN(pre_v,v(k,j,i)) /= pre_v )  THEN
1690                   pre_tend = - v(k,j,i) * ddt_3d
1691                ELSE
1692                   pre_tend = pre_tend
1693                ENDIF
1694!
1695!--             Calculate final tendency
1696                tend(k,j,i) = tend(k,j,i) + pre_tend
1697             ENDDO
1698
1699
1700!
[142]1701!--       w-component
[1484]1702          CASE ( 3 )
[2232]1703!
1704!--          Determine topography-top index on w-grid
[2698]1705             k_wall = get_topography_top_index_ji( j, i, 'w' )
[2317]1706
[2696]1707             DO  k = k_wall + 1, k_wall + pch_index_ji(j,i) - 1
[138]1708
[2232]1709                kk = k - k_wall  !- lad arrays are defined flat
[1721]1710
[1484]1711                pre_tend = 0.0_wp
1712                pre_w = 0.0_wp
[138]1713!
[1484]1714!--             Calculate preliminary value (pre_tend) of the tendency
1715                pre_tend = - cdc *                                             &
1716                             (0.5_wp *                                         &
[1721]1717                                ( lad_s(kk+1,j,i) + lad_s(kk,j,i) )) *         &
[1484]1718                             SQRT( ( 0.25_wp * ( u(k,j,i)    +                 & 
1719                                                 u(k,j,i+1)  +                 &
1720                                                 u(k+1,j,i)  +                 &
1721                                                 u(k+1,j,i+1) )                &
1722                                   )**2 +                                      &
1723                                   ( 0.25_wp * ( v(k,j,i)    +                 &
1724                                                 v(k,j+1,i)  +                 &
1725                                                 v(k+1,j,i)  +                 &
1726                                                 v(k+1,j+1,i) )                &
1727                                   )**2 +                                      &
1728                                   w(k,j,i)**2                                 &
1729                                 ) *                                           &
1730                             w(k,j,i)
1731!
1732!--             Calculate preliminary new velocity, based on pre_tend
1733                pre_w = w(k,j,i) + dt_3d * pre_tend
1734!
1735!--             Compare sign of old velocity and new preliminary velocity,
1736!--             and in case the signs are different, limit the tendency
1737                IF ( SIGN(pre_w,w(k,j,i)) /= pre_w )  THEN
1738                   pre_tend = - w(k,j,i) * ddt_3d
1739                ELSE
1740                   pre_tend = pre_tend
1741                ENDIF
1742!
1743!--             Calculate final tendency
1744                tend(k,j,i) = tend(k,j,i) + pre_tend
1745             ENDDO
1746
1747!
[153]1748!--       potential temperature
1749          CASE ( 4 )
[2232]1750!
1751!--          Determine topography-top index on scalar grid
[2698]1752             k_wall = get_topography_top_index_ji( j, i, 's' )
[2317]1753
[2696]1754             DO  k = k_wall + 1, k_wall + pch_index_ji(j,i)
[2232]1755                kk = k - k_wall  !- lad arrays are defined flat
[2011]1756                tend(k,j,i) = tend(k,j,i) + pc_heating_rate(kk,j,i)
[153]1757             ENDDO
1758
1759
1760!
[1960]1761!--       humidity
[153]1762          CASE ( 5 )
[2232]1763!
1764!--          Determine topography-top index on scalar grid
[2698]1765             k_wall = get_topography_top_index_ji( j, i, 's' )
[2317]1766
[2696]1767             DO  k = k_wall + 1, k_wall + pch_index_ji(j,i)
[3014]1768                kk = k - k_wall  !- lad arrays are defined flat
[2232]1769
[3014]1770                pc_transpiration_rate(kk,j,i) = - lsec                         &
1771                                 * lad_s(kk,j,i) *                             &
[1484]1772                                 SQRT( ( 0.5_wp * ( u(k,j,i) +                 &
1773                                                    u(k,j,i+1) )               &
1774                                       )**2  +                                 &
1775                                       ( 0.5_wp * ( v(k,j,i) +                 &
1776                                                    v(k,j+1,i) )               &
1777                                       )**2 +                                  &
1778                                       ( 0.5_wp * ( w(k-1,j,i) +               &
1779                                                    w(k,j,i) )                 &
1780                                       )**2                                    &
1781                                     ) *                                       &
1782                                 ( q(k,j,i) - lsc )
[3014]1783
1784                tend(k,j,i) = tend(k,j,i) + pc_transpiration_rate(kk,j,i)
1785
[153]1786             ENDDO   
1787
1788!
[142]1789!--       sgs-tke
[1484]1790          CASE ( 6 )
[2232]1791!
1792!--          Determine topography-top index on scalar grid
[2698]1793             k_wall = get_topography_top_index_ji( j, i, 's' )
[2317]1794
[2696]1795             DO  k = k_wall + 1, k_wall + pch_index_ji(j,i)
[2232]1796
1797                kk = k - k_wall
[1484]1798                tend(k,j,i) = tend(k,j,i) -                                    &
1799                                 2.0_wp * cdc *                                &
[1721]1800                                 lad_s(kk,j,i) *                               &
[1484]1801                                 SQRT( ( 0.5_wp * ( u(k,j,i) +                 &
1802                                                    u(k,j,i+1) )               &
1803                                       )**2 +                                  & 
1804                                       ( 0.5_wp * ( v(k,j,i) +                 &
1805                                                    v(k,j+1,i) )               &
1806                                       )**2 +                                  &
1807                                       ( 0.5_wp * ( w(k,j,i) +                 &
1808                                                    w(k+1,j,i) )               &
1809                                       )**2                                    &
1810                                     ) *                                       &
1811                                 e(k,j,i)
1812             ENDDO
[1960]1813             
1814!
1815!--       scalar concentration
1816          CASE ( 7 )
[2232]1817!
1818!--          Determine topography-top index on scalar grid
[2698]1819             k_wall = get_topography_top_index_ji( j, i, 's' )
[2317]1820
[2696]1821             DO  k = k_wall + 1, k_wall + pch_index_ji(j,i)
[2232]1822
1823                kk = k - k_wall
[1960]1824                tend(k,j,i) = tend(k,j,i) -                                    &
1825                                 lsec *                                        &
1826                                 lad_s(kk,j,i) *                               &
1827                                 SQRT( ( 0.5_wp * ( u(k,j,i) +                 &
1828                                                    u(k,j,i+1) )               &
1829                                       )**2  +                                 &
1830                                       ( 0.5_wp * ( v(k,j,i) +                 &
1831                                                    v(k,j+1,i) )               &
1832                                       )**2 +                                  &
1833                                       ( 0.5_wp * ( w(k-1,j,i) +               &
1834                                                    w(k,j,i) )                 &
1835                                       )**2                                    &
1836                                     ) *                                       &
1837                                 ( s(k,j,i) - lsc )
1838             ENDDO               
[138]1839
[142]1840       CASE DEFAULT
[138]1841
[257]1842          WRITE( message_string, * ) 'wrong component: ', component
[1826]1843          CALL message( 'pcm_tendency', 'PA0279', 1, 2, 0, 6, 0 ) 
[138]1844
[142]1845       END SELECT
[138]1846
[1826]1847    END SUBROUTINE pcm_tendency_ij
[138]1848
[2007]1849
1850
[138]1851 END MODULE plant_canopy_model_mod
Note: See TracBrowser for help on using the repository browser.