/[lmdze]/trunk/phylmd/Radlwsw/lw.f90
ViewVC logotype

Contents of /trunk/phylmd/Radlwsw/lw.f90

Parent Directory Parent Directory | Revision Log Revision Log


Revision 343 - (show annotations)
Mon Oct 28 08:14:26 2019 UTC (4 years, 6 months ago) by guez
File size: 5206 byte(s)
Add output variables rld and rldcs

Add output variables rld and rldcs (following LMDZ).

In procedure cdrag, rename variables zdu2, ztsolv, ztvd, zri to du2,
tsolv, tvd, ri. Replace `exp(log(psol))` by psol.

In procedure `pbl_surface`, rename u, v to `u_seri`, `v_seri`.

1 module lw_m
2
3 IMPLICIT none
4
5 contains
6
7 SUBROUTINE LW(PPMB, PDP, PDT0, PEMIS, PTL, PTAVE, PWV, POZON, PAER, PCLDLD, &
8 PCLDLU, PVIEW, PCOLR, PCOLR0, PTOPLW, PSOLLW, PTOPLW0, PSOLLW0, &
9 psollwdown, plwup, plwdn, plwup0, plwdn0)
10
11 use lwbv_m, only: lwbv
12 use LWU_m, only: LWU
13 USE raddim, ONLY: kdlon, kflev
14 USE raddimlw, ONLY: nua
15 USE suphec_m, ONLY: md, rcpd, rday, rg, rmo3
16
17 ! Method.
18
19 ! 1. Computes the pressure and temperature weighted amounts of
20 ! absorbers.
21
22 ! 2. Computes the Planck functions on the interfaces and the
23 ! gradient of Planck functions in the layers.
24
25 ! 3. Performs the vertical integration distinguishing the
26 ! contributions of the adjacent and distant layers and those from
27 ! the boundaries.
28
29 ! 4. Computes the clear-sky downward and upward emissivities.
30
31 ! 5. Introduces the effects of the clouds on the fluxes.
32
33 ! Reference: see radiation part of ECMWF documentation of the IFS.
34
35 ! Author:
36 ! Jean-Jacques Morcrette ECMWF
37
38 ! Original : July 14th, 1989
39
40 DOUBLE PRECISION PCLDLD(KDLON, KFLEV) ! DOWNWARD EFFECTIVE CLOUD COVER
41 DOUBLE PRECISION PCLDLU(KDLON, KFLEV) ! UPWARD EFFECTIVE CLOUD COVER
42 DOUBLE PRECISION PDP(KDLON, KFLEV) ! LAYER PRESSURE THICKNESS (Pa)
43 DOUBLE PRECISION PDT0(KDLON) ! SURFACE TEMPERATURE DISCONTINUITY (K)
44 DOUBLE PRECISION PEMIS(KDLON) ! SURFACE EMISSIVITY
45 DOUBLE PRECISION PPMB(KDLON, KFLEV+1) ! HALF LEVEL PRESSURE (mb)
46 DOUBLE PRECISION POZON(KDLON, KFLEV) ! O3 CONCENTRATION (kg/kg)
47 DOUBLE PRECISION PTL(KDLON, KFLEV+1) ! HALF LEVEL TEMPERATURE (K)
48 DOUBLE PRECISION PAER(KDLON, KFLEV, 5) ! OPTICAL THICKNESS OF THE AEROSOLS
49 DOUBLE PRECISION PTAVE(KDLON, KFLEV) ! LAYER TEMPERATURE (K)
50 DOUBLE PRECISION PVIEW(KDLON) ! COSECANT OF VIEWING ANGLE
51 DOUBLE PRECISION PWV(KDLON, KFLEV) ! SPECIFIC HUMIDITY (kg/kg)
52
53 DOUBLE PRECISION PCOLR(KDLON, KFLEV) ! LONG-WAVE TENDENCY (K/day)
54 DOUBLE PRECISION PCOLR0(KDLON, KFLEV) ! LONG-WAVE TENDENCY (K/day) clear-sky
55 DOUBLE PRECISION PTOPLW(KDLON) ! LONGWAVE FLUX AT T.O.A.
56 DOUBLE PRECISION PSOLLW(KDLON) ! LONGWAVE FLUX AT SURFACE
57 DOUBLE PRECISION PTOPLW0(KDLON) ! LONGWAVE FLUX AT T.O.A. (CLEAR-SKY)
58 DOUBLE PRECISION PSOLLW0(KDLON) ! LONGWAVE FLUX AT SURFACE (CLEAR-SKY)
59 ! Rajout LF
60 double precision psollwdown(kdlon) ! LONGWAVE downwards flux at surface
61 !IM
62 DOUBLE PRECISION plwup(KDLON, KFLEV+1) ! LW up total sky
63 DOUBLE PRECISION plwup0(KDLON, KFLEV+1) ! LW up clear sky
64 DOUBLE PRECISION plwdn(KDLON, KFLEV+1) ! LW down total sky
65 DOUBLE PRECISION plwdn0(KDLON, KFLEV+1) ! LW down clear sky
66
67 DOUBLE PRECISION ZABCU(KDLON, NUA, 3*KFLEV+1)
68 DOUBLE PRECISION ZOZ(KDLON, KFLEV)
69
70 DOUBLE PRECISION, save:: ZFLUX(KDLON, 2, KFLEV+1)
71 ! RADIATIVE FLUXES (1:up; 2:down)
72
73 DOUBLE PRECISION, save:: ZFLUC(KDLON, 2, KFLEV+1)
74 ! CLEAR-SKY RADIATIVE FLUXES
75
76 ! Intermediate variables:
77 DOUBLE PRECISION, save:: ZBINT(KDLON, KFLEV+1)
78 DOUBLE PRECISION, save:: ZBSUI(KDLON)
79 DOUBLE PRECISION, save:: ZCTS(KDLON, KFLEV)
80 DOUBLE PRECISION, save:: ZCNTRB(KDLON, KFLEV+1, KFLEV+1)
81
82 INTEGER ilim, i, k, kpl1
83
84 INTEGER, PARAMETER:: lw0pas = 1 ! Every lw0pas steps, clear-sky is done
85 INTEGER, PARAMETER:: lwpas = 1 ! Every lwpas steps, cloudy-sky is done
86 ! In general, lw0pas and lwpas should be 1
87
88 INTEGER:: itaplw0 = 0, itaplw = 0
89
90 ! ------------------------------------------------------------------
91
92 IF (MOD(itaplw0, lw0pas) == 0) THEN
93 DO k = 1, KFLEV
94 DO i = 1, KDLON
95 ! convertir ozone de kg/kg en pa (modif MPL 100505)
96 ZOZ(i, k) = POZON(i, k)*PDP(i, k) * MD/RMO3
97 ENDDO
98 ENDDO
99 CALL LWU(PAER, PDP, PPMB, ZOZ, PTAVE, PVIEW, PWV, ZABCU)
100 CALL LWBV(ILIM, PDT0, PEMIS, PPMB, PTL, PTAVE, ZABCU, &
101 ZFLUC, ZBINT, ZBSUI, ZCTS, ZCNTRB)
102 itaplw0 = 0
103 ENDIF
104 itaplw0 = itaplw0 + 1
105
106 IF (MOD(itaplw, lwpas) == 0) THEN
107 CALL LWC(ILIM, PCLDLD, PCLDLU, PEMIS, &
108 ZFLUC, ZBINT, ZBSUI, ZCTS, ZCNTRB, &
109 ZFLUX)
110 itaplw = 0
111 ENDIF
112 itaplw = itaplw + 1
113
114 DO k = 1, KFLEV
115 kpl1 = k+1
116 DO i = 1, KDLON
117 PCOLR(i, k) = ZFLUX(i, 1, kpl1)+ZFLUX(i, 2, kpl1) &
118 - ZFLUX(i, 1, k)- ZFLUX(i, 2, k)
119 PCOLR(i, k) = PCOLR(i, k) * RDAY*RG/RCPD / PDP(i, k)
120 PCOLR0(i, k) = ZFLUC(i, 1, kpl1)+ZFLUC(i, 2, kpl1) &
121 - ZFLUC(i, 1, k)- ZFLUC(i, 2, k)
122 PCOLR0(i, k) = PCOLR0(i, k) * RDAY*RG/RCPD / PDP(i, k)
123 ENDDO
124 ENDDO
125 DO i = 1, KDLON
126 PSOLLW(i) = -ZFLUX(i, 1, 1)-ZFLUX(i, 2, 1)
127 PTOPLW(i) = ZFLUX(i, 1, KFLEV+1) + ZFLUX(i, 2, KFLEV+1)
128
129 PSOLLW0(i) = -ZFLUC(i, 1, 1)-ZFLUC(i, 2, 1)
130 PTOPLW0(i) = ZFLUC(i, 1, KFLEV+1) + ZFLUC(i, 2, KFLEV+1)
131 psollwdown(i) = -ZFLUX(i, 2, 1)
132
133 ! Attention aux signes : LWtop > 0, LWdn < 0
134 DO k = 1, KFLEV+1
135 plwup(i, k) = ZFLUX(i, 1, k)
136 plwup0(i, k) = ZFLUC(i, 1, k)
137 plwdn(i, k) = ZFLUX(i, 2, k)
138 plwdn0(i, k) = ZFLUC(i, 2, k)
139 ENDDO
140 ENDDO
141
142 END SUBROUTINE LW
143
144 end module lw_m

  ViewVC Help
Powered by ViewVC 1.1.21