To run the urban parameterization TERRA-URB in the COSMO-Model, a poor man's tile approach has been implemented. For that, several variables now have an additional dimension for the tiles. A new configuration variable ntiles has been introduced in module data_modelconfig.f90. Once TERRA-URB also has been implemented, ntiles can be chosen as "0" (no tile approach) or as "2" (a natural tile and an urban tile).
Allocation of variables for TilesTo introduce the tiles, the following modules have been modified:
For example variable: T_SO
old: | ijk: | t_so(ie,je,0:ke_soil+1,nztlev) |
blocked: | t_so_b(nproma,0:ke_soil+1) | |
t_so_new_b(nproma,0:ke_soil+1) | ||
new: | ijk: | t_so(ie,je,0:ke_soil+1,0:ntiles,nztlev) |
blocked: | t_so_b(nproma,0:ke_soil+1,0:ntiles) | |
t_so_new_b(nproma,0:ke_soil+1,0:ntiles) |
For the ijk-variables, the tile-dimension is introduced before the time-level. This is necessary to handle the I/O in the same way as before, which makes it necessary to have the time dimension last.
For the blocked variables there is no time dimension, because there are different variables for the old and the new time step.
Exception:
For the TKE, there is an internal time stepping, therefore also
the variable tke_b has a time dimenion. But here now the tile dimension
is last to enable a proper passing to subroutines turbtran and turbdiff
in turb_interface:
tke_b (nproma,ke+1,SIZE(tke,5),0:ntiles))
Several changes in the rest of the model are now necessary to handle the additional tile dimension:
Usage of the tiles
The turbulent transfer scheme turbtran and the surface scheme TERRA are called for the different tiles. Several variables (fluxes, diagnostic variables) are then aggregated from the values of the different tiles and stored in tile 0. This tile 0 is used for all other computations then.
If the tile approach is not used at all (ntiles=0), only tile 0 is used throughout all computations.
Organization of I/O
By adding another dimension for the tiles, the rank for the corresponding variables is changing. Also, another rank 5 has to be added. This causes changes in the whole I/O process, where the rank is important. In the structure ar_des for the variable table, the rank 5 and another logical ltiles have been added. ltiles is TRUE for tile variables.
To identify the different tiles for a variable we use the additional element number (naee) in GRIB1 and in restart files. For NetCDF an additional dimension ID ntiles is defined. To write also all tiles of a variable to the output, a new entry lwrite_tiles has been introduced in the GRIBOUT structure pp_nl.
Regarding the ranks of variables, the following situations are now possible ("old" is for variables still without tiles, "new" is for variables now including tiles):
Rank | new/old | type of variables | Examples |
---|---|---|---|
5 | new | 3D + tiles + time dimension | T_SO, W_SO, W_SO_ICE, TKE |
multi-layer snow variables | |||
4 | new | 3D + tiles | TKVM, TKVH, EDR |
old | 3D + + time dimension | U, V, W, P, etc. | |
new | 2D + tiles + time dimension | T_S, T_SNOW, T_G, etc. | |
3 | old | 3D | HHL, etc. |
new | 2D + tiles | PLCOV, LAI, Z0, etc. | |
old | 2D + time dimension | PS, etc. | |
2 | old | 2D | HSURF, etc. |
These modules have been modified for I/O:
Organization of copy-in/copy-out for the blocked data format
The additional dimension makes it necessary to introduce additional subroutines in the module src_block_fields.f90 to handle now 4D fields with and without time level:
Note: | The additional dimension is between the spatial dimensions and the time level! Only for tke_b it is different: here the additional dimension is the last one. Otherwise, passing this field to turbtran or turbdiff in the form tke_b(:,:,itile,:) gives problems. |
Implications to other parts of the COSMO-Model
There are other parts of the model, which have similar structures as in the I/O depending on the rank, but not all of them are affected:
Problem: | The original tracer field now has dimensions (1:ie,1:je,0:ntiles,1:2), but the tracer pointer is (1,1,1,1) |
Modifications to other Modules
The additional dimension for the tiles has to be added in all modules, where these variables are used. In most of these modules, only the tile 0 is used.
Only in the physics the loop over the tiles has been implemented in:
The climate scenarios for CMIP6 feature the so-called "Shared Socioeconomic Pathways" emission scenarios. To faciliate the downscaling of CMIP6 simulations, several of the corresponding greenhouse-gas concentrations can be choosen by setting the namelist parameter ico2_rad to values between 11 and 19. The following scenarios are available:
SSP1-1.9 | ico2_rad = 11 |
SSP1-2.6 | ico2_rad = 12 |
SSP2-4.5 | ico2_rad = 13 |
SSP3-7.0 | ico2_rad = 14 |
SSP3-7.0-lowNTCF | ico2_rad = 15 |
SSP4-3.4 | ico2_rad = 16 |
SSP4-6.0 | ico2_rad = 17 |
SSP5-3.4-over | ico2_rad = 18 |
SSP5-8.5 | ico2_rad = 19 |
The SSP scenarios stand for:
The second number behind the hyphen refers to the radiative forcing from greenhouse-gases by 2100 in W/m2, similar to the older RCP scenarios (e.g. SSP5-8.5 is very similar to RCP8.5).
Enabled a zero-value boundary condition for tracers in the Fortran Dycore (src_advection_rk.f90) and also support lbc==0 in the GT Dycore.
A second test has been added for the climate testcase in testlist_mch.xml and in testlist_gpu.xml.
When a large computational domain is employed, a crash occurend with asynchronous NetCDF output (num_asynio_comm > 0), because the MPI isend buffer was too small (10 MB). When using double precision, this happens once the domain exceeds about 1100x1100x60 grid points. To circumvent this, a new namelist entry (asynio_block_size) was added that allows for increasing the value of that buffer. Note that the maximum allocateable isend buffer (max_num_blocks) remains at 1 GB.
Support for NetCDF4 I/O
The classic NetCDF format (yform_write='ncdf') restricts the size of variables. For very large grids (e.g., 5001x3001x80), NetCDF output therefore fails. Low- level support for NetCDF4 has already been present in the respective modules, but the option was not implemented. By contrast, int2lm, which shares those modules, already provided the option yform_write='nc-4'. This option has now also been added to COSMO, along with yform_restart='nc-4' for restart files in the NetCDF4 format. NetCDF4 support has also been added for asynchronous NetCDF output. Note that for input, nothing changes as yform_read='ncdf' has already handled both classic NetCDF and NetCDF4 files automatically. Additionally, a check has been added for yform_restart with the possible values 'bina' (default), 'ncdf' and 'nc-4'.
Adaptations due to NetCDF Standards
In the module src_setup_vartab.f90, all standard and long names of the I/O variables have been checked and adapted according to NetCDF standards: If there is no NetCDF standard name, we set: '-'
Fix bug when waiting for input files
If input files are not present, when the COSMO-Model runs, and the DWD ready-file mechanism is not used to wait for these files, the model will crash, if the input files have the 14-digit file names including minutes and seconds, even if the llockfile mechanism (waiting for files) is used.
Reason for that is: If an input file with 14-digit file name does not exist, the subroutine create_file_name returns a 10-digit file name, and the model will then wait for such a file, even if an input file with a 14-digit file name is provided later on.
This has been fixed now in module src_input.f90 (Section 1.3): If no input file exists at all, create_file_name returns both file names, one with a 14- and another with a 10-digit file name (yname, yname2). The subroutine wait_for_file is called in any cases, and checks, which of the files really exists. In case nmaxwait > 0, it will wait up to nmaxwait seconds and periodically (nincwait) check the existence, before it aborts the program.
When running the seaice scheme in the COSMO-Model, existing sea ice can be melted. But the corresponding sea surface temperature t_s was not adapted and remained on a perhaps much too cold temperature.
While testing this behaviour, other issues have been detected and fixed:
IF ( (fr_land_b(ip) < 0.5_wp) | .AND. (depth_lk_b(ip) < 0.0_wp) | & |
.AND. (h_ice_b (ip) > 0.0_wp) ) | THEN |
Group | Name | Meaning | Default | |||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
/RUNCTL/ | asynio_block_size | NEW | To determine size of send buffer in netcdf_io.f90 (value given in MByte). This send buffer depends on the size of the COSMO domain. The default of 10 MB suffices for domain sizes of about 1100x1100x60 grid points. For larger domains, the size can be adjusted with this variable. Note that the maximum allocatable isend buffer (max_num_blocks) remains at 1 GB. | 10 | ||||||||||||||||||
/PHYCTL/ | ico2_rad | new options | Extended the range of ico2_rad to 19. Additional scenarios are
| 0 | ||||||||||||||||||
cimpl | DELETED | Has been removed, as it is now obsolete for the skin temperature formulation. | --- | |||||||||||||||||||
/GRIBOUT/ | yform_write | new option | In addition to the classical NetCDF format (yform_write='ncdf'), now also NetCDF4 files can be written by setting: yform_write='nc-4' | 0 |
If running with the seaice scheme, there might be changes to t_s and therefore also to the atmosphere, when ice is melting during the simulation period.
The values of the TKE on pressure levels is changing due to a bug fix.
Otherwise there are no changes to the results.