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

Last change on this file since 189 was 189, checked in by lmdzadmin, 23 years ago

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