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

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

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