source: LMDZ5/branches/testing/libf/dyn3dmem/guide_loc_mod.F90 @ 2258

Last change on this file since 2258 was 2160, checked in by Laurent Fairhead, 10 years ago

Merged trunk changes -r2070:2158 into testing branch. Compilation problems introduced by revision r2155 have been corrected by hand

  • Property copyright set to
    Name of program: LMDZ
    Creation date: 1984
    Version: LMDZ5
    License: CeCILL version 2
    Holder: Laboratoire de m\'et\'eorologie dynamique, CNRS, UMR 8539
    See the license file in the root directory
File size: 81.4 KB
Line 
1!
2! $Id$
3!
4MODULE guide_loc_mod
5
6!=======================================================================
7!   Auteur:  F.Hourdin
8!            F. Codron 01/09
9!=======================================================================
10
11  USE getparam
12  USE Write_Field_loc
13  use netcdf, only: nf90_nowrite, nf90_open, nf90_inq_varid, nf90_close
14  USE parallel_lmdz
15  USE pres2lev_mod
16
17  IMPLICIT NONE
18
19! ---------------------------------------------
20! Declarations des cles logiques et parametres
21! ---------------------------------------------
22  INTEGER, PRIVATE, SAVE  :: iguide_read,iguide_int,iguide_sav
23  INTEGER, PRIVATE, SAVE  :: nlevnc, guide_plevs
24  LOGICAL, PRIVATE, SAVE  :: guide_u,guide_v,guide_T,guide_Q,guide_P
25  LOGICAL, PRIVATE, SAVE  :: guide_hr,guide_teta 
26  LOGICAL, PRIVATE, SAVE  :: guide_BL,guide_reg,guide_add,gamma4,guide_zon
27  LOGICAL, PRIVATE, SAVE  :: invert_p,invert_y,ini_anal
28  LOGICAL, PRIVATE, SAVE  :: guide_2D,guide_sav,guide_modele
29 
30  REAL, PRIVATE, SAVE     :: tau_min_u,tau_max_u
31  REAL, PRIVATE, SAVE     :: tau_min_v,tau_max_v
32  REAL, PRIVATE, SAVE     :: tau_min_T,tau_max_T
33  REAL, PRIVATE, SAVE     :: tau_min_Q,tau_max_Q
34  REAL, PRIVATE, SAVE     :: tau_min_P,tau_max_P
35
36  REAL, PRIVATE, SAVE     :: lat_min_g,lat_max_g
37  REAL, PRIVATE, SAVE     :: lon_min_g,lon_max_g
38  REAL, PRIVATE, SAVE     :: tau_lon,tau_lat
39
40  REAL, ALLOCATABLE, DIMENSION(:), PRIVATE, SAVE     :: alpha_u,alpha_v
41  REAL, ALLOCATABLE, DIMENSION(:), PRIVATE, SAVE     :: alpha_T,alpha_Q
42  REAL, ALLOCATABLE, DIMENSION(:), PRIVATE, SAVE     :: alpha_P,alpha_pcor
43 
44! ---------------------------------------------
45! Variables de guidage
46! ---------------------------------------------
47! Variables des fichiers de guidage
48  REAL, ALLOCATABLE, DIMENSION(:,:,:), PRIVATE, SAVE   :: unat1,unat2
49  REAL, ALLOCATABLE, DIMENSION(:,:,:), PRIVATE, SAVE   :: vnat1,vnat2
50  REAL, ALLOCATABLE, DIMENSION(:,:,:), PRIVATE, SAVE   :: tnat1,tnat2
51  REAL, ALLOCATABLE, DIMENSION(:,:,:), PRIVATE, SAVE   :: qnat1,qnat2
52  REAL, ALLOCATABLE, DIMENSION(:,:,:), PRIVATE, SAVE   :: pnat1,pnat2
53  REAL, ALLOCATABLE, DIMENSION(:,:),   PRIVATE, SAVE   :: psnat1,psnat2
54  REAL, ALLOCATABLE, DIMENSION(:),     PRIVATE, SAVE   :: apnc,bpnc
55! Variables aux dimensions du modele
56  REAL, ALLOCATABLE, DIMENSION(:,:),   PRIVATE, SAVE   :: ugui1,ugui2
57  REAL, ALLOCATABLE, DIMENSION(:,:),   PRIVATE, SAVE   :: vgui1,vgui2
58  REAL, ALLOCATABLE, DIMENSION(:,:),   PRIVATE, SAVE   :: tgui1,tgui2
59  REAL, ALLOCATABLE, DIMENSION(:,:),   PRIVATE, SAVE   :: qgui1,qgui2
60  REAL, ALLOCATABLE, DIMENSION(:),   PRIVATE, SAVE   :: psgui1,psgui2
61 
62  INTEGER,SAVE,PRIVATE :: ijbu,ijbv,ijeu,ijev,ijnu,ijnv
63  INTEGER,SAVE,PRIVATE :: jjbu,jjbv,jjeu,jjev,jjnu,jjnv
64
65
66CONTAINS
67!=======================================================================
68
69  SUBROUTINE guide_init
70
71    USE control_mod
72
73    IMPLICIT NONE
74 
75    INCLUDE "dimensions.h"
76    INCLUDE "paramet.h"
77    INCLUDE "netcdf.inc"
78
79    ! For grossismx:
80    include "serre.h"
81
82    INTEGER                :: error,ncidpl,rid,rcod
83    CHARACTER (len = 80)   :: abort_message
84    CHARACTER (len = 20)   :: modname = 'guide_init'
85
86! ---------------------------------------------
87! Lecture des parametres: 
88! ---------------------------------------------
89! Variables guidees
90    CALL getpar('guide_u',.true.,guide_u,'guidage de u')
91    CALL getpar('guide_v',.true.,guide_v,'guidage de v')
92    CALL getpar('guide_T',.true.,guide_T,'guidage de T')
93    CALL getpar('guide_P',.true.,guide_P,'guidage de P')
94    CALL getpar('guide_Q',.true.,guide_Q,'guidage de Q')
95    CALL getpar('guide_hr',.true.,guide_hr,'guidage de Q par H.R')
96    CALL getpar('guide_teta',.false.,guide_teta,'guidage de T par Teta')
97
98    CALL getpar('guide_add',.false.,guide_add,'for�age constant?')
99    CALL getpar('guide_zon',.false.,guide_zon,'guidage moy zonale')
100    if (guide_zon .and. abs(grossismx - 1.) > 0.01) &
101         call abort_gcm("guide_init", &
102         "zonal nudging requires grid regular in longitude", 1)
103
104!   Constantes de rappel. Unite : fraction de jour
105    CALL getpar('tau_min_u',0.02,tau_min_u,'Cste de rappel min, u')
106    CALL getpar('tau_max_u', 10.,tau_max_u,'Cste de rappel max, u')
107    CALL getpar('tau_min_v',0.02,tau_min_v,'Cste de rappel min, v')
108    CALL getpar('tau_max_v', 10.,tau_max_v,'Cste de rappel max, v')
109    CALL getpar('tau_min_T',0.02,tau_min_T,'Cste de rappel min, T')
110    CALL getpar('tau_max_T', 10.,tau_max_T,'Cste de rappel max, T')
111    CALL getpar('tau_min_Q',0.02,tau_min_Q,'Cste de rappel min, Q')
112    CALL getpar('tau_max_Q', 10.,tau_max_Q,'Cste de rappel max, Q')
113    CALL getpar('tau_min_P',0.02,tau_min_P,'Cste de rappel min, P')
114    CALL getpar('tau_max_P', 10.,tau_max_P,'Cste de rappel max, P')
115    CALL getpar('gamma4',.false.,gamma4,'Zone sans rappel elargie')
116    CALL getpar('guide_BL',.true.,guide_BL,'guidage dans C.Lim')
117   
118! Sauvegarde du for�age
119    CALL getpar('guide_sav',.false.,guide_sav,'sauvegarde guidage')
120    CALL getpar('iguide_sav',4,iguide_sav,'freq. sauvegarde guidage')
121    ! frequences f>0: fx/jour; f<0: tous les f jours; f=0: 1 seule fois.
122    IF (iguide_sav.GT.0) THEN
123       iguide_sav=day_step/iguide_sav
124    ELSE if (iguide_sav == 0) then
125       iguide_sav = huge(0)
126    ELSE
127       iguide_sav=day_step*iguide_sav
128    ENDIF
129
130! Guidage regional seulement (sinon constant ou suivant le zoom)
131    CALL getpar('guide_reg',.false.,guide_reg,'guidage regional')
132    CALL getpar('lat_min_g',-90.,lat_min_g,'Latitude mini guidage ')
133    CALL getpar('lat_max_g', 90.,lat_max_g,'Latitude maxi guidage ')
134    CALL getpar('lon_min_g',-180.,lon_min_g,'longitude mini guidage ')
135    CALL getpar('lon_max_g', 180.,lon_max_g,'longitude maxi guidage ')
136    CALL getpar('tau_lat', 5.,tau_lat,'raideur lat guide regional ')
137    CALL getpar('tau_lon', 5.,tau_lon,'raideur lon guide regional ')
138
139! Parametres pour lecture des fichiers
140    CALL getpar('iguide_read',4,iguide_read,'freq. lecture guidage')
141    CALL getpar('iguide_int',4,iguide_int,'freq. interpolation vert')
142    IF (iguide_int.EQ.0) THEN
143        iguide_int=1
144    ELSEIF (iguide_int.GT.0) THEN
145        iguide_int=day_step/iguide_int
146    ELSE
147        iguide_int=day_step*iguide_int
148    ENDIF
149    CALL getpar('guide_plevs',0,guide_plevs,'niveaux pression fichiers guidage')
150    ! Pour compatibilite avec ancienne version avec guide_modele
151    CALL getpar('guide_modele',.false.,guide_modele,'niveaux pression ap+bp*psol')
152    IF (guide_modele) THEN
153        guide_plevs=1
154    ENDIF
155    ! Fin raccord
156    CALL getpar('ini_anal',.false.,ini_anal,'Etat initial = analyse')
157    CALL getpar('guide_invertp',.true.,invert_p,'niveaux p inverses')
158    CALL getpar('guide_inverty',.true.,invert_y,'inversion N-S')
159    CALL getpar('guide_2D',.false.,guide_2D,'fichier guidage lat-P')
160
161! ---------------------------------------------
162! Determination du nombre de niveaux verticaux
163! des fichiers guidage
164! ---------------------------------------------
165    ncidpl=-99
166    if (guide_plevs.EQ.1) then
167       if (ncidpl.eq.-99) then
168          rcod=nf90_open('apbp.nc',Nf90_NOWRITe, ncidpl)
169          if (rcod.NE.NF_NOERR) THEN
170             print *,'Guide: probleme -> pas de fichier apbp.nc'
171             CALL abort_gcm(modname,abort_message,1)
172          endif
173       endif
174    elseif (guide_plevs.EQ.2) then
175       if (ncidpl.EQ.-99) then
176          rcod=nf90_open('P.nc',Nf90_NOWRITe,ncidpl)
177          if (rcod.NE.NF_NOERR) THEN
178             print *,'Guide: probleme -> pas de fichier P.nc'
179             CALL abort_gcm(modname,abort_message,1)
180          endif
181       endif
182    elseif (guide_u) then
183       if (ncidpl.eq.-99) then
184          rcod=nf90_open('u.nc',Nf90_NOWRITe,ncidpl)
185          if (rcod.NE.NF_NOERR) THEN
186             print *,'Guide: probleme -> pas de fichier u.nc'
187             CALL abort_gcm(modname,abort_message,1)
188          endif
189       endif
190    elseif (guide_v) then
191       if (ncidpl.eq.-99) then
192          rcod=nf90_open('v.nc',nf90_nowrite,ncidpl)
193          if (rcod.NE.NF_NOERR) THEN
194             print *,'Guide: probleme -> pas de fichier v.nc'
195             CALL abort_gcm(modname,abort_message,1)
196          endif
197       endif
198    elseif (guide_T) then
199       if (ncidpl.eq.-99) then
200          rcod=nf90_open('T.nc',nf90_nowrite,ncidpl)
201          if (rcod.NE.NF_NOERR) THEN
202             print *,'Guide: probleme -> pas de fichier T.nc'
203             CALL abort_gcm(modname,abort_message,1)
204          endif
205       endif
206    elseif (guide_Q) then
207       if (ncidpl.eq.-99) then
208          rcod=nf90_open('hur.nc',nf90_nowrite, ncidpl)
209          if (rcod.NE.NF_NOERR) THEN
210             print *,'Guide: probleme -> pas de fichier hur.nc'
211             CALL abort_gcm(modname,abort_message,1)
212          endif
213       endif
214    endif
215    error=NF_INQ_DIMID(ncidpl,'LEVEL',rid)
216    IF (error.NE.NF_NOERR) error=NF_INQ_DIMID(ncidpl,'PRESSURE',rid)
217    IF (error.NE.NF_NOERR) THEN
218        print *,'Guide: probleme lecture niveaux pression'
219        CALL abort_gcm(modname,abort_message,1)
220    ENDIF
221    error=NF_INQ_DIMLEN(ncidpl,rid,nlevnc)
222    print *,'Guide: nombre niveaux vert. nlevnc', nlevnc
223    rcod = nf90_close(ncidpl)
224
225! ---------------------------------------------
226! Allocation des variables
227! ---------------------------------------------
228    abort_message='pb in allocation guide'
229
230    ALLOCATE(apnc(nlevnc), stat = error)
231    IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
232    ALLOCATE(bpnc(nlevnc), stat = error)
233    IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
234    apnc=0.;bpnc=0.
235
236    ALLOCATE(alpha_pcor(llm), stat = error)
237    IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
238    ALLOCATE(alpha_u(ijb_u:ije_u), stat = error)
239    IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
240    ALLOCATE(alpha_v(ijb_v:ije_v), stat = error)
241    IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
242    ALLOCATE(alpha_T(ijb_u:ije_u), stat = error)
243    IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
244    ALLOCATE(alpha_Q(ijb_u:ije_u), stat = error)
245    IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
246    ALLOCATE(alpha_P(ijb_u:ije_u), stat = error)
247    IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
248    alpha_u=0.;alpha_v=0;alpha_T=0;alpha_Q=0;alpha_P=0
249   
250    IF (guide_u) THEN
251        ALLOCATE(unat1(iip1,jjb_u:jje_u,nlevnc), stat = error)
252        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
253        ALLOCATE(ugui1(ijb_u:ije_u,llm), stat = error)
254        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
255        ALLOCATE(unat2(iip1,jjb_u:jje_u,nlevnc), stat = error)
256        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
257        ALLOCATE(ugui2(ijb_u:ije_u,llm), stat = error)
258        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
259        unat1=0.;unat2=0.;ugui1=0.;ugui2=0.
260    ENDIF
261
262    IF (guide_T) THEN
263        ALLOCATE(tnat1(iip1,jjb_u:jje_u,nlevnc), stat = error)
264        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
265        ALLOCATE(tgui1(ijb_u:ije_u,llm), stat = error)
266        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
267        ALLOCATE(tnat2(iip1,jjb_u:jje_u,nlevnc), stat = error)
268        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
269        ALLOCATE(tgui2(ijb_u:ije_u,llm), stat = error)
270        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
271        tnat1=0.;tnat2=0.;tgui1=0.;tgui2=0.
272    ENDIF
273     
274    IF (guide_Q) THEN
275        ALLOCATE(qnat1(iip1,jjb_u:jje_u,nlevnc), stat = error)
276        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
277        ALLOCATE(qgui1(ijb_u:ije_u,llm), stat = error)
278        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
279        ALLOCATE(qnat2(iip1,jjb_u:jje_u,nlevnc), stat = error)
280        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
281        ALLOCATE(qgui2(ijb_u:ije_u,llm), stat = error)
282        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
283        qnat1=0.;qnat2=0.;qgui1=0.;qgui2=0.
284    ENDIF
285
286    IF (guide_v) THEN
287        ALLOCATE(vnat1(iip1,jjb_v:jje_v,nlevnc), stat = error)
288        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
289        ALLOCATE(vgui1(ijb_v:ije_v,llm), stat = error)
290        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
291        ALLOCATE(vnat2(iip1,jjb_v:jje_v,nlevnc), stat = error)
292        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
293        ALLOCATE(vgui2(ijb_v:ije_v,llm), stat = error)
294        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
295        vnat1=0.;vnat2=0.;vgui1=0.;vgui2=0.
296    ENDIF
297
298    IF (guide_plevs.EQ.2) THEN
299        ALLOCATE(pnat1(iip1,jjb_u:jje_u,nlevnc), stat = error)
300        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
301        ALLOCATE(pnat2(iip1,jjb_u:jje_u,nlevnc), stat = error)
302        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
303        pnat1=0.;pnat2=0.;
304    ENDIF
305
306    IF (guide_P.OR.guide_plevs.EQ.1) THEN
307        ALLOCATE(psnat1(iip1,jjb_u:jje_u), stat = error)
308        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
309        ALLOCATE(psnat2(iip1,jjb_u:jje_u), stat = error)
310        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
311        psnat1=0.;psnat2=0.;
312    ENDIF
313    IF (guide_P) THEN
314        ALLOCATE(psgui2(ijb_u:ije_u), stat = error)
315        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
316        ALLOCATE(psgui1(ijb_u:ije_u), stat = error)
317        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
318        psgui1=0.;psgui2=0.
319    ENDIF
320
321! ---------------------------------------------
322!   Lecture du premier etat de guidage.
323! ---------------------------------------------
324    IF (guide_2D) THEN
325        CALL guide_read2D(1)
326    ELSE
327        CALL guide_read(1)
328    ENDIF
329    IF (guide_v) vnat1=vnat2
330    IF (guide_u) unat1=unat2
331    IF (guide_T) tnat1=tnat2
332    IF (guide_Q) qnat1=qnat2
333    IF (guide_plevs.EQ.2) pnat1=pnat2
334    IF (guide_P.OR.guide_plevs.EQ.1) psnat1=psnat2
335
336  END SUBROUTINE guide_init
337
338!=======================================================================
339  SUBROUTINE guide_main(itau,ucov,vcov,teta,q,masse,ps)
340    use exner_hyb_loc_m, only: exner_hyb_loc
341    use exner_milieu_loc_m, only: exner_milieu_loc
342    USE parallel_lmdz
343    USE control_mod
344    USE write_field_loc
345   
346    IMPLICIT NONE
347 
348    INCLUDE "dimensions.h"
349    INCLUDE "paramet.h"
350    INCLUDE "comconst.h"
351    INCLUDE "comvert.h"
352
353    ! Variables entree
354    INTEGER,                           INTENT(IN)    :: itau !pas de temps
355    REAL, DIMENSION (ijb_u:ije_u,llm), INTENT(INOUT) :: ucov,teta,q,masse
356    REAL, DIMENSION (ijb_v:ije_v,llm), INTENT(INOUT) :: vcov
357    REAL, DIMENSION (ijb_u:ije_u),     INTENT(INOUT) :: ps
358
359    ! Variables locales
360    LOGICAL, SAVE :: first=.TRUE.
361!$OMP THREADPRIVATE(first)
362    LOGICAL       :: f_out ! sortie guidage
363    REAL, ALLOCATABLE, SAVE, DIMENSION (:,:) :: f_addu ! var aux: champ de guidage
364    REAL, ALLOCATABLE, SAVE, DIMENSION (:,:) :: f_addv ! var aux: champ de guidage
365    ! Variables pour fonction Exner (P milieu couche)
366    REAL, ALLOCATABLE, SAVE, DIMENSION (:,:,:)    :: pk
367    REAL, ALLOCATABLE, SAVE, DIMENSION (:,:)        :: pks   
368    REAL                               :: unskap
369    REAL, ALLOCATABLE, SAVE, DIMENSION (:,:)    :: p ! besoin si guide_P
370    ! Compteurs temps:
371    INTEGER, SAVE :: step_rea,count_no_rea,itau_test ! lecture guidage
372!$OMP THREADPRIVATE(step_rea,count_no_rea,itau_test)
373    REAL          :: ditau, dday_step
374    REAL          :: tau,reste ! position entre 2 etats de guidage
375    REAL, SAVE    :: factt ! pas de temps en fraction de jour
376!$OMP THREADPRIVATE(factt)
377   
378    INTEGER       :: i,j,l
379    INTEGER,EXTERNAL :: OMP_GET_THREAD_NUM
380       
381!$OMP MASTER   
382    ijbu=ij_begin ; ijeu=ij_end ; ijnu=ijeu-ijbu+1 
383    jjbu=jj_begin ; jjeu=jj_end ; jjnu=jjeu-jjbu+1
384    ijbv=ij_begin ; ijev=ij_end ; ijnv=ijev-ijbv+1   
385    jjbv=jj_begin ; jjev=jj_end ; jjnv=jjev-jjbv+1
386    IF (pole_sud) THEN
387      ijev=ij_end-iip1
388      jjev=jj_end-1
389      ijnv=ijev-ijbv+1
390      jjnv=jjev-jjbv+1
391    ENDIF
392!$OMP END MASTER
393!$OMP BARRIER
394     
395!    PRINT *,'---> on rentre dans guide_main'
396!    CALL AllGather_Field(ucov,ip1jmp1,llm)
397!    CALL AllGather_Field(vcov,ip1jm,llm)
398!    CALL AllGather_Field(teta,ip1jmp1,llm)
399!    CALL AllGather_Field(ps,ip1jmp1,1)
400!    CALL AllGather_Field(q,ip1jmp1,llm)
401   
402!-----------------------------------------------------------------------
403! Initialisations au premier passage
404!-----------------------------------------------------------------------
405
406    IF (first) THEN
407        first=.FALSE.
408!$OMP MASTER
409        ALLOCATE(f_addu(ijb_u:ije_u,llm) )
410        ALLOCATE(f_addv(ijb_v:ije_v,llm) )
411        ALLOCATE(pk(iip1,jjb_u:jje_u,llm)  )
412        ALLOCATE(pks(iip1,jjb_u:jje_u)  )
413        ALLOCATE(p(ijb_u:ije_u,llmp1) )
414        CALL guide_init
415!$OMP END MASTER
416!$OMP BARRIER
417        itau_test=1001
418        step_rea=1
419        count_no_rea=0
420! Calcul des constantes de rappel
421        factt=dtvr*iperiod/daysec
422!$OMP MASTER
423        call tau2alpha(3, iip1, jjb_v, jje_v, factt, tau_min_v, tau_max_v, alpha_v)
424        call tau2alpha(2, iip1, jjb_u, jje_u, factt, tau_min_u, tau_max_u, alpha_u)
425        call tau2alpha(1, iip1, jjb_u, jje_u, factt, tau_min_T, tau_max_T, alpha_T)
426        call tau2alpha(1, iip1, jjb_u, jje_u, factt, tau_min_P, tau_max_P, alpha_P)
427        call tau2alpha(1, iip1, jjb_u, jje_u, factt, tau_min_Q, tau_max_Q, alpha_Q)
428! correction de rappel dans couche limite
429        if (guide_BL) then
430             alpha_pcor(:)=1.
431        else
432            do l=1,llm
433                alpha_pcor(l)=(1.+tanh((0.85-presnivs(l)/preff)/0.05))/2.
434            enddo
435        endif
436!$OMP END MASTER
437!$OMP BARRIER
438! ini_anal: etat initial egal au guidage       
439        IF (ini_anal) THEN
440            CALL guide_interp(ps,teta)
441!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)           
442            DO l=1,llm
443              IF (guide_u) ucov(ijbu:ijeu,l)=ugui2(ijbu:ijeu,l)
444              IF (guide_v) vcov(ijbv:ijev,l)=ugui2(ijbv:ijev,l)
445              IF (guide_T) teta(ijbu:ijeu,l)=tgui2(ijbu:ijeu,l)
446              IF (guide_Q) q(ijbu:ijeu,l)=qgui2(ijbu:ijeu,l)
447            ENDDO
448           
449            IF (guide_P) THEN
450!$OMP MASTER
451                ps(ijbu:ijeu)=psgui2(ijbu:ijeu)
452!$OMP END MASTER
453!$OMP BARRIER
454                CALL pression_loc(ijnb_u,ap,bp,ps,p)
455                CALL massdair_loc(p,masse)
456!$OMP BARRIER
457            ENDIF
458            RETURN
459        ENDIF
460
461    ENDIF !first
462
463!-----------------------------------------------------------------------
464! Lecture des fichiers de guidage ?
465!-----------------------------------------------------------------------
466    IF (iguide_read.NE.0) THEN
467      ditau=real(itau)
468      dday_step=real(day_step)
469      IF (iguide_read.LT.0) THEN
470          tau=ditau/dday_step/REAL(iguide_read)
471      ELSE
472          tau=REAL(iguide_read)*ditau/dday_step
473      ENDIF
474      reste=tau-AINT(tau)
475      IF (reste.EQ.0.) THEN
476          IF (itau_test.EQ.itau) THEN
477              write(*,*)'deuxieme passage de advreel a itau=',itau
478              stop
479          ELSE
480!$OMP MASTER
481              IF (guide_v) vnat1(:,jjbv:jjev,:)=vnat2(:,jjbv:jjev,:)
482              IF (guide_u) unat1(:,jjbu:jjeu,:)=unat2(:,jjbu:jjeu,:)
483              IF (guide_T) tnat1(:,jjbu:jjeu,:)=tnat2(:,jjbu:jjeu,:)
484              IF (guide_Q) qnat1(:,jjbu:jjeu,:)=qnat2(:,jjbu:jjeu,:)
485              IF (guide_plevs.EQ.2) pnat1(:,jjbu:jjeu,:)=pnat2(:,jjbu:jjeu,:)
486              IF (guide_P.OR.guide_plevs.EQ.1) psnat1(:,jjbu:jjeu)=psnat2(:,jjbu:jjeu)
487!$OMP END MASTER
488!$OMP BARRIER
489              step_rea=step_rea+1
490              itau_test=itau
491              print*,'Lecture fichiers guidage, pas ',step_rea, &
492                    'apres ',count_no_rea,' non lectures'
493              IF (guide_2D) THEN
494!$OMP MASTER
495                  CALL guide_read2D(step_rea)
496!$OMP END MASTER
497!$OMP BARRIER
498              ELSE
499!$OMP MASTER
500                  CALL guide_read(step_rea)
501!$OMP END MASTER
502!$OMP BARRIER
503              ENDIF
504              count_no_rea=0
505          ENDIF
506      ELSE
507        count_no_rea=count_no_rea+1
508
509      ENDIF
510    ENDIF !iguide_read=0
511
512!-----------------------------------------------------------------------
513! Interpolation et conversion des champs de guidage
514!-----------------------------------------------------------------------
515    IF (MOD(itau,iguide_int).EQ.0) THEN
516        CALL guide_interp(ps,teta)
517    ENDIF
518! Repartition entre 2 etats de guidage
519    IF (iguide_read.NE.0) THEN
520        tau=reste
521    ELSE
522        tau=1.
523    ENDIF
524
525!    CALL WriteField_u('ucov_guide',ucov)
526!    CALL WriteField_v('vcov_guide',vcov)
527!    CALL WriteField_u('teta_guide',teta)
528!    CALL WriteField_u('masse_guide',masse)
529   
530   
531        !-----------------------------------------------------------------------
532!   Ajout des champs de guidage
533!-----------------------------------------------------------------------
534! Sauvegarde du guidage?
535    f_out=((MOD(itau,iguide_sav).EQ.0).AND.guide_sav) 
536    IF (f_out) THEN
537
538!$OMP BARRIER
539      CALL pression_loc(ijnb_u,ap,bp,ps,p)
540
541!$OMP BARRIER
542      if (pressure_exner) then
543      CALL exner_hyb_loc( ijnb_u, ps, p, pks, pk)
544      else
545        CALL exner_milieu_loc( ijnb_u, ps, p, pks, pk )
546      endif
547
548!$OMP BARRIER
549
550        unskap=1./kappa
551!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
552        DO l = 1, llm
553            DO j=jjbu,jjeu
554                DO i =1, iip1
555                    p(i+(j-1)*iip1,l) = preff * ( pk(i,j,l)/cpp) ** unskap
556                ENDDO
557            ENDDO
558        ENDDO
559
560!!$OMP MASTER
561!     DO l=1,llm,5
562!         print*,'avant dump2d l=',l,mpi_rank,OMP_GET_THREAD_NUM()
563!         print*,'avant dump2d l=',l,mpi_rank
564!         CALL dump2d(iip1,jjnb_u,p(:,l),'ppp   ')
565!      ENDDO
566!!$OMP END MASTER
567!!$OMP BARRIER
568
569        CALL guide_out("SP",jjp1,llm,p(ijb_u:ije_u,1:llm),1.)
570    ENDIF
571   
572    if (guide_u) then
573        if (guide_add) then
574!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
575          DO l=1,llm
576           f_addu(ijbu:ijeu,l)=(1.-tau)*ugui1(ijbu:ijeu,l)+tau*ugui2(ijbu:ijeu,l)
577          ENDDO
578        else
579!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
580          DO l=1,llm
581           f_addu(ijbu:ijeu,l)=(1.-tau)*ugui1(ijbu:ijeu,l)+tau*ugui2(ijbu:ijeu,l)-ucov(ijbu:ijeu,l)
582          ENDDO
583        endif
584   
585!        CALL WriteField_u('f_addu',f_addu)
586
587        if (guide_zon) CALL guide_zonave_u(1,llm,f_addu)
588        CALL guide_addfield_u(llm,f_addu,alpha_u)
589!       IF (f_out) CALL guide_out("ua",jjp1,llm,ugui1(ijb_u:ije_u,:),factt)
590        IF (f_out) CALL guide_out("ua",jjp1,llm,(1.-tau)*ugui1(ijb_u:ije_u,:)+tau*ugui2(ijb_u:ije_u,:),factt)
591        IF (f_out) CALL guide_out("u",jjp1,llm,ucov(ijb_u:ije_u,:),factt)
592        IF (f_out) CALL guide_out("ucov",jjp1,llm,f_addu(ijb_u:ije_u,:),factt)
593!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
594        DO l=1,llm
595          ucov(ijbu:ijeu,l)=ucov(ijbu:ijeu,l)+f_addu(ijbu:ijeu,l)
596        ENDDO
597
598    endif
599
600    if (guide_T) then
601        if (guide_add) then
602!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
603          DO l=1,llm
604            f_addu(ijbu:ijeu,l)=(1.-tau)*tgui1(ijbu:ijeu,l)+tau*tgui2(ijbu:ijeu,l)
605          ENDDO
606        else
607!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
608          DO l=1,llm
609           f_addu(ijbu:ijeu,l)=(1.-tau)*tgui1(ijbu:ijeu,l)+tau*tgui2(ijbu:ijeu,l)-teta(ijbu:ijeu,l)
610          ENDDO
611        endif
612        if (guide_zon) CALL guide_zonave_u(2,llm,f_addu)
613        CALL guide_addfield_u(llm,f_addu,alpha_T)
614        IF (f_out) CALL guide_out("teta",jjp1,llm,f_addu(:,:)/factt,factt)
615!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
616        DO l=1,llm
617          teta(ijbu:ijeu,l)=teta(ijbu:ijeu,l)+f_addu(ijbu:ijeu,l)
618        ENDDO
619    endif
620
621    if (guide_P) then
622        if (guide_add) then
623!$OMP MASTER
624            f_addu(ijbu:ijeu,1)=(1.-tau)*psgui1(ijbu:ijeu)+tau*psgui2(ijbu:ijeu)
625!$OMP END MASTER
626!$OMP BARRIER
627        else
628!$OMP MASTER
629            f_addu(ijbu:ijeu,1)=(1.-tau)*psgui1(ijbu:ijeu)+tau*psgui2(ijbu:ijeu)-ps(ijbu:ijeu)
630!$OMP END MASTER
631!$OMP BARRIER
632        endif
633        if (guide_zon) CALL guide_zonave_u(2,1,f_addu(ijb_u:ije_u,1))
634        CALL guide_addfield_u(1,f_addu(ijb_u:ije_u,1),alpha_P)
635!       IF (f_out) CALL guide_out("ps",jjp1,1,f_addu(ijb_u:ije_u,1)/factt,factt)
636!$OMP MASTER
637        ps(ijbu:ijeu)=ps(ijbu:ijeu)+f_addu(ijbu:ijeu,1)
638!$OMP END MASTER
639!$OMP BARRIER
640        CALL pression_loc(ijnb_u,ap,bp,ps,p)
641        CALL massdair_loc(p,masse)
642!$OMP BARRIER
643    endif
644
645    if (guide_Q) then
646        if (guide_add) then
647!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
648          DO l=1,llm
649            f_addu(ijbu:ijeu,l)=(1.-tau)*qgui1(ijbu:ijeu,l)+tau*qgui2(ijbu:ijeu,l)
650          ENDDO
651        else
652!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
653          DO l=1,llm
654            f_addu(ijbu:ijeu,l)=(1.-tau)*qgui1(ijbu:ijeu,l)+tau*qgui2(ijbu:ijeu,l)-q(ijbu:ijeu,l)
655          ENDDO
656        endif
657        if (guide_zon) CALL guide_zonave_u(2,llm,f_addu)
658        CALL guide_addfield_u(llm,f_addu,alpha_Q)
659        IF (f_out) CALL guide_out("q",jjp1,llm,f_addu(:,:)/factt,factt)
660
661!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
662        DO l=1,llm
663          q(ijbu:ijeu,l)=q(ijbu:ijeu,l)+f_addu(ijbu:ijeu,l)
664        ENDDO
665    endif
666
667    if (guide_v) then
668        if (guide_add) then
669!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
670          DO l=1,llm
671             f_addv(ijbv:ijev,l)=(1.-tau)*vgui1(ijbv:ijev,l)+tau*vgui2(ijbv:ijev,l)
672          ENDDO
673
674        else
675!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
676          DO l=1,llm
677            f_addv(ijbv:ijev,l)=(1.-tau)*vgui1(ijbv:ijev,l)+tau*vgui2(ijbv:ijev,l)-vcov(ijbv:ijev,l)
678          ENDDO
679
680        endif
681   
682        if (guide_zon) CALL guide_zonave_v(2,jjm,llm,f_addv(ijb_v:ije_v,:))
683       
684        CALL guide_addfield_v(llm,f_addv(ijb_v:ije_v,:),alpha_v)
685        IF (f_out) CALL guide_out("v",jjm,llm,vcov(ijb_v:ije_v,:),factt)
686        IF (f_out) CALL guide_out("va",jjm,llm,(1.-tau)*vgui1(ijb_v:ije_v,:)+tau*vgui2(ijb_v:ije_v,:),factt)
687        IF (f_out) CALL guide_out("vcov",jjm,llm,f_addv(:,:)/factt,factt)
688
689!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
690        DO l=1,llm
691          vcov(ijbv:ijev,l)=vcov(ijbv:ijev,l)+f_addv(ijbv:ijev,l)
692        ENDDO
693    endif
694
695  END SUBROUTINE guide_main
696
697
698  SUBROUTINE guide_addfield_u(vsize,field,alpha)
699! field1=a*field1+alpha*field2
700
701    IMPLICIT NONE
702    INCLUDE "dimensions.h"
703    INCLUDE "paramet.h"
704
705    ! input variables
706    INTEGER,                      INTENT(IN)    :: vsize
707    REAL, DIMENSION(ijb_u:ije_u),       INTENT(IN)    :: alpha
708    REAL, DIMENSION(ijb_u:ije_u,vsize), INTENT(INOUT) :: field
709
710    ! Local variables
711    INTEGER :: l
712
713!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
714    DO l=1,vsize
715      field(ijbu:ijeu,l)=alpha(ijbu:ijeu)*field(ijbu:ijeu,l)*alpha_pcor(l)
716    ENDDO
717
718  END SUBROUTINE guide_addfield_u
719
720
721  SUBROUTINE guide_addfield_v(vsize,field,alpha)
722! field1=a*field1+alpha*field2
723
724    IMPLICIT NONE
725    INCLUDE "dimensions.h"
726    INCLUDE "paramet.h"
727
728    ! input variables
729    INTEGER,                      INTENT(IN)    :: vsize
730    REAL, DIMENSION(ijb_v:ije_v),       INTENT(IN)    :: alpha
731    REAL, DIMENSION(ijb_v:ije_v,vsize), INTENT(INOUT) :: field
732
733    ! Local variables
734    INTEGER :: l
735
736!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
737    DO l=1,vsize
738      field(ijbv:ijev,l)=alpha(ijbv:ijev)*field(ijbv:ijev,l)*alpha_pcor(l)
739    ENDDO
740
741  END SUBROUTINE guide_addfield_v
742 
743!=======================================================================
744
745  SUBROUTINE guide_zonave_u(typ,vsize,field)
746
747    IMPLICIT NONE
748
749    INCLUDE "dimensions.h"
750    INCLUDE "paramet.h"
751    INCLUDE "comgeom.h"
752    INCLUDE "comconst.h"
753   
754    ! input/output variables
755    INTEGER,                           INTENT(IN)    :: typ
756    INTEGER,                           INTENT(IN)    :: vsize
757    REAL, DIMENSION(ijb_u:ije_u,vsize), INTENT(INOUT) :: field
758
759    ! Local variables
760    LOGICAL, SAVE                :: first=.TRUE.
761!$OMP THREADPRIVATE(first)
762
763    INTEGER, DIMENSION (2), SAVE :: imin, imax ! averaging domain
764!$OMP THREADPRIVATE(imin,imax)   
765    INTEGER                      :: i,j,l,ij
766    REAL, DIMENSION (iip1)       :: lond       ! longitude in Deg.
767    REAL, DIMENSION (jjb_u:jje_u,vsize):: fieldm     ! zon-averaged field
768
769    IF (first) THEN
770        first=.FALSE.
771!Compute domain for averaging
772        lond=rlonu*180./pi
773        imin(1)=1;imax(1)=iip1;
774        imin(2)=1;imax(2)=iip1;
775        IF (guide_reg) THEN
776            DO i=1,iim
777                IF (lond(i).LT.lon_min_g) imin(1)=i
778                IF (lond(i).LE.lon_max_g) imax(1)=i
779            ENDDO
780            lond=rlonv*180./pi
781            DO i=1,iim
782                IF (lond(i).LT.lon_min_g) imin(2)=i
783                IF (lond(i).LE.lon_max_g) imax(2)=i
784            ENDDO
785        ENDIF
786    ENDIF
787
788   
789!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
790      DO l=1,vsize
791        fieldm(:,l)=0.
792      ! Compute zonal average
793
794!correction bug ici
795! ---> a verifier
796! ym         DO j=jjbv,jjev
797         DO j=jjbu,jjeu
798              DO i=imin(typ),imax(typ)
799                  ij=(j-1)*iip1+i
800                  fieldm(j,l)=fieldm(j,l)+field(ij,l)
801              ENDDO
802          ENDDO
803          fieldm(:,l)=fieldm(:,l)/REAL(imax(typ)-imin(typ)+1)
804    ! Compute forcing
805          DO j=jjbu,jjeu
806              DO i=1,iip1
807                  ij=(j-1)*iip1+i
808                  field(ij,l)=fieldm(j,l)
809              ENDDO
810          ENDDO
811      ENDDO
812
813  END SUBROUTINE guide_zonave_u
814
815
816  SUBROUTINE guide_zonave_v(typ,hsize,vsize,field)
817
818    IMPLICIT NONE
819
820    INCLUDE "dimensions.h"
821    INCLUDE "paramet.h"
822    INCLUDE "comgeom.h"
823    INCLUDE "comconst.h"
824   
825    ! input/output variables
826    INTEGER,                           INTENT(IN)    :: typ
827    INTEGER,                           INTENT(IN)    :: vsize
828    INTEGER,                           INTENT(IN)    :: hsize
829    REAL, DIMENSION(ijb_v:ije_v,vsize), INTENT(INOUT) :: field
830
831    ! Local variables
832    LOGICAL, SAVE                :: first=.TRUE.
833!$OMP THREADPRIVATE(first)
834    INTEGER, DIMENSION (2), SAVE :: imin, imax ! averaging domain
835!$OMP THREADPRIVATE(imin, imax)
836    INTEGER                      :: i,j,l,ij
837    REAL, DIMENSION (iip1)       :: lond       ! longitude in Deg.
838    REAL, DIMENSION (jjb_v:jjev,vsize):: fieldm     ! zon-averaged field
839
840    IF (first) THEN
841        first=.FALSE.
842!Compute domain for averaging
843        lond=rlonu*180./pi
844        imin(1)=1;imax(1)=iip1;
845        imin(2)=1;imax(2)=iip1;
846        IF (guide_reg) THEN
847            DO i=1,iim
848                IF (lond(i).LT.lon_min_g) imin(1)=i
849                IF (lond(i).LE.lon_max_g) imax(1)=i
850            ENDDO
851            lond=rlonv*180./pi
852            DO i=1,iim
853                IF (lond(i).LT.lon_min_g) imin(2)=i
854                IF (lond(i).LE.lon_max_g) imax(2)=i
855            ENDDO
856        ENDIF
857    ENDIF
858
859!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
860      DO l=1,vsize
861      ! Compute zonal average
862          fieldm(:,l)=0.
863          DO j=jjbv,jjev
864              DO i=imin(typ),imax(typ)
865                  ij=(j-1)*iip1+i
866                  fieldm(j,l)=fieldm(j,l)+field(ij,l)
867              ENDDO
868          ENDDO
869          fieldm(:,l)=fieldm(:,l)/REAL(imax(typ)-imin(typ)+1)
870    ! Compute forcing
871          DO j=jjbv,jjev
872              DO i=1,iip1
873                  ij=(j-1)*iip1+i
874                  field(ij,l)=fieldm(j,l)
875              ENDDO
876          ENDDO
877      ENDDO
878
879
880  END SUBROUTINE guide_zonave_v
881 
882!=======================================================================
883  SUBROUTINE guide_interp(psi,teta)
884    use exner_hyb_loc_m, only: exner_hyb_loc
885    use exner_milieu_loc_m, only: exner_milieu_loc
886  USE parallel_lmdz
887  USE mod_hallo
888  USE Bands
889  IMPLICIT NONE
890
891  include "dimensions.h"
892  include "paramet.h"
893  include "comvert.h"
894  include "comgeom2.h"
895  include "comconst.h"
896
897  REAL, DIMENSION (iip1,jjb_u:jje_u),     INTENT(IN) :: psi ! Psol gcm
898  REAL, DIMENSION (iip1,jjb_u:jje_u,llm), INTENT(IN) :: teta ! Temp. Pot. gcm
899
900  LOGICAL, SAVE                      :: first=.TRUE.
901!$OMP THREADPRIVATE(first)
902  ! Variables pour niveaux pression:
903  REAL, ALLOCATABLE, SAVE, DIMENSION (:,:,:) :: plnc1,plnc2 !niveaux pression guidage
904  REAL, ALLOCATABLE, SAVE,DIMENSION (:,:,:)    :: plunc,plsnc !niveaux pression modele
905  REAL, ALLOCATABLE, SAVE,DIMENSION (:,:,:)     :: plvnc       !niveaux pression modele
906  REAL, ALLOCATABLE, SAVE,DIMENSION (:,:,:)  :: p           ! pression intercouches
907  REAL, ALLOCATABLE, SAVE,DIMENSION (:,:,:)    :: pls, pext   ! var intermediaire
908  REAL, ALLOCATABLE, SAVE,DIMENSION (:,:,:)    :: pbarx
909  REAL, ALLOCATABLE, SAVE,DIMENSION (:,:,:)     :: pbary
910  ! Variables pour fonction Exner (P milieu couche)
911  REAL, ALLOCATABLE, SAVE,DIMENSION (:,:,:)    :: pk
912  REAL ,ALLOCATABLE, SAVE, DIMENSION (:,:)        :: pks   
913  REAL                               :: unskap
914  ! Pression de vapeur saturante
915  REAL, ALLOCATABLE, SAVE,DIMENSION (:,:)      :: qsat
916  !Variables intermediaires interpolation
917  REAL, ALLOCATABLE, SAVE,DIMENSION (:,:,:)    :: zu1,zu2
918  REAL, ALLOCATABLE, SAVE,DIMENSION (:,:,:)     :: zv1,zv2
919 
920  INTEGER                            :: i,j,l,ij
921  TYPE(Request),SAVE :: Req 
922!$OMP THREADPRIVATE(Req)
923    print *,'Guide: conversion variables guidage'
924! -----------------------------------------------------------------
925! Calcul des niveaux de pression champs guidage (pour T et Q)
926! -----------------------------------------------------------------
927    IF (first) THEN
928!$OMP MASTER
929      ALLOCATE(plnc1(iip1,jjb_u:jje_u,nlevnc) )   
930      ALLOCATE(plnc2(iip1,jjb_u:jje_u,nlevnc) )   
931      ALLOCATE(plunc(iip1,jjb_u:jje_u,llm) )   
932      ALLOCATE(plsnc(iip1,jjb_u:jje_u,llm) )   
933      ALLOCATE(plvnc(iip1,jjb_v:jje_v,llm) )   
934      ALLOCATE(p(iip1,jjb_u:jje_u,llmp1) )   
935      ALLOCATE(pls(iip1,jjb_u:jje_u,llm) )   
936      ALLOCATE(pext(iip1,jjb_u:jje_u,llm) )   
937      ALLOCATE(pbarx(iip1,jjb_u:jje_u,llm) )   
938      ALLOCATE(pbary(iip1,jjb_v:jje_v,llm) )   
939      ALLOCATE(pk(iip1,jjb_u:jje_u,llm) )   
940      ALLOCATE(pks (iip1,jjb_u:jje_u) )   
941      ALLOCATE(qsat(ijb_u:ije_u,llm) )   
942      ALLOCATE(zu1(iip1,jjb_u:jje_u,llm) )   
943      ALLOCATE(zu2(iip1,jjb_u:jje_u,llm) )   
944      ALLOCATE(zv1(iip1,jjb_v:jje_v,llm) )   
945      ALLOCATE(zv2(iip1,jjb_v:jje_v,llm) )
946!$OMP END MASTER
947!$OMP BARRIER
948    ENDIF       
949
950   
951   
952   
953    IF (guide_plevs.EQ.0) THEN
954!$OMP DO
955        DO l=1,nlevnc
956            DO j=jjbu,jjeu
957                DO i=1,iip1
958                    plnc2(i,j,l)=apnc(l)
959                    plnc1(i,j,l)=apnc(l)
960               ENDDO
961            ENDDO
962        ENDDO
963    ENDIF   
964
965    if (first) then
966        first=.FALSE.
967!$OMP MASTER
968        print*,'Guide: verification ordre niveaux verticaux'
969        print*,'LMDZ :'
970        do l=1,llm
971            print*,'PL(',l,')=',(ap(l)+ap(l+1))/2. &
972                  +psi(1,jjeu)*(bp(l)+bp(l+1))/2.
973        enddo
974        print*,'Fichiers guidage'
975        SELECT CASE (guide_plevs)
976        CASE (0)
977            do l=1,nlevnc
978                 print*,'PL(',l,')=',plnc2(1,jjbu,l)
979            enddo
980        CASE (1)
981            DO l=1,nlevnc
982                 print*,'PL(',l,')=',apnc(l)+bpnc(l)*psnat2(i,jjbu)
983             ENDDO
984        CASE (2)
985            do l=1,nlevnc
986                 print*,'PL(',l,')=',pnat2(1,jjbu,l)
987            enddo
988        END SELECT
989        print *,'inversion de l''ordre: invert_p=',invert_p
990        if (guide_u) then
991            do l=1,nlevnc
992                print*,'U(',l,')=',unat2(1,jjbu,l)
993            enddo
994        endif
995        if (guide_T) then
996            do l=1,nlevnc
997                print*,'T(',l,')=',tnat2(1,jjbu,l)
998            enddo
999        endif
1000!$OMP END MASTER
1001    endif
1002   
1003! -----------------------------------------------------------------
1004! Calcul niveaux pression modele
1005! -----------------------------------------------------------------
1006
1007!    ....  Calcul de pls , pression au milieu des couches ,en Pascals
1008    IF (guide_plevs.EQ.1) THEN
1009!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
1010        DO l=1,llm
1011            DO j=jjbu,jjeu
1012                DO i =1, iip1
1013                    pls(i,j,l)=(ap(l)+ap(l+1))/2.+psi(i,j)*(bp(l)+bp(l+1))/2.
1014                ENDDO
1015            ENDDO
1016        ENDDO
1017    ELSE
1018        CALL pression_loc( ijnb_u, ap, bp, psi, p )
1019        if (disvert_type==1) then
1020          CALL exner_hyb_loc(ijnb_u,psi,p,pks,pk)
1021        else ! we assume that we are in the disvert_type==2 case
1022          CALL exner_milieu_loc(ijnb_u,psi,p,pks,pk)
1023        endif
1024        unskap=1./kappa
1025!$OMP BARRIER
1026!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
1027   DO l = 1, llm
1028       DO j=jjbu,jjeu
1029        DO i =1, iip1
1030            pls(i,j,l) = preff * ( pk(i,j,l)/cpp) ** unskap
1031        ENDDO
1032       ENDDO
1033   ENDDO
1034    ENDIF
1035
1036!   calcul des pressions pour les grilles u et v
1037!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
1038    do l=1,llm
1039        do j=jjbu,jjeu
1040            do i=1,iip1
1041                pext(i,j,l)=pls(i,j,l)*aire(i,j)
1042            enddo
1043        enddo
1044    enddo
1045
1046     CALL Register_Hallo_u(pext,llm,1,2,2,1,Req)
1047     CALL SendRequest(Req)
1048!$OMP BARRIER
1049     CALL WaitRequest(Req)
1050!$OMP BARRIER
1051
1052    call massbar_loc(pext, pbarx, pbary )
1053!$OMP BARRIER
1054!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
1055    do l=1,llm
1056        do j=jjbu,jjeu
1057            do i=1,iip1
1058                plunc(i,j,l)=pbarx(i,j,l)/aireu(i,j)
1059                plsnc(i,j,l)=pls(i,j,l)
1060            enddo
1061        enddo
1062    enddo
1063!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
1064    do l=1,llm
1065        do j=jjbv,jjev
1066            do i=1,iip1
1067                plvnc(i,j,l)=pbary(i,j,l)/airev(i,j)
1068            enddo
1069        enddo
1070    enddo
1071
1072! -----------------------------------------------------------------
1073! Interpolation verticale champs guidage sur niveaux modele
1074! Conversion en variables gcm (ucov, vcov...)
1075! -----------------------------------------------------------------
1076    if (guide_P) then
1077!$OMP MASTER
1078        do j=jjbu,jjeu
1079            do i=1,iim
1080                ij=(j-1)*iip1+i
1081                psgui1(ij)=psnat1(i,j)
1082                psgui2(ij)=psnat2(i,j)
1083            enddo
1084            psgui1(iip1*j)=psnat1(1,j)
1085            psgui2(iip1*j)=psnat2(1,j)
1086        enddo
1087!$OMP END MASTER
1088!$OMP BARRIER
1089    endif
1090
1091    IF (guide_T) THEN
1092        ! Calcul des nouvelles valeurs des niveaux de pression du guidage
1093        IF (guide_plevs.EQ.1) THEN
1094!$OMP DO
1095            DO l=1,nlevnc
1096                DO j=jjbu,jjeu
1097                    DO i=1,iip1
1098                        plnc2(i,j,l)=apnc(l)+bpnc(l)*psnat2(i,j)
1099                        plnc1(i,j,l)=apnc(l)+bpnc(l)*psnat1(i,j)
1100                    ENDDO
1101                ENDDO
1102            ENDDO
1103        ELSE IF (guide_plevs.EQ.2) THEN
1104!$OMP DO
1105            DO l=1,nlevnc
1106                DO j=jjbu,jjeu
1107                    DO i=1,iip1
1108                        plnc2(i,j,l)=pnat2(i,j,l)
1109                        plnc1(i,j,l)=pnat1(i,j,l)
1110                    ENDDO
1111                ENDDO
1112            ENDDO
1113        ENDIF
1114
1115        ! Interpolation verticale
1116!$OMP MASTER
1117        CALL pres2lev(tnat1(:,jjbu:jjeu,:),zu1(:,jjbu:jjeu,:),nlevnc,llm,           &
1118                    plnc1(:,jjbu:jjeu,:),plsnc(:,jjbu:jjeu,:),iip1,jjnu,invert_p)
1119        CALL pres2lev(tnat2(:,jjbu:jjeu,:),zu2(:,jjbu:jjeu,:),nlevnc,llm,           &
1120                    plnc2(:,jjbu:jjeu,:),plsnc(:,jjbu:jjeu,:),iip1,jjnu,invert_p)
1121!$OMP END MASTER
1122!$OMP BARRIER
1123        ! Conversion en variables GCM
1124!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
1125        do l=1,llm
1126            do j=jjbu,jjeu
1127                IF (guide_teta) THEN
1128                    do i=1,iim
1129                        ij=(j-1)*iip1+i
1130                        tgui1(ij,l)=zu1(i,j,l)
1131                        tgui2(ij,l)=zu2(i,j,l)
1132                    enddo
1133                ELSE
1134                    do i=1,iim
1135                        ij=(j-1)*iip1+i
1136                        tgui1(ij,l)=zu1(i,j,l)*cpp/pk(i,j,l)
1137                        tgui2(ij,l)=zu2(i,j,l)*cpp/pk(i,j,l)
1138                    enddo
1139                ENDIF
1140                tgui1(j*iip1,l)=tgui1((j-1)*iip1+1,l)   
1141                tgui2(j*iip1,l)=tgui2((j-1)*iip1+1,l)   
1142            enddo
1143            if (pole_nord) then
1144              do i=1,iip1
1145                tgui1(i,l)=tgui1(1,l)
1146                tgui2(i,l)=tgui2(1,l)
1147              enddo
1148            endif
1149            if (pole_sud) then
1150              do i=1,iip1
1151                tgui1(ip1jm+i,l)=tgui1(ip1jm+1,l)
1152                tgui2(ip1jm+i,l)=tgui2(ip1jm+1,l)
1153              enddo
1154           endif
1155        enddo
1156    ENDIF
1157
1158    IF (guide_Q) THEN
1159        ! Calcul des nouvelles valeurs des niveaux de pression du guidage
1160        IF (guide_plevs.EQ.1) THEN
1161!$OMP DO
1162            DO l=1,nlevnc
1163                DO j=jjbu,jjeu
1164                    DO i=1,iip1
1165                        plnc2(i,j,l)=apnc(l)+bpnc(l)*psnat2(i,j)
1166                        plnc1(i,j,l)=apnc(l)+bpnc(l)*psnat1(i,j)
1167                    ENDDO
1168                ENDDO
1169            ENDDO
1170        ELSE IF (guide_plevs.EQ.2) THEN
1171!$OMP DO
1172            DO l=1,nlevnc
1173                DO j=jjbu,jjeu
1174                    DO i=1,iip1
1175                        plnc2(i,j,l)=pnat2(i,j,l)
1176                        plnc1(i,j,l)=pnat1(i,j,l)
1177                    ENDDO
1178                ENDDO
1179            ENDDO
1180        ENDIF
1181
1182        ! Interpolation verticale
1183!$OMP MASTER
1184        CALL pres2lev(qnat1(:,jjbu:jjeu,:),zu1(:,jjbu:jjeu,:),nlevnc,llm,             &
1185                      plnc1(:,jjbu:jjeu,:),plsnc(:,jjbu:jjeu,:),iip1,jjnu,invert_p)
1186        CALL pres2lev(qnat2(:,jjbu:jjeu,:),zu2(:,jjbu:jjeu,:),nlevnc,llm,             &
1187                      plnc2(:,jjbu:jjeu,:),plsnc(:,jjbu:jjeu,:),iip1,jjnu,invert_p)
1188!$OMP END MASTER
1189!$OMP BARRIER
1190
1191        ! Conversion en variables GCM
1192        ! On suppose qu'on a la bonne variable dans le fichier de guidage:
1193        ! Hum.Rel si guide_hr, Hum.Spec. sinon.
1194!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
1195        do l=1,llm
1196            do j=jjbu,jjeu
1197                do i=1,iim
1198                    ij=(j-1)*iip1+i
1199                    qgui1(ij,l)=zu1(i,j,l)
1200                    qgui2(ij,l)=zu2(i,j,l)
1201                enddo
1202                qgui1(j*iip1,l)=qgui1((j-1)*iip1+1,l)   
1203                qgui2(j*iip1,l)=qgui2((j-1)*iip1+1,l)   
1204            enddo
1205            if (pole_nord) then
1206              do i=1,iip1
1207                qgui1(i,l)=qgui1(1,l)
1208                qgui2(i,l)=qgui2(1,l)
1209              enddo
1210            endif
1211            if (pole_nord) then
1212              do i=1,iip1
1213                qgui1(ip1jm+i,l)=qgui1(ip1jm+1,l)
1214                qgui2(ip1jm+i,l)=qgui2(ip1jm+1,l)
1215              enddo
1216            endif
1217        enddo
1218        IF (guide_hr) THEN
1219!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
1220          do l=1,llm
1221            CALL q_sat(iip1*jjnu,teta(:,jjbu:jjeu,l)*pk(:,jjbu:jjeu,l)/cpp,       &
1222                       plsnc(:,jjbu:jjeu,l),qsat(ijbu:ijeu,l))
1223            qgui1(ijbu:ijeu,l)=qgui1(ijbu:ijeu,l)*qsat(ijbu:ijeu,l)*0.01 !hum. rel. en %
1224            qgui2(ijbu:ijeu,l)=qgui2(ijbu:ijeu,l)*qsat(ijbu:ijeu,l)*0.01
1225          enddo
1226
1227        ENDIF
1228    ENDIF
1229
1230    IF (guide_u) THEN
1231        ! Calcul des nouvelles valeurs des niveaux de pression du guidage
1232        IF (guide_plevs.EQ.1) THEN
1233!$OMP DO
1234            DO l=1,nlevnc
1235                DO j=jjbu,jjeu
1236                    DO i=1,iim
1237                        plnc2(i,j,l)=apnc(l)+bpnc(l)*(psnat2(i,j)*aire(i,j)*alpha1p2(i,j) &
1238                       &           +psnat2(i+1,j)*aire(i+1,j)*alpha3p4(i+1,j))/aireu(i,j)
1239                        plnc1(i,j,l)=apnc(l)+bpnc(l)*(psnat1(i,j)*aire(i,j)*alpha1p2(i,j) &
1240                       &           +psnat1(i+1,j)*aire(i+1,j)*alpha3p4(i+1,j))/aireu(i,j)
1241                    ENDDO
1242                    plnc2(iip1,j,l)=plnc2(1,j,l)
1243                    plnc1(iip1,j,l)=plnc1(1,j,l)
1244                ENDDO
1245            ENDDO
1246        ELSE IF (guide_plevs.EQ.2) THEN
1247!$OMP DO
1248            DO l=1,nlevnc
1249                DO j=jjbu,jjeu
1250                    DO i=1,iim
1251                        plnc2(i,j,l)=(pnat2(i,j,l)*aire(i,j)*alpha1p2(i,j) &
1252                       & +pnat2(i+1,j,l)*aire(i,j)*alpha3p4(i+1,j))/aireu(i,j)
1253                        plnc1(i,j,l)=(pnat1(i,j,l)*aire(i,j)*alpha1p2(i,j) &
1254                       & +pnat1(i+1,j,l)*aire(i,j)*alpha3p4(i+1,j))/aireu(i,j)
1255                    ENDDO
1256                    plnc2(iip1,j,l)=plnc2(1,j,l)
1257                    plnc1(iip1,j,l)=plnc1(1,j,l)
1258                ENDDO
1259            ENDDO
1260        ENDIF
1261       
1262        ! Interpolation verticale
1263!$OMP MASTER
1264        CALL pres2lev(unat1(:,jjbu:jjeu,:),zu1(:,jjbu:jjeu,:),nlevnc,llm,            &
1265                      plnc1(:,jjbu:jjeu,:),plunc(:,jjbu:jjeu,:),iip1,jjnu,invert_p)
1266        CALL pres2lev(unat2(:,jjbu:jjeu,:),zu2(:,jjbu:jjeu,:),nlevnc,llm,            &
1267                      plnc2(:,jjbu:jjeu,:),plunc(:,jjbu:jjeu,:),iip1,jjnu,invert_p)
1268!$OMP END MASTER
1269!$OMP BARRIER
1270
1271        ! Conversion en variables GCM
1272!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
1273        do l=1,llm
1274            do j=jjbu,jjeu
1275                do i=1,iim
1276                    ij=(j-1)*iip1+i
1277                    ugui1(ij,l)=zu1(i,j,l)*cu(i,j)
1278                    ugui2(ij,l)=zu2(i,j,l)*cu(i,j)
1279                enddo
1280                ugui1(j*iip1,l)=ugui1((j-1)*iip1+1,l)   
1281                ugui2(j*iip1,l)=ugui2((j-1)*iip1+1,l)   
1282            enddo
1283            if (pole_nord) then
1284              do i=1,iip1
1285                ugui1(i,l)=0.
1286                ugui2(i,l)=0.
1287              enddo
1288            endif
1289            if (pole_sud) then
1290              do i=1,iip1
1291                ugui1(ip1jm+i,l)=0.
1292                ugui2(ip1jm+i,l)=0.
1293              enddo
1294            endif
1295        enddo
1296    ENDIF
1297   
1298    IF (guide_v) THEN
1299        ! Calcul des nouvelles valeurs des niveaux de pression du guidage
1300        IF (guide_plevs.EQ.1) THEN
1301         CALL Register_Hallo_u(psnat1,1,1,2,2,1,Req)
1302         CALL Register_Hallo_u(psnat2,1,1,2,2,1,Req)
1303         CALL SendRequest(Req)
1304!$OMP BARRIER
1305         CALL WaitRequest(Req)
1306!$OMP BARRIER
1307!$OMP DO
1308            DO l=1,nlevnc
1309                DO j=jjbv,jjev
1310                    DO i=1,iip1
1311                        plnc2(i,j,l)=apnc(l)+bpnc(l)*(psnat2(i,j)*aire(i,j)*alpha2p3(i,j) &
1312                       &           +psnat2(i,j+1)*aire(i,j+1)*alpha1p4(i,j+1))/airev(i,j)
1313                        plnc1(i,j,l)=apnc(l)+bpnc(l)*(psnat1(i,j)*aire(i,j)*alpha2p3(i,j) &
1314                       &           +psnat1(i,j+1)*aire(i,j+1)*alpha1p4(i,j+1))/airev(i,j)
1315                    ENDDO
1316                ENDDO
1317            ENDDO
1318        ELSE IF (guide_plevs.EQ.2) THEN
1319         CALL Register_Hallo_u(pnat1,llm,1,2,2,1,Req)
1320         CALL Register_Hallo_u(pnat2,llm,1,2,2,1,Req)
1321         CALL SendRequest(Req)
1322!$OMP BARRIER
1323         CALL WaitRequest(Req)
1324!$OMP BARRIER
1325!$OMP DO
1326            DO l=1,nlevnc
1327                DO j=jjbv,jjev
1328                    DO i=1,iip1
1329                        plnc2(i,j,l)=(pnat2(i,j,l)*aire(i,j)*alpha2p3(i,j) &
1330                       & +pnat2(i,j+1,l)*aire(i,j)*alpha1p4(i,j+1))/airev(i,j)
1331                        plnc1(i,j,l)=(pnat1(i,j,l)*aire(i,j)*alpha2p3(i,j) &
1332                       & +pnat1(i,j+1,l)*aire(i,j)*alpha1p4(i,j+1))/airev(i,j)
1333                    ENDDO
1334                ENDDO
1335            ENDDO
1336        ENDIF
1337        ! Interpolation verticale
1338
1339!$OMP MASTER
1340        CALL pres2lev(vnat1(:,jjbv:jjev,:),zv1(:,jjbv:jjev,:),nlevnc,llm,             &
1341                      plnc1(:,jjbv:jjev,:),plvnc(:,jjbv:jjev,:),iip1,jjnv,invert_p)
1342        CALL pres2lev(vnat2(:,jjbv:jjev,:),zv2(:,jjbv:jjev,:),nlevnc,llm,             &
1343                      plnc2(:,jjbv:jjev,:),plvnc(:,jjbv:jjev,:),iip1,jjnv,invert_p)
1344!$OMP END MASTER
1345!$OMP BARRIER
1346        ! Conversion en variables GCM
1347!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
1348        do l=1,llm
1349            do j=jjbv,jjev
1350                do i=1,iim
1351                    ij=(j-1)*iip1+i
1352                    vgui1(ij,l)=zv1(i,j,l)*cv(i,j)
1353                    vgui2(ij,l)=zv2(i,j,l)*cv(i,j)
1354                enddo
1355                vgui1(j*iip1,l)=vgui1((j-1)*iip1+1,l)   
1356                vgui2(j*iip1,l)=vgui2((j-1)*iip1+1,l)   
1357            enddo
1358        enddo
1359    ENDIF
1360   
1361
1362  END SUBROUTINE guide_interp
1363
1364!=======================================================================
1365  SUBROUTINE tau2alpha(typ,pim,jjb,jje,factt,taumin,taumax,alpha)
1366
1367! Calcul des constantes de rappel alpha (=1/tau)
1368
1369    implicit none
1370
1371    include "dimensions.h"
1372    include "paramet.h"
1373    include "comconst.h"
1374    include "comgeom2.h"
1375    include "serre.h"
1376
1377! input arguments :
1378    INTEGER, INTENT(IN) :: typ    ! u(2),v(3), ou scalaire(1)
1379    INTEGER, INTENT(IN) :: pim ! dimensions en lon
1380    INTEGER, INTENT(IN) :: jjb,jje ! dimensions en lat
1381    REAL, INTENT(IN)    :: factt   ! pas de temps en fraction de jour
1382    REAL, INTENT(IN)    :: taumin,taumax
1383! output arguments:
1384    REAL, DIMENSION(pim,jjb:jje), INTENT(OUT) :: alpha
1385 
1386!  local variables:
1387    LOGICAL, SAVE               :: first=.TRUE.
1388    REAL, SAVE                  :: gamma,dxdy_min,dxdy_max
1389    REAL, DIMENSION (iip1,jjp1) :: zdx,zdy
1390    REAL, DIMENSION (iip1,jjp1) :: dxdys,dxdyu
1391    REAL, DIMENSION (iip1,jjm)  :: dxdyv
1392    real dxdy_
1393    real zlat,zlon
1394    real alphamin,alphamax,xi
1395    integer i,j,ilon,ilat
1396
1397
1398    alphamin=factt/taumax
1399    alphamax=factt/taumin
1400    IF (guide_reg.OR.guide_add) THEN
1401        alpha=alphamax
1402!-----------------------------------------------------------------------
1403! guide_reg: alpha=alpha_min dans region, 0. sinon.
1404!-----------------------------------------------------------------------
1405        IF (guide_reg) THEN
1406            do j=jjb,jje
1407                do i=1,pim
1408                    if (typ.eq.2) then
1409                       zlat=rlatu(j)*180./pi
1410                       zlon=rlonu(i)*180./pi
1411                    elseif (typ.eq.1) then
1412                       zlat=rlatu(j)*180./pi
1413                       zlon=rlonv(i)*180./pi
1414                    elseif (typ.eq.3) then
1415                       zlat=rlatv(j)*180./pi
1416                       zlon=rlonv(i)*180./pi
1417                    endif
1418                    alpha(i,j)=alphamax/16.* &
1419                              (1.+tanh((zlat-lat_min_g)/tau_lat))* &
1420                              (1.+tanh((lat_max_g-zlat)/tau_lat))* &
1421                              (1.+tanh((zlon-lon_min_g)/tau_lon))* &
1422                              (1.+tanh((lon_max_g-zlon)/tau_lon))
1423                enddo
1424            enddo
1425        ENDIF
1426    ELSE
1427!-----------------------------------------------------------------------
1428! Sinon, alpha varie entre alpha_min et alpha_max suivant le zoom.
1429!-----------------------------------------------------------------------
1430!Calcul de l'aire des mailles
1431        do j=2,jjm
1432            do i=2,iip1
1433               zdx(i,j)=0.5*(cu(i-1,j)+cu(i,j))/cos(rlatu(j))
1434            enddo
1435            zdx(1,j)=zdx(iip1,j)
1436        enddo
1437        do j=2,jjm
1438            do i=1,iip1
1439               zdy(i,j)=0.5*(cv(i,j-1)+cv(i,j))
1440            enddo
1441        enddo
1442        do i=1,iip1
1443            zdx(i,1)=zdx(i,2)
1444            zdx(i,jjp1)=zdx(i,jjm)
1445            zdy(i,1)=zdy(i,2)
1446            zdy(i,jjp1)=zdy(i,jjm)
1447        enddo
1448        do j=1,jjp1
1449            do i=1,iip1
1450               dxdys(i,j)=sqrt(zdx(i,j)*zdx(i,j)+zdy(i,j)*zdy(i,j))
1451            enddo
1452        enddo
1453        IF (typ.EQ.2) THEN
1454            do j=1,jjp1
1455                do i=1,iim
1456                   dxdyu(i,j)=0.5*(dxdys(i,j)+dxdys(i+1,j))
1457                enddo
1458                dxdyu(iip1,j)=dxdyu(1,j)
1459            enddo
1460        ENDIF
1461        IF (typ.EQ.3) THEN
1462            do j=1,jjm
1463                do i=1,iip1
1464                   dxdyv(i,j)=0.5*(dxdys(i,j)+dxdys(i,j+1))
1465                enddo
1466            enddo
1467        ENDIF
1468! Premier appel: calcul des aires min et max et de gamma.
1469        IF (first) THEN
1470            first=.FALSE.
1471            ! coordonnees du centre du zoom
1472            CALL coordij(clon,clat,ilon,ilat)
1473            ! aire de la maille au centre du zoom
1474            dxdy_min=dxdys(ilon,ilat)
1475            ! dxdy maximale de la maille
1476            dxdy_max=0.
1477            do j=1,jjp1
1478                do i=1,iip1
1479                     dxdy_max=max(dxdy_max,dxdys(i,j))
1480                enddo
1481            enddo
1482            ! Calcul de gamma
1483            if (abs(grossismx-1.).lt.0.1.or.abs(grossismy-1.).lt.0.1) then
1484                 print*,'ATTENTION modele peu zoome'
1485                 print*,'ATTENTION on prend une constante de guidage cste'
1486                 gamma=0.
1487            else
1488                gamma=(dxdy_max-2.*dxdy_min)/(dxdy_max-dxdy_min)
1489                print*,'gamma=',gamma
1490                if (gamma.lt.1.e-5) then
1491                  print*,'gamma =',gamma,'<1e-5'
1492                  stop
1493                endif
1494                gamma=log(0.5)/log(gamma)
1495                if (gamma4) then
1496                  gamma=min(gamma,4.)
1497                endif
1498                print*,'gamma=',gamma
1499            endif
1500        ENDIF !first
1501
1502        do j=jjb,jje
1503            do i=1,pim
1504                if (typ.eq.1) then
1505                   dxdy_=dxdys(i,j)
1506                   zlat=rlatu(j)*180./pi
1507                elseif (typ.eq.2) then
1508                   dxdy_=dxdyu(i,j)
1509                   zlat=rlatu(j)*180./pi
1510                elseif (typ.eq.3) then
1511                   dxdy_=dxdyv(i,j)
1512                   zlat=rlatv(j)*180./pi
1513                endif
1514                if (abs(grossismx-1.).lt.0.1.or.abs(grossismy-1.).lt.0.1) then
1515                ! pour une grille reguliere, xi=xxx**0=1 -> alpha=alphamin
1516                    alpha(i,j)=alphamin
1517                else
1518                    xi=((dxdy_max-dxdy_)/(dxdy_max-dxdy_min))**gamma
1519                    xi=min(xi,1.)
1520                    if(lat_min_g.le.zlat .and. zlat.le.lat_max_g) then
1521                        alpha(i,j)=xi*alphamin+(1.-xi)*alphamax
1522                    else
1523                        alpha(i,j)=0.
1524                    endif
1525                endif
1526            enddo
1527        enddo
1528    ENDIF ! guide_reg
1529
1530    if (.not. guide_add) alpha = 1. - exp(- alpha)
1531
1532  END SUBROUTINE tau2alpha
1533
1534!=======================================================================
1535  SUBROUTINE guide_read(timestep)
1536
1537    IMPLICIT NONE
1538
1539#include "netcdf.inc"
1540#include "dimensions.h"
1541#include "paramet.h"
1542
1543    INTEGER, INTENT(IN)   :: timestep
1544
1545    LOGICAL, SAVE         :: first=.TRUE.
1546! Identification fichiers et variables NetCDF:
1547    INTEGER, SAVE         :: ncidu,varidu,ncidv,varidv,ncidp,varidp
1548    INTEGER, SAVE         :: ncidQ,varidQ,ncidt,varidt,ncidps,varidps
1549    INTEGER               :: ncidpl,varidpl,varidap,varidbp
1550! Variables auxiliaires NetCDF:
1551    INTEGER, DIMENSION(4) :: start,count
1552    INTEGER               :: status,rcode
1553    CHARACTER (len = 80)   :: abort_message
1554    CHARACTER (len = 20)   :: modname = 'guide_read'
1555    abort_message='pb in guide_read'
1556
1557! -----------------------------------------------------------------
1558! Premier appel: initialisation de la lecture des fichiers
1559! -----------------------------------------------------------------
1560    if (first) then
1561         ncidpl=-99
1562         print*,'Guide: ouverture des fichiers guidage '
1563! Ap et Bp si Niveaux de pression hybrides
1564         if (guide_plevs.EQ.1) then
1565             print *,'Lecture du guidage sur niveaux modele'
1566             rcode = nf90_open('apbp.nc', nf90_nowrite, ncidpl)
1567             IF (rcode.NE.NF_NOERR) THEN
1568              print *,'Guide: probleme -> pas de fichier apbp.nc'
1569              CALL abort_gcm(modname,abort_message,1)
1570             ENDIF
1571             rcode = nf90_inq_varid(ncidpl, 'AP', varidap)
1572             IF (rcode.NE.NF_NOERR) THEN
1573              print *,'Guide: probleme -> pas de variable AP, fichier apbp.nc'
1574              CALL abort_gcm(modname,abort_message,1)
1575             ENDIF
1576             rcode = nf90_inq_varid(ncidpl, 'BP', varidbp)
1577             IF (rcode.NE.NF_NOERR) THEN
1578              print *,'Guide: probleme -> pas de variable BP, fichier apbp.nc'
1579              CALL abort_gcm(modname,abort_message,1)
1580             ENDIF
1581             print*,'ncidpl,varidap',ncidpl,varidap
1582         endif
1583! Pression si guidage sur niveaux P variables
1584         if (guide_plevs.EQ.2) then
1585             rcode = nf90_open('P.nc', nf90_nowrite, ncidp)
1586             IF (rcode.NE.NF_NOERR) THEN
1587              print *,'Guide: probleme -> pas de fichier P.nc'
1588              CALL abort_gcm(modname,abort_message,1)
1589             ENDIF
1590             rcode = nf90_inq_varid(ncidp, 'PRES', varidp)
1591             IF (rcode.NE.NF_NOERR) THEN
1592              print *,'Guide: probleme -> pas de variable PRES, fichier P.nc'
1593              CALL abort_gcm(modname,abort_message,1)
1594             ENDIF
1595             print*,'ncidp,varidp',ncidp,varidp
1596             if (ncidpl.eq.-99) ncidpl=ncidp
1597         endif
1598! Vent zonal
1599         if (guide_u) then
1600             rcode = nf90_open('u.nc', nf90_nowrite, ncidu)
1601             IF (rcode.NE.NF_NOERR) THEN
1602              print *,'Guide: probleme -> pas de fichier u.nc'
1603              CALL abort_gcm(modname,abort_message,1)
1604             ENDIF
1605             rcode = nf90_inq_varid(ncidu, 'UWND', varidu)
1606             IF (rcode.NE.NF_NOERR) THEN
1607              print *,'Guide: probleme -> pas de variable UWND, fichier u.nc'
1608              CALL abort_gcm(modname,abort_message,1)
1609             ENDIF
1610             print*,'ncidu,varidu',ncidu,varidu
1611             if (ncidpl.eq.-99) ncidpl=ncidu
1612         endif
1613! Vent meridien
1614         if (guide_v) then
1615             rcode = nf90_open('v.nc', nf90_nowrite, ncidv)
1616             IF (rcode.NE.NF_NOERR) THEN
1617              print *,'Guide: probleme -> pas de fichier v.nc'
1618              CALL abort_gcm(modname,abort_message,1)
1619             ENDIF
1620             rcode = nf90_inq_varid(ncidv, 'VWND', varidv)
1621             IF (rcode.NE.NF_NOERR) THEN
1622              print *,'Guide: probleme -> pas de variable VWND, fichier v.nc'
1623              CALL abort_gcm(modname,abort_message,1)
1624             ENDIF
1625             print*,'ncidv,varidv',ncidv,varidv
1626             if (ncidpl.eq.-99) ncidpl=ncidv
1627         endif
1628! Temperature
1629         if (guide_T) then
1630             rcode = nf90_open('T.nc', nf90_nowrite, ncidt)
1631             IF (rcode.NE.NF_NOERR) THEN
1632              print *,'Guide: probleme -> pas de fichier T.nc'
1633              CALL abort_gcm(modname,abort_message,1)
1634             ENDIF
1635             rcode = nf90_inq_varid(ncidt, 'AIR', varidt)
1636             IF (rcode.NE.NF_NOERR) THEN
1637              print *,'Guide: probleme -> pas de variable AIR, fichier T.nc'
1638              CALL abort_gcm(modname,abort_message,1)
1639             ENDIF
1640             print*,'ncidT,varidT',ncidt,varidt
1641             if (ncidpl.eq.-99) ncidpl=ncidt
1642         endif
1643! Humidite
1644         if (guide_Q) then
1645             rcode = nf90_open('hur.nc', nf90_nowrite, ncidQ)
1646             IF (rcode.NE.NF_NOERR) THEN
1647              print *,'Guide: probleme -> pas de fichier hur.nc'
1648              CALL abort_gcm(modname,abort_message,1)
1649             ENDIF
1650             rcode = nf90_inq_varid(ncidQ, 'RH', varidQ)
1651             IF (rcode.NE.NF_NOERR) THEN
1652              print *,'Guide: probleme -> pas de variable RH, fichier hur.nc'
1653              CALL abort_gcm(modname,abort_message,1)
1654             ENDIF
1655             print*,'ncidQ,varidQ',ncidQ,varidQ
1656             if (ncidpl.eq.-99) ncidpl=ncidQ
1657         endif
1658! Pression de surface
1659         if ((guide_P).OR.(guide_plevs.EQ.1)) then
1660             rcode = nf90_open('ps.nc', nf90_nowrite, ncidps)
1661             IF (rcode.NE.NF_NOERR) THEN
1662              print *,'Guide: probleme -> pas de fichier ps.nc'
1663              CALL abort_gcm(modname,abort_message,1)
1664             ENDIF
1665             rcode = nf90_inq_varid(ncidps, 'SP', varidps)
1666             IF (rcode.NE.NF_NOERR) THEN
1667              print *,'Guide: probleme -> pas de variable SP, fichier ps.nc'
1668              CALL abort_gcm(modname,abort_message,1)
1669             ENDIF
1670             print*,'ncidps,varidps',ncidps,varidps
1671         endif
1672! Coordonnee verticale
1673         if (guide_plevs.EQ.0) then
1674              rcode = nf90_inq_varid(ncidpl, 'LEVEL', varidpl)
1675              IF (rcode.NE.0) rcode = nf90_inq_varid(ncidpl, 'PRESSURE', varidpl)
1676              print*,'ncidpl,varidpl',ncidpl,varidpl
1677         endif
1678! Coefs ap, bp pour calcul de la pression aux differents niveaux
1679         IF (guide_plevs.EQ.1) THEN
1680#ifdef NC_DOUBLE
1681             status=NF_GET_VARA_DOUBLE(ncidpl,varidap,1,nlevnc,apnc)
1682             status=NF_GET_VARA_DOUBLE(ncidpl,varidbp,1,nlevnc,bpnc)
1683#else
1684             status=NF_GET_VARA_REAL(ncidpl,varidap,1,nlevnc,apnc)
1685             status=NF_GET_VARA_REAL(ncidpl,varidbp,1,nlevnc,bpnc)
1686#endif
1687         ELSEIF (guide_plevs.EQ.0) THEN
1688#ifdef NC_DOUBLE
1689             status=NF_GET_VARA_DOUBLE(ncidpl,varidpl,1,nlevnc,apnc)
1690#else
1691             status=NF_GET_VARA_REAL(ncidpl,varidpl,1,nlevnc,apnc)
1692#endif
1693             apnc=apnc*100.! conversion en Pascals
1694             bpnc(:)=0.
1695         ENDIF
1696         first=.FALSE.
1697     ENDIF ! (first)
1698
1699! -----------------------------------------------------------------
1700!   lecture des champs u, v, T, Q, ps
1701! -----------------------------------------------------------------
1702
1703!  dimensions pour les champs scalaires et le vent zonal
1704     start(1)=1
1705     start(2)=jjb_u
1706     start(3)=1
1707     start(4)=timestep
1708
1709     count(1)=iip1
1710     count(2)=jjnb_u
1711     count(3)=nlevnc
1712     count(4)=1
1713
1714     IF (invert_y) start(2)=jjp1-jje_u+1
1715! Pression
1716     if (guide_plevs.EQ.2) then
1717#ifdef NC_DOUBLE
1718         status=NF_GET_VARA_DOUBLE(ncidp,varidp,start,count,pnat2)
1719#else
1720         status=NF_GET_VARA_REAL(ncidp,varidp,start,count,pnat2)
1721#endif
1722         IF (invert_y) THEN
1723!           PRINT*,"Invertion impossible actuellement"
1724!           CALL abort_gcm(modname,abort_message,1)
1725           CALL invert_lat(iip1,jjnb_u,nlevnc,pnat2)
1726         ENDIF
1727     endif
1728
1729!  Vent zonal
1730     if (guide_u) then
1731#ifdef NC_DOUBLE
1732         status=NF_GET_VARA_DOUBLE(ncidu,varidu,start,count,unat2)
1733#else
1734         status=NF_GET_VARA_REAL(ncidu,varidu,start,count,unat2)
1735#endif
1736         IF (invert_y) THEN
1737!           PRINT*,"Invertion impossible actuellement"
1738!           CALL abort_gcm(modname,abort_message,1)
1739           CALL invert_lat(iip1,jjnb_u,nlevnc,unat2)
1740         ENDIF
1741
1742     endif
1743
1744
1745!  Temperature
1746     if (guide_T) then
1747#ifdef NC_DOUBLE
1748         status=NF_GET_VARA_DOUBLE(ncidt,varidt,start,count,tnat2)
1749#else
1750         status=NF_GET_VARA_REAL(ncidt,varidt,start,count,tnat2)
1751#endif
1752         IF (invert_y) THEN
1753!           PRINT*,"Invertion impossible actuellement"
1754!           CALL abort_gcm(modname,abort_message,1)
1755           CALL invert_lat(iip1,jjnb_u,nlevnc,tnat2)
1756         ENDIF
1757     endif
1758
1759!  Humidite
1760     if (guide_Q) then
1761#ifdef NC_DOUBLE
1762         status=NF_GET_VARA_DOUBLE(ncidQ,varidQ,start,count,qnat2)
1763#else
1764         status=NF_GET_VARA_REAL(ncidQ,varidQ,start,count,qnat2)
1765#endif
1766         IF (invert_y) THEN
1767!           PRINT*,"Invertion impossible actuellement"
1768!           CALL abort_gcm(modname,abort_message,1)
1769           CALL invert_lat(iip1,jjnb_u,nlevnc,qnat2)
1770         ENDIF
1771
1772     endif
1773
1774!  Vent meridien
1775     if (guide_v) then
1776         start(2)=jjb_v
1777         count(2)=jjnb_v
1778         IF (invert_y) start(2)=jjm-jje_v+1
1779
1780#ifdef NC_DOUBLE
1781         status=NF_GET_VARA_DOUBLE(ncidv,varidv,start,count,vnat2)
1782#else
1783         status=NF_GET_VARA_REAL(ncidv,varidv,start,count,vnat2)
1784#endif
1785         IF (invert_y) THEN
1786!           PRINT*,"Invertion impossible actuellement"
1787!           CALL abort_gcm(modname,abort_message,1)
1788           CALL invert_lat(iip1,jjnb_v,nlevnc,vnat2)
1789         ENDIF
1790     endif
1791
1792!  Pression de surface
1793     if ((guide_P).OR.(guide_plevs.EQ.1))  then
1794         start(2)=jjb_u
1795         start(3)=timestep
1796         start(4)=0
1797         count(2)=jjnb_u
1798         count(3)=1
1799         count(4)=0
1800         IF (invert_y) start(2)=jjp1-jje_u+1
1801#ifdef NC_DOUBLE
1802         status=NF_GET_VARA_DOUBLE(ncidps,varidps,start,count,psnat2)
1803#else
1804         status=NF_GET_VARA_REAL(ncidps,varidps,start,count,psnat2)
1805#endif
1806         IF (invert_y) THEN
1807!           PRINT*,"Invertion impossible actuellement"
1808!           CALL abort_gcm(modname,abort_message,1)
1809           CALL invert_lat(iip1,jjnb_u,1,psnat2)
1810         ENDIF
1811     endif
1812
1813  END SUBROUTINE guide_read
1814
1815!=======================================================================
1816  SUBROUTINE guide_read2D(timestep)
1817
1818    IMPLICIT NONE
1819
1820#include "netcdf.inc"
1821#include "dimensions.h"
1822#include "paramet.h"
1823
1824    INTEGER, INTENT(IN)   :: timestep
1825
1826    LOGICAL, SAVE         :: first=.TRUE.
1827! Identification fichiers et variables NetCDF:
1828    INTEGER, SAVE         :: ncidu,varidu,ncidv,varidv,ncidp,varidp
1829    INTEGER, SAVE         :: ncidQ,varidQ,ncidt,varidt,ncidps,varidps
1830    INTEGER               :: ncidpl,varidpl,varidap,varidbp
1831! Variables auxiliaires NetCDF:
1832    INTEGER, DIMENSION(4) :: start,count
1833    INTEGER               :: status,rcode
1834! Variables for 3D extension:
1835    REAL, DIMENSION (jjb_u:jje_u,llm)  :: zu
1836    REAL, DIMENSION (jjb_v:jje_v,llm)  :: zv
1837    INTEGER               :: i
1838    CHARACTER (len = 80)   :: abort_message
1839    CHARACTER (len = 20)   :: modname = 'guide_read2D'
1840    abort_message='pb in guide_read2D'
1841
1842! -----------------------------------------------------------------
1843! Premier appel: initialisation de la lecture des fichiers
1844! -----------------------------------------------------------------
1845    if (first) then
1846         ncidpl=-99
1847         print*,'Guide: ouverture des fichiers guidage '
1848! Ap et Bp si niveaux de pression hybrides
1849         if (guide_plevs.EQ.1) then
1850             print *,'Lecture du guidage sur niveaux mod�le'
1851             rcode = nf90_open('apbp.nc', nf90_nowrite, ncidpl)
1852             IF (rcode.NE.NF_NOERR) THEN
1853              print *,'Guide: probleme -> pas de fichier apbp.nc'
1854              CALL abort_gcm(modname,abort_message,1)
1855             ENDIF
1856             rcode = nf90_inq_varid(ncidpl, 'AP', varidap)
1857             IF (rcode.NE.NF_NOERR) THEN
1858              print *,'Guide: probleme -> pas de variable AP, fichier apbp.nc'
1859              CALL abort_gcm(modname,abort_message,1)
1860             ENDIF
1861             rcode = nf90_inq_varid(ncidpl, 'BP', varidbp)
1862             IF (rcode.NE.NF_NOERR) THEN
1863              print *,'Guide: probleme -> pas de variable BP, fichier apbp.nc'
1864              CALL abort_gcm(modname,abort_message,1)
1865             ENDIF
1866             print*,'ncidpl,varidap',ncidpl,varidap
1867         endif
1868! Pression
1869         if (guide_plevs.EQ.2) then
1870             rcode = nf90_open('P.nc', nf90_nowrite, ncidp)
1871             IF (rcode.NE.NF_NOERR) THEN
1872              print *,'Guide: probleme -> pas de fichier P.nc'
1873              CALL abort_gcm(modname,abort_message,1)
1874             ENDIF
1875             rcode = nf90_inq_varid(ncidp, 'PRES', varidp)
1876             IF (rcode.NE.NF_NOERR) THEN
1877              print *,'Guide: probleme -> pas de variable PRES, fichier P.nc'
1878              CALL abort_gcm(modname,abort_message,1)
1879             ENDIF
1880             print*,'ncidp,varidp',ncidp,varidp
1881             if (ncidpl.eq.-99) ncidpl=ncidp
1882         endif
1883! Vent zonal
1884         if (guide_u) then
1885             rcode = nf90_open('u.nc', nf90_nowrite, ncidu)
1886             IF (rcode.NE.NF_NOERR) THEN
1887              print *,'Guide: probleme -> pas de fichier u.nc'
1888              CALL abort_gcm(modname,abort_message,1)
1889             ENDIF
1890             rcode = nf90_inq_varid(ncidu, 'UWND', varidu)
1891             IF (rcode.NE.NF_NOERR) THEN
1892              print *,'Guide: probleme -> pas de variable UWND, fichier u.nc'
1893              CALL abort_gcm(modname,abort_message,1)
1894             ENDIF
1895             print*,'ncidu,varidu',ncidu,varidu
1896             if (ncidpl.eq.-99) ncidpl=ncidu
1897         endif
1898
1899! Vent meridien
1900         if (guide_v) then
1901             rcode = nf90_open('v.nc', nf90_nowrite, ncidv)
1902             IF (rcode.NE.NF_NOERR) THEN
1903              print *,'Guide: probleme -> pas de fichier v.nc'
1904              CALL abort_gcm(modname,abort_message,1)
1905             ENDIF
1906             rcode = nf90_inq_varid(ncidv, 'VWND', varidv)
1907             IF (rcode.NE.NF_NOERR) THEN
1908              print *,'Guide: probleme -> pas de variable VWND, fichier v.nc'
1909              CALL abort_gcm(modname,abort_message,1)
1910             ENDIF
1911             print*,'ncidv,varidv',ncidv,varidv
1912             if (ncidpl.eq.-99) ncidpl=ncidv
1913         endif
1914! Temperature
1915         if (guide_T) then
1916             rcode = nf90_open('T.nc', nf90_nowrite, ncidt)
1917             IF (rcode.NE.NF_NOERR) THEN
1918              print *,'Guide: probleme -> pas de fichier T.nc'
1919              CALL abort_gcm(modname,abort_message,1)
1920             ENDIF
1921             rcode = nf90_inq_varid(ncidt, 'AIR', varidt)
1922             IF (rcode.NE.NF_NOERR) THEN
1923              print *,'Guide: probleme -> pas de variable AIR, fichier T.nc'
1924              CALL abort_gcm(modname,abort_message,1)
1925             ENDIF
1926             print*,'ncidT,varidT',ncidt,varidt
1927             if (ncidpl.eq.-99) ncidpl=ncidt
1928         endif
1929! Humidite
1930         if (guide_Q) then
1931             rcode = nf90_open('hur.nc', nf90_nowrite, ncidQ)
1932             IF (rcode.NE.NF_NOERR) THEN
1933              print *,'Guide: probleme -> pas de fichier hur.nc'
1934              CALL abort_gcm(modname,abort_message,1)
1935             ENDIF
1936             rcode = nf90_inq_varid(ncidQ, 'RH', varidQ)
1937             IF (rcode.NE.NF_NOERR) THEN
1938              print *,'Guide: probleme -> pas de variable RH, fichier hur.nc'
1939              CALL abort_gcm(modname,abort_message,1)
1940             ENDIF
1941             print*,'ncidQ,varidQ',ncidQ,varidQ
1942             if (ncidpl.eq.-99) ncidpl=ncidQ
1943         endif
1944! Pression de surface
1945         if ((guide_P).OR.(guide_plevs.EQ.1)) then
1946             rcode = nf90_open('ps.nc', nf90_nowrite, ncidps)
1947             IF (rcode.NE.NF_NOERR) THEN
1948              print *,'Guide: probleme -> pas de fichier ps.nc'
1949              CALL abort_gcm(modname,abort_message,1)
1950             ENDIF
1951             rcode = nf90_inq_varid(ncidps, 'SP', varidps)
1952             IF (rcode.NE.NF_NOERR) THEN
1953              print *,'Guide: probleme -> pas de variable SP, fichier ps.nc'
1954              CALL abort_gcm(modname,abort_message,1)
1955             ENDIF
1956             print*,'ncidps,varidps',ncidps,varidps
1957         endif
1958! Coordonnee verticale
1959         if (guide_plevs.EQ.0) then
1960              rcode = nf90_inq_varid(ncidpl, 'LEVEL', varidpl)
1961              IF (rcode.NE.0) rcode = nf90_inq_varid(ncidpl, 'PRESSURE', varidpl)
1962              print*,'ncidpl,varidpl',ncidpl,varidpl
1963         endif
1964! Coefs ap, bp pour calcul de la pression aux differents niveaux
1965         if (guide_plevs.EQ.1) then
1966#ifdef NC_DOUBLE
1967             status=NF_GET_VARA_DOUBLE(ncidpl,varidap,1,nlevnc,apnc)
1968             status=NF_GET_VARA_DOUBLE(ncidpl,varidbp,1,nlevnc,bpnc)
1969#else
1970             status=NF_GET_VARA_REAL(ncidpl,varidap,1,nlevnc,apnc)
1971             status=NF_GET_VARA_REAL(ncidpl,varidbp,1,nlevnc,bpnc)
1972#endif
1973         elseif (guide_plevs.EQ.0) THEN
1974#ifdef NC_DOUBLE
1975             status=NF_GET_VARA_DOUBLE(ncidpl,varidpl,1,nlevnc,apnc)
1976#else
1977             status=NF_GET_VARA_REAL(ncidpl,varidpl,1,nlevnc,apnc)
1978#endif
1979             apnc=apnc*100.! conversion en Pascals
1980             bpnc(:)=0.
1981         endif
1982         first=.FALSE.
1983     endif ! (first)
1984
1985! -----------------------------------------------------------------
1986!   lecture des champs u, v, T, Q, ps
1987! -----------------------------------------------------------------
1988
1989!  dimensions pour les champs scalaires et le vent zonal
1990     start(1)=1
1991     start(2)=jjb_u
1992     start(3)=1
1993     start(4)=timestep
1994
1995     count(1)=1
1996     count(2)=jjnb_u
1997     count(3)=nlevnc
1998     count(4)=1
1999
2000     IF (invert_y) start(2)=jjp1-jje_u+1
2001!  Pression
2002     if (guide_plevs.EQ.2) then
2003#ifdef NC_DOUBLE
2004         status=NF_GET_VARA_DOUBLE(ncidp,varidp,start,count,zu)
2005#else
2006         status=NF_GET_VARA_REAL(ncidp,varidp,start,count,zu)
2007#endif
2008         DO i=1,iip1
2009             pnat2(i,:,:)=zu(:,:)
2010         ENDDO
2011
2012         IF (invert_y) THEN
2013!           PRINT*,"Invertion impossible actuellement"
2014!           CALL abort_gcm(modname,abort_message,1)
2015           CALL invert_lat(iip1,jjnb_u,nlevnc,pnat2)
2016         ENDIF
2017     endif
2018!  Vent zonal
2019     if (guide_u) then
2020#ifdef NC_DOUBLE
2021         status=NF_GET_VARA_DOUBLE(ncidu,varidu,start,count,zu)
2022#else
2023         status=NF_GET_VARA_REAL(ncidu,varidu,start,count,zu)
2024#endif
2025         DO i=1,iip1
2026             unat2(i,:,:)=zu(:,:)
2027         ENDDO
2028
2029         IF (invert_y) THEN
2030!           PRINT*,"Invertion impossible actuellement"
2031!           CALL abort_gcm(modname,abort_message,1)
2032           CALL invert_lat(iip1,jjnb_u,nlevnc,unat2)
2033         ENDIF
2034     endif
2035
2036
2037!  Temperature
2038     if (guide_T) then
2039#ifdef NC_DOUBLE
2040         status=NF_GET_VARA_DOUBLE(ncidt,varidt,start,count,zu)
2041#else
2042         status=NF_GET_VARA_REAL(ncidt,varidt,start,count,zu)
2043#endif
2044         DO i=1,iip1
2045             tnat2(i,:,:)=zu(:,:)
2046         ENDDO
2047
2048         IF (invert_y) THEN
2049!           PRINT*,"Invertion impossible actuellement"
2050!           CALL abort_gcm(modname,abort_message,1)
2051           CALL invert_lat(iip1,jjnb_u,nlevnc,tnat2)
2052         ENDIF
2053     endif
2054
2055!  Humidite
2056     if (guide_Q) then
2057#ifdef NC_DOUBLE
2058         status=NF_GET_VARA_DOUBLE(ncidQ,varidQ,start,count,zu)
2059#else
2060         status=NF_GET_VARA_REAL(ncidQ,varidQ,start,count,zu)
2061#endif
2062         DO i=1,iip1
2063             qnat2(i,:,:)=zu(:,:)
2064         ENDDO
2065         
2066         IF (invert_y) THEN
2067!           PRINT*,"Invertion impossible actuellement"
2068!           CALL abort_gcm(modname,abort_message,1)
2069           CALL invert_lat(iip1,jjnb_u,nlevnc,qnat2)
2070         ENDIF
2071     endif
2072
2073!  Vent meridien
2074     if (guide_v) then
2075         start(2)=jjb_v
2076         count(2)=jjnb_v
2077         IF (invert_y) start(2)=jjm-jje_v+1
2078#ifdef NC_DOUBLE
2079         status=NF_GET_VARA_DOUBLE(ncidv,varidv,start,count,zv)
2080#else
2081         status=NF_GET_VARA_REAL(ncidv,varidv,start,count,zv)
2082#endif
2083         DO i=1,iip1
2084             vnat2(i,:,:)=zv(:,:)
2085         ENDDO
2086
2087         IF (invert_y) THEN
2088 
2089!           PRINT*,"Invertion impossible actuellement"
2090!           CALL abort_gcm(modname,abort_message,1)
2091           CALL invert_lat(iip1,jjnb_v,nlevnc,vnat2)
2092         ENDIF
2093     endif
2094
2095!  Pression de surface
2096     if ((guide_P).OR.(guide_plevs.EQ.1))  then
2097         start(2)=jjb_u
2098         start(3)=timestep
2099         start(4)=0
2100         count(2)=jjnb_u
2101         count(3)=1
2102         count(4)=0
2103         IF (invert_y) start(2)=jjp1-jje_u+1
2104#ifdef NC_DOUBLE
2105         status=NF_GET_VARA_DOUBLE(ncidps,varidps,start,count,zu(:,1))
2106#else
2107         status=NF_GET_VARA_REAL(ncidps,varidps,start,count,zu(:,1))
2108#endif
2109         DO i=1,iip1
2110             psnat2(i,:)=zu(:,1)
2111         ENDDO
2112
2113         IF (invert_y) THEN
2114!           PRINT*,"Invertion impossible actuellement"
2115!           CALL abort_gcm(modname,abort_message,1)
2116           CALL invert_lat(iip1,jjnb_u,1,psnat2)
2117         ENDIF
2118     endif
2119
2120  END SUBROUTINE guide_read2D
2121 
2122!=======================================================================
2123  SUBROUTINE guide_out(varname,hsize,vsize,field_loc,factt)
2124    USE parallel_lmdz
2125    USE mod_hallo, ONLY : gather_field_u, gather_field_v
2126    IMPLICIT NONE
2127
2128    INCLUDE "dimensions.h"
2129    INCLUDE "paramet.h"
2130    INCLUDE "netcdf.inc"
2131    INCLUDE "comgeom2.h"
2132    INCLUDE "comconst.h"
2133    INCLUDE "comvert.h"
2134   
2135    ! Variables entree
2136    CHARACTER*(*), INTENT(IN)                      :: varname
2137    INTEGER,   INTENT (IN)                         :: hsize,vsize
2138!   REAL, DIMENSION (iip1,hsize,vsize), INTENT(IN) :: field_loc
2139    REAL, DIMENSION (:,:), INTENT(IN) :: field_loc
2140    REAL factt
2141
2142    ! Variables locales
2143    INTEGER, SAVE :: timestep=0
2144    ! Identites fichier netcdf
2145    INTEGER       :: nid, id_lonu, id_lonv, id_latu, id_latv, id_tim, id_lev
2146    INTEGER       :: vid_lonu,vid_lonv,vid_latu,vid_latv,vid_cu,vid_cv,vid_lev
2147    INTEGER       :: vid_au,vid_av
2148    INTEGER, DIMENSION (3) :: dim3
2149    INTEGER, DIMENSION (4) :: dim4,count,start
2150    INTEGER                :: ierr, varid,l
2151    REAL zu(ip1jmp1),zv(ip1jm)
2152    REAL, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: field_glo
2153   
2154!$OMP MASTER
2155    ALLOCATE(field_glo(iip1,hsize,vsize))
2156!$OMP END MASTER
2157!$OMP BARRIER
2158
2159    print*,'gvide_out apres allocation ',hsize,vsize
2160
2161    IF (hsize==jjp1) THEN
2162        CALL gather_field_u(field_loc,field_glo,vsize)
2163    ELSE IF (hsize==jjm) THEN
2164       CALL gather_field_v(field_loc,field_glo, vsize)
2165    ENDIF
2166
2167    print*,'guide_out apres gather '
2168    CALL Gather_field_u(alpha_u,zu,1)
2169    CALL Gather_field_v(alpha_v,zv,1)
2170
2171    IF (mpi_rank >  0) THEN
2172!$OMP MASTER
2173       DEALLOCATE(field_glo)
2174!$OMP END MASTER
2175!$OMP BARRIER
2176
2177       RETURN
2178    ENDIF
2179   
2180!$OMP MASTER
2181    IF (timestep.EQ.0) THEN
2182! ----------------------------------------------
2183! initialisation fichier de sortie
2184! ----------------------------------------------
2185! Ouverture du fichier
2186        ierr=NF_CREATE("guide_ins.nc",NF_CLOBBER,nid)
2187! Definition des dimensions
2188        ierr=NF_DEF_DIM(nid,"LONU",iip1,id_lonu)
2189        ierr=NF_DEF_DIM(nid,"LONV",iip1,id_lonv)
2190        ierr=NF_DEF_DIM(nid,"LATU",jjp1,id_latu)
2191        ierr=NF_DEF_DIM(nid,"LATV",jjm,id_latv)
2192        ierr=NF_DEF_DIM(nid,"LEVEL",llm,id_lev)
2193        ierr=NF_DEF_DIM(nid,"TIME",NF_UNLIMITED,id_tim)
2194
2195! Creation des variables dimensions
2196        ierr=NF_DEF_VAR(nid,"LONU",NF_FLOAT,1,id_lonu,vid_lonu)
2197        ierr=NF_DEF_VAR(nid,"LONV",NF_FLOAT,1,id_lonv,vid_lonv)
2198        ierr=NF_DEF_VAR(nid,"LATU",NF_FLOAT,1,id_latu,vid_latu)
2199        ierr=NF_DEF_VAR(nid,"LATV",NF_FLOAT,1,id_latv,vid_latv)
2200        ierr=NF_DEF_VAR(nid,"LEVEL",NF_FLOAT,1,id_lev,vid_lev)
2201        ierr=NF_DEF_VAR(nid,"cu",NF_FLOAT,2,(/id_lonu,id_latu/),vid_cu)
2202        ierr=NF_DEF_VAR(nid,"cv",NF_FLOAT,2,(/id_lonv,id_latv/),vid_cv)
2203        ierr=NF_DEF_VAR(nid,"au",NF_FLOAT,2,(/id_lonu,id_latu/),vid_au)
2204        ierr=NF_DEF_VAR(nid,"av",NF_FLOAT,2,(/id_lonv,id_latv/),vid_av)
2205
2206        ierr=NF_ENDDEF(nid)
2207
2208! Enregistrement des variables dimensions
2209#ifdef NC_DOUBLE
2210        ierr = NF_PUT_VAR_DOUBLE(nid,vid_lonu,rlonu*180./pi)
2211        ierr = NF_PUT_VAR_DOUBLE(nid,vid_lonv,rlonv*180./pi)
2212        ierr = NF_PUT_VAR_DOUBLE(nid,vid_latu,rlatu*180./pi)
2213        ierr = NF_PUT_VAR_DOUBLE(nid,vid_latv,rlatv*180./pi)
2214        ierr = NF_PUT_VAR_DOUBLE(nid,vid_lev,presnivs)
2215        ierr = NF_PUT_VAR_DOUBLE(nid,vid_cu,cu)
2216        ierr = NF_PUT_VAR_DOUBLE(nid,vid_cv,cv)
2217        ierr = NF_PUT_VAR_DOUBLE(nid,vid_au,zu)
2218        ierr = NF_PUT_VAR_DOUBLE(nid,vid_av,zv)
2219#else
2220        ierr = NF_PUT_VAR_REAL(nid,vid_lonu,rlonu*180./pi)
2221        ierr = NF_PUT_VAR_REAL(nid,vid_lonv,rlonv*180./pi)
2222        ierr = NF_PUT_VAR_REAL(nid,vid_latu,rlatu*180./pi)
2223        ierr = NF_PUT_VAR_REAL(nid,vid_latv,rlatv*180./pi)
2224        ierr = NF_PUT_VAR_REAL(nid,vid_lev,presnivs)
2225        ierr = NF_PUT_VAR_REAL(nid,vid_cu,cu)
2226        ierr = NF_PUT_VAR_REAL(nid,vid_cv,cv)
2227        ierr = NF_PUT_VAR_REAL(nid,vid_au,alpha_u)
2228        ierr = NF_PUT_VAR_REAL(nid,vid_av,alpha_v)
2229#endif
2230! --------------------------------------------------------------------
2231! Cr�ation des variables sauvegard�es
2232! --------------------------------------------------------------------
2233        ierr = NF_REDEF(nid)
2234! Pressure (GCM)
2235        dim4=(/id_lonv,id_latu,id_lev,id_tim/)
2236        ierr = NF_DEF_VAR(nid,"SP",NF_FLOAT,4,dim4,varid)
2237! Surface pressure (guidage)
2238        IF (guide_P) THEN
2239            dim3=(/id_lonv,id_latu,id_tim/)
2240            ierr = NF_DEF_VAR(nid,"ps",NF_FLOAT,3,dim3,varid)
2241        ENDIF
2242! Zonal wind
2243        IF (guide_u) THEN
2244            dim4=(/id_lonu,id_latu,id_lev,id_tim/)
2245            ierr = NF_DEF_VAR(nid,"u",NF_FLOAT,4,dim4,varid)
2246            ierr = NF_DEF_VAR(nid,"ua",NF_FLOAT,4,dim4,varid)
2247            ierr = NF_DEF_VAR(nid,"ucov",NF_FLOAT,4,dim4,varid)
2248        ENDIF
2249! Merid. wind
2250        IF (guide_v) THEN
2251            dim4=(/id_lonv,id_latv,id_lev,id_tim/)
2252            ierr = NF_DEF_VAR(nid,"v",NF_FLOAT,4,dim4,varid)
2253            ierr = NF_DEF_VAR(nid,"va",NF_FLOAT,4,dim4,varid)
2254            ierr = NF_DEF_VAR(nid,"vcov",NF_FLOAT,4,dim4,varid)
2255        ENDIF
2256! Pot. Temperature
2257        IF (guide_T) THEN
2258            dim4=(/id_lonv,id_latu,id_lev,id_tim/)
2259            ierr = NF_DEF_VAR(nid,"teta",NF_FLOAT,4,dim4,varid)
2260        ENDIF
2261! Specific Humidity
2262        IF (guide_Q) THEN
2263            dim4=(/id_lonv,id_latu,id_lev,id_tim/)
2264            ierr = NF_DEF_VAR(nid,"q",NF_FLOAT,4,dim4,varid)
2265        ENDIF
2266       
2267        ierr = NF_ENDDEF(nid)
2268        ierr = NF_CLOSE(nid)
2269    ENDIF ! timestep=0
2270
2271! --------------------------------------------------------------------
2272! Enregistrement du champ
2273! --------------------------------------------------------------------
2274 
2275    ierr=NF_OPEN("guide_ins.nc",NF_WRITE,nid)
2276
2277    IF (varname=="SP") timestep=timestep+1
2278
2279    ierr = NF_INQ_VARID(nid,varname,varid)
2280    SELECT CASE (varname)
2281    CASE ("SP","ps")
2282        start=(/1,1,1,timestep/)
2283        count=(/iip1,jjp1,llm,1/)
2284    CASE ("v","va","vcov")
2285        start=(/1,1,1,timestep/)
2286        count=(/iip1,jjm,llm,1/)
2287    CASE DEFAULT
2288        start=(/1,1,1,timestep/)
2289        count=(/iip1,jjp1,llm,1/)
2290    END SELECT
2291
2292!$OMP END MASTER
2293!$OMP BARRIER
2294
2295    SELECT CASE (varname)
2296
2297    CASE("u","ua")
2298!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
2299        DO l=1,llm
2300            field_glo(:,2:jjm,l)=field_glo(:,2:jjm,l)/cu(:,2:jjm)
2301            field_glo(:,1,l)=0. ; field_glo(:,jjp1,l)=0.
2302        ENDDO
2303    CASE("v","va")
2304!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
2305        DO l=1,llm
2306           field_glo(:,:,l)=field_glo(:,:,l)/cv(:,:)
2307        ENDDO
2308    END SELECT
2309
2310!    if (varname=="ua") then
2311!    call dump2d(iip1,jjp1,field_glo,'ua gui1 1ere couche ')
2312!    call dump2d(iip1,jjp1,field_glo(:,:,llm),'ua gui1 llm ')
2313!    endif
2314
2315!$OMP MASTER
2316
2317#ifdef NC_DOUBLE
2318    ierr = NF_PUT_VARA_DOUBLE(nid,varid,start,count,field_glo)
2319#else
2320    ierr = NF_PUT_VARA_REAL(nid,varid,start,count,field_glo)
2321#endif
2322
2323    ierr = NF_CLOSE(nid)
2324
2325       DEALLOCATE(field_glo)
2326!$OMP END MASTER
2327!$OMP BARRIER
2328
2329    RETURN
2330
2331  END SUBROUTINE guide_out
2332   
2333 
2334!===========================================================================
2335  subroutine correctbid(iim,nl,x)
2336    integer iim,nl
2337    real x(iim+1,nl)
2338    integer i,l
2339    real zz
2340
2341    do l=1,nl
2342        do i=2,iim-1
2343            if(abs(x(i,l)).gt.1.e10) then
2344               zz=0.5*(x(i-1,l)+x(i+1,l))
2345              print*,'correction ',i,l,x(i,l),zz
2346               x(i,l)=zz
2347            endif
2348         enddo
2349     enddo
2350     return
2351  end subroutine correctbid
2352
2353
2354!====================================================================
2355! Ascii debug output. Could be reactivated
2356!====================================================================
2357
2358subroutine dump2du(var,varname)
2359use parallel_lmdz
2360use mod_hallo
2361implicit none
2362include 'dimensions.h'
2363include 'paramet.h'
2364
2365      CHARACTER (len=*) :: varname
2366
2367
2368real, dimension(ijb_u:ije_u) :: var
2369
2370real, dimension(ip1jmp1) :: var_glob
2371
2372    RETURN
2373
2374    call barrier
2375    CALL Gather_field_u(var,var_glob,1)
2376    call barrier
2377
2378    if (mpi_rank==0) then
2379       call dump2d(iip1,jjp1,var_glob,varname)
2380    endif
2381
2382    call barrier
2383
2384    return
2385    end subroutine dump2du
2386
2387!====================================================================
2388! Ascii debug output. Could be reactivated
2389!====================================================================
2390subroutine dumpall
2391     implicit none
2392     include "dimensions.h"
2393     include "paramet.h"
2394     include "comgeom.h"
2395     call barrier
2396     call dump2du(alpha_u(ijb_u:ije_u),'  alpha_u couche 1')
2397     call dump2du(unat2(:,jjbu:jjeu,nlevnc),'  unat2 couche nlevnc')
2398     call dump2du(ugui1(ijb_u:ije_u,1)*sqrt(unscu2(ijb_u:ije_u)),'  ugui1 couche 1')
2399     return
2400end subroutine dumpall
2401
2402!===========================================================================
2403END MODULE guide_loc_mod
Note: See TracBrowser for help on using the repository browser.