/[lmdze]/trunk/dyn3d/exner_hyb.f
ViewVC logotype

Contents of /trunk/dyn3d/exner_hyb.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 107 - (show annotations)
Thu Sep 11 15:09:15 2014 UTC (9 years, 8 months ago) by guez
File size: 2203 byte(s)
Imported procedure grilles_gcm_sub from LMDZ. Had then to transform
local variable phis of etat to argument.

Replaced calls to lnblnk by calls to trim.

Removed arguments nlat, klevel and griscal of filtreg. Replaced
integer arguments ifiltre and iaire by logical arguments direct and
intensive.

Changed default values of guide_t and guide_q to false.

1 module exner_hyb_m
2
3 IMPLICIT NONE
4
5 contains
6
7 SUBROUTINE exner_hyb(ps, p, pks, pk, pkf)
8
9 ! From dyn3d/exner_hyb.F, version 1.1.1.1, 2004/05/19 12:53:07
10 ! Authors: P. Le Van, F. Hourdin
11
12 ! Calcule la fonction d'Exner :
13 ! pk = Cp * p ** kappa
14 ! aux milieux des "llm" couches.
15 ! "Pk(l)" est calculé au milieu de la couche "l", entre les pressions
16 ! "p(l)" et "p(l+1)", définies aux interfaces des couches.
17
18 ! Au sommet de l'atmosphère :
19 ! p(llm+1) = 0
20 ! "ps" et "pks" sont la pression et la fonction d'Exner au sol.
21
22 ! À partir des relations :
23 !(1) \overline{p * \delta_z pk}^z = kappa * pk * \delta_z p
24 !(2) pk(l) = beta(l) * pk(l-1)
25 ! (cf. documentation), on détermine successivement, du haut vers
26 ! le bas des couches, les coefficients : beta(llm), ..., beta(l), ...,
27 ! beta(2) puis "pk(:, :, 1)". Ensuite, on calcule, du bas vers le
28 ! haut des couches, "pk(:, :, l)" donné par la relation (2), pour
29 ! l = 2 à l = llm.
30
31 use dimens_m, only: llm
32 use comconst, only: kappa, cpp
33 use disvert_m, only: preff
34 use filtreg_m, only: filtreg
35
36 REAL, intent(in):: ps(:, :) ! (longitude, latitude)
37 REAL, intent(in):: p(:, :, :) ! (longitude, latitude, llm + 1)
38
39 real, intent(out):: pks(:, :) ! (longitude, latitude)
40 real, intent(out):: pk(:, :, :) ! (longitude, latitude, llm)
41 real, intent(out), optional:: pkf(:, :, :) ! (longitude, latitude, llm)
42
43 ! Variables locales :
44 real beta(size(ps, 1), size(ps, 2), 2:llm)
45 INTEGER l
46 REAL unpl2k
47
48 !-------------------------------------
49
50 pks = cpp * (ps / preff)**kappa
51 unpl2k = 1. + 2 * kappa
52
53 beta(:, :, llm) = 1. / unpl2k
54 DO l = llm - 1, 2, -1
55 beta(:, :, l) = p(:, :, l) &
56 / (p(:, :, l) * unpl2k + p(:, :, l+1) * (beta(:, :, l+1) - unpl2k))
57 ENDDO
58
59 pk(:, :, 1) = ps * pks &
60 / (ps * (1. + kappa) + 0.5 * (beta(:, :, 2) - unpl2k) * p(:, :, 2))
61 DO l = 2, llm
62 pk(:, :, l) = beta(:, :, l) * pk(:, :, l - 1)
63 ENDDO
64
65 if (present(pkf)) then
66 pkf = pk
67 CALL filtreg(pkf, direct = .true., intensive = .true.)
68 end if
69
70 END SUBROUTINE exner_hyb
71
72 end module exner_hyb_m

  ViewVC Help
Powered by ViewVC 1.1.21