/[lmdze]/trunk/libf/dyn3d/exner_hyb.f90
ViewVC logotype

Annotation of /trunk/libf/dyn3d/exner_hyb.f90

Parent Directory Parent Directory | Revision Log Revision Log


Revision 64 - (hide annotations)
Wed Aug 29 14:47:17 2012 UTC (11 years, 8 months ago) by guez
File size: 2335 byte(s)
Removed variable lstardis in module comdissnew and procedures gradiv
and nxgrarot. lstardir had to be true. gradiv and nxgrarot were called
if lstardis was false. Removed argument iter of procedure
filtreg. iter had to be 1. gradiv and nxgrarot called filtreg with
iter == 2.

Moved procedure flxsetup into module yoecumf. Module yoecumf is only
used in program units of directory Conflx, moved it there.

1 guez 3 module exner_hyb_m
2    
3     IMPLICIT NONE
4    
5     contains
6    
7     SUBROUTINE exner_hyb(ps, p, pks, pk, pkf)
8    
9 guez 48 ! From dyn3d/exner_hyb.F, version 1.1.1.1 2004/05/19 12:53:07
10 guez 40 ! Authors: P. Le Van, F. Hourdin
11 guez 3
12     ! Calcule la fonction d'Exner :
13     ! pk = Cp * p ** kappa
14 guez 10 ! 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 guez 3
18     ! Au sommet de l'atmosphère :
19 guez 48 ! p(llm+1) = 0
20 guez 10 ! "ps" et "pks" sont la pression et la fonction d'Exner au sol.
21 guez 3
22     ! À partir des relations :
23 guez 40 !(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 guez 48 ! le bas des couches, les coefficients : beta(llm), ..., beta(l), ...,
27 guez 40 ! 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 guez 3
31     use dimens_m, only: iim, jjm, llm
32     use comconst, only: kappa, cpp
33     use comvert, only: preff
34     use comgeom, only: aire_2d, apoln, apols
35 guez 27 use filtreg_m, only: filtreg
36 guez 3
37 guez 40 REAL, intent(in):: ps(iim + 1, jjm + 1)
38     REAL, intent(in):: p(iim + 1, jjm + 1, llm + 1)
39 guez 3
40 guez 40 real, intent(out):: pks(iim + 1, jjm + 1)
41     real, intent(out):: pk(iim + 1, jjm + 1, llm)
42     real, intent(out), optional:: pkf(iim + 1, jjm + 1, llm)
43 guez 3
44 guez 48 ! Variables locales :
45 guez 40 real beta(iim + 1, jjm + 1, 2:llm)
46 guez 10 INTEGER l
47 guez 40 REAL unpl2k
48 guez 3
49     !-------------------------------------
50    
51 guez 10 pks = cpp * (ps / preff)**kappa
52 guez 40 pks(:, 1) = SUM(aire_2d(:iim, 1) * pks(:iim, 1)) / apoln
53     pks(:, jjm + 1) = SUM(aire_2d(:iim, jjm + 1) * pks(:iim, jjm + 1)) / apols
54 guez 3 unpl2k = 1. + 2 * kappa
55    
56 guez 40 beta(:, :, llm) = 1. / unpl2k
57 guez 10 DO l = llm - 1, 2, -1
58 guez 40 beta(:, :, l) = p(:, :, l) &
59     / (p(:, :, l) * unpl2k + p(:, :, l+1) * (beta(:, :, l+1) - unpl2k))
60 guez 3 ENDDO
61    
62 guez 40 pk(:, :, 1) = p(:, :, 1) * pks &
63     / (p(:, :, 1) * (1. + kappa) &
64     + 0.5 * (beta(:, :, 2) - unpl2k) * p(:, :, 2))
65 guez 3 DO l = 2, llm
66 guez 40 pk(:, :, l) = beta(:, :, l) * pk(:, :, l-1)
67 guez 3 ENDDO
68    
69     if (present(pkf)) then
70 guez 10 pkf = pk
71 guez 64 CALL filtreg(pkf, jjm + 1, llm, 2, 1, .TRUE.)
72 guez 3 end if
73    
74     END SUBROUTINE exner_hyb
75    
76     end module exner_hyb_m

  ViewVC Help
Powered by ViewVC 1.1.21