13 use netcdf
, only: nf90_nowrite, nf90_open, nf90_inq_varid, nf90_close
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
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
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
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
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
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
62 INTEGER,
SAVE,
PRIVATE :: ijbu,ijbv,ijeu,ijev,ijnu,ijnv
63 INTEGER,
SAVE,
PRIVATE :: jjbu,jjbv,jjeu,jjev,jjnu,jjnv
74 include
"dimensions.h"
78 INTEGER :: error,ncidpl,rid,rcod
79 CHARACTER (len = 80) :: abort_message
80 CHARACTER (len = 20) :: modname =
'guide_init'
86 CALL
getpar(
'guide_u',.true.,guide_u,
'guidage de u')
87 CALL
getpar(
'guide_v',.true.,guide_v,
'guidage de v')
88 CALL
getpar(
'guide_T',.true.,guide_t,
'guidage de T')
89 CALL
getpar(
'guide_P',.true.,guide_p,
'guidage de P')
90 CALL
getpar(
'guide_Q',.true.,guide_q,
'guidage de Q')
91 CALL
getpar(
'guide_hr',.true.,guide_hr,
'guidage de Q par H.R')
92 CALL
getpar(
'guide_teta',.
false.,guide_teta,
'guidage de T par Teta')
94 CALL
getpar(
'guide_add',.
false.,guide_add,
'for�age constant?')
95 CALL
getpar(
'guide_zon',.
false.,guide_zon,
'guidage moy zonale')
98 CALL
getpar(
'tau_min_u',0.02,tau_min_u,
'Cste de rappel min, u')
99 CALL
getpar(
'tau_max_u', 10.,tau_max_u,
'Cste de rappel max, u')
100 CALL
getpar(
'tau_min_v',0.02,tau_min_v,
'Cste de rappel min, v')
101 CALL
getpar(
'tau_max_v', 10.,tau_max_v,
'Cste de rappel max, v')
102 CALL
getpar(
'tau_min_T',0.02,tau_min_t,
'Cste de rappel min, T')
103 CALL
getpar(
'tau_max_T', 10.,tau_max_t,
'Cste de rappel max, T')
104 CALL
getpar(
'tau_min_Q',0.02,tau_min_q,
'Cste de rappel min, Q')
105 CALL
getpar(
'tau_max_Q', 10.,tau_max_q,
'Cste de rappel max, Q')
106 CALL
getpar(
'tau_min_P',0.02,tau_min_p,
'Cste de rappel min, P')
107 CALL
getpar(
'tau_max_P', 10.,tau_max_p,
'Cste de rappel max, P')
108 CALL
getpar(
'gamma4',.
false.,gamma4,
'Zone sans rappel elargie')
109 CALL
getpar(
'guide_BL',.true.,guide_bl,
'guidage dans C.Lim')
112 CALL
getpar(
'guide_sav',.
false.,guide_sav,
'sauvegarde guidage')
113 CALL
getpar(
'iguide_sav',4,iguide_sav,
'freq. sauvegarde guidage')
115 IF (iguide_sav.GT.0)
THEN
116 iguide_sav=day_step/iguide_sav
118 iguide_sav=day_step*iguide_sav
122 CALL
getpar(
'guide_reg',.
false.,guide_reg,
'guidage regional')
123 CALL
getpar(
'lat_min_g',-90.,lat_min_g,
'Latitude mini guidage ')
124 CALL
getpar(
'lat_max_g', 90.,lat_max_g,
'Latitude maxi guidage ')
125 CALL
getpar(
'lon_min_g',-180.,lon_min_g,
'longitude mini guidage ')
126 CALL
getpar(
'lon_max_g', 180.,lon_max_g,
'longitude maxi guidage ')
127 CALL
getpar(
'tau_lat', 5.,tau_lat,
'raideur lat guide regional ')
128 CALL
getpar(
'tau_lon', 5.,tau_lon,
'raideur lon guide regional ')
131 CALL
getpar(
'iguide_read',4,iguide_read,
'freq. lecture guidage')
132 CALL
getpar(
'iguide_int',4,iguide_int,
'freq. interpolation vert')
133 IF (iguide_int.EQ.0)
THEN
135 ELSEIF (iguide_int.GT.0)
THEN
136 iguide_int=day_step/iguide_int
138 iguide_int=day_step*iguide_int
140 CALL
getpar(
'guide_plevs',0,guide_plevs,
'niveaux pression fichiers guidage')
142 CALL
getpar(
'guide_modele',.
false.,guide_modele,
'niveaux pression ap+bp*psol')
143 IF (guide_modele)
THEN
147 CALL
getpar(
'ini_anal',.
false.,ini_anal,
'Etat initial = analyse')
148 CALL
getpar(
'guide_invertp',.true.,invert_p,
'niveaux p inverses')
149 CALL
getpar(
'guide_inverty',.true.,invert_y,
'inversion N-S')
150 CALL
getpar(
'guide_2D',.
false.,guide_2d,
'fichier guidage lat-P')
157 if (guide_plevs.EQ.1)
then
158 if (ncidpl.eq.-99) rcod=nf90_open(
'apbp.nc',nf90_nowrite, ncidpl)
159 elseif (guide_plevs.EQ.2)
then
160 if (ncidpl.EQ.-99) rcod=nf90_open(
'P.nc',nf90_nowrite,ncidpl)
161 elseif (guide_u)
then
162 if (ncidpl.eq.-99) rcod=nf90_open(
'u.nc',nf90_nowrite,ncidpl)
163 elseif (guide_v)
then
164 if (ncidpl.eq.-99) rcod=nf90_open(
'v.nc',nf90_nowrite,ncidpl)
165 elseif (guide_t)
then
166 if (ncidpl.eq.-99) rcod=nf90_open(
'T.nc',nf90_nowrite,ncidpl)
167 elseif (guide_q)
then
168 if (ncidpl.eq.-99) rcod=nf90_open(
'hur.nc',nf90_nowrite, ncidpl)
170 error=nf_inq_dimid(ncidpl,
'LEVEL',rid)
171 IF (error.NE.nf_noerr) error=nf_inq_dimid(ncidpl,
'PRESSURE',rid)
172 IF (error.NE.nf_noerr)
THEN
173 print *,
'Guide: probleme lecture niveaux pression'
176 error=nf_inq_dimlen(ncidpl,rid,nlevnc)
177 print *,
'Guide: nombre niveaux vert. nlevnc', nlevnc
178 rcod = nf90_close(ncidpl)
183 abort_message=
'pb in allocation guide'
185 ALLOCATE(apnc(nlevnc), stat = error)
186 IF (error /= 0) CALL
abort_gcm(modname,abort_message,1)
187 ALLOCATE(bpnc(nlevnc), stat = error)
188 IF (error /= 0) CALL
abort_gcm(modname,abort_message,1)
191 ALLOCATE(alpha_pcor(llm), stat = error)
192 IF (error /= 0) CALL
abort_gcm(modname,abort_message,1)
193 ALLOCATE(alpha_u(ijb_u:ije_u), stat = error)
194 IF (error /= 0) CALL
abort_gcm(modname,abort_message,1)
195 ALLOCATE(alpha_v(ijb_v:ije_v), stat = error)
196 IF (error /= 0) CALL
abort_gcm(modname,abort_message,1)
197 ALLOCATE(alpha_t(ijb_u:ije_u), stat = error)
198 IF (error /= 0) CALL
abort_gcm(modname,abort_message,1)
199 ALLOCATE(alpha_q(ijb_u:ije_u), stat = error)
200 IF (error /= 0) CALL
abort_gcm(modname,abort_message,1)
201 ALLOCATE(alpha_p(ijb_u:ije_u), stat = error)
202 IF (error /= 0) CALL
abort_gcm(modname,abort_message,1)
203 alpha_u=0.;alpha_v=0;alpha_t=0;alpha_q=0;alpha_p=0
206 ALLOCATE(unat1(iip1,jjb_u:jje_u,nlevnc), stat = error)
207 IF (error /= 0) CALL
abort_gcm(modname,abort_message,1)
208 ALLOCATE(ugui1(ijb_u:ije_u,llm), stat = error)
209 IF (error /= 0) CALL
abort_gcm(modname,abort_message,1)
210 ALLOCATE(unat2(iip1,jjb_u:jje_u,nlevnc), stat = error)
211 IF (error /= 0) CALL
abort_gcm(modname,abort_message,1)
212 ALLOCATE(ugui2(ijb_u:ije_u,llm), stat = error)
213 IF (error /= 0) CALL
abort_gcm(modname,abort_message,1)
214 unat1=0.;unat2=0.;ugui1=0.;ugui2=0.
218 ALLOCATE(tnat1(iip1,jjb_u:jje_u,nlevnc), stat = error)
219 IF (error /= 0) CALL
abort_gcm(modname,abort_message,1)
220 ALLOCATE(tgui1(ijb_u:ije_u,llm), stat = error)
221 IF (error /= 0) CALL
abort_gcm(modname,abort_message,1)
222 ALLOCATE(tnat2(iip1,jjb_u:jje_u,nlevnc), stat = error)
223 IF (error /= 0) CALL
abort_gcm(modname,abort_message,1)
224 ALLOCATE(tgui2(ijb_u:ije_u,llm), stat = error)
225 IF (error /= 0) CALL
abort_gcm(modname,abort_message,1)
226 tnat1=0.;tnat2=0.;tgui1=0.;tgui2=0.
230 ALLOCATE(qnat1(iip1,jjb_u:jje_u,nlevnc), stat = error)
231 IF (error /= 0) CALL
abort_gcm(modname,abort_message,1)
232 ALLOCATE(qgui1(ijb_u:ije_u,llm), stat = error)
233 IF (error /= 0) CALL
abort_gcm(modname,abort_message,1)
234 ALLOCATE(qnat2(iip1,jjb_u:jje_u,nlevnc), stat = error)
235 IF (error /= 0) CALL
abort_gcm(modname,abort_message,1)
236 ALLOCATE(qgui2(ijb_u:ije_u,llm), stat = error)
237 IF (error /= 0) CALL
abort_gcm(modname,abort_message,1)
238 qnat1=0.;qnat2=0.;qgui1=0.;qgui2=0.
242 ALLOCATE(vnat1(iip1,jjb_v:jje_v,nlevnc), stat = error)
243 IF (error /= 0) CALL
abort_gcm(modname,abort_message,1)
244 ALLOCATE(vgui1(ijb_v:ije_v,llm), stat = error)
245 IF (error /= 0) CALL
abort_gcm(modname,abort_message,1)
246 ALLOCATE(vnat2(iip1,jjb_v:jje_v,nlevnc), stat = error)
247 IF (error /= 0) CALL
abort_gcm(modname,abort_message,1)
248 ALLOCATE(vgui2(ijb_v:ije_v,llm), stat = error)
249 IF (error /= 0) CALL
abort_gcm(modname,abort_message,1)
250 vnat1=0.;vnat2=0.;vgui1=0.;vgui2=0.
253 IF (guide_plevs.EQ.2)
THEN
254 ALLOCATE(pnat1(iip1,jjb_u:jje_u,nlevnc), stat = error)
255 IF (error /= 0) CALL
abort_gcm(modname,abort_message,1)
256 ALLOCATE(pnat2(iip1,jjb_u:jje_u,nlevnc), stat = error)
257 IF (error /= 0) CALL
abort_gcm(modname,abort_message,1)
261 IF (guide_p.OR.guide_plevs.EQ.1)
THEN
262 ALLOCATE(psnat1(iip1,jjb_u:jje_u), stat = error)
263 IF (error /= 0) CALL
abort_gcm(modname,abort_message,1)
264 ALLOCATE(psnat2(iip1,jjb_u:jje_u), stat = error)
265 IF (error /= 0) CALL
abort_gcm(modname,abort_message,1)
269 ALLOCATE(psgui2(ijb_u:ije_u), stat = error)
270 IF (error /= 0) CALL
abort_gcm(modname,abort_message,1)
271 ALLOCATE(psgui1(ijb_u:ije_u), stat = error)
272 IF (error /= 0) CALL
abort_gcm(modname,abort_message,1)
284 IF (guide_v) vnat1=vnat2
285 IF (guide_u) unat1=unat2
286 IF (guide_t) tnat1=tnat2
287 IF (guide_q) qnat1=qnat2
288 IF (guide_plevs.EQ.2) pnat1=pnat2
289 IF (guide_p.OR.guide_plevs.EQ.1) psnat1=psnat2
300 include
"dimensions.h"
306 INTEGER,
INTENT(IN) :: itau
307 REAL,
DIMENSION (ijb_u:ije_u,llm),
INTENT(INOUT) :: ucov,
teta,
q,masse
308 REAL,
DIMENSION (ijb_v:ije_v,llm),
INTENT(INOUT) :: vcov
309 REAL,
DIMENSION (ijb_u:ije_u),
INTENT(INOUT) :: ps
312 LOGICAL,
SAVE :: first=.true.
315 REAL,
DIMENSION (ijb_u:ije_u,llm) :: f_add
317 REAL,
DIMENSION (iip1,jjb_u:jje_u,llm) :: pk, pkf
318 REAL,
DIMENSION (iip1,jjb_u:jje_u,llm) ::
alpha,
beta
319 REAL,
DIMENSION (iip1,jjb_u:jje_u) :: pks
321 REAL,
DIMENSION (ijb_u:ije_u,llmp1) :: p
323 INTEGER,
SAVE :: step_rea,count_no_rea,itau_test
325 REAL :: ditau, dday_step
333 ijbu=ij_begin ; ijeu=ij_end ; ijnu=ijeu-ijbu+1
334 jjbu=jj_begin ; jjeu=jj_end ; jjnu=jjeu-jjbu+1
335 ijbv=ij_begin ; ijev=ij_end ; ijnv=ijev-ijbv+1
336 jjbv=jj_begin ; jjev=jj_end ; jjnv=jjev-jjbv+1
346 print *,
'---> on rentre dans guide_main'
369 call
tau2alpha(3,iip1,jjnb_v ,factt,tau_min_v,tau_max_v,alpha_v)
370 call
tau2alpha(2,iip1,jjnb_u,factt,tau_min_u,tau_max_u,alpha_u)
371 call
tau2alpha(1,iip1,jjnb_u,factt,tau_min_t,tau_max_t,alpha_t)
372 call
tau2alpha(1,iip1,jjnb_u,factt,tau_min_p,tau_max_p,alpha_p)
373 call
tau2alpha(1,iip1,jjnb_u,factt,tau_min_q,tau_max_q,alpha_q)
386 IF (guide_u) ucov(ijbu:ijeu,:)=ugui2(ijbu:ijeu,:)
387 IF (guide_v) vcov(ijbv:ijev,:)=ugui2(ijbv:ijev,:)
388 IF (guide_t)
teta(ijbu:ijeu,:)=tgui2(ijbu:ijeu,:)
389 IF (guide_q)
q(ijbu:ijeu,:)=qgui2(ijbu:ijeu,:)
391 ps(ijbu:ijeu)=psgui2(ijbu:ijeu)
412 IF (iguide_read.NE.0)
THEN
414 dday_step=
real(day_step)
415 IF (iguide_read.LT.0)
THEN
416 tau=ditau/dday_step/
REAL(iguide_read)
418 tau=
REAL(iguide_read)*ditau/dday_step
421 IF (reste.EQ.0.)
THEN
422 IF (itau_test.EQ.itau)
THEN
423 write(*,*)
'deuxieme passage de advreel a itau=',itau
426 IF (guide_v) vnat1(:,jjbv:jjev,:)=vnat2(:,jjbv:jjev,:)
427 IF (guide_u) unat1(:,jjbu:jjeu,:)=unat2(:,jjbu:jjeu,:)
428 IF (guide_t) tnat1(:,jjbu:jjeu,:)=tnat2(:,jjbu:jjeu,:)
429 IF (guide_q) qnat1(:,jjbu:jjeu,:)=qnat2(:,jjbu:jjeu,:)
430 IF (guide_plevs.EQ.2) pnat1(:,jjbu:jjeu,:)=pnat2(:,jjbu:jjeu,:)
431 IF (guide_p.OR.guide_plevs.EQ.1) psnat1(:,jjbu:jjeu)=psnat2(:,jjbu:jjeu)
434 print*,
'Lecture fichiers guidage, pas ',step_rea, &
435 'apres ',count_no_rea,
' non lectures'
444 count_no_rea=count_no_rea+1
452 IF (mod(itau,iguide_int).EQ.0)
THEN
456 IF (iguide_read.NE.0)
THEN
466 f_out=((mod(itau,iguide_sav).EQ.0).AND.guide_sav)
470 if (pressure_exner)
then
488 f_add(ijbu:ijeu,:)=(1.-
tau)*ugui1(ijbu:ijeu,:)+
tau*ugui2(ijbu:ijeu,:)
490 f_add(ijbu:ijeu,:)=(1.-
tau)*ugui1(ijbu:ijeu,:)+
tau*ugui2(ijbu:ijeu,:)-ucov(ijbu:ijeu,:)
496 ucov(ijbu:ijeu,:)=ucov(ijbu:ijeu,:)+f_add(ijbu:ijeu,:)
501 f_add(ijbu:ijeu,:)=(1.-
tau)*tgui1(ijbu:ijeu,:)+
tau*tgui2(ijbu:ijeu,:)
503 f_add(ijbu:ijeu,:)=(1.-
tau)*tgui1(ijbu:ijeu,:)+
tau*tgui2(ijbu:ijeu,:)-
teta(ijbu:ijeu,:)
508 teta(ijbu:ijeu,:)=
teta(ijbu:ijeu,:)+f_add(ijbu:ijeu,:)
513 f_add(ijbu:ijeu,1)=(1.-
tau)*psgui1(ijbu:ijeu)+
tau*psgui2(ijbu:ijeu)
515 f_add(ijbu:ijeu,1)=(1.-
tau)*psgui1(ijbu:ijeu)+
tau*psgui2(ijbu:ijeu)-ps(ijbu:ijeu)
520 ps(ijbu:ijeu)=ps(ijbu:ijeu)+f_add(ijbu:ijeu,1)
527 f_add(ijbu:ijeu,:)=(1.-
tau)*qgui1(ijbu:ijeu,:)+
tau*qgui2(ijbu:ijeu,:)
529 f_add(ijbu:ijeu,:)=(1.-
tau)*qgui1(ijbu:ijeu,:)+
tau*qgui2(ijbu:ijeu,:)-
q(ijbu:ijeu,:)
534 q(ijbu:ijeu,:)=
q(ijbu:ijeu,:)+f_add(ijbu:ijeu,:)
539 f_add(ijbv:ijev,:)=(1.-
tau)*vgui1(ijbv:ijev,:)+
tau*vgui2(ijbv:ijev,:)
541 f_add(ijbv:ijev,:)=(1.-
tau)*vgui1(ijbv:ijev,:)+
tau*vgui2(ijbv:ijev,:)-vcov(ijbv:ijev,:)
544 if (guide_zon) CALL
guide_zonave_v(2,jjm,llm,f_add(ijb_v:ije_v,:))
547 vcov(ijbv:ijev,:)=vcov(ijbv:ijev,:)+f_add(ijbv:ijev,:)
557 include
"dimensions.h"
561 INTEGER,
INTENT(IN) :: vsize
562 REAL,
DIMENSION(ijb_u:ije_u),
INTENT(IN) ::
alpha
563 REAL,
DIMENSION(ijb_u:ije_u,vsize),
INTENT(INOUT) :: field
569 field(ijbu:ijeu,
l)=
alpha(ijbu:ijeu)*field(ijbu:ijeu,
l)*alpha_pcor(
l)
579 include
"dimensions.h"
583 INTEGER,
INTENT(IN) :: vsize
584 REAL,
DIMENSION(ijb_v:ije_v),
INTENT(IN) ::
alpha
585 REAL,
DIMENSION(ijb_v:ije_v,vsize),
INTENT(INOUT) :: field
591 field(ijbv:ijev,
l)=
alpha(ijbv:ijev)*field(ijbv:ijev,
l)*alpha_pcor(
l)
602 include
"dimensions.h"
608 INTEGER,
INTENT(IN) :: typ
609 INTEGER,
INTENT(IN) :: vsize
610 REAL,
DIMENSION(ijb_u:ije_u,vsize),
INTENT(INOUT) :: field
613 LOGICAL,
SAVE :: first=.true.
614 INTEGER,
DIMENSION (2),
SAVE :: imin, imax
616 REAL,
DIMENSION (iip1) :: lond
617 REAL,
DIMENSION (jjb_u:jje_u,vsize):: fieldm
623 imin(1)=1;imax(1)=iip1;
624 imin(2)=1;imax(2)=iip1;
627 IF (lond(
i).LT.lon_min_g) imin(1)=
i
628 IF (lond(
i).LE.lon_max_g) imax(1)=
i
632 IF (lond(
i).LT.lon_min_g) imin(2)=
i
633 IF (lond(
i).LE.lon_max_g) imax(2)=
i
647 DO i=imin(typ),imax(typ)
649 fieldm(
j,
l)=fieldm(
j,
l)+field(
ij,
l)
652 fieldm(:,
l)=fieldm(:,
l)/
REAL(imax(typ)-imin(typ)+1)
657 field(
ij,
l)=fieldm(
j,
l)
669 include
"dimensions.h"
675 INTEGER,
INTENT(IN) :: typ
676 INTEGER,
INTENT(IN) :: vsize
677 INTEGER,
INTENT(IN) :: hsize
678 REAL,
DIMENSION(ijb_v:ije_v,vsize),
INTENT(INOUT) :: field
681 LOGICAL,
SAVE :: first=.true.
682 INTEGER,
DIMENSION (2),
SAVE :: imin, imax
684 REAL,
DIMENSION (iip1) :: lond
685 REAL,
DIMENSION (jjb_v:jjev,vsize):: fieldm
691 imin(1)=1;imax(1)=iip1;
692 imin(2)=1;imax(2)=iip1;
695 IF (lond(
i).LT.lon_min_g) imin(1)=
i
696 IF (lond(
i).LE.lon_max_g) imax(1)=
i
700 IF (lond(
i).LT.lon_min_g) imin(2)=
i
701 IF (lond(
i).LE.lon_max_g) imax(2)=
i
711 DO i=imin(typ),imax(typ)
713 fieldm(
j,
l)=fieldm(
j,
l)+field(
ij,
l)
716 fieldm(:,
l)=fieldm(:,
l)/
REAL(imax(typ)-imin(typ)+1)
721 field(
ij,
l)=fieldm(
j,
l)
736 include
"dimensions.h"
742 REAL,
DIMENSION (iip1,jjb_u:jje_u),
INTENT(IN) :: psi
743 REAL,
DIMENSION (iip1,jjb_u:jje_u,llm),
INTENT(IN) ::
teta
745 LOGICAL,
SAVE :: first=.true.
747 REAL,
DIMENSION (iip1,jjb_u:jje_u,nlevnc) :: plnc1,plnc2
748 REAL,
DIMENSION (iip1,jjb_u:jje_u,llm) :: plunc,plsnc
749 REAL,
DIMENSION (iip1,jjb_v:jje_v,llm) :: plvnc
750 REAL,
DIMENSION (iip1,jjb_u:jje_u,llmp1) :: p
751 REAL,
DIMENSION (iip1,jjb_u:jje_u,llm) :: pls, pext
752 REAL,
DIMENSION (iip1,jjb_u:jje_u,llm) :: pbarx
753 REAL,
DIMENSION (iip1,jjb_v:jje_v,llm) :: pbary
755 REAL,
DIMENSION (iip1,jjb_u:jje_u,llm) :: pk, pkf
756 REAL,
DIMENSION (iip1,jjb_u:jje_u,llm) ::
alpha,
beta
757 REAL,
DIMENSION (iip1,jjb_u:jje_u) :: pks
760 REAL,
DIMENSION (ijb_u:ije_u,llm) :: qsat
762 REAL,
DIMENSION (iip1,jjb_u:jje_u,llm) :: zu1,zu2
763 REAL,
DIMENSION (iip1,jjb_v:jje_v,llm) :: zv1,zv2
768 print *,
'Guide: conversion variables guidage'
772 IF (guide_plevs.EQ.0)
THEN
785 print*,
'Guide: verification ordre niveaux verticaux'
788 print*,
'PL(',
l,
')=',(
ap(
l)+
ap(
l+1))/2. &
789 +psi(1,jjeu)*(
bp(
l)+
bp(
l+1))/2.
791 print*,
'Fichiers guidage'
792 SELECT CASE (guide_plevs)
795 print*,
'PL(',
l,
')=',plnc2(1,jjbu,
l)
799 print*,
'PL(',
l,
')=',apnc(
l)+bpnc(
l)*psnat2(
i,jjbu)
803 print*,
'PL(',
l,
')=',pnat2(1,jjbu,
l)
806 print *,
'inversion de l''ordre: invert_p=',invert_p
809 print*,
'U(',
l,
')=',unat2(1,jjbu,
l)
814 print*,
'T(',
l,
')=',tnat2(1,jjbu,
l)
824 IF (guide_plevs.EQ.1)
THEN
834 if (disvert_type==1)
then
887 psgui1(
ij)=psnat1(
i,
j)
888 psgui2(
ij)=psnat2(
i,
j)
890 psgui1(iip1*
j)=psnat1(1,
j)
891 psgui2(iip1*
j)=psnat2(1,
j)
897 IF (guide_plevs.EQ.1)
THEN
901 plnc2(
i,
j,
l)=apnc(
l)+bpnc(
l)*psnat2(
i,
j)
902 plnc1(
i,
j,
l)=apnc(
l)+bpnc(
l)*psnat1(
i,
j)
906 ELSE IF (guide_plevs.EQ.2)
THEN
918 CALL
pres2lev(tnat1(:,jjbu:jjeu,:),zu1(:,jjbu:jjeu,:),nlevnc,llm, &
919 plnc1(:,jjbu:jjeu,:),plsnc(:,jjbu:jjeu,:),iip1,jjnu,invert_p)
920 CALL
pres2lev(tnat2(:,jjbu:jjeu,:),zu2(:,jjbu:jjeu,:),nlevnc,llm, &
921 plnc2(:,jjbu:jjeu,:),plsnc(:,jjbu:jjeu,:),iip1,jjnu,invert_p)
939 tgui1(
j*iip1,
l)=tgui1((
j-1)*iip1+1,
l)
940 tgui2(
j*iip1,
l)=tgui2((
j-1)*iip1+1,
l)
944 tgui1(
i,
l)=tgui1(1,
l)
945 tgui2(
i,
l)=tgui2(1,
l)
959 IF (guide_plevs.EQ.1)
THEN
963 plnc2(
i,
j,
l)=apnc(
l)+bpnc(
l)*psnat2(
i,
j)
964 plnc1(
i,
j,
l)=apnc(
l)+bpnc(
l)*psnat1(
i,
j)
968 ELSE IF (guide_plevs.EQ.2)
THEN
980 CALL
pres2lev(qnat1(:,jjbu:jjeu,:),zu1(:,jjbu:jjeu,:),nlevnc,llm, &
981 plnc1(:,jjbu:jjeu,:),plsnc(:,jjbu:jjeu,:),iip1,jjnu,invert_p)
982 CALL
pres2lev(qnat2(:,jjbu:jjeu,:),zu2(:,jjbu:jjeu,:),nlevnc,llm, &
983 plnc2(:,jjbu:jjeu,:),plsnc(:,jjbu:jjeu,:),iip1,jjnu,invert_p)
995 qgui1(
j*iip1,
l)=qgui1((
j-1)*iip1+1,
l)
996 qgui2(
j*iip1,
l)=qgui2((
j-1)*iip1+1,
l)
1000 qgui1(
i,
l)=qgui1(1,
l)
1001 qgui2(
i,
l)=qgui2(1,
l)
1012 CALL
q_sat(iip1*jjnu*llm,
teta(:,jjbu:jjeu,:)*pk(:,jjbu:jjeu,:)/
cpp, &
1013 plsnc(:,jjbu:jjeu,:),qsat(ijbu:ijeu,:))
1014 qgui1(ijbu:ijeu,:)=qgui1(ijbu:ijeu,:)*qsat(ijbu:ijeu,:)*0.01
1015 qgui2(ijbu:ijeu,:)=qgui2(ijbu:ijeu,:)*qsat(ijbu:ijeu,:)*0.01
1021 IF (guide_plevs.EQ.1)
THEN
1030 plnc2(iip1,
j,
l)=plnc2(1,
j,
l)
1031 plnc1(iip1,
j,
l)=plnc1(1,
j,
l)
1034 ELSE IF (guide_plevs.EQ.2)
THEN
1043 plnc2(iip1,
j,
l)=plnc2(1,
j,
l)
1044 plnc1(iip1,
j,
l)=plnc1(1,
j,
l)
1050 CALL
pres2lev(unat1(:,jjbu:jjeu,:),zu1(:,jjbu:jjeu,:),nlevnc,llm, &
1051 plnc1(:,jjbu:jjeu,:),plunc(:,jjbu:jjeu,:),iip1,jjnu,invert_p)
1052 CALL
pres2lev(unat2(:,jjbu:jjeu,:),zu2(:,jjbu:jjeu,:),nlevnc,llm, &
1053 plnc2(:,jjbu:jjeu,:),plunc(:,jjbu:jjeu,:),iip1,jjnu,invert_p)
1063 ugui1(
j*iip1,
l)=ugui1((
j-1)*iip1+1,
l)
1064 ugui2(
j*iip1,
l)=ugui2((
j-1)*iip1+1,
l)
1083 IF (guide_plevs.EQ.1)
THEN
1098 ELSE IF (guide_plevs.EQ.2)
THEN
1115 CALL
pres2lev(vnat1(:,jjbv:jjev,:),zv1(:,jjbv:jjev,:),nlevnc,llm, &
1116 plnc1(:,jjbv:jjev,:),plvnc(:,jjbv:jjev,:),iip1,jjnv,invert_p)
1117 CALL
pres2lev(vnat2(:,jjbv:jjev,:),zv2(:,jjbv:jjev,:),nlevnc,llm, &
1118 plnc2(:,jjbv:jjev,:),plvnc(:,jjbv:jjev,:),iip1,jjnv,invert_p)
1127 vgui1(
j*iip1,
l)=vgui1((
j-1)*iip1+1,
l)
1128 vgui2(
j*iip1,
l)=vgui2((
j-1)*iip1+1,
l)
1143 include
"dimensions.h"
1145 include
"comconst.h"
1146 include
"comgeom2.h"
1150 INTEGER,
INTENT(IN) :: typ
1151 INTEGER,
INTENT(IN) :: pim,pjm
1152 REAL,
INTENT(IN) :: factt
1153 REAL,
INTENT(IN) :: taumin,taumax
1155 REAL,
DIMENSION(pim,pjm),
INTENT(OUT) ::
alpha
1158 LOGICAL,
SAVE :: first=.true.
1159 REAL,
SAVE ::
gamma,dxdy_min,dxdy_max
1160 REAL,
DIMENSION (iip1,jjp1) :: zdx,zdy
1161 REAL,
DIMENSION (iip1,jjp1) :: dxdys,dxdyu
1162 REAL,
DIMENSION (iip1,jjm) :: dxdyv
1165 real alphamin,alphamax,xi
1166 integer i,
j,ilon,ilat
1169 alphamin=factt/taumax
1170 alphamax=factt/taumin
1171 IF (guide_reg.OR.guide_add)
THEN
1182 elseif (typ.eq.1)
then
1185 elseif (typ.eq.3)
then
1190 (1.+tanh((zlat-lat_min_g)/tau_lat))* &
1191 (1.+tanh((lat_max_g-zlat)/tau_lat))* &
1192 (1.+tanh((zlon-lon_min_g)/tau_lon))* &
1193 (1.+tanh((lon_max_g-zlon)/tau_lon))
1206 zdx(1,
j)=zdx(iip1,
j)
1221 dxdys(
i,
j)=sqrt(zdx(
i,
j)*zdx(
i,
j)+zdy(
i,
j)*zdy(
i,
j))
1227 dxdyu(
i,
j)=0.5*(dxdys(
i,
j)+dxdys(
i+1,
j))
1229 dxdyu(iip1,
j)=dxdyu(1,
j)
1235 dxdyv(
i,
j)=0.5*(dxdys(
i,
j)+dxdys(
i,
j+1))
1245 dxdy_min=dxdys(ilon,ilat)
1250 dxdy_max=max(dxdy_max,dxdys(
i,
j))
1255 print*,
'ATTENTION modele peu zoome'
1256 print*,
'ATTENTION on prend une constante de guidage cste'
1259 gamma=(dxdy_max-2.*dxdy_min)/(dxdy_max-dxdy_min)
1260 print*,
'gamma=',
gamma
1261 if (
gamma.lt.1.e-5)
then
1262 print*,
'gamma =',
gamma,
'<1e-5'
1269 print*,
'gamma=',
gamma
1278 elseif (typ.eq.2)
then
1281 elseif (typ.eq.3)
then
1289 xi=((dxdy_max-dxdy_)/(dxdy_max-dxdy_min))**
gamma
1291 if(lat_min_g.le.zlat .and. zlat.le.lat_max_g)
then
1292 alpha(
i,
j)=xi*alphamin+(1.-xi)*alphamax
1308 #include "netcdf.inc"
1309 #include "dimensions.h"
1310 #include "paramet.h"
1314 LOGICAL,
SAVE :: first=.true.
1316 INTEGER,
SAVE :: ncidu,varidu,ncidv,varidv,ncidp,varidp
1317 INTEGER,
SAVE :: ncidq,varidq,ncidt,varidt,ncidps,varidps
1318 INTEGER :: ncidpl,varidpl,varidap,varidbp
1320 INTEGER,
DIMENSION(4) :: start,count
1321 INTEGER :: status,rcode
1322 CHARACTER (len = 80) :: abort_message
1323 CHARACTER (len = 20) :: modname =
'guide_read'
1324 abort_message=
'pb in guide_read'
1331 print*,
'Guide: ouverture des fichiers guidage '
1333 if (guide_plevs.EQ.1)
then
1334 print *,
'Lecture du guidage sur niveaux modele'
1335 rcode = nf90_open(
'apbp.nc', nf90_nowrite, ncidpl)
1336 rcode = nf90_inq_varid(ncidpl,
'AP', varidap)
1337 rcode = nf90_inq_varid(ncidpl,
'BP', varidbp)
1338 print*,
'ncidpl,varidap',ncidpl,varidap
1341 if (guide_plevs.EQ.2)
then
1342 rcode = nf90_open(
'P.nc', nf90_nowrite, ncidp)
1343 rcode = nf90_inq_varid(ncidp,
'PRES', varidp)
1344 print*,
'ncidp,varidp',ncidp,varidp
1345 if (ncidpl.eq.-99) ncidpl=ncidp
1349 rcode = nf90_open(
'u.nc', nf90_nowrite, ncidu)
1350 rcode = nf90_inq_varid(ncidu,
'UWND', varidu)
1351 print*,
'ncidu,varidu',ncidu,varidu
1352 if (ncidpl.eq.-99) ncidpl=ncidu
1356 rcode = nf90_open(
'v.nc', nf90_nowrite, ncidv)
1357 rcode = nf90_inq_varid(ncidv,
'VWND', varidv)
1358 print*,
'ncidv,varidv',ncidv,varidv
1359 if (ncidpl.eq.-99) ncidpl=ncidv
1363 rcode = nf90_open(
'T.nc', nf90_nowrite, ncidt)
1364 rcode = nf90_inq_varid(ncidt,
'AIR', varidt)
1365 print*,
'ncidT,varidT',ncidt,varidt
1366 if (ncidpl.eq.-99) ncidpl=ncidt
1370 rcode = nf90_open(
'hur.nc', nf90_nowrite, ncidq)
1371 rcode = nf90_inq_varid(ncidq,
'RH', varidq)
1372 print*,
'ncidQ,varidQ',ncidq,varidq
1373 if (ncidpl.eq.-99) ncidpl=ncidq
1376 if ((guide_p).OR.(guide_plevs.EQ.1))
then
1377 rcode = nf90_open(
'ps.nc', nf90_nowrite, ncidps)
1378 rcode = nf90_inq_varid(ncidps,
'SP', varidps)
1379 print*,
'ncidps,varidps',ncidps,varidps
1382 if (guide_plevs.EQ.0)
then
1383 rcode = nf90_inq_varid(ncidpl,
'LEVEL', varidpl)
1384 IF (rcode.NE.0) rcode = nf90_inq_varid(ncidpl,
'PRESSURE', varidpl)
1385 print*,
'ncidpl,varidpl',ncidpl,varidpl
1388 IF (guide_plevs.EQ.1)
THEN
1390 status=nf_get_vara_double(ncidpl,varidap,1,nlevnc,apnc)
1391 status=nf_get_vara_double(ncidpl,varidbp,1,nlevnc,bpnc)
1393 status=nf_get_vara_real(ncidpl,varidap,1,nlevnc,apnc)
1394 status=nf_get_vara_real(ncidpl,varidbp,1,nlevnc,bpnc)
1396 ELSEIF (guide_plevs.EQ.0)
THEN
1398 status=nf_get_vara_double(ncidpl,varidpl,1,nlevnc,apnc)
1400 status=nf_get_vara_real(ncidpl,varidpl,1,nlevnc,apnc)
1423 IF (invert_y) start(2)=
jjp1-jje_u+1
1425 if (guide_plevs.EQ.2)
then
1427 status=nf_get_vara_double(ncidp,varidp,start,count,pnat2)
1429 status=nf_get_vara_real(ncidp,varidp,start,count,pnat2)
1441 status=nf_get_vara_double(ncidu,varidu,start,count,unat2)
1443 status=nf_get_vara_real(ncidu,varidu,start,count,unat2)
1456 status=nf_get_vara_double(ncidt,varidt,start,count,tnat2)
1458 status=nf_get_vara_real(ncidt,varidt,start,count,tnat2)
1470 status=nf_get_vara_double(ncidq,varidq,start,count,qnat2)
1472 status=nf_get_vara_real(ncidq,varidq,start,count,qnat2)
1486 IF (invert_y) start(2)=jjm-jje_v+1
1489 status=nf_get_vara_double(ncidv,varidv,start,count,vnat2)
1491 status=nf_get_vara_real(ncidv,varidv,start,count,vnat2)
1501 if ((guide_p).OR.(guide_plevs.EQ.1))
then
1508 IF (invert_y) start(2)=
jjp1-jje_u+1
1510 status=nf_get_vara_double(ncidps,varidps,start,count,psnat2)
1512 status=nf_get_vara_real(ncidps,varidps,start,count,psnat2)
1528 #include "netcdf.inc"
1529 #include "dimensions.h"
1530 #include "paramet.h"
1534 LOGICAL,
SAVE :: first=.true.
1536 INTEGER,
SAVE :: ncidu,varidu,ncidv,varidv,ncidp,varidp
1537 INTEGER,
SAVE :: ncidq,varidq,ncidt,varidt,ncidps,varidps
1538 INTEGER :: ncidpl,varidpl,varidap,varidbp
1540 INTEGER,
DIMENSION(4) :: start,count
1541 INTEGER :: status,rcode
1543 REAL,
DIMENSION (jjb_u:jje_u,llm) :: zu
1544 REAL,
DIMENSION (jjb_v:jje_v,llm) ::
zv
1546 CHARACTER (len = 80) :: abort_message
1547 CHARACTER (len = 20) :: modname =
'guide_read'
1548 abort_message=
'pb in guide_read2D'
1555 print*,
'Guide: ouverture des fichiers guidage '
1557 if (guide_plevs.EQ.1)
then
1558 print *,
'Lecture du guidage sur niveaux mod�le'
1559 rcode = nf90_open(
'apbp.nc', nf90_nowrite, ncidpl)
1560 rcode = nf90_inq_varid(ncidpl,
'AP', varidap)
1561 rcode = nf90_inq_varid(ncidpl,
'BP', varidbp)
1562 print*,
'ncidpl,varidap',ncidpl,varidap
1565 if (guide_plevs.EQ.2)
then
1566 rcode = nf90_open(
'P.nc', nf90_nowrite, ncidp)
1567 rcode = nf90_inq_varid(ncidp,
'PRES', varidp)
1568 print*,
'ncidp,varidp',ncidp,varidp
1569 if (ncidpl.eq.-99) ncidpl=ncidp
1573 rcode = nf90_open(
'u.nc', nf90_nowrite, ncidu)
1574 rcode = nf90_inq_varid(ncidu,
'UWND', varidu)
1575 print*,
'ncidu,varidu',ncidu,varidu
1576 if (ncidpl.eq.-99) ncidpl=ncidu
1580 rcode = nf90_open(
'v.nc', nf90_nowrite, ncidv)
1581 rcode = nf90_inq_varid(ncidv,
'VWND', varidv)
1582 print*,
'ncidv,varidv',ncidv,varidv
1583 if (ncidpl.eq.-99) ncidpl=ncidv
1587 rcode = nf90_open(
'T.nc', nf90_nowrite, ncidt)
1588 rcode = nf90_inq_varid(ncidt,
'AIR', varidt)
1589 print*,
'ncidT,varidT',ncidt,varidt
1590 if (ncidpl.eq.-99) ncidpl=ncidt
1594 rcode = nf90_open(
'hur.nc', nf90_nowrite, ncidq)
1595 rcode = nf90_inq_varid(ncidq,
'RH', varidq)
1596 print*,
'ncidQ,varidQ',ncidq,varidq
1597 if (ncidpl.eq.-99) ncidpl=ncidq
1600 if ((guide_p).OR.(guide_plevs.EQ.1))
then
1601 rcode = nf90_open(
'ps.nc', nf90_nowrite, ncidps)
1602 rcode = nf90_inq_varid(ncidps,
'SP', varidps)
1603 print*,
'ncidps,varidps',ncidps,varidps
1606 if (guide_plevs.EQ.0)
then
1607 rcode = nf90_inq_varid(ncidpl,
'LEVEL', varidpl)
1608 IF (rcode.NE.0) rcode = nf90_inq_varid(ncidpl,
'PRESSURE', varidpl)
1609 print*,
'ncidpl,varidpl',ncidpl,varidpl
1612 if (guide_plevs.EQ.1)
then
1614 status=nf_get_vara_double(ncidpl,varidap,1,nlevnc,apnc)
1615 status=nf_get_vara_double(ncidpl,varidbp,1,nlevnc,bpnc)
1617 status=nf_get_vara_real(ncidpl,varidap,1,nlevnc,apnc)
1618 status=nf_get_vara_real(ncidpl,varidbp,1,nlevnc,bpnc)
1620 elseif (guide_plevs.EQ.0)
THEN
1622 status=nf_get_vara_double(ncidpl,varidpl,1,nlevnc,apnc)
1624 status=nf_get_vara_real(ncidpl,varidpl,1,nlevnc,apnc)
1647 IF (invert_y) start(2)=
jjp1-jje_u+1
1649 if (guide_plevs.EQ.2)
then
1651 status=nf_get_vara_double(ncidp,varidp,start,count,zu)
1653 status=nf_get_vara_real(ncidp,varidp,start,count,zu)
1656 pnat2(
i,:,:)=zu(:,:)
1668 status=nf_get_vara_double(ncidu,varidu,start,count,zu)
1670 status=nf_get_vara_real(ncidu,varidu,start,count,zu)
1673 unat2(
i,:,:)=zu(:,:)
1686 status=nf_get_vara_double(ncidt,varidt,start,count,zu)
1688 status=nf_get_vara_real(ncidt,varidt,start,count,zu)
1691 tnat2(
i,:,:)=zu(:,:)
1704 status=nf_get_vara_double(ncidq,varidq,start,count,zu)
1706 status=nf_get_vara_real(ncidq,varidq,start,count,zu)
1709 qnat2(
i,:,:)=zu(:,:)
1723 IF (invert_y) start(2)=jjm-jje_v+1
1725 status=nf_get_vara_double(ncidv,varidv,start,count,
zv)
1727 status=nf_get_vara_real(ncidv,varidv,start,count,
zv)
1730 vnat2(
i,:,:)=
zv(:,:)
1741 if ((guide_p).OR.(guide_plevs.EQ.1))
then
1748 IF (invert_y) start(2)=
jjp1-jje_u+1
1750 status=nf_get_vara_double(ncidps,varidps,start,count,zu(:,1))
1752 status=nf_get_vara_real(ncidps,varidps,start,count,zu(:,1))
1772 include
"dimensions.h"
1774 include
"netcdf.inc"
1775 include
"comgeom2.h"
1776 include
"comconst.h"
1780 CHARACTER,
INTENT(IN) :: varname
1781 INTEGER,
INTENT (IN) :: hsize,vsize
1782 REAL,
DIMENSION (iip1,hsize,vsize),
INTENT(IN) :: field
1783 REAL,
INTENT (IN) :: factt
1788 INTEGER :: nid, id_lonu, id_lonv, id_latu, id_latv, id_tim, id_lev
1789 INTEGER :: vid_lonu,vid_lonv,vid_latu,vid_latv,vid_cu,vid_cv,vid_lev
1790 INTEGER,
DIMENSION (3) :: dim3
1791 INTEGER,
DIMENSION (4) :: dim4,count,start
1792 INTEGER :: ierr, varid
1796 IF (mpi_rank /= 0)
RETURN
1798 print *,
'Guide: output timestep',
timestep,
'var ',varname
1804 ierr=nf_create(
"guide_ins.nc",nf_clobber,nid)
1806 ierr=nf_def_dim(nid,
"LONU",iip1,id_lonu)
1807 ierr=nf_def_dim(nid,
"LONV",iip1,id_lonv)
1808 ierr=nf_def_dim(nid,
"LATU",
jjp1,id_latu)
1809 ierr=nf_def_dim(nid,
"LATV",jjm,id_latv)
1810 ierr=nf_def_dim(nid,
"LEVEL",llm,id_lev)
1811 ierr=nf_def_dim(nid,
"TIME",nf_unlimited,id_tim)
1814 ierr=nf_def_var(nid,
"LONU",nf_float,1,id_lonu,vid_lonu)
1815 ierr=nf_def_var(nid,
"LONV",nf_float,1,id_lonv,vid_lonv)
1816 ierr=nf_def_var(nid,
"LATU",nf_float,1,id_latu,vid_latu)
1817 ierr=nf_def_var(nid,
"LATV",nf_float,1,id_latv,vid_latv)
1818 ierr=nf_def_var(nid,
"LEVEL",nf_float,1,id_lev,vid_lev)
1819 ierr=nf_def_var(nid,
"cu",nf_float,2,(/id_lonu,id_latu/),vid_cu)
1820 ierr=nf_def_var(nid,
"cv",nf_float,2,(/id_lonv,id_latv/),vid_cv)
1826 ierr = nf_put_var_double(nid,vid_lonu,
rlonu*180./
pi)
1827 ierr = nf_put_var_double(nid,vid_lonv,
rlonv*180./
pi)
1828 ierr = nf_put_var_double(nid,vid_latu,
rlatu*180./
pi)
1829 ierr = nf_put_var_double(nid,vid_latv,
rlatv*180./
pi)
1830 ierr = nf_put_var_double(nid,vid_lev,
presnivs)
1831 ierr = nf_put_var_double(nid,vid_cu,
cu)
1832 ierr = nf_put_var_double(nid,vid_cv,
cv)
1834 ierr = nf_put_var_real(nid,vid_lonu,
rlonu*180./
pi)
1835 ierr = nf_put_var_real(nid,vid_lonv,
rlonv*180./
pi)
1836 ierr = nf_put_var_real(nid,vid_latu,
rlatu*180./
pi)
1837 ierr = nf_put_var_real(nid,vid_latv,
rlatv*180./
pi)
1838 ierr = nf_put_var_real(nid,vid_lev,
presnivs)
1839 ierr = nf_put_var_real(nid,vid_cu,
cu)
1840 ierr = nf_put_var_real(nid,vid_cv,
cv)
1845 ierr = nf_redef(nid)
1847 dim4=(/id_lonv,id_latu,id_lev,id_tim/)
1848 ierr = nf_def_var(nid,
"P",nf_float,4,dim4,varid)
1851 dim3=(/id_lonv,id_latu,id_tim/)
1852 ierr = nf_def_var(nid,
"ps",nf_float,3,dim3,varid)
1856 dim4=(/id_lonu,id_latu,id_lev,id_tim/)
1857 ierr = nf_def_var(nid,
"ucov",nf_float,4,dim4,varid)
1861 dim4=(/id_lonv,id_latv,id_lev,id_tim/)
1862 ierr = nf_def_var(nid,
"vcov",nf_float,4,dim4,varid)
1866 dim4=(/id_lonv,id_latu,id_lev,id_tim/)
1867 ierr = nf_def_var(nid,
"teta",nf_float,4,dim4,varid)
1871 dim4=(/id_lonv,id_latu,id_lev,id_tim/)
1872 ierr = nf_def_var(nid,
"q",nf_float,4,dim4,varid)
1875 ierr = nf_enddef(nid)
1876 ierr = nf_close(nid)
1883 ierr=nf_open(
"guide_ins.nc",nf_write,nid)
1885 SELECT CASE (varname)
1888 ierr = nf_inq_varid(nid,
"P",varid)
1890 count=(/iip1,
jjp1,llm,1/)
1892 ierr = nf_put_vara_double(nid,varid,start,count,field)
1894 ierr = nf_put_vara_real(nid,varid,start,count,field)
1897 ierr = nf_inq_varid(nid,
"ps",varid)
1899 count=(/iip1,
jjp1,1,0/)
1901 ierr = nf_put_vara_double(nid,varid,start,count,field/factt)
1903 ierr = nf_put_vara_real(nid,varid,start,count,field/factt)
1906 ierr = nf_inq_varid(nid,
"ucov",varid)
1908 count=(/iip1,
jjp1,llm,1/)
1910 ierr = nf_put_vara_double(nid,varid,start,count,field/factt)
1912 ierr = nf_put_vara_real(nid,varid,start,count,field/factt)
1915 ierr = nf_inq_varid(nid,
"vcov",varid)
1917 count=(/iip1,jjm,llm,1/)
1919 ierr = nf_put_vara_double(nid,varid,start,count,field/factt)
1921 ierr = nf_put_vara_real(nid,varid,start,count,field/factt)
1924 ierr = nf_inq_varid(nid,
"teta",varid)
1926 count=(/iip1,
jjp1,llm,1/)
1928 ierr = nf_put_vara_double(nid,varid,start,count,field/factt)
1930 ierr = nf_put_vara_real(nid,varid,start,count,field/factt)
1933 ierr = nf_inq_varid(nid,
"q",varid)
1935 count=(/iip1,
jjp1,llm,1/)
1937 ierr = nf_put_vara_double(nid,varid,start,count,field/factt)
1939 ierr = nf_put_vara_real(nid,varid,start,count,field/factt)
1943 ierr = nf_close(nid)
1957 if(abs(
x(
i,
l)).gt.1.e10)
then
1958 zz=0.5*(
x(
i-1,
l)+
x(
i+1,
l))
1959 print*,
'correction ',
i,
l,
x(
i,
l),zz