Changeset 3968
- Timestamp:
- Nov 20, 2025, 4:23:54 PM (35 hours ago)
- Location:
- trunk/LMDZ.GENERIC
- Files:
-
- 2 edited
-
changelog.txt (modified) (1 diff)
-
libf/phystd/calc_rayleigh.F90 (modified) (9 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/LMDZ.GENERIC/changelog.txt
r3946 r3968 2129 2129 Minor fix in start2archive: the dimension for albedoS (albedo recasted on the 2130 2130 dynamics scalar grid) shoudld be ip1jmp1. 2131 2132 == 20/11/2025 == GM 2133 Generic PCM: 2134 Fix bug and incorrect data and cleanup calc_rayleigh.F90. 2135 - [minor] Fix a very minor bug for reference pressure and temperature. 2136 The same reference temperature and pressure was used for all gases 2137 instead of use the one for each gas. But no impact on simulations is expected 2138 because all gases have almost the same reference T/P. 2139 - [major] Data for H2O and O2 refractive index was incorrect on the reference paper. 2140 It is now fixed. 2141 - To remove singularities at wavenumber > 60000 cm-1 on some gases, 2142 we add extrapolated formula of refractive index at these wavenumbers. 2143 However, we keep the safety check strictboundrayleigh to remember that 2144 data is extrapolated after 60000 cm-1. 2145 So now, you can use rayleigh scattering at wavenumber > 60000 cm-1 but 2146 keep on mind that this is extrapolated data. Nobody knows what is going on 2147 at these wavenumbers (but Nobody is lost at sea with his crew). -
trunk/LMDZ.GENERIC/libf/phystd/calc_rayleigh.F90
r3863 r3968 102 102 103 103 if ((BWNV(L_NSPECTV+1).gt.60000.).and.(strictboundrayleigh)) then 104 message="Rayleigh scattering is unknown for wn>60000 cm-1 - some singularities are presentfor higher wavenumber - if you know what you are doing, use strictboundrayleigh=.false."104 message="Rayleigh scattering is unknown for wn>60000 cm-1 - all data is extrapolated for higher wavenumber - if you know what you are doing, use strictboundrayleigh=.false." 105 105 call abort_physic(subname,message,1) 106 106 elseif ((BWNV(L_NSPECTV+1).gt.60000.).and..not.(strictboundrayleigh)) then … … 160 160 T0(:) = 288.15 161 161 P0(:) = 1.01325e5 162 ! ng -> valid range of the measurements : 0.1807 - 1.8172 um 163 ng(:) = 1. + 1.1427e3*(5799.25/(128908.9**2 - wn**2) + 120.05/(89223.8**2 - wn**2) + 5.3334/(75037.5**2 - wn**2) + 4.3244/(67837.7**2 - wn**2) + 0.1218145e-4/(2418.136**2 - wn**2)) ! there is an error on the paper 1.1427e6 -> 1.1427e3 162 if (wn .lt. 55331) then 163 ! Sneep et al, 2005 164 ! doi:10.1016/j.jqsrt.2004.07.025 165 ! ng -> valid range of the measurements : 0.1807 - 1.8172 um 166 ng(:) = 1. + 1.1427e3*(5799.25/(128908.9**2 - wn**2) + 120.05/(89223.8**2 - wn**2) + 5.3334/(75037.5**2 - wn**2) + 4.3244/(67837.7**2 - wn**2) + 0.1218145e-4/(2418.136**2 - wn**2)) ! there is an error on the paper 1.1427e6 -> 1.1427e3 167 else 168 ! Cuthbertson and Cuthbertson, 1920 (extrapolation) 169 ! doi:10.1098/rspa.1920.0020 170 ng(:) = 1. + (6914.45/(156.85 - (wn*1e-4)**2))*1e-5 171 endif 164 172 Fk = 1.1364 + 25.3e-12*wn**2 165 173 tauvari(igas,:) = mass_frac(igas,:)*((ng(:)**2-1.)/(ng(:)**2+2.))**2 * Fk * (wn*100.)**4 ! wn*100 -> cm-1 to m-1 174 ! N=P/(kB*T) and muvar/1000 -> g/mol to kg/mol 175 tauconsti(igas,:) = 24.*pi**3 *6.022141E+023 / (g*(muvar(:)/1000.)*(P0(:)/(1.380649E-23*T0(:)))**2) 166 176 elseif(igas.eq.igas_N2)then 167 ! Thalman et al, 2014168 ! doi:10.1016/j.jqsrt.20 14.05.030177 ! Sneep et al, 2005 178 ! doi:10.1016/j.jqsrt.2004.07.025 169 179 T0(:) = 288.15 170 180 P0(:) = 1.01325e5 171 181 if(wn.gt.21360)then !between 21360 and 39370 cm-1. We extrapolate above. 172 ng(:) = 1. + (5677.465 + 318.81874e1 3/(14.4e9 - wn**2))*1e-8 !there is an error on the paper e12 -> e13182 ng(:) = 1. + (5677.465 + 318.81874e12/(14.4e9 - wn**2))*1e-8 !there is an error on the paper e12 -> e13 173 183 else !between 4860 and 21360 cm-1. We extrapolate below. 174 ng(:) = 1. + (6498.2 + 307.4335e13/(14.4e9 - wn**2))*1e-8 175 endif 176 Fk = 1.034 + 3.17e-12*wn 177 tauvari(igas,:) = mass_frac(igas,:)*((ng(:)**2-1.)/(ng(:)**2+2.))**2 * Fk * (wn*100.)**4 184 ng(:) = 1. + (6498.2 + 307.4335e12/(14.4e9 - wn**2))*1e-8 185 endif 186 Fk = 1.034 + 3.17e-12*wn**2 187 tauvari(igas,:) = mass_frac(igas,:)*((ng(:)**2-1.)/(ng(:)**2+2.))**2 * Fk * (wn*100.)**4 188 tauconsti(igas,:) = 24.*pi**3 *6.022141E+023 / (g*(muvar(:)/1000.)*(P0(:)/(1.380649E-23*T0(:)))**2) 178 189 elseif(igas.eq.igas_H2O)then 179 ! Harvey et al, 1998 180 ! doi:10.1063/1.556029 181 ! doi:10.1364/AO.35.001566 for wn<4840 cm-1 182 a0 = 0.244257733 183 a1 = 9.74634476e-3 184 a2 = -3.73234996e-3 185 a3 = 2.68678472e-4 186 a4 = 1.58920570e-3 187 a5 = 2.45934259e-3 188 a6 = 0.900704920 189 a7 = -1.66626219e-2 190 luv = 0.2292020 191 lir = 5.432937 192 Tr = 273.15 193 rhor = 1000. 194 T0(:) = tmid(:) 195 P0(:) = pmid(:)*scalep 196 lr = 0.589 197 rho(:) = mass_frac(igas,:)*muvar(:)/massmol(igas)*P0(:)/(8.314463*T0(:)/(muvar(:)/1000.)) 198 rhos(:) = rho(:)/rhor 199 ts(:) = T0(:)/Tr 200 201 b(:) = (a0 + a1*rhos(:) + a2*ts(:) + a3*ts(:)*(10000./wn/lr)**2 + a4/(10000./wn/lr)**2 + a5/((10000./wn/lr)**2 - luv**2) + a6/((10000./wn/lr)**2 - lir**2) + a7*rhos(:)**2)*rhos(:) 202 ! ng -> valid range of the measurements : 0.2 - 1.1 um 203 ng(:) = sqrt(2.*b(:)+1.)/sqrt(1.-b(:)) 190 Fk = (6.+3.*3e-4)/(6.-7.*3e-4) ! delta=3e-4 Murphy 1977 doi:10.1063/1.434794 204 191 if(wn<4840.) then ! necessary to prevent a singularity at 3230 cm-1 192 ! Ciddor, 1996 193 ! doi:10.1364/AO.35.001566 for wn<4840 cm-1 194 T0(:)=293.15 195 P0(:)=1333. 205 196 ng(:) = 1. + 1.022e-8*(295.235 + 2.6422*(wn*1e-4)**2 - 0.032380*(wn*1e-4)**4 + 0.004028*(wn*1e-4)**6) 206 endif 207 Fk = (6.+3.*3e-4)/(6.-7.*3e-4) ! delta=3e-4 Murphy 1977 doi:10.1063/1.434794 208 tauvari(igas,:) = mass_frac(igas,:)*((ng(:)**2-1.)/(ng(:)**2+2.))**2 * Fk * (wn*100.)**4 197 tauvari(igas,:) = mass_frac(igas,:)*((ng(:)**2-1.)/(ng(:)**2+2.))**2 * Fk * (wn*100.)**4 198 tauconsti(igas,:) = 24.*pi**3 *6.022141E+023 / (g*(muvar(:)/1000.)*(P0(:)/(1.380649E-23*T0(:)))**2) 199 elseif(wn>50000.) then 200 ! Barrell and Sears, 1939 (extrapolation) 201 ! doi:10.1098/rsta.1939.0004 202 T0(:)=273.15 203 P0(:)=101325. 204 ng(:) = 1. + (245.40+2.187*(1e4/wn)**(-2))*1e-6 205 tauvari(igas,:) = mass_frac(igas,:)*((ng(:)**2-1.)/(ng(:)**2+2.))**2 * Fk * (wn*100.)**4 206 tauconsti(igas,:) = 24.*pi**3 *6.022141E+023 / (g*(muvar(:)/1000.)*(P0(:)/(1.380649E-23*T0(:)))**2) 207 else 208 ! Harvey et al, 1998 209 ! doi:10.1063/1.556029 210 ! ng -> valid range of the measurements : 0.2 - 1.1 um 211 a0 = 0.244257733 212 a1 = 9.74634476e-3 213 a2 = -3.73234996e-3 214 a3 = 2.68678472e-4 215 a4 = 1.58920570e-3 216 a5 = 2.45934259e-3 217 a6 = 0.900704920 218 a7 = -1.66626219e-2 219 luv = 0.2292020 220 lir = 5.432937 221 Tr = 273.15 222 rhor = 1000. 223 T0(:) = tmid(:) 224 P0(:) = pmid(:)*scalep 225 lr = 0.589 226 rho(:) = mass_frac(igas,:)*muvar(:)/massmol(igas)*P0(:)/(8.314463*T0(:)/(muvar(:)/1000.)) 227 rhos(:) = rho(:)/rhor 228 ts(:) = T0(:)/Tr 229 b(:) = (a0 + a1*rhos(:) + a2*ts(:) + a3*ts(:)*(10000./wn/lr)**2 + a4/(10000./wn/lr)**2 + a5/((10000./wn/lr)**2 - luv**2) + a6/((10000./wn/lr)**2 - lir**2) + a7*rhos(:)**2)*rhos(:) 230 ng(:) = sqrt(2.*b(:)+1.)/sqrt(1.-b(:)) 231 tauvari(igas,:) = mass_frac(igas,:)*((ng(:)**2-1.)/(ng(:)**2+2.))**2 * Fk * (wn*100.)**4 232 tauconsti(igas,:) = 24.*pi**3 *6.022141E+023 / (g*(muvar(:)/1000.)*(P0(:)/(1.380649E-23*T0(:)))**2) 233 endif 209 234 elseif(igas.eq.igas_H2)then 210 235 ! Peck and Hung, 1977 … … 213 238 P0(:) = 1.01325e5 214 239 ! ng -> valid range of the measurements : 0.1680 - 1.6945 um 215 ng(:) = 1. + (14895.6/(180.7 - (wn*1e-4)**2) + 4903.7/(92.-(wn*1e-4)**2))*1e-6 240 if(wn<59534.) then 241 ng(:) = 1. + (14895.6/(180.7 - (wn*1e-4)**2) + 4903.7/(92.-(wn*1e-4)**2))*1e-6 242 else 243 ng(:) = 1. + (23.79 + 12307.2/(109.832-(wn*1e-4)**2))*1e-6 ! extrapolation 244 endif 216 245 Fk = (6.+3.*0.02)/(6.-7.*0.02) ! delta=0.02 Hansen 1974 217 246 tauvari(igas,:) = mass_frac(igas,:)*((ng(:)**2-1.)/(ng(:)**2+2.))**2 * Fk * (wn*100.)**4 247 tauconsti(igas,:) = 24.*pi**3 *6.022141E+023 / (g*(muvar(:)/1000.)*(P0(:)/(1.380649E-23*T0(:)))**2) 218 248 elseif(igas.eq.igas_He)then 219 249 ! Thalman et al, 2014 … … 225 255 Fk = 1. 226 256 tauvari(igas,:) = mass_frac(igas,:)*((ng(:)**2-1.)/(ng(:)**2+2.))**2 * Fk * (wn*100.)**4 257 tauconsti(igas,:) = 24.*pi**3 *6.022141E+023 / (g*(muvar(:)/1000.)*(P0(:)/(1.380649E-23*T0(:)))**2) 227 258 elseif(igas.eq.igas_CH4)then 228 259 ! Sneep et al, 2005 … … 234 265 Fk = 1. 235 266 tauvari(igas,:) = mass_frac(igas,:)*((ng(:)**2-1.)/(ng(:)**2+2.))**2 * Fk * (wn*100.)**4 267 tauconsti(igas,:) = 24.*pi**3 *6.022141E+023 / (g*(muvar(:)/1000.)*(P0(:)/(1.380649E-23*T0(:)))**2) 236 268 elseif(igas.eq.igas_CO)then 237 269 ! Sneep et al, 2005 … … 240 272 P0(:) = 1.01325e5 241 273 ! ng -> valid range of the measurements : 0.168 - 0.288 um 242 ng(:) = 1. + 22851e-8 + 0.456e4/(71427.**2 - wn**2) 274 if(wn<59809.) then 275 ng(:) = 1. + 22851e-8 + 0.456e4/(71427.**2 - wn**2) 276 else 277 ng(:) = 1.00028476-2.01518666e-9*wn+1.88043553e-14*wn**2 ! extrapolation from previous data 278 endif 243 279 Fk = 1.016 244 280 tauvari(igas,:) = mass_frac(igas,:)*((ng(:)**2-1.)/(ng(:)**2+2.))**2 * Fk * (wn*100.)**4 281 tauconsti(igas,:) = 24.*pi**3 *6.022141E+023 / (g*(muvar(:)/1000.)*(P0(:)/(1.380649E-23*T0(:)))**2) 245 282 elseif(igas.eq.igas_Ar)then 246 ! Thalman et al, 2014247 ! doi:10.1016/j.jqsrt.20 14.05.030283 ! Sneep et al, 2005 284 ! doi:10.1016/j.jqsrt.2004.07.025 248 285 T0(:) = 288.15 249 286 P0(:) = 1.01325e5 … … 252 289 Fk = 1. 253 290 tauvari(igas,:) = mass_frac(igas,:)*((ng(:)**2-1.)/(ng(:)**2+2.))**2 * Fk * (wn*100.)**4 291 tauconsti(igas,:) = 24.*pi**3 *6.022141E+023 / (g*(muvar(:)/1000.)*(P0(:)/(1.380649E-23*T0(:)))**2) 254 292 elseif(igas.eq.igas_O2)then 255 ! Thalman et al, 2014256 ! doi:10.1016/j.jqsrt.20 14.05.030293 ! Sneep et al, 2005 294 ! doi:10.1016/j.jqsrt.2004.07.025 257 295 T0(:) = 273.15 258 296 P0(:) = 1.01325e5 259 ! ng -> valid range of the measurements : 0.303 - 2.0 um 260 ng(:) = 1. + (20564.8 + 2.480899e13/(4.09e9 - wn**2))*1e-8 297 if (wn .lt. 18315) then 298 ! ng -> valid range of the measurements : > 0.546 um 299 ng(:) = 1. + (21351.3 + 21.85670/(4.09e9 - wn**2))*1e-8 300 elseif ((18315 .le. wn) .and. (wn .lt. 34722)) then 301 ! ng -> valid range of the measurements : 0.288 - 0.546 um 302 ng(:) = 1. + (20564.8 + 24.80899/(4.09e9 - wn**2))*1e-8 303 elseif ((34722 .le. wn) .and. (wn .lt. 45248)) then 304 ! ng -> valid range of the measurements : 0.288 - 0.221 um 305 ng(:) = 1. + (22120.4 + 20.31876/(4.09e9 - wn**2))*1e-8 306 else 307 ! ng -> valid range of the measurements : < 0.221 um 308 ng(:) = 1. + (23796.7 + 16.89884/(4.09e9 - wn**2))*1e-8 309 endif 261 310 Fk = 1.09 + 1.385e-11*wn**2 + 1.488e-20*wn**4 262 311 tauvari(igas,:) = mass_frac(igas,:)*((ng(:)**2-1.)/(ng(:)**2+2.))**2 * Fk * (wn*100.)**4 312 tauconsti(igas,:) = 24.*pi**3 *6.022141E+023 / (g*(muvar(:)/1000.)*(P0(:)/(1.380649E-23*T0(:)))**2) 263 313 else 264 314 print*,'No rayleigh scattering for ',trim(gnom(igas)),'. No data found.' 265 315 endif 266 267 tauconsti(igas,:) = 24.*pi**3 *6.022141E+023 / (g*(muvar(:)/1000.)*(P0(:)/(1.380649E-23*T0(:)))**2) 316 268 317 ! N=P/(kB*T) 269 318 ! pmid*scalep -> mbar to Pa … … 276 325 enddo !ngasmx 277 326 278 call black n(dble(wn*1e2),dble(tstellar),df)327 call blackl(dble(wn),dble(tstellar),df) 279 328 df=df*(BWNV(N+1)-BWNV(N))/Nfine 280 329 tauwei=tauwei+df … … 282 331 283 332 enddo !Nfine 333 ! We add a scalep because pressure in radiative transfer is in mbar 284 334 TAURAY(:,N)=tausum(:)*scalep/tauwei 285 ! scalep because tausum/tauwei is in SI units and dp on optcv is in hPa unit286 335 287 336 end do !L_NSPECTV
Note: See TracChangeset
for help on using the changeset viewer.
