Ignore:
Timestamp:
Jun 20, 2017 9:51:42 AM (7 years ago)
Author:
schwenkel
Message:

implementation of new bulk microphysics scheme

File:
1 edited

Legend:

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

    r2261 r2292  
    2525! -----------------
    2626! $Id$
     27! Implementation of new microphysic scheme: cloud_scheme = 'morrison'
     28! includes two more prognostic equations for cloud drop concentration (nc) 
     29! and cloud water content (qc).
     30!
     31! 2261 2017-06-08 14:25:57Z raasch
    2732! bugfix for r2232: openmp directives removed
    2833!
     
    227232
    228233    USE arrays_3d,                                                             &
    229         ONLY:  diss_l_e, diss_l_nr, diss_l_pt, diss_l_q, diss_l_qr,            &
    230                diss_l_s, diss_l_sa, diss_s_e, diss_s_nr, diss_s_pt, diss_s_q,  &
    231                diss_s_qr, diss_s_s, diss_s_sa, e, e_p, flux_s_e, flux_s_nr,    &
    232                flux_s_pt, flux_s_q, flux_s_qr, flux_s_s, flux_s_sa, flux_l_e,  &
    233                flux_l_nr, flux_l_pt, flux_l_q, flux_l_qr, flux_l_s, flux_l_sa, &
    234                nr, nr_p, pt, ptdf_x, ptdf_y, pt_init, pt_p,                    &
    235                prho, q, q_init, q_p, qr, qr_p, rdf,                            &
    236                rdf_sc, ref_state, rho_ocean, s, s_init, s_p, sa, sa_init, sa_p,&
    237                tend, te_m, tnr_m, tpt_m, tq_m, tqr_m, ts_m, tsa_m, tu_m, tv_m, &
    238                tw_m, u, ug, u_init, u_p, v, vg, vpt, v_init, v_p, w, w_p
     234        ONLY:  diss_l_e, diss_l_nc, diss_l_nr, diss_l_pt, diss_l_q, diss_l_qc, &
     235               diss_l_qr, diss_l_s, diss_l_sa, diss_s_e, diss_s_nc, diss_s_nr, &
     236               diss_s_pt, diss_s_q, diss_s_qc, diss_s_qr, diss_s_s, diss_s_sa, &
     237               e, e_p, flux_s_e, flux_s_nc, flux_s_nr, flux_s_pt, flux_s_q,    &
     238               flux_s_qc, flux_s_qr, flux_s_s, flux_s_sa, flux_l_e, flux_l_nc, &
     239               flux_l_nr, flux_l_pt, flux_l_q, flux_l_qc, flux_l_qr, flux_l_s, &
     240               flux_l_sa, nc, nc_p, nr, nr_p, pt, ptdf_x, ptdf_y, pt_init,     &
     241               pt_p, prho, q, q_init, q_p, qc, qc_p, qr, qr_p, rdf, rdf_sc,    &
     242               ref_state, rho_ocean, s,  s_init, s_p, sa, sa_init, sa_p, tend, &
     243               te_m, tnc_m,  tnr_m, tpt_m, tq_m, tqc_m, tqr_m, ts_m, tsa_m,    &
     244               tu_m, tv_m, tw_m, u, ug, u_init, u_p, v, vg, vpt, v_init, v_p,  &
     245               w, w_p
    239246
    240247    USE control_parameters,                                                    &
     
    244251               inflow_l, intermediate_timestep_count,                          &
    245252               intermediate_timestep_count_max, large_scale_forcing,           &
    246                large_scale_subsidence, microphysics_seifert,                  &
     253               large_scale_subsidence, microphysics_morrison, microphysics_seifert, &
    247254               microphysics_sat_adjust, neutral, nudging, ocean, outflow_l,    &
    248255               outflow_s, passive_scalar, prho_reference, prho_reference,      &
     
    892899
    893900!
     901!--          If required, calculate prognostic equations for cloud water content
     902!--          and cloud drop concentration
     903             IF ( cloud_physics  .AND.  microphysics_morrison )  THEN
     904!
     905!--             Calculate prognostic equation for cloud water content
     906                tend(:,j,i) = 0.0_wp
     907                IF ( timestep_scheme(1:5) == 'runge' ) &
     908                THEN
     909                   IF ( ws_scheme_sca )  THEN
     910                      CALL advec_s_ws( i, j, qc, 'qc', flux_s_qc,       &
     911                                       diss_s_qc, flux_l_qc, diss_l_qc, &
     912                                       i_omp_start, tn )
     913                   ELSE
     914                      CALL advec_s_pw( i, j, qc )
     915                   ENDIF
     916                ELSE
     917                   CALL advec_s_up( i, j, qc )
     918                ENDIF
     919                CALL diffusion_s( i, j, qc,                                   &
     920                                  surf_def_h(0)%qcsws, surf_def_h(1)%qcsws,   &
     921                                  surf_def_h(2)%qcsws,                        &
     922                                  surf_lsm_h%qcsws,    surf_usm_h%qcsws,      & 
     923                                  surf_def_v(0)%qcsws, surf_def_v(1)%qcsws,   &
     924                                  surf_def_v(2)%qcsws, surf_def_v(3)%qcsws,   &
     925                                  surf_lsm_v(0)%qcsws, surf_lsm_v(1)%qcsws,   &
     926                                  surf_lsm_v(2)%qcsws, surf_lsm_v(3)%qcsws,   &
     927                                  surf_usm_v(0)%qcsws, surf_usm_v(1)%qcsws,   &
     928                                  surf_usm_v(2)%qcsws, surf_usm_v(3)%qcsws )
     929
     930!
     931!--             Prognostic equation for cloud water content
     932                DO  k = nzb+1, nzt
     933                   qc_p(k,j,i) = qc(k,j,i) + ( dt_3d *                         &
     934                                                      ( tsc(2) * tend(k,j,i) + &
     935                                                        tsc(3) * tqc_m(k,j,i) )&
     936                                                      - tsc(5) * rdf_sc(k)     &
     937                                                               * qc(k,j,i)     &
     938                                             )                                 &
     939                                       * MERGE( 1.0_wp, 0.0_wp,                &
     940                                                BTEST( wall_flags_0(k,j,i), 0 )&
     941                                              )
     942                   IF ( qc_p(k,j,i) < 0.0_wp )  qc_p(k,j,i) = 0.0_wp
     943                ENDDO
     944!
     945!--             Calculate tendencies for the next Runge-Kutta step
     946                IF ( timestep_scheme(1:5) == 'runge' )  THEN
     947                   IF ( intermediate_timestep_count == 1 )  THEN
     948                      DO  k = nzb+1, nzt
     949                         tqc_m(k,j,i) = tend(k,j,i)
     950                      ENDDO
     951                   ELSEIF ( intermediate_timestep_count < &
     952                            intermediate_timestep_count_max )  THEN
     953                      DO  k = nzb+1, nzt
     954                         tqc_m(k,j,i) =   -9.5625_wp * tend(k,j,i) +           &
     955                                           5.3125_wp * tqc_m(k,j,i)
     956                      ENDDO
     957                   ENDIF
     958                ENDIF
     959
     960!
     961!--             Calculate prognostic equation for cloud drop concentration.
     962                tend(:,j,i) = 0.0_wp
     963                IF ( timestep_scheme(1:5) == 'runge' )  THEN
     964                   IF ( ws_scheme_sca )  THEN
     965                      CALL advec_s_ws( i, j, nc, 'nc', flux_s_nc,    &
     966                                    diss_s_nc, flux_l_nc, diss_l_nc, &
     967                                    i_omp_start, tn )
     968                   ELSE
     969                      CALL advec_s_pw( i, j, nc )
     970                   ENDIF
     971                ELSE
     972                   CALL advec_s_up( i, j, nc )
     973                ENDIF
     974                CALL diffusion_s( i, j, nc,                                    &
     975                                  surf_def_h(0)%ncsws, surf_def_h(1)%ncsws,    &
     976                                  surf_def_h(2)%ncsws,                         &
     977                                  surf_lsm_h%ncsws,    surf_usm_h%ncsws,       &
     978                                  surf_def_v(0)%ncsws, surf_def_v(1)%ncsws,    &
     979                                  surf_def_v(2)%ncsws, surf_def_v(3)%ncsws,    &
     980                                  surf_lsm_v(0)%ncsws, surf_lsm_v(1)%ncsws,    &
     981                                  surf_lsm_v(2)%ncsws, surf_lsm_v(3)%ncsws,    &
     982                                  surf_usm_v(0)%ncsws, surf_usm_v(1)%ncsws,    &
     983                                  surf_usm_v(2)%ncsws, surf_usm_v(3)%ncsws )
     984
     985!
     986!--             Prognostic equation for cloud drop concentration
     987                DO  k = nzb+1, nzt
     988                   nc_p(k,j,i) = nc(k,j,i) + ( dt_3d *                         &
     989                                                      ( tsc(2) * tend(k,j,i) + &
     990                                                        tsc(3) * tnc_m(k,j,i) )&
     991                                                      - tsc(5) * rdf_sc(k)     &
     992                                                               * nc(k,j,i)     &
     993                                             )                                 &
     994                                       * MERGE( 1.0_wp, 0.0_wp,                &
     995                                                BTEST( wall_flags_0(k,j,i), 0 )&
     996                                              )
     997                   IF ( nc_p(k,j,i) < 0.0_wp )  nc_p(k,j,i) = 0.0_wp
     998                ENDDO
     999!
     1000!--             Calculate tendencies for the next Runge-Kutta step
     1001                IF ( timestep_scheme(1:5) == 'runge' )  THEN
     1002                   IF ( intermediate_timestep_count == 1 )  THEN
     1003                      DO  k = nzb+1, nzt
     1004                         tnc_m(k,j,i) = tend(k,j,i)
     1005                      ENDDO
     1006                   ELSEIF ( intermediate_timestep_count < &
     1007                            intermediate_timestep_count_max )  THEN
     1008                      DO  k = nzb+1, nzt
     1009                         tnc_m(k,j,i) =   -9.5625_wp * tend(k,j,i) +           &
     1010                                           5.3125_wp * tnc_m(k,j,i)
     1011                      ENDDO
     1012                   ENDIF
     1013                ENDIF
     1014
     1015             ENDIF
     1016!
    8941017!--          If required, calculate prognostic equations for rain water content
    8951018!--          and rain drop concentration
     
    18081931
    18091932!
     1933!--    If required, calculate prognostic equations for cloud water content
     1934!--    and cloud drop concentration
     1935       IF ( cloud_physics  .AND.  microphysics_morrison )  THEN
     1936
     1937          CALL cpu_log( log_point(67), 'qc-equation', 'start' )
     1938
     1939!
     1940!--       Calculate prognostic equation for cloud water content
     1941          sbt = tsc(2)
     1942          IF ( scalar_advec == 'bc-scheme' )  THEN
     1943
     1944             IF ( timestep_scheme(1:5) /= 'runge' )  THEN
     1945!
     1946!--             Bott-Chlond scheme always uses Euler time step. Thus:
     1947                sbt = 1.0_wp
     1948             ENDIF
     1949             tend = 0.0_wp
     1950             CALL advec_s_bc( qc, 'qc' )
     1951
     1952          ENDIF
     1953
     1954!
     1955!--       qc-tendency terms with no communication
     1956          IF ( scalar_advec /= 'bc-scheme' )  THEN
     1957             tend = 0.0_wp
     1958             IF ( timestep_scheme(1:5) == 'runge' )  THEN
     1959                IF ( ws_scheme_sca )  THEN
     1960                   CALL advec_s_ws( qc, 'qc' )
     1961                ELSE
     1962                   CALL advec_s_pw( qc )
     1963                ENDIF
     1964             ELSE
     1965                CALL advec_s_up( qc )
     1966             ENDIF
     1967          ENDIF
     1968
     1969          CALL diffusion_s( qc,                                                &
     1970                            surf_def_h(0)%qcsws, surf_def_h(1)%qcsws,          &
     1971                            surf_def_h(2)%qcsws,                               &
     1972                            surf_lsm_h%qcsws,    surf_usm_h%qcsws,             &
     1973                            surf_def_v(0)%qcsws, surf_def_v(1)%qcsws,          &
     1974                            surf_def_v(2)%qcsws, surf_def_v(3)%qcsws,          &
     1975                            surf_lsm_v(0)%qcsws, surf_lsm_v(1)%qcsws,          &
     1976                            surf_lsm_v(2)%qcsws, surf_lsm_v(3)%qcsws,          &
     1977                            surf_usm_v(0)%qcsws, surf_usm_v(1)%qcsws,          &
     1978                            surf_usm_v(2)%qcsws, surf_usm_v(3)%qcsws )
     1979
     1980!
     1981!--       Prognostic equation for cloud water content
     1982          DO  i = nxl, nxr
     1983             DO  j = nys, nyn
     1984                DO  k = nzb+1, nzt
     1985                   qc_p(k,j,i) = qc(k,j,i) + ( dt_3d * ( sbt * tend(k,j,i) +   &
     1986                                                      tsc(3) * tqc_m(k,j,i) )  &
     1987                                                    - tsc(5) * rdf_sc(k) *     &
     1988                                                               qc(k,j,i)       &
     1989                                             )                                 &
     1990                                    * MERGE( 1.0_wp, 0.0_wp,                   &
     1991                                             BTEST( wall_flags_0(k,j,i), 0 )   &
     1992                                          )
     1993                   IF ( qc_p(k,j,i) < 0.0_wp )  qc_p(k,j,i) = 0.0_wp
     1994                ENDDO
     1995             ENDDO
     1996          ENDDO
     1997
     1998!
     1999!--       Calculate tendencies for the next Runge-Kutta step
     2000          IF ( timestep_scheme(1:5) == 'runge' )  THEN
     2001             IF ( intermediate_timestep_count == 1 )  THEN
     2002                DO  i = nxl, nxr
     2003                   DO  j = nys, nyn
     2004                      DO  k = nzb+1, nzt
     2005                         tqc_m(k,j,i) = tend(k,j,i)
     2006                      ENDDO
     2007                   ENDDO
     2008                ENDDO
     2009             ELSEIF ( intermediate_timestep_count < &
     2010                      intermediate_timestep_count_max )  THEN
     2011                DO  i = nxl, nxr
     2012                   DO  j = nys, nyn
     2013                      DO  k = nzb+1, nzt
     2014                         tqc_m(k,j,i) =   -9.5625_wp * tend(k,j,i)             &
     2015                                         + 5.3125_wp * tqc_m(k,j,i)
     2016                      ENDDO
     2017                   ENDDO
     2018                ENDDO
     2019             ENDIF
     2020          ENDIF
     2021
     2022          CALL cpu_log( log_point(67), 'qc-equation', 'stop' )
     2023          CALL cpu_log( log_point(68), 'nc-equation', 'start' )
     2024
     2025!
     2026!--       Calculate prognostic equation for cloud drop concentration
     2027          sbt = tsc(2)
     2028          IF ( scalar_advec == 'bc-scheme' )  THEN
     2029
     2030             IF ( timestep_scheme(1:5) /= 'runge' )  THEN
     2031!
     2032!--             Bott-Chlond scheme always uses Euler time step. Thus:
     2033                sbt = 1.0_wp
     2034             ENDIF
     2035             tend = 0.0_wp
     2036             CALL advec_s_bc( nc, 'nc' )
     2037
     2038          ENDIF
     2039
     2040!
     2041!--       nc-tendency terms with no communication
     2042          IF ( scalar_advec /= 'bc-scheme' )  THEN
     2043             tend = 0.0_wp
     2044             IF ( timestep_scheme(1:5) == 'runge' )  THEN
     2045                IF ( ws_scheme_sca )  THEN
     2046                   CALL advec_s_ws( nc, 'nc' )
     2047                ELSE
     2048                   CALL advec_s_pw( nc )
     2049                ENDIF
     2050             ELSE
     2051                CALL advec_s_up( nc )
     2052             ENDIF
     2053          ENDIF
     2054
     2055          CALL diffusion_s( nc,                                                &
     2056                            surf_def_h(0)%ncsws, surf_def_h(1)%ncsws,          &
     2057                            surf_def_h(2)%ncsws,                               &
     2058                            surf_lsm_h%ncsws,    surf_usm_h%ncsws,             &
     2059                            surf_def_v(0)%ncsws, surf_def_v(1)%ncsws,          &
     2060                            surf_def_v(2)%ncsws, surf_def_v(3)%ncsws,          &
     2061                            surf_lsm_v(0)%ncsws, surf_lsm_v(1)%ncsws,          &
     2062                            surf_lsm_v(2)%ncsws, surf_lsm_v(3)%ncsws,          &
     2063                            surf_usm_v(0)%ncsws, surf_usm_v(1)%ncsws,          &
     2064                            surf_usm_v(2)%ncsws, surf_usm_v(3)%ncsws )
     2065
     2066!
     2067!--       Prognostic equation for cloud drop concentration
     2068          DO  i = nxl, nxr
     2069             DO  j = nys, nyn
     2070                DO  k = nzb+1, nzt
     2071                   nc_p(k,j,i) = nc(k,j,i) + ( dt_3d * ( sbt * tend(k,j,i) +   &
     2072                                                      tsc(3) * tnc_m(k,j,i) )  &
     2073                                                    - tsc(5) * rdf_sc(k) *     &
     2074                                                               nc(k,j,i)       &
     2075                                             )                                 &
     2076                                   * MERGE( 1.0_wp, 0.0_wp,                    &
     2077                                             BTEST( wall_flags_0(k,j,i), 0 )   &
     2078                                          )
     2079                   IF ( nc_p(k,j,i) < 0.0_wp )  nc_p(k,j,i) = 0.0_wp
     2080                ENDDO
     2081             ENDDO
     2082          ENDDO
     2083
     2084!
     2085!--       Calculate tendencies for the next Runge-Kutta step
     2086          IF ( timestep_scheme(1:5) == 'runge' )  THEN
     2087             IF ( intermediate_timestep_count == 1 )  THEN
     2088                DO  i = nxl, nxr
     2089                   DO  j = nys, nyn
     2090                      DO  k = nzb+1, nzt
     2091                         tnc_m(k,j,i) = tend(k,j,i)
     2092                      ENDDO
     2093                   ENDDO
     2094                ENDDO
     2095             ELSEIF ( intermediate_timestep_count < &
     2096                      intermediate_timestep_count_max )  THEN
     2097                DO  i = nxl, nxr
     2098                   DO  j = nys, nyn
     2099                      DO  k = nzb+1, nzt
     2100                         tnc_m(k,j,i) =  -9.5625_wp * tend(k,j,i)             &
     2101                                         + 5.3125_wp * tnc_m(k,j,i)
     2102                      ENDDO
     2103                   ENDDO
     2104                ENDDO
     2105             ENDIF
     2106          ENDIF
     2107
     2108          CALL cpu_log( log_point(68), 'nc-equation', 'stop' )
     2109
     2110       ENDIF
     2111!
    18102112!--    If required, calculate prognostic equations for rain water content
    18112113!--    and rain drop concentration
Note: See TracChangeset for help on using the changeset viewer.