Changeset 1380


Ignore:
Timestamp:
Apr 28, 2014 12:40:45 PM (10 years ago)
Author:
heinze
Message:

Upper boundary conditions for pt and q in case of nudging adjusted

Location:
palm/trunk/SOURCE
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • palm/trunk/SOURCE/Makefile

    r1375 r1380  
    2020# Current revisions:
    2121# ------------------
    22 #
    23 #
     22# bugfix: mod_particle_attributes  added to check_open
     23# nudging added to time_integration
     24#
    2425# Former revisions:
    2526# -----------------
     
    2829# 1374 2014-04-25 12:55:07Z raasch
    2930# bugfix: missing dependency added for check_open
    30 # 
     31#
    3132# 1365 2014-04-22 15:03:56Z boeske
    3233# Added new module calc_mean_profile, previously in module buoyancy,
     
    393394time_integration.o: modules.o advec_ws.o buoyancy.o calc_mean_profile.o \
    394395        cpulog.o interaction_droplets_ptq.o ls_forcing.o mod_kinds.o \
    395         production_e.o prognostic_equations.o user_actions.o
     396        nudging.o production_e.o prognostic_equations.o user_actions.o
    396397time_to_string.o: mod_kinds.o
    397398timestep.o: modules.o cpulog.o mod_kinds.o
  • palm/trunk/SOURCE/boundary_conds.f90

    r1362 r1380  
    2020! Current revisions:
    2121! -----------------
    22 !
     22! Adjust Dirichlet-condition at the top for pt in case of nudging
    2323!
    2424! Former revisions:
     
    101101               u, ug, u_init, u_m_l, u_m_n, u_m_r, u_m_s, u_p,                 &
    102102               v, vg, v_init, v_m_l, v_m_n, v_m_r, v_m_s, v_p,                 &
    103                w, w_p, w_m_l, w_m_n, w_m_r, w_m_s
     103               w, w_p, w_m_l, w_m_n, w_m_r, w_m_s,&
     104               pt_init
    104105
    105106    USE control_parameters,                                                    &
     
    110111               intermediate_timestep_count, large_scale_forcing, ocean,        &
    111112               outflow_l, outflow_n, outflow_r, outflow_s, passive_scalar,     &
    112                precipitation, tsc, use_cmax
     113               precipitation, tsc, use_cmax, &
     114               nudging
    113115
    114116    USE grid_variables,                                                        &
     
    203205       !$acc kernels present( pt, pt_p )
    204206        pt_p(nzt+1,:,:) = pt(nzt+1,:,:)
     207!
     208!--     In case of nudging adjust top boundary to pt which is
     209!--     read in from NUDGING-DATA
     210        IF ( nudging )  THEN
     211           pt_p(nzt+1,:,:) = pt_init(nzt+1)
     212        ENDIF
    205213       !$acc end kernels
    206214    ELSEIF ( ibc_pt_t == 1 )  THEN
  • palm/trunk/SOURCE/nudging.f90

    r1366 r1380  
    2020! Current revisions:
    2121! ------------------
    22 !
     22! Subroutine nudge_ref added to account for proper upper scalar boundary
     23! conditions in case of nudging
    2324!
    2425! Former revisions:
     
    7273
    7374    PRIVATE
    74     PUBLIC init_nudge, calc_tnudge, nudge 
     75    PUBLIC init_nudge, calc_tnudge, nudge, nudge_ref
    7576    SAVE
    7677
     
    515516    END SUBROUTINE nudge_ij
    516517
     518
     519    SUBROUTINE nudge_ref ( time )
     520
     521       USE arrays_3d,                                                          &
     522           ONLY:  time_vert, ptnudge, pt_init, qnudge, q_init
     523
     524       USE kinds
     525
     526
     527       IMPLICIT NONE
     528
     529       INTEGER(iwp) ::  nt                    !:
     530
     531       REAL(wp)             ::  fac           !:
     532       REAL(wp), INTENT(in) ::  time          !:
     533
     534!
     535!--    Interpolation in time of NUDGING_DATA for pt_init and q_init. This is
     536!--    needed for correct upper boundary conditions for pt and q and in case that
     537!      large scale subsidence as well as scalar Rayleigh-damping are used
     538       nt = 1
     539       DO WHILE ( time > time_vert(nt) )
     540          nt = nt + 1
     541       ENDDO
     542       IF ( time /= time_vert(nt) )  THEN
     543        nt = nt - 1
     544       ENDIF
     545
     546       fac = ( time-time_vert(nt) ) / ( time_vert(nt+1)-time_vert(nt) )
     547
     548       pt_init = ptnudge(:,nt) + fac * ( ptnudge(:,nt+1) - ptnudge(:,nt) )
     549       q_init  = qnudge(:,nt) + fac * ( qnudge(:,nt+1) - qnudge(:,nt) )
     550
     551    END SUBROUTINE nudge_ref
     552
     553
    517554 END MODULE nudge_mod
  • palm/trunk/SOURCE/prognostic_equations.f90

    r1375 r1380  
    2020! Current revisions:
    2121! ------------------
    22 !
     22! Change order of calls for scalar prognostic quantities:
     23! ls_advec -> nudging -> subsidence since initial profiles
    2324!
    2425! Former revisions:
     
    559560
    560561!
     562!--          Nudging
     563             IF ( nudging )  CALL nudge( i, j, simulated_time, 'pt' )
     564
     565!
    561566!--          If required, compute effect of large-scale subsidence/ascent
    562567             IF ( large_scale_subsidence  .AND.                                &
     
    564569                CALL subsidence( i, j, tend, pt, pt_init, 2 )
    565570             ENDIF
    566 
    567 !
    568 !--          Nudging
    569              IF ( nudging )  CALL nudge( i, j, simulated_time, 'pt' )
    570571
    571572             CALL user_actions( i, j, 'pt-tendency' )
     
    691692
    692693!
     694!--          Nudging
     695             IF ( nudging )  CALL nudge( i, j, simulated_time, 'q' )
     696
     697!
    693698!--          If required compute influence of large-scale subsidence/ascent
    694699             IF ( large_scale_subsidence  .AND.                                &
     
    696701                CALL subsidence( i, j, tend, q, q_init, 3 )
    697702             ENDIF
    698 
    699 !
    700 !--          Nudging
    701              IF ( nudging )  CALL nudge( i, j, simulated_time, 'q' )
    702703
    703704             CALL user_actions( i, j, 'q-tendency' )
     
    12131214
    12141215!
     1216!--    Nudging
     1217       IF ( nudging )  CALL nudge( simulated_time, 'pt' )
     1218
     1219!
    12151220!--    If required compute influence of large-scale subsidence/ascent
    12161221       IF ( large_scale_subsidence  .AND.                                      &
     
    12181223          CALL subsidence( tend, pt, pt_init, 2 )
    12191224       ENDIF
    1220 
    1221 !
    1222 !--    Nudging
    1223        IF ( nudging )  CALL nudge( simulated_time, 'pt' )
    12241225
    12251226       CALL user_actions( 'pt-tendency' )
     
    14101411
    14111412!
     1413!--    Nudging
     1414       IF ( nudging )  CALL nudge( simulated_time, 'q' )
     1415
     1416!
    14121417!--    If required compute influence of large-scale subsidence/ascent
    14131418       IF ( large_scale_subsidence  .AND.                                      &
     
    14151420         CALL subsidence( tend, q, q_init, 3 )
    14161421       ENDIF
    1417 
    1418 !
    1419 !--    Nudging
    1420        IF ( nudging )  CALL nudge( simulated_time, 'q' )
    14211422
    14221423       CALL user_actions( 'q-tendency' )
     
    20282029
    20292030!
     2031!--    Nudging
     2032       IF ( nudging )  CALL nudge( simulated_time, 'pt' )
     2033
     2034!
    20302035!--    If required compute influence of large-scale subsidence/ascent
    20312036       IF ( large_scale_subsidence  .AND.                                      &
     
    20332038          CALL subsidence( tend, pt, pt_init, 2 )
    20342039       ENDIF
    2035 
    2036 !
    2037 !--    Nudging
    2038        IF ( nudging )  CALL nudge( simulated_time, 'pt' )
    20392040
    20402041       CALL user_actions( 'pt-tendency' )
     
    21992200
    22002201!
     2202!--    Nudging
     2203       IF ( nudging )  CALL nudge( simulated_time, 'q' )
     2204
     2205!
    22012206!--    If required compute influence of large-scale subsidence/ascent
    22022207       IF ( large_scale_subsidence  .AND.                                      &
     
    22042209         CALL subsidence( tend, q, q_init, 3 )
    22052210       ENDIF
    2206 
    2207 !
    2208 !--    Nudging
    2209        IF ( nudging )  CALL nudge( simulated_time, 'q' )
    22102211
    22112212       CALL user_actions( 'q-tendency' )
  • palm/trunk/SOURCE/subsidence.f90

    r1366 r1380  
    2020! Current revisions:
    2121! -----------------
    22 !
     22! Shifting only necessary in case of scalar Rayleigh damping
    2323!
    2424! Former revisions:
     
    150150
    151151       USE control_parameters,                                                 &
    152            ONLY:  dt_3d, intermediate_timestep_count, large_scale_forcing
     152           ONLY:  dt_3d, intermediate_timestep_count, large_scale_forcing,     &
     153                  scalar_rayleigh_damping
    153154
    154155       USE indices,                                                            &
     
    204205!--    Shifting of the initial profile is especially necessary with Rayleigh
    205206!--    damping switched on
    206 
    207        DO  k = nzb, nzt
    208           IF ( w_subs(k) < 0.0_wp )  THEN      ! large-scale subsidence
    209              var_mod(k) = var_init(k) - dt_3d * w_subs(k) *  &
    210                                ( var_init(k+1) - var_init(k) ) * ddzu(k+1)
    211           ENDIF
    212        ENDDO
    213 !
    214 !--   At the upper boundary, the initial profile is shifted with aid of
    215 !--   the gradient tmp_grad. (This is ok if the gradients are linear.)
    216       IF ( w_subs(nzt) < 0.0_wp )  THEN
    217          tmp_grad = ( var_init(nzt+1) - var_init(nzt) ) * ddzu(nzt+1)
    218          var_mod(nzt+1) = var_init(nzt+1) -  &
    219                               dt_3d * w_subs(nzt+1) * tmp_grad
     207       IF ( scalar_rayleigh_damping ) THEN
     208          DO  k = nzb, nzt
     209             IF ( w_subs(k) < 0.0_wp )  THEN      ! large-scale subsidence
     210                var_mod(k) = var_init(k) - dt_3d * w_subs(k) *  &
     211                                  ( var_init(k+1) - var_init(k) ) * ddzu(k+1)
     212             ENDIF
     213          ENDDO
     214!
     215!--      At the upper boundary, the initial profile is shifted with aid of
     216!--      the gradient tmp_grad. (This is ok if the gradients are linear.)
     217         IF ( w_subs(nzt) < 0.0_wp )  THEN
     218            tmp_grad = ( var_init(nzt+1) - var_init(nzt) ) * ddzu(nzt+1)
     219            var_mod(nzt+1) = var_init(nzt+1) -  &
     220                                 dt_3d * w_subs(nzt+1) * tmp_grad
     221         ENDIF
     222       
     223
     224         DO  k = nzt+1, nzb+1, -1
     225            IF ( w_subs(k) >= 0.0_wp )  THEN  ! large-scale ascent
     226               var_mod(k) = var_init(k) - dt_3d * w_subs(k) *  &
     227                                  ( var_init(k) - var_init(k-1) ) * ddzu(k)
     228            ENDIF
     229         ENDDO
     230!
     231!--      At the lower boundary shifting is not necessary because the
     232!--      subsidence velocity w_subs(nzb) vanishes.
     233         IF ( w_subs(nzb+1) >= 0.0_wp )  THEN
     234            var_mod(nzb) = var_init(nzb)
     235         ENDIF
     236
     237         var_init = var_mod
    220238      ENDIF
    221        
    222 
    223       DO  k = nzt+1, nzb+1, -1
    224          IF ( w_subs(k) >= 0.0_wp )  THEN  ! large-scale ascent
    225             var_mod(k) = var_init(k) - dt_3d * w_subs(k) *  &
    226                                ( var_init(k) - var_init(k-1) ) * ddzu(k)
    227          ENDIF
    228       ENDDO
    229 !
    230 !--   At the lower boundary shifting is not necessary because the
    231 !--   subsidence velocity w_subs(nzb) vanishes.
    232       IF ( w_subs(nzb+1) >= 0.0_wp )  THEN
    233          var_mod(nzb) = var_init(nzb)
    234       ENDIF
    235 
    236       var_init = var_mod
    237239
    238240
     
    245247
    246248       USE control_parameters,                                                 &
    247            ONLY:  dt_3d, intermediate_timestep_count, large_scale_forcing
     249           ONLY:  dt_3d, intermediate_timestep_count, large_scale_forcing,     &
     250                  scalar_rayleigh_damping
    248251
    249252       USE indices,                                                            &
     
    293296!--    Shifting of the initial profile is especially necessary with Rayleigh
    294297!--    damping switched on
    295        IF ( i == nxl .AND. j == nys )  THEN ! shifting only once per PE
    296 
    297           DO  k = nzb, nzt
    298              IF ( w_subs(k) < 0.0_wp )  THEN      ! large-scale subsidence
    299                 var_mod(k) = var_init(k) - dt_3d * w_subs(k) *  &
    300                                   ( var_init(k+1) - var_init(k) ) * ddzu(k+1)
     298       IF ( scalar_rayleigh_damping ) THEN
     299          IF ( i == nxl .AND. j == nys )  THEN ! shifting only once per PE
     300
     301             DO  k = nzb, nzt
     302                IF ( w_subs(k) < 0.0_wp )  THEN      ! large-scale subsidence
     303                   var_mod(k) = var_init(k) - dt_3d * w_subs(k) *  &
     304                                     ( var_init(k+1) - var_init(k) ) * ddzu(k+1)
     305                ENDIF
     306             ENDDO
     307!
     308!--          At the upper boundary, the initial profile is shifted with aid of
     309!--          the gradient tmp_grad. (This is ok if the gradients are linear.)
     310             IF ( w_subs(nzt) < 0.0_wp )  THEN
     311                tmp_grad = ( var_init(nzt+1) - var_init(nzt) ) * ddzu(nzt+1)
     312                var_mod(nzt+1) = var_init(nzt+1) -  &
     313                                     dt_3d * w_subs(nzt+1) * tmp_grad
    301314             ENDIF
    302           ENDDO
    303 !
    304 !--       At the upper boundary, the initial profile is shifted with aid of
    305 !--       the gradient tmp_grad. (This is ok if the gradients are linear.)
    306           IF ( w_subs(nzt) < 0.0_wp )  THEN
    307              tmp_grad = ( var_init(nzt+1) - var_init(nzt) ) * ddzu(nzt+1)
    308              var_mod(nzt+1) = var_init(nzt+1) -  &
    309                                   dt_3d * w_subs(nzt+1) * tmp_grad
     315       
     316
     317             DO  k = nzt+1, nzb+1, -1
     318                IF ( w_subs(k) >= 0.0_wp )  THEN  ! large-scale ascent
     319                   var_mod(k) = var_init(k) - dt_3d * w_subs(k) *  &
     320                                      ( var_init(k) - var_init(k-1) ) * ddzu(k)
     321                ENDIF
     322             ENDDO
     323!
     324!--          At the lower boundary shifting is not necessary because the
     325!--          subsidence velocity w_subs(nzb) vanishes.
     326             IF ( w_subs(nzb+1) >= 0.0_wp )  THEN
     327                var_mod(nzb) = var_init(nzb)
     328             ENDIF
     329
     330             var_init = var_mod
     331
    310332          ENDIF
    311        
    312 
    313           DO  k = nzt+1, nzb+1, -1
    314              IF ( w_subs(k) >= 0.0_wp )  THEN  ! large-scale ascent
    315                 var_mod(k) = var_init(k) - dt_3d * w_subs(k) *  &
    316                                    ( var_init(k) - var_init(k-1) ) * ddzu(k)
    317              ENDIF
    318           ENDDO
    319 !
    320 !--       At the lower boundary shifting is not necessary because the
    321 !--       subsidence velocity w_subs(nzb) vanishes.
    322           IF ( w_subs(nzb+1) >= 0.0_wp )  THEN
    323              var_mod(nzb) = var_init(nzb)
    324           ENDIF
    325 
    326           var_init = var_mod
    327 
    328333       ENDIF
    329334
  • palm/trunk/SOURCE/time_integration.f90

    r1366 r1380  
    2020! Current revisions:
    2121! ------------------
    22 !
     22! CALL of nudge_ref added
     23! bc_pt_t_val and bc_q_t_val are updated in case nudging is used
    2324!
    2425! Former revisions:
     
    131132
    132133    USE arrays_3d,                                                             &
    133         ONLY:  diss, e_p, nr_p, prho, pt, pt_p, q, ql, ql_c, ql_v, ql_vp, qr_p,&
    134                q_p, ref_state, rho, sa_p, tend, u, u_p, v, vpt, v_p, w_p
     134        ONLY:  diss, dzu, e_p, nr_p, prho, pt, pt_p, pt_init, q_init, q, ql,   &
     135               ql_c, ql_v, ql_vp, qr_p, q_p, ref_state, rho, sa_p, tend, u,    &
     136               u_p, v, vpt, v_p, w_p
    135137
    136138    USE calc_mean_profile_mod,                                                 &
     
    140142        ONLY:  advected_distance_x, advected_distance_y, average_count_3d,     &
    141143               average_count_sp, averaging_interval, averaging_interval_pr,    &
    142                averaging_interval_sp, bc_lr_cyc, bc_ns_cyc,                    &
    143                call_psolver_at_all_substeps, cloud_droplets, cloud_physics,    &
    144                constant_heatflux, create_disturbances, dopr_n,                 &
     144               averaging_interval_sp, bc_lr_cyc, bc_ns_cyc, bc_pt_t_val,       &
     145               bc_q_t_val, call_psolver_at_all_substeps, cloud_droplets,       &
     146               cloud_physics, constant_heatflux, create_disturbances, dopr_n,  &
    145147               constant_diffusion, coupling_mode, coupling_start_time,         &
    146148               current_timestep_number, disturbance_created,                   &
     
    176178    USE indices,                                                               &
    177179        ONLY:  i_left, i_right, j_north, j_south, nbgp, nx, nxl, nxlg, nxr,    &
    178                nxrg, nyn, nys, nzb, nzb_u_inner, nzb_v_inner
     180               nxrg, nyn, nys, nzb, nzt, nzb_u_inner, nzb_v_inner
    179181
    180182    USE interaction_droplets_ptq_mod,                                          &
     
    187189
    188190    USE nudge_mod,                                                             &
    189         ONLY:  calc_tnudge
     191        ONLY:  calc_tnudge, nudge_ref
    190192
    191193    USE particle_attributes,                                                   &
     
    267269
    268270!
     271!--    Set pt_init and q_init to the current profiles taken from
     272!--    NUDGING_DATA
     273       IF ( nudging )  THEN
     274           CALL nudge_ref ( simulated_time )
     275!
     276!--        Store temperature gradient at the top boundary for possible Neumann
     277!--        boundary condition
     278           bc_pt_t_val = ( pt_init(nzt+1) - pt_init(nzt) ) / dzu(nzt+1)
     279           bc_q_t_val  = ( q_init(nzt+1) - q_init(nzt) ) / dzu(nzt+1)
     280       ENDIF
     281
     282!
    269283!--    Execute the user-defined actions
    270284       CALL user_actions( 'before_timestep' )
     
    312326!
    313327!--       In case of nudging calculate current nudging time scale and horizontal
    314 !--       means of u,v,pt and q
     328!--       means of u, v, pt and q
    315329          IF ( nudging )  THEN
    316330             CALL calc_tnudge( simulated_time )
Note: See TracChangeset for help on using the changeset viewer.