Ignore:
Timestamp:
Mar 5, 2019 11:13:35 AM (5 years ago)
Author:
eckhard
Message:

inifor: bugfix: Fixes issue #815 with geostrophic wind profiles

File:
1 edited

Legend:

Unmodified
Added
Removed
  • palm/trunk/UTIL/inifor/src/inifor.f90

    r3680 r3779  
    1515! PALM. If not, see <http://www.gnu.org/licenses/>.
    1616!
    17 ! Copyright 2017-2018 Leibniz Universitaet Hannover
    18 ! Copyright 2017-2018 Deutscher Wetterdienst Offenbach
     17! Copyright 2017-2019 Leibniz Universitaet Hannover
     18! Copyright 2017-2019 Deutscher Wetterdienst Offenbach
    1919!------------------------------------------------------------------------------!
    2020!
     
    2626! -----------------
    2727! $Id$
     28! Average geostrophic wind components on coarse COSMO levels instead of fine PALM levels
     29! Remove --debug netCDF output of internal pressure profiles
     30!
     31! 3680 2019-01-18 14:54:12Z knoop
    2832! Prefixed all INIFOR modules with inifor_
    2933!
     
    7478!> and forcing data for the urban climate model PALM-4U. The required
    7579!> meteorological fields are interpolated from output data of the mesoscale
    76 !> model COSMO-DE. This is the main program file.
     80!> model COSMO. This is the main program file.
    7781!------------------------------------------------------------------------------!
    7882 PROGRAM inifor
     
    9195    USE inifor_io
    9296    USE inifor_transform,                                                      &
    93         ONLY:  average_profile, interpolate_2d, interpolate_3d,                &
    94                geostrophic_winds, extrapolate_density, extrapolate_pressure,   &
    95                get_surface_pressure
     97        ONLY:  average_pressure_perturbation, average_profile, interpolate_1d, &
     98               interpolate_1d_arr, interpolate_2d, interpolate_3d,             &
     99               interp_average_profile, geostrophic_winds, extrapolate_density, &
     100               extrapolate_pressure, get_surface_pressure
    96101    USE inifor_types
    97102   
     
    104109    REAL(dp), ALLOCATABLE, DIMENSION(:,:,:)     ::  output_arr !< array buffer for interpolated quantities
    105110    REAL(dp), ALLOCATABLE, DIMENSION(:), TARGET ::  rho_centre !< density profile of the centre averaging domain
    106     REAL(dp), ALLOCATABLE, DIMENSION(:), TARGET ::  ug_arr     !< geostrophic wind in x direction
    107     REAL(dp), ALLOCATABLE, DIMENSION(:), TARGET ::  vg_arr     !< geostrophic wind in y direction
     111    REAL(dp), ALLOCATABLE, DIMENSION(:), TARGET ::  ug_cosmo   !< profile of the geostrophic wind in x direction on COSMO levels
     112    REAL(dp), ALLOCATABLE, DIMENSION(:), TARGET ::  vg_cosmo   !< profile of the geostrophic wind in y direction on COSMO levels
     113    REAL(dp), ALLOCATABLE, DIMENSION(:), TARGET ::  ug_palm    !< profile of the geostrophic wind in x direction interpolated onto PALM levels
     114    REAL(dp), ALLOCATABLE, DIMENSION(:), TARGET ::  vg_palm    !< profile of the geostrophic wind in y direction interpolated onto PALM levels
    108115    REAL(dp), ALLOCATABLE, DIMENSION(:), TARGET ::  rho_north  !< density profile of the northern averaging domain
    109116    REAL(dp), ALLOCATABLE, DIMENSION(:), TARGET ::  rho_south  !< density profile of the southern averaging domain
     
    116123
    117124    REAL(dp), POINTER, DIMENSION(:) ::  internal_arr !< pointer to the currently processed internal array (density, pressure)
    118     REAL(dp), POINTER, DIMENSION(:) ::  ug_vg_arr    !< pointer to the currently processed geostrophic wind component
     125    REAL(dp), POINTER, DIMENSION(:) ::  ug_vg_palm   !< pointer to the currently processed geostrophic wind component
    119126
    120127    TYPE(nc_var), POINTER        ::  output_var      !< pointer to the currently processed output variable
     
    255262 CALL run_control('time', 'alloc')
    256263                     
    257                       CALL average_profile(                                    &
     264                      CALL interp_average_profile(                             &
    258265                         input_buffer(output_var % input_id) % array(:,:,:),   &
    259266                         output_arr(0,0,:),                                    &
     
    282289
    283290                      CASE('internal_density_centre')
    284                          ALLOCATE( rho_centre( 1:output_var % grid % nz ) )
     291                         ALLOCATE( rho_centre( 1:cosmo_grid % nz) )
    285292                         internal_arr => rho_centre
    286293
    287294                      CASE('internal_density_north')
    288                          ALLOCATE( rho_north( 1:output_var % grid % nz ) )
     295                         ALLOCATE( rho_north( 1:cosmo_grid % nz) )
    289296                         internal_arr => rho_north
    290297
    291298                      CASE('internal_density_south')
    292                          ALLOCATE( rho_south( 1:output_var % grid % nz ) )
     299                         ALLOCATE( rho_south( 1:cosmo_grid % nz) )
    293300                         internal_arr => rho_south
    294301
    295302                      CASE('internal_density_east')
    296                          ALLOCATE( rho_east( 1:output_var % grid % nz) )
     303                         ALLOCATE( rho_east( 1:cosmo_grid % nz) )
    297304                         internal_arr => rho_east
    298305
    299306                      CASE('internal_density_west')
    300                          ALLOCATE( rho_west( 1:output_var % grid % nz ) )
     307                         ALLOCATE( rho_west( 1:cosmo_grid % nz) )
    301308                         internal_arr => rho_west
    302309
    303310                      CASE('internal_pressure_north')
    304                          ALLOCATE( p_north( 1:output_var % grid % nz ) )
     311                         ALLOCATE( p_north( 1:cosmo_grid % nz) )
    305312                         internal_arr => p_north
    306313
    307314                      CASE('internal_pressure_south')
    308                          ALLOCATE( p_south( 1:output_var % grid % nz ) )
     315                         ALLOCATE( p_south( 1:cosmo_grid % nz) )
    309316                         internal_arr => p_south
    310317
    311318                      CASE('internal_pressure_east')
    312                          ALLOCATE( p_east( 1:output_var % grid % nz) )
     319                         ALLOCATE( p_east( 1:cosmo_grid % nz) )
    313320                         internal_arr => p_east
    314321
    315322                      CASE('internal_pressure_west')
    316                          ALLOCATE( p_west( 1:output_var % grid % nz ) )
     323                         ALLOCATE( p_west( 1:cosmo_grid % nz) )
    317324                         internal_arr => p_west
    318325
     
    324331
    325332
    326                       CALL average_profile(                                 &
    327                          input_buffer(output_var % input_id) % array(:,:,:),&
    328                          internal_arr(:),                                   &
    329                          output_var % averaging_grid)
    330 
    331                       SELECT CASE (TRIM(output_var % name))
    332 
    333                       CASE('internal_density_centre',                          &
    334                            'internal_density_north',                           &
    335                            'internal_density_south',                           &
    336                            'internal_density_east',                            &
    337                            'internal_density_west')
    338                          CALL extrapolate_density(internal_arr,                &
    339                                                   output_var % averaging_grid)
    340 
    341                       CASE('internal_pressure_north')
    342                          CALL extrapolate_pressure(internal_arr, rho_north,    &
    343                                                    output_var % averaging_grid)
    344 
    345                       CASE('internal_pressure_south')
    346                          CALL extrapolate_pressure(internal_arr, rho_south,    &
    347                                                    output_var % averaging_grid)
    348 
    349                       CASE('internal_pressure_east')
    350                          CALL extrapolate_pressure(internal_arr, rho_east,     &
    351                                                    output_var % averaging_grid)
    352 
    353                       CASE('internal_pressure_west')
    354                          CALL extrapolate_pressure(internal_arr, rho_west,     &
    355                                                    output_var % averaging_grid)
     333                      SELECT CASE( TRIM( output_var % name ) )
     334
     335                      CASE( 'internal_pressure_north',                         &
     336                            'internal_pressure_south',                         &
     337                            'internal_pressure_east',                          &
     338                            'internal_pressure_west' )
     339
     340                         CALL average_pressure_perturbation(                   &
     341                            input_buffer(output_var % input_id) % array(:,:,:),&
     342                            internal_arr(:),                                   &
     343                            cosmo_grid, output_var % averaging_grid            &
     344                         )
    356345
    357346                      CASE DEFAULT
    358                          CALL inifor_abort('main loop', message)
     347
     348                         CALL average_profile(                                 &
     349                            input_buffer(output_var % input_id) % array(:,:,:),&
     350                            internal_arr(:),                                   &
     351                            cosmo_grid, output_var % averaging_grid            &
     352                         )
    359353
    360354                      END SELECT
    361355
    362                       IF (.TRUE.)  THEN
    363                          ALLOCATE( output_arr(1,1,1:output_var % grid % nz) )
    364                          output_arr(1,1,:) = internal_arr(:)
    365                       END IF
     356
     357!
     358!--                   Output of geostrophic pressure profiles (with --debug
     359!--                   option) is currently deactivated, since they are now
     360!--                   defined on averaged COSMO levels instead of PALM levels
     361!--                   (requires definiton of COSMO levels in netCDF output.)
     362                      !IF (.TRUE.)  THEN
     363                      !   ALLOCATE( output_arr(1,1,1:output_var % grid % nz) )
     364                      !   output_arr(1,1,:) = internal_arr(:)
     365                      !END IF
    366366 CALL run_control('time', 'comp')
    367367
     
    369369!--                This case gets called twice, the first time for ug, the
    370370!--                second time for vg. We compute ug and vg at the first call
    371 !--                and keep vg (and ug for that matter) around for the second
    372 !--                call.
     371!--                and keep both of them around for the second call.
    373372                   CASE ( 'geostrophic winds' )
    374373
    375374                      IF (.NOT. ug_vg_have_been_computed )  THEN
    376                          ALLOCATE( ug_arr(output_var % grid % nz) )
    377                          ALLOCATE( vg_arr(output_var % grid % nz) )
    378 
    379                          IF ( cfg % ug_is_set )  THEN
    380                             ug_arr = cfg % ug
    381                             vg_arr = cfg % vg
     375                         ALLOCATE( ug_palm(output_var % grid % nz) )
     376                         ALLOCATE( vg_palm(output_var % grid % nz) )
     377                         ALLOCATE( ug_cosmo(cosmo_grid % nz) )
     378                         ALLOCATE( vg_cosmo(cosmo_grid % nz) )
     379
     380                         IF ( cfg % ug_defined_by_user )  THEN
     381                            ug_palm = cfg % ug
     382                            vg_palm = cfg % vg
    382383                         ELSE
    383384                            CALL geostrophic_winds( p_north, p_south, p_east,  &
     
    387388                                                    phi_n, lambda_n,           &
    388389                                                    phi_centre, lam_centre,    &
    389                                                     ug_arr, vg_arr )
     390                                                    ug_cosmo, vg_cosmo )
     391
     392                            CALL interpolate_1d( ug_cosmo, ug_palm,             &
     393                                                 output_var % grid )
     394
     395                            CALL interpolate_1d( vg_cosmo, vg_palm,             &
     396                                                 output_var % grid )
    390397                         END IF
    391398
     
    395402
    396403!
    397 !--                   Prepare output of geostrophic winds
     404!--                   Select output array of current geostrophic wind component
    398405                      SELECT CASE(TRIM(output_var % name))
    399406                      CASE ('ls_forcing_ug')
    400                          ug_vg_arr => ug_arr
     407                         ug_vg_palm => ug_palm
    401408                      CASE ('ls_forcing_vg')
    402                          ug_vg_arr => vg_arr
     409                         ug_vg_palm => vg_palm
    403410                      END SELECT
    404411
    405412                      ALLOCATE( output_arr(1,1,output_var % grid % nz) )
    406                       output_arr(1,1,:) = ug_vg_arr(:)
     413                      output_arr(1,1,:) = ug_vg_palm(:)
    407414
    408415                   CASE ( 'average scalar' )
     
    447454!- Section 2.3: Write current time step of current variable
    448455!------------------------------------------------------------------------------
    449                    IF (.NOT. output_var % is_internal .OR. debugging_output)  THEN
     456!
     457!--                Output of geostrophic pressure profiles (with --debug
     458!--                option) is currently deactivated, since they are now
     459!--                defined on averaged COSMO levels instead of PALM levels
     460!--                (requires definiton of COSMO levels in netCDF output.)
     461                   !IF (.NOT. output_var % is_internal .OR. debugging_output)  THEN
     462
     463                   IF (.NOT. output_var % is_internal)  THEN
    450464                      message = "Writing variable '" // TRIM(output_var%name) // "'."
    451465                      CALL report('main loop', message)
     
    467481             IF ( group % kind == 'thermodynamics' )  THEN
    468482                DEALLOCATE( rho_centre )
    469                 DEALLOCATE( ug_arr )
    470                 DEALLOCATE( vg_arr )
    471                 IF ( .NOT. cfg % ug_is_set )  THEN
     483                DEALLOCATE( ug_palm )
     484                DEALLOCATE( vg_palm )
     485                DEALLOCATE( ug_cosmo )
     486                DEALLOCATE( vg_cosmo )
     487                IF ( .NOT. cfg % ug_defined_by_user )  THEN
    472488                   DEALLOCATE( rho_north )
    473489                   DEALLOCATE( rho_south )
Note: See TracChangeset for help on using the changeset viewer.