Changeset 2160 for LMDZ5/branches/testing/libf/phylmd/wake.F90
- Timestamp:
- Nov 28, 2014, 4:36:29 PM (10 years ago)
- Location:
- LMDZ5/branches/testing
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
LMDZ5/branches/testing
- Property svn:mergeinfo changed
/LMDZ5/trunk merged: 2072,2075-2115,2117-2126,2128-2158
- Property svn:mergeinfo changed
-
LMDZ5/branches/testing/libf/phylmd/wake.F90
r1999 r2160 19 19 20 20 USE dimphy 21 use mod_phys_lmdz_para 21 22 IMPLICIT NONE 22 23 ! ============================================================================ … … 151 152 ! Variables à fixer 152 153 REAL alon 153 REAL coefgw154 REAL :: wdens_ref155 REAL stark156 REAL alpk154 LOGICAL, SAVE :: first = .TRUE. 155 !$OMP THREADPRIVATE(first) 156 REAL, SAVE :: stark, wdens_ref, coefgw, alpk, crep_upper, crep_sol 157 !$OMP THREADPRIVATE(stark, wdens_ref, coefgw, alpk, crep_upper, crep_sol) 157 158 REAL delta_t_min 158 159 INTEGER nsub … … 232 233 233 234 REAL, DIMENSION (klon, klev) :: crep 234 REAL crep_upper, crep_sol235 235 236 236 REAL, DIMENSION (klon, klev) :: ppi … … 280 280 ! alpk = 0.05 281 281 282 if (first) then 282 283 stark = 0.33 283 284 alpk = 0.25 … … 288 289 289 290 ! cc nrlmd Lecture du fichier wake_param.data 291 !$OMP MASTER 290 292 OPEN (99, FILE='wake_param.data', STATUS='old', FORM='formatted', ERR=9999) 291 293 READ (99, *, END=9998) stark … … 296 298 CLOSE (99) 297 299 9999 CONTINUE 300 !$OMP END MASTER 301 CALL bcast(stark) 302 CALL bcast(alpk) 303 CALL bcast(wdens_ref) 304 CALL bcast(coefgw) 305 306 first=.false. 307 endif 298 308 299 309 ! Initialisation de toutes des densites a wdens_ref. … … 1079 1089 ! print*,'dtKE= ',dtKE(i,k),' dqKE= ',dqKE(i,k) 1080 1090 1081 dtpbl(i, k) = (wdtpbl(i,k)/sigmaw(i)-udtpbl(i,k)/(1.-sigmaw(i))) 1082 dqpbl(i, k) = (wdqpbl(i,k)/sigmaw(i)-udqpbl(i,k)/(1.-sigmaw(i))) 1091 !jyg< 1092 !! 1093 !!--------------------------------------------------------------- 1094 !! The change of delta_T due to PBL (vertical diffusion plus thermal plumes) 1095 !! is accounted for by the PBL and the Thermals schemes. It is now set to zero 1096 !! within the Wake scheme. 1097 !!--------------------------------------------------------------- 1098 dtPBL(i,k) = 0. 1099 dqPBL(i,k) = 0. 1100 ! 1101 !! dtPBL(i,k)=wdtPBL(i,k) - udtPBL(i,k) 1102 !! dqPBL(i,k)=wdqPBL(i,k) - udqPBL(i,k) 1103 ! 1104 !! dtpbl(i, k) = (wdtpbl(i,k)/sigmaw(i)-udtpbl(i,k)/(1.-sigmaw(i))) 1105 !! dqpbl(i, k) = (wdqpbl(i,k)/sigmaw(i)-udqpbl(i,k)/(1.-sigmaw(i))) 1083 1106 ! print*,'dtPBL= ',dtPBL(i,k),' dqPBL= ',dqPBL(i,k) 1107 !>jyg 1108 ! 1084 1109 1085 1110 ! cc nrlmd Prise en compte du taux de mortalité … … 1795 1820 END SUBROUTINE wake_vec_modulation 1796 1821 1797 SUBROUTINE wake_scal(p, ph, ppi, dtime, sigd_con, te0, qe0, omgb, dtdwn, & 1798 dqdwn, amdwn, amup, dta, dqa, wdtpbl, wdqpbl, udtpbl, udqpbl, deltatw, & 1799 deltaqw, dth, hw, sigmaw, wape, fip, gfl, dtls, dqls, ktopw, omgbdth, & 1800 dp_omgb, wdens, tu, qu, dtke, dqke, dtpbl, dqpbl, omg, dp_deltomg, & 1801 spread, cstar, d_deltat_gw, d_deltatw2, d_deltaqw2) 1802 1803 ! ************************************************************** 1804 ! * 1805 ! WAKE * 1806 ! retour a un Pupper fixe * 1807 ! * 1808 ! written by : GRANDPEIX Jean-Yves 09/03/2000 * 1809 ! modified by : ROEHRIG Romain 01/29/2007 * 1810 ! ************************************************************** 1811 1812 USE dimphy 1813 IMPLICIT NONE 1814 ! ============================================================================ 1815 1816 1817 ! But : Decrire le comportement des poches froides apparaissant dans les 1818 ! grands systemes convectifs, et fournir l'energie disponible pour 1819 ! le declenchement de nouvelles colonnes convectives. 1820 1821 ! Variables d'etat : deltatw : ecart de temperature wake-undisturbed 1822 ! area 1823 ! deltaqw : ecart d'humidite wake-undisturbed area 1824 ! sigmaw : fraction d'aire occupee par la poche. 1825 1826 ! Variable de sortie : 1827 1828 ! wape : WAke Potential Energy 1829 ! fip : Front Incident Power (W/m2) - ALP 1830 ! gfl : Gust Front Length per unit area (m-1) 1831 ! dtls : large scale temperature tendency due to wake 1832 ! dqls : large scale humidity tendency due to wake 1833 ! hw : hauteur de la poche 1834 ! dp_omgb : vertical gradient of large scale omega 1835 ! omgbdth: flux of Delta_Theta transported by LS omega 1836 ! dtKE : differential heating (wake - unpertubed) 1837 ! dqKE : differential moistening (wake - unpertubed) 1838 ! omg : Delta_omg =vertical velocity diff. wake-undist. (Pa/s) 1839 ! dp_deltomg : vertical gradient of omg (s-1) 1840 ! spread : spreading term in dt_wake and dq_wake 1841 ! deltatw : updated temperature difference (T_w-T_u). 1842 ! deltaqw : updated humidity difference (q_w-q_u). 1843 ! sigmaw : updated wake fractional area. 1844 ! d_deltat_gw : delta T tendency due to GW 1845 1846 ! Variables d'entree : 1847 1848 ! aire : aire de la maille 1849 ! te0 : temperature dans l'environnement (K) 1850 ! qe0 : humidite dans l'environnement (kg/kg) 1851 ! omgb : vitesse verticale moyenne sur la maille (Pa/s) 1852 ! dtdwn: source de chaleur due aux descentes (K/s) 1853 ! dqdwn: source d'humidite due aux descentes (kg/kg/s) 1854 ! dta : source de chaleur due courants satures et detrain (K/s) 1855 ! dqa : source d'humidite due aux courants satures et detra (kg/kg/s) 1856 ! amdwn: flux de masse total des descentes, par unite de 1857 ! surface de la maille (kg/m2/s) 1858 ! amup : flux de masse total des ascendances, par unite de 1859 ! surface de la maille (kg/m2/s) 1860 ! p : pressions aux milieux des couches (Pa) 1861 ! ph : pressions aux interfaces (Pa) 1862 ! ppi : (p/p_0)**kapa (adim) 1863 ! dtime: increment temporel (s) 1864 1865 ! Variables internes : 1866 1867 ! rhow : masse volumique de la poche froide 1868 ! rho : environment density at P levels 1869 ! rhoh : environment density at Ph levels 1870 ! te : environment temperature | may change within 1871 ! qe : environment humidity | sub-time-stepping 1872 ! the : environment potential temperature 1873 ! thu : potential temperature in undisturbed area 1874 ! tu : temperature in undisturbed area 1875 ! qu : humidity in undisturbed area 1876 ! dp_omgb: vertical gradient og LS omega 1877 ! omgbw : wake average vertical omega 1878 ! dp_omgbw: vertical gradient of omgbw 1879 ! omgbdq : flux of Delta_q transported by LS omega 1880 ! dth : potential temperature diff. wake-undist. 1881 ! th1 : first pot. temp. for vertical advection (=thu) 1882 ! th2 : second pot. temp. for vertical advection (=thw) 1883 ! q1 : first humidity for vertical advection 1884 ! q2 : second humidity for vertical advection 1885 ! d_deltatw : terme de redistribution pour deltatw 1886 ! d_deltaqw : terme de redistribution pour deltaqw 1887 ! deltatw0 : deltatw initial 1888 ! deltaqw0 : deltaqw initial 1889 ! hw0 : hw initial 1890 ! sigmaw0: sigmaw initial 1891 ! amflux : horizontal mass flux through wake boundary 1892 ! wdens : number of wakes per unit area (3D) or per 1893 ! unit length (2D) 1894 ! Tgw : 1 sur la période de onde de gravité 1895 ! Cgw : vitesse de propagation de onde de gravité 1896 ! LL : distance entre 2 poches 1897 1898 ! ------------------------------------------------------------------------- 1899 ! Déclaration de variables 1900 ! ------------------------------------------------------------------------- 1901 1902 include "dimensions.h" 1903 ! ccc include "dimphy.h" 1904 include "YOMCST.h" 1905 include "cvthermo.h" 1906 include "iniprint.h" 1907 1908 ! Arguments en entree 1909 ! -------------------- 1910 1911 REAL p(klev), ph(klev+1), ppi(klev) 1912 REAL dtime 1913 REAL te0(klev), qe0(klev) 1914 REAL omgb(klev+1) 1915 REAL dtdwn(klev), dqdwn(klev) 1916 REAL wdtpbl(klev), wdqpbl(klev) 1917 REAL udtpbl(klev), udqpbl(klev) 1918 REAL amdwn(klev), amup(klev) 1919 REAL dta(klev), dqa(klev) 1920 REAL sigd_con 1921 1922 ! Sorties 1923 ! -------- 1924 1925 REAL deltatw(klev), deltaqw(klev), dth(klev) 1926 REAL tu(klev), qu(klev) 1927 REAL dtls(klev), dqls(klev) 1928 REAL dtke(klev), dqke(klev) 1929 REAL dtpbl(klev), dqpbl(klev) 1930 REAL spread(klev) 1931 REAL d_deltatgw(klev) 1932 REAL d_deltatw2(klev), d_deltaqw2(klev) 1933 REAL omgbdth(klev+1), omg(klev+1) 1934 REAL dp_omgb(klev), dp_deltomg(klev) 1935 REAL d_deltat_gw(klev) 1936 REAL hw, sigmaw, wape, fip, gfl, cstar 1937 INTEGER ktopw 1938 1939 ! Variables internes 1940 ! ------------------- 1941 1942 ! Variables à fixer 1943 REAL alon 1944 REAL coefgw 1945 REAL wdens0, wdens 1946 REAL stark 1947 REAL alpk 1948 REAL delta_t_min 1949 REAL pupper 1950 INTEGER nsub 1951 REAL dtimesub 1952 REAL sigmad, hwmin 1953 1954 ! Variables de sauvegarde 1955 REAL deltatw0(klev) 1956 REAL deltaqw0(klev) 1957 REAL te(klev), qe(klev) 1958 REAL sigmaw0, sigmaw1 1959 1960 ! Variables pour les GW 1961 REAL ll 1962 REAL n2(klev) 1963 REAL cgw(klev) 1964 REAL tgw(klev) 1965 1966 ! Variables liées au calcul de hw 1967 REAL ptop_provis, ptop, ptop_new 1968 REAL sum_dth 1969 REAL dthmin 1970 REAL z, dz, hw0 1971 INTEGER ktop, kupper 1972 1973 ! Autres variables internes 1974 INTEGER isubstep, k 1975 1976 REAL sum_thu, sum_tu, sum_qu, sum_thvu 1977 REAL sum_dq, sum_rho 1978 REAL sum_dtdwn, sum_dqdwn 1979 REAL av_thu, av_tu, av_qu, av_thvu 1980 REAL av_dth, av_dq, av_rho 1981 REAL av_dtdwn, av_dqdwn 1982 1983 REAL rho(klev), rhoh(klev+1), rhow(klev) 1984 REAL rhow_moyen(klev) 1985 REAL zh(klev), zhh(klev+1) 1986 REAL epaisseur1(klev), epaisseur2(klev) 1987 1988 REAL the(klev), thu(klev) 1989 1990 REAL d_deltatw(klev), d_deltaqw(klev) 1991 1992 REAL omgbw(klev+1), omgtop 1993 REAL dp_omgbw(klev) 1994 REAL ztop, dztop 1995 REAL alpha_up(klev) 1996 1997 REAL rre1, rre2, rrd1, rrd2 1998 REAL th1(klev), th2(klev), q1(klev), q2(klev) 1999 REAL d_th1(klev), d_th2(klev), d_dth(klev) 2000 REAL d_q1(klev), d_q2(klev), d_dq(klev) 2001 REAL omgbdq(klev) 2002 2003 REAL ff, gg 2004 REAL wape2, cstar2, heff 2005 2006 REAL crep(klev) 2007 REAL crep_upper, crep_sol 2008 2009 ! ------------------------------------------------------------------------- 2010 ! Initialisations 2011 ! ------------------------------------------------------------------------- 2012 2013 ! print*, 'wake initialisations' 2014 2015 ! Essais d'initialisation avec sigmaw = 0.02 et hw = 10. 2016 ! ------------------------------------------------------------------------- 2017 2018 DATA sigmad, hwmin/.02, 10./ 2019 2020 ! Longueur de maille (en m) 2021 ! ------------------------------------------------------------------------- 2022 2023 ! ALON = 3.e5 2024 alon = 1.E6 2025 2026 2027 ! Configuration de coefgw,stark,wdens (22/02/06 by YU Jingmei) 2028 2029 ! coefgw : Coefficient pour les ondes de gravité 2030 ! stark : Coefficient k dans Cstar=k*sqrt(2*WAPE) 2031 ! wdens : Densité de poche froide par maille 2032 ! ------------------------------------------------------------------------- 2033 2034 coefgw = 10 2035 ! coefgw=1 2036 ! wdens0 = 1.0/(alon**2) 2037 wdens = 1.0/(alon**2) 2038 stark = 0.50 2039 ! CRtest 2040 alpk = 0.1 2041 ! alpk = 1.0 2042 ! alpk = 0.5 2043 ! alpk = 0.05 2044 crep_upper = 0.9 2045 crep_sol = 1.0 2046 2047 2048 ! Minimum value for |T_wake - T_undist|. Used for wake top definition 2049 ! ------------------------------------------------------------------------- 2050 2051 delta_t_min = 0.2 2052 2053 2054 ! 1. - Save initial values and initialize tendencies 2055 ! -------------------------------------------------- 2056 2057 DO k = 1, klev 2058 deltatw0(k) = deltatw(k) 2059 deltaqw0(k) = deltaqw(k) 2060 te(k) = te0(k) 2061 qe(k) = qe0(k) 2062 dtls(k) = 0. 2063 dqls(k) = 0. 2064 d_deltat_gw(k) = 0. 2065 d_deltatw2(k) = 0. 2066 d_deltaqw2(k) = 0. 2067 END DO 2068 ! sigmaw1=sigmaw 2069 ! IF (sigd_con.GT.sigmaw1) THEN 2070 ! print*, 'sigmaw,sigd_con', sigmaw, sigd_con 2071 ! ENDIF 2072 sigmaw = max(sigmaw, sigd_con) 2073 sigmaw = max(sigmaw, sigmad) 2074 sigmaw = min(sigmaw, 0.99) 2075 sigmaw0 = sigmaw 2076 ! wdens=wdens0/(10.*sigmaw) 2077 ! IF (sigd_con.GT.sigmaw1) THEN 2078 ! print*, 'sigmaw1,sigd1', sigmaw, sigd_con 2079 ! ENDIF 2080 2081 ! 2. - Prognostic part 2082 ! ========================================================= 2083 2084 ! print *, 'prognostic wake computation' 2085 2086 2087 ! 2.1 - Undisturbed area and Wake integrals 2088 ! --------------------------------------------------------- 2089 2090 z = 0. 2091 ktop = 0 2092 kupper = 0 2093 sum_thu = 0. 2094 sum_tu = 0. 2095 sum_qu = 0. 2096 sum_thvu = 0. 2097 sum_dth = 0. 2098 sum_dq = 0. 2099 sum_rho = 0. 2100 sum_dtdwn = 0. 2101 sum_dqdwn = 0. 2102 2103 av_thu = 0. 2104 av_tu = 0. 2105 av_qu = 0. 2106 av_thvu = 0. 2107 av_dth = 0. 2108 av_dq = 0. 2109 av_rho = 0. 2110 av_dtdwn = 0. 2111 av_dqdwn = 0. 2112 2113 ! Potential temperatures and humidity 2114 ! ---------------------------------------------------------- 2115 2116 DO k = 1, klev 2117 rho(k) = p(k)/(rd*te(k)) 2118 IF (k==1) THEN 2119 rhoh(k) = ph(k)/(rd*te(k)) 2120 zhh(k) = 0 2121 ELSE 2122 rhoh(k) = ph(k)*2./(rd*(te(k)+te(k-1))) 2123 zhh(k) = (ph(k)-ph(k-1))/(-rhoh(k)*rg) + zhh(k-1) 2124 END IF 2125 the(k) = te(k)/ppi(k) 2126 thu(k) = (te(k)-deltatw(k)*sigmaw)/ppi(k) 2127 tu(k) = te(k) - deltatw(k)*sigmaw 2128 qu(k) = qe(k) - deltaqw(k)*sigmaw 2129 rhow(k) = p(k)/(rd*(te(k)+deltatw(k))) 2130 dth(k) = deltatw(k)/ppi(k) 2131 ll = (1-sqrt(sigmaw))/sqrt(wdens) 2132 END DO 2133 2134 DO k = 1, klev - 1 2135 IF (k==1) THEN 2136 n2(k) = 0 2137 ELSE 2138 n2(k) = max(0., -rg**2/the(k)*rho(k)*(the(k+1)-the(k-1))/(p(k+ & 2139 1)-p(k-1))) 2140 END IF 2141 zh(k) = (zhh(k)+zhh(k+1))/2 2142 2143 cgw(k) = sqrt(n2(k))*zh(k) 2144 tgw(k) = coefgw*cgw(k)/ll 2145 END DO 2146 2147 n2(klev) = 0 2148 zh(klev) = 0 2149 cgw(klev) = 0 2150 tgw(klev) = 0 2151 2152 ! Calcul de la masse volumique moyenne de la colonne 2153 ! ----------------------------------------------------------------- 2154 2155 DO k = 1, klev 2156 epaisseur1(k) = 0. 2157 epaisseur2(k) = 0. 2158 END DO 2159 2160 epaisseur1(1) = -(ph(2)-ph(1))/(rho(1)*rg) + 1. 2161 epaisseur2(1) = -(ph(2)-ph(1))/(rho(1)*rg) + 1. 2162 rhow_moyen(1) = rhow(1) 2163 2164 DO k = 2, klev 2165 epaisseur1(k) = -(ph(k+1)-ph(k))/(rho(k)*rg) + 1. 2166 epaisseur2(k) = epaisseur2(k-1) + epaisseur1(k) 2167 rhow_moyen(k) = (rhow_moyen(k-1)*epaisseur2(k-1)+rhow(k)*epaisseur1(k))/ & 2168 epaisseur2(k) 2169 END DO 2170 2171 2172 ! Choose an integration bound well above wake top 2173 ! ----------------------------------------------------------------- 2174 2175 ! Pupper = 50000. ! melting level 2176 pupper = 60000. 2177 ! Pupper = 70000. 2178 2179 2180 ! Determine Wake top pressure (Ptop) from buoyancy integral 2181 ! ----------------------------------------------------------------- 2182 2183 ! -1/ Pressure of the level where dth becomes less than delta_t_min. 2184 2185 ptop_provis = ph(1) 2186 DO k = 2, klev 2187 IF (dth(k)>-delta_t_min .AND. dth(k-1)<-delta_t_min) THEN 2188 ptop_provis = ((dth(k)+delta_t_min)*p(k-1)-(dth(k- & 2189 1)+delta_t_min)*p(k))/(dth(k)-dth(k-1)) 2190 GO TO 25 2191 END IF 2192 END DO 2193 25 CONTINUE 2194 2195 ! -2/ dth integral 2196 2197 sum_dth = 0. 2198 dthmin = -delta_t_min 2199 z = 0. 2200 2201 DO k = 1, klev 2202 dz = -(max(ph(k+1),ptop_provis)-ph(k))/(rho(k)*rg) 2203 IF (dz<=0) GO TO 40 2204 z = z + dz 2205 sum_dth = sum_dth + dth(k)*dz 2206 dthmin = min(dthmin, dth(k)) 2207 END DO 2208 40 CONTINUE 2209 2210 ! -3/ height of triangle with area= sum_dth and base = dthmin 2211 2212 hw0 = 2.*sum_dth/min(dthmin, -0.5) 2213 hw0 = max(hwmin, hw0) 2214 2215 ! -4/ now, get Ptop 2216 2217 z = 0. 2218 ptop = ph(1) 2219 2220 DO k = 1, klev 2221 dz = min(-(ph(k+1)-ph(k))/(rho(k)*rg), hw0-z) 2222 IF (dz<=0) GO TO 45 2223 z = z + dz 2224 ptop = ph(k) - rho(k)*rg*dz 2225 END DO 2226 45 CONTINUE 2227 2228 2229 ! -5/ Determination de ktop et kupper 2230 2231 DO k = klev, 1, -1 2232 IF (ph(k+1)<ptop) ktop = k 2233 IF (ph(k+1)<pupper) kupper = k 2234 END DO 2235 2236 ! -6/ Correct ktop and ptop 2237 2238 ptop_new = ptop 2239 DO k = ktop, 2, -1 2240 IF (dth(k)>-delta_t_min .AND. dth(k-1)<-delta_t_min) THEN 2241 ptop_new = ((dth(k)+delta_t_min)*p(k-1)-(dth(k-1)+delta_t_min)*p(k))/ & 2242 (dth(k)-dth(k-1)) 2243 GO TO 225 2244 END IF 2245 END DO 2246 225 CONTINUE 2247 2248 ptop = ptop_new 2249 2250 DO k = klev, 1, -1 2251 IF (ph(k+1)<ptop) ktop = k 2252 END DO 2253 2254 ! Set deltatw & deltaqw to 0 above kupper 2255 ! ----------------------------------------------------------- 2256 2257 DO k = kupper, klev 2258 deltatw(k) = 0. 2259 deltaqw(k) = 0. 2260 END DO 2261 2262 2263 ! Vertical gradient of LS omega 2264 ! ------------------------------------------------------------ 2265 2266 DO k = 1, kupper 2267 dp_omgb(k) = (omgb(k+1)-omgb(k))/(ph(k+1)-ph(k)) 2268 END DO 2269 2270 2271 ! Integrals (and wake top level number) 2272 ! ----------------------------------------------------------- 2273 2274 ! Initialize sum_thvu to 1st level virt. pot. temp. 2275 2276 z = 1. 2277 dz = 1. 2278 sum_thvu = thu(1)*(1.+eps*qu(1))*dz 2279 sum_dth = 0. 2280 2281 DO k = 1, klev 2282 dz = -(max(ph(k+1),ptop)-ph(k))/(rho(k)*rg) 2283 IF (dz<=0) GO TO 50 2284 z = z + dz 2285 sum_thu = sum_thu + thu(k)*dz 2286 sum_tu = sum_tu + tu(k)*dz 2287 sum_qu = sum_qu + qu(k)*dz 2288 sum_thvu = sum_thvu + thu(k)*(1.+eps*qu(k))*dz 2289 sum_dth = sum_dth + dth(k)*dz 2290 sum_dq = sum_dq + deltaqw(k)*dz 2291 sum_rho = sum_rho + rhow(k)*dz 2292 sum_dtdwn = sum_dtdwn + dtdwn(k)*dz 2293 sum_dqdwn = sum_dqdwn + dqdwn(k)*dz 2294 END DO 2295 50 CONTINUE 2296 2297 hw0 = z 2298 2299 ! 2.1 - WAPE and mean forcing computation 2300 ! ------------------------------------------------------------- 2301 2302 ! Means 2303 2304 av_thu = sum_thu/hw0 2305 av_tu = sum_tu/hw0 2306 av_qu = sum_qu/hw0 2307 av_thvu = sum_thvu/hw0 2308 ! av_thve = sum_thve/hw0 2309 av_dth = sum_dth/hw0 2310 av_dq = sum_dq/hw0 2311 av_rho = sum_rho/hw0 2312 av_dtdwn = sum_dtdwn/hw0 2313 av_dqdwn = sum_dqdwn/hw0 2314 2315 wape = -rg*hw0*(av_dth+eps*(av_thu*av_dq+av_dth*av_qu+av_dth*av_dq))/ & 2316 av_thvu 2317 2318 ! 2.2 Prognostic variable update 2319 ! ------------------------------------------------------------ 2320 2321 ! Filter out bad wakes 2322 2323 IF (wape<0.) THEN 2324 IF (prt_level>=10) PRINT *, 'wape<0' 2325 wape = 0. 2326 hw = hwmin 2327 sigmaw = max(sigmad, sigd_con) 2328 fip = 0. 2329 DO k = 1, klev 2330 deltatw(k) = 0. 2331 deltaqw(k) = 0. 2332 dth(k) = 0. 2333 END DO 2334 ELSE 2335 IF (prt_level>=10) PRINT *, 'wape>0' 2336 cstar = stark*sqrt(2.*wape) 2337 END IF 2338 2339 ! ------------------------------------------------------------------ 2340 ! Sub-time-stepping 2341 ! ------------------------------------------------------------------ 2342 2343 ! nsub=36 2344 nsub = 10 2345 dtimesub = dtime/nsub 2346 2347 ! ------------------------------------------------------------ 2348 DO isubstep = 1, nsub 2349 ! ------------------------------------------------------------ 2350 2351 ! print*,'---------------','substep=',isubstep,'-------------' 2352 2353 ! Evolution of sigmaw 2354 2355 2356 gfl = 2.*sqrt(3.14*wdens*sigmaw) 2357 2358 sigmaw = sigmaw + gfl*cstar*dtimesub 2359 sigmaw = min(sigmaw, 0.99) !!!!!!!! 2360 ! wdens = wdens0/(10.*sigmaw) 2361 ! sigmaw =max(sigmaw,sigd_con) 2362 ! sigmaw =max(sigmaw,sigmad) 2363 2364 ! calcul de la difference de vitesse verticale poche - zone non perturbee 2365 2366 z = 0. 2367 dp_deltomg(1:klev) = 0. 2368 omg(1:klev+1) = 0. 2369 2370 omg(1) = 0. 2371 dp_deltomg(1) = -(gfl*cstar)/(sigmaw*(1-sigmaw)) 2372 2373 DO k = 2, ktop 2374 dz = -(ph(k)-ph(k-1))/(rho(k-1)*rg) 2375 z = z + dz 2376 dp_deltomg(k) = dp_deltomg(1) 2377 omg(k) = dp_deltomg(1)*z 2378 END DO 2379 2380 dztop = -(ptop-ph(ktop))/(rho(ktop)*rg) 2381 ztop = z + dztop 2382 omgtop = dp_deltomg(1)*ztop 2383 2384 2385 ! Conversion de la vitesse verticale de m/s a Pa/s 2386 2387 omgtop = -rho(ktop)*rg*omgtop 2388 dp_deltomg(1) = omgtop/(ptop-ph(1)) 2389 2390 DO k = 1, ktop 2391 omg(k) = -rho(k)*rg*omg(k) 2392 dp_deltomg(k) = dp_deltomg(1) 2393 END DO 2394 2395 ! raccordement lineaire de omg de ptop a pupper 2396 2397 IF (kupper>ktop) THEN 2398 omg(kupper+1) = -rg*amdwn(kupper+1)/sigmaw + rg*amup(kupper+1)/(1.- & 2399 sigmaw) 2400 dp_deltomg(kupper) = (omgtop-omg(kupper+1))/(ptop-pupper) 2401 DO k = ktop + 1, kupper 2402 dp_deltomg(k) = dp_deltomg(kupper) 2403 omg(k) = omgtop + (ph(k)-ptop)*dp_deltomg(kupper) 2404 END DO 2405 END IF 2406 2407 ! Compute wake average vertical velocity omgbw 2408 2409 DO k = 1, klev + 1 2410 omgbw(k) = omgb(k) + (1.-sigmaw)*omg(k) 2411 END DO 2412 2413 ! and its vertical gradient dp_omgbw 2414 2415 DO k = 1, klev 2416 dp_omgbw(k) = (omgbw(k+1)-omgbw(k))/(ph(k+1)-ph(k)) 2417 END DO 2418 2419 2420 ! Upstream coefficients for omgb velocity 2421 ! -- (alpha_up(k) is the coefficient of the value at level k) 2422 ! -- (1-alpha_up(k) is the coefficient of the value at level k-1) 2423 2424 DO k = 1, klev 2425 alpha_up(k) = 0. 2426 IF (omgb(k)>0.) alpha_up(k) = 1. 2427 END DO 2428 2429 ! Matrix expressing [The,deltatw] from [Th1,Th2] 2430 2431 rre1 = 1. - sigmaw 2432 rre2 = sigmaw 2433 rrd1 = -1. 2434 rrd2 = 1. 2435 2436 ! Get [Th1,Th2], dth and [q1,q2] 2437 2438 DO k = 1, kupper + 1 2439 dth(k) = deltatw(k)/ppi(k) 2440 th1(k) = the(k) - sigmaw*dth(k) ! undisturbed area 2441 th2(k) = the(k) + (1.-sigmaw)*dth(k) ! wake 2442 q1(k) = qe(k) - sigmaw*deltaqw(k) ! undisturbed area 2443 q2(k) = qe(k) + (1.-sigmaw)*deltaqw(k) ! wake 2444 END DO 2445 2446 d_th1(1) = 0. 2447 d_th2(1) = 0. 2448 d_dth(1) = 0. 2449 d_q1(1) = 0. 2450 d_q2(1) = 0. 2451 d_dq(1) = 0. 2452 2453 DO k = 2, kupper + 1 ! loop on interfaces 2454 d_th1(k) = th1(k-1) - th1(k) 2455 d_th2(k) = th2(k-1) - th2(k) 2456 d_dth(k) = dth(k-1) - dth(k) 2457 d_q1(k) = q1(k-1) - q1(k) 2458 d_q2(k) = q2(k-1) - q2(k) 2459 d_dq(k) = deltaqw(k-1) - deltaqw(k) 2460 END DO 2461 2462 omgbdth(1) = 0. 2463 omgbdq(1) = 0. 2464 2465 DO k = 2, kupper + 1 ! loop on interfaces 2466 omgbdth(k) = omgb(k)*(dth(k-1)-dth(k)) 2467 omgbdq(k) = omgb(k)*(deltaqw(k-1)-deltaqw(k)) 2468 END DO 2469 2470 2471 ! ----------------------------------------------------------------- 2472 DO k = 1, kupper - 1 2473 ! ----------------------------------------------------------------- 2474 2475 ! Compute redistribution (advective) term 2476 2477 d_deltatw(k) = dtimesub/(ph(k)-ph(k+1))*(rrd1*omg(k)*sigmaw*d_th1(k)- & 2478 rrd2*omg(k+1)*(1.-sigmaw)*d_th2(k+1)-(1.-alpha_up( & 2479 k))*omgbdth(k)-alpha_up(k+1)*omgbdth(k+1))*ppi(k) 2480 ! print*,'d_deltatw=',d_deltatw(k) 2481 2482 d_deltaqw(k) = dtimesub/(ph(k)-ph(k+1))*(rrd1*omg(k)*sigmaw*d_q1(k)- & 2483 rrd2*omg(k+1)*(1.-sigmaw)*d_q2(k+1)-(1.-alpha_up( & 2484 k))*omgbdq(k)-alpha_up(k+1)*omgbdq(k+1)) 2485 ! print*,'d_deltaqw=',d_deltaqw(k) 2486 2487 ! and increment large scale tendencies 2488 2489 dtls(k) = dtls(k) + dtimesub*((rre1*omg(k)*sigmaw*d_th1(k)-rre2*omg(k+ & 2490 1)*(1.-sigmaw)*d_th2(k+1))/(ph(k)-ph(k+1))-sigmaw*(1.-sigmaw)*dth(k)* & 2491 dp_deltomg(k))*ppi(k) 2492 ! print*,'dtls=',dtls(k) 2493 2494 dqls(k) = dqls(k) + dtimesub*((rre1*omg(k)*sigmaw*d_q1(k)-rre2*omg(k+ & 2495 1)*(1.-sigmaw)*d_q2(k+1))/(ph(k)-ph(k+1))-sigmaw*(1.-sigmaw)*deltaqw( & 2496 k)*dp_deltomg(k)) 2497 ! print*,'dqls=',dqls(k) 2498 2499 ! ------------------------------------------------------------------- 2500 END DO 2501 ! ------------------------------------------------------------------ 2502 2503 ! Increment state variables 2504 2505 DO k = 1, kupper - 1 2506 2507 ! Coefficient de répartition 2508 2509 crep(k) = crep_sol*(ph(kupper)-ph(k))/(ph(kupper)-ph(1)) 2510 crep(k) = crep(k) + crep_upper*(ph(1)-ph(k))/(p(1)-ph(kupper)) 2511 2512 2513 ! Reintroduce compensating subsidence term. 2514 2515 ! dtKE(k)=(dtdwn(k)*Crep(k))/sigmaw 2516 ! dtKE(k)=dtKE(k)-(dtdwn(k)*(1-Crep(k))+dta(k)) 2517 ! . /(1-sigmaw) 2518 ! dqKE(k)=(dqdwn(k)*Crep(k))/sigmaw 2519 ! dqKE(k)=dqKE(k)-(dqdwn(k)*(1-Crep(k))+dqa(k)) 2520 ! . /(1-sigmaw) 2521 2522 ! dtKE(k)=(dtdwn(k)*Crep(k)+(1-Crep(k))*dta(k))/sigmaw 2523 ! dtKE(k)=dtKE(k)-(dtdwn(k)*(1-Crep(k))+dta(k)*Crep(k)) 2524 ! . /(1-sigmaw) 2525 ! dqKE(k)=(dqdwn(k)*Crep(k)+(1-Crep(k))*dqa(k))/sigmaw 2526 ! dqKE(k)=dqKE(k)-(dqdwn(k)*(1-Crep(k))+dqa(k)*Crep(k)) 2527 ! . /(1-sigmaw) 2528 2529 dtke(k) = (dtdwn(k)/sigmaw-dta(k)/(1.-sigmaw)) 2530 dqke(k) = (dqdwn(k)/sigmaw-dqa(k)/(1.-sigmaw)) 2531 ! print*,'dtKE=',dtKE(k) 2532 ! print*,'dqKE=',dqKE(k) 2533 2534 dtpbl(k) = (wdtpbl(k)/sigmaw-udtpbl(k)/(1.-sigmaw)) 2535 dqpbl(k) = (wdqpbl(k)/sigmaw-udqpbl(k)/(1.-sigmaw)) 2536 2537 spread(k) = (1.-sigmaw)*dp_deltomg(k) + gfl*cstar/sigmaw 2538 ! print*,'spread=',spread(k) 2539 2540 2541 ! ajout d'un effet onde de gravité -Tgw(k)*deltatw(k) 03/02/06 YU 2542 ! Jingmei 2543 2544 d_deltat_gw(k) = d_deltat_gw(k) - tgw(k)*deltatw(k)*dtimesub 2545 ! print*,'d_delta_gw=',d_deltat_gw(k) 2546 ff = d_deltatw(k)/dtimesub 2547 2548 ! Sans GW 2549 2550 ! deltatw(k)=deltatw(k)+dtimesub*(ff+dtKE(k)-spread(k)*deltatw(k)) 2551 2552 ! GW formule 1 2553 2554 ! deltatw(k) = deltatw(k)+dtimesub* 2555 ! $ (ff+dtKE(k) - spread(k)*deltatw(k)-Tgw(k)*deltatw(k)) 2556 2557 ! GW formule 2 2558 2559 IF (dtimesub*tgw(k)<1.E-10) THEN 2560 deltatw(k) = deltatw(k) + dtimesub*(ff+dtke(k)+dtpbl(k)-spread(k)* & 2561 deltatw(k)-tgw(k)*deltatw(k)) 2562 ELSE 2563 deltatw(k) = deltatw(k) + 1/tgw(k)*(1-exp(-dtimesub*tgw(k)))*(ff+dtke & 2564 (k)+dtpbl(k)-spread(k)*deltatw(k)-tgw(k)*deltatw(k)) 2565 END IF 2566 2567 dth(k) = deltatw(k)/ppi(k) 2568 2569 gg = d_deltaqw(k)/dtimesub 2570 2571 deltaqw(k) = deltaqw(k) + dtimesub*(gg+dqke(k)+dqpbl(k)-spread(k)* & 2572 deltaqw(k)) 2573 2574 d_deltatw2(k) = d_deltatw2(k) + d_deltatw(k) 2575 d_deltaqw2(k) = d_deltaqw2(k) + d_deltaqw(k) 2576 END DO 2577 2578 ! And update large scale variables 2579 2580 DO k = 1, kupper 2581 te(k) = te0(k) + dtls(k) 2582 qe(k) = qe0(k) + dqls(k) 2583 the(k) = te(k)/ppi(k) 2584 END DO 2585 2586 ! Determine Ptop from buoyancy integral 2587 ! ---------------------------------------------------------------------- 2588 2589 ! -1/ Pressure of the level where dth changes sign. 2590 2591 ptop_provis = ph(1) 2592 2593 DO k = 2, klev 2594 IF (dth(k)>-delta_t_min .AND. dth(k-1)<-delta_t_min) THEN 2595 ptop_provis = ((dth(k)+delta_t_min)*p(k-1)-(dth(k- & 2596 1)+delta_t_min)*p(k))/(dth(k)-dth(k-1)) 2597 GO TO 65 2598 END IF 2599 END DO 2600 65 CONTINUE 2601 2602 ! -2/ dth integral 2603 2604 sum_dth = 0. 2605 dthmin = -delta_t_min 2606 z = 0. 2607 2608 DO k = 1, klev 2609 dz = -(max(ph(k+1),ptop_provis)-ph(k))/(rho(k)*rg) 2610 IF (dz<=0) GO TO 70 2611 z = z + dz 2612 sum_dth = sum_dth + dth(k)*dz 2613 dthmin = min(dthmin, dth(k)) 2614 END DO 2615 70 CONTINUE 2616 2617 ! -3/ height of triangle with area= sum_dth and base = dthmin 2618 2619 hw = 2.*sum_dth/min(dthmin, -0.5) 2620 hw = max(hwmin, hw) 2621 2622 ! -4/ now, get Ptop 2623 2624 ktop = 0 2625 z = 0. 2626 2627 DO k = 1, klev 2628 dz = min(-(ph(k+1)-ph(k))/(rho(k)*rg), hw-z) 2629 IF (dz<=0) GO TO 75 2630 z = z + dz 2631 ptop = ph(k) - rho(k)*rg*dz 2632 ktop = k 2633 END DO 2634 75 CONTINUE 2635 2636 ! -5/Correct ktop and ptop 2637 2638 ptop_new = ptop 2639 2640 DO k = ktop, 2, -1 2641 IF (dth(k)>-delta_t_min .AND. dth(k-1)<-delta_t_min) THEN 2642 ptop_new = ((dth(k)+delta_t_min)*p(k-1)-(dth(k-1)+delta_t_min)*p(k))/ & 2643 (dth(k)-dth(k-1)) 2644 GO TO 275 2645 END IF 2646 END DO 2647 275 CONTINUE 2648 2649 ptop = ptop_new 2650 2651 DO k = klev, 1, -1 2652 IF (ph(k+1)<ptop) ktop = k 2653 END DO 2654 2655 ! -6/ Set deltatw & deltaqw to 0 above kupper 2656 2657 DO k = kupper, klev 2658 deltatw(k) = 0. 2659 deltaqw(k) = 0. 2660 END DO 2661 2662 ! ------------------------------------------------------------------ 2663 END DO ! end sub-timestep loop 2664 ! ----------------------------------------------------------------- 2665 2666 ! Get back to tendencies per second 2667 2668 DO k = 1, kupper - 1 2669 dtls(k) = dtls(k)/dtime 2670 dqls(k) = dqls(k)/dtime 2671 d_deltatw2(k) = d_deltatw2(k)/dtime 2672 d_deltaqw2(k) = d_deltaqw2(k)/dtime 2673 d_deltat_gw(k) = d_deltat_gw(k)/dtime 2674 END DO 2675 2676 ! 2.1 - Undisturbed area and Wake integrals 2677 ! --------------------------------------------------------- 2678 2679 z = 0. 2680 sum_thu = 0. 2681 sum_tu = 0. 2682 sum_qu = 0. 2683 sum_thvu = 0. 2684 sum_dth = 0. 2685 sum_dq = 0. 2686 sum_rho = 0. 2687 sum_dtdwn = 0. 2688 sum_dqdwn = 0. 2689 2690 av_thu = 0. 2691 av_tu = 0. 2692 av_qu = 0. 2693 av_thvu = 0. 2694 av_dth = 0. 2695 av_dq = 0. 2696 av_rho = 0. 2697 av_dtdwn = 0. 2698 av_dqdwn = 0. 2699 2700 ! Potential temperatures and humidity 2701 ! ---------------------------------------------------------- 2702 2703 DO k = 1, klev 2704 rho(k) = p(k)/(rd*te(k)) 2705 IF (k==1) THEN 2706 rhoh(k) = ph(k)/(rd*te(k)) 2707 zhh(k) = 0 2708 ELSE 2709 rhoh(k) = ph(k)*2./(rd*(te(k)+te(k-1))) 2710 zhh(k) = (ph(k)-ph(k-1))/(-rhoh(k)*rg) + zhh(k-1) 2711 END IF 2712 the(k) = te(k)/ppi(k) 2713 thu(k) = (te(k)-deltatw(k)*sigmaw)/ppi(k) 2714 tu(k) = te(k) - deltatw(k)*sigmaw 2715 qu(k) = qe(k) - deltaqw(k)*sigmaw 2716 rhow(k) = p(k)/(rd*(te(k)+deltatw(k))) 2717 dth(k) = deltatw(k)/ppi(k) 2718 2719 END DO 2720 2721 ! Integrals (and wake top level number) 2722 ! ----------------------------------------------------------- 2723 2724 ! Initialize sum_thvu to 1st level virt. pot. temp. 2725 2726 z = 1. 2727 dz = 1. 2728 sum_thvu = thu(1)*(1.+eps*qu(1))*dz 2729 sum_dth = 0. 2730 2731 DO k = 1, klev 2732 dz = -(max(ph(k+1),ptop)-ph(k))/(rho(k)*rg) 2733 2734 IF (dz<=0) GO TO 51 2735 z = z + dz 2736 sum_thu = sum_thu + thu(k)*dz 2737 sum_tu = sum_tu + tu(k)*dz 2738 sum_qu = sum_qu + qu(k)*dz 2739 sum_thvu = sum_thvu + thu(k)*(1.+eps*qu(k))*dz 2740 sum_dth = sum_dth + dth(k)*dz 2741 sum_dq = sum_dq + deltaqw(k)*dz 2742 sum_rho = sum_rho + rhow(k)*dz 2743 sum_dtdwn = sum_dtdwn + dtdwn(k)*dz 2744 sum_dqdwn = sum_dqdwn + dqdwn(k)*dz 2745 END DO 2746 51 CONTINUE 2747 2748 hw0 = z 2749 2750 ! 2.1 - WAPE and mean forcing computation 2751 ! ------------------------------------------------------------- 2752 2753 ! Means 2754 2755 av_thu = sum_thu/hw0 2756 av_tu = sum_tu/hw0 2757 av_qu = sum_qu/hw0 2758 av_thvu = sum_thvu/hw0 2759 av_dth = sum_dth/hw0 2760 av_dq = sum_dq/hw0 2761 av_rho = sum_rho/hw0 2762 av_dtdwn = sum_dtdwn/hw0 2763 av_dqdwn = sum_dqdwn/hw0 2764 2765 wape2 = -rg*hw0*(av_dth+eps*(av_thu*av_dq+av_dth*av_qu+av_dth*av_dq))/ & 2766 av_thvu 2767 2768 2769 ! 2.2 Prognostic variable update 2770 ! ------------------------------------------------------------ 2771 2772 ! Filter out bad wakes 2773 2774 IF (wape2<0.) THEN 2775 IF (prt_level>=10) PRINT *, 'wape2<0' 2776 wape2 = 0. 2777 hw = hwmin 2778 sigmaw = max(sigmad, sigd_con) 2779 fip = 0. 2780 DO k = 1, klev 2781 deltatw(k) = 0. 2782 deltaqw(k) = 0. 2783 dth(k) = 0. 2784 END DO 2785 ELSE 2786 IF (prt_level>=10) PRINT *, 'wape2>0' 2787 cstar2 = stark*sqrt(2.*wape2) 2788 2789 END IF 2790 2791 ktopw = ktop 2792 2793 IF (ktopw>0) THEN 2794 2795 ! jyg1 Utilisation d'un h_efficace constant ( ~ feeding layer) 2796 ! cc heff = 600. 2797 ! Utilisation de la hauteur hw 2798 ! c heff = 0.7*hw 2799 heff = hw 2800 2801 fip = 0.5*rho(ktopw)*cstar2**3*heff*2*sqrt(sigmaw*wdens*3.14) 2802 fip = alpk*fip 2803 ! jyg2 2804 ELSE 2805 fip = 0. 2806 END IF 2807 2808 2809 ! Limitation de sigmaw 2810 2811 ! sécurité : si le wake occuppe plus de 90 % de la surface de la maille, 2812 ! alors il disparait en se mélangeant à la partie undisturbed 2813 2814 ! correction NICOLAS . ((wape.ge.wape2).and.(wape2.le.1.0))) THEN 2815 IF ((sigmaw>0.9) .OR. ((wape>=wape2) .AND. (wape2<= & 2816 1.0)) .OR. (ktopw<=2)) THEN 2817 ! IM cf NR/JYG 251108 . ((wape.ge.wape2).and.(wape2.le.1.0))) THEN 2818 ! IF (sigmaw.GT.0.9) THEN 2819 DO k = 1, klev 2820 dtls(k) = 0. 2821 dqls(k) = 0. 2822 deltatw(k) = 0. 2823 deltaqw(k) = 0. 2824 END DO 2825 wape = 0. 2826 hw = hwmin 2827 sigmaw = sigmad 2828 fip = 0. 2829 END IF 2830 2831 RETURN 2832 END SUBROUTINE wake_scal 2833 2834 2835 1822
Note: See TracChangeset
for help on using the changeset viewer.