Ignore:
Timestamp:
Sep 13, 2012 2:08:46 PM (12 years ago)
Author:
raasch
Message:

leapfrog timestep scheme and upstream-spline advection scheme completely removed from the code,
reading of dt_fixed from restart file removed

File:
1 edited

Legend:

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

    r997 r1001  
    44! Current revisions:
    55! -----------------
    6 !
     6! all actions concerning leapfrog scheme removed
    77!
    88! Former revisions:
     
    6868!
    6969!-- Allocate required 1D-arrays
    70     ALLOCATE( e1d(nzb:nzt+1),    e1d_m(nzb:nzt+1),   e1d_p(nzb:nzt+1), &
    71               kh1d(nzb:nzt+1),   kh1d_m(nzb:nzt+1),  km1d(nzb:nzt+1),  &
    72               km1d_m(nzb:nzt+1), l_black(nzb:nzt+1), l1d(nzb:nzt+1),   &
    73               l1d_m(nzb:nzt+1),  rif1d(nzb:nzt+1),   te_e(nzb:nzt+1),  &
     70    ALLOCATE( e1d(nzb:nzt+1),    e1d_p(nzb:nzt+1), &
     71              kh1d(nzb:nzt+1),   km1d(nzb:nzt+1),  &
     72              l_black(nzb:nzt+1), l1d(nzb:nzt+1),   &
     73              rif1d(nzb:nzt+1),   te_e(nzb:nzt+1),  &
    7474              te_em(nzb:nzt+1),  te_u(nzb:nzt+1),    te_um(nzb:nzt+1), &
    7575              te_v(nzb:nzt+1),   te_vm(nzb:nzt+1),    u1d(nzb:nzt+1),   &
    76               u1d_m(nzb:nzt+1),  u1d_p(nzb:nzt+1),   v1d(nzb:nzt+1),   &
    77               v1d_m(nzb:nzt+1),  v1d_p(nzb:nzt+1) )
     76              u1d_p(nzb:nzt+1),  v1d(nzb:nzt+1),   &
     77              v1d_p(nzb:nzt+1) )
    7878
    7979!
    8080!-- Initialize arrays
    8181    IF ( constant_diffusion )  THEN
    82        km1d   = km_constant
    83        km1d_m = km_constant
    84        kh1d   = km_constant / prandtl_number
    85        kh1d_m = km_constant / prandtl_number
     82       km1d = km_constant
     83       kh1d = km_constant / prandtl_number
    8684    ELSE
    87        e1d = 0.0; e1d_m = 0.0; e1d_p = 0.0
    88        kh1d = 0.0; kh1d_m = 0.0; km1d = 0.0; km1d_m = 0.0
     85       e1d = 0.0; e1d_p = 0.0
     86       kh1d = 0.0; km1d = 0.0
    8987       rif1d = 0.0
    9088!
     
    123121    ENDIF
    124122    l1d   = l_black
    125     l1d_m = l_black
    126123    u1d   = u_init
    127     u1d_m = u_init
    128124    u1d_p = u_init
    129125    v1d   = v_init
    130     v1d_m = v_init
    131126    v1d_p = v_init
    132127
     
    136131!-- in the initial phase of a run (at k=1, dz/2 occurs in the limiting formula!)
    137132    u1d(0:1)   = 0.1
    138     u1d_m(0:1) = 0.1
    139133    u1d_p(0:1) = 0.1
    140134    v1d(0:1)   = 0.1
    141     v1d_m(0:1) = 0.1
    142135    v1d_p(0:1) = 0.1
    143136
     
    152145    ENDIF
    153146    ts1d = 0.0
    154     usws1d = 0.0; usws1d_m = 0.0
    155     vsws1d = 0.0; vsws1d_m = 0.0
     147    usws1d = 0.0
     148    vsws1d = 0.0
    156149    z01d  = roughness_length
    157150    z0h1d = z0h_factor * z01d
     
    226219          DO  k = nzb_diff, nzt
    227220
    228              kmzm = 0.5 * ( km1d_m(k-1) + km1d_m(k) )
    229              kmzp = 0.5 * ( km1d_m(k) + km1d_m(k+1) )
     221             kmzm = 0.5 * ( km1d(k-1) + km1d(k) )
     222             kmzp = 0.5 * ( km1d(k) + km1d(k+1) )
    230223!
    231224!--          u-component
    232225             te_u(k) =  f * ( v1d(k) - vg(k) ) + ( &
    233                               kmzp * ( u1d_m(k+1) - u1d_m(k) ) * ddzu(k+1) &
    234                             - kmzm * ( u1d_m(k) - u1d_m(k-1) ) * ddzu(k)   &
    235                                               ) * ddzw(k)
     226                              kmzp * ( u1d(k+1) - u1d(k) ) * ddzu(k+1) &
     227                            - kmzm * ( u1d(k) - u1d(k-1) ) * ddzu(k)   &
     228                                                 ) * ddzw(k)
    236229!
    237230!--          v-component
    238              te_v(k) = -f * ( u1d(k) - ug(k) ) + ( &
    239                               kmzp * ( v1d_m(k+1) - v1d_m(k) ) * ddzu(k+1) &
    240                             - kmzm * ( v1d_m(k) - v1d_m(k-1) ) * ddzu(k)   &
    241                                               ) * ddzw(k)
     231             te_v(k) = -f * ( u1d(k) - ug(k) ) + (                     &
     232                              kmzp * ( v1d(k+1) - v1d(k) ) * ddzu(k+1) &
     233                            - kmzm * ( v1d(k) - v1d(k-1) ) * ddzu(k)   &
     234                                                 ) * ddzw(k)
    242235          ENDDO
    243236          IF ( .NOT. constant_diffusion )  THEN
     
    245238!
    246239!--             TKE
    247                 kmzm = 0.5 * ( km1d_m(k-1) + km1d_m(k) )
    248                 kmzp = 0.5 * ( km1d_m(k) + km1d_m(k+1) )
     240                kmzm = 0.5 * ( km1d(k-1) + km1d(k) )
     241                kmzp = 0.5 * ( km1d(k) + km1d(k+1) )
    249242                IF ( .NOT. humidity )  THEN
    250243                   pt_0 = pt_init(k)
     
    260253!
    261254!--                According to Detering, c_e=0.064
    262                    dissipation = 0.064 * e1d_m(k) * SQRT( e1d_m(k) ) / l1d_m(k)
     255                   dissipation = 0.064 * e1d(k) * SQRT( e1d(k) ) / l1d(k)
    263256                ELSEIF ( dissipation_1d == 'as_in_3d_model' )  THEN
    264                    dissipation = ( 0.19 + 0.74 * l1d_m(k) / l_grid(k) ) &
    265                                  * e1d_m(k) * SQRT( e1d_m(k) ) / l1d_m(k)
     257                   dissipation = ( 0.19 + 0.74 * l1d(k) / l_grid(k) ) &
     258                                 * e1d(k) * SQRT( e1d(k) ) / l1d(k)
    266259                ENDIF
    267260
     
    271264                                    - g / pt_0 * kh1d(k) * flux                &
    272265                                    +            (                             &
    273                                  kmzp * ( e1d_m(k+1) - e1d_m(k) ) * ddzu(k+1)  &
    274                                - kmzm * ( e1d_m(k) - e1d_m(k-1) ) * ddzu(k)    &
     266                                     kmzp * ( e1d(k+1) - e1d(k) ) * ddzu(k+1)  &
     267                                   - kmzm * ( e1d(k) - e1d(k-1) ) * ddzu(k)    &
    275268                                                 ) * ddzw(k)                   &
    276                                - dissipation
     269                                   - dissipation
    277270             ENDDO
    278271          ENDIF
     
    285278
    286279             k = nzb+1
    287              kmzm = 0.5 * ( km1d_m(k-1) + km1d_m(k) )
    288              kmzp = 0.5 * ( km1d_m(k) + km1d_m(k+1) )
     280             kmzm = 0.5 * ( km1d(k-1) + km1d(k) )
     281             kmzp = 0.5 * ( km1d(k) + km1d(k+1) )
    289282             IF ( .NOT. humidity )  THEN
    290283                pt_0 = pt_init(k)
     
    300293!
    301294!--             According to Detering, c_e=0.064
    302                 dissipation = 0.064 * e1d_m(k) * SQRT( e1d_m(k) ) / l1d_m(k)
     295                dissipation = 0.064 * e1d(k) * SQRT( e1d(k) ) / l1d(k)
    303296             ELSEIF ( dissipation_1d == 'as_in_3d_model' )  THEN
    304                 dissipation = ( 0.19 + 0.74 * l1d_m(k) / l_grid(k) ) &
    305                               * e1d_m(k) * SQRT( e1d_m(k) ) / l1d_m(k)
     297                dissipation = ( 0.19 + 0.74 * l1d(k) / l_grid(k) ) &
     298                              * e1d(k) * SQRT( e1d(k) ) / l1d(k)
    306299             ENDIF
    307300
    308301!
    309302!--          u-component
    310              te_u(k) = f * ( v1d(k) - vg(k) ) + ( &
    311                        kmzp * ( u1d_m(k+1) - u1d_m(k) ) * ddzu(k+1) + usws1d_m &
    312                                                ) * 2.0 * ddzw(k)
     303             te_u(k) = f * ( v1d(k) - vg(k) ) + (                              &
     304                       kmzp * ( u1d(k+1) - u1d(k) ) * ddzu(k+1) + usws1d      &
     305                                                ) * 2.0 * ddzw(k)
    313306!
    314307!--          v-component
    315              te_v(k) = -f * ( u1d(k) - ug(k) ) + ( &
    316                        kmzp * ( v1d_m(k+1) - v1d_m(k) ) * ddzu(k+1) + vsws1d_m &
    317                                            ) * 2.0 * ddzw(k)
     308             te_v(k) = -f * ( u1d(k) - ug(k) ) + (                             &
     309                       kmzp * ( v1d(k+1) - v1d(k) ) * ddzu(k+1) + vsws1d      &
     310                                                 ) * 2.0 * ddzw(k)
    318311!
    319312!--          TKE
     
    323316                                 - g / pt_0 * kh1d(k) * flux                   &
    324317                                 +           (                                 &
    325                               kmzp * ( e1d_m(k+1) - e1d_m(k) ) * ddzu(k+1)     &
    326                             - kmzm * ( e1d_m(k) - e1d_m(k-1) ) * ddzu(k)       &
     318                                  kmzp * ( e1d(k+1) - e1d(k) ) * ddzu(k+1)     &
     319                                - kmzm * ( e1d(k) - e1d(k-1) ) * ddzu(k)       &
    327320                                              ) * ddzw(k)                      &
    328                             - dissipation
     321                                - dissipation
    329322          ENDIF
    330323
     
    333326          DO  k = nzb+1, nzt
    334327
    335              u1d_p(k) = ( 1. - tsc(1) ) * u1d_m(k) + &
    336                         tsc(1) * u1d(k) + dt_1d * ( tsc(2) * te_u(k) + &
    337                                                     tsc(3) * te_um(k) )
    338              v1d_p(k) = ( 1. - tsc(1) ) * v1d_m(k) + &
    339                         tsc(1) * v1d(k) + dt_1d * ( tsc(2) * te_v(k) + &
    340                                                     tsc(3) * te_vm(k) )
     328             u1d_p(k) = u1d(k) + dt_1d * ( tsc(2) * te_u(k) + &
     329                                           tsc(3) * te_um(k) )
     330             v1d_p(k) = v1d(k) + dt_1d * ( tsc(2) * te_v(k) + &
     331                                           tsc(3) * te_vm(k) )
    341332
    342333          ENDDO
     
    344335             DO  k = nzb+1, nzt
    345336
    346                 e1d_p(k) = ( 1. - tsc(1) ) * e1d_m(k) + &
    347                            tsc(1) * e1d(k) + dt_1d * ( tsc(2) * te_e(k) + &
    348                                                        tsc(3) * te_em(k) )
     337                e1d_p(k) = e1d(k) + dt_1d * ( tsc(2) * te_e(k) + &
     338                                              tsc(3) * te_em(k) )
    349339
    350340             ENDDO
     
    403393
    404394!
    405 !--       If necessary, apply the time filter
    406           IF ( asselin_filter_factor /= 0.0  .AND. &
    407                timestep_scheme(1:5) /= 'runge' )  THEN
    408 
    409              u1d = u1d + asselin_filter_factor * ( u1d_p - 2.0 * u1d + u1d_m )
    410              v1d = v1d + asselin_filter_factor * ( v1d_p - 2.0 * v1d + v1d_m )
    411 
    412              IF ( .NOT. constant_diffusion )  THEN
    413                 e1d = e1d + asselin_filter_factor * &
    414                             ( e1d_p - 2.0 * e1d + e1d_m )
    415              ENDIF
    416 
    417           ENDIF
    418 
    419 !
    420395!--       Swap the time levels in preparation for the next time step.
    421           IF ( timestep_scheme(1:4) == 'leap' )  THEN
    422              u1d_m  = u1d
    423              v1d_m  = v1d
    424              IF ( .NOT. constant_diffusion )  THEN
    425                 e1d_m  = e1d
    426                 kh1d_m = kh1d  ! The old diffusion quantities are required for
    427                 km1d_m = km1d  ! explicit diffusion in the leap-frog scheme.
    428                 l1d_m  = l1d
    429                 IF ( prandtl_layer )  THEN
    430                    usws1d_m = usws1d
    431                    vsws1d_m = vsws1d
    432                 ENDIF
    433              ENDIF
    434           ENDIF
    435396          u1d  = u1d_p
    436397          v1d  = v1d_p
     
    696657          ENDIF   ! .NOT. constant_diffusion
    697658
    698 !
    699 !--       The Runge-Kutta scheme needs the recent diffusion quantities
    700           IF ( timestep_scheme(1:5) == 'runge' )  THEN
    701              u1d_m  = u1d
    702              v1d_m  = v1d
    703              IF ( .NOT. constant_diffusion )  THEN
    704                 e1d_m  = e1d
    705                 kh1d_m = kh1d
    706                 km1d_m = km1d
    707                 l1d_m  = l1d
    708                 IF ( prandtl_layer )  THEN
    709                    usws1d_m = usws1d
    710                    vsws1d_m = vsws1d
    711                 ENDIF
    712              ENDIF
    713           ENDIF
    714 
    715 
    716659       ENDDO   ! intermediate step loop
    717660
     
    836779
    837780    INTEGER ::  k
    838     REAL    ::  div, dt_diff, fac, percent_change, value
     781    REAL    ::  div, dt_diff, fac, value
    839782
    840783
     
    842785!-- Compute the currently feasible time step according to the diffusion
    843786!-- criterion. At nzb+1 the half grid length is used.
    844     IF ( timestep_scheme(1:4) == 'leap' )  THEN
    845        fac = 0.25
    846     ELSE
    847        fac = 0.35
    848     ENDIF
     787    fac = 0.35
    849788    dt_diff = dt_max_1d
    850789    DO  k = nzb+2, nzt
     
    866805    ENDIF
    867806
    868     IF ( timestep_scheme(1:4) == 'leap' )  THEN
    869 
    870 !
    871 !--    The current time step will only be changed if the new time step exceeds
    872 !--    its previous value by 5 % or falls 2 % below. After a time step
    873 !--    reduction at least 30 iterations must be done with this value before a
    874 !--    new reduction will be allowed again.
    875 !--    The control parameters for application of Euler- or leap-frog schemes are
    876 !--    set accordingly.
    877        percent_change = dt_1d / old_dt_1d - 1.0
    878        IF ( percent_change > 0.05  .OR.  percent_change < -0.02 )  THEN
    879 
    880 !
    881 !--       Each time step increase is by at most 2 %
    882           IF ( percent_change > 0.0  .AND.  simulated_time_1d /= 0.0 )  THEN
    883              dt_1d = 1.02 * old_dt_1d
    884           ENDIF
    885 
    886 !
    887 !--       A more or less simple new time step value is obtained taking only the
    888 !--       first two significant digits
    889           div = 1000.0
    890           DO  WHILE ( dt_1d < div )
    891              div = div / 10.0
    892           ENDDO
    893           dt_1d = NINT( dt_1d * 100.0 / div ) * div / 100.0
    894 
    895 !
    896 !--       Now the time step can be changed.
    897           IF ( percent_change < 0.0 )  THEN
    898 !
    899 !--          Time step reduction
    900              old_dt_1d = dt_1d
    901              last_dt_change_1d = current_timestep_number_1d
    902           ELSE
    903 !
    904 !--          Time step will only be increased if at least 30 iterations have
    905 !--          been done since the previous time step change, and of course at
    906 !--          simulation start, respectively.
    907              IF ( current_timestep_number_1d >= last_dt_change_1d + 30  .OR. &
    908                      simulated_time_1d == 0.0 )  THEN
    909                 old_dt_1d = dt_1d
    910                 last_dt_change_1d = current_timestep_number_1d
    911              ELSE
    912                 dt_1d = old_dt_1d
    913              ENDIF
    914           ENDIF
    915        ELSE
    916 !
    917 !--       No time step change since the difference is too small
    918           dt_1d = old_dt_1d
    919        ENDIF
    920 
    921     ELSE    ! Runge-Kutta
    922 
    923 !--    A more or less simple new time step value is obtained taking only the
    924 !--    first two significant digits
    925        div = 1000.0
    926        DO  WHILE ( dt_1d < div )
    927           div = div / 10.0
    928        ENDDO
    929        dt_1d = NINT( dt_1d * 100.0 / div ) * div / 100.0
    930 
    931        old_dt_1d = dt_1d
    932        last_dt_change_1d = current_timestep_number_1d
    933 
    934     ENDIF
     807!
     808!-- A more or less simple new time step value is obtained taking only the
     809!-- first two significant digits
     810    div = 1000.0
     811    DO  WHILE ( dt_1d < div )
     812       div = div / 10.0
     813    ENDDO
     814    dt_1d = NINT( dt_1d * 100.0 / div ) * div / 100.0
     815
     816    old_dt_1d = dt_1d
     817
    935818
    936819 END SUBROUTINE timestep_1d
Note: See TracChangeset for help on using the changeset viewer.