13 use netcdf
, only: nf90_nowrite, nf90_open, nf90_inq_varid, nf90_close
21 INTEGER,
PRIVATE,
SAVE :: iguide_read,iguide_int,iguide_sav
22 INTEGER,
PRIVATE,
SAVE :: nlevnc
23 LOGICAL,
PRIVATE,
SAVE :: guide_u,guide_v,guide_T,guide_Q,guide_P
24 LOGICAL,
PRIVATE,
SAVE :: guide_hr,guide_teta
25 LOGICAL,
PRIVATE,
SAVE :: guide_BL,guide_reg,guide_add,gamma4,guide_zon
26 LOGICAL,
PRIVATE,
SAVE :: guide_modele,invert_p,invert_y,ini_anal
27 LOGICAL,
PRIVATE,
SAVE :: guide_2D,guide_sav
29 REAL,
PRIVATE,
SAVE :: tau_min_u,tau_max_u
30 REAL,
PRIVATE,
SAVE :: tau_min_v,tau_max_v
31 REAL,
PRIVATE,
SAVE :: tau_min_T,tau_max_T
32 REAL,
PRIVATE,
SAVE :: tau_min_Q,tau_max_Q
33 REAL,
PRIVATE,
SAVE :: tau_min_P,tau_max_P
35 REAL,
PRIVATE,
SAVE :: lat_min_g,lat_max_g
36 REAL,
PRIVATE,
SAVE :: lon_min_g,lon_max_g
37 REAL,
PRIVATE,
SAVE :: tau_lon,tau_lat
39 REAL,
ALLOCATABLE,
DIMENSION(:),
PRIVATE,
SAVE :: alpha_u,alpha_v
40 REAL,
ALLOCATABLE,
DIMENSION(:),
PRIVATE,
SAVE :: alpha_T,alpha_Q
41 REAL,
ALLOCATABLE,
DIMENSION(:),
PRIVATE,
SAVE :: alpha_P,alpha_pcor
47 REAL,
ALLOCATABLE,
DIMENSION(:,:,:),
PRIVATE,
SAVE :: unat1,unat2
48 REAL,
ALLOCATABLE,
DIMENSION(:,:,:),
PRIVATE,
SAVE :: vnat1,vnat2
49 REAL,
ALLOCATABLE,
DIMENSION(:,:,:),
PRIVATE,
SAVE :: tnat1,tnat2
50 REAL,
ALLOCATABLE,
DIMENSION(:,:,:),
PRIVATE,
SAVE :: qnat1,qnat2
51 REAL,
ALLOCATABLE,
DIMENSION(:,:),
PRIVATE,
SAVE :: psnat1,psnat2
52 REAL,
ALLOCATABLE,
DIMENSION(:),
PRIVATE,
SAVE :: apnc,bpnc
54 REAL,
ALLOCATABLE,
DIMENSION(:,:),
PRIVATE,
SAVE :: ugui1,ugui2
55 REAL,
ALLOCATABLE,
DIMENSION(:,:),
PRIVATE,
SAVE :: vgui1,vgui2
56 REAL,
ALLOCATABLE,
DIMENSION(:,:),
PRIVATE,
SAVE :: tgui1,tgui2
57 REAL,
ALLOCATABLE,
DIMENSION(:,:),
PRIVATE,
SAVE :: qgui1,qgui2
58 REAL,
ALLOCATABLE,
DIMENSION(:),
PRIVATE,
SAVE :: psgui1,psgui2
69 include
"dimensions.h"
73 INTEGER :: error,ncidpl,rid,rcod
74 CHARACTER (len = 80) :: abort_message
75 CHARACTER (len = 20) :: modname =
'guide_init'
81 CALL
getpar(
'guide_u',.true.,guide_u,
'guidage de u')
82 CALL
getpar(
'guide_v',.true.,guide_v,
'guidage de v')
83 CALL
getpar(
'guide_T',.true.,guide_t,
'guidage de T')
84 CALL
getpar(
'guide_P',.true.,guide_p,
'guidage de P')
85 CALL
getpar(
'guide_Q',.true.,guide_q,
'guidage de Q')
86 CALL
getpar(
'guide_hr',.true.,guide_hr,
'guidage de Q par H.R')
87 CALL
getpar(
'guide_teta',.
false.,guide_teta,
'guidage de T par Teta')
89 CALL
getpar(
'guide_add',.
false.,guide_add,
'for�age constant?')
90 CALL
getpar(
'guide_zon',.
false.,guide_zon,
'guidage moy zonale')
93 CALL
getpar(
'tau_min_u',0.02,tau_min_u,
'Cste de rappel min, u')
94 CALL
getpar(
'tau_max_u', 10.,tau_max_u,
'Cste de rappel max, u')
95 CALL
getpar(
'tau_min_v',0.02,tau_min_v,
'Cste de rappel min, v')
96 CALL
getpar(
'tau_max_v', 10.,tau_max_v,
'Cste de rappel max, v')
97 CALL
getpar(
'tau_min_T',0.02,tau_min_t,
'Cste de rappel min, T')
98 CALL
getpar(
'tau_max_T', 10.,tau_max_t,
'Cste de rappel max, T')
99 CALL
getpar(
'tau_min_Q',0.02,tau_min_q,
'Cste de rappel min, Q')
100 CALL
getpar(
'tau_max_Q', 10.,tau_max_q,
'Cste de rappel max, Q')
101 CALL
getpar(
'tau_min_P',0.02,tau_min_p,
'Cste de rappel min, P')
102 CALL
getpar(
'tau_max_P', 10.,tau_max_p,
'Cste de rappel max, P')
103 CALL
getpar(
'gamma4',.
false.,gamma4,
'Zone sans rappel elargie')
104 CALL
getpar(
'guide_BL',.true.,guide_bl,
'guidage dans C.Lim')
107 CALL
getpar(
'guide_sav',.
false.,guide_sav,
'sauvegarde guidage')
108 CALL
getpar(
'iguide_sav',4,iguide_sav,
'freq. sauvegarde guidage')
110 IF (iguide_sav.GT.0)
THEN
111 iguide_sav=day_step/iguide_sav
113 iguide_sav=day_step*iguide_sav
117 CALL
getpar(
'guide_reg',.
false.,guide_reg,
'guidage regional')
118 CALL
getpar(
'lat_min_g',-90.,lat_min_g,
'Latitude mini guidage ')
119 CALL
getpar(
'lat_max_g', 90.,lat_max_g,
'Latitude maxi guidage ')
120 CALL
getpar(
'lon_min_g',-180.,lon_min_g,
'longitude mini guidage ')
121 CALL
getpar(
'lon_max_g', 180.,lon_max_g,
'longitude maxi guidage ')
122 CALL
getpar(
'tau_lat', 5.,tau_lat,
'raideur lat guide regional ')
123 CALL
getpar(
'tau_lon', 5.,tau_lon,
'raideur lon guide regional ')
126 CALL
getpar(
'iguide_read',4,iguide_read,
'freq. lecture guidage')
127 CALL
getpar(
'iguide_int',4,iguide_int,
'freq. lecture guidage')
128 IF (iguide_int.GT.0)
THEN
129 iguide_int=day_step/iguide_int
131 iguide_int=day_step*iguide_int
133 CALL
getpar(
'guide_modele',.
false.,guide_modele,
'guidage niveaux modele')
134 CALL
getpar(
'ini_anal',.
false.,ini_anal,
'Etat initial = analyse')
135 CALL
getpar(
'guide_invertp',.true.,invert_p,
'niveaux p inverses')
136 CALL
getpar(
'guide_inverty',.true.,invert_y,
'inversion N-S')
137 CALL
getpar(
'guide_2D',.
false.,guide_2d,
'fichier guidage lat-P')
144 if (guide_modele)
then
145 if (ncidpl.eq.-99) rcod=nf90_open(
'apbp.nc',nf90_nowrite, ncidpl)
148 if (ncidpl.eq.-99) rcod=nf90_open(
'u.nc',nf90_nowrite,ncidpl)
149 elseif (guide_v)
then
150 if (ncidpl.eq.-99) rcod=nf90_open(
'v.nc',nf90_nowrite,ncidpl)
151 elseif (guide_t)
then
152 if (ncidpl.eq.-99) rcod=nf90_open(
'T.nc',nf90_nowrite,ncidpl)
153 elseif (guide_q)
then
154 if (ncidpl.eq.-99) rcod=nf90_open(
'hur.nc',nf90_nowrite, ncidpl)
157 error=nf_inq_dimid(ncidpl,
'LEVEL',rid)
158 IF (error.NE.nf_noerr) error=nf_inq_dimid(ncidpl,
'PRESSURE',rid)
159 IF (error.NE.nf_noerr)
THEN
160 print *,
'Guide: probleme lecture niveaux pression'
163 error=nf_inq_dimlen(ncidpl,rid,nlevnc)
164 print *,
'Guide: nombre niveaux vert. nlevnc', nlevnc
165 rcod = nf90_close(ncidpl)
170 abort_message=
'pb in allocation guide'
172 ALLOCATE(apnc(nlevnc), stat = error)
173 IF (error /= 0) CALL
abort_gcm(modname,abort_message,1)
174 ALLOCATE(bpnc(nlevnc), stat = error)
175 IF (error /= 0) CALL
abort_gcm(modname,abort_message,1)
178 ALLOCATE(alpha_pcor(llm), stat = error)
179 IF (error /= 0) CALL
abort_gcm(modname,abort_message,1)
180 ALLOCATE(alpha_u(
ip1jmp1), stat = error)
181 IF (error /= 0) CALL
abort_gcm(modname,abort_message,1)
182 ALLOCATE(alpha_v(
ip1jm), stat = error)
183 IF (error /= 0) CALL
abort_gcm(modname,abort_message,1)
184 ALLOCATE(alpha_t(
ip1jmp1), stat = error)
185 IF (error /= 0) CALL
abort_gcm(modname,abort_message,1)
186 ALLOCATE(alpha_q(
ip1jmp1), stat = error)
187 IF (error /= 0) CALL
abort_gcm(modname,abort_message,1)
188 ALLOCATE(alpha_p(
ip1jmp1), stat = error)
189 IF (error /= 0) CALL
abort_gcm(modname,abort_message,1)
190 alpha_u=0.;alpha_v=0;alpha_t=0;alpha_q=0;alpha_p=0
193 ALLOCATE(unat1(iip1,
jjp1,nlevnc), stat = error)
194 IF (error /= 0) CALL
abort_gcm(modname,abort_message,1)
195 ALLOCATE(ugui1(
ip1jmp1,llm), stat = error)
196 IF (error /= 0) CALL
abort_gcm(modname,abort_message,1)
197 ALLOCATE(unat2(iip1,
jjp1,nlevnc), stat = error)
198 IF (error /= 0) CALL
abort_gcm(modname,abort_message,1)
199 ALLOCATE(ugui2(
ip1jmp1,llm), stat = error)
200 IF (error /= 0) CALL
abort_gcm(modname,abort_message,1)
201 unat1=0.;unat2=0.;ugui1=0.;ugui2=0.
205 ALLOCATE(tnat1(iip1,
jjp1,nlevnc), stat = error)
206 IF (error /= 0) CALL
abort_gcm(modname,abort_message,1)
207 ALLOCATE(tgui1(
ip1jmp1,llm), stat = error)
208 IF (error /= 0) CALL
abort_gcm(modname,abort_message,1)
209 ALLOCATE(tnat2(iip1,
jjp1,nlevnc), stat = error)
210 IF (error /= 0) CALL
abort_gcm(modname,abort_message,1)
211 ALLOCATE(tgui2(
ip1jmp1,llm), stat = error)
212 IF (error /= 0) CALL
abort_gcm(modname,abort_message,1)
213 tnat1=0.;tnat2=0.;tgui1=0.;tgui2=0.
217 ALLOCATE(qnat1(iip1,
jjp1,nlevnc), stat = error)
218 IF (error /= 0) CALL
abort_gcm(modname,abort_message,1)
219 ALLOCATE(qgui1(
ip1jmp1,llm), stat = error)
220 IF (error /= 0) CALL
abort_gcm(modname,abort_message,1)
221 ALLOCATE(qnat2(iip1,
jjp1,nlevnc), stat = error)
222 IF (error /= 0) CALL
abort_gcm(modname,abort_message,1)
223 ALLOCATE(qgui2(
ip1jmp1,llm), stat = error)
224 IF (error /= 0) CALL
abort_gcm(modname,abort_message,1)
225 qnat1=0.;qnat2=0.;qgui1=0.;qgui2=0.
229 ALLOCATE(vnat1(iip1,jjm,nlevnc), stat = error)
230 IF (error /= 0) CALL
abort_gcm(modname,abort_message,1)
231 ALLOCATE(vgui1(
ip1jm,llm), stat = error)
232 IF (error /= 0) CALL
abort_gcm(modname,abort_message,1)
233 ALLOCATE(vnat2(iip1,jjm,nlevnc), stat = error)
234 IF (error /= 0) CALL
abort_gcm(modname,abort_message,1)
235 ALLOCATE(vgui2(
ip1jm,llm), stat = error)
236 IF (error /= 0) CALL
abort_gcm(modname,abort_message,1)
237 vnat1=0.;vnat2=0.;vgui1=0.;vgui2=0.
240 IF (guide_p.OR.guide_modele)
THEN
241 ALLOCATE(psnat1(iip1,
jjp1), stat = error)
242 IF (error /= 0) CALL
abort_gcm(modname,abort_message,1)
243 ALLOCATE(psnat2(iip1,
jjp1), stat = error)
244 IF (error /= 0) CALL
abort_gcm(modname,abort_message,1)
248 ALLOCATE(psgui2(
ip1jmp1), stat = error)
249 IF (error /= 0) CALL
abort_gcm(modname,abort_message,1)
250 ALLOCATE(psgui1(
ip1jmp1), stat = error)
251 IF (error /= 0) CALL
abort_gcm(modname,abort_message,1)
263 IF (guide_v) vnat1=vnat2
264 IF (guide_u) unat1=unat2
265 IF (guide_t) tnat1=tnat2
266 IF (guide_q) qnat1=qnat2
267 IF (guide_p.OR.guide_modele) psnat1=psnat2
278 include
"dimensions.h"
284 INTEGER,
INTENT(IN) :: itau
285 REAL,
DIMENSION (ip1jmp1,llm),
INTENT(INOUT) :: ucov,
teta,
q,masse
286 REAL,
DIMENSION (ip1jm,llm),
INTENT(INOUT) :: vcov
287 REAL,
DIMENSION (ip1jmp1),
INTENT(INOUT) :: ps
290 LOGICAL,
SAVE :: first=.true.
292 REAL,
DIMENSION (ip1jmp1,llm) :: f_add
293 REAL,
DIMENSION (ip1jmp1,llm) :: p
295 INTEGER,
SAVE :: step_rea,count_no_rea,itau_test
296 REAL :: ditau, dday_step
313 call
tau2alpha(3,iip1,jjm ,factt,tau_min_v,tau_max_v,alpha_v)
314 call
tau2alpha(2,iip1,
jjp1,factt,tau_min_u,tau_max_u,alpha_u)
315 call
tau2alpha(1,iip1,
jjp1,factt,tau_min_t,tau_max_t,alpha_t)
316 call
tau2alpha(1,iip1,
jjp1,factt,tau_min_p,tau_max_p,alpha_p)
317 call
tau2alpha(1,iip1,
jjp1,factt,tau_min_q,tau_max_q,alpha_q)
329 IF (guide_u) ucov=ugui2
330 IF (guide_v) vcov=ugui2
331 IF (guide_t)
teta=tgui2
355 IF (iguide_read.NE.0)
THEN
357 dday_step=
real(day_step)
358 IF (iguide_read.LT.0)
THEN
359 tau=ditau/dday_step/
REAL(iguide_read)
361 tau=
REAL(iguide_read)*ditau/dday_step
364 IF (reste.EQ.0.)
THEN
365 IF (itau_test.EQ.itau)
THEN
366 write(*,*)
'deuxieme passage de advreel a itau=',itau
369 IF (guide_v) vnat1=vnat2
370 IF (guide_u) unat1=unat2
371 IF (guide_t) tnat1=tnat2
372 IF (guide_q) qnat1=qnat2
373 IF (guide_p.OR.guide_modele) psnat1=psnat2
376 print*,
'Lecture fichiers guidage, pas ',step_rea, &
377 'apres ',count_no_rea,
' non lectures'
386 count_no_rea=count_no_rea+1
394 IF (mod(itau,iguide_int).EQ.0)
THEN
398 IF (iguide_read.NE.0)
THEN
408 f_out=((mod(itau,iguide_sav).EQ.0).AND.guide_sav)
413 f_add=(1.-
tau)*ugui1+
tau*ugui2
415 f_add=(1.-
tau)*ugui1+
tau*ugui2-ucov
425 f_add=(1.-
tau)*tgui1+
tau*tgui2
451 f_add=(1.-
tau)*qgui1+
tau*qgui2
453 f_add=(1.-
tau)*qgui1+
tau*qgui2-
q
470 vcov=vcov+f_add(1:
ip1jm,:)
481 INTEGER,
INTENT(IN) :: hsize
482 INTEGER,
INTENT(IN) :: vsize
483 REAL,
DIMENSION(hsize),
INTENT(IN) ::
alpha
484 REAL,
DIMENSION(hsize,vsize),
INTENT(INOUT) :: field
490 field(:,
l)=
alpha*field(:,
l)*alpha_pcor(
l)
500 include
"dimensions.h"
506 INTEGER,
INTENT(IN) :: typ
507 INTEGER,
INTENT(IN) :: vsize
508 INTEGER,
INTENT(IN) :: hsize
509 REAL,
DIMENSION(hsize*iip1,vsize),
INTENT(INOUT) :: field
512 LOGICAL,
SAVE :: first=.true.
513 INTEGER,
DIMENSION (2),
SAVE :: imin, imax
515 REAL,
DIMENSION (iip1) :: lond
516 REAL,
DIMENSION (hsize,vsize):: fieldm
522 imin(1)=1;imax(1)=iip1;
523 imin(2)=1;imax(2)=iip1;
526 IF (lond(
i).LT.lon_min_g) imin(1)=
i
527 IF (lond(
i).LE.lon_max_g) imax(1)=
i
531 IF (lond(
i).LT.lon_min_g) imin(2)=
i
532 IF (lond(
i).LE.lon_max_g) imax(2)=
i
541 DO i=imin(typ),imax(typ)
543 fieldm(
j,
l)=fieldm(
j,
l)+field(
ij,
l)
546 fieldm(:,
l)=fieldm(:,
l)/
REAL(imax(typ)-imin(typ)+1)
551 field(
ij,
l)=fieldm(
j,
l)
563 include
"dimensions.h"
569 REAL,
DIMENSION (iip1,jjp1),
INTENT(IN) :: psi
570 REAL,
DIMENSION (iip1,jjp1,llm),
INTENT(IN) ::
teta
572 LOGICAL,
SAVE :: first=.true.
574 REAL,
DIMENSION (iip1,jjp1,nlevnc) :: plnc1,plnc2
575 REAL,
DIMENSION (iip1,jjp1,llm) :: plunc,plsnc
576 REAL,
DIMENSION (iip1,jjm,llm) :: plvnc
577 REAL,
DIMENSION (iip1,jjp1,llmp1) :: p
578 REAL,
DIMENSION (iip1,jjp1,llm) :: pls, pext
579 REAL,
DIMENSION (iip1,jjp1,llm) :: pbarx
580 REAL,
DIMENSION (iip1,jjm,llm) :: pbary
582 REAL,
DIMENSION (iip1,jjp1,llm) :: pk, pkf
583 REAL,
DIMENSION (iip1,jjp1,llm) ::
alpha,
beta
584 REAL,
DIMENSION (iip1,jjp1) :: pks
585 REAL :: prefkap,unskap
587 REAL,
DIMENSION (ip1jmp1,llm) :: qsat
589 REAL,
DIMENSION (iip1,jjp1,llm) :: zu1,zu2
590 REAL,
DIMENSION (iip1,jjm,llm) :: zv1,zv2
594 print *,
'Guide: conversion variables guidage'
598 if (guide_modele)
then
602 plnc2(
i,
j,
l)=apnc(
l)+bpnc(
l)*psnat2(
i,
j)
603 plnc1(
i,
j,
l)=apnc(
l)+bpnc(
l)*psnat1(
i,
j)
620 print*,
'Guide: verification ordre niveaux verticaux'
623 print*,
'PL(',
l,
')=',(
ap(
l)+
ap(
l+1))/2. &
626 print*,
'Fichiers guidage'
628 print*,
'PL(',
l,
')=',plnc2(1,1,
l)
630 print *,
'inversion de l''ordre: invert_p=',invert_p
633 print*,
'U(',
l,
')=',unat2(1,1,
l)
638 print*,
'T(',
l,
')=',tnat2(1,1,
l)
647 if (pressure_exner)
then
671 call
massbar(pext, pbarx, pbary )
696 psgui1(
ij)=psnat1(
i,
j)
697 psgui2(
ij)=psnat2(
i,
j)
699 psgui1(iip1*
j)=psnat1(1,
j)
700 psgui2(iip1*
j)=psnat2(1,
j)
705 CALL
pres2lev(unat1,zu1,nlevnc,llm,plnc1,plunc,iip1,
jjp1,invert_p)
706 CALL
pres2lev(unat2,zu2,nlevnc,llm,plnc2,plunc,iip1,
jjp1,invert_p)
714 ugui1(
j*iip1,
l)=ugui1((
j-1)*iip1+1,
l)
715 ugui2(
j*iip1,
l)=ugui2((
j-1)*iip1+1,
l)
727 CALL
pres2lev(tnat1,zu1,nlevnc,llm,plnc1,plsnc,iip1,
jjp1,invert_p)
728 CALL
pres2lev(tnat2,zu2,nlevnc,llm,plnc2,plsnc,iip1,
jjp1,invert_p)
744 tgui1(
j*iip1,
l)=tgui1((
j-1)*iip1+1,
l)
745 tgui2(
j*iip1,
l)=tgui2((
j-1)*iip1+1,
l)
748 tgui1(
i,
l)=tgui1(1,
l)
750 tgui2(
i,
l)=tgui2(1,
l)
758 CALL
pres2lev(vnat1,zv1,nlevnc,llm,plnc1(:,:jjm,:),plvnc,iip1,jjm,invert_p)
759 CALL
pres2lev(vnat2,zv2,nlevnc,llm,plnc2(:,:jjm,:),plvnc,iip1,jjm,invert_p)
768 vgui1(
j*iip1,
l)=vgui1((
j-1)*iip1+1,
l)
769 vgui2(
j*iip1,
l)=vgui2((
j-1)*iip1+1,
l)
777 CALL
pres2lev(qnat1,zu1,nlevnc,llm,plnc1,plsnc,iip1,
jjp1,invert_p)
778 CALL
pres2lev(qnat2,zu2,nlevnc,llm,plnc2,plsnc,iip1,
jjp1,invert_p)
786 qgui1(
j*iip1,
l)=qgui1((
j-1)*iip1+1,
l)
787 qgui2(
j*iip1,
l)=qgui2((
j-1)*iip1+1,
l)
790 qgui1(
i,
l)=qgui1(1,
l)
792 qgui2(
i,
l)=qgui2(1,
l)
798 qgui1=qgui1*qsat*0.01
799 qgui2=qgui2*qsat*0.01
806 SUBROUTINE tau2alpha(typ,pim,pjm,factt,taumin,taumax,alpha)
812 include
"dimensions.h"
819 INTEGER,
INTENT(IN) :: typ
820 INTEGER,
INTENT(IN) :: pim,pjm
821 REAL,
INTENT(IN) :: factt
822 REAL,
INTENT(IN) :: taumin,taumax
824 REAL,
DIMENSION(pim,pjm),
INTENT(OUT) ::
alpha
827 LOGICAL,
SAVE :: first=.true.
828 REAL,
SAVE ::
gamma,dxdy_min,dxdy_max
829 REAL,
DIMENSION (iip1,jjp1) :: zdx,zdy
830 REAL,
DIMENSION (iip1,jjp1) :: dxdys,dxdyu
831 REAL,
DIMENSION (iip1,jjm) :: dxdyv
834 real alphamin,alphamax,xi
835 integer i,
j,ilon,ilat
838 alphamin=factt/taumax
839 alphamax=factt/taumin
840 IF (guide_reg.OR.guide_add)
THEN
851 elseif (typ.eq.1)
then
854 elseif (typ.eq.3)
then
859 (1.+tanh((zlat-lat_min_g)/tau_lat))* &
860 (1.+tanh((lat_max_g-zlat)/tau_lat))* &
861 (1.+tanh((zlon-lon_min_g)/tau_lon))* &
862 (1.+tanh((lon_max_g-zlon)/tau_lon))
890 dxdys(
i,
j)=sqrt(zdx(
i,
j)*zdx(
i,
j)+zdy(
i,
j)*zdy(
i,
j))
896 dxdyu(
i,
j)=0.5*(dxdys(
i,
j)+dxdys(
i+1,
j))
898 dxdyu(iip1,
j)=dxdyu(1,
j)
904 dxdyv(
i,
j)=0.5*(dxdys(
i,
j)+dxdys(
i,
j+1))
914 dxdy_min=dxdys(ilon,ilat)
919 dxdy_max=max(dxdy_max,dxdys(
i,
j))
924 print*,
'ATTENTION modele peu zoome'
925 print*,
'ATTENTION on prend une constante de guidage cste'
928 gamma=(dxdy_max-2.*dxdy_min)/(dxdy_max-dxdy_min)
929 print*,
'gamma=',
gamma
930 if (
gamma.lt.1.e-5)
then
931 print*,
'gamma =',
gamma,
'<1e-5'
938 print*,
'gamma=',
gamma
947 elseif (typ.eq.2)
then
950 elseif (typ.eq.3)
then
958 xi=((dxdy_max-dxdy_)/(dxdy_max-dxdy_min))**
gamma
960 if(lat_min_g.le.zlat .and. zlat.le.lat_max_g)
then
961 alpha(
i,
j)=xi*alphamin+(1.-xi)*alphamax
977 #include "netcdf.inc"
978 #include "dimensions.h"
983 LOGICAL,
SAVE :: first=.true.
985 INTEGER,
SAVE :: ncidu,varidu,ncidv,varidv,ncidq
986 INTEGER,
SAVE :: varidq,ncidt,varidt,ncidps,varidps
987 INTEGER :: ncidpl,varidpl,varidap,varidbp
989 INTEGER,
DIMENSION(4) :: start,count
990 INTEGER :: status,rcode
997 print*,
'Guide: ouverture des fichiers guidage '
999 if (guide_modele)
then
1000 print *,
'Lecture du guidage sur niveaux mod�le'
1001 rcode = nf90_open(
'apbp.nc', nf90_nowrite, ncidpl)
1002 rcode = nf90_inq_varid(ncidpl,
'AP', varidap)
1003 rcode = nf90_inq_varid(ncidpl,
'BP', varidbp)
1004 print*,
'ncidpl,varidap',ncidpl,varidap
1008 rcode = nf90_open(
'u.nc', nf90_nowrite, ncidu)
1009 rcode = nf90_inq_varid(ncidu,
'UWND', varidu)
1010 print*,
'ncidu,varidu',ncidu,varidu
1011 if (ncidpl.eq.-99) ncidpl=ncidu
1015 rcode = nf90_open(
'v.nc', nf90_nowrite, ncidv)
1016 rcode = nf90_inq_varid(ncidv,
'VWND', varidv)
1017 print*,
'ncidv,varidv',ncidv,varidv
1018 if (ncidpl.eq.-99) ncidpl=ncidv
1022 rcode = nf90_open(
'T.nc', nf90_nowrite, ncidt)
1023 rcode = nf90_inq_varid(ncidt,
'AIR', varidt)
1024 print*,
'ncidT,varidT',ncidt,varidt
1025 if (ncidpl.eq.-99) ncidpl=ncidt
1029 rcode = nf90_open(
'hur.nc', nf90_nowrite, ncidq)
1030 rcode = nf90_inq_varid(ncidq,
'RH', varidq)
1031 print*,
'ncidQ,varidQ',ncidq,varidq
1032 if (ncidpl.eq.-99) ncidpl=ncidq
1035 if ((guide_p).OR.(guide_modele))
then
1036 rcode = nf90_open(
'ps.nc', nf90_nowrite, ncidps)
1037 rcode = nf90_inq_varid(ncidps,
'SP', varidps)
1038 print*,
'ncidps,varidps',ncidps,varidps
1041 if (.not.guide_modele)
then
1042 rcode = nf90_inq_varid(ncidpl,
'LEVEL', varidpl)
1043 IF (rcode.NE.0) rcode = nf90_inq_varid(ncidpl,
'PRESSURE', varidpl)
1044 print*,
'ncidpl,varidpl',ncidpl,varidpl
1047 if (guide_modele)
then
1049 status=nf_get_vara_double(ncidpl,varidap,1,nlevnc,apnc)
1050 status=nf_get_vara_double(ncidpl,varidbp,1,nlevnc,bpnc)
1052 status=nf_get_vara_real(ncidpl,varidap,1,nlevnc,apnc)
1053 status=nf_get_vara_real(ncidpl,varidbp,1,nlevnc,bpnc)
1057 status=nf_get_vara_double(ncidpl,varidpl,1,nlevnc,apnc)
1059 status=nf_get_vara_real(ncidpl,varidpl,1,nlevnc,apnc)
1085 status=nf_get_vara_double(ncidu,varidu,start,count,unat2)
1087 status=nf_get_vara_real(ncidu,varidu,start,count,unat2)
1097 status=nf_get_vara_double(ncidt,varidt,start,count,tnat2)
1099 status=nf_get_vara_real(ncidt,varidt,start,count,tnat2)
1109 status=nf_get_vara_double(ncidq,varidq,start,count,qnat2)
1111 status=nf_get_vara_real(ncidq,varidq,start,count,qnat2)
1123 status=nf_get_vara_double(ncidv,varidv,start,count,vnat2)
1125 status=nf_get_vara_real(ncidv,varidv,start,count,vnat2)
1133 if ((guide_p).OR.(guide_modele))
then
1140 status=nf_get_vara_double(ncidps,varidps,start,count,psnat2)
1142 status=nf_get_vara_real(ncidps,varidps,start,count,psnat2)
1156 #include "netcdf.inc"
1157 #include "dimensions.h"
1158 #include "paramet.h"
1162 LOGICAL,
SAVE :: first=.true.
1164 INTEGER,
SAVE :: ncidu,varidu,ncidv,varidv,ncidq
1165 INTEGER,
SAVE :: varidq,ncidt,varidt,ncidps,varidps
1166 INTEGER :: ncidpl,varidpl,varidap,varidbp
1168 INTEGER,
DIMENSION(4) :: start,count
1169 INTEGER :: status,rcode
1171 REAL,
DIMENSION (jjp1,llm) :: zu
1172 REAL,
DIMENSION (jjm,llm) ::
zv
1180 print*,
'Guide: ouverture des fichiers guidage '
1182 if (guide_modele)
then
1183 print *,
'Lecture du guidage sur niveaux mod�le'
1184 rcode = nf90_open(
'apbp.nc', nf90_nowrite, ncidpl)
1185 rcode = nf90_inq_varid(ncidpl,
'AP', varidap)
1186 rcode = nf90_inq_varid(ncidpl,
'BP', varidbp)
1187 print*,
'ncidpl,varidap',ncidpl,varidap
1191 rcode = nf90_open(
'u.nc', nf90_nowrite, ncidu)
1192 rcode = nf90_inq_varid(ncidu,
'UWND', varidu)
1193 print*,
'ncidu,varidu',ncidu,varidu
1194 if (ncidpl.eq.-99) ncidpl=ncidu
1198 rcode = nf90_open(
'v.nc', nf90_nowrite, ncidv)
1199 rcode = nf90_inq_varid(ncidv,
'VWND', varidv)
1200 print*,
'ncidv,varidv',ncidv,varidv
1201 if (ncidpl.eq.-99) ncidpl=ncidv
1205 rcode = nf90_open(
'T.nc', nf90_nowrite, ncidt)
1206 rcode = nf90_inq_varid(ncidt,
'AIR', varidt)
1207 print*,
'ncidT,varidT',ncidt,varidt
1208 if (ncidpl.eq.-99) ncidpl=ncidt
1212 rcode = nf90_open(
'hur.nc', nf90_nowrite, ncidq)
1213 rcode = nf90_inq_varid(ncidq,
'RH', varidq)
1214 print*,
'ncidQ,varidQ',ncidq,varidq
1215 if (ncidpl.eq.-99) ncidpl=ncidq
1218 if ((guide_p).OR.(guide_modele))
then
1219 rcode = nf90_open(
'ps.nc', nf90_nowrite, ncidps)
1220 rcode = nf90_inq_varid(ncidps,
'SP', varidps)
1221 print*,
'ncidps,varidps',ncidps,varidps
1224 if (.not.guide_modele)
then
1225 rcode = nf90_inq_varid(ncidpl,
'LEVEL', varidpl)
1226 IF (rcode.NE.0) rcode = nf90_inq_varid(ncidpl,
'PRESSURE', varidpl)
1227 print*,
'ncidpl,varidpl',ncidpl,varidpl
1230 if (guide_modele)
then
1232 status=nf_get_vara_double(ncidpl,varidap,1,nlevnc,apnc)
1233 status=nf_get_vara_double(ncidpl,varidbp,1,nlevnc,bpnc)
1235 status=nf_get_vara_real(ncidpl,varidap,1,nlevnc,apnc)
1236 status=nf_get_vara_real(ncidpl,varidbp,1,nlevnc,bpnc)
1240 status=nf_get_vara_double(ncidpl,varidpl,1,nlevnc,apnc)
1242 status=nf_get_vara_real(ncidpl,varidpl,1,nlevnc,apnc)
1268 status=nf_get_vara_double(ncidu,varidu,start,count,zu)
1270 status=nf_get_vara_real(ncidu,varidu,start,count,zu)
1273 unat2(
i,:,:)=zu(:,:)
1285 status=nf_get_vara_double(ncidt,varidt,start,count,zu)
1287 status=nf_get_vara_real(ncidt,varidt,start,count,zu)
1290 tnat2(
i,:,:)=zu(:,:)
1302 status=nf_get_vara_double(ncidq,varidq,start,count,zu)
1304 status=nf_get_vara_real(ncidq,varidq,start,count,zu)
1307 qnat2(
i,:,:)=zu(:,:)
1320 status=nf_get_vara_double(ncidv,varidv,start,count,
zv)
1322 status=nf_get_vara_real(ncidv,varidv,start,count,
zv)
1325 vnat2(
i,:,:)=
zv(:,:)
1335 if ((guide_p).OR.(guide_modele))
then
1342 status=nf_get_vara_double(ncidps,varidps,start,count,zu(:,1))
1344 status=nf_get_vara_real(ncidps,varidps,start,count,zu(:,1))
1363 include
"dimensions.h"
1365 include
"netcdf.inc"
1366 include
"comgeom2.h"
1367 include
"comconst.h"
1371 CHARACTER,
INTENT(IN) :: varname
1372 INTEGER,
INTENT (IN) :: hsize,vsize
1373 REAL,
DIMENSION (iip1,hsize,vsize),
INTENT(IN) :: field
1378 INTEGER :: nid, id_lonu, id_lonv, id_latu, id_latv, id_tim, id_lev
1379 INTEGER :: vid_lonu,vid_lonv,vid_latu,vid_latv,vid_cu,vid_cv,vid_lev
1380 INTEGER,
DIMENSION (3) :: dim3
1381 INTEGER,
DIMENSION (4) :: dim4,count,start
1382 INTEGER :: ierr, varid
1384 print *,
'Guide: output timestep',
timestep,
'var ',varname
1390 ierr=nf_create(
"guide_ins.nc",nf_clobber,nid)
1392 ierr=nf_def_dim(nid,
"LONU",iip1,id_lonu)
1393 ierr=nf_def_dim(nid,
"LONV",iip1,id_lonv)
1394 ierr=nf_def_dim(nid,
"LATU",
jjp1,id_latu)
1395 ierr=nf_def_dim(nid,
"LATV",jjm,id_latv)
1396 ierr=nf_def_dim(nid,
"LEVEL",llm,id_lev)
1397 ierr=nf_def_dim(nid,
"TIME",nf_unlimited,id_tim)
1400 ierr=nf_def_var(nid,
"LONU",nf_float,1,id_lonu,vid_lonu)
1401 ierr=nf_def_var(nid,
"LONV",nf_float,1,id_lonv,vid_lonv)
1402 ierr=nf_def_var(nid,
"LATU",nf_float,1,id_latu,vid_latu)
1403 ierr=nf_def_var(nid,
"LATV",nf_float,1,id_latv,vid_latv)
1404 ierr=nf_def_var(nid,
"LEVEL",nf_float,1,id_lev,vid_lev)
1405 ierr=nf_def_var(nid,
"cu",nf_float,2,(/id_lonu,id_latu/),vid_cu)
1406 ierr=nf_def_var(nid,
"cv",nf_float,2,(/id_lonv,id_latv/),vid_cv)
1412 ierr = nf_put_var_double(nid,vid_lonu,
rlonu*180./
pi)
1413 ierr = nf_put_var_double(nid,vid_lonv,
rlonv*180./
pi)
1414 ierr = nf_put_var_double(nid,vid_latu,
rlatu*180./
pi)
1415 ierr = nf_put_var_double(nid,vid_latv,
rlatv*180./
pi)
1416 ierr = nf_put_var_double(nid,vid_lev,
presnivs)
1417 ierr = nf_put_var_double(nid,vid_cu,
cu)
1418 ierr = nf_put_var_double(nid,vid_cv,
cv)
1420 ierr = nf_put_var_real(nid,vid_lonu,
rlonu*180./
pi)
1421 ierr = nf_put_var_real(nid,vid_lonv,
rlonv*180./
pi)
1422 ierr = nf_put_var_real(nid,vid_latu,
rlatu*180./
pi)
1423 ierr = nf_put_var_real(nid,vid_latv,
rlatv*180./
pi)
1424 ierr = nf_put_var_real(nid,vid_lev,
presnivs)
1425 ierr = nf_put_var_real(nid,vid_cu,
cu)
1426 ierr = nf_put_var_real(nid,vid_cv,
cv)
1431 ierr = nf_redef(nid)
1433 dim3=(/id_lonv,id_latu,id_tim/)
1434 ierr = nf_def_var(nid,
"SP",nf_float,3,dim3,varid)
1437 dim3=(/id_lonv,id_latu,id_tim/)
1438 ierr = nf_def_var(nid,
"ps",nf_float,3,dim3,varid)
1442 dim4=(/id_lonu,id_latu,id_lev,id_tim/)
1443 ierr = nf_def_var(nid,
"ucov",nf_float,4,dim4,varid)
1447 dim4=(/id_lonv,id_latv,id_lev,id_tim/)
1448 ierr = nf_def_var(nid,
"vcov",nf_float,4,dim4,varid)
1452 dim4=(/id_lonv,id_latu,id_lev,id_tim/)
1453 ierr = nf_def_var(nid,
"teta",nf_float,4,dim4,varid)
1457 dim4=(/id_lonv,id_latu,id_lev,id_tim/)
1458 ierr = nf_def_var(nid,
"q",nf_float,4,dim4,varid)
1461 ierr = nf_enddef(nid)
1462 ierr = nf_close(nid)
1468 ierr=nf_open(
"guide_ins.nc",nf_write,nid)
1470 SELECT CASE (varname)
1473 ierr = nf_inq_varid(nid,
"SP",varid)
1475 count=(/iip1,
jjp1,1,0/)
1477 ierr = nf_put_vara_double(nid,varid,start,count,field)
1479 ierr = nf_put_vara_real(nid,varid,start,count,field)
1482 ierr = nf_inq_varid(nid,
"ps",varid)
1484 count=(/iip1,
jjp1,1,0/)
1486 ierr = nf_put_vara_double(nid,varid,start,count,field)
1488 ierr = nf_put_vara_real(nid,varid,start,count,field)
1491 ierr = nf_inq_varid(nid,
"ucov",varid)
1493 count=(/iip1,
jjp1,llm,1/)
1495 ierr = nf_put_vara_double(nid,varid,start,count,field)
1497 ierr = nf_put_vara_real(nid,varid,start,count,field)
1500 ierr = nf_inq_varid(nid,
"vcov",varid)
1502 count=(/iip1,jjm,llm,1/)
1504 ierr = nf_put_vara_double(nid,varid,start,count,field)
1506 ierr = nf_put_vara_real(nid,varid,start,count,field)
1509 ierr = nf_inq_varid(nid,
"teta",varid)
1511 count=(/iip1,
jjp1,llm,1/)
1513 ierr = nf_put_vara_double(nid,varid,start,count,field)
1515 ierr = nf_put_vara_real(nid,varid,start,count,field)
1518 ierr = nf_inq_varid(nid,
"q",varid)
1520 count=(/iip1,
jjp1,llm,1/)
1522 ierr = nf_put_vara_double(nid,varid,start,count,field)
1524 ierr = nf_put_vara_real(nid,varid,start,count,field)
1528 ierr = nf_close(nid)
1542 if(abs(
x(
i,
l)).gt.1.e10)
then
1543 zz=0.5*(
x(
i-1,
l)+
x(
i+1,
l))
1544 print*,
'correction ',
i,
l,
x(
i,
l),zz