source: LMDZ4/trunk/libf/phylmd/plevel_new.F @ 1194

Last change on this file since 1194 was 1194, checked in by musat, 15 years ago

Correction d'un bogue reccurent : aist, aisb sont des REAL
IM

File size: 4.0 KB
Line 
1!
2! $Header: /home/cvsroot/LMDZ4/libf/phylmd/plevel.F,v 1.1.1.1.10.1 2006/08/17 15:41:51 fairhead Exp $
3!
4c================================================================
5c================================================================
6      SUBROUTINE plevel_new(ilon,ilev,klevSTD,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, klevSTD
34      logical lnew
35     
36      REAL pgcm(ilon,ilev)
37      REAL Qgcm(ilon,ilev)
38      real pres(klevSTD)
39      REAL Qpres(ilon, klevSTD)
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.
54      INTEGER :: nlev
55c$OMP THREADPRIVATE(first)
56      INTEGER i, k
57c
58      if (first) then
59         allocate(lt(klon),lb(klon))
60         allocate(aist(klon,klevSTD),aisb(klon, klevSTD))
61         first=.false.
62      endif
63     
64c=====================================================================
65      if (lnew) then
66c   on reinitialise les reindicages et les poids
67c=====================================================================
68
69
70c Chercher les 2 couches les plus proches du niveau a obtenir
71c
72c Eventuellement, faire l'extrapolation a partir des deux couches
73c les plus basses ou les deux couches les plus hautes:
74c
75c
76         DO nlev = 1, klevSTD
77            DO i = 1, klon
78               IF ( ABS(pres(nlev)-pgcm(i,ilev) ) .LT.
79     &              ABS(pres(nlev)-pgcm(i,1)) ) THEN
80                  lt(i) = ilev  ! 2
81                  lb(i) = ilev-1 ! 1
82               ELSE
83                  lt(i) = 2
84                  lb(i) = 1
85               ENDIF
86            ENDDO
87            DO k = 1, ilev-1
88               DO i = 1, klon
89                  pbot = pgcm(i,k)
90                  ptop = pgcm(i,k+1)
91                  IF (ptop.LE.pres(nlev) .AND. pbot.GE.pres(nlev)) THEN
92                     lt(i) = k+1
93                     lb(i) = k
94                  ENDIF
95               ENDDO
96            ENDDO
97           
98c     Interpolation lineaire:
99            DO i = 1, klon
100c     interpolation en logarithme de pression:
101c     
102c     ...   Modif . P. Le Van    ( 20/01/98) ....
103c     Modif Frederic Hourdin (3/01/02)
104               
105               aist(i,nlev) = LOG( pgcm(i,lb(i))/ pres(nlev) )
106     &              / LOG( pgcm(i,lb(i))/ pgcm(i,lt(i)) )
107               aisb(i,nlev) = LOG( pres(nlev) / pgcm(i,lt(i)) )
108     &              / LOG( pgcm(i,lb(i))/ pgcm(i,lt(i)))
109            ENDDO
110         ENDDO
111
112      ENDIF ! lnew
113
114c======================================================================
115c    inteprollation
116c    ET je mets les vents a zero quand je rencontre une montagne
117c======================================================================
118
119      DO nlev = 1, klevSTD
120         DO i=1,klon
121            IF (pgcm(i,1).LT.pres(nlev)) THEN
122c     Qpres(i)=1e33
123               Qpres(i,nlev) = 1e+20
124            ELSE
125               Qpres(i,nlev) =
126     &              Qgcm(i,lb(i))*aisb(i,nlev) +
127     &              Qgcm(i,lt(i))*aist(i,nlev)
128            ENDIF
129         ENDDO
130      ENDDO
131
132c     
133      RETURN
134      END
Note: See TracBrowser for help on using the repository browser.