Changeset 414 for trunk/LMDZ.MARS/libf/phymars/nirco2abs.F
- Timestamp:
- Nov 23, 2011, 10:14:21 AM (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LMDZ.MARS/libf/phymars/nirco2abs.F
r38 r414 1 SUBROUTINE nirco2abs(ngrid,nlayer,pplay,dist_sol, 1 SUBROUTINE nirco2abs(ngrid,nlayer,pplay,dist_sol,nq,pq, 2 2 $ mu0,fract,declin,pdtnirco2) 3 3 … … 16 16 c see NLTE correction-factor of Lopez-Valverde et al (1998) 17 17 c Stephen Lewis 2000 18 c 18 c 19 c jul 2011 malv+fgg New corrections for NLTE implemented 19 20 c 08/2002 : correction for bug when running with diurnal=F 20 21 c … … 48 49 #include "callkeys.h" 49 50 #include "comdiurn.h" 50 51 #include "NIRdata.h" 51 52 52 53 c----------------------------------------------------------------------- … … 62 63 c Local variables : 63 64 c ----------------- 64 INTEGER l,ig, n, nstep 65 INTEGER l,ig, n, nstep,i 65 66 REAL co2heat0, zmu(ngridmx) 66 67 … … 84 85 parameter (n_p0=0.0015888279) 85 86 87 c Variables added to implement NLTE correction factor (feb 2011) 88 real pyy(nlayer) 89 real cor1(nlayer),oldoco2(nlayer),alfa2(nlayer) 90 real p2011,cociente1,merge 91 real cor0,oco2gcm 92 integer nq 93 real pq(ngrid,nlayer,nq) 94 86 95 c---------------------------------------------------------------------- 87 96 … … 97 106 do ig=1,ngrid 98 107 zmu(ig)=sqrt(1224.*mu0(ig)*mu0(ig)+1.)/35. 99 enddo 100 do l=1,nlayer 101 do ig=1,ngrid 102 if(fract(ig).gt.0.) pdtnirco2(ig,l)= 108 109 if(nircorr.eq.1) then 110 do l=1,nlayer 111 pyy(l)=pplay(ig,l) 112 enddo 113 114 call interpnir(cor1,pyy,nlayer,corgcm,pres1d,npres) 115 call interpnir(oldoco2,pyy,nlayer,oco21d,pres1d,npres) 116 call interpnir(alfa2,pyy,nlayer,alfa,pres1d,npres) 117 endif 118 119 do l=1,nlayer 120 ! Calculations for the O/CO2 correction 121 if(nircorr.eq.1) then 122 cor0=1./(1.+n_p0/pplay(ig,l))**n_b 123 if(pq(ig,l,1).gt.1.e-6) then 124 oco2gcm=pq(ig,l,3)/pq(ig,l,1) 125 else 126 oco2gcm=1.e6 127 endif 128 cociente1=oco2gcm/oldoco2(l) 129 merge=alog10(cociente1)*alfa2(l)+alog10(cor0)* 130 $ (1.-alfa2(l)) 131 merge=10**merge 132 p2011=sqrt(merge)*cor0 133 else if (nircorr.eq.0) then 134 p2011=1. 135 cor1(l)=1. 136 endif 137 138 if(fract(ig).gt.0.) pdtnirco2(ig,l)= 103 139 & co2heat0*sqrt((700.*zmu(ig))/pplay(ig,l)) 104 140 & /(1.+n_p0/pplay(ig,l))**n_b 105 141 ! Corrections from tabulation 142 $ * cor1(l) * p2011 106 143 c OLD SCHEME (forget et al. 1999) 107 144 c s co2heat0*sqrt((700.*zmu(ig))/pplay(ig,l)) … … 109 146 enddo 110 147 enddo 148 111 149 112 150 c Averaging over diurnal cycle (if diurnal=F) … … 128 166 do ig=1,ngrid 129 167 zmu(ig)=sqrt(1224.*mu0_int(ig)*mu0_int(ig)+1.)/35. 130 enddo 131 do l=1,nlayer 132 do ig=1,ngrid 168 169 if(nircorr.eq.1) then 170 do l=1,nlayer 171 pyy(l)=pplay(ig,l) 172 enddo 173 call interpnir(cor1,pyy,nlayer,corgcm,pres1d,npres) 174 call interpnir(oldoco2,pyy,nlayer,oco21d,pres1d,npres) 175 call interpnir(alfa2,pyy,nlayer,alfa,pres1d,npres) 176 endif 177 178 do l=1,nlayer 179 if(nircorr.eq.1) then 180 cor0=1./(1.+n_p0/pplay(ig,l))**n_b 181 oco2gcm=pq(ig,l,3)/pq(ig,l,1) 182 cociente1=oco2gcm/oldoco2(l) 183 merge=alog10(cociente1)*alfa2(l)+alog10(cor0)* 184 $ (1.-alfa2(l)) 185 merge=10**merge 186 p2011=sqrt(merge)*cor0 187 else if (nircorr.eq.0) then 188 p2011=1. 189 cor1(l)=1. 190 endif 191 133 192 if(fract_int(ig).gt.0.) pdtnirco2(ig,l)= 134 193 & pdtnirco2(ig,l) + (1/float(nstep))* 135 194 & co2heat0*sqrt((700.*zmu(ig))/pplay(ig,l)) 136 195 & /(1.+n_p0/pplay(ig,l))**n_b 196 ! Corrections from tabulation 197 $ * cor1(l) * p2011 137 198 enddo 138 199 enddo … … 143 204 end 144 205 206 207 208 subroutine interpnir(escout,p,nlayer,escin,pin,nl) 209 C 210 C subroutine to perform linear interpolation in pressure from 1D profile 211 C escin(nl) sampled on pressure grid pin(nl) to profile 212 C escout(nlayer) on pressure grid p(nlayer). 213 C 214 real escout(nlayer),p(nlayer) 215 real escin(nl),pin(nl),wm,wp 216 integer nl,nlayer,n1,n,nm,np 217 do n1=1,nlayer 218 if(p(n1) .gt. 1500. .or. p(n1) .lt. 1.0e-13) then 219 escout(n1) = 0.0 220 else 221 do n = 1,nl-1 222 if (p(n1).le.pin(n).and.p(n1).ge.pin(n+1)) then 223 nm=n 224 np=n+1 225 wm=abs(pin(np)-p(n1))/(pin(nm)-pin(np)) 226 wp=1.0 - wm 227 endif 228 enddo 229 escout(n1) = escin(nm)*wm + escin(np)*wp 230 endif 231 enddo 232 return 233 end
Note: See TracChangeset
for help on using the changeset viewer.