13 USE netcdf
, ONLY: nf90_nowrite, nf90_open, nf90_inq_varid, nf90_close
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 ::
pnat1,
pnat2
53 REAL,
ALLOCATABLE,
DIMENSION(:),
PRIVATE,
SAVE ::
apnc,
bpnc
55 REAL,
ALLOCATABLE,
DIMENSION(:,:),
PRIVATE,
SAVE ::
ugui1,
ugui2
56 REAL,
ALLOCATABLE,
DIMENSION(:,:),
PRIVATE,
SAVE ::
vgui1,
vgui2
57 REAL,
ALLOCATABLE,
DIMENSION(:,:),
PRIVATE,
SAVE ::
tgui1,
tgui2
58 REAL,
ALLOCATABLE,
DIMENSION(:,:),
PRIVATE,
SAVE ::
qgui1,
qgui2
74 include
"dimensions.h"
81 INTEGER :: error,ncidpl,rid,rcod
82 CHARACTER (len = 80) :: abort_message
83 CHARACTER (len = 20) :: modname =
'guide_init'
101 "zonal nudging requires grid regular in longitude", 1)
135 CALL getpar(
'tau_lat', 5.,
tau_lat,
'raideur lat guide regional ')
136 CALL getpar(
'tau_lon', 5.,
tau_lon,
'raideur lon guide regional ')
166 if (ncidpl.eq.-99)
then
167 rcod=nf90_open(
'apbp.nc',nf90_nowrite, ncidpl)
168 if (rcod.NE.nf_noerr)
THEN
169 print *,
'Guide: probleme -> pas de fichier apbp.nc'
174 if (ncidpl.EQ.-99)
then
175 rcod=nf90_open(
'P.nc',nf90_nowrite,ncidpl)
176 if (rcod.NE.nf_noerr)
THEN
177 print *,
'Guide: probleme -> pas de fichier P.nc'
182 if (ncidpl.eq.-99)
then
183 rcod=nf90_open(
'u.nc',nf90_nowrite,ncidpl)
184 if (rcod.NE.nf_noerr)
THEN
185 print *,
'Guide: probleme -> pas de fichier u.nc'
190 if (ncidpl.eq.-99)
then
191 rcod=nf90_open(
'v.nc',nf90_nowrite,ncidpl)
192 if (rcod.NE.nf_noerr)
THEN
193 print *,
'Guide: probleme -> pas de fichier v.nc'
198 if (ncidpl.eq.-99)
then
199 rcod=nf90_open(
'T.nc',nf90_nowrite,ncidpl)
200 if (rcod.NE.nf_noerr)
THEN
201 print *,
'Guide: probleme -> pas de fichier T.nc'
206 if (ncidpl.eq.-99)
then
207 rcod=nf90_open(
'hur.nc',nf90_nowrite, ncidpl)
208 if (rcod.NE.nf_noerr)
THEN
209 print *,
'Guide: probleme -> pas de fichier hur.nc'
214 error=nf_inq_dimid(ncidpl,
'LEVEL',rid)
215 IF (error.NE.nf_noerr) error=nf_inq_dimid(ncidpl,
'PRESSURE',rid)
216 IF (error.NE.nf_noerr)
THEN
217 print *,
'Guide: probleme lecture niveaux pression'
220 error=nf_inq_dimlen(ncidpl,rid,
nlevnc)
221 print *,
'Guide: nombre niveaux vert. nlevnc',
nlevnc
222 rcod = nf90_close(ncidpl)
227 abort_message=
'pb in allocation guide'
230 IF (error /= 0)
CALL abort_gcm(modname,abort_message,1)
232 IF (error /= 0)
CALL abort_gcm(modname,abort_message,1)
236 IF (error /= 0)
CALL abort_gcm(modname,abort_message,1)
238 IF (error /= 0)
CALL abort_gcm(modname,abort_message,1)
240 IF (error /= 0)
CALL abort_gcm(modname,abort_message,1)
242 IF (error /= 0)
CALL abort_gcm(modname,abort_message,1)
244 IF (error /= 0)
CALL abort_gcm(modname,abort_message,1)
246 IF (error /= 0)
CALL abort_gcm(modname,abort_message,1)
251 IF (error /= 0)
CALL abort_gcm(modname,abort_message,1)
253 IF (error /= 0)
CALL abort_gcm(modname,abort_message,1)
255 IF (error /= 0)
CALL abort_gcm(modname,abort_message,1)
257 IF (error /= 0)
CALL abort_gcm(modname,abort_message,1)
263 IF (error /= 0)
CALL abort_gcm(modname,abort_message,1)
265 IF (error /= 0)
CALL abort_gcm(modname,abort_message,1)
267 IF (error /= 0)
CALL abort_gcm(modname,abort_message,1)
269 IF (error /= 0)
CALL abort_gcm(modname,abort_message,1)
275 IF (error /= 0)
CALL abort_gcm(modname,abort_message,1)
277 IF (error /= 0)
CALL abort_gcm(modname,abort_message,1)
279 IF (error /= 0)
CALL abort_gcm(modname,abort_message,1)
281 IF (error /= 0)
CALL abort_gcm(modname,abort_message,1)
287 IF (error /= 0)
CALL abort_gcm(modname,abort_message,1)
289 IF (error /= 0)
CALL abort_gcm(modname,abort_message,1)
291 IF (error /= 0)
CALL abort_gcm(modname,abort_message,1)
293 IF (error /= 0)
CALL abort_gcm(modname,abort_message,1)
299 IF (error /= 0)
CALL abort_gcm(modname,abort_message,1)
301 IF (error /= 0)
CALL abort_gcm(modname,abort_message,1)
307 IF (error /= 0)
CALL abort_gcm(modname,abort_message,1)
309 IF (error /= 0)
CALL abort_gcm(modname,abort_message,1)
314 IF (error /= 0)
CALL abort_gcm(modname,abort_message,1)
316 IF (error /= 0)
CALL abort_gcm(modname,abort_message,1)
338 SUBROUTINE guide_main(itau,ucov,vcov,teta,q,masse,ps)
346 include
"dimensions.h"
352 INTEGER,
INTENT(IN) :: itau
353 REAL,
DIMENSION (ip1jmp1,llm),
INTENT(INOUT) :: ucov,teta,q,masse
354 REAL,
DIMENSION (ip1jm,llm),
INTENT(INOUT) :: vcov
355 REAL,
DIMENSION (ip1jmp1),
INTENT(INOUT) :: ps
358 LOGICAL,
SAVE :: first=.
true.
360 REAL,
DIMENSION (ip1jmp1,llm) :: f_add
362 REAL,
DIMENSION (iip1,jjp1,llm) :: pk
363 REAL,
DIMENSION (iip1,jjp1) :: pks
365 REAL,
DIMENSION (ip1jmp1,llmp1) :: p
367 INTEGER,
SAVE :: step_rea,count_no_rea,itau_test
368 REAL :: ditau, dday_step
454 IF (reste.EQ.0.)
THEN
455 IF (itau_test.EQ.itau)
THEN
456 write(*,*)
'deuxieme passage de advreel a itau=',itau
467 print*,
'Lecture fichiers guidage, pas ',step_rea, &
468 'apres ',count_no_rea,
' non lectures'
477 count_no_rea=count_no_rea+1
503 if (pressure_exner)
then
512 p(i+(j-1)*iip1,l) =
preff * ( pk(i,j,l)/
cpp) ** unskap
594 include
"dimensions.h"
598 INTEGER,
INTENT(IN) :: hsize
599 INTEGER,
INTENT(IN) :: vsize
600 REAL,
DIMENSION(hsize),
INTENT(IN) :: alpha
601 REAL,
DIMENSION(hsize,vsize),
INTENT(INOUT) :: field
606 IF (hsize==
ip1jm)
THEN
623 include
"dimensions.h"
629 INTEGER,
INTENT(IN) :: typ
630 INTEGER,
INTENT(IN) :: vsize
631 INTEGER,
INTENT(IN) :: hsize
632 REAL,
DIMENSION(hsize*iip1,vsize),
INTENT(INOUT) :: field
635 LOGICAL,
SAVE :: first=.
true.
636 INTEGER,
DIMENSION (2),
SAVE :: imin, imax
638 REAL,
DIMENSION (iip1) :: lond
639 REAL,
DIMENSION (hsize,vsize):: fieldm
645 imin(1)=1;imax(1)=iip1;
646 imin(2)=1;imax(2)=iip1;
666 DO i=imin(typ),imax(typ)
668 fieldm(j,l)=fieldm(j,l)+field(ij,l)
671 fieldm(:,l)=fieldm(:,l)/
REAL(imax(typ)-imin(typ)+1)
676 field(ij,l)=fieldm(j,l)
684 DO i=imin(typ),imax(typ)
686 fieldm(j,l)=fieldm(j,l)+field(ij,l)
689 fieldm(:,l)=fieldm(:,l)/
REAL(imax(typ)-imin(typ)+1)
694 field(ij,l)=fieldm(j,l)
711 include
"dimensions.h"
717 REAL,
DIMENSION (iip1,jjp1),
INTENT(IN) :: psi
718 REAL,
DIMENSION (iip1,jjp1,llm),
INTENT(IN) :: teta
720 LOGICAL,
SAVE :: first=.
true.
722 REAL,
DIMENSION (iip1,jjp1,nlevnc) :: plnc1,plnc2
723 REAL,
DIMENSION (iip1,jjp1,llm) :: plunc,plsnc
724 REAL,
DIMENSION (iip1,jjm,llm) :: plvnc
725 REAL,
DIMENSION (iip1,jjp1,llmp1) :: p
726 REAL,
DIMENSION (iip1,jjp1,llm) :: pls, pext
727 REAL,
DIMENSION (iip1,jjp1,llm) :: pbarx
728 REAL,
DIMENSION (iip1,jjm,llm) :: pbary
730 REAL,
DIMENSION (iip1,jjp1,llm) :: pk
731 REAL,
DIMENSION (iip1,jjp1) :: pks
734 REAL,
DIMENSION (ip1jmp1,llm) :: qsat
736 REAL,
DIMENSION (iip1,jjp1,llm) :: zu1,zu2
737 REAL,
DIMENSION (iip1,jjm,llm) :: zv1,zv2
742 print *,
'Guide: conversion variables guidage'
759 print*,
'Guide: verification ordre niveaux verticaux'
762 print*,
'PL(',l,
')=',(ap(l)+ap(l+1))/2. &
765 print*,
'Fichiers guidage'
769 print*,
'PL(',l,
')=',plnc2(1,
jjb_u,l)
780 print *,
'inversion de l''ordre: invert_p=',
invert_p
802 pls(i,j,l)=(ap(l)+ap(l+1))/2.+psi(i,j)*(
bp(l)+
bp(l+1))/2.
808 if (pressure_exner)
then
817 pls(i,j,l) =
preff * ( pk(i,j,l)/
cpp) ** unskap
827 pext(i,j,l)=pls(i,j,l)*
aire(i,j)
840 plunc(i,j,l)=pbarx(i,j,l)/
aireu(i,j)
841 plsnc(i,j,l)=pls(i,j,l)
848 plvnc(i,j,l)=pbary(i,j,l)/
airev(i,j)
884 plnc2(i,j,l)=
pnat2(i,j,l)
885 plnc1(i,j,l)=
pnat1(i,j,l)
903 tgui1(ij,l)=zu1(i,j,l)
904 tgui2(ij,l)=zu2(i,j,l)
909 tgui1(ij,l)=zu1(i,j,l)*
cpp/pk(i,j,l)
910 tgui2(ij,l)=zu2(i,j,l)*
cpp/pk(i,j,l)
940 plnc2(i,j,l)=
pnat2(i,j,l)
941 plnc1(i,j,l)=
pnat1(i,j,l)
960 qgui1(ij,l)=zu1(i,j,l)
961 qgui2(ij,l)=zu2(i,j,l)
992 plnc2(iip1,j,l)=plnc2(1,j,l)
993 plnc1(iip1,j,l)=plnc1(1,j,l)
1005 plnc2(iip1,j,l)=plnc2(1,j,l)
1006 plnc1(iip1,j,l)=plnc1(1,j,l)
1022 ugui1(ij,l)=zu1(i,j,l)*
cu(i,j)
1023 ugui2(ij,l)=zu2(i,j,l)*
cu(i,j)
1084 vgui1(ij,l)=zv1(i,j,l)*
cv(i,j)
1085 vgui2(ij,l)=zv2(i,j,l)*
cv(i,j)
1097 SUBROUTINE tau2alpha(typ,pim,pjm,factt,taumin,taumax,alpha)
1103 include
"dimensions.h"
1105 include
"comconst.h"
1106 include
"comgeom2.h"
1110 INTEGER,
INTENT(IN) :: typ
1111 INTEGER,
INTENT(IN) :: pim,pjm
1112 REAL,
INTENT(IN) :: factt
1113 REAL,
INTENT(IN) :: taumin,taumax
1115 REAL,
DIMENSION(pim,pjm),
INTENT(OUT) :: alpha
1118 LOGICAL,
SAVE :: first=.
true.
1119 REAL,
SAVE :: gamma,dxdy_min,dxdy_max
1120 REAL,
DIMENSION (iip1,jjp1) :: zdx,zdy
1121 REAL,
DIMENSION (iip1,jjp1) :: dxdys,dxdyu
1122 REAL,
DIMENSION (iip1,jjm) :: dxdyv
1125 real alphamin,alphamax,xi
1126 integer i,j,ilon,ilat
1129 alphamin=factt/taumax
1130 alphamax=factt/taumin
1142 elseif (typ.eq.1)
then
1145 elseif (typ.eq.3)
then
1149 alpha(i,j)=alphamax/16.* &
1164 zdx(i,j)=0.5*(
cu(i-1,j)+
cu(i,j))/cos(
rlatu(j))
1166 zdx(1,j)=zdx(iip1,j)
1170 zdy(i,j)=0.5*(
cv(i,j-1)+
cv(i,j))
1175 zdx(i,
jjp1)=zdx(i,jjm)
1177 zdy(i,
jjp1)=zdy(i,jjm)
1181 dxdys(i,j)=sqrt(zdx(i,j)*zdx(i,j)+zdy(i,j)*zdy(i,j))
1187 dxdyu(i,j)=0.5*(dxdys(i,j)+dxdys(i+1,j))
1189 dxdyu(iip1,j)=dxdyu(1,j)
1195 dxdyv(i,j)=0.5*(dxdys(i,j)+dxdys(i,j+1))
1205 dxdy_min=dxdys(ilon,ilat)
1210 dxdy_max=max(dxdy_max,dxdys(i,j))
1215 print*,
'ATTENTION modele peu zoome'
1216 print*,
'ATTENTION on prend une constante de guidage cste'
1219 gamma=(dxdy_max-2.*dxdy_min)/(dxdy_max-dxdy_min)
1220 print*,
'gamma=',gamma
1221 if (gamma.lt.1.e-5)
then
1222 print*,
'gamma =',gamma,
'<1e-5'
1225 gamma=log(0.5)/log(gamma)
1229 print*,
'gamma=',gamma
1238 elseif (typ.eq.2)
then
1241 elseif (typ.eq.3)
then
1249 xi=((dxdy_max-dxdy_)/(dxdy_max-dxdy_min))**gamma
1252 alpha(i,j)=xi*alphamin+(1.-xi)*alphamax
1261 if (.not.
guide_add) alpha = 1. - exp(- alpha)
1270 #include "netcdf.inc"
1271 #include "dimensions.h"
1272 #include "paramet.h"
1274 INTEGER,
INTENT(IN) :: timestep
1276 LOGICAL,
SAVE :: first=.
true.
1278 INTEGER,
SAVE :: ncidu,varidu,ncidv,varidv,ncidp,varidp
1279 INTEGER,
SAVE :: ncidQ,varidQ,ncidt,varidt,ncidps,varidps
1280 INTEGER :: ncidpl,varidpl,varidap,varidbp
1282 INTEGER,
DIMENSION(4) :: start,count
1283 INTEGER :: status,rcode
1285 CHARACTER (len = 80) :: abort_message
1286 CHARACTER (len = 20) :: modname =
'guide_read'
1292 print*,
'Guide: ouverture des fichiers guidage '
1295 print *,
'Lecture du guidage sur niveaux modele'
1296 rcode = nf90_open(
'apbp.nc', nf90_nowrite, ncidpl)
1297 IF (rcode.NE.nf_noerr)
THEN
1298 print *,
'Guide: probleme -> pas de fichier apbp.nc'
1301 rcode = nf90_inq_varid(ncidpl,
'AP', varidap)
1302 IF (rcode.NE.nf_noerr)
THEN
1303 print *,
'Guide: probleme -> pas de variable AP, fichier apbp.nc'
1306 rcode = nf90_inq_varid(ncidpl,
'BP', varidbp)
1307 IF (rcode.NE.nf_noerr)
THEN
1308 print *,
'Guide: probleme -> pas de variable BP, fichier apbp.nc'
1311 print*,
'ncidpl,varidap',ncidpl,varidap
1315 rcode = nf90_open(
'P.nc', nf90_nowrite, ncidp)
1316 IF (rcode.NE.nf_noerr)
THEN
1317 print *,
'Guide: probleme -> pas de fichier P.nc'
1320 rcode = nf90_inq_varid(ncidp,
'PRES', varidp)
1321 IF (rcode.NE.nf_noerr)
THEN
1322 print *,
'Guide: probleme -> pas de variable PRES, fichier P.nc'
1325 print*,
'ncidp,varidp',ncidp,varidp
1326 if (ncidpl.eq.-99) ncidpl=ncidp
1330 rcode = nf90_open(
'u.nc', nf90_nowrite, ncidu)
1331 IF (rcode.NE.nf_noerr)
THEN
1332 print *,
'Guide: probleme -> pas de fichier u.nc'
1335 rcode = nf90_inq_varid(ncidu,
'UWND', varidu)
1336 IF (rcode.NE.nf_noerr)
THEN
1337 print *,
'Guide: probleme -> pas de variable UWND, fichier u.nc'
1340 print*,
'ncidu,varidu',ncidu,varidu
1341 if (ncidpl.eq.-99) ncidpl=ncidu
1345 rcode = nf90_open(
'v.nc', nf90_nowrite, ncidv)
1346 IF (rcode.NE.nf_noerr)
THEN
1347 print *,
'Guide: probleme -> pas de fichier v.nc'
1350 rcode = nf90_inq_varid(ncidv,
'VWND', varidv)
1351 IF (rcode.NE.nf_noerr)
THEN
1352 print *,
'Guide: probleme -> pas de variable VWND, fichier v.nc'
1355 print*,
'ncidv,varidv',ncidv,varidv
1356 if (ncidpl.eq.-99) ncidpl=ncidv
1360 rcode = nf90_open(
'T.nc', nf90_nowrite, ncidt)
1361 IF (rcode.NE.nf_noerr)
THEN
1362 print *,
'Guide: probleme -> pas de fichier T.nc'
1365 rcode = nf90_inq_varid(ncidt,
'AIR', varidt)
1366 IF (rcode.NE.nf_noerr)
THEN
1367 print *,
'Guide: probleme -> pas de variable AIR, fichier T.nc'
1370 print*,
'ncidT,varidT',ncidt,varidt
1371 if (ncidpl.eq.-99) ncidpl=ncidt
1375 rcode = nf90_open(
'hur.nc', nf90_nowrite, ncidq)
1376 IF (rcode.NE.nf_noerr)
THEN
1377 print *,
'Guide: probleme -> pas de fichier hur.nc'
1380 rcode = nf90_inq_varid(ncidq,
'RH', varidq)
1381 IF (rcode.NE.nf_noerr)
THEN
1382 print *,
'Guide: probleme -> pas de variable RH, fichier hur.nc'
1385 print*,
'ncidQ,varidQ',ncidq,varidq
1386 if (ncidpl.eq.-99) ncidpl=ncidq
1390 rcode = nf90_open(
'ps.nc', nf90_nowrite, ncidps)
1391 IF (rcode.NE.nf_noerr)
THEN
1392 print *,
'Guide: probleme -> pas de fichier ps.nc'
1395 rcode = nf90_inq_varid(ncidps,
'SP', varidps)
1396 IF (rcode.NE.nf_noerr)
THEN
1397 print *,
'Guide: probleme -> pas de variable SP, fichier ps.nc'
1400 print*,
'ncidps,varidps',ncidps,varidps
1404 rcode = nf90_inq_varid(ncidpl,
'LEVEL', varidpl)
1405 IF (rcode.NE.0) rcode = nf90_inq_varid(ncidpl,
'PRESSURE', varidpl)
1406 print*,
'ncidpl,varidpl',ncidpl,varidpl
1411 status=nf_get_vara_double(ncidpl,varidap,1,
nlevnc,
apnc)
1412 status=nf_get_vara_double(ncidpl,varidbp,1,
nlevnc,
bpnc)
1414 status=nf_get_vara_real(ncidpl,varidap,1,
nlevnc,
apnc)
1415 status=nf_get_vara_real(ncidpl,varidbp,1,
nlevnc,
bpnc)
1419 status=nf_get_vara_double(ncidpl,varidpl,1,
nlevnc,
apnc)
1421 status=nf_get_vara_real(ncidpl,varidpl,1,
nlevnc,
apnc)
1447 status=nf_get_vara_double(ncidp,varidp,start,count,
pnat2)
1449 status=nf_get_vara_real(ncidp,varidp,start,count,
pnat2)
1459 status=nf_get_vara_double(ncidu,varidu,start,count,
unat2)
1461 status=nf_get_vara_real(ncidu,varidu,start,count,
unat2)
1472 status=nf_get_vara_double(ncidt,varidt,start,count,
tnat2)
1474 status=nf_get_vara_real(ncidt,varidt,start,count,
tnat2)
1484 status=nf_get_vara_double(ncidq,varidq,start,count,
qnat2)
1486 status=nf_get_vara_real(ncidq,varidq,start,count,
qnat2)
1498 status=nf_get_vara_double(ncidv,varidv,start,count,
vnat2)
1500 status=nf_get_vara_real(ncidv,varidv,start,count,
vnat2)
1515 status=nf_get_vara_double(ncidps,varidps,start,count,
psnat2)
1517 status=nf_get_vara_real(ncidps,varidps,start,count,
psnat2)
1531 #include "netcdf.inc"
1532 #include "dimensions.h"
1533 #include "paramet.h"
1535 INTEGER,
INTENT(IN) :: timestep
1537 LOGICAL,
SAVE :: first=.
true.
1539 INTEGER,
SAVE :: ncidu,varidu,ncidv,varidv,ncidp,varidp
1540 INTEGER,
SAVE :: ncidQ,varidQ,ncidt,varidt,ncidps,varidps
1541 INTEGER :: ncidpl,varidpl,varidap,varidbp
1543 INTEGER,
DIMENSION(4) :: start,count
1544 INTEGER :: status,rcode
1546 REAL,
DIMENSION (jjp1,llm) :: zu
1547 REAL,
DIMENSION (jjm,llm) :: zv
1550 CHARACTER (len = 80) :: abort_message
1551 CHARACTER (len = 20) :: modname =
'guide_read2D'
1557 print*,
'Guide: ouverture des fichiers guidage '
1560 print *,
'Lecture du guidage sur niveaux mod�le'
1561 rcode = nf90_open(
'apbp.nc', nf90_nowrite, ncidpl)
1562 IF (rcode.NE.nf_noerr)
THEN
1563 print *,
'Guide: probleme -> pas de fichier apbp.nc'
1566 rcode = nf90_inq_varid(ncidpl,
'AP', varidap)
1567 IF (rcode.NE.nf_noerr)
THEN
1568 print *,
'Guide: probleme -> pas de variable AP, fichier apbp.nc'
1571 rcode = nf90_inq_varid(ncidpl,
'BP', varidbp)
1572 IF (rcode.NE.nf_noerr)
THEN
1573 print *,
'Guide: probleme -> pas de variable BP, fichier apbp.nc'
1576 print*,
'ncidpl,varidap',ncidpl,varidap
1580 rcode = nf90_open(
'P.nc', nf90_nowrite, ncidp)
1581 IF (rcode.NE.nf_noerr)
THEN
1582 print *,
'Guide: probleme -> pas de fichier P.nc'
1585 rcode = nf90_inq_varid(ncidp,
'PRES', varidp)
1586 IF (rcode.NE.nf_noerr)
THEN
1587 print *,
'Guide: probleme -> pas de variable PRES, fichier P.nc'
1590 print*,
'ncidp,varidp',ncidp,varidp
1591 if (ncidpl.eq.-99) ncidpl=ncidp
1595 rcode = nf90_open(
'u.nc', nf90_nowrite, ncidu)
1596 IF (rcode.NE.nf_noerr)
THEN
1597 print *,
'Guide: probleme -> pas de fichier u.nc'
1600 rcode = nf90_inq_varid(ncidu,
'UWND', varidu)
1601 IF (rcode.NE.nf_noerr)
THEN
1602 print *,
'Guide: probleme -> pas de variable UWND, fichier u.nc'
1605 print*,
'ncidu,varidu',ncidu,varidu
1606 if (ncidpl.eq.-99) ncidpl=ncidu
1610 rcode = nf90_open(
'v.nc', nf90_nowrite, ncidv)
1611 IF (rcode.NE.nf_noerr)
THEN
1612 print *,
'Guide: probleme -> pas de fichier v.nc'
1615 rcode = nf90_inq_varid(ncidv,
'VWND', varidv)
1616 IF (rcode.NE.nf_noerr)
THEN
1617 print *,
'Guide: probleme -> pas de variable VWND, fichier v.nc'
1620 print*,
'ncidv,varidv',ncidv,varidv
1621 if (ncidpl.eq.-99) ncidpl=ncidv
1625 rcode = nf90_open(
'T.nc', nf90_nowrite, ncidt)
1626 IF (rcode.NE.nf_noerr)
THEN
1627 print *,
'Guide: probleme -> pas de fichier T.nc'
1630 rcode = nf90_inq_varid(ncidt,
'AIR', varidt)
1631 IF (rcode.NE.nf_noerr)
THEN
1632 print *,
'Guide: probleme -> pas de variable AIR, fichier T.nc'
1635 print*,
'ncidT,varidT',ncidt,varidt
1636 if (ncidpl.eq.-99) ncidpl=ncidt
1640 rcode = nf90_open(
'hur.nc', nf90_nowrite, ncidq)
1641 IF (rcode.NE.nf_noerr)
THEN
1642 print *,
'Guide: probleme -> pas de fichier hur.nc'
1645 rcode = nf90_inq_varid(ncidq,
'RH', varidq)
1646 IF (rcode.NE.nf_noerr)
THEN
1647 print *,
'Guide: probleme -> pas de variable RH, fichier hur.nc'
1650 print*,
'ncidQ,varidQ',ncidq,varidq
1651 if (ncidpl.eq.-99) ncidpl=ncidq
1655 rcode = nf90_open(
'ps.nc', nf90_nowrite, ncidps)
1656 IF (rcode.NE.nf_noerr)
THEN
1657 print *,
'Guide: probleme -> pas de fichier ps.nc'
1660 rcode = nf90_inq_varid(ncidps,
'SP', varidps)
1661 IF (rcode.NE.nf_noerr)
THEN
1662 print *,
'Guide: probleme -> pas de variable SP, fichier ps.nc'
1665 print*,
'ncidps,varidps',ncidps,varidps
1669 rcode = nf90_inq_varid(ncidpl,
'LEVEL', varidpl)
1670 IF (rcode.NE.0) rcode = nf90_inq_varid(ncidpl,
'PRESSURE', varidpl)
1671 print*,
'ncidpl,varidpl',ncidpl,varidpl
1676 status=nf_get_vara_double(ncidpl,varidap,1,
nlevnc,
apnc)
1677 status=nf_get_vara_double(ncidpl,varidbp,1,
nlevnc,
bpnc)
1679 status=nf_get_vara_real(ncidpl,varidap,1,
nlevnc,
apnc)
1680 status=nf_get_vara_real(ncidpl,varidbp,1,
nlevnc,
bpnc)
1684 status=nf_get_vara_double(ncidpl,varidpl,1,
nlevnc,
apnc)
1686 status=nf_get_vara_real(ncidpl,varidpl,1,
nlevnc,
apnc)
1712 status=nf_get_vara_double(ncidp,varidp,start,count,zu)
1714 status=nf_get_vara_real(ncidp,varidp,start,count,zu)
1717 pnat2(i,:,:)=zu(:,:)
1727 status=nf_get_vara_double(ncidu,varidu,start,count,zu)
1729 status=nf_get_vara_real(ncidu,varidu,start,count,zu)
1732 unat2(i,:,:)=zu(:,:)
1743 status=nf_get_vara_double(ncidt,varidt,start,count,zu)
1745 status=nf_get_vara_real(ncidt,varidt,start,count,zu)
1748 tnat2(i,:,:)=zu(:,:)
1759 status=nf_get_vara_double(ncidq,varidq,start,count,zu)
1761 status=nf_get_vara_real(ncidq,varidq,start,count,zu)
1764 qnat2(i,:,:)=zu(:,:)
1776 status=nf_get_vara_double(ncidv,varidv,start,count,zv)
1778 status=nf_get_vara_real(ncidv,varidv,start,count,zv)
1781 vnat2(i,:,:)=zv(:,:)
1797 status=nf_get_vara_double(ncidps,varidps,start,count,zu(:,1))
1799 status=nf_get_vara_real(ncidps,varidps,start,count,zu(:,1))
1813 SUBROUTINE guide_out(varname,hsize,vsize,field,factt)
1817 include
"dimensions.h"
1819 include
"netcdf.inc"
1820 include
"comgeom2.h"
1821 include
"comconst.h"
1825 CHARACTER*(*),
INTENT(IN) :: varname
1826 INTEGER,
INTENT (IN) :: hsize,vsize
1827 REAL,
DIMENSION (iip1,hsize,vsize),
INTENT(IN) :: field
1828 REAL,
INTENT (IN) :: factt
1831 INTEGER,
SAVE :: timestep=0
1833 INTEGER :: nid, id_lonu, id_lonv, id_latu, id_latv, id_tim, id_lev
1834 INTEGER :: vid_lonu,vid_lonv,vid_latu,vid_latv,vid_cu,vid_cv,vid_lev
1835 INTEGER :: vid_au,vid_av
1837 INTEGER,
DIMENSION (3) :: dim3
1838 INTEGER,
DIMENSION (4) :: dim4,count,start
1839 INTEGER :: ierr, varid
1840 REAL,
DIMENSION (iip1,hsize,vsize) :: field2
1846 print *,
'Guide: output timestep',timestep,
'var ',varname
1847 IF (timestep.EQ.0)
THEN
1852 ierr=nf_create(
"guide_ins.nc",nf_clobber,nid)
1854 ierr=nf_def_dim(nid,
"LONU",iip1,id_lonu)
1855 print*,
'id_lonu 1 ',id_lonu
1856 ierr=nf_def_dim(nid,
"LONV",iip1,id_lonv)
1857 ierr=nf_def_dim(nid,
"LATU",
jjp1,id_latu)
1858 ierr=nf_def_dim(nid,
"LATV",jjm,id_latv)
1859 ierr=nf_def_dim(nid,
"LEVEL",
llm,id_lev)
1860 ierr=nf_def_dim(nid,
"TIME",nf_unlimited,id_tim)
1863 ierr=nf_def_var(nid,
"LONU",nf_float,1,id_lonu,vid_lonu)
1864 print*,
'id_lonu 2 ',id_lonu
1865 ierr=nf_def_var(nid,
"LONV",nf_float,1,id_lonv,vid_lonv)
1866 ierr=nf_def_var(nid,
"LATU",nf_float,1,id_latu,vid_latu)
1867 ierr=nf_def_var(nid,
"LATV",nf_float,1,id_latv,vid_latv)
1868 ierr=nf_def_var(nid,
"LEVEL",nf_float,1,id_lev,vid_lev)
1869 ierr=nf_def_var(nid,
"cu",nf_float,2,(/id_lonu,id_latu/),vid_cu)
1870 ierr=nf_def_var(nid,
"cv",nf_float,2,(/id_lonv,id_latv/),vid_cv)
1871 ierr=nf_def_var(nid,
"au",nf_float,2,(/id_lonu,id_latu/),vid_au)
1872 ierr=nf_def_var(nid,
"av",nf_float,2,(/id_lonv,id_latv/),vid_av)
1878 print*,
'id_lonu DOUBLE ',id_lonu,
rlonu*180./
pi
1879 ierr = nf_put_var_double(nid,vid_lonu,
rlonu*180./
pi)
1880 ierr = nf_put_var_double(nid,vid_lonv,
rlonv*180./
pi)
1881 ierr = nf_put_var_double(nid,vid_latu,
rlatu*180./
pi)
1882 ierr = nf_put_var_double(nid,vid_latv,
rlatv*180./
pi)
1883 ierr = nf_put_var_double(nid,vid_lev,
presnivs)
1884 ierr = nf_put_var_double(nid,vid_cu,
cu)
1885 ierr = nf_put_var_double(nid,vid_cv,
cv)
1886 ierr = nf_put_var_double(nid,vid_au,
alpha_u)
1887 ierr = nf_put_var_double(nid,vid_av,
alpha_v)
1889 print*,
'id_lonu 3 ',id_lonu,
rlonu*180./
pi
1890 ierr = nf_put_var_real(nid,vid_lonu,
rlonu*180./
pi)
1891 ierr = nf_put_var_real(nid,vid_lonv,
rlonv*180./
pi)
1892 ierr = nf_put_var_real(nid,vid_latu,
rlatu*180./
pi)
1893 ierr = nf_put_var_real(nid,vid_latv,
rlatv*180./
pi)
1894 ierr = nf_put_var_real(nid,vid_lev,
presnivs)
1895 ierr = nf_put_var_real(nid,vid_cu,
cu)
1896 ierr = nf_put_var_real(nid,vid_cv,
cv)
1897 ierr = nf_put_var_real(nid,vid_au,
alpha_u)
1898 ierr = nf_put_var_real(nid,vid_av,
alpha_v)
1903 ierr = nf_redef(nid)
1905 dim4=(/id_lonv,id_latu,id_lev,id_tim/)
1906 ierr = nf_def_var(nid,
"SP",nf_float,4,dim4,varid)
1909 dim3=(/id_lonv,id_latu,id_tim/)
1910 ierr = nf_def_var(nid,
"ps",nf_float,3,dim3,varid)
1914 print*,
'id_lonu 4 ',id_lonu,varname
1915 dim4=(/id_lonu,id_latu,id_lev,id_tim/)
1916 ierr = nf_def_var(nid,
"u",nf_float,4,dim4,varid)
1917 ierr = nf_def_var(nid,
"ua",nf_float,4,dim4,varid)
1918 ierr = nf_def_var(nid,
"ucov",nf_float,4,dim4,varid)
1922 dim4=(/id_lonv,id_latv,id_lev,id_tim/)
1923 ierr = nf_def_var(nid,
"v",nf_float,4,dim4,varid)
1924 ierr = nf_def_var(nid,
"va",nf_float,4,dim4,varid)
1925 ierr = nf_def_var(nid,
"vcov",nf_float,4,dim4,varid)
1929 dim4=(/id_lonv,id_latu,id_lev,id_tim/)
1930 ierr = nf_def_var(nid,
"teta",nf_float,4,dim4,varid)
1934 dim4=(/id_lonv,id_latu,id_lev,id_tim/)
1935 ierr = nf_def_var(nid,
"q",nf_float,4,dim4,varid)
1938 ierr = nf_enddef(nid)
1939 ierr = nf_close(nid)
1946 ierr=nf_open(
"guide_ins.nc",nf_write,nid)
1948 IF (varname==
"SP") timestep=timestep+1
1950 IF (varname==
"SP")
THEN
1951 print*,
'varname=SP=',varname
1953 print*,
'varname diff SP=',varname
1957 ierr = nf_inq_varid(nid,varname,varid)
1958 SELECT CASE (varname)
1960 start=(/1,1,1,timestep/)
1962 CASE (
"v",
"va",
"vcov")
1963 start=(/1,1,1,timestep/)
1964 count=(/iip1,jjm,
llm,1/)
1966 start=(/1,1,1,timestep/)
1970 SELECT CASE (varname)
1972 DO l=1,
llm ; field2(:,2:jjm,l)=field(:,2:jjm,l)/
cu(:,2:jjm) ;
ENDDO
1973 field2(:,1,:)=0. ; field2(:,
jjp1,:)=0.
1975 DO l=1,
llm ; field2(:,:,l)=field(:,:,l)/
cv(:,:) ;
ENDDO
1981 ierr = nf_put_vara_double(nid,varid,start,count,field2)
1983 ierr = nf_put_vara_real(nid,varid,start,count,field2)
1986 ierr = nf_close(nid)
2000 if(abs(x(i,l)).gt.1.e10)
then
2001 zz=0.5*(x(i-1,l)+x(i+1,l))
2002 print*,
'correction ',i,l,x(i,l),zz
logical, save, private guide_zon
real, save, private tau_min_t
real, save, private tau_min_v
real, dimension(:,:,:), allocatable, save, private pnat1
logical, save, private guide_bl
!$Header llmm1 INTEGER ip1jmp1
subroutine gather_field(Field, ij, ll, rank)
logical, save, private guide_t
logical, save, private guide_modele
integer, save, private jje_u
!$Header!c!c!c include serre h!c REAL && grossismx
real, dimension(:,:,:), allocatable, save, private qnat2
real, dimension(:), allocatable, save, private alpha_u
subroutine exner_milieu_p(ngrid, ps, p, pks, pk, pkf)
real, dimension(:,:,:), allocatable, save, private tnat1
subroutine massdair_p(p, masse)
integer, dimension(:), allocatable jj_nb_caldyn
real, dimension(:,:), allocatable, save, private ugui2
logical, save, private guide_q
!$Header!CDK comgeom COMMON comgeom alpha1p2
integer, save, private jjb_u
integer, save, private jjb_v
subroutine pres2lev(varo, varn, lmo, lmn, po, pn, ni, nj, ok_invertp)
real, dimension(:,:,:), allocatable, save, private qnat1
real, dimension(:), allocatable, save, private alpha_v
!$Id mode_top_bound COMMON comconstr kappa
logical, save, private guide_add
real, dimension(:,:,:), allocatable, save, private unat1
real, save, private tau_lat
logical, save, private guide_sav
!$Header!c!c!c include serre h!c REAL clon
real, dimension(:,:), allocatable, save, private qgui1
real, dimension(:,:), allocatable, save, private vgui2
integer, save, private iguide_sav
real, dimension(:,:), allocatable, save, private vgui1
subroutine invert_lat(xsize, ysize, vsize, field)
subroutine abort_gcm(modname, message, ierr)
!$Id Turb_fcg_gcssold get_uvd hqturb_gcssold endif!large scale llm day day1 day day1 *dt_toga endif!time annee_ref dt_toga u_toga vq_toga w_prof vq_prof llm day day1 day day1 *dt_dice endif!time annee_ref dt_dice swup_dice vg_dice omega_dice tg_prof vg_profd w_profd omega_profd!do llm!print llm l llm
logical, save, private invert_y
!$Id mode_top_bound COMMON comconstr && pi
!$Header!CDK comgeom COMMON comgeom aire
integer, save, private jjn_u
logical, save, private guide_p
!$Header!CDK comgeom COMMON comgeom rlatu
real, dimension(:,:,:), allocatable, save, private tnat2
subroutine tau2alpha(typ, pim, pjm, factt, taumin, taumax, alpha)
integer, save, private iguide_int
logical, save, private invert_p
real, dimension(:), allocatable, save, private psgui2
subroutine pression_p(ngrid, ap, bp, ps, p)
!$Header llmm1 INTEGER ip1jm
subroutine register_swapfieldhallo(FieldS, FieldR, ij, ll, jj_Nb_New, Up, Down, a_request)
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL false
subroutine q_sat(np, temp, pres, qsat)
real, save, private lat_min_g
real, dimension(:,:), allocatable, save, private tgui2
!$Header!CDK comgeom COMMON comgeom alpha1p4
integer, save, private ijb_u
subroutine massbar_p(masse, massebx, masseby)
!$Header!CDK comgeom COMMON comgeom aireu
logical, save, private guide_teta
logical, save, private guide_u
real, dimension(:,:), allocatable, save, private tgui1
real, dimension(:,:,:), allocatable, save, private vnat1
integer, save, private ije_v
subroutine guide_addfield(hsize, vsize, field, alpha)
!$Id mode_top_bound COMMON comconstr cpp
integer, save, private ijb_v
logical, save, private guide_reg
logical, save, private guide_hr
real, dimension(:), allocatable, save, private alpha_pcor
real, save, private tau_max_u
subroutine guide_read2d(timestep)
subroutine guide_zonave(typ, hsize, vsize, field)
subroutine guide_out(varname, hsize, vsize, field, factt)
integer, save, private jje_v
logical, save, private guide_2d
real, save, private tau_lon
integer, save, private ijn_v
subroutine guide_read(timestep)
logical, save, private gamma4
integer, save, private nlevnc
!$Id mode_top_bound COMMON comconstr daysec
!$Header!CDK comgeom COMMON comgeom rlonu
!$Header!CDK comgeom COMMON comgeom rlatv
real, dimension(:,:), allocatable, save, private psnat1
real, save, private tau_max_t
subroutine sendrequest(a_Request)
subroutine correctbid(iim, nl, x)
real, dimension(:,:), allocatable, save, private psnat2
real, dimension(:,:), allocatable, save, private qgui2
!$Header!CDK comgeom COMMON comgeom alpha3p4
real, save, private tau_max_v
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL ulevSTD CALL &zphi philevSTD CALL &zx_rh rhlevSTD!DO klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon du jour ou toutes les read_climoz CALL true
subroutine exner_hyb_p(ngrid, ps, p, pks, pk, pkf)
real, dimension(:), allocatable, save, private alpha_p
!$Id!Parameters for parameters that control the rate of approach!to quasi equilibrium noff nlm real tlcrit real entp real sigd real coeffs real dtmax real cu real betad real damp real delta COMMON cvparam nlm tlcrit sigd coeffs cu
real, dimension(:,:,:), allocatable, save, private pnat2
subroutine coordij(lon, lat, ilon, jlat)
integer, save, private ije_u
real, save, private lon_max_g
!$Header!CDK comgeom COMMON comgeom alpha2p3
real, save, private lat_max_g
integer, save, private guide_plevs
!$Header!c!c!c include serre h!c REAL grossismy
real, save, private tau_min_p
!$Id mode_top_bound COMMON comconstr dtvr
real, save, private tau_max_p
real, dimension(:,:), allocatable, save, private ugui1
real, save, private tau_min_u
real, save, private tau_max_q
real, save, private lon_min_g
c c zjulian c cym CALL iim cym klev iim
logical, save, private ini_anal
!$Header!c!c!c include serre h!c REAL clat
real, dimension(:), allocatable, save, private bpnc
real, save, private tau_min_q
real, dimension(:), allocatable, save, private alpha_q
real, dimension(:), allocatable, save, private alpha_t
integer, save, private iguide_read
logical, save, private guide_v
subroutine guide_main(itau, ucov, vcov, teta, q, masse, ps)
real, dimension(:), allocatable, save, private apnc
!$Header!CDK comgeom COMMON comgeom cv
subroutine guide_interp(psi, teta)
real, dimension(:), allocatable, save, private psgui1
real, dimension(:,:,:), allocatable, save, private vnat2
integer, save, private jjn_v
subroutine waitrequest(a_Request)
real, dimension(:,:,:), allocatable, save, private unat2
!$Header!CDK comgeom COMMON comgeom airev
!$Header!CDK comgeom COMMON comgeom rlonv
integer, save, private ijn_u