source: LMDZ4/trunk/libf/phy_IPCC_AR4/plevel.F @ 923

Last change on this file since 923 was 868, checked in by Laurent Fairhead, 17 years ago

Preparation du remplacement de la physique utilisee pour l'exercice IPCC_AR4
par la version de la physique avec thermique. On garde le repertoire phylmd
pour un petit moment pour que les utilisateurs ne soient pas trop perdus ...
phy_IPCC_AR4 = phylmd
LF

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 3.5 KB
Line 
1!
2! $Header$
3!
4c================================================================
5c================================================================
6      SUBROUTINE plevel(ilon,ilev,lnew,pgcm,pres,Qgcm,Qpres)
7c================================================================
8c================================================================
9      USE dimphy
10      IMPLICIT none
11
12cym#include "dimensions.h"
13cy#include "dimphy.h"
14
15c================================================================
16c
17c Interpoler des champs 3-D u, v et g du modele a un niveau de
18c pression donnee (pres)
19c
20c INPUT:  ilon ----- nombre de points
21c         ilev ----- nombre de couches
22c         lnew ----- true si on doit reinitialiser les poids
23c         pgcm ----- pressions modeles
24c         pres ----- pression vers laquelle on interpolle
25c         Qgcm ----- champ GCM
26c         Qpres ---- champ interpolle au niveau pres
27c
28c================================================================
29c
30c   arguments :
31c   -----------
32
33      INTEGER ilon, ilev
34      logical lnew
35
36      REAL pgcm(ilon,ilev)
37      REAL Qgcm(ilon,ilev)
38      real pres
39      REAL Qpres(ilon)
40
41c   local :
42c   -------
43
44cym      INTEGER lt(klon), lb(klon)
45cym      REAL ptop, pbot, aist(klon), aisb(klon)
46
47cym      save lt,lb,ptop,pbot,aist,aisb
48      INTEGER,ALLOCATABLE,SAVE,DIMENSION(:) :: lt,lb
49      REAL,ALLOCATABLE,SAVE,DIMENSION(:) :: aist,aisb
50c$OMP THREADPRIVATE(lt,lb,aist,aisb)     
51      REAL,SAVE :: ptop, pbot
52c$OMP THREADPRIVATE(ptop, pbot)     
53      LOGICAL,SAVE :: first = .true.
54c$OMP THREADPRIVATE(first)
55      INTEGER i, k
56c
57      if (first) then
58        allocate(lt(klon),lb(klon),aist(klon),aisb(klon))
59        first=.false.
60      endif
61     
62c=====================================================================
63      if (lnew) then
64c   on r�nitialise les r�ndicages et les poids
65c=====================================================================
66
67
68c Chercher les 2 couches les plus proches du niveau a obtenir
69c
70c Eventuellement, faire l'extrapolation a partir des deux couches
71c les plus basses ou les deux couches les plus hautes:
72      DO 130 i = 1, klon
73         IF ( ABS(pres-pgcm(i,ilev) ) .LT.
74     .        ABS(pres-pgcm(i,1)) ) THEN
75            lt(i) = ilev     ! 2
76            lb(i) = ilev-1   ! 1
77         ELSE
78            lt(i) = 2
79            lb(i) = 1
80         ENDIF
81  130 CONTINUE
82      DO 150 k = 1, ilev-1
83         DO 140 i = 1, klon
84            pbot = pgcm(i,k)
85            ptop = pgcm(i,k+1)
86            IF (ptop.LE.pres .AND. pbot.GE.pres) THEN
87               lt(i) = k+1
88               lb(i) = k
89            ENDIF
90  140    CONTINUE
91  150 CONTINUE
92c
93c Interpolation lineaire:
94c
95      DO i = 1, klon
96c interpolation en logarithme de pression:
97c
98c ...   Modif . P. Le Van    ( 20/01/98) ....
99c       Modif Fr��ic Hourdin (3/01/02)
100
101        aist(i) = LOG( pgcm(i,lb(i))/ pres )
102     .       / LOG( pgcm(i,lb(i))/ pgcm(i,lt(i)) )
103        aisb(i) = LOG( pres / pgcm(i,lt(i)) )
104     .       / LOG( pgcm(i,lb(i))/ pgcm(i,lt(i)))
105      enddo
106
107
108      endif ! lnew
109
110c======================================================================
111c    inteprollation
112c======================================================================
113
114      do i=1,klon
115         Qpres(i)= Qgcm(i,lb(i))*aisb(i)+Qgcm(i,lt(i))*aist(i)
116      enddo
117c
118c Je mets les vents a zero quand je rencontre une montagne
119      do i = 1, klon
120         if (pgcm(i,1).LT.pres) THEN
121c           Qpres(i)=1e33
122            Qpres(i)=1e+20
123         endif
124      enddo
125
126c
127      RETURN
128      END
Note: See TracBrowser for help on using the repository browser.