source: LMDZ.3.3/trunk/libf/dyn3d/read_reanalyse.F @ 204

Last change on this file since 204 was 204, checked in by lmdz, 23 years ago

Debogage du guidage et de la version debranchee et abandon de la version
debranchee non-netcdf FH/MAF
LF

  • Property svn:eol-style set to native
  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
File size: 9.1 KB
Line 
1c
2c $Header
3c
4      subroutine read_reanalyse(timestep,u,v,t,masse,ps,mode)
5
6c   mode=0 variables naturelles
7c   mode=1 variabels GCM
8
9      IMPLICIT NONE
10#include "netcdf.inc"
11#include "dimensions.h"
12#include "paramet.h"
13#include "comgeom.h"
14#include "comvert.h"
15
16      integer nlevnc
17cModef 11-2-99      parameter (nlevnc=15)
18      parameter (nlevnc=21)
19      integer timestep,mode,l
20
21      real u(iip1,jjp1,llm),v(iip1,jjm,llm)
22      real t(iip1,jjp1,llm),ps(iip1,jjp1)
23      real masse(iip1,jjp1,llm),pk(iip1,jjp1,llm)
24
25      integer ncidu,varidu,ncidv,varidv,ncidt,varidt,ncidps,varidps
26      integer varidpl
27      save ncidu,varidu,ncidv,varidv,ncidt,varidt,ncidps,varidps
28      save varidpl
29
30      real*4 unc(iip1,jjp1,nlevnc),vnc(iip1,jjm,nlevnc)
31      real*4 tnc(iip1,jjp1,nlevnc),psnc(iip1,jjp1)
32      real*4 pl(nlevnc)
33
34      integer start(4),count(4),status
35
36      real rcode
37      logical first,ncep
38      save first,ncep
39cMod 11 2 99
40       data first,ncep/.true.,.false./
41c      data first,ncep/.true.,.true./
42      print*,'ok0'
43c -----------------------------------------------------------------
44c   Initialisation de la lecture des fichiers
45c -----------------------------------------------------------------
46      if (first) then
47            ncidu=NCOPN('u.nc',NCNOWRIT,rcode)
48            varidu=NCVID(ncidu,'UWND',rcode)
49            print*,'ncidu,varidu',ncidu,varidu
50         if (ncep) then
51            varidpl=NCVID(ncidu,'LEVEL',rcode)
52         else
53            varidpl=NCVID(ncidu,'PRESSURE',rcode)
54         endif
55            print*,'ncidu,varidpl',ncidu,varidpl
56            ncidv=NCOPN('v.nc',NCNOWRIT,rcode)
57            varidv=NCVID(ncidv,'VWND',rcode)
58            print*,'ncidv,varidv',ncidv,varidv
59            ncidt=NCOPN('T.nc',NCNOWRIT,rcode)
60            varidt=NCVID(ncidt,'AIR',rcode)
61            print*,'ncidt,varidt',ncidt,varidt
62c           ncidps=NCOPN('ps.nc',NCNOWRIT,rcode)
63c           varidps=NCVID(ncidps,'SP',rcode)
64c           print*,'ncidps,varidps',ncidps,varidps
65      endif
66
67      print*,'ok1'
68c -----------------------------------------------------------------
69c   lecture des champs u, v, T, ps
70c -----------------------------------------------------------------
71
72c  niveaux de pression
73      print*,'WARNING!!! Il n y a pas de test de coherence'
74      print*,'sur le nombre de niveaux verticaux dans le fichier nc'
75      status=NF_GET_VARA_REAL(ncidu,varidpl,1,nlevnc,pl)
76
77      start(1)=1
78      start(2)=1
79      start(3)=1
80      start(4)=timestep
81
82      count(1)=iip1
83      count(2)=jjp1
84      count(3)=nlevnc
85      count(4)=1
86
87c  u
88      status=NF_GET_VARA_REAL(ncidu,varidu,start,count,unc)
89      print*,'WARNING!!! Correction bidon pour palier a un '
90      print*,'probleme dans la creation des fichiers nc'
91      call correctbid(iim,jjp1*nlevnc,unc)
92c     call dump2d(iip1,jjp1,unc,'UNC COUCHE 1 ')
93c  T
94      status=NF_GET_VARA_REAL(ncidt,varidt,start,count,tnc)
95      call correctbid(iim,jjp1*nlevnc,tnc)
96c     call dump2d(iip1,jjp1,tnc,'TNC COUCHE 1 ')
97
98      count(2)=jjm
99c  v
100      status=NF_GET_VARA_REAL(ncidv,varidv,start,count,vnc)
101      call correctbid(iim,jjm*nlevnc,vnc)
102c     call dump2d(iip1,jjm,vnc,'VNC COUCHE 1 ')
103
104      start(3)=timestep
105      start(4)=0
106      count(2)=jjp1
107      count(3)=1
108      count(4)=0
109c  ps
110c     status=NF_GET_VARA_REAL(ncidps,varidps,start,count,psnc)
111c     call dump2d(iip1,jjp1,psnc,'PSNC COUCHE 1 ')
112c     call correctbid(iim,jjp1,psnc)
113
114c   Transformations
115      do l=1,nlevnc
116         pl(l)=pl(l)*100.
117      enddo
118      if(first) then
119         do l=1,nlevnc
120            print*,'PL(',l,')=',pl(l)
121         enddo
122      endif
123
124      call reanalyse2nat(nlevnc,unc,vnc,tnc,psnc,pl,u,v,t
125     s    ,ps,masse,pk)
126c     call dump2d(iip1,jjm,v,'V COUCHE 1 ')
127
128      if(mode.eq.1) call nat2gcm(u,v,t,pk,u,v,t)
129      print*,'TIMESTEP ',timestep
130      if(mode.ne.1) stop'mode pas egal 0'
131c     call dump2d(iip1,jjm,v,'VCOV COUCHE 1 ')
132
133c   Lignes introduites a une epoque pour un probleme oublie...
134c     do l=1,llm
135c        do i=1,iip1
136c           v(i,1,l)=0.
137c           v(i,jjm,l)=0.
138c        enddo
139c     enddo
140      first=.false.
141
142      return
143      end
144
145c -----------------------------------------------------------------
146      subroutine reanalyse2nat(nlevnc,unc,vnc,tnc,psnc,pl,u,v,t
147     s   ,ps,masse,pk)
148
149c -----------------------------------------------------------------
150c   Inversion Nord/sud de la grille + interpollation sur les niveaux
151c   verticaux du modele.
152c -----------------------------------------------------------------
153
154      implicit none
155
156#include "dimensions.h"
157#include "paramet.h"
158#include "comgeom2.h"
159#include "comvert.h"
160#include "comconst.h"
161
162      integer nlevnc
163      real u(iip1,jjp1,llm),v(iip1,jjm,llm)
164      real t(iip1,jjp1,llm),ps(iip1,jjp1)
165
166      real pl(nlevnc)
167      real unc(iip1,jjp1,nlevnc),vnc(iip1,jjm,nlevnc)
168      real tnc(iip1,jjp1,nlevnc),psnc(iip1,jjp1)
169
170      real zu(iip1,jjp1,llm),zv(iip1,jjm,llm)
171      real zt(iip1,jjp1,llm)
172
173      real pext(iip1,jjp1,llm)
174      real pbarx(iip1,jjp1,llm),pbary(iip1,jjm,llm)
175      real plunc(iip1,jjp1,llm),plvnc(iip1,jjm,llm)
176      real plsnc(iip1,jjp1,llm)
177
178      REAL alpha(iip1,jjp1,llm),beta(iip1,jjp1,llm)
179      real p(iip1,jjp1,llmp1),pk(iip1,jjp1,llm),pks(iip1,jjp1)
180      real pkf(iip1,jjp1,llm)
181      real masse(iip1,jjp1,llm),pls(iip1,jjp1,llm)
182      real prefkap,unskap
183
184      integer i,j,l
185
186
187c -----------------------------------------------------------------
188c   calcul de la pression au milieu des couches.
189c -----------------------------------------------------------------
190
191c     do j=1,jjp1
192c        do i=1,iim
193c           ps(i,j)=psnc(i,jjp1+1-j)
194c        enddo
195c        ps(iip1,j)=ps(1,j)
196c     enddo
197
198      CALL pression( ip1jmp1, ap, bp, ps, p )
199      call massdair(p,masse)
200      CALL exner_hyb(ip1jmp1,ps,p,alpha,beta,pks,pk,pkf)
201c    ....  Calcul de pls , pression au milieu des couches ,en Pascals
202      unskap=1./kappa
203      prefkap =  preff  ** kappa
204c     PRINT *,' Pref kappa unskap  ',preff,kappa,unskap
205      DO l = 1, llm
206       DO j=1,jjp1
207        DO i =1, iip1
208        pls(i,j,l) = preff * ( pk(i,j,l)/cpp) ** unskap
209        ENDDO
210       ENDDO
211       ENDDO
212
213
214
215c -----------------------------------------------------------------
216c   calcul des pressions pour les grilles u et v
217c -----------------------------------------------------------------
218
219      do l=1,llm
220      do j=1,jjp1
221         do i=1,iip1
222            pext(i,j,l)=pls(i,j,l)*aire(i,j)
223         enddo
224      enddo
225      enddo
226      call massbar(pext, pbarx, pbary )
227      do l=1,llm
228      do j=1,jjp1
229         do i=1,iip1
230            plunc(i,jjp1+1-j,l)=pbarx(i,j,l)/aireu(i,j)
231            plsnc(i,jjp1+1-j,l)=pls(i,j,l)
232         enddo
233      enddo
234      enddo
235      do l=1,llm
236      do j=1,jjm
237         do i=1,iip1
238            plvnc(i,jjm+1-j,l)=pbary(i,j,l)/airev(i,j)
239         enddo
240      enddo
241      enddo
242
243c -----------------------------------------------------------------
244      call pres2lev(unc,zu,nlevnc,llm,pl,plunc,iip1,jjp1)
245      call pres2lev(vnc,zv,nlevnc,llm,pl,plvnc,iip1,jjm )
246      call pres2lev(tnc,zt,nlevnc,llm,pl,plsnc,iip1,jjp1)
247
248c     call dump2d(iip1,jjp1,ps,'PS    ')
249c     call dump2d(iip1,jjp1,psu,'PS    ')
250c     call dump2d(iip1,jjm,psv,'PS    ')
251c  Inversion Nord/Sud
252      do l=1,llm
253         do j=1,jjp1
254            do i=1,iim
255               u(i,j,l)=zu(i,jjp1+1-j,l)
256               t(i,j,l)=zt(i,jjp1+1-j,l)
257            enddo
258            u(iip1,j,l)=u(1,j,l)
259            t(iip1,j,l)=t(1,j,l)
260         enddo
261      enddo
262
263      do l=1,llm
264         do j=1,jjm
265            do i=1,iim
266               v(i,j,l)=zv(i,jjm+1-j,l)
267            enddo
268            v(iip1,j,l)=v(1,j,l)
269         enddo
270      enddo
271
272      return
273      end
274
275      subroutine nat2gcm(u,v,t,pk,ucov,vcov,teta)
276
277      implicit none
278
279#include "dimensions.h"
280#include "paramet.h"
281#include "comgeom2.h"
282#include "comconst.h"
283#include "comvert.h"
284
285      real u(iip1,jjp1,llm),v(iip1,jjm,llm)
286      real t(iip1,jjp1,llm),pk(iip1,jjp1,llm)
287
288      real ucov(iip1,jjp1,llm),vcov(iip1,jjm,llm)
289      real teta(iip1,jjp1,llm)
290
291      integer i,j,l
292
293
294c   calcul de ucov et de la temperature potentielle
295      do l=1,llm
296         do j=1,jjp1
297            do i=1,iim
298               ucov(i,j,l)=u(i,j,l)*cu(i,j)
299               teta(i,j,l)=t(i,j,l)*cpp/pk(i,j,l)
300            enddo
301            ucov(iip1,j,l)=ucov(1,j,l)
302            teta(iip1,j,l)=teta(1,j,l)
303         enddo
304         do i=1,iip1
305            ucov(i,1,l)=0.
306            ucov(i,jjp1,l)=0.
307            teta(i,1,l)=teta(1,1,l)
308            teta(i,jjp1,l)=teta(1,jjp1,l)
309         enddo
310      enddo
311
312c   calcul de ucov
313      do l=1,llm
314         do j=1,jjm
315            do i=1,iim
316               vcov(i,j,l)=v(i,j,l)*cv(i,j)
317            enddo
318            vcov(iip1,j,l)=vcov(1,j,l)
319         enddo
320      enddo
321
322c     call dump2d(iip1,jjp1,teta,'TETA EN BAS   ')
323c     call dump2d(iip1,jjp1,teta(1,1,llm),'TETA EN HAUT   ')
324
325      return
326      end
327      subroutine correctbid(iim,nl,x)
328      integer iim,nl
329      real x(iim+1,nl)
330      integer i,l
331      real zz
332
333      do l=1,nl
334         do i=2,iim-1
335            if(abs(x(i,l)).gt.1.e10) then
336               zz=0.5*(x(i-1,l)+x(i+1,l))
337c              print*,'correction ',i,l,x(i,l),zz
338               x(i,l)=zz
339            endif
340         enddo
341      enddo
342      return
343      end
Note: See TracBrowser for help on using the repository browser.