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
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
69 include
"dimensions.h"
76 INTEGER :: error,ncidpl,rid,rcod
77 CHARACTER (len = 80) :: abort_message
78 CHARACTER (len = 20) :: modname =
'guide_init'
97 "zonal nudging requires grid regular in longitude", 1)
131 CALL getpar(
'tau_lat', 5.,
tau_lat,
'raideur lat guide regional ')
132 CALL getpar(
'tau_lon', 5.,
tau_lon,
'raideur lon guide regional ')
158 if (ncidpl.eq.-99)
then
159 rcod=nf90_open(
'apbp.nc',nf90_nowrite, ncidpl)
160 if (rcod.NE.nf_noerr)
THEN
162 'Guide: probleme -> pas de fichier apbp.nc',1)
167 if (ncidpl.eq.-99)
then
168 rcod=nf90_open(
'u.nc',nf90_nowrite,ncidpl)
169 if (rcod.NE.nf_noerr)
THEN
171 'Guide: probleme -> pas de fichier u.nc',1)
175 if (ncidpl.eq.-99)
then
176 rcod=nf90_open(
'v.nc',nf90_nowrite,ncidpl)
177 if (rcod.NE.nf_noerr)
THEN
179 'Guide: probleme -> pas de fichier v.nc',1)
183 if (ncidpl.eq.-99)
then
184 rcod=nf90_open(
'T.nc',nf90_nowrite,ncidpl)
185 if (rcod.NE.nf_noerr)
THEN
187 'Guide: probleme -> pas de fichier T.nc',1)
191 if (ncidpl.eq.-99)
then
192 rcod=nf90_open(
'hur.nc',nf90_nowrite, ncidpl)
193 if (rcod.NE.nf_noerr)
THEN
195 'Guide: probleme -> pas de fichier hur.nc',1)
200 error=nf_inq_dimid(ncidpl,
'LEVEL',rid)
201 IF (error.NE.nf_noerr) error=nf_inq_dimid(ncidpl,
'PRESSURE',rid)
202 IF (error.NE.nf_noerr)
THEN
203 CALL abort_gcm(modname,
'Guide: probleme lecture niveaux pression',1)
205 error=nf_inq_dimlen(ncidpl,rid,
nlevnc)
206 print *,
'Guide: nombre niveaux vert. nlevnc',
nlevnc
207 rcod = nf90_close(ncidpl)
212 abort_message=
'pb in allocation guide'
215 IF (error /= 0)
CALL abort_gcm(modname,abort_message,1)
217 IF (error /= 0)
CALL abort_gcm(modname,abort_message,1)
221 IF (error /= 0)
CALL abort_gcm(modname,abort_message,1)
223 IF (error /= 0)
CALL abort_gcm(modname,abort_message,1)
225 IF (error /= 0)
CALL abort_gcm(modname,abort_message,1)
227 IF (error /= 0)
CALL abort_gcm(modname,abort_message,1)
229 IF (error /= 0)
CALL abort_gcm(modname,abort_message,1)
231 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)
248 IF (error /= 0)
CALL abort_gcm(modname,abort_message,1)
250 IF (error /= 0)
CALL abort_gcm(modname,abort_message,1)
252 IF (error /= 0)
CALL abort_gcm(modname,abort_message,1)
254 IF (error /= 0)
CALL abort_gcm(modname,abort_message,1)
260 IF (error /= 0)
CALL abort_gcm(modname,abort_message,1)
262 IF (error /= 0)
CALL abort_gcm(modname,abort_message,1)
264 IF (error /= 0)
CALL abort_gcm(modname,abort_message,1)
266 IF (error /= 0)
CALL abort_gcm(modname,abort_message,1)
272 IF (error /= 0)
CALL abort_gcm(modname,abort_message,1)
274 IF (error /= 0)
CALL abort_gcm(modname,abort_message,1)
276 IF (error /= 0)
CALL abort_gcm(modname,abort_message,1)
278 IF (error /= 0)
CALL abort_gcm(modname,abort_message,1)
284 IF (error /= 0)
CALL abort_gcm(modname,abort_message,1)
286 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)
314 SUBROUTINE guide_main(itau,ucov,vcov,teta,q,masse,ps)
320 include
"dimensions.h"
326 INTEGER,
INTENT(IN) :: itau
327 REAL,
DIMENSION (ip1jmp1,llm),
INTENT(INOUT) :: ucov,teta,q,masse
328 REAL,
DIMENSION (ip1jm,llm),
INTENT(INOUT) :: vcov
329 REAL,
DIMENSION (ip1jmp1),
INTENT(INOUT) :: ps
332 LOGICAL,
SAVE :: first=.
true.
334 REAL,
DIMENSION (ip1jmp1,llm) :: f_add
335 REAL,
DIMENSION (ip1jmp1,llm) :: p
337 INTEGER,
SAVE :: step_rea,count_no_rea,itau_test
338 REAL :: ditau, dday_step
406 IF (reste.EQ.0.)
THEN
407 IF (itau_test.EQ.itau)
THEN
408 write(*,*)
'deuxieme passage de advreel a itau=',itau
418 print*,
'Lecture fichiers guidage, pas ',step_rea, &
419 'apres ',count_no_rea,
' non lectures'
428 count_no_rea=count_no_rea+1
516 vcov=vcov+f_add(1:
ip1jm,:)
527 INTEGER,
INTENT(IN) :: hsize
528 INTEGER,
INTENT(IN) :: vsize
529 REAL,
DIMENSION(hsize),
INTENT(IN) :: alpha
530 REAL,
DIMENSION(hsize,vsize),
INTENT(INOUT) :: field
546 include
"dimensions.h"
552 INTEGER,
INTENT(IN) :: typ
553 INTEGER,
INTENT(IN) :: vsize
554 INTEGER,
INTENT(IN) :: hsize
555 REAL,
DIMENSION(hsize*iip1,vsize),
INTENT(INOUT) :: field
558 LOGICAL,
SAVE :: first=.
true.
559 INTEGER,
DIMENSION (2),
SAVE :: imin, imax
561 REAL,
DIMENSION (iip1) :: lond
562 REAL,
DIMENSION (hsize,vsize):: fieldm
568 imin(1)=1;imax(1)=iip1;
569 imin(2)=1;imax(2)=iip1;
587 DO i=imin(typ),imax(typ)
589 fieldm(j,l)=fieldm(j,l)+field(ij,l)
592 fieldm(:,l)=fieldm(:,l)/
REAL(imax(typ)-imin(typ)+1)
597 field(ij,l)=fieldm(j,l)
611 include
"dimensions.h"
617 REAL,
DIMENSION (iip1,jjp1),
INTENT(IN) :: psi
618 REAL,
DIMENSION (iip1,jjp1,llm),
INTENT(IN) :: teta
620 LOGICAL,
SAVE :: first=.
true.
622 REAL,
DIMENSION (iip1,jjp1,nlevnc) :: plnc1,plnc2
623 REAL,
DIMENSION (iip1,jjp1,llm) :: plunc,plsnc
624 REAL,
DIMENSION (iip1,jjm,llm) :: plvnc
625 REAL,
DIMENSION (iip1,jjp1,llmp1) :: p
626 REAL,
DIMENSION (iip1,jjp1,llm) :: pls, pext
627 REAL,
DIMENSION (iip1,jjp1,llm) :: pbarx
628 REAL,
DIMENSION (iip1,jjm,llm) :: pbary
630 REAL,
DIMENSION (iip1,jjp1,llm) :: pk
631 REAL,
DIMENSION (iip1,jjp1) :: pks
632 REAL :: prefkap,unskap
634 REAL,
DIMENSION (ip1jmp1,llm) :: qsat
636 REAL,
DIMENSION (iip1,jjp1,llm) :: zu1,zu2
637 REAL,
DIMENSION (iip1,jjm,llm) :: zv1,zv2
641 print *,
'Guide: conversion variables guidage'
667 print*,
'Guide: verification ordre niveaux verticaux'
670 print*,
'PL(',l,
')=',(ap(l)+ap(l+1))/2. &
673 print*,
'Fichiers guidage'
675 print*,
'PL(',l,
')=',plnc2(1,1,l)
677 print *,
'inversion de l''ordre: invert_p=',
invert_p
680 print*,
'U(',l,
')=',
unat2(1,1,l)
685 print*,
'T(',l,
')=',
tnat2(1,1,l)
694 if (pressure_exner)
then
705 pls(i,j,l) =
preff * ( pk(i,j,l)/
cpp) ** unskap
714 pext(i,j,l)=pls(i,j,l)*
aire(i,j)
718 call massbar(pext, pbarx, pbary )
722 plunc(i,j,l)=pbarx(i,j,l)/
aireu(i,j)
723 plsnc(i,j,l)=pls(i,j,l)
730 plvnc(i,j,l)=pbary(i,j,l)/
airev(i,j)
781 tgui1(ij,l)=zu1(i,j,l)
782 tgui2(ij,l)=zu2(i,j,l)
787 tgui1(ij,l)=zu1(i,j,l)*
cpp/pk(i,j,l)
788 tgui2(ij,l)=zu2(i,j,l)*
cpp/pk(i,j,l)
805 CALL pres2lev(
vnat1,zv1,
nlevnc,
llm,plnc1(:,:jjm,:),plvnc,iip1,jjm,
invert_p)
806 CALL pres2lev(
vnat2,zv2,
nlevnc,
llm,plnc2(:,:jjm,:),plvnc,iip1,jjm,
invert_p)
830 qgui1(ij,l)=zu1(i,j,l)
831 qgui2(ij,l)=zu2(i,j,l)
853 SUBROUTINE tau2alpha(typ,pim,pjm,factt,taumin,taumax,alpha)
859 include
"dimensions.h"
866 INTEGER,
INTENT(IN) :: typ
867 INTEGER,
INTENT(IN) :: pim,pjm
868 REAL,
INTENT(IN) :: factt
869 REAL,
INTENT(IN) :: taumin,taumax
871 REAL,
DIMENSION(pim,pjm),
INTENT(OUT) :: alpha
874 LOGICAL,
SAVE :: first=.
true.
875 REAL,
SAVE :: gamma,dxdy_min,dxdy_max
876 REAL,
DIMENSION (iip1,jjp1) :: zdx,zdy
877 REAL,
DIMENSION (iip1,jjp1) :: dxdys,dxdyu
878 REAL,
DIMENSION (iip1,jjm) :: dxdyv
881 real alphamin,alphamax,xi
882 integer i,j,ilon,ilat
885 alphamin=factt/taumax
886 alphamax=factt/taumin
898 elseif (typ.eq.1)
then
901 elseif (typ.eq.3)
then
905 alpha(i,j)=alphamax/16.* &
920 zdx(i,j)=0.5*(
cu(i-1,j)+
cu(i,j))/cos(
rlatu(j))
926 zdy(i,j)=0.5*(
cv(i,j-1)+
cv(i,j))
931 zdx(i,
jjp1)=zdx(i,jjm)
933 zdy(i,
jjp1)=zdy(i,jjm)
937 dxdys(i,j)=sqrt(zdx(i,j)*zdx(i,j)+zdy(i,j)*zdy(i,j))
943 dxdyu(i,j)=0.5*(dxdys(i,j)+dxdys(i+1,j))
945 dxdyu(iip1,j)=dxdyu(1,j)
951 dxdyv(i,j)=0.5*(dxdys(i,j)+dxdys(i,j+1))
961 dxdy_min=dxdys(ilon,ilat)
966 dxdy_max=max(dxdy_max,dxdys(i,j))
971 print*,
'ATTENTION modele peu zoome'
972 print*,
'ATTENTION on prend une constante de guidage cste'
975 gamma=(dxdy_max-2.*dxdy_min)/(dxdy_max-dxdy_min)
976 print*,
'gamma=',gamma
977 if (gamma.lt.1.e-5)
then
978 print*,
'gamma =',gamma,
'<1e-5'
981 gamma=log(0.5)/log(gamma)
985 print*,
'gamma=',gamma
994 elseif (typ.eq.2)
then
997 elseif (typ.eq.3)
then
1005 xi=((dxdy_max-dxdy_)/(dxdy_max-dxdy_min))**gamma
1008 alpha(i,j)=xi*alphamin+(1.-xi)*alphamax
1017 if (.not.
guide_add) alpha = 1. - exp(- alpha)
1026 #include "netcdf.inc"
1027 #include "dimensions.h"
1028 #include "paramet.h"
1030 INTEGER,
INTENT(IN) :: timestep
1032 LOGICAL,
SAVE :: first=.
true.
1034 INTEGER,
SAVE :: ncidu,varidu,ncidv,varidv,ncidQ
1035 INTEGER,
SAVE :: varidQ,ncidt,varidt,ncidps,varidps
1036 INTEGER :: ncidpl,varidpl,varidap,varidbp
1038 INTEGER,
DIMENSION(4) :: start,count
1039 INTEGER :: status,rcode
1041 CHARACTER (len = 80) :: abort_message
1042 CHARACTER (len = 20) :: modname =
'guide_read'
1048 print*,
'Guide: ouverture des fichiers guidage '
1051 print *,
'Lecture du guidage sur niveaux modele'
1052 rcode = nf90_open(
'apbp.nc', nf90_nowrite, ncidpl)
1053 IF (rcode.NE.nf_noerr)
THEN
1054 print *,
'Guide: probleme -> pas de fichier apbp.nc'
1057 rcode = nf90_inq_varid(ncidpl,
'AP', varidap)
1058 IF (rcode.NE.nf_noerr)
THEN
1059 print *,
'Guide: probleme -> pas de variable AP, fichier apbp.nc'
1062 rcode = nf90_inq_varid(ncidpl,
'BP', varidbp)
1063 IF (rcode.NE.nf_noerr)
THEN
1064 print *,
'Guide: probleme -> pas de variable BP, fichier apbp.nc'
1067 print*,
'ncidpl,varidap',ncidpl,varidap
1071 rcode = nf90_open(
'u.nc', nf90_nowrite, ncidu)
1072 IF (rcode.NE.nf_noerr)
THEN
1073 print *,
'Guide: probleme -> pas de fichier u.nc'
1076 rcode = nf90_inq_varid(ncidu,
'UWND', varidu)
1077 IF (rcode.NE.nf_noerr)
THEN
1078 print *,
'Guide: probleme -> pas de variable UWND, fichier u.nc'
1081 print*,
'ncidu,varidu',ncidu,varidu
1082 if (ncidpl.eq.-99) ncidpl=ncidu
1086 rcode = nf90_open(
'v.nc', nf90_nowrite, ncidv)
1087 IF (rcode.NE.nf_noerr)
THEN
1088 print *,
'Guide: probleme -> pas de fichier v.nc'
1091 rcode = nf90_inq_varid(ncidv,
'VWND', varidv)
1092 IF (rcode.NE.nf_noerr)
THEN
1093 print *,
'Guide: probleme -> pas de variable VWND, fichier v.nc'
1096 print*,
'ncidv,varidv',ncidv,varidv
1097 if (ncidpl.eq.-99) ncidpl=ncidv
1101 rcode = nf90_open(
'T.nc', nf90_nowrite, ncidt)
1102 IF (rcode.NE.nf_noerr)
THEN
1103 print *,
'Guide: probleme -> pas de fichier T.nc'
1106 rcode = nf90_inq_varid(ncidt,
'AIR', varidt)
1107 IF (rcode.NE.nf_noerr)
THEN
1108 print *,
'Guide: probleme -> pas de variable AIR, fichier T.nc'
1111 print*,
'ncidT,varidT',ncidt,varidt
1112 if (ncidpl.eq.-99) ncidpl=ncidt
1116 rcode = nf90_open(
'hur.nc', nf90_nowrite, ncidq)
1117 IF (rcode.NE.nf_noerr)
THEN
1118 print *,
'Guide: probleme -> pas de fichier hur.nc'
1121 rcode = nf90_inq_varid(ncidq,
'RH', varidq)
1122 IF (rcode.NE.nf_noerr)
THEN
1123 print *,
'Guide: probleme -> pas de variable RH, fichier hur.nc'
1126 print*,
'ncidQ,varidQ',ncidq,varidq
1127 if (ncidpl.eq.-99) ncidpl=ncidq
1131 rcode = nf90_open(
'ps.nc', nf90_nowrite, ncidps)
1132 IF (rcode.NE.nf_noerr)
THEN
1133 print *,
'Guide: probleme -> pas de fichier ps.nc'
1136 rcode = nf90_inq_varid(ncidps,
'SP', varidps)
1137 IF (rcode.NE.nf_noerr)
THEN
1138 print *,
'Guide: probleme -> pas de variable SP, fichier ps.nc'
1141 print*,
'ncidps,varidps',ncidps,varidps
1145 rcode = nf90_inq_varid(ncidpl,
'LEVEL', varidpl)
1146 IF (rcode.NE.0) rcode = nf90_inq_varid(ncidpl,
'PRESSURE', varidpl)
1147 print*,
'ncidpl,varidpl',ncidpl,varidpl
1152 status=nf_get_vara_double(ncidpl,varidap,1,
nlevnc,
apnc)
1153 status=nf_get_vara_double(ncidpl,varidbp,1,
nlevnc,
bpnc)
1155 status=nf_get_vara_real(ncidpl,varidap,1,
nlevnc,
apnc)
1156 status=nf_get_vara_real(ncidpl,varidbp,1,
nlevnc,
bpnc)
1160 status=nf_get_vara_double(ncidpl,varidpl,1,
nlevnc,
apnc)
1162 status=nf_get_vara_real(ncidpl,varidpl,1,
nlevnc,
apnc)
1188 status=nf_get_vara_double(ncidu,varidu,start,count,
unat2)
1190 status=nf_get_vara_real(ncidu,varidu,start,count,
unat2)
1200 status=nf_get_vara_double(ncidt,varidt,start,count,
tnat2)
1202 status=nf_get_vara_real(ncidt,varidt,start,count,
tnat2)
1212 status=nf_get_vara_double(ncidq,varidq,start,count,
qnat2)
1214 status=nf_get_vara_real(ncidq,varidq,start,count,
qnat2)
1226 status=nf_get_vara_double(ncidv,varidv,start,count,
vnat2)
1228 status=nf_get_vara_real(ncidv,varidv,start,count,
vnat2)
1243 status=nf_get_vara_double(ncidps,varidps,start,count,
psnat2)
1245 status=nf_get_vara_real(ncidps,varidps,start,count,
psnat2)
1259 #include "netcdf.inc"
1260 #include "dimensions.h"
1261 #include "paramet.h"
1263 INTEGER,
INTENT(IN) :: timestep
1265 LOGICAL,
SAVE :: first=.
true.
1267 INTEGER,
SAVE :: ncidu,varidu,ncidv,varidv,ncidQ
1268 INTEGER,
SAVE :: varidQ,ncidt,varidt,ncidps,varidps
1269 INTEGER :: ncidpl,varidpl,varidap,varidbp
1271 INTEGER,
DIMENSION(4) :: start,count
1272 INTEGER :: status,rcode
1274 REAL,
DIMENSION (jjp1,llm) :: zu
1275 REAL,
DIMENSION (jjm,llm) :: zv
1278 CHARACTER (len = 80) :: abort_message
1279 CHARACTER (len = 20) :: modname =
'guide_read2D'
1285 print*,
'Guide: ouverture des fichiers guidage '
1288 print *,
'Lecture du guidage sur niveaux modele'
1289 rcode = nf90_open(
'apbp.nc', nf90_nowrite, ncidpl)
1290 IF (rcode.NE.nf_noerr)
THEN
1291 print *,
'Guide: probleme -> pas de fichier apbp.nc'
1294 rcode = nf90_inq_varid(ncidpl,
'AP', varidap)
1295 IF (rcode.NE.nf_noerr)
THEN
1296 print *,
'Guide: probleme -> pas de variable AP, fichier apbp.nc'
1299 rcode = nf90_inq_varid(ncidpl,
'BP', varidbp)
1300 IF (rcode.NE.nf_noerr)
THEN
1301 print *,
'Guide: probleme -> pas de variable BP, fichier apbp.nc'
1304 print*,
'ncidpl,varidap',ncidpl,varidap
1308 rcode = nf90_open(
'u.nc', nf90_nowrite, ncidu)
1309 IF (rcode.NE.nf_noerr)
THEN
1310 print *,
'Guide: probleme -> pas de fichier u.nc'
1313 rcode = nf90_inq_varid(ncidu,
'UWND', varidu)
1314 IF (rcode.NE.nf_noerr)
THEN
1315 print *,
'Guide: probleme -> pas de variable UWND, fichier u.nc'
1318 print*,
'ncidu,varidu',ncidu,varidu
1319 if (ncidpl.eq.-99) ncidpl=ncidu
1323 rcode = nf90_open(
'v.nc', nf90_nowrite, ncidv)
1324 IF (rcode.NE.nf_noerr)
THEN
1325 print *,
'Guide: probleme -> pas de fichier v.nc'
1328 rcode = nf90_inq_varid(ncidv,
'VWND', varidv)
1329 IF (rcode.NE.nf_noerr)
THEN
1330 print *,
'Guide: probleme -> pas de variable VWND, fichier v.nc'
1333 print*,
'ncidv,varidv',ncidv,varidv
1334 if (ncidpl.eq.-99) ncidpl=ncidv
1338 rcode = nf90_open(
'T.nc', nf90_nowrite, ncidt)
1339 IF (rcode.NE.nf_noerr)
THEN
1340 print *,
'Guide: probleme -> pas de fichier T.nc'
1343 rcode = nf90_inq_varid(ncidt,
'AIR', varidt)
1344 IF (rcode.NE.nf_noerr)
THEN
1345 print *,
'Guide: probleme -> pas de variable AIR, fichier T.nc'
1348 print*,
'ncidT,varidT',ncidt,varidt
1349 if (ncidpl.eq.-99) ncidpl=ncidt
1353 rcode = nf90_open(
'hur.nc', nf90_nowrite, ncidq)
1354 IF (rcode.NE.nf_noerr)
THEN
1355 print *,
'Guide: probleme -> pas de fichier hur.nc'
1358 rcode = nf90_inq_varid(ncidq,
'RH', varidq)
1359 IF (rcode.NE.nf_noerr)
THEN
1360 print *,
'Guide: probleme -> pas de variable RH, fichier hur.nc'
1363 print*,
'ncidQ,varidQ',ncidq,varidq
1364 if (ncidpl.eq.-99) ncidpl=ncidq
1368 rcode = nf90_open(
'ps.nc', nf90_nowrite, ncidps)
1369 IF (rcode.NE.nf_noerr)
THEN
1370 print *,
'Guide: probleme -> pas de fichier ps.nc'
1373 rcode = nf90_inq_varid(ncidps,
'SP', varidps)
1374 IF (rcode.NE.nf_noerr)
THEN
1375 print *,
'Guide: probleme -> pas de variable SP, fichier ps.nc'
1378 print*,
'ncidps,varidps',ncidps,varidps
1382 rcode = nf90_inq_varid(ncidpl,
'LEVEL', varidpl)
1383 IF (rcode.NE.0) rcode = nf90_inq_varid(ncidpl,
'PRESSURE', varidpl)
1384 print*,
'ncidpl,varidpl',ncidpl,varidpl
1389 status=nf_get_vara_double(ncidpl,varidap,1,
nlevnc,
apnc)
1390 status=nf_get_vara_double(ncidpl,varidbp,1,
nlevnc,
bpnc)
1392 status=nf_get_vara_real(ncidpl,varidap,1,
nlevnc,
apnc)
1393 status=nf_get_vara_real(ncidpl,varidbp,1,
nlevnc,
bpnc)
1397 status=nf_get_vara_double(ncidpl,varidpl,1,
nlevnc,
apnc)
1399 status=nf_get_vara_real(ncidpl,varidpl,1,
nlevnc,
apnc)
1425 status=nf_get_vara_double(ncidu,varidu,start,count,zu)
1427 status=nf_get_vara_real(ncidu,varidu,start,count,zu)
1430 unat2(i,:,:)=zu(:,:)
1442 status=nf_get_vara_double(ncidt,varidt,start,count,zu)
1444 status=nf_get_vara_real(ncidt,varidt,start,count,zu)
1447 tnat2(i,:,:)=zu(:,:)
1459 status=nf_get_vara_double(ncidq,varidq,start,count,zu)
1461 status=nf_get_vara_real(ncidq,varidq,start,count,zu)
1464 qnat2(i,:,:)=zu(:,:)
1477 status=nf_get_vara_double(ncidv,varidv,start,count,zv)
1479 status=nf_get_vara_real(ncidv,varidv,start,count,zv)
1482 vnat2(i,:,:)=zv(:,:)
1499 status=nf_get_vara_double(ncidps,varidps,start,count,zu(:,1))
1501 status=nf_get_vara_real(ncidps,varidps,start,count,zu(:,1))
1516 SUBROUTINE guide_out(varname,hsize,vsize,field)
1520 include
"dimensions.h"
1522 include
"netcdf.inc"
1523 include
"comgeom2.h"
1524 include
"comconst.h"
1528 CHARACTER*(*),
INTENT(IN) :: varname
1529 INTEGER,
INTENT (IN) :: hsize,vsize
1530 REAL,
DIMENSION (iip1,hsize,vsize),
INTENT(IN) :: field
1533 INTEGER,
SAVE :: timestep=0
1535 INTEGER :: nid, id_lonu, id_lonv, id_latu, id_latv, id_tim, id_lev
1536 INTEGER :: vid_lonu,vid_lonv,vid_latu,vid_latv,vid_cu,vid_cv,vid_lev
1537 INTEGER :: vid_au,vid_av
1538 INTEGER,
DIMENSION (3) :: dim3
1539 INTEGER,
DIMENSION (4) :: dim4,count,start
1540 INTEGER :: ierr, varid,l
1541 REAL,
DIMENSION (iip1,hsize,vsize) :: field2
1543 print *,
'Guide: output timestep',timestep,
'var ',varname
1544 IF (timestep.EQ.0)
THEN
1549 ierr=nf_create(
"guide_ins.nc",nf_clobber,nid)
1551 ierr=nf_def_dim(nid,
"LONU",iip1,id_lonu)
1552 ierr=nf_def_dim(nid,
"LONV",iip1,id_lonv)
1553 ierr=nf_def_dim(nid,
"LATU",
jjp1,id_latu)
1554 ierr=nf_def_dim(nid,
"LATV",jjm,id_latv)
1555 ierr=nf_def_dim(nid,
"LEVEL",
llm,id_lev)
1556 ierr=nf_def_dim(nid,
"TIME",nf_unlimited,id_tim)
1559 ierr=nf_def_var(nid,
"LONU",nf_float,1,id_lonu,vid_lonu)
1560 ierr=nf_def_var(nid,
"LONV",nf_float,1,id_lonv,vid_lonv)
1561 ierr=nf_def_var(nid,
"LATU",nf_float,1,id_latu,vid_latu)
1562 ierr=nf_def_var(nid,
"LATV",nf_float,1,id_latv,vid_latv)
1563 ierr=nf_def_var(nid,
"LEVEL",nf_float,1,id_lev,vid_lev)
1564 ierr=nf_def_var(nid,
"cu",nf_float,2,(/id_lonu,id_latu/),vid_cu)
1565 ierr=nf_def_var(nid,
"au",nf_float,2,(/id_lonu,id_latu/),vid_au)
1566 ierr=nf_def_var(nid,
"cv",nf_float,2,(/id_lonv,id_latv/),vid_cv)
1567 ierr=nf_def_var(nid,
"av",nf_float,2,(/id_lonv,id_latv/),vid_av)
1573 ierr = nf_put_var_double(nid,vid_lonu,
rlonu*180./
pi)
1574 ierr = nf_put_var_double(nid,vid_lonv,
rlonv*180./
pi)
1575 ierr = nf_put_var_double(nid,vid_latu,
rlatu*180./
pi)
1576 ierr = nf_put_var_double(nid,vid_latv,
rlatv*180./
pi)
1577 ierr = nf_put_var_double(nid,vid_lev,
presnivs)
1578 ierr = nf_put_var_double(nid,vid_cu,
cu)
1579 ierr = nf_put_var_double(nid,vid_cv,
cv)
1580 ierr = nf_put_var_double(nid,vid_au,
alpha_u)
1581 ierr = nf_put_var_double(nid,vid_av,
alpha_v)
1583 ierr = nf_put_var_real(nid,vid_lonu,
rlonu*180./
pi)
1584 ierr = nf_put_var_real(nid,vid_lonv,
rlonv*180./
pi)
1585 ierr = nf_put_var_real(nid,vid_latu,
rlatu*180./
pi)
1586 ierr = nf_put_var_real(nid,vid_latv,
rlatv*180./
pi)
1587 ierr = nf_put_var_real(nid,vid_lev,
presnivs)
1588 ierr = nf_put_var_real(nid,vid_cu,
cu)
1589 ierr = nf_put_var_real(nid,vid_cv,
cv)
1590 ierr = nf_put_var_real(nid,vid_au,
alpha_u)
1591 ierr = nf_put_var_real(nid,vid_av,
alpha_v)
1596 ierr = nf_redef(nid)
1598 dim3=(/id_lonv,id_latu,id_tim/)
1599 ierr = nf_def_var(nid,
"SP",nf_float,3,dim3,varid)
1602 dim3=(/id_lonv,id_latu,id_tim/)
1603 ierr = nf_def_var(nid,
"ps",nf_float,3,dim3,varid)
1607 dim4=(/id_lonu,id_latu,id_lev,id_tim/)
1608 ierr = nf_def_var(nid,
"u",nf_float,4,dim4,varid)
1609 ierr = nf_def_var(nid,
"ua",nf_float,4,dim4,varid)
1610 ierr = nf_def_var(nid,
"ucov",nf_float,4,dim4,varid)
1614 dim4=(/id_lonv,id_latv,id_lev,id_tim/)
1615 ierr = nf_def_var(nid,
"v",nf_float,4,dim4,varid)
1616 ierr = nf_def_var(nid,
"va",nf_float,4,dim4,varid)
1617 ierr = nf_def_var(nid,
"vcov",nf_float,4,dim4,varid)
1621 dim4=(/id_lonv,id_latu,id_lev,id_tim/)
1622 ierr = nf_def_var(nid,
"teta",nf_float,4,dim4,varid)
1626 dim4=(/id_lonv,id_latu,id_lev,id_tim/)
1627 ierr = nf_def_var(nid,
"q",nf_float,4,dim4,varid)
1630 ierr = nf_enddef(nid)
1631 ierr = nf_close(nid)
1637 ierr=nf_open(
"guide_ins.nc",nf_write,nid)
1639 IF (varname==
"SP") timestep=timestep+1
1641 ierr = nf_inq_varid(nid,varname,varid)
1642 SELECT CASE (varname)
1644 start=(/1,1,timestep,0/)
1645 count=(/iip1,
jjp1,1,0/)
1646 CASE (
"v",
"va",
"vcov")
1647 start=(/1,1,1,timestep/)
1648 count=(/iip1,jjm,
llm,1/)
1650 start=(/1,1,1,timestep/)
1654 SELECT CASE (varname)
1656 DO l=1,
llm ; field2(:,2:jjm,l)=field(:,2:jjm,l)/
cu(:,2:jjm) ;
ENDDO
1657 field2(:,1,:)=0. ; field2(:,
jjp1,:)=0.
1659 DO l=1,
llm ; field2(:,:,l)=field(:,:,l)/
cv(:,:) ;
ENDDO
1666 ierr = nf_put_vara_double(nid,varid,start,count,field2)
1668 ierr = nf_put_vara_real(nid,varid,start,count,field2)
1671 ierr = nf_close(nid)
1685 if(abs(x(i,l)).gt.1.e10)
then
1686 zz=0.5*(x(i-1,l)+x(i+1,l))
1687 print*,
'correction ',i,l,x(i,l),zz
real, dimension(:,:,:), allocatable, save, private unat2
!$Header llmm1 INTEGER ip1jmp1
real, dimension(:,:,:), allocatable, save, private unat1
real, save, private lat_max_g
!$Header!c!c!c include serre h!c REAL && grossismx
subroutine guide_addfield(hsize, vsize, field, alpha)
real, dimension(:,:), allocatable, save, private tgui2
real, dimension(:,:,:), allocatable, save, private vnat2
subroutine pres2lev(varo, varn, lmo, lmn, po, pn, ni, nj, ok_invertp)
subroutine guide_main(itau, ucov, vcov, teta, q, masse, ps)
real, save, private lat_min_g
!$Id mode_top_bound COMMON comconstr kappa
real, dimension(:,:), allocatable, save, private ugui1
real, dimension(:,:), allocatable, save, private tgui1
subroutine exner_hyb(ngrid, ps, p, pks, pk, pkf)
real, save, private tau_lat
logical, save, private ini_anal
!$Header!c!c!c include serre h!c REAL clon
subroutine invert_lat(xsize, ysize, vsize, field)
real, dimension(:,:,:), allocatable, save, private tnat1
subroutine exner_milieu(ngrid, ps, p, pks, pk, pkf)
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
real, save, private tau_min_v
logical, save, private invert_p
!$Id mode_top_bound COMMON comconstr && pi
!$Header!CDK comgeom COMMON comgeom aire
subroutine ini_getparam(fichier)
!$Header!CDK comgeom COMMON comgeom rlatu
logical, save, private invert_y
logical, save, private guide_hr
real, save, private tau_lon
real, save, private lon_max_g
real, dimension(:), allocatable, save, private alpha_q
real, save, private tau_max_t
subroutine tau2alpha(typ, pim, pjm, factt, taumin, taumax, alpha)
subroutine guide_read2d(timestep)
!$Header llmm1 INTEGER ip1jm
subroutine pression(ngrid, ap, bp, ps, p)
subroutine massbar(masse, massebx, masseby)
!$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
real, save, private tau_max_p
real, dimension(:), allocatable, save, private alpha_v
subroutine q_sat(np, temp, pres, qsat)
real, dimension(:), allocatable, save, private alpha_pcor
real, save, private tau_max_v
!$Header!CDK comgeom COMMON comgeom aireu
logical, save, private guide_sav
logical, save, private guide_u
logical, save, private guide_bl
real, dimension(:), allocatable, save, private bpnc
!$Id mode_top_bound COMMON comconstr cpp
real, dimension(:,:), allocatable, save, private psnat2
integer, save, private iguide_read
logical, save, private gamma4
real, save, private tau_min_p
real, dimension(:), allocatable, save, private alpha_p
subroutine guide_read(timestep)
logical, save, private guide_2d
!$Id mode_top_bound COMMON comconstr daysec
real, dimension(:), allocatable, save, private psgui2
!$Header!CDK comgeom COMMON comgeom rlonu
!$Header!CDK comgeom COMMON comgeom rlatv
real, dimension(:), allocatable, save, private alpha_u
real, save, private tau_min_q
real, dimension(:,:), allocatable, save, private ugui2
logical, save, private guide_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
real, dimension(:,:,:), allocatable, save, private tnat2
!$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
subroutine coordij(lon, lat, ilon, jlat)
real, save, private tau_min_t
logical, save, private guide_zon
logical, save, private guide_add
!$Header!c!c!c include serre h!c REAL grossismy
subroutine guide_interp(psi, teta)
real, dimension(:,:), allocatable, save, private vgui1
real, save, private tau_max_u
logical, save, private guide_t
!$Id mode_top_bound COMMON comconstr dtvr
real, dimension(:), allocatable, save, private alpha_t
real, dimension(:,:,:), allocatable, save, private vnat1
real, dimension(:,:,:), allocatable, save, private qnat2
real, dimension(:,:), allocatable, save, private vgui2
c c zjulian c cym CALL iim cym klev iim
real, save, private tau_min_u
logical, save, private guide_q
real, save, private lon_min_g
!$Header!c!c!c include serre h!c REAL clat
real, dimension(:,:,:), allocatable, save, private qnat1
real, dimension(:), allocatable, save, private apnc
real, dimension(:,:), allocatable, save, private psnat1
subroutine massdair(p, masse)
real, dimension(:), allocatable, save, private psgui1
!$Header!CDK comgeom COMMON comgeom cv
logical, save, private guide_teta
subroutine guide_out(varname, hsize, vsize, field)
logical, save, private guide_modele
real, dimension(:,:), allocatable, save, private qgui1
real, save, private tau_max_q
logical, save, private guide_reg
integer, save, private iguide_int
subroutine guide_zonave(typ, hsize, vsize, field)
integer, save, private nlevnc
logical, save, private guide_p
real, dimension(:,:), allocatable, save, private qgui2
subroutine correctbid(iim, nl, x)
integer, save, private iguide_sav
!$Header!CDK comgeom COMMON comgeom airev
!$Header!CDK comgeom COMMON comgeom rlonv