LMDZ
srtm_setcoef.F90
Go to the documentation of this file.
1 SUBROUTINE srtm_setcoef &
2  & ( klev , knmol ,&
3  & pavel , ptavel , pz , ptz , ptbound ,&
4  & pcoldry , pwkl ,&
5  & klaytrop, klayswtch, klaylow ,&
6  & pco2mult, pcolch4 , pcolco2 , pcolh2o , pcolmol , pcoln2o , pcolo2 , pcolo3 ,&
7  & pforfac , pforfrac , kindfor , pselffac, pselffrac, kindself ,&
8  & pfac00 , pfac01 , pfac10 , pfac11 ,&
9  & kjp , kjt , kjt1 &
10  & )
11 
12 ! J. Delamere, AER, Inc. (version 2.5, 02/04/01)
13 
14 ! Modifications:
15 ! JJMorcrette 030224 rewritten / adapted to ECMWF F90 system
16 ! M.Hamrud 01-Oct-2003 CY28 Cleaning
17 
18 ! Purpose: For a given atmosphere, calculate the indices and
19 ! fractions related to the pressure and temperature interpolations.
20 
21 USE parkind1 ,ONLY : jpim ,jprb
22 USE yomhook ,ONLY : lhook, dr_hook
23 
24 USE parsrtm , ONLY : jplay
25 USE yoesrtwn, ONLY : preflog, tref
26 !! USE YOESWN , ONLY : NDBUG
27 
28 IMPLICIT NONE
29 
30 !-- Input arguments
31 
32 INTEGER(KIND=JPIM),INTENT(IN) :: KLEV
33 INTEGER(KIND=JPIM) :: KNMOL ! Argument NOT used
34 REAL(KIND=JPRB) ,INTENT(IN) :: PAVEL(jplay)
35 REAL(KIND=JPRB) ,INTENT(IN) :: PTAVEL(jplay)
36 REAL(KIND=JPRB) :: PZ(0:jplay) ! Argument NOT used
37 REAL(KIND=JPRB) ,INTENT(IN) :: PTZ(0:jplay)
38 REAL(KIND=JPRB) ,INTENT(IN) :: PTBOUND
39 REAL(KIND=JPRB) ,INTENT(IN) :: PCOLDRY(jplay)
40 REAL(KIND=JPRB) ,INTENT(IN) :: PWKL(35,jplay)
41 INTEGER(KIND=JPIM),INTENT(OUT) :: KLAYTROP
42 INTEGER(KIND=JPIM),INTENT(OUT) :: KLAYSWTCH
43 INTEGER(KIND=JPIM),INTENT(OUT) :: KLAYLOW
44 REAL(KIND=JPRB) ,INTENT(OUT) :: PCO2MULT(jplay)
45 REAL(KIND=JPRB) ,INTENT(OUT) :: PCOLCH4(jplay)
46 REAL(KIND=JPRB) ,INTENT(OUT) :: PCOLCO2(jplay)
47 REAL(KIND=JPRB) ,INTENT(OUT) :: PCOLH2O(jplay)
48 REAL(KIND=JPRB) ,INTENT(OUT) :: PCOLMOL(jplay)
49 REAL(KIND=JPRB) ,INTENT(OUT) :: PCOLN2O(jplay)
50 REAL(KIND=JPRB) ,INTENT(OUT) :: PCOLO2(jplay)
51 REAL(KIND=JPRB) ,INTENT(OUT) :: PCOLO3(jplay)
52 REAL(KIND=JPRB) ,INTENT(OUT) :: PFORFAC(jplay)
53 REAL(KIND=JPRB) ,INTENT(OUT) :: PFORFRAC(jplay)
54 INTEGER(KIND=JPIM),INTENT(OUT) :: KINDFOR(jplay)
55 REAL(KIND=JPRB) ,INTENT(OUT) :: PSELFFAC(jplay)
56 REAL(KIND=JPRB) ,INTENT(OUT) :: PSELFFRAC(jplay)
57 INTEGER(KIND=JPIM),INTENT(OUT) :: KINDSELF(jplay)
58 REAL(KIND=JPRB) ,INTENT(OUT) :: PFAC00(jplay)
59 REAL(KIND=JPRB) ,INTENT(OUT) :: PFAC01(jplay)
60 REAL(KIND=JPRB) ,INTENT(OUT) :: PFAC10(jplay)
61 REAL(KIND=JPRB) ,INTENT(OUT) :: PFAC11(jplay)
62 INTEGER(KIND=JPIM),INTENT(OUT) :: KJP(jplay)
63 INTEGER(KIND=JPIM),INTENT(OUT) :: KJT(jplay)
64 INTEGER(KIND=JPIM),INTENT(OUT) :: KJT1(jplay)
65 !-- Output arguments
66 
67 !-- local integers
68 
69 INTEGER(KIND=JPIM) :: I_NLAYERS, INDBOUND, INDLEV0, JK
70 INTEGER(KIND=JPIM) :: JP1
71 
72 !-- local reals
73 
74 REAL(KIND=JPRB) :: Z_STPFAC, Z_TBNDFRAC, Z_T0FRAC, Z_PLOG, Z_FP, Z_FT, Z_FT1, Z_WATER, Z_SCALEFAC
75 REAL(KIND=JPRB) :: Z_FACTOR, Z_CO2REG, Z_COMPFP
76 REAL(KIND=JPRB) :: ZHOOK_HANDLE
77 
78 
79 
80 
81 IF (lhook) CALL dr_hook('SRTM_SETCOEF',0,zhook_handle)
82 i_nlayers = klev
83 
84 z_stpfac = 296._jprb/1013._jprb
85 
86 indbound = ptbound - 159._jprb
87 z_tbndfrac = ptbound - int(ptbound)
88 indlev0 = ptz(0) - 159._jprb
89 z_t0frac = ptz(0) - int(ptz(0))
90 
91 klaytrop = 0
92 klayswtch = 0
93 klaylow = 0
94 
95 !IF (NDBUG.LE.3) THEN
96 ! print *,'-------- Computed in SETCOEF --------'
97 ! print 8990
98 8990 format(18x,' T PFAC00, 01, 10, 11 PCO2MULT MOL &
99  & CH4 CO2 H2O N2O O2 O3 SFAC &
100  & SFRAC FFAC FFRAC ISLF IFOR')
101 !END IF
102 
103 DO jk = 1, i_nlayers
104 ! Find the two reference pressures on either side of the
105 ! layer pressure. Store them in JP and JP1. Store in FP the
106 ! fraction of the difference (in ln(pressure)) between these
107 ! two values that the layer pressure lies.
108 
109  z_plog = log(pavel(jk))
110  kjp(jk) = int(36. - 5*(z_plog+0.04))
111  IF (kjp(jk) < 1) THEN
112  kjp(jk) = 1
113  ELSEIF (kjp(jk) > 58) THEN
114  kjp(jk) = 58
115  ENDIF
116  jp1 = kjp(jk) + 1
117  z_fp = 5. * (preflog(kjp(jk)) - z_plog)
118 
119 ! Determine, for each reference pressure (JP and JP1), which
120 ! reference temperature (these are different for each
121 ! reference pressure) is nearest the layer temperature but does
122 ! not exceed it. Store these indices in JT and JT1, resp.
123 ! Store in FT (resp. FT1) the fraction of the way between JT
124 ! (JT1) and the next highest reference temperature that the
125 ! layer temperature falls.
126 
127  kjt(jk) = int(3. + (ptavel(jk)-tref(kjp(jk)))/15.)
128  IF (kjt(jk) < 1) THEN
129  kjt(jk) = 1
130  ELSEIF (kjt(jk) > 4) THEN
131  kjt(jk) = 4
132  ENDIF
133  z_ft = ((ptavel(jk)-tref(kjp(jk)))/15.) - REAL(kjt(jk)-3)
134  kjt1(jk) = int(3. + (ptavel(jk)-tref(jp1))/15.)
135  IF (kjt1(jk) < 1) THEN
136  kjt1(jk) = 1
137  ELSEIF (kjt1(jk) > 4) THEN
138  kjt1(jk) = 4
139  ENDIF
140  z_ft1 = ((ptavel(jk)-tref(jp1))/15.) - REAL(kjt1(jk)-3)
141 
142  z_water = pwkl(1,jk)/pcoldry(jk)
143  z_scalefac = pavel(jk) * z_stpfac / ptavel(jk)
144 
145 ! If the pressure is less than ~100mb, perform a different
146 ! set of species interpolations.
147 
148  IF (z_plog <= 4.56) GO TO 5300
149  klaytrop = klaytrop + 1
150  IF (z_plog >= 6.62) klaylow = klaylow + 1
151 
152 ! Set up factors needed to separately include the water vapor
153 ! foreign-continuum in the calculation of absorption coefficient.
154 
155  pforfac(jk) = z_scalefac / (1.+z_water)
156  z_factor = (332.0-ptavel(jk))/36.0
157  kindfor(jk) = min(2, max(1, int(z_factor)))
158  pforfrac(jk) = z_factor - REAL(kindfor(jk))
159 
160 ! Set up factors needed to separately include the water vapor
161 ! self-continuum in the calculation of absorption coefficient.
162 
163  pselffac(jk) = z_water * pforfac(jk)
164  z_factor = (ptavel(jk)-188.0)/7.2
165  kindself(jk) = min(9, max(1, int(z_factor)-7))
166  pselffrac(jk) = z_factor - REAL(KINDSELF(JK) + 7)
167 
168 ! Calculate needed column amounts.
169 
170  pcolh2o(jk) = 1.e-20 * pwkl(1,jk)
171  pcolco2(jk) = 1.e-20 * pwkl(2,jk)
172  pcolo3(jk) = 1.e-20 * pwkl(3,jk)
173 ! COLO3(LAY) = 0.
174 ! COLO3(LAY) = colo3(lay)/1.16
175  pcoln2o(jk) = 1.e-20 * pwkl(4,jk)
176  pcolch4(jk) = 1.e-20 * pwkl(6,jk)
177  pcolo2(jk) = 1.e-20 * pwkl(7,jk)
178  pcolmol(jk) = 1.e-20 * pcoldry(jk) + pcolh2o(jk)
179 ! colco2(lay) = 0.
180 ! colo3(lay) = 0.
181 ! coln2o(lay) = 0.
182 ! colch4(lay) = 0.
183 ! colo2(lay) = 0.
184 ! colmol(lay) = 0.
185  IF (pcolco2(jk) == 0.) pcolco2(jk) = 1.e-32 * pcoldry(jk)
186  IF (pcoln2o(jk) == 0.) pcoln2o(jk) = 1.e-32 * pcoldry(jk)
187  IF (pcolch4(jk) == 0.) pcolch4(jk) = 1.e-32 * pcoldry(jk)
188  IF (pcolo2(jk) == 0.) pcolo2(jk) = 1.e-32 * pcoldry(jk)
189 ! Using E = 1334.2 cm-1.
190  z_co2reg = 3.55e-24 * pcoldry(jk)
191  pco2mult(jk)= (pcolco2(jk) - z_co2reg) * &
192  & 272.63*exp(-1919.4/ptavel(jk))/(8.7604e-4*ptavel(jk))
193  GO TO 5400
194 
195 ! Above LAYTROP.
196  5300 CONTINUE
197 
198 ! Set up factors needed to separately include the water vapor
199 ! foreign-continuum in the calculation of absorption coefficient.
200 
201  pforfac(jk) = z_scalefac / (1.+z_water)
202  z_factor = (ptavel(jk)-188.0)/36.0
203  kindfor(jk) = 3
204  pforfrac(jk) = z_factor - 1.0
205 
206 ! Calculate needed column amounts.
207 
208  pcolh2o(jk) = 1.e-20 * pwkl(1,jk)
209  pcolco2(jk) = 1.e-20 * pwkl(2,jk)
210  pcolo3(jk) = 1.e-20 * pwkl(3,jk)
211  pcoln2o(jk) = 1.e-20 * pwkl(4,jk)
212  pcolch4(jk) = 1.e-20 * pwkl(6,jk)
213  pcolo2(jk) = 1.e-20 * pwkl(7,jk)
214  pcolmol(jk) = 1.e-20 * pcoldry(jk) + pcolh2o(jk)
215  IF (pcolco2(jk) == 0.) pcolco2(jk) = 1.e-32 * pcoldry(jk)
216  IF (pcoln2o(jk) == 0.) pcoln2o(jk) = 1.e-32 * pcoldry(jk)
217  IF (pcolch4(jk) == 0.) pcolch4(jk) = 1.e-32 * pcoldry(jk)
218  IF (pcolo2(jk) == 0.) pcolo2(jk) = 1.e-32 * pcoldry(jk)
219  z_co2reg = 3.55e-24 * pcoldry(jk)
220  pco2mult(jk)= (pcolco2(jk) - z_co2reg) * &
221  & 272.63*exp(-1919.4/ptavel(jk))/(8.7604e-4*ptavel(jk))
222 
223  pselffac(jk) =0.0_jprb
224  pselffrac(jk)=0.0_jprb
225  kindself(jk) = 0
226 
227  5400 CONTINUE
228 
229 ! We have now isolated the layer ln pressure and temperature,
230 ! between two reference pressures and two reference temperatures
231 ! (for each reference pressure). We multiply the pressure
232 ! fraction FP with the appropriate temperature fractions to get
233 ! the factors that will be needed for the interpolation that yields
234 ! the optical depths (performed in routines TAUGBn for band n).
235 
236  z_compfp = 1. - z_fp
237  pfac10(jk) = z_compfp * z_ft
238  pfac00(jk) = z_compfp * (1. - z_ft)
239  pfac11(jk) = z_fp * z_ft1
240  pfac01(jk) = z_fp * (1. - z_ft1)
241 
242 ! IF (NDBUG.LE.3) THEN
243 ! print 9000,LAY,LAYTROP,JP(LAY),JT(LAY),JT1(LAY),TAVEL(LAY) &
244 ! &,FAC00(LAY),FAC01(LAY),FAC10(LAY),FAC11(LAY) &
245 ! &,CO2MULT(LAY),COLMOL(LAY),COLCH4(LAY),COLCO2(LAY),COLH2O(LAY) &
246 ! &,COLN2O(LAY),COLO2(LAY),COLO3(LAY),SELFFAC(LAY),SELFFRAC(LAY) &
247 ! &,FORFAC(LAY),FORFRAC(LAY),INDSELF(LAY),INDFOR(LAY)
248  9000 format(1x,2i3,3i4,f6.1,4f7.2,12e9.2,2i5)
249 ! END IF
250 
251 ENDDO
252 
253 !-----------------------------------------------------------------------
254 IF (lhook) CALL dr_hook('SRTM_SETCOEF',1,zhook_handle)
255 END SUBROUTINE srtm_setcoef
256 
integer(kind=jpim), parameter jplay
Definition: parsrtm.F90:19
integer, save klev
Definition: dimphy.F90:7
real(kind=jprb), dimension(59) preflog
Definition: yoesrtwn.F90:21
real(kind=jprb), dimension(59) tref
Definition: yoesrtwn.F90:22
integer, parameter jprb
Definition: parkind1.F90:31
!$Header!c c INCLUDE fxyprim h c c c Fonctions in line c c REAL fyprim REAL rj c c il faut la calculer avant d appeler ces fonctions c c c Fonctions a changer selon x(x) et y(y) choisis.c-----------------------------------------------------------------c c.....ici
logical lhook
Definition: yomhook.F90:12
subroutine dr_hook(CDNAME, KSWITCH, PKEY)
Definition: yomhook.F90:17
subroutine srtm_setcoef(KLEV, KNMOL, PAVEL, PTAVEL, PZ, PTZ, PTBOUND, PCOLDRY, PWKL, KLAYTROP, KLAYSWTCH, KLAYLOW, PCO2MULT, PCOLCH4, PCOLCO2, PCOLH2O, PCOLMOL, PCOLN2O, PCOLO2, PCOLO3, PFORFAC, PFORFRAC, KINDFOR, PSELFFAC, PSELFFRAC, KINDSELF, PFAC00, PFAC01, PFAC10, PFAC11, KJP, KJT, KJT1)
integer, parameter jpim
Definition: parkind1.F90:13