source: LMDZ4/branches/LMDZ4-dev/libf/dyn3dpar/guide_p_mod.F90 @ 1172

Last change on this file since 1172 was 1172, checked in by yann meurdesoif, 15 years ago

ajout du nouveau guide de F. Caudron (version parallele)
YM

  • Property svn:executable set to *
File size: 55.2 KB
Line 
1!
2! $Header: /home/cvsroot/LMDZ4/libf/dyn3d/guide.F,v 1.3.4.1 2006/11/06 15:51:16 fairhead Exp $
3!
4MODULE guide_p_mod
5
6!=======================================================================
7!   Auteur:  F.Hourdin
8!            F. Codron 01/09
9!=======================================================================
10
11  USE ioipsl
12  USE getparam
13  USE Write_Field_p
14
15  IMPLICIT NONE
16
17! ---------------------------------------------
18! Declarations des cles logiques et parametres
19! ---------------------------------------------
20  INTEGER, PRIVATE, SAVE  :: iguide_read,iguide_int,iguide_sav
21  INTEGER, PRIVATE, SAVE  :: nlevnc
22  LOGICAL, PRIVATE, SAVE  :: guide_u,guide_v,guide_T,guide_Q,guide_P
23  LOGICAL, PRIVATE, SAVE  :: guide_hr,guide_teta 
24  LOGICAL, PRIVATE, SAVE  :: guide_BL,guide_reg,guide_add,gamma4,guide_zon
25  LOGICAL, PRIVATE, SAVE  :: guide_modele,invert_p,invert_y,ini_anal
26  LOGICAL, PRIVATE, SAVE  :: guide_2D,guide_sav
27 
28  REAL, PRIVATE, SAVE     :: tau_min_u,tau_max_u
29  REAL, PRIVATE, SAVE     :: tau_min_v,tau_max_v
30  REAL, PRIVATE, SAVE     :: tau_min_T,tau_max_T
31  REAL, PRIVATE, SAVE     :: tau_min_Q,tau_max_Q
32  REAL, PRIVATE, SAVE     :: tau_min_P,tau_max_P
33
34  REAL, PRIVATE, SAVE     :: lat_min_g,lat_max_g
35  REAL, PRIVATE, SAVE     :: lon_min_g,lon_max_g
36  REAL, PRIVATE, SAVE     :: tau_lon,tau_lat
37
38  REAL, ALLOCATABLE, DIMENSION(:), PRIVATE, SAVE     :: alpha_u,alpha_v
39  REAL, ALLOCATABLE, DIMENSION(:), PRIVATE, SAVE     :: alpha_T,alpha_Q
40  REAL, ALLOCATABLE, DIMENSION(:), PRIVATE, SAVE     :: alpha_P,alpha_pcor
41 
42! ---------------------------------------------
43! Variables de guidage
44! ---------------------------------------------
45! Variables des fichiers de guidage
46  REAL, ALLOCATABLE, DIMENSION(:,:,:), PRIVATE, SAVE   :: unat1,unat2
47  REAL, ALLOCATABLE, DIMENSION(:,:,:), PRIVATE, SAVE   :: vnat1,vnat2
48  REAL, ALLOCATABLE, DIMENSION(:,:,:), PRIVATE, SAVE   :: tnat1,tnat2
49  REAL, ALLOCATABLE, DIMENSION(:,:,:), PRIVATE, SAVE   :: qnat1,qnat2
50  REAL, ALLOCATABLE, DIMENSION(:,:),   PRIVATE, SAVE   :: psnat1,psnat2
51  REAL, ALLOCATABLE, DIMENSION(:),     PRIVATE, SAVE   :: apnc,bpnc
52! Variables aux dimensions du modele
53  REAL, ALLOCATABLE, DIMENSION(:,:),   PRIVATE, SAVE   :: ugui1,ugui2
54  REAL, ALLOCATABLE, DIMENSION(:,:),   PRIVATE, SAVE   :: vgui1,vgui2
55  REAL, ALLOCATABLE, DIMENSION(:,:),   PRIVATE, SAVE   :: tgui1,tgui2
56  REAL, ALLOCATABLE, DIMENSION(:,:),   PRIVATE, SAVE   :: qgui1,qgui2
57  REAL, ALLOCATABLE, DIMENSION(:),   PRIVATE, SAVE   :: psgui1,psgui2
58 
59  INTEGER,SAVE,PRIVATE :: ijb_u,ijb_v,ije_u,ije_v,ijn_u,ijn_v
60  INTEGER,SAVE,PRIVATE :: jjb_u,jjb_v,jje_u,jje_v,jjn_u,jjn_v
61
62
63CONTAINS
64!=======================================================================
65
66  SUBROUTINE guide_init
67
68    IMPLICIT NONE
69 
70    INCLUDE "dimensions.h"
71    INCLUDE "paramet.h"
72    INCLUDE "netcdf.inc"
73    INCLUDE "control.h"
74
75    INTEGER                :: error,ncidpl,rid,rcod
76    CHARACTER (len = 80)   :: abort_message
77    CHARACTER (len = 20)   :: modname = 'guide_init'
78
79! ---------------------------------------------
80! Lecture des parametres: 
81! ---------------------------------------------
82! Variables guidees
83    CALL getpar('guide_u',.true.,guide_u,'guidage de u')
84    CALL getpar('guide_v',.true.,guide_v,'guidage de v')
85    CALL getpar('guide_T',.true.,guide_T,'guidage de T')
86    CALL getpar('guide_P',.true.,guide_P,'guidage de P')
87    CALL getpar('guide_Q',.true.,guide_Q,'guidage de Q')
88    CALL getpar('guide_hr',.true.,guide_hr,'guidage de Q par H.R')
89    CALL getpar('guide_teta',.false.,guide_teta,'guidage de T par Teta')
90
91    CALL getpar('guide_add',.false.,guide_add,'for�age constant?')
92    CALL getpar('guide_zon',.false.,guide_zon,'guidage moy zonale')
93
94!   Constantes de rappel. Unite : fraction de jour
95    CALL getpar('tau_min_u',0.02,tau_min_u,'Cste de rappel min, u')
96    CALL getpar('tau_max_u', 10.,tau_max_u,'Cste de rappel max, u')
97    CALL getpar('tau_min_v',0.02,tau_min_v,'Cste de rappel min, v')
98    CALL getpar('tau_max_v', 10.,tau_max_v,'Cste de rappel max, v')
99    CALL getpar('tau_min_T',0.02,tau_min_T,'Cste de rappel min, T')
100    CALL getpar('tau_max_T', 10.,tau_max_T,'Cste de rappel max, T')
101    CALL getpar('tau_min_Q',0.02,tau_min_Q,'Cste de rappel min, Q')
102    CALL getpar('tau_max_Q', 10.,tau_max_Q,'Cste de rappel max, Q')
103    CALL getpar('tau_min_P',0.02,tau_min_P,'Cste de rappel min, P')
104    CALL getpar('tau_max_P', 10.,tau_max_P,'Cste de rappel max, P')
105    CALL getpar('gamma4',.false.,gamma4,'Zone sans rappel elargie')
106    CALL getpar('guide_BL',.true.,guide_BL,'guidage dans C.Lim')
107   
108! Sauvegarde du for�age
109    CALL getpar('guide_sav',.false.,guide_sav,'sauvegarde guidage')
110    CALL getpar('iguide_sav',4,iguide_sav,'freq. sauvegarde guidage')
111    ! frequences f>0: fx/jour; f<0: tous les f jours; f=0: 1 seule fois.
112    IF (iguide_sav.GT.0) THEN
113        iguide_sav=day_step/iguide_sav
114    ELSE
115        iguide_sav=day_step*iguide_sav
116    ENDIF
117
118! Guidage regional seulement (sinon constant ou suivant le zoom)
119    CALL getpar('guide_reg',.false.,guide_reg,'guidage regional')
120    CALL getpar('lat_min_g',-90.,lat_min_g,'Latitude mini guidage ')
121    CALL getpar('lat_max_g', 90.,lat_max_g,'Latitude maxi guidage ')
122    CALL getpar('lon_min_g',-180.,lon_min_g,'longitude mini guidage ')
123    CALL getpar('lon_max_g', 180.,lon_max_g,'longitude maxi guidage ')
124    CALL getpar('tau_lat', 5.,tau_lat,'raideur lat guide regional ')
125    CALL getpar('tau_lon', 5.,tau_lon,'raideur lon guide regional ')
126
127! Parametres pour lecture des fichiers
128    CALL getpar('iguide_read',4,iguide_read,'freq. lecture guidage')
129    CALL getpar('iguide_int',4,iguide_int,'freq. lecture guidage')
130    IF (iguide_int.GT.0) THEN
131        iguide_int=day_step/iguide_int
132    ELSE
133        iguide_int=day_step*iguide_int
134    ENDIF
135    CALL getpar('guide_modele',.false.,guide_modele,'guidage niveaux modele')
136    CALL getpar('ini_anal',.false.,ini_anal,'Etat initial = analyse')
137    CALL getpar('guide_invertp',.true.,invert_p,'niveaux p inverses')
138    CALL getpar('guide_inverty',.true.,invert_y,'inversion N-S')
139    CALL getpar('guide_2D',.false.,guide_2D,'fichier guidage lat-P')
140
141! ---------------------------------------------
142! Determination du nombre de niveaux verticaux
143! des fichiers guidage
144! ---------------------------------------------
145    ncidpl=-99
146    if (guide_modele) then
147       if (ncidpl.eq.-99) ncidpl=NCOPN('apbp.nc',NCNOWRIT,rcod)
148    else
149         if (guide_u) then
150           if (ncidpl.eq.-99) ncidpl=NCOPN('u.nc',NCNOWRIT,rcod)
151         elseif (guide_v) then
152           if (ncidpl.eq.-99) ncidpl=NCOPN('v.nc',NCNOWRIT,rcod)
153         elseif (guide_T) then
154           if (ncidpl.eq.-99) ncidpl=NCOPN('T.nc',NCNOWRIT,rcod)
155         elseif (guide_Q) then
156           if (ncidpl.eq.-99) ncidpl=NCOPN('hur.nc',NCNOWRIT,rcod)
157         endif
158    endif
159    error=NF_INQ_DIMID(ncidpl,'LEVEL',rid)
160    IF (error.NE.NF_NOERR) error=NF_INQ_DIMID(ncidpl,'PRESSURE',rid)
161    IF (error.NE.NF_NOERR) THEN
162        print *,'Guide: probleme lecture niveaux pression'
163        CALL abort_gcm(modname,abort_message,1)
164    ENDIF
165    error=NF_INQ_DIMLEN(ncidpl,rid,nlevnc)
166    print *,'Guide: nombre niveaux vert. nlevnc', nlevnc
167    CALL NCCLOS(ncidpl,rcod)
168
169! ---------------------------------------------
170! Allocation des variables
171! ---------------------------------------------
172    abort_message='pb in allocation guide'
173
174    ALLOCATE(apnc(nlevnc), stat = error)
175    IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
176    ALLOCATE(bpnc(nlevnc), stat = error)
177    IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
178    apnc=0.;bpnc=0.
179
180    ALLOCATE(alpha_pcor(llm), stat = error)
181    IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
182    ALLOCATE(alpha_u(ip1jmp1), stat = error)
183    IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
184    ALLOCATE(alpha_v(ip1jm), stat = error)
185    IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
186    ALLOCATE(alpha_T(ip1jmp1), stat = error)
187    IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
188    ALLOCATE(alpha_Q(ip1jmp1), stat = error)
189    IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
190    ALLOCATE(alpha_P(ip1jmp1), stat = error)
191    IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
192    alpha_u=0.;alpha_v=0;alpha_T=0;alpha_Q=0;alpha_P=0
193   
194    IF (guide_u) THEN
195        ALLOCATE(unat1(iip1,jjp1,nlevnc), stat = error)
196        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
197        ALLOCATE(ugui1(ip1jmp1,llm), stat = error)
198        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
199        ALLOCATE(unat2(iip1,jjp1,nlevnc), stat = error)
200        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
201        ALLOCATE(ugui2(ip1jmp1,llm), stat = error)
202        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
203        unat1=0.;unat2=0.;ugui1=0.;ugui2=0.
204    ENDIF
205
206    IF (guide_T) THEN
207        ALLOCATE(tnat1(iip1,jjp1,nlevnc), stat = error)
208        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
209        ALLOCATE(tgui1(ip1jmp1,llm), stat = error)
210        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
211        ALLOCATE(tnat2(iip1,jjp1,nlevnc), stat = error)
212        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
213        ALLOCATE(tgui2(ip1jmp1,llm), stat = error)
214        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
215        tnat1=0.;tnat2=0.;tgui1=0.;tgui2=0.
216    ENDIF
217     
218    IF (guide_Q) THEN
219        ALLOCATE(qnat1(iip1,jjp1,nlevnc), stat = error)
220        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
221        ALLOCATE(qgui1(ip1jmp1,llm), stat = error)
222        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
223        ALLOCATE(qnat2(iip1,jjp1,nlevnc), stat = error)
224        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
225        ALLOCATE(qgui2(ip1jmp1,llm), stat = error)
226        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
227        qnat1=0.;qnat2=0.;qgui1=0.;qgui2=0.
228    ENDIF
229
230    IF (guide_v) THEN
231        ALLOCATE(vnat1(iip1,jjm,nlevnc), stat = error)
232        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
233        ALLOCATE(vgui1(ip1jm,llm), stat = error)
234        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
235        ALLOCATE(vnat2(iip1,jjm,nlevnc), stat = error)
236        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
237        ALLOCATE(vgui2(ip1jm,llm), stat = error)
238        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
239        vnat1=0.;vnat2=0.;vgui1=0.;vgui2=0.
240    ENDIF
241
242    IF (guide_P.OR.guide_modele) THEN
243        ALLOCATE(psnat1(iip1,jjp1), stat = error)
244        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
245        ALLOCATE(psnat2(iip1,jjp1), stat = error)
246        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
247        psnat1=0.;psnat2=0.;
248    ENDIF
249    IF (guide_P) THEN
250        ALLOCATE(psgui2(ip1jmp1), stat = error)
251        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
252        ALLOCATE(psgui1(ip1jmp1), stat = error)
253        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
254        psgui1=0.;psgui2=0.
255    ENDIF
256
257! ---------------------------------------------
258!   Lecture du premier etat de guidage.
259! ---------------------------------------------
260    IF (guide_2D) THEN
261        CALL guide_read2D(1)
262    ELSE
263        CALL guide_read(1)
264    ENDIF
265    IF (guide_v) vnat1=vnat2
266    IF (guide_u) unat1=unat2
267    IF (guide_T) tnat1=tnat2
268    IF (guide_Q) qnat1=qnat2
269    IF (guide_P.OR.guide_modele) psnat1=psnat2
270
271  END SUBROUTINE guide_init
272
273!=======================================================================
274  SUBROUTINE guide_main(itau,ucov,vcov,teta,q,masse,ps)
275    use parallel
276   
277    IMPLICIT NONE
278 
279    INCLUDE "dimensions.h"
280    INCLUDE "paramet.h"
281    INCLUDE "control.h"
282    INCLUDE "comconst.h"
283    INCLUDE "comvert.h"
284
285    ! Variables entree
286    INTEGER,                       INTENT(IN)    :: itau !pas de temps
287    REAL, DIMENSION (ip1jmp1,llm), INTENT(INOUT) :: ucov,teta,q,masse
288    REAL, DIMENSION (ip1jm,llm),   INTENT(INOUT) :: vcov
289    REAL, DIMENSION (ip1jmp1),     INTENT(INOUT) :: ps
290
291    ! Variables locales
292    LOGICAL, SAVE :: first=.TRUE.
293    LOGICAL       :: f_out ! sortie guidage
294    REAL, DIMENSION (ip1jmp1,llm) :: f_add ! var aux: champ de guidage
295    REAL, DIMENSION (ip1jmp1,llm) :: p ! besoin si guide_P
296    ! Compteurs temps:
297    INTEGER, SAVE :: step_rea,count_no_rea,itau_test ! lecture guidage
298    REAL          :: ditau, dday_step
299    REAL          :: tau,reste ! position entre 2 etats de guidage
300    REAL, SAVE    :: factt ! pas de temps en fraction de jour
301   
302    INTEGER       :: l
303   
304    ijb_u=ij_begin ; ije_u=ij_end ; ijn_u=ije_u-ijb_u+1 
305    jjb_u=jj_begin ; jje_u=jj_end ; jjn_u=jje_u-jjb_u+1
306    ijb_v=ij_begin ; ije_v=ij_end ; ijn_v=ije_v-ijb_v+1   
307    jjb_v=jj_begin ; jje_v=jj_end ; jjn_v=jje_v-jjb_v+1
308    IF (pole_sud) THEN
309      ije_v=ij_end-iip1
310      jje_v=jj_end-1
311      ijn_v=ije_v-ijb_v+1
312      jjn_v=jje_v-jjb_v+1
313    ENDIF
314     
315   
316   
317     PRINT *,'---> on rentre dans guide_main'
318!    CALL AllGather_Field(ucov,ip1jmp1,llm)
319!    CALL AllGather_Field(vcov,ip1jm,llm)
320!    CALL AllGather_Field(teta,ip1jmp1,llm)
321!    CALL AllGather_Field(ps,ip1jmp1,1)
322!    CALL AllGather_Field(q,ip1jmp1,llm)
323   
324!-----------------------------------------------------------------------
325! Initialisations au premier passage
326!-----------------------------------------------------------------------
327
328    IF (first) THEN
329        first=.FALSE.
330        CALL guide_init
331        itau_test=1001
332        step_rea=1
333        count_no_rea=0
334! Calcul des constantes de rappel
335        factt=dtvr*iperiod/daysec
336        call tau2alpha(3,iip1,jjm ,factt,tau_min_v,tau_max_v,alpha_v)
337        call tau2alpha(2,iip1,jjp1,factt,tau_min_u,tau_max_u,alpha_u)
338        call tau2alpha(1,iip1,jjp1,factt,tau_min_T,tau_max_T,alpha_T)
339        call tau2alpha(1,iip1,jjp1,factt,tau_min_P,tau_max_P,alpha_P)
340        call tau2alpha(1,iip1,jjp1,factt,tau_min_Q,tau_max_Q,alpha_Q)
341! correction de rappel dans couche limite
342        if (guide_BL) then
343             alpha_pcor(:)=1.
344        else
345            do l=1,llm
346                alpha_pcor(l)=(1.+tanh((0.85-presnivs(l)/preff)/0.05))/2.
347            enddo
348        endif
349! ini_anal: etat initial egal au guidage       
350        IF (ini_anal) THEN
351            CALL guide_interp(ps,teta)
352            IF (guide_u) ucov(ijb_u:ije_u,:)=ugui2(ijb_u:ije_u,:)
353            IF (guide_v) vcov(ijb_v:ije_v,:)=ugui2(ijb_v:ije_v,:)
354            IF (guide_T) teta(ijb_u:ije_u,:)=tgui2(ijb_u:ije_u,:)
355            IF (guide_Q) q(ijb_u:ije_u,:)=qgui2(ijb_u:ije_u,:)
356            IF (guide_P) THEN
357                ps(ijb_u:ije_u)=psgui2(ijb_u:ije_u)
358                CALL pression_p(ip1jmp1,ap,bp,ps,p)
359                CALL massdair_p(p,masse)
360            ENDIF
361            RETURN
362        ENDIF
363! Verification structure guidage
364        IF (guide_u) THEN
365            CALL writefield_p('unat',unat1)
366            CALL writefield_p('ucov',RESHAPE(ucov,(/iip1,jjp1,llm/)))
367        ENDIF
368        IF (guide_T) THEN
369            CALL writefield_p('tnat',tnat1)
370            CALL writefield_p('teta',RESHAPE(teta,(/iip1,jjp1,llm/)))
371        ENDIF
372
373    ENDIF !first
374
375!-----------------------------------------------------------------------
376! Lecture des fichiers de guidage ?
377!-----------------------------------------------------------------------
378    IF (iguide_read.NE.0) THEN
379      ditau=real(itau)
380      dday_step=real(day_step)
381      IF (iguide_read.LT.0) THEN
382          tau=ditau/dday_step/FLOAT(iguide_read)
383      ELSE
384          tau=FLOAT(iguide_read)*ditau/dday_step
385      ENDIF
386      reste=tau-AINT(tau)
387      IF (reste.EQ.0.) THEN
388          IF (itau_test.EQ.itau) THEN
389              write(*,*)'deuxieme passage de advreel a itau=',itau
390              stop
391          ELSE
392              IF (guide_v) vnat1(jjb_v:jje_v,:,:)=vnat2(jjb_v:jje_v,:,:)
393              IF (guide_u) unat1(jjb_u:jje_u,:,:)=unat2(jjb_u:jje_u,:,:)
394              IF (guide_T) tnat1(jjb_u:jje_u,:,:)=tnat2(jjb_u:jje_u,:,:)
395              IF (guide_Q) qnat1(jjb_u:jje_u,:,:)=qnat2(jjb_u:jje_u,:,:)
396              IF (guide_P.OR.guide_modele) psnat1(jjb_u:jje_u,:)=psnat2(jjb_u:jje_u,:)
397              step_rea=step_rea+1
398              itau_test=itau
399              print*,'Lecture fichiers guidage, pas ',step_rea, &
400                    'apres ',count_no_rea,' non lectures'
401              IF (guide_2D) THEN
402                  CALL guide_read2D(step_rea)
403              ELSE
404                  CALL guide_read(step_rea)
405              ENDIF
406              count_no_rea=0
407          ENDIF
408      ELSE
409        count_no_rea=count_no_rea+1
410
411      ENDIF
412    ENDIF !iguide_read=0
413
414!-----------------------------------------------------------------------
415! Interpolation et conversion des champs de guidage
416!-----------------------------------------------------------------------
417    IF (MOD(itau,iguide_int).EQ.0) THEN
418        CALL guide_interp(ps,teta)
419    ENDIF
420! Repartition entre 2 etats de guidage
421    IF (iguide_read.NE.0) THEN
422        tau=reste
423    ELSE
424        tau=1.
425    ENDIF
426
427!-----------------------------------------------------------------------
428!   Ajout des champs de guidage
429!-----------------------------------------------------------------------
430! Sauvegarde du guidage?
431    f_out=((MOD(itau,iguide_sav).EQ.0).AND.guide_sav) 
432    IF (f_out) CALL guide_out("S",jjp1,1,ps)
433   
434    if (guide_u) then
435        if (guide_add) then
436           f_add(ijb_u:ije_u,:)=(1.-tau)*ugui1(ijb_u:ije_u,:)+tau*ugui2(ijb_u:ije_u,:)
437        else
438           f_add(ijb_u:ije_u,:)=(1.-tau)*ugui1(ijb_u:ije_u,:)+tau*ugui2(ijb_u:ije_u,:)-ucov(ijb_u:ije_u,:)
439        endif
440
441        if (guide_zon) CALL guide_zonave(1,jjp1,llm,f_add)
442        CALL guide_addfield(ip1jmp1,llm,f_add,alpha_u)
443        IF (f_out) CALL guide_out("U",jjp1,llm,f_add/factt)
444        ucov(ijb_u:ije_u,:)=ucov(ijb_u:ije_u,:)+f_add(ijb_u:ije_u,:)
445    endif
446
447    if (guide_T) then
448        if (guide_add) then
449           f_add(ijb_u:ije_u,:)=(1.-tau)*tgui1(ijb_u:ije_u,:)+tau*tgui2(ijb_u:ije_u,:)
450        else
451           f_add(ijb_u:ije_u,:)=(1.-tau)*tgui1(ijb_u:ije_u,:)+tau*tgui2(ijb_u:ije_u,:)-teta(ijb_u:ije_u,:)
452        endif
453        if (guide_zon) CALL guide_zonave(2,jjp1,llm,f_add)
454        CALL guide_addfield(ip1jmp1,llm,f_add,alpha_T)
455        IF (f_out) CALL guide_out("T",jjp1,llm,f_add/factt)
456        teta(ijb_u:ije_u,:)=teta(ijb_u:ije_u,:)+f_add(ijb_u:ije_u,:)
457    endif
458
459    if (guide_P) then
460        if (guide_add) then
461           f_add(ijb_u:ije_u,1)=(1.-tau)*psgui1(ijb_u:ije_u)+tau*psgui2(ijb_u:ije_u)
462        else
463           f_add(ijb_u:ije_u,1)=(1.-tau)*psgui1(ijb_u:ije_u)+tau*psgui2(ijb_u:ije_u)-ps(ijb_u:ije_u)
464        endif
465        if (guide_zon) CALL guide_zonave(2,jjp1,1,f_add(1:ip1jmp1,1))
466        CALL guide_addfield(ip1jmp1,1,f_add(1:ip1jmp1,1),alpha_P)
467        IF (f_out) CALL guide_out("P",jjp1,1,f_add(1:ip1jmp1,1)/factt)
468        ps(ijb_u:ije_u)=ps(ijb_u:ije_u)+f_add(ijb_u:ije_u,1)
469        CALL pression_p(ip1jmp1,ap,bp,ps,p)
470        CALL massdair_p(p,masse)
471    endif
472
473    if (guide_Q) then
474        if (guide_add) then
475           f_add(ijb_u:ije_u,:)=(1.-tau)*qgui1(ijb_u:ije_u,:)+tau*qgui2(ijb_u:ije_u,:)
476        else
477           f_add(ijb_u:ije_u,:)=(1.-tau)*qgui1(ijb_u:ije_u,:)+tau*qgui2(ijb_u:ije_u,:)-q(ijb_u:ije_u,:)
478        endif
479        if (guide_zon) CALL guide_zonave(2,jjp1,llm,f_add)
480        CALL guide_addfield(ip1jmp1,llm,f_add,alpha_Q)
481        IF (f_out) CALL guide_out("Q",jjp1,llm,f_add/factt)
482        q(ijb_u:ije_u,:)=q(ijb_u:ije_u,:)+f_add(ijb_u:ije_u,:)
483    endif
484
485    if (guide_v) then
486        if (guide_add) then
487           f_add(ijb_v:ije_v,:)=(1.-tau)*vgui1(ijb_v:ije_v,:)+tau*vgui2(ijb_v:ije_v,:)
488        else
489           f_add(ijb_v:ije_v,:)=(1.-tau)*vgui1(ijb_v:ije_v,:)+tau*vgui2(ijb_v:ije_v,:)-vcov(ijb_v:ije_v,:)
490        endif
491       
492        if (guide_zon) CALL guide_zonave(2,jjm,llm,f_add(1:ip1jm,:))
493        CALL guide_addfield(ip1jm,llm,f_add(1:ip1jm,:),alpha_v)
494        IF (f_out) CALL guide_out("V",jjm,llm,f_add(1:ip1jm,:)/factt)
495        vcov(ijb_v:ije_v,:)=vcov(ijb_v:ije_v,:)+f_add(ijb_v:ije_v,:)
496    endif
497
498  END SUBROUTINE guide_main
499
500!=======================================================================
501  SUBROUTINE guide_addfield(hsize,vsize,field,alpha)
502! field1=a*field1+alpha*field2
503
504    IMPLICIT NONE
505    INCLUDE "dimensions.h"
506    INCLUDE "paramet.h"
507
508    ! input variables
509    INTEGER,                      INTENT(IN)    :: hsize
510    INTEGER,                      INTENT(IN)    :: vsize
511    REAL, DIMENSION(hsize),       INTENT(IN)    :: alpha
512    REAL, DIMENSION(hsize,vsize), INTENT(INOUT) :: field
513
514    ! Local variables
515    INTEGER :: l
516
517    IF (hsize==ip1jm) THEN
518      do l=1,vsize
519        field(ijb_v:ije_v,l)=alpha(ijb_v:ije_v)*field(ijb_v:ije_v,l)*alpha_pcor(l)
520      enddo
521    ELSE
522      do l=1,vsize
523        field(ijb_u:ije_u,l)=alpha(ijb_u:ije_u)*field(ijb_u:ije_u,l)*alpha_pcor(l)
524      enddo
525    ENDIF   
526
527  END SUBROUTINE guide_addfield
528
529!=======================================================================
530  SUBROUTINE guide_zonave(typ,hsize,vsize,field)
531
532    IMPLICIT NONE
533
534    INCLUDE "dimensions.h"
535    INCLUDE "paramet.h"
536    INCLUDE "comgeom.h"
537    INCLUDE "comconst.h"
538   
539    ! input/output variables
540    INTEGER,                           INTENT(IN)    :: typ
541    INTEGER,                           INTENT(IN)    :: vsize
542    INTEGER,                           INTENT(IN)    :: hsize
543    REAL, DIMENSION(hsize*iip1,vsize), INTENT(INOUT) :: field
544
545    ! Local variables
546    LOGICAL, SAVE                :: first=.TRUE.
547    INTEGER, DIMENSION (2), SAVE :: imin, imax ! averaging domain
548    INTEGER                      :: i,j,l,ij
549    REAL, DIMENSION (iip1)       :: lond       ! longitude in Deg.
550    REAL, DIMENSION (hsize,vsize):: fieldm     ! zon-averaged field
551
552    IF (first) THEN
553        first=.FALSE.
554!Compute domain for averaging
555        lond=rlonu*180./pi
556        imin(1)=1;imax(1)=iip1;
557        imin(2)=1;imax(2)=iip1;
558        IF (guide_reg) THEN
559            DO i=1,iim
560                IF (lond(i).LT.lon_min_g) imin(1)=i
561                IF (lond(i).LE.lon_max_g) imax(1)=i
562            ENDDO
563            lond=rlonv*180./pi
564            DO i=1,iim
565                IF (lond(i).LT.lon_min_g) imin(2)=i
566                IF (lond(i).LE.lon_max_g) imax(2)=i
567            ENDDO
568        ENDIF
569    ENDIF
570
571    fieldm=0.
572   
573    IF (hsize==jjm) THEN
574      DO l=1,vsize
575      ! Compute zonal average
576          DO j=jjb_v,jje_v
577              DO i=imin(typ),imax(typ)
578                  ij=(j-1)*iip1+i
579                  fieldm(j,l)=fieldm(j,l)+field(ij,l)
580              ENDDO
581          ENDDO
582          fieldm(:,l)=fieldm(:,l)/FLOAT(imax(typ)-imin(typ)+1)
583    ! Compute forcing
584          DO j=jjb_v,jje_v
585              DO i=1,iip1
586                  ij=(j-1)*iip1+i
587                  field(ij,l)=fieldm(j,l)
588              ENDDO
589          ENDDO
590      ENDDO
591    ELSE
592      DO l=1,vsize
593      ! Compute zonal average
594          DO j=jjb_v,jje_v
595              DO i=imin(typ),imax(typ)
596                  ij=(j-1)*iip1+i
597                  fieldm(j,l)=fieldm(j,l)+field(ij,l)
598              ENDDO
599          ENDDO
600          fieldm(:,l)=fieldm(:,l)/FLOAT(imax(typ)-imin(typ)+1)
601    ! Compute forcing
602          DO j=jjb_u,jje_u
603              DO i=1,iip1
604                  ij=(j-1)*iip1+i
605                  field(ij,l)=fieldm(j,l)
606              ENDDO
607          ENDDO
608      ENDDO
609    ENDIF   
610
611  END SUBROUTINE guide_zonave
612
613!=======================================================================
614  SUBROUTINE guide_interp(psi,teta)
615  USE parallel
616  USE mod_hallo
617  USE Bands
618  IMPLICIT NONE
619
620  include "dimensions.h"
621  include "paramet.h"
622  include "comvert.h"
623  include "comgeom2.h"
624  include "comconst.h"
625
626  REAL, DIMENSION (iip1,jjp1),     INTENT(IN) :: psi ! Psol gcm
627  REAL, DIMENSION (iip1,jjp1,llm), INTENT(IN) :: teta ! Temp. Pot. gcm
628
629  LOGICAL, SAVE                      :: first=.TRUE.
630  ! Variables pour niveaux pression:
631  REAL, DIMENSION (iip1,jjp1,nlevnc) :: plnc1,plnc2 !niveaux pression guidage
632  REAL, DIMENSION (iip1,jjp1,llm)    :: plunc,plsnc !niveaux pression modele
633  REAL, DIMENSION (iip1,jjm,llm)     :: plvnc       !niveaux pression modele
634  REAL, DIMENSION (iip1,jjp1,llmp1)  :: p           ! pression intercouches
635  REAL, DIMENSION (iip1,jjp1,llm)    :: pls, pext   ! var intermediaire
636  REAL, DIMENSION (iip1,jjp1,llm)    :: pbarx
637  REAL, DIMENSION (iip1,jjm,llm)     :: pbary
638  ! Variables pour fonction Exner (P milieu couche)
639  REAL, DIMENSION (iip1,jjp1,llm)    :: pk, pkf
640  REAL, DIMENSION (iip1,jjp1,llm)    :: alpha, beta
641  REAL, DIMENSION (iip1,jjp1)        :: pks   
642  REAL                               :: prefkap,unskap
643  ! Pression de vapeur saturante
644  REAL, DIMENSION (ip1jmp1,llm)      :: qsat
645  !Variables intermediaires interpolation
646  REAL, DIMENSION (iip1,jjp1,llm)    :: zu1,zu2
647  REAL, DIMENSION (iip1,jjm,llm)     :: zv1,zv2
648 
649  INTEGER                            :: i,j,l,ij
650  TYPE(Request) :: Req 
651
652    print *,'Guide: conversion variables guidage'
653! -----------------------------------------------------------------
654! Calcul des niveaux de pression champs guidage
655! -----------------------------------------------------------------
656if (guide_modele) then
657    do i=1,iip1
658        do j=jjb_u,jje_u
659            do l=1,nlevnc
660                plnc2(i,j,l)=apnc(l)+bpnc(l)*psnat2(i,j)
661                plnc1(i,j,l)=apnc(l)+bpnc(l)*psnat1(i,j)
662            enddo
663        enddo
664    enddo
665else
666    do i=1,iip1
667        do j=jjb_u,jje_u
668            do l=1,nlevnc
669                plnc2(i,j,l)=apnc(l)
670                plnc1(i,j,l)=apnc(l)
671           enddo
672        enddo
673    enddo
674
675endif
676    if (first) then
677        first=.FALSE.
678        print*,'Guide: verification ordre niveaux verticaux'
679        print*,'LMDZ :'
680        do l=1,llm
681            print*,'PL(',l,')=',(ap(l)+ap(l+1))/2. &
682                  +psi(1,jje_u)*(bp(l)+bp(l+1))/2.
683        enddo
684        print*,'Fichiers guidage'
685        do l=1,nlevnc
686             print*,'PL(',l,')=',plnc2(1,jjb_u,l)
687        enddo
688        print *,'inversion de l''ordre: invert_p=',invert_p
689        if (guide_u) then
690            do l=1,nlevnc
691                print*,'U(',l,')=',unat2(1,jjb_u,l)
692            enddo
693        endif
694        if (guide_T) then
695            do l=1,nlevnc
696                print*,'T(',l,')=',tnat2(1,jjb_u,l)
697            enddo
698        endif
699    endif
700   
701! -----------------------------------------------------------------
702! Calcul niveaux pression modele
703! -----------------------------------------------------------------
704    CALL pression_p( ip1jmp1, ap, bp, psi, p )
705    CALL exner_hyb_p(ip1jmp1,psi,p,alpha,beta,pks,pk,pkf)
706
707!    ....  Calcul de pls , pression au milieu des couches ,en Pascals
708    unskap=1./kappa
709    prefkap =  preff  ** kappa
710    DO l = 1, llm
711        DO j=jjb_u,jje_u
712            DO i =1, iip1
713                pls(i,j,l) = preff * ( pk(i,j,l)/cpp) ** unskap
714            ENDDO
715        ENDDO
716    ENDDO
717
718!   calcul des pressions pour les grilles u et v
719    do l=1,llm
720        do j=jjb_u,jje_u
721            do i=1,iip1
722                pext(i,j,l)=pls(i,j,l)*aire(i,j)
723            enddo
724        enddo
725    enddo
726
727     CALL Register_SwapFieldHallo(pext,pext,ip1jmp1,llm,jj_Nb_caldyn,0,1,Req)
728     CALL SendRequest(Req)
729     CALL WaitRequest(Req)
730
731     call massbar_p(pext, pbarx, pbary )
732    do l=1,llm
733        do j=jjb_u,jje_u
734            do i=1,iip1
735                plunc(i,j,l)=pbarx(i,j,l)/aireu(i,j)
736                plsnc(i,j,l)=pls(i,j,l)
737            enddo
738        enddo
739    enddo
740    do l=1,llm
741        do j=jjb_v,jje_v
742            do i=1,iip1
743                plvnc(i,j,l)=pbary(i,j,l)/airev(i,j)
744            enddo
745        enddo
746    enddo
747
748! -----------------------------------------------------------------
749! Interpolation champs guidage sur niveaux modele (+inversion N/S)
750! Conversion en variables gcm (ucov, vcov...)
751! -----------------------------------------------------------------
752    if (guide_P) then
753        do j=jjb_u,jje_u
754            do i=1,iim
755                ij=(j-1)*iip1+i
756                psgui1(ij)=psnat1(i,j)
757                psgui2(ij)=psnat2(i,j)
758            enddo
759            psgui1(iip1*j)=psnat1(1,j)
760            psgui2(iip1*j)=psnat2(1,j)
761        enddo
762    endif
763
764    IF (guide_u) THEN
765        CALL pres2lev(unat1(:,jjb_u:jje_u,:),zu1(:,jjb_u:jje_u,:),nlevnc,llm,plnc1(:,jjb_u:jje_u,:),plunc(:,jjb_u:jje_u,:),iip1,jjn_u,invert_p)
766        CALL pres2lev(unat2(:,jjb_u:jje_u,:),zu2(:,jjb_u:jje_u,:),nlevnc,llm,plnc2(:,jjb_u:jje_u,:),plunc(:,jjb_u:jje_u,:),iip1,jjn_u,invert_p)
767
768        do l=1,llm
769            do j=jjb_u,jje_u
770                do i=1,iim
771                    ij=(j-1)*iip1+i
772                    ugui1(ij,l)=zu1(i,j,l)*cu(i,j)
773                    ugui2(ij,l)=zu2(i,j,l)*cu(i,j)
774                enddo
775                ugui1(j*iip1,l)=ugui1((j-1)*iip1+1,l)   
776                ugui2(j*iip1,l)=ugui2((j-1)*iip1+1,l)   
777            enddo
778            do i=1,iip1
779                ugui1(i,l)=0.
780                ugui1(ip1jm+i,l)=0.
781                ugui2(i,l)=0.
782                ugui2(ip1jm+i,l)=0.
783            enddo
784        enddo
785    ENDIF
786   
787    IF (guide_T) THEN
788        CALL pres2lev(tnat1(:,jjb_u:jje_u,:),zu1(:,jjb_u:jje_u,:),nlevnc,llm,plnc1(:,jjb_u:jje_u,:),plsnc(:,jjb_u:jje_u,:),iip1,jjn_u,invert_p)
789        CALL pres2lev(tnat2(:,jjb_u:jje_u,:),zu2(:,jjb_u:jje_u,:),nlevnc,llm,plnc2(:,jjb_u:jje_u,:),plsnc(:,jjb_u:jje_u,:),iip1,jjn_u,invert_p)
790
791        do l=1,llm
792            do j=jjb_u,jje_u
793                IF (guide_teta) THEN
794                    do i=1,iim
795                        ij=(j-1)*iip1+i
796                        tgui1(ij,l)=zu1(i,j,l)
797                        tgui2(ij,l)=zu2(i,j,l)
798                    enddo
799                ELSE
800                    do i=1,iim
801                        ij=(j-1)*iip1+i
802                        tgui1(ij,l)=zu1(i,j,l)*cpp/pk(i,j,l)
803                        tgui2(ij,l)=zu2(i,j,l)*cpp/pk(i,j,l)
804                    enddo
805                ENDIF
806                tgui1(j*iip1,l)=tgui1((j-1)*iip1+1,l)   
807                tgui2(j*iip1,l)=tgui2((j-1)*iip1+1,l)   
808            enddo
809            do i=1,iip1
810                tgui1(i,l)=tgui1(1,l)
811                tgui1(ip1jm+i,l)=tgui1(ip1jm+1,l)
812                tgui2(i,l)=tgui2(1,l)
813                tgui2(ip1jm+i,l)=tgui2(ip1jm+1,l)
814            enddo
815        enddo
816    ENDIF
817
818    IF (guide_v) THEN
819       
820        CALL pres2lev(vnat1(:,jjb_v:jje_v,:),zv1(:,jjb_v:jje_v,:),nlevnc,llm,plnc1(:,jjb_v:jje_v,:),plvnc(:,jjb_v:jje_v,:),iip1,jjn_v,invert_p)
821        CALL pres2lev(vnat2(:,jjb_v:jje_v,:),zv2(:,jjb_v:jje_v,:),nlevnc,llm,plnc2(:,jjb_v:jje_v,:),plvnc(:,jjb_v:jje_v,:),iip1,jjn_v,invert_p)
822
823        do l=1,llm
824            do j=jjb_v,jje_v
825                do i=1,iim
826                    ij=(j-1)*iip1+i
827                    vgui1(ij,l)=zv1(i,j,l)*cv(i,j)
828                    vgui2(ij,l)=zv2(i,j,l)*cv(i,j)
829                enddo
830                vgui1(j*iip1,l)=vgui1((j-1)*iip1+1,l)   
831                vgui2(j*iip1,l)=vgui2((j-1)*iip1+1,l)   
832            enddo
833        enddo
834    ENDIF
835   
836    IF (guide_Q) THEN
837        ! On suppose qu'on a la bonne variable dans le fichier de guidage:
838        ! Hum.Rel si guide_hr, Hum.Spec. sinon.
839        CALL pres2lev(qnat1(:,jjb_u:jje_u,:),zu1(:,jjb_u:jje_u,:),nlevnc,llm,plnc1(:,jjb_u:jje_u,:),plsnc(:,jjb_u:jje_u,:),iip1,jjn_u,invert_p)
840        CALL pres2lev(qnat2(:,jjb_u:jje_u,:),zu2(:,jjb_u:jje_u,:),nlevnc,llm,plnc2(:,jjb_u:jje_u,:),plsnc(:,jjb_u:jje_u,:),iip1,jjn_u,invert_p)
841
842        do l=1,llm
843            do j=jjb_u,jjb_v
844                do i=1,iim
845                    ij=(j-1)*iip1+i
846                    qgui1(ij,l)=zu1(i,j,l)
847                    qgui2(ij,l)=zu2(i,j,l)
848                enddo
849                qgui1(j*iip1,l)=qgui1((j-1)*iip1+1,l)   
850                qgui2(j*iip1,l)=qgui2((j-1)*iip1+1,l)   
851            enddo
852            do i=1,iip1
853                qgui1(i,l)=qgui1(1,l)
854                qgui1(ip1jm+i,l)=qgui1(ip1jm+1,l)
855                qgui2(i,l)=qgui2(1,l)
856                qgui2(ip1jm+i,l)=qgui2(ip1jm+1,l)
857            enddo
858        enddo
859        IF (guide_hr) THEN
860            CALL q_sat(iip1*jjn_u*llm,teta(:,jjb_u:jje_u,:)*pk(:,jjb_u:jje_u,:)/cpp,plsnc(:,jjb_u:jje_u,:),qsat(ijb_u:ije_u,:))
861            qgui1(ijb_u:ije_u,:)=qgui1(ijb_u:ije_u,:)*qsat(ijb_u:ije_u,:)*0.01 !hum. rel. en %
862            qgui2(ijb_u:ije_u,:)=qgui2(ijb_u:ije_u,:)*qsat(ijb_u:ije_u,:)*0.01
863        ENDIF
864    ENDIF
865
866  END SUBROUTINE guide_interp
867
868!=======================================================================
869  SUBROUTINE tau2alpha(typ,pim,pjm,factt,taumin,taumax,alpha)
870
871! Calcul des constantes de rappel alpha (=1/tau)
872
873    implicit none
874
875    include "dimensions.h"
876    include "paramet.h"
877    include "comconst.h"
878    include "comgeom2.h"
879    include "serre.h"
880
881! input arguments :
882    INTEGER, INTENT(IN) :: typ    ! u(2),v(3), ou scalaire(1)
883    INTEGER, INTENT(IN) :: pim,pjm ! dimensions en lat, lon
884    REAL, INTENT(IN)    :: factt   ! pas de temps en fraction de jour
885    REAL, INTENT(IN)    :: taumin,taumax
886! output arguments:
887    REAL, DIMENSION(pim,pjm), INTENT(OUT) :: alpha
888 
889!  local variables:
890    LOGICAL, SAVE               :: first=.TRUE.
891    REAL, SAVE                  :: gamma,dxdy_min,dxdy_max
892    REAL, DIMENSION (iip1,jjp1) :: zdx,zdy
893    REAL, DIMENSION (iip1,jjp1) :: dxdys,dxdyu
894    REAL, DIMENSION (iip1,jjm)  :: dxdyv
895    real dxdy_
896    real zlat,zlon
897    real alphamin,alphamax,xi
898    integer i,j,ilon,ilat
899
900
901    alphamin=factt/taumax
902    alphamax=factt/taumin
903    IF (guide_reg.OR.guide_add) THEN
904        alpha=alphamax
905!-----------------------------------------------------------------------
906! guide_reg: alpha=alpha_min dans region, 0. sinon.
907!-----------------------------------------------------------------------
908        IF (guide_reg) THEN
909            do j=1,pjm
910                do i=1,pim
911                    if (typ.eq.2) then
912                       zlat=rlatu(j)*180./pi
913                       zlon=rlonu(i)*180./pi
914                    elseif (typ.eq.1) then
915                       zlat=rlatu(j)*180./pi
916                       zlon=rlonv(i)*180./pi
917                    elseif (typ.eq.3) then
918                       zlat=rlatv(j)*180./pi
919                       zlon=rlonv(i)*180./pi
920                    endif
921                    alpha(i,j)=alphamax/16.* &
922                              (1.+tanh((zlat-lat_min_g)/tau_lat))* &
923                              (1.+tanh((lat_max_g-zlat)/tau_lat))* &
924                              (1.+tanh((zlon-lon_min_g)/tau_lon))* &
925                              (1.+tanh((lon_max_g-zlon)/tau_lon))
926                enddo
927            enddo
928        ENDIF
929    ELSE
930!-----------------------------------------------------------------------
931! Sinon, alpha varie entre alpha_min et alpha_max suivant le zoom.
932!-----------------------------------------------------------------------
933!Calcul de l'aire des mailles
934        do j=2,jjm
935            do i=2,iip1
936               zdx(i,j)=0.5*(cu(i-1,j)+cu(i,j))/cos(rlatu(j))
937            enddo
938            zdx(1,j)=zdx(iip1,j)
939        enddo
940        do j=2,jjm
941            do i=1,iip1
942               zdy(i,j)=0.5*(cv(i,j-1)+cv(i,j))
943            enddo
944        enddo
945        do i=1,iip1
946            zdx(i,1)=zdx(i,2)
947            zdx(i,jjp1)=zdx(i,jjm)
948            zdy(i,1)=zdy(i,2)
949            zdy(i,jjp1)=zdy(i,jjm)
950        enddo
951        do j=1,jjp1
952            do i=1,iip1
953               dxdys(i,j)=sqrt(zdx(i,j)*zdx(i,j)+zdy(i,j)*zdy(i,j))
954            enddo
955        enddo
956        IF (typ.EQ.2) THEN
957            do j=1,jjp1
958                do i=1,iim
959                   dxdyu(i,j)=0.5*(dxdys(i,j)+dxdys(i+1,j))
960                enddo
961                dxdyu(iip1,j)=dxdyu(1,j)
962            enddo
963        ENDIF
964        IF (typ.EQ.3) THEN
965            do j=1,jjm
966                do i=1,iip1
967                   dxdyv(i,j)=0.5*(dxdys(i,j)+dxdys(i,j+1))
968                enddo
969            enddo
970        ENDIF
971! Premier appel: calcul des aires min et max et de gamma.
972        IF (first) THEN
973            first=.FALSE.
974            ! coordonnees du centre du zoom
975            CALL coordij(clon,clat,ilon,ilat)
976            ! aire de la maille au centre du zoom
977            dxdy_min=dxdys(ilon,ilat)
978            ! dxdy maximale de la maille
979            dxdy_max=0.
980            do j=1,jjp1
981                do i=1,iip1
982                     dxdy_max=max(dxdy_max,dxdys(i,j))
983                enddo
984            enddo
985            ! Calcul de gamma
986            if (abs(grossismx-1.).lt.0.1.or.abs(grossismy-1.).lt.0.1) then
987                 print*,'ATTENTION modele peu zoome'
988                 print*,'ATTENTION on prend une constante de guidage cste'
989                 gamma=0.
990            else
991                gamma=(dxdy_max-2.*dxdy_min)/(dxdy_max-dxdy_min)
992                print*,'gamma=',gamma
993                if (gamma.lt.1.e-5) then
994                  print*,'gamma =',gamma,'<1e-5'
995                  stop
996                endif
997                gamma=log(0.5)/log(gamma)
998                if (gamma4) then
999                  gamma=min(gamma,4.)
1000                endif
1001                print*,'gamma=',gamma
1002            endif
1003        ENDIF !first
1004
1005        do j=1,pjm
1006            do i=1,pim
1007                if (typ.eq.1) then
1008                   dxdy_=dxdys(i,j)
1009                   zlat=rlatu(j)*180./pi
1010                elseif (typ.eq.2) then
1011                   dxdy_=dxdyu(i,j)
1012                   zlat=rlatu(j)*180./pi
1013                elseif (typ.eq.3) then
1014                   dxdy_=dxdyv(i,j)
1015                   zlat=rlatv(j)*180./pi
1016                endif
1017                if (abs(grossismx-1.).lt.0.1.or.abs(grossismy-1.).lt.0.1) then
1018                ! pour une grille reguliere, xi=xxx**0=1 -> alpha=alphamin
1019                    alpha(i,j)=alphamin
1020                else
1021                    xi=((dxdy_max-dxdy_)/(dxdy_max-dxdy_min))**gamma
1022                    xi=min(xi,1.)
1023                    if(lat_min_g.le.zlat .and. zlat.le.lat_max_g) then
1024                        alpha(i,j)=xi*alphamin+(1.-xi)*alphamax
1025                    else
1026                        alpha(i,j)=0.
1027                    endif
1028                endif
1029            enddo
1030        enddo
1031    ENDIF ! guide_reg
1032
1033  END SUBROUTINE tau2alpha
1034
1035!=======================================================================
1036  SUBROUTINE guide_read(timestep)
1037
1038    IMPLICIT NONE
1039
1040#include "netcdf.inc"
1041#include "dimensions.h"
1042#include "paramet.h"
1043
1044    INTEGER, INTENT(IN)   :: timestep
1045
1046    LOGICAL, SAVE         :: first=.TRUE.
1047! Identification fichiers et variables NetCDF:
1048    INTEGER, SAVE         :: ncidu,varidu,ncidv,varidv,ncidQ
1049    INTEGER, SAVE         :: varidQ,ncidt,varidt,ncidps,varidps
1050    INTEGER               :: ncidpl,varidpl,varidap,varidbp
1051! Variables auxiliaires NetCDF:
1052    INTEGER, DIMENSION(4) :: start,count
1053    INTEGER               :: status,rcode
1054
1055! -----------------------------------------------------------------
1056! Premier appel: initialisation de la lecture des fichiers
1057! -----------------------------------------------------------------
1058    if (first) then
1059         ncidpl=-99
1060         print*,'Guide: ouverture des fichiers guidage '
1061! Niveaux de pression si non constants
1062         if (guide_modele) then
1063             print *,'Lecture du guidage sur niveaux mod�le'
1064             ncidpl=NCOPN('apbp.nc',NCNOWRIT,rcode)
1065             varidap=NCVID(ncidpl,'AP',rcode)
1066             varidbp=NCVID(ncidpl,'BP',rcode)
1067             print*,'ncidpl,varidap',ncidpl,varidap
1068         endif
1069! Vent zonal
1070         if (guide_u) then
1071             ncidu=NCOPN('u.nc',NCNOWRIT,rcode)
1072             varidu=NCVID(ncidu,'UWND',rcode)
1073             print*,'ncidu,varidu',ncidu,varidu
1074             if (ncidpl.eq.-99) ncidpl=ncidu
1075         endif
1076! Vent meridien
1077         if (guide_v) then
1078             ncidv=NCOPN('v.nc',NCNOWRIT,rcode)
1079             varidv=NCVID(ncidv,'VWND',rcode)
1080             print*,'ncidv,varidv',ncidv,varidv
1081             if (ncidpl.eq.-99) ncidpl=ncidv
1082         endif
1083! Temperature
1084         if (guide_T) then
1085             ncidt=NCOPN('T.nc',NCNOWRIT,rcode)
1086             varidt=NCVID(ncidt,'AIR',rcode)
1087             print*,'ncidT,varidT',ncidt,varidt
1088             if (ncidpl.eq.-99) ncidpl=ncidt
1089         endif
1090! Humidite
1091         if (guide_Q) then
1092             ncidQ=NCOPN('hur.nc',NCNOWRIT,rcode)
1093             varidQ=NCVID(ncidQ,'RH',rcode)
1094             print*,'ncidQ,varidQ',ncidQ,varidQ
1095             if (ncidpl.eq.-99) ncidpl=ncidQ
1096         endif
1097! Pression de surface
1098         if ((guide_P).OR.(guide_modele)) then
1099             ncidps=NCOPN('ps.nc',NCNOWRIT,rcode)
1100             varidps=NCVID(ncidps,'SP',rcode)
1101             print*,'ncidps,varidps',ncidps,varidps
1102         endif
1103! Coordonnee verticale
1104         if (.not.guide_modele) then
1105              varidpl=NCVID(ncidpl,'LEVEL',rcode)
1106              IF (rcode.NE.0) varidpl=NCVID(ncidpl,'PRESSURE',rcode)
1107              print*,'ncidpl,varidpl',ncidpl,varidpl
1108         endif
1109! Coefs ap, bp pour calcul de la pression aux differents niveaux
1110         if (guide_modele) then
1111#ifdef NC_DOUBLE
1112             status=NF_GET_VARA_DOUBLE(ncidpl,varidap,1,nlevnc,apnc)
1113             status=NF_GET_VARA_DOUBLE(ncidpl,varidbp,1,nlevnc,bpnc)
1114#else
1115             status=NF_GET_VARA_REAL(ncidpl,varidap,1,nlevnc,apnc)
1116             status=NF_GET_VARA_REAL(ncidpl,varidbp,1,nlevnc,bpnc)
1117#endif
1118         else
1119#ifdef NC_DOUBLE
1120             status=NF_GET_VARA_DOUBLE(ncidpl,varidpl,1,nlevnc,apnc)
1121#else
1122             status=NF_GET_VARA_REAL(ncidpl,varidpl,1,nlevnc,apnc)
1123#endif
1124             apnc=apnc*100.! conversion en Pascals
1125             bpnc(:)=0.
1126         endif
1127         first=.FALSE.
1128     endif ! (first)
1129
1130! -----------------------------------------------------------------
1131!   lecture des champs u, v, T, Q, ps
1132! -----------------------------------------------------------------
1133
1134!  dimensions pour les champs scalaires et le vent zonal
1135     start(1)=1
1136     start(2)=1
1137     start(3)=1
1138     start(4)=timestep
1139
1140     count(1)=iip1
1141     count(2)=jjp1
1142     count(3)=nlevnc
1143     count(4)=1
1144
1145!  Vent zonal
1146     if (guide_u) then
1147#ifdef NC_DOUBLE
1148         status=NF_GET_VARA_DOUBLE(ncidu,varidu,start,count,unat2)
1149#else
1150         status=NF_GET_VARA_REAL(ncidu,varidu,start,count,unat2)
1151#endif
1152         IF (invert_y) THEN
1153           CALL invert_lat(iip1,jjp1,llm,unat2)
1154         ENDIF
1155
1156     endif
1157
1158!  Temperature
1159     if (guide_T) then
1160#ifdef NC_DOUBLE
1161         status=NF_GET_VARA_DOUBLE(ncidt,varidt,start,count,tnat2)
1162#else
1163         status=NF_GET_VARA_REAL(ncidt,varidt,start,count,tnat2)
1164#endif
1165         IF (invert_y) THEN
1166           CALL invert_lat(iip1,jjp1,llm,tnat2)
1167         ENDIF
1168     endif
1169
1170!  Humidite
1171     if (guide_Q) then
1172#ifdef NC_DOUBLE
1173         status=NF_GET_VARA_DOUBLE(ncidQ,varidQ,start,count,qnat2)
1174#else
1175         status=NF_GET_VARA_REAL(ncidQ,varidQ,start,count,qnat2)
1176#endif
1177         IF (invert_y) THEN
1178           CALL invert_lat(iip1,jjp1,llm,qnat2)
1179         ENDIF
1180
1181     endif
1182
1183!  Vent meridien
1184     if (guide_v) then
1185         count(2)=jjm
1186#ifdef NC_DOUBLE
1187         status=NF_GET_VARA_DOUBLE(ncidv,varidv,start,count,vnat2)
1188#else
1189         status=NF_GET_VARA_REAL(ncidv,varidv,start,count,vnat2)
1190#endif
1191         IF (invert_y) THEN
1192           CALL invert_lat(iip1,jjm,llm,vnat2)
1193         ENDIF
1194     endif
1195
1196!  Pression de surface
1197     if ((guide_P).OR.(guide_modele))  then
1198         start(3)=timestep
1199         start(4)=0
1200         count(2)=jjp1
1201         count(3)=1
1202         count(4)=0
1203#ifdef NC_DOUBLE
1204         status=NF_GET_VARA_DOUBLE(ncidps,varidps,start,count,psnat2)
1205#else
1206         status=NF_GET_VARA_REAL(ncidps,varidps,start,count,psnat2)
1207#endif
1208         IF (invert_y) THEN
1209           CALL invert_lat(iip1,jjp1,1,psnat2)
1210         ENDIF
1211     endif
1212
1213  END SUBROUTINE guide_read
1214
1215!=======================================================================
1216  SUBROUTINE guide_read2D(timestep)
1217
1218    IMPLICIT NONE
1219
1220#include "netcdf.inc"
1221#include "dimensions.h"
1222#include "paramet.h"
1223
1224    INTEGER, INTENT(IN)   :: timestep
1225
1226    LOGICAL, SAVE         :: first=.TRUE.
1227! Identification fichiers et variables NetCDF:
1228    INTEGER, SAVE         :: ncidu,varidu,ncidv,varidv,ncidQ
1229    INTEGER, SAVE         :: varidQ,ncidt,varidt,ncidps,varidps
1230    INTEGER               :: ncidpl,varidpl,varidap,varidbp
1231! Variables auxiliaires NetCDF:
1232    INTEGER, DIMENSION(4) :: start,count
1233    INTEGER               :: status,rcode
1234! Variables for 3D extension:
1235    REAL, DIMENSION (jjp1,llm) :: zu
1236    REAL, DIMENSION (jjm,llm)  :: zv
1237    INTEGER               :: i
1238
1239! -----------------------------------------------------------------
1240! Premier appel: initialisation de la lecture des fichiers
1241! -----------------------------------------------------------------
1242    if (first) then
1243         ncidpl=-99
1244         print*,'Guide: ouverture des fichiers guidage '
1245! Niveaux de pression si non constants
1246         if (guide_modele) then
1247             print *,'Lecture du guidage sur niveaux mod�le'
1248             ncidpl=NCOPN('apbp.nc',NCNOWRIT,rcode)
1249             varidap=NCVID(ncidpl,'AP',rcode)
1250             varidbp=NCVID(ncidpl,'BP',rcode)
1251             print*,'ncidpl,varidap',ncidpl,varidap
1252         endif
1253! Vent zonal
1254         if (guide_u) then
1255             ncidu=NCOPN('u.nc',NCNOWRIT,rcode)
1256             varidu=NCVID(ncidu,'UWND',rcode)
1257             print*,'ncidu,varidu',ncidu,varidu
1258             if (ncidpl.eq.-99) ncidpl=ncidu
1259         endif
1260! Vent meridien
1261         if (guide_v) then
1262             ncidv=NCOPN('v.nc',NCNOWRIT,rcode)
1263             varidv=NCVID(ncidv,'VWND',rcode)
1264             print*,'ncidv,varidv',ncidv,varidv
1265             if (ncidpl.eq.-99) ncidpl=ncidv
1266         endif
1267! Temperature
1268         if (guide_T) then
1269             ncidt=NCOPN('T.nc',NCNOWRIT,rcode)
1270             varidt=NCVID(ncidt,'AIR',rcode)
1271             print*,'ncidT,varidT',ncidt,varidt
1272             if (ncidpl.eq.-99) ncidpl=ncidt
1273         endif
1274! Humidite
1275         if (guide_Q) then
1276             ncidQ=NCOPN('hur.nc',NCNOWRIT,rcode)
1277             varidQ=NCVID(ncidQ,'RH',rcode)
1278             print*,'ncidQ,varidQ',ncidQ,varidQ
1279             if (ncidpl.eq.-99) ncidpl=ncidQ
1280         endif
1281! Pression de surface
1282         if ((guide_P).OR.(guide_modele)) then
1283             ncidps=NCOPN('ps.nc',NCNOWRIT,rcode)
1284             varidps=NCVID(ncidps,'SP',rcode)
1285             print*,'ncidps,varidps',ncidps,varidps
1286         endif
1287! Coordonnee verticale
1288         if (.not.guide_modele) then
1289              varidpl=NCVID(ncidpl,'LEVEL',rcode)
1290              IF (rcode.NE.0) varidpl=NCVID(ncidpl,'PRESSURE',rcode)
1291              print*,'ncidpl,varidpl',ncidpl,varidpl
1292         endif
1293! Coefs ap, bp pour calcul de la pression aux differents niveaux
1294         if (guide_modele) then
1295#ifdef NC_DOUBLE
1296             status=NF_GET_VARA_DOUBLE(ncidpl,varidap,1,nlevnc,apnc)
1297             status=NF_GET_VARA_DOUBLE(ncidpl,varidbp,1,nlevnc,bpnc)
1298#else
1299             status=NF_GET_VARA_REAL(ncidpl,varidap,1,nlevnc,apnc)
1300             status=NF_GET_VARA_REAL(ncidpl,varidbp,1,nlevnc,bpnc)
1301#endif
1302         else
1303#ifdef NC_DOUBLE
1304             status=NF_GET_VARA_DOUBLE(ncidpl,varidpl,1,nlevnc,apnc)
1305#else
1306             status=NF_GET_VARA_REAL(ncidpl,varidpl,1,nlevnc,apnc)
1307#endif
1308             apnc=apnc*100.! conversion en Pascals
1309             bpnc(:)=0.
1310         endif
1311         first=.FALSE.
1312     endif ! (first)
1313
1314! -----------------------------------------------------------------
1315!   lecture des champs u, v, T, Q, ps
1316! -----------------------------------------------------------------
1317
1318!  dimensions pour les champs scalaires et le vent zonal
1319     start(1)=1
1320     start(2)=1
1321     start(3)=1
1322     start(4)=timestep
1323
1324     count(1)=1
1325     count(2)=jjp1
1326     count(3)=nlevnc
1327     count(4)=1
1328
1329!  Vent zonal
1330     if (guide_u) then
1331#ifdef NC_DOUBLE
1332         status=NF_GET_VARA_DOUBLE(ncidu,varidu,start,count,zu)
1333#else
1334         status=NF_GET_VARA_REAL(ncidu,varidu,start,count,zu)
1335#endif
1336         DO i=1,iip1
1337             unat2(i,:,:)=zu(:,:)
1338         ENDDO
1339
1340         IF (invert_y) THEN
1341           CALL invert_lat(iip1,jjp1,llm,unat2)
1342         ENDIF
1343
1344     endif
1345
1346!  Temperature
1347     if (guide_T) then
1348#ifdef NC_DOUBLE
1349         status=NF_GET_VARA_DOUBLE(ncidt,varidt,start,count,zu)
1350#else
1351         status=NF_GET_VARA_REAL(ncidt,varidt,start,count,zu)
1352#endif
1353         DO i=1,iip1
1354             tnat2(i,:,:)=zu(:,:)
1355         ENDDO
1356
1357         IF (invert_y) THEN
1358           CALL invert_lat(iip1,jjp1,llm,tnat2)
1359         ENDIF
1360
1361     endif
1362
1363!  Humidite
1364     if (guide_Q) then
1365#ifdef NC_DOUBLE
1366         status=NF_GET_VARA_DOUBLE(ncidQ,varidQ,start,count,zu)
1367#else
1368         status=NF_GET_VARA_REAL(ncidQ,varidQ,start,count,zu)
1369#endif
1370         DO i=1,iip1
1371             qnat2(i,:,:)=zu(:,:)
1372         ENDDO
1373         
1374         IF (invert_y) THEN
1375           CALL invert_lat(iip1,jjp1,llm,qnat2)
1376         ENDIF
1377
1378     endif
1379
1380!  Vent meridien
1381     if (guide_v) then
1382         count(2)=jjm
1383#ifdef NC_DOUBLE
1384         status=NF_GET_VARA_DOUBLE(ncidv,varidv,start,count,zv)
1385#else
1386         status=NF_GET_VARA_REAL(ncidv,varidv,start,count,zv)
1387#endif
1388         DO i=1,iip1
1389             vnat2(i,:,:)=zv(:,:)
1390         ENDDO
1391
1392         IF (invert_y) THEN
1393           CALL invert_lat(iip1,jjm,llm,vnat2)
1394         ENDIF
1395
1396     endif
1397
1398!  Pression de surface
1399     if ((guide_P).OR.(guide_modele))  then
1400         start(3)=timestep
1401         start(4)=0
1402         count(2)=jjp1
1403         count(3)=1
1404         count(4)=0
1405#ifdef NC_DOUBLE
1406         status=NF_GET_VARA_DOUBLE(ncidps,varidps,start,count,zu(:,1))
1407#else
1408         status=NF_GET_VARA_REAL(ncidps,varidps,start,count,zu(:,1))
1409#endif
1410         DO i=1,iip1
1411             psnat2(i,:)=zu(:,1)
1412         ENDDO
1413
1414         IF (invert_y) THEN
1415           CALL invert_lat(iip1,jjp1,1,psnat2)
1416         ENDIF
1417
1418     endif
1419
1420  END SUBROUTINE guide_read2D
1421 
1422!=======================================================================
1423  SUBROUTINE guide_out(varname,hsize,vsize,field)
1424    USE parallel
1425    IMPLICIT NONE
1426
1427    INCLUDE "dimensions.h"
1428    INCLUDE "paramet.h"
1429    INCLUDE "netcdf.inc"
1430    INCLUDE "comgeom2.h"
1431    INCLUDE "comconst.h"
1432    INCLUDE "comvert.h"
1433   
1434    ! Variables entree
1435    CHARACTER, INTENT(IN)                          :: varname
1436    INTEGER,   INTENT (IN)                         :: hsize,vsize
1437    REAL, DIMENSION (iip1,hsize,vsize), INTENT(IN) :: field
1438
1439    ! Variables locales
1440    INTEGER, SAVE :: timestep=0
1441    ! Identites fichier netcdf
1442    INTEGER       :: nid, id_lonu, id_lonv, id_latu, id_latv, id_tim, id_lev
1443    INTEGER       :: vid_lonu,vid_lonv,vid_latu,vid_latv,vid_cu,vid_cv,vid_lev
1444    INTEGER, DIMENSION (3) :: dim3
1445    INTEGER, DIMENSION (4) :: dim4,count,start
1446    INTEGER                :: ierr, varid
1447   
1448    CALL gather_field(field,iip1*hsize,vsize,0)
1449   
1450    IF (mpi_rank /= 0) RETURN
1451   
1452    print *,'Guide: output timestep',timestep,'var ',varname
1453    IF (timestep.EQ.0) THEN
1454! ----------------------------------------------
1455! initialisation fichier de sortie
1456! ----------------------------------------------
1457! Ouverture du fichier
1458        ierr=NF_CREATE("guide_ins.nc",NF_CLOBBER,nid)
1459! Definition des dimensions
1460        ierr=NF_DEF_DIM(nid,"LONU",iip1,id_lonu)
1461        ierr=NF_DEF_DIM(nid,"LONV",iip1,id_lonv)
1462        ierr=NF_DEF_DIM(nid,"LATU",jjp1,id_latu)
1463        ierr=NF_DEF_DIM(nid,"LATV",jjm,id_latv)
1464        ierr=NF_DEF_DIM(nid,"LEVEL",llm,id_lev)
1465        ierr=NF_DEF_DIM(nid,"TIME",NF_UNLIMITED,id_tim)
1466
1467! Creation des variables dimensions
1468        ierr=NF_DEF_VAR(nid,"LONU",NF_FLOAT,1,id_lonu,vid_lonu)
1469        ierr=NF_DEF_VAR(nid,"LONV",NF_FLOAT,1,id_lonv,vid_lonv)
1470        ierr=NF_DEF_VAR(nid,"LATU",NF_FLOAT,1,id_latu,vid_latu)
1471        ierr=NF_DEF_VAR(nid,"LATV",NF_FLOAT,1,id_latv,vid_latv)
1472        ierr=NF_DEF_VAR(nid,"LEVEL",NF_FLOAT,1,id_lev,vid_lev)
1473        ierr=NF_DEF_VAR(nid,"cu",NF_FLOAT,2,(/id_lonu,id_latu/),vid_cu)
1474        ierr=NF_DEF_VAR(nid,"cv",NF_FLOAT,2,(/id_lonv,id_latv/),vid_cv)
1475       
1476        ierr=NF_ENDDEF(nid)
1477
1478! Enregistrement des variables dimensions
1479#ifdef NC_DOUBLE
1480        ierr = NF_PUT_VAR_DOUBLE(nid,vid_lonu,rlonu*180./pi)
1481        ierr = NF_PUT_VAR_DOUBLE(nid,vid_lonv,rlonv*180./pi)
1482        ierr = NF_PUT_VAR_DOUBLE(nid,vid_latu,rlatu*180./pi)
1483        ierr = NF_PUT_VAR_DOUBLE(nid,vid_latv,rlatv*180./pi)
1484        ierr = NF_PUT_VAR_DOUBLE(nid,vid_lev,presnivs)
1485        ierr = NF_PUT_VAR_DOUBLE(nid,vid_cu,cu)
1486        ierr = NF_PUT_VAR_DOUBLE(nid,vid_cv,cv)
1487#else
1488        ierr = NF_PUT_VAR_REAL(nid,vid_lonu,rlonu*180./pi)
1489        ierr = NF_PUT_VAR_REAL(nid,vid_lonv,rlonv*180./pi)
1490        ierr = NF_PUT_VAR_REAL(nid,vid_latu,rlatu*180./pi)
1491        ierr = NF_PUT_VAR_REAL(nid,vid_latv,rlatv*180./pi)
1492        ierr = NF_PUT_VAR_REAL(nid,vid_lev,presnivs)
1493        ierr = NF_PUT_VAR_REAL(nid,vid_cu,cu)
1494        ierr = NF_PUT_VAR_REAL(nid,vid_cv,cv)
1495#endif
1496! --------------------------------------------------------------------
1497! Cr�ation des variables sauvegard�es
1498! --------------------------------------------------------------------
1499        ierr = NF_REDEF(nid)
1500! Surface pressure (GCM)
1501        dim3=(/id_lonv,id_latu,id_tim/)
1502        ierr = NF_DEF_VAR(nid,"SP",NF_FLOAT,3,dim3,varid)
1503! Surface pressure (guidage)
1504        IF (guide_P) THEN
1505            dim3=(/id_lonv,id_latu,id_tim/)
1506            ierr = NF_DEF_VAR(nid,"ps",NF_FLOAT,3,dim3,varid)
1507        ENDIF
1508! Zonal wind
1509        IF (guide_u) THEN
1510            dim4=(/id_lonu,id_latu,id_lev,id_tim/)
1511            ierr = NF_DEF_VAR(nid,"ucov",NF_FLOAT,4,dim4,varid)
1512        ENDIF
1513! Merid. wind
1514        IF (guide_v) THEN
1515            dim4=(/id_lonv,id_latv,id_lev,id_tim/)
1516            ierr = NF_DEF_VAR(nid,"vcov",NF_FLOAT,4,dim4,varid)
1517        ENDIF
1518! Pot. Temperature
1519        IF (guide_T) THEN
1520            dim4=(/id_lonv,id_latu,id_lev,id_tim/)
1521            ierr = NF_DEF_VAR(nid,"teta",NF_FLOAT,4,dim4,varid)
1522        ENDIF
1523! Specific Humidity
1524        IF (guide_Q) THEN
1525            dim4=(/id_lonv,id_latu,id_lev,id_tim/)
1526            ierr = NF_DEF_VAR(nid,"q",NF_FLOAT,4,dim4,varid)
1527        ENDIF
1528       
1529        ierr = NF_ENDDEF(nid)
1530        ierr = NF_CLOSE(nid)
1531    ENDIF ! timestep=0
1532
1533! --------------------------------------------------------------------
1534! Enregistrement du champ
1535! --------------------------------------------------------------------
1536    ierr=NF_OPEN("guide_ins.nc",NF_WRITE,nid)
1537
1538    SELECT CASE (varname)
1539    CASE ("S")
1540        timestep=timestep+1
1541        ierr = NF_INQ_VARID(nid,"SP",varid)
1542        start=(/1,1,timestep,0/)
1543        count=(/iip1,jjp1,1,0/)
1544#ifdef NC_DOUBLE
1545        ierr = NF_PUT_VARA_DOUBLE(nid,varid,start,count,field)
1546#else
1547        ierr = NF_PUT_VARA_REAL(nid,varid,start,count,field)
1548#endif
1549    CASE ("P")
1550        ierr = NF_INQ_VARID(nid,"ps",varid)
1551        start=(/1,1,timestep,0/)
1552        count=(/iip1,jjp1,1,0/)
1553#ifdef NC_DOUBLE
1554        ierr = NF_PUT_VARA_DOUBLE(nid,varid,start,count,field)
1555#else
1556        ierr = NF_PUT_VARA_REAL(nid,varid,start,count,field)
1557#endif
1558    CASE ("U")
1559        ierr = NF_INQ_VARID(nid,"ucov",varid)
1560        start=(/1,1,1,timestep/)
1561        count=(/iip1,jjp1,llm,1/)
1562#ifdef NC_DOUBLE
1563        ierr = NF_PUT_VARA_DOUBLE(nid,varid,start,count,field)
1564#else
1565        ierr = NF_PUT_VARA_REAL(nid,varid,start,count,field)
1566#endif
1567    CASE ("V")
1568        ierr = NF_INQ_VARID(nid,"vcov",varid)
1569        start=(/1,1,1,timestep/)
1570        count=(/iip1,jjm,llm,1/)
1571#ifdef NC_DOUBLE
1572        ierr = NF_PUT_VARA_DOUBLE(nid,varid,start,count,field)
1573#else
1574        ierr = NF_PUT_VARA_REAL(nid,varid,start,count,field)
1575#endif
1576    CASE ("T")
1577        ierr = NF_INQ_VARID(nid,"teta",varid)
1578        start=(/1,1,1,timestep/)
1579        count=(/iip1,jjp1,llm,1/)
1580#ifdef NC_DOUBLE
1581        ierr = NF_PUT_VARA_DOUBLE(nid,varid,start,count,field)
1582#else
1583        ierr = NF_PUT_VARA_REAL(nid,varid,start,count,field)
1584#endif
1585    CASE ("Q")
1586        ierr = NF_INQ_VARID(nid,"q",varid)
1587        start=(/1,1,1,timestep/)
1588        count=(/iip1,jjp1,llm,1/)
1589#ifdef NC_DOUBLE
1590        ierr = NF_PUT_VARA_DOUBLE(nid,varid,start,count,field)
1591#else
1592        ierr = NF_PUT_VARA_REAL(nid,varid,start,count,field)
1593#endif
1594    END SELECT
1595 
1596    ierr = NF_CLOSE(nid)
1597
1598  END SUBROUTINE guide_out
1599   
1600 
1601!===========================================================================
1602  subroutine correctbid(iim,nl,x)
1603    integer iim,nl
1604    real x(iim+1,nl)
1605    integer i,l
1606    real zz
1607
1608    do l=1,nl
1609        do i=2,iim-1
1610            if(abs(x(i,l)).gt.1.e10) then
1611               zz=0.5*(x(i-1,l)+x(i+1,l))
1612              print*,'correction ',i,l,x(i,l),zz
1613               x(i,l)=zz
1614            endif
1615         enddo
1616     enddo
1617     return
1618  end subroutine correctbid
1619
1620!===========================================================================
1621END MODULE guide_p_mod
Note: See TracBrowser for help on using the repository browser.