Changeset 4795


Ignore:
Timestamp:
Nov 25, 2020 3:55:14 PM (3 years ago)
Author:
suehring
Message:

mesoscale nesting: bugfix in obtaining the correct timestamp in case of restart runs; virtual measurements: add missing control flags

Location:
palm/trunk/SOURCE
Files:
3 edited

Legend:

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

    r4724 r4795  
    2525! -----------------
    2626! $Id$
     27! Bugfix in obtaining the correct timestamp in case of restart runs
     28!
     29! 4724 2020-10-06 17:20:39Z suehring
    2730! - Enable LOD=1 input of boundary conditions
    2831! - Minor bugfix - add missing initialization of the top boundary
     
    300303       INTEGER(iwp) ::  nzu               !< number of vertical levels on scalar grid in dynamic input file
    301304       INTEGER(iwp) ::  nzw               !< number of vertical levels on w grid in dynamic input file
    302        INTEGER(iwp) ::  tind              !< time index for reference time in mesoscale-offline nesting
    303        INTEGER(iwp) ::  tind_p            !< time index for following time in mesoscale-offline nesting
     305       INTEGER(iwp) ::  tind = 0          !< time index for reference time in mesoscale-offline nesting
     306       INTEGER(iwp) ::  tind_p = 0        !< time index for following time in mesoscale-offline nesting
    304307
    305308       LOGICAL      ::  init = .FALSE.    !< flag indicating that offline nesting is already initialized
     
    502505       ENDIF
    503506!
    504 !--    CPU measurement
     507!--    Start of CPU measurement
    505508       CALL cpu_log( log_point_s(86), 'NetCDF input forcing', 'start' )
    506 
    507509!
    508510!--    Obtain time index for current point in time. Note, the time coordinate
     
    511513!--    7200.0. Further, since time_since_reference_point is negativ here when
    512514!--    spinup is applied, use MAX function to obtain correct time index.
    513        nest_offl%tind = MINLOC( ABS( nest_offl%time -                                              &
    514                                      MAX( time_since_reference_point, 0.0_wp)                      &
    515                                    ), DIM = 1 ) - 1
     515       nest_offl%tind = MINLOC( ABS( nest_offl%time - MAX( time_since_reference_point, 0.0_wp) ),  &
     516                                DIM = 1 ) - 1
     517!
     518!--    Note, in case of restart runs, the time index for the boundary data may indicate a time
     519!--    in the future. This needs to be checked and corrected.
     520       IF ( TRIM( initializing_actions ) == 'read_restart_data'  .AND.                             &
     521            nest_offl%time(nest_offl%tind) > time_since_reference_point )  THEN
     522          nest_offl%tind = nest_offl%tind - 1
     523       ENDIF
    516524       nest_offl%tind_p = nest_offl%tind + 1
    517525!
  • palm/trunk/SOURCE/salsa_mod.f90

    r4785 r4795  
    2626! -----------------
    2727! $Id$
     28! Bugfix in obtaining the correct timestamp in case of restart runs
     29!
     30! 4785 2020-11-15 20:11:14Z monakurppa
    2831! Fixing a segmentation fault in initialising aerosol and gas emissions
    2932!
     
    328331        ONLY:  air_chemistry, bc_dirichlet_l, bc_dirichlet_n, bc_dirichlet_r, bc_dirichlet_s,      &
    329332               bc_lr, bc_lr_cyc, bc_ns, bc_ns_cyc, bc_radiation_l, bc_radiation_n, bc_radiation_r, &
    330                bc_radiation_s, coupling_char, debug_output, dt_3d, intermediate_timestep_count,    &
     333               bc_radiation_s, coupling_char, debug_output, dt_3d,                                 &
     334               initializing_actions,                                                               &
     335               intermediate_timestep_count,                                                        &
    331336               intermediate_timestep_count_max, land_surface, max_pr_salsa, message_string,        &
    332337               monotonic_limiter_z, plant_canopy, pt_surface, restart_data_format_output, salsa,   &
     
    779784       INTEGER(iwp) ::  nt          !< number of time levels in dynamic input file
    780785       INTEGER(iwp) ::  nzu         !< number of vertical levels on scalar grid in dynamic input file
    781        INTEGER(iwp) ::  tind        !< time index for reference time in mesoscale-offline nesting
    782        INTEGER(iwp) ::  tind_p      !< time index for following time in mesoscale-offline nesting
     786       INTEGER(iwp) ::  tind = 0    !< time index for reference time in mesoscale-offline nesting
     787       INTEGER(iwp) ::  tind_p = 0  !< time index for following time in mesoscale-offline nesting
    783788
    784789       INTEGER(iwp), DIMENSION(maxspec) ::  cc_in2mod = 0  !< to transfer chemical composition from input to model
     
    1375913764!-- Obtain time index for current point in time.
    1376013765    salsa_nest_offl%tind = MINLOC( ABS( salsa_nest_offl%time -                                     &
    13761                                    MAX( time_since_reference_point, 0.0_wp ) ), DIM = 1 ) - 1
     13766                                        MAX( time_since_reference_point, 0.0_wp ) ), DIM = 1 ) - 1
     13767!
     13768!-- Note, in case of restart runs, the time index for the boundary data may indicate a time
     13769!-- in the future. This needs to be checked and corrected.
     13770    IF ( TRIM( initializing_actions ) == 'read_restart_data'  .AND.                                &
     13771         salsa_nest_offl%time(salsa_nest_offl%tind) > time_since_reference_point )  THEN
     13772       salsa_nest_offl%tind = salsa_nest_offl%tind - 1
     13773    ENDIF
    1376213774    salsa_nest_offl%tind_p = salsa_nest_offl%tind + 1
    1376313775!
  • palm/trunk/SOURCE/virtual_measurement_mod.f90

    r4764 r4795  
    2525! -----------------
    2626! $Id$
     27! - Add control flags
     28!
     29! 4764 2020-10-30 12:50:36Z suehring
    2730! Missing variable declaration and directives for netcdf4 added
    2831!
     
    206209               end_time,                                                                           &
    207210               humidity,                                                                           &
     211               land_surface,                                                                       &
    208212               message_string,                                                                     &
    209213               neutral,                                                                            &
     
    24262430
    24272431              CASE ( 'utheta' )
    2428                  DO  m = 1, vmea(l)%ns
    2429                     k = vmea(l)%k(m)
    2430                     j = vmea(l)%j(m)
    2431                     i = vmea(l)%i(m)
    2432                     vmea(l)%measured_vars(m,n) = 0.5_wp * ( u(k,j,i) + u(k,j,i+1) ) * pt(k,j,i)
    2433                  ENDDO
     2432                 IF ( .NOT. neutral )  THEN
     2433                    DO  m = 1, vmea(l)%ns
     2434                       k = vmea(l)%k(m)
     2435                       j = vmea(l)%j(m)
     2436                       i = vmea(l)%i(m)
     2437                       vmea(l)%measured_vars(m,n) = 0.5_wp * ( u(k,j,i) + u(k,j,i+1) ) * pt(k,j,i)
     2438                    ENDDO
     2439                 ENDIF
    24342440
    24352441              CASE ( 'vtheta' )
    2436                  DO  m = 1, vmea(l)%ns
    2437                     k = vmea(l)%k(m)
    2438                     j = vmea(l)%j(m)
    2439                     i = vmea(l)%i(m)
    2440                     vmea(l)%measured_vars(m,n) = 0.5_wp * ( v(k,j,i) + v(k,j+1,i) ) * pt(k,j,i)
    2441                  ENDDO
     2442                 IF ( .NOT. neutral )  THEN
     2443                    DO  m = 1, vmea(l)%ns
     2444                       k = vmea(l)%k(m)
     2445                       j = vmea(l)%j(m)
     2446                       i = vmea(l)%i(m)
     2447                       vmea(l)%measured_vars(m,n) = 0.5_wp * ( v(k,j,i) + v(k,j+1,i) ) * pt(k,j,i)
     2448                    ENDDO
     2449                 ENDIF
    24422450
    24432451              CASE ( 'wtheta' )
    2444                  DO  m = 1, vmea(l)%ns
    2445                     k = MAX ( 1, vmea(l)%k(m) )
    2446                     j = vmea(l)%j(m)
    2447                     i = vmea(l)%i(m)
    2448                     vmea(l)%measured_vars(m,n) = 0.5_wp * ( w(k-1,j,i) + w(k,j,i) ) * pt(k,j,i)
    2449                  ENDDO
     2452                 IF ( .NOT. neutral )  THEN
     2453                    DO  m = 1, vmea(l)%ns
     2454                       k = MAX ( 1, vmea(l)%k(m) )
     2455                       j = vmea(l)%j(m)
     2456                       i = vmea(l)%i(m)
     2457                       vmea(l)%measured_vars(m,n) = 0.5_wp * ( w(k-1,j,i) + w(k,j,i) ) * pt(k,j,i)
     2458                    ENDDO
     2459                 ENDIF
    24502460
    24512461              CASE ( 'uqv' )
     
    25552565
    25562566              CASE ( 'thetas' ) ! scaling parameter temperature
    2557                  DO  m = 1, vmea(l)%ns
    2558 !
    2559 !--                 Surface data is only available on inner subdomains, not on ghost points. Hence,
    2560 !-                  limit the indices.
    2561                     j = MERGE( vmea(l)%j(m), nys, vmea(l)%j(m) > nys )
    2562                     j = MERGE( j           , nyn, j            < nyn )
    2563                     i = MERGE( vmea(l)%i(m), nxl, vmea(l)%i(m) > nxl )
    2564                     i = MERGE( i           , nxr, i            < nxr )
    2565 
    2566                     DO  mm = surf_def_h(0)%start_index(j,i), surf_def_h(0)%end_index(j,i)
    2567                        vmea(l)%measured_vars(m,n) = surf_def_h(0)%ts(mm)
    2568                     ENDDO
    2569                     DO  mm = surf_lsm_h(0)%start_index(j,i), surf_lsm_h(0)%end_index(j,i)
    2570                        vmea(l)%measured_vars(m,n) = surf_lsm_h(0)%ts(mm)
    2571                     ENDDO
    2572                     DO  mm = surf_usm_h(0)%start_index(j,i), surf_usm_h(0)%end_index(j,i)
    2573                        vmea(l)%measured_vars(m,n) = surf_usm_h(0)%ts(mm)
    2574                     ENDDO
    2575                  ENDDO
     2567                 IF ( .NOT. neutral )  THEN
     2568                    DO  m = 1, vmea(l)%ns
     2569!
     2570!--                    Surface data is only available on inner subdomains, not on ghost points. Hence,
     2571!-                     limit the indices.
     2572                       j = MERGE( vmea(l)%j(m), nys, vmea(l)%j(m) > nys )
     2573                       j = MERGE( j           , nyn, j            < nyn )
     2574                       i = MERGE( vmea(l)%i(m), nxl, vmea(l)%i(m) > nxl )
     2575                       i = MERGE( i           , nxr, i            < nxr )
     2576
     2577                       DO  mm = surf_def_h(0)%start_index(j,i), surf_def_h(0)%end_index(j,i)
     2578                          vmea(l)%measured_vars(m,n) = surf_def_h(0)%ts(mm)
     2579                       ENDDO
     2580                       DO  mm = surf_lsm_h(0)%start_index(j,i), surf_lsm_h(0)%end_index(j,i)
     2581                          vmea(l)%measured_vars(m,n) = surf_lsm_h(0)%ts(mm)
     2582                       ENDDO
     2583                       DO  mm = surf_usm_h(0)%start_index(j,i), surf_usm_h(0)%end_index(j,i)
     2584                          vmea(l)%measured_vars(m,n) = surf_usm_h(0)%ts(mm)
     2585                       ENDDO
     2586                    ENDDO
     2587                 ENDIF
    25762588
    25772589              CASE ( 'hfls' ) ! surface latent heat flux
    2578                  DO  m = 1, vmea(l)%ns
    2579 !
    2580 !--                 Surface data is only available on inner subdomains, not on ghost points. Hence,
    2581 !--                 limit the indices.
    2582                     j = MERGE( vmea(l)%j(m), nys, vmea(l)%j(m) > nys )
    2583                     j = MERGE( j           , nyn, j            < nyn )
    2584                     i = MERGE( vmea(l)%i(m), nxl, vmea(l)%i(m) > nxl )
    2585                     i = MERGE( i           , nxr, i            < nxr )
    2586 
    2587                     DO  mm = surf_def_h(0)%start_index(j,i), surf_def_h(0)%end_index(j,i)
    2588                        vmea(l)%measured_vars(m,n) = surf_def_h(0)%qsws(mm)
    2589                     ENDDO
    2590                     DO  mm = surf_lsm_h(0)%start_index(j,i), surf_lsm_h(0)%end_index(j,i)
    2591                        vmea(l)%measured_vars(m,n) = surf_lsm_h(0)%qsws(mm)
    2592                     ENDDO
    2593                     DO  mm = surf_usm_h(0)%start_index(j,i), surf_usm_h(0)%end_index(j,i)
    2594                        vmea(l)%measured_vars(m,n) = surf_usm_h(0)%qsws(mm)
    2595                     ENDDO
    2596                  ENDDO
     2590                 IF ( humidity )  THEN
     2591                    DO  m = 1, vmea(l)%ns
     2592!
     2593!--                    Surface data is only available on inner subdomains, not on ghost points. Hence,
     2594!--                    limit the indices.
     2595                       j = MERGE( vmea(l)%j(m), nys, vmea(l)%j(m) > nys )
     2596                       j = MERGE( j           , nyn, j            < nyn )
     2597                       i = MERGE( vmea(l)%i(m), nxl, vmea(l)%i(m) > nxl )
     2598                       i = MERGE( i           , nxr, i            < nxr )
     2599
     2600                       DO  mm = surf_def_h(0)%start_index(j,i), surf_def_h(0)%end_index(j,i)
     2601                          vmea(l)%measured_vars(m,n) = surf_def_h(0)%qsws(mm)
     2602                       ENDDO
     2603                       DO  mm = surf_lsm_h(0)%start_index(j,i), surf_lsm_h(0)%end_index(j,i)
     2604                          vmea(l)%measured_vars(m,n) = surf_lsm_h(0)%qsws(mm)
     2605                       ENDDO
     2606                       DO  mm = surf_usm_h(0)%start_index(j,i), surf_usm_h(0)%end_index(j,i)
     2607                          vmea(l)%measured_vars(m,n) = surf_usm_h(0)%qsws(mm)
     2608                       ENDDO
     2609                    ENDDO
     2610                 ENDIF
    25972611
    25982612              CASE ( 'hfss' ) ! surface sensible heat flux
    2599                  DO  m = 1, vmea(l)%ns
    2600 !
    2601 !--                 Surface data is only available on inner subdomains, not on ghost points. Hence,
    2602 !--                 limit the indices.
    2603                     j = MERGE( vmea(l)%j(m), nys, vmea(l)%j(m) > nys )
    2604                     j = MERGE( j           , nyn, j            < nyn )
    2605                     i = MERGE( vmea(l)%i(m), nxl, vmea(l)%i(m) > nxl )
    2606                     i = MERGE( i           , nxr, i            < nxr )
    2607 
    2608                     DO  mm = surf_def_h(0)%start_index(j,i), surf_def_h(0)%end_index(j,i)
    2609                        vmea(l)%measured_vars(m,n) = surf_def_h(0)%shf(mm)
    2610                     ENDDO
    2611                     DO  mm = surf_lsm_h(0)%start_index(j,i), surf_lsm_h(0)%end_index(j,i)
    2612                        vmea(l)%measured_vars(m,n) = surf_lsm_h(0)%shf(mm)
    2613                     ENDDO
    2614                     DO  mm = surf_usm_h(0)%start_index(j,i), surf_usm_h(0)%end_index(j,i)
    2615                        vmea(l)%measured_vars(m,n) = surf_usm_h(0)%shf(mm)
    2616                     ENDDO
    2617                  ENDDO
     2613                 IF ( .NOT. neutral )  THEN
     2614                    DO  m = 1, vmea(l)%ns
     2615!
     2616!--                    Surface data is only available on inner subdomains, not on ghost points. Hence,
     2617!--                    limit the indices.
     2618                       j = MERGE( vmea(l)%j(m), nys, vmea(l)%j(m) > nys )
     2619                       j = MERGE( j           , nyn, j            < nyn )
     2620                       i = MERGE( vmea(l)%i(m), nxl, vmea(l)%i(m) > nxl )
     2621                       i = MERGE( i           , nxr, i            < nxr )
     2622
     2623                       DO  mm = surf_def_h(0)%start_index(j,i), surf_def_h(0)%end_index(j,i)
     2624                          vmea(l)%measured_vars(m,n) = surf_def_h(0)%shf(mm)
     2625                       ENDDO
     2626                       DO  mm = surf_lsm_h(0)%start_index(j,i), surf_lsm_h(0)%end_index(j,i)
     2627                          vmea(l)%measured_vars(m,n) = surf_lsm_h(0)%shf(mm)
     2628                       ENDDO
     2629                       DO  mm = surf_usm_h(0)%start_index(j,i), surf_usm_h(0)%end_index(j,i)
     2630                          vmea(l)%measured_vars(m,n) = surf_usm_h(0)%shf(mm)
     2631                       ENDDO
     2632                    ENDDO
     2633                 ENDIF
    26182634
    26192635              CASE ( 'hfdg' ) ! ground heat flux
    2620                  DO  m = 1, vmea(l)%ns
    2621 !
    2622 !--                 Surface data is only available on inner subdomains, not on ghost points. Hence,
    2623 !--                 limit the indices.
    2624                     j = MERGE( vmea(l)%j(m), nys, vmea(l)%j(m) > nys )
    2625                     j = MERGE( j           , nyn, j            < nyn )
    2626                     i = MERGE( vmea(l)%i(m), nxl, vmea(l)%i(m) > nxl )
    2627                     i = MERGE( i           , nxr, i            < nxr )
    2628 
    2629                     DO  mm = surf_lsm_h(0)%start_index(j,i), surf_lsm_h(0)%end_index(j,i)
    2630                        vmea(l)%measured_vars(m,n) = surf_lsm_h(0)%ghf(mm)
    2631                     ENDDO
    2632                  ENDDO
     2636                 IF ( land_surface )  THEN
     2637                    DO  m = 1, vmea(l)%ns
     2638!
     2639!--                    Surface data is only available on inner subdomains, not on ghost points. Hence,
     2640!--                    limit the indices.
     2641                       j = MERGE( vmea(l)%j(m), nys, vmea(l)%j(m) > nys )
     2642                       j = MERGE( j           , nyn, j            < nyn )
     2643                       i = MERGE( vmea(l)%i(m), nxl, vmea(l)%i(m) > nxl )
     2644                       i = MERGE( i           , nxr, i            < nxr )
     2645
     2646                       DO  mm = surf_lsm_h(0)%start_index(j,i), surf_lsm_h(0)%end_index(j,i)
     2647                          vmea(l)%measured_vars(m,n) = surf_lsm_h(0)%ghf(mm)
     2648                       ENDDO
     2649                    ENDDO
     2650                 ENDIF
    26332651
    26342652              CASE ( 'rnds' ) ! surface net radiation
     
    28472865
    28482866              CASE ( 'm_soil', 'lwcs' ) ! soil moisture
    2849                  DO  m = 1, vmea(l)%ns_soil
    2850                     j = MERGE( vmea(l)%j_soil(m), nys, vmea(l)%j_soil(m) > nys )
    2851                     j = MERGE( j                , nyn, j                 < nyn )
    2852                     i = MERGE( vmea(l)%i_soil(m), nxl, vmea(l)%i_soil(m) > nxl )
    2853                     i = MERGE( i                , nxr, i                 < nxr )
    2854                     k = vmea(l)%k_soil(m)
    2855 
    2856                     match_lsm = surf_lsm_h(0)%start_index(j,i) <= surf_lsm_h(0)%end_index(j,i)
    2857 
    2858                     IF ( match_lsm )  THEN
    2859                        mm = surf_lsm_h(0)%start_index(j,i)
    2860                        vmea(l)%measured_vars_soil(m,n) = m_soil_h(0)%var_2d(k,mm)
    2861                     ENDIF
    2862 
    2863                  ENDDO
     2867                 IF ( land_surface )  THEN
     2868                    DO  m = 1, vmea(l)%ns_soil
     2869                       j = MERGE( vmea(l)%j_soil(m), nys, vmea(l)%j_soil(m) > nys )
     2870                       j = MERGE( j                , nyn, j                 < nyn )
     2871                       i = MERGE( vmea(l)%i_soil(m), nxl, vmea(l)%i_soil(m) > nxl )
     2872                       i = MERGE( i                , nxr, i                 < nxr )
     2873                       k = vmea(l)%k_soil(m)
     2874
     2875                       match_lsm = surf_lsm_h(0)%start_index(j,i) <= surf_lsm_h(0)%end_index(j,i)
     2876
     2877                       IF ( match_lsm )  THEN
     2878                          mm = surf_lsm_h(0)%start_index(j,i)
     2879                          vmea(l)%measured_vars_soil(m,n) = m_soil_h(0)%var_2d(k,mm)
     2880                       ENDIF
     2881
     2882                    ENDDO
     2883                 ENDIF
    28642884
    28652885              CASE ( 'ts', 'tb' ) ! surface temperature and brighness temperature
     
    28992919
    29002920              CASE ( 't_lw' ) ! water temperature
    2901                  DO  m = 1, vmea(l)%ns
    2902 !
    2903 !--                 Surface data is only available on inner subdomains, not
    2904 !--                 on ghost points. Hence, limit the indices.
    2905                     j = MERGE( vmea(l)%j(m), nys, vmea(l)%j(m) > nys )
    2906                     j = MERGE( j           , nyn, j            < nyn )
    2907                     i = MERGE( vmea(l)%i(m), nxl, vmea(l)%i(m) > nxl )
    2908                     i = MERGE( i           , nxr, i            < nxr )
    2909 
    2910                     DO  mm = surf_lsm_h(0)%start_index(j,i), surf_lsm_h(0)%end_index(j,i)
    2911                        IF ( surf_lsm_h(0)%water_surface(m) )                                          &
    2912                             vmea(l)%measured_vars(m,n) = t_soil_h(0)%var_2d(nzt,m)
    2913                     ENDDO
    2914 
    2915                  ENDDO
     2921                 IF ( land_surface )  THEN
     2922                    DO  m = 1, vmea(l)%ns
     2923!
     2924!--                    Surface data is only available on inner subdomains, not
     2925!--                    on ghost points. Hence, limit the indices.
     2926                       j = MERGE( vmea(l)%j(m), nys, vmea(l)%j(m) > nys )
     2927                       j = MERGE( j           , nyn, j            < nyn )
     2928                       i = MERGE( vmea(l)%i(m), nxl, vmea(l)%i(m) > nxl )
     2929                       i = MERGE( i           , nxr, i            < nxr )
     2930
     2931                       DO  mm = surf_lsm_h(0)%start_index(j,i), surf_lsm_h(0)%end_index(j,i)
     2932                          IF ( surf_lsm_h(0)%water_surface(m) )                                          &
     2933                               vmea(l)%measured_vars(m,n) = t_soil_h(0)%var_2d(nzt,m)
     2934                       ENDDO
     2935
     2936                    ENDDO
     2937                 ENDIF
    29162938!
    29172939!--           No match found - just set a fill value
Note: See TracChangeset for help on using the changeset viewer.