13 use netcdf
, only: nf90_nowrite, nf90_open, nf90_inq_varid, nf90_close
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
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
75 include
"dimensions.h"
82 INTEGER :: error,ncidpl,rid,rcod
83 CHARACTER (len = 80) :: abort_message
84 CHARACTER (len = 20) :: modname =
'guide_init'
103 "zonal nudging requires grid regular in longitude", 1)
137 CALL getpar(
'tau_lat', 5.,
tau_lat,
'raideur lat guide regional ')
138 CALL getpar(
'tau_lon', 5.,
tau_lon,
'raideur lon guide regional ')
170 if (ncidpl.eq.-99)
then
171 rcod=nf90_open(
'apbp.nc',nf90_nowrite, ncidpl)
172 if (rcod.NE.nf_noerr)
THEN
173 print *,
'Guide: probleme -> pas de fichier apbp.nc'
178 if (ncidpl.EQ.-99)
then
179 rcod=nf90_open(
'P.nc',nf90_nowrite,ncidpl)
180 if (rcod.NE.nf_noerr)
THEN
181 print *,
'Guide: probleme -> pas de fichier P.nc'
186 if (ncidpl.eq.-99)
then
187 rcod=nf90_open(
'u.nc',nf90_nowrite,ncidpl)
188 if (rcod.NE.nf_noerr)
THEN
189 print *,
'Guide: probleme -> pas de fichier u.nc'
194 if (ncidpl.eq.-99)
then
195 rcod=nf90_open(
'v.nc',nf90_nowrite,ncidpl)
196 if (rcod.NE.nf_noerr)
THEN
197 print *,
'Guide: probleme -> pas de fichier v.nc'
202 if (ncidpl.eq.-99)
then
203 rcod=nf90_open(
'T.nc',nf90_nowrite,ncidpl)
204 if (rcod.NE.nf_noerr)
THEN
205 print *,
'Guide: probleme -> pas de fichier T.nc'
210 if (ncidpl.eq.-99)
then
211 rcod=nf90_open(
'hur.nc',nf90_nowrite, ncidpl)
212 if (rcod.NE.nf_noerr)
THEN
213 print *,
'Guide: probleme -> pas de fichier hur.nc'
218 error=nf_inq_dimid(ncidpl,
'LEVEL',rid)
219 IF (error.NE.nf_noerr) error=nf_inq_dimid(ncidpl,
'PRESSURE',rid)
220 IF (error.NE.nf_noerr)
THEN
221 print *,
'Guide: probleme lecture niveaux pression'
224 error=nf_inq_dimlen(ncidpl,rid,
nlevnc)
225 print *,
'Guide: nombre niveaux vert. nlevnc',
nlevnc
226 rcod = nf90_close(ncidpl)
231 abort_message=
'pb in allocation guide'
234 IF (error /= 0)
CALL abort_gcm(modname,abort_message,1)
236 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)
248 IF (error /= 0)
CALL abort_gcm(modname,abort_message,1)
250 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)
259 IF (error /= 0)
CALL abort_gcm(modname,abort_message,1)
261 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)
271 IF (error /= 0)
CALL abort_gcm(modname,abort_message,1)
273 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)
283 IF (error /= 0)
CALL abort_gcm(modname,abort_message,1)
285 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)
295 IF (error /= 0)
CALL abort_gcm(modname,abort_message,1)
297 IF (error /= 0)
CALL abort_gcm(modname,abort_message,1)
303 IF (error /= 0)
CALL abort_gcm(modname,abort_message,1)
305 IF (error /= 0)
CALL abort_gcm(modname,abort_message,1)
311 IF (error /= 0)
CALL abort_gcm(modname,abort_message,1)
313 IF (error /= 0)
CALL abort_gcm(modname,abort_message,1)
318 IF (error /= 0)
CALL abort_gcm(modname,abort_message,1)
320 IF (error /= 0)
CALL abort_gcm(modname,abort_message,1)
342 SUBROUTINE guide_main(itau,ucov,vcov,teta,q,masse,ps)
351 include
"dimensions.h"
357 INTEGER,
INTENT(IN) :: itau
358 REAL,
DIMENSION (ijb_u:ije_u,llm),
INTENT(INOUT) :: ucov,teta,q,masse
359 REAL,
DIMENSION (ijb_v:ije_v,llm),
INTENT(INOUT) :: vcov
360 REAL,
DIMENSION (ijb_u:ije_u),
INTENT(INOUT) :: ps
363 LOGICAL,
SAVE :: first=.
true.
366 REAL,
ALLOCATABLE,
SAVE,
DIMENSION (:,:) :: f_addu
367 REAL,
ALLOCATABLE,
SAVE,
DIMENSION (:,:) :: f_addv
369 REAL,
ALLOCATABLE,
SAVE,
DIMENSION (:,:,:) :: pk
370 REAL,
ALLOCATABLE,
SAVE,
DIMENSION (:,:) :: pks
372 REAL,
ALLOCATABLE,
SAVE,
DIMENSION (:,:) :: p
374 INTEGER,
SAVE :: step_rea,count_no_rea,itau_test
376 REAL :: ditau, dday_step
382 INTEGER,
EXTERNAL :: OMP_GET_THREAD_NUM
478 IF (reste.EQ.0.)
THEN
479 IF (itau_test.EQ.itau)
THEN
480 write(*,*)
'deuxieme passage de advreel a itau=',itau
494 print*,
'Lecture fichiers guidage, pas ',step_rea, &
495 'apres ',count_no_rea,
' non lectures'
510 count_no_rea=count_no_rea+1
545 if (pressure_exner)
then
558 p(i+(j-1)*iip1,l) =
preff * ( pk(i,j,l)/
cpp) ** unskap
690 IF (f_out)
CALL guide_out(
"vcov",jjm,
llm,f_addv(:,:)/factt,factt)
705 include
"dimensions.h"
709 INTEGER,
INTENT(IN) :: vsize
710 REAL,
DIMENSION(ijb_u:ije_u),
INTENT(IN) :: alpha
711 REAL,
DIMENSION(ijb_u:ije_u,vsize),
INTENT(INOUT) :: field
728 include
"dimensions.h"
732 INTEGER,
INTENT(IN) :: vsize
733 REAL,
DIMENSION(ijb_v:ije_v),
INTENT(IN) :: alpha
734 REAL,
DIMENSION(ijb_v:ije_v,vsize),
INTENT(INOUT) :: field
752 include
"dimensions.h"
758 INTEGER,
INTENT(IN) :: typ
759 INTEGER,
INTENT(IN) :: vsize
760 REAL,
DIMENSION(ijb_u:ije_u,vsize),
INTENT(INOUT) :: field
763 LOGICAL,
SAVE :: first=.
true.
766 INTEGER,
DIMENSION (2),
SAVE :: imin, imax
769 REAL,
DIMENSION (iip1) :: lond
770 REAL,
DIMENSION (jjb_u:jje_u,vsize):: fieldm
776 imin(1)=1;imax(1)=iip1;
777 imin(2)=1;imax(2)=iip1;
801 DO i=imin(typ),imax(typ)
803 fieldm(j,l)=fieldm(j,l)+field(ij,l)
806 fieldm(:,l)=fieldm(:,l)/
REAL(imax(typ)-imin(typ)+1)
811 field(ij,l)=fieldm(j,l)
823 include
"dimensions.h"
829 INTEGER,
INTENT(IN) :: typ
830 INTEGER,
INTENT(IN) :: vsize
831 INTEGER,
INTENT(IN) :: hsize
832 REAL,
DIMENSION(ijb_v:ije_v,vsize),
INTENT(INOUT) :: field
835 LOGICAL,
SAVE :: first=.
true.
837 INTEGER,
DIMENSION (2),
SAVE :: imin, imax
840 REAL,
DIMENSION (iip1) :: lond
841 REAL,
DIMENSION (jjb_v:jjev,vsize):: fieldm
847 imin(1)=1;imax(1)=iip1;
848 imin(2)=1;imax(2)=iip1;
867 DO i=imin(typ),imax(typ)
869 fieldm(j,l)=fieldm(j,l)+field(ij,l)
872 fieldm(:,l)=fieldm(:,l)/
REAL(imax(typ)-imin(typ)+1)
877 field(ij,l)=fieldm(j,l)
894 include
"dimensions.h"
900 REAL,
DIMENSION (iip1,jjb_u:jje_u),
INTENT(IN) :: psi
901 REAL,
DIMENSION (iip1,jjb_u:jje_u,llm),
INTENT(IN) :: teta
903 LOGICAL,
SAVE :: first=.
true.
906 REAL,
ALLOCATABLE,
SAVE,
DIMENSION (:,:,:) :: plnc1,plnc2
907 REAL,
ALLOCATABLE,
SAVE,
DIMENSION (:,:,:) :: plunc,plsnc
908 REAL,
ALLOCATABLE,
SAVE,
DIMENSION (:,:,:) :: plvnc
909 REAL,
ALLOCATABLE,
SAVE,
DIMENSION (:,:,:) :: p
910 REAL,
ALLOCATABLE,
SAVE,
DIMENSION (:,:,:) :: pls, pext
911 REAL,
ALLOCATABLE,
SAVE,
DIMENSION (:,:,:) :: pbarx
912 REAL,
ALLOCATABLE,
SAVE,
DIMENSION (:,:,:) :: pbary
914 REAL,
ALLOCATABLE,
SAVE,
DIMENSION (:,:,:) :: pk
915 REAL ,
ALLOCATABLE,
SAVE,
DIMENSION (:,:) :: pks
918 REAL,
ALLOCATABLE,
SAVE,
DIMENSION (:,:) :: qsat
920 REAL,
ALLOCATABLE,
SAVE,
DIMENSION (:,:,:) :: zu1,zu2
921 REAL,
ALLOCATABLE,
SAVE,
DIMENSION (:,:,:) :: zv1,zv2
926 print *,
'Guide: conversion variables guidage'
971 print*,
'Guide: verification ordre niveaux verticaux'
974 print*,
'PL(',l,
')=',(ap(l)+ap(l+1))/2. &
977 print*,
'Fichiers guidage'
981 print*,
'PL(',l,
')=',plnc2(1,
jjbu,l)
992 print *,
'inversion de l''ordre: invert_p=',
invert_p
1016 pls(i,j,l)=(ap(l)+ap(l+1))/2.+psi(i,j)*(
bp(l)+
bp(l+1))/2.
1022 if (disvert_type==1)
then
1033 pls(i,j,l) =
preff * ( pk(i,j,l)/
cpp) ** unskap
1044 pext(i,j,l)=pls(i,j,l)*
aire(i,j)
1061 plunc(i,j,l)=pbarx(i,j,l)/
aireu(i,j)
1062 plsnc(i,j,l)=pls(i,j,l)
1070 plvnc(i,j,l)=pbary(i,j,l)/
airev(i,j)
1111 plnc2(i,j,l)=
pnat2(i,j,l)
1112 plnc1(i,j,l)=
pnat1(i,j,l)
1133 tgui1(ij,l)=zu1(i,j,l)
1134 tgui2(ij,l)=zu2(i,j,l)
1139 tgui1(ij,l)=zu1(i,j,l)*
cpp/pk(i,j,l)
1140 tgui2(ij,l)=zu2(i,j,l)*
cpp/pk(i,j,l)
1178 plnc2(i,j,l)=
pnat2(i,j,l)
1179 plnc1(i,j,l)=
pnat1(i,j,l)
1202 qgui1(ij,l)=zu1(i,j,l)
1203 qgui2(ij,l)=zu2(i,j,l)
1245 plnc2(iip1,j,l)=plnc2(1,j,l)
1246 plnc1(iip1,j,l)=plnc1(1,j,l)
1259 plnc2(iip1,j,l)=plnc2(1,j,l)
1260 plnc1(iip1,j,l)=plnc1(1,j,l)
1280 ugui1(ij,l)=zu1(i,j,l)*
cu(i,j)
1281 ugui2(ij,l)=zu2(i,j,l)*
cu(i,j)
1355 vgui1(ij,l)=zv1(i,j,l)*
cv(i,j)
1356 vgui2(ij,l)=zv2(i,j,l)*
cv(i,j)
1368 SUBROUTINE tau2alpha(typ,pim,jjb,jje,factt,taumin,taumax,alpha)
1374 include
"dimensions.h"
1376 include
"comconst.h"
1377 include
"comgeom2.h"
1381 INTEGER,
INTENT(IN) :: typ
1382 INTEGER,
INTENT(IN) :: pim
1383 INTEGER,
INTENT(IN) :: jjb,jje
1384 REAL,
INTENT(IN) :: factt
1385 REAL,
INTENT(IN) :: taumin,taumax
1387 REAL,
DIMENSION(pim,jjb:jje),
INTENT(OUT) :: alpha
1390 LOGICAL,
SAVE :: first=.
true.
1391 REAL,
SAVE :: gamma,dxdy_min,dxdy_max
1392 REAL,
DIMENSION (iip1,jjp1) :: zdx,zdy
1393 REAL,
DIMENSION (iip1,jjp1) :: dxdys,dxdyu
1394 REAL,
DIMENSION (iip1,jjm) :: dxdyv
1397 real alphamin,alphamax,xi
1398 integer i,j,ilon,ilat
1401 alphamin=factt/taumax
1402 alphamax=factt/taumin
1414 elseif (typ.eq.1)
then
1417 elseif (typ.eq.3)
then
1421 alpha(i,j)=alphamax/16.* &
1436 zdx(i,j)=0.5*(
cu(i-1,j)+
cu(i,j))/cos(
rlatu(j))
1438 zdx(1,j)=zdx(iip1,j)
1442 zdy(i,j)=0.5*(
cv(i,j-1)+
cv(i,j))
1447 zdx(i,
jjp1)=zdx(i,jjm)
1449 zdy(i,
jjp1)=zdy(i,jjm)
1453 dxdys(i,j)=sqrt(zdx(i,j)*zdx(i,j)+zdy(i,j)*zdy(i,j))
1459 dxdyu(i,j)=0.5*(dxdys(i,j)+dxdys(i+1,j))
1461 dxdyu(iip1,j)=dxdyu(1,j)
1467 dxdyv(i,j)=0.5*(dxdys(i,j)+dxdys(i,j+1))
1477 dxdy_min=dxdys(ilon,ilat)
1482 dxdy_max=max(dxdy_max,dxdys(i,j))
1487 print*,
'ATTENTION modele peu zoome'
1488 print*,
'ATTENTION on prend une constante de guidage cste'
1491 gamma=(dxdy_max-2.*dxdy_min)/(dxdy_max-dxdy_min)
1492 print*,
'gamma=',gamma
1493 if (gamma.lt.1.e-5)
then
1494 print*,
'gamma =',gamma,
'<1e-5'
1497 gamma=log(0.5)/log(gamma)
1501 print*,
'gamma=',gamma
1510 elseif (typ.eq.2)
then
1513 elseif (typ.eq.3)
then
1521 xi=((dxdy_max-dxdy_)/(dxdy_max-dxdy_min))**gamma
1524 alpha(i,j)=xi*alphamin+(1.-xi)*alphamax
1533 if (.not.
guide_add) alpha = 1. - exp(- alpha)
1542 #include "netcdf.inc"
1543 #include "dimensions.h"
1544 #include "paramet.h"
1546 INTEGER,
INTENT(IN) :: timestep
1548 LOGICAL,
SAVE :: first=.
true.
1550 INTEGER,
SAVE :: ncidu,varidu,ncidv,varidv,ncidp,varidp
1551 INTEGER,
SAVE :: ncidQ,varidQ,ncidt,varidt,ncidps,varidps
1552 INTEGER :: ncidpl,varidpl,varidap,varidbp
1554 INTEGER,
DIMENSION(4) :: start,count
1555 INTEGER :: status,rcode
1556 CHARACTER (len = 80) :: abort_message
1557 CHARACTER (len = 20) :: modname =
'guide_read'
1558 abort_message=
'pb in guide_read'
1565 print*,
'Guide: ouverture des fichiers guidage '
1568 print *,
'Lecture du guidage sur niveaux modele'
1569 rcode = nf90_open(
'apbp.nc', nf90_nowrite, ncidpl)
1570 IF (rcode.NE.nf_noerr)
THEN
1571 print *,
'Guide: probleme -> pas de fichier apbp.nc'
1574 rcode = nf90_inq_varid(ncidpl,
'AP', varidap)
1575 IF (rcode.NE.nf_noerr)
THEN
1576 print *,
'Guide: probleme -> pas de variable AP, fichier apbp.nc'
1579 rcode = nf90_inq_varid(ncidpl,
'BP', varidbp)
1580 IF (rcode.NE.nf_noerr)
THEN
1581 print *,
'Guide: probleme -> pas de variable BP, fichier apbp.nc'
1584 print*,
'ncidpl,varidap',ncidpl,varidap
1588 rcode = nf90_open(
'P.nc', nf90_nowrite, ncidp)
1589 IF (rcode.NE.nf_noerr)
THEN
1590 print *,
'Guide: probleme -> pas de fichier P.nc'
1593 rcode = nf90_inq_varid(ncidp,
'PRES', varidp)
1594 IF (rcode.NE.nf_noerr)
THEN
1595 print *,
'Guide: probleme -> pas de variable PRES, fichier P.nc'
1598 print*,
'ncidp,varidp',ncidp,varidp
1599 if (ncidpl.eq.-99) ncidpl=ncidp
1603 rcode = nf90_open(
'u.nc', nf90_nowrite, ncidu)
1604 IF (rcode.NE.nf_noerr)
THEN
1605 print *,
'Guide: probleme -> pas de fichier u.nc'
1608 rcode = nf90_inq_varid(ncidu,
'UWND', varidu)
1609 IF (rcode.NE.nf_noerr)
THEN
1610 print *,
'Guide: probleme -> pas de variable UWND, fichier u.nc'
1613 print*,
'ncidu,varidu',ncidu,varidu
1614 if (ncidpl.eq.-99) ncidpl=ncidu
1618 rcode = nf90_open(
'v.nc', nf90_nowrite, ncidv)
1619 IF (rcode.NE.nf_noerr)
THEN
1620 print *,
'Guide: probleme -> pas de fichier v.nc'
1623 rcode = nf90_inq_varid(ncidv,
'VWND', varidv)
1624 IF (rcode.NE.nf_noerr)
THEN
1625 print *,
'Guide: probleme -> pas de variable VWND, fichier v.nc'
1628 print*,
'ncidv,varidv',ncidv,varidv
1629 if (ncidpl.eq.-99) ncidpl=ncidv
1633 rcode = nf90_open(
'T.nc', nf90_nowrite, ncidt)
1634 IF (rcode.NE.nf_noerr)
THEN
1635 print *,
'Guide: probleme -> pas de fichier T.nc'
1638 rcode = nf90_inq_varid(ncidt,
'AIR', varidt)
1639 IF (rcode.NE.nf_noerr)
THEN
1640 print *,
'Guide: probleme -> pas de variable AIR, fichier T.nc'
1643 print*,
'ncidT,varidT',ncidt,varidt
1644 if (ncidpl.eq.-99) ncidpl=ncidt
1648 rcode = nf90_open(
'hur.nc', nf90_nowrite, ncidq)
1649 IF (rcode.NE.nf_noerr)
THEN
1650 print *,
'Guide: probleme -> pas de fichier hur.nc'
1653 rcode = nf90_inq_varid(ncidq,
'RH', varidq)
1654 IF (rcode.NE.nf_noerr)
THEN
1655 print *,
'Guide: probleme -> pas de variable RH, fichier hur.nc'
1658 print*,
'ncidQ,varidQ',ncidq,varidq
1659 if (ncidpl.eq.-99) ncidpl=ncidq
1663 rcode = nf90_open(
'ps.nc', nf90_nowrite, ncidps)
1664 IF (rcode.NE.nf_noerr)
THEN
1665 print *,
'Guide: probleme -> pas de fichier ps.nc'
1668 rcode = nf90_inq_varid(ncidps,
'SP', varidps)
1669 IF (rcode.NE.nf_noerr)
THEN
1670 print *,
'Guide: probleme -> pas de variable SP, fichier ps.nc'
1673 print*,
'ncidps,varidps',ncidps,varidps
1677 rcode = nf90_inq_varid(ncidpl,
'LEVEL', varidpl)
1678 IF (rcode.NE.0) rcode = nf90_inq_varid(ncidpl,
'PRESSURE', varidpl)
1679 print*,
'ncidpl,varidpl',ncidpl,varidpl
1684 status=nf_get_vara_double(ncidpl,varidap,1,
nlevnc,
apnc)
1685 status=nf_get_vara_double(ncidpl,varidbp,1,
nlevnc,
bpnc)
1687 status=nf_get_vara_real(ncidpl,varidap,1,
nlevnc,
apnc)
1688 status=nf_get_vara_real(ncidpl,varidbp,1,
nlevnc,
bpnc)
1692 status=nf_get_vara_double(ncidpl,varidpl,1,
nlevnc,
apnc)
1694 status=nf_get_vara_real(ncidpl,varidpl,1,
nlevnc,
apnc)
1721 status=nf_get_vara_double(ncidp,varidp,start,count,
pnat2)
1723 status=nf_get_vara_real(ncidp,varidp,start,count,
pnat2)
1735 status=nf_get_vara_double(ncidu,varidu,start,count,
unat2)
1737 status=nf_get_vara_real(ncidu,varidu,start,count,
unat2)
1751 status=nf_get_vara_double(ncidt,varidt,start,count,
tnat2)
1753 status=nf_get_vara_real(ncidt,varidt,start,count,
tnat2)
1765 status=nf_get_vara_double(ncidq,varidq,start,count,
qnat2)
1767 status=nf_get_vara_real(ncidq,varidq,start,count,
qnat2)
1784 status=nf_get_vara_double(ncidv,varidv,start,count,
vnat2)
1786 status=nf_get_vara_real(ncidv,varidv,start,count,
vnat2)
1805 status=nf_get_vara_double(ncidps,varidps,start,count,
psnat2)
1807 status=nf_get_vara_real(ncidps,varidps,start,count,
psnat2)
1823 #include "netcdf.inc"
1824 #include "dimensions.h"
1825 #include "paramet.h"
1827 INTEGER,
INTENT(IN) :: timestep
1829 LOGICAL,
SAVE :: first=.
true.
1831 INTEGER,
SAVE :: ncidu,varidu,ncidv,varidv,ncidp,varidp
1832 INTEGER,
SAVE :: ncidQ,varidQ,ncidt,varidt,ncidps,varidps
1833 INTEGER :: ncidpl,varidpl,varidap,varidbp
1835 INTEGER,
DIMENSION(4) :: start,count
1836 INTEGER :: status,rcode
1838 REAL,
DIMENSION (jjb_u:jje_u,llm) :: zu
1839 REAL,
DIMENSION (jjb_v:jje_v,llm) :: zv
1841 CHARACTER (len = 80) :: abort_message
1842 CHARACTER (len = 20) :: modname =
'guide_read2D'
1843 abort_message=
'pb in guide_read2D'
1850 print*,
'Guide: ouverture des fichiers guidage '
1853 print *,
'Lecture du guidage sur niveaux mod�le'
1854 rcode = nf90_open(
'apbp.nc', nf90_nowrite, ncidpl)
1855 IF (rcode.NE.nf_noerr)
THEN
1856 print *,
'Guide: probleme -> pas de fichier apbp.nc'
1859 rcode = nf90_inq_varid(ncidpl,
'AP', varidap)
1860 IF (rcode.NE.nf_noerr)
THEN
1861 print *,
'Guide: probleme -> pas de variable AP, fichier apbp.nc'
1864 rcode = nf90_inq_varid(ncidpl,
'BP', varidbp)
1865 IF (rcode.NE.nf_noerr)
THEN
1866 print *,
'Guide: probleme -> pas de variable BP, fichier apbp.nc'
1869 print*,
'ncidpl,varidap',ncidpl,varidap
1873 rcode = nf90_open(
'P.nc', nf90_nowrite, ncidp)
1874 IF (rcode.NE.nf_noerr)
THEN
1875 print *,
'Guide: probleme -> pas de fichier P.nc'
1878 rcode = nf90_inq_varid(ncidp,
'PRES', varidp)
1879 IF (rcode.NE.nf_noerr)
THEN
1880 print *,
'Guide: probleme -> pas de variable PRES, fichier P.nc'
1883 print*,
'ncidp,varidp',ncidp,varidp
1884 if (ncidpl.eq.-99) ncidpl=ncidp
1888 rcode = nf90_open(
'u.nc', nf90_nowrite, ncidu)
1889 IF (rcode.NE.nf_noerr)
THEN
1890 print *,
'Guide: probleme -> pas de fichier u.nc'
1893 rcode = nf90_inq_varid(ncidu,
'UWND', varidu)
1894 IF (rcode.NE.nf_noerr)
THEN
1895 print *,
'Guide: probleme -> pas de variable UWND, fichier u.nc'
1898 print*,
'ncidu,varidu',ncidu,varidu
1899 if (ncidpl.eq.-99) ncidpl=ncidu
1904 rcode = nf90_open(
'v.nc', nf90_nowrite, ncidv)
1905 IF (rcode.NE.nf_noerr)
THEN
1906 print *,
'Guide: probleme -> pas de fichier v.nc'
1909 rcode = nf90_inq_varid(ncidv,
'VWND', varidv)
1910 IF (rcode.NE.nf_noerr)
THEN
1911 print *,
'Guide: probleme -> pas de variable VWND, fichier v.nc'
1914 print*,
'ncidv,varidv',ncidv,varidv
1915 if (ncidpl.eq.-99) ncidpl=ncidv
1919 rcode = nf90_open(
'T.nc', nf90_nowrite, ncidt)
1920 IF (rcode.NE.nf_noerr)
THEN
1921 print *,
'Guide: probleme -> pas de fichier T.nc'
1924 rcode = nf90_inq_varid(ncidt,
'AIR', varidt)
1925 IF (rcode.NE.nf_noerr)
THEN
1926 print *,
'Guide: probleme -> pas de variable AIR, fichier T.nc'
1929 print*,
'ncidT,varidT',ncidt,varidt
1930 if (ncidpl.eq.-99) ncidpl=ncidt
1934 rcode = nf90_open(
'hur.nc', nf90_nowrite, ncidq)
1935 IF (rcode.NE.nf_noerr)
THEN
1936 print *,
'Guide: probleme -> pas de fichier hur.nc'
1939 rcode = nf90_inq_varid(ncidq,
'RH', varidq)
1940 IF (rcode.NE.nf_noerr)
THEN
1941 print *,
'Guide: probleme -> pas de variable RH, fichier hur.nc'
1944 print*,
'ncidQ,varidQ',ncidq,varidq
1945 if (ncidpl.eq.-99) ncidpl=ncidq
1949 rcode = nf90_open(
'ps.nc', nf90_nowrite, ncidps)
1950 IF (rcode.NE.nf_noerr)
THEN
1951 print *,
'Guide: probleme -> pas de fichier ps.nc'
1954 rcode = nf90_inq_varid(ncidps,
'SP', varidps)
1955 IF (rcode.NE.nf_noerr)
THEN
1956 print *,
'Guide: probleme -> pas de variable SP, fichier ps.nc'
1959 print*,
'ncidps,varidps',ncidps,varidps
1963 rcode = nf90_inq_varid(ncidpl,
'LEVEL', varidpl)
1964 IF (rcode.NE.0) rcode = nf90_inq_varid(ncidpl,
'PRESSURE', varidpl)
1965 print*,
'ncidpl,varidpl',ncidpl,varidpl
1970 status=nf_get_vara_double(ncidpl,varidap,1,
nlevnc,
apnc)
1971 status=nf_get_vara_double(ncidpl,varidbp,1,
nlevnc,
bpnc)
1973 status=nf_get_vara_real(ncidpl,varidap,1,
nlevnc,
apnc)
1974 status=nf_get_vara_real(ncidpl,varidbp,1,
nlevnc,
bpnc)
1978 status=nf_get_vara_double(ncidpl,varidpl,1,
nlevnc,
apnc)
1980 status=nf_get_vara_real(ncidpl,varidpl,1,
nlevnc,
apnc)
2007 status=nf_get_vara_double(ncidp,varidp,start,count,zu)
2009 status=nf_get_vara_real(ncidp,varidp,start,count,zu)
2012 pnat2(i,:,:)=zu(:,:)
2024 status=nf_get_vara_double(ncidu,varidu,start,count,zu)
2026 status=nf_get_vara_real(ncidu,varidu,start,count,zu)
2029 unat2(i,:,:)=zu(:,:)
2043 status=nf_get_vara_double(ncidt,varidt,start,count,zu)
2045 status=nf_get_vara_real(ncidt,varidt,start,count,zu)
2048 tnat2(i,:,:)=zu(:,:)
2061 status=nf_get_vara_double(ncidq,varidq,start,count,zu)
2063 status=nf_get_vara_real(ncidq,varidq,start,count,zu)
2066 qnat2(i,:,:)=zu(:,:)
2082 status=nf_get_vara_double(ncidv,varidv,start,count,zv)
2084 status=nf_get_vara_real(ncidv,varidv,start,count,zv)
2087 vnat2(i,:,:)=zv(:,:)
2108 status=nf_get_vara_double(ncidps,varidps,start,count,zu(:,1))
2110 status=nf_get_vara_real(ncidps,varidps,start,count,zu(:,1))
2126 SUBROUTINE guide_out(varname,hsize,vsize,field_loc,factt)
2131 include
"dimensions.h"
2133 include
"netcdf.inc"
2134 include
"comgeom2.h"
2135 include
"comconst.h"
2139 CHARACTER*(*),
INTENT(IN) :: varname
2140 INTEGER,
INTENT (IN) :: hsize,vsize
2142 REAL,
DIMENSION (:,:),
INTENT(IN) :: field_loc
2146 INTEGER,
SAVE :: timestep=0
2148 INTEGER :: nid, id_lonu, id_lonv, id_latu, id_latv, id_tim, id_lev
2149 INTEGER :: vid_lonu,vid_lonv,vid_latu,vid_latv,vid_cu,vid_cv,vid_lev
2150 INTEGER :: vid_au,vid_av
2151 INTEGER,
DIMENSION (3) :: dim3
2152 INTEGER,
DIMENSION (4) :: dim4,count,start
2153 INTEGER :: ierr, varid,l
2155 REAL,
ALLOCATABLE,
SAVE,
DIMENSION(:,:,:) :: field_glo
2158 ALLOCATE(field_glo(iip1,hsize,vsize))
2162 print*,
'gvide_out apres allocation ',hsize,vsize
2164 IF (hsize==
jjp1)
THEN
2166 ELSE IF (hsize==jjm)
THEN
2170 print*,
'guide_out apres gather '
2176 DEALLOCATE(field_glo)
2184 IF (timestep.EQ.0)
THEN
2189 ierr=nf_create(
"guide_ins.nc",nf_clobber,nid)
2191 ierr=nf_def_dim(nid,
"LONU",iip1,id_lonu)
2192 ierr=nf_def_dim(nid,
"LONV",iip1,id_lonv)
2193 ierr=nf_def_dim(nid,
"LATU",
jjp1,id_latu)
2194 ierr=nf_def_dim(nid,
"LATV",jjm,id_latv)
2195 ierr=nf_def_dim(nid,
"LEVEL",
llm,id_lev)
2196 ierr=nf_def_dim(nid,
"TIME",nf_unlimited,id_tim)
2199 ierr=nf_def_var(nid,
"LONU",nf_float,1,id_lonu,vid_lonu)
2200 ierr=nf_def_var(nid,
"LONV",nf_float,1,id_lonv,vid_lonv)
2201 ierr=nf_def_var(nid,
"LATU",nf_float,1,id_latu,vid_latu)
2202 ierr=nf_def_var(nid,
"LATV",nf_float,1,id_latv,vid_latv)
2203 ierr=nf_def_var(nid,
"LEVEL",nf_float,1,id_lev,vid_lev)
2204 ierr=nf_def_var(nid,
"cu",nf_float,2,(/id_lonu,id_latu/),vid_cu)
2205 ierr=nf_def_var(nid,
"cv",nf_float,2,(/id_lonv,id_latv/),vid_cv)
2206 ierr=nf_def_var(nid,
"au",nf_float,2,(/id_lonu,id_latu/),vid_au)
2207 ierr=nf_def_var(nid,
"av",nf_float,2,(/id_lonv,id_latv/),vid_av)
2213 ierr = nf_put_var_double(nid,vid_lonu,
rlonu*180./
pi)
2214 ierr = nf_put_var_double(nid,vid_lonv,
rlonv*180./
pi)
2215 ierr = nf_put_var_double(nid,vid_latu,
rlatu*180./
pi)
2216 ierr = nf_put_var_double(nid,vid_latv,
rlatv*180./
pi)
2217 ierr = nf_put_var_double(nid,vid_lev,
presnivs)
2218 ierr = nf_put_var_double(nid,vid_cu,
cu)
2219 ierr = nf_put_var_double(nid,vid_cv,
cv)
2220 ierr = nf_put_var_double(nid,vid_au,zu)
2221 ierr = nf_put_var_double(nid,vid_av,zv)
2223 ierr = nf_put_var_real(nid,vid_lonu,
rlonu*180./
pi)
2224 ierr = nf_put_var_real(nid,vid_lonv,
rlonv*180./
pi)
2225 ierr = nf_put_var_real(nid,vid_latu,
rlatu*180./
pi)
2226 ierr = nf_put_var_real(nid,vid_latv,
rlatv*180./
pi)
2227 ierr = nf_put_var_real(nid,vid_lev,
presnivs)
2228 ierr = nf_put_var_real(nid,vid_cu,
cu)
2229 ierr = nf_put_var_real(nid,vid_cv,
cv)
2230 ierr = nf_put_var_real(nid,vid_au,
alpha_u)
2231 ierr = nf_put_var_real(nid,vid_av,
alpha_v)
2236 ierr = nf_redef(nid)
2238 dim4=(/id_lonv,id_latu,id_lev,id_tim/)
2239 ierr = nf_def_var(nid,
"SP",nf_float,4,dim4,varid)
2242 dim3=(/id_lonv,id_latu,id_tim/)
2243 ierr = nf_def_var(nid,
"ps",nf_float,3,dim3,varid)
2247 dim4=(/id_lonu,id_latu,id_lev,id_tim/)
2248 ierr = nf_def_var(nid,
"u",nf_float,4,dim4,varid)
2249 ierr = nf_def_var(nid,
"ua",nf_float,4,dim4,varid)
2250 ierr = nf_def_var(nid,
"ucov",nf_float,4,dim4,varid)
2254 dim4=(/id_lonv,id_latv,id_lev,id_tim/)
2255 ierr = nf_def_var(nid,
"v",nf_float,4,dim4,varid)
2256 ierr = nf_def_var(nid,
"va",nf_float,4,dim4,varid)
2257 ierr = nf_def_var(nid,
"vcov",nf_float,4,dim4,varid)
2261 dim4=(/id_lonv,id_latu,id_lev,id_tim/)
2262 ierr = nf_def_var(nid,
"teta",nf_float,4,dim4,varid)
2266 dim4=(/id_lonv,id_latu,id_lev,id_tim/)
2267 ierr = nf_def_var(nid,
"q",nf_float,4,dim4,varid)
2270 ierr = nf_enddef(nid)
2271 ierr = nf_close(nid)
2278 ierr=nf_open(
"guide_ins.nc",nf_write,nid)
2280 IF (varname==
"SP") timestep=timestep+1
2282 ierr = nf_inq_varid(nid,varname,varid)
2283 SELECT CASE (varname)
2285 start=(/1,1,1,timestep/)
2287 CASE (
"v",
"va",
"vcov")
2288 start=(/1,1,1,timestep/)
2289 count=(/iip1,jjm,
llm,1/)
2291 start=(/1,1,1,timestep/)
2298 SELECT CASE (varname)
2303 field_glo(:,2:jjm,l)=field_glo(:,2:jjm,l)/
cu(:,2:jjm)
2304 field_glo(:,1,l)=0. ; field_glo(:,
jjp1,l)=0.
2309 field_glo(:,:,l)=field_glo(:,:,l)/
cv(:,:)
2321 ierr = nf_put_vara_double(nid,varid,start,count,field_glo)
2323 ierr = nf_put_vara_real(nid,varid,start,count,field_glo)
2326 ierr = nf_close(nid)
2328 DEALLOCATE(field_glo)
2346 if(abs(x(i,l)).gt.1.e10)
then
2347 zz=0.5*(x(i-1,l)+x(i+1,l))
2348 print*,
'correction ',i,l,x(i,l),zz
2361 subroutine dump2du(var,varname)
2365 include
'dimensions.h'
2368 CHARACTER (len=*) :: varname
2371 real,
dimension(ijb_u:ije_u) :: var
2373 real,
dimension(ip1jmp1) :: var_glob
2395 include
"dimensions.h"
real, dimension(:,:), allocatable, save, private vgui1
logical, save, private invert_p
real, dimension(:), allocatable, save, private alpha_t
real, save, private tau_max_v
subroutine guide_read(timestep)
real, dimension(:,:,:), allocatable, save, private qnat1
!$Header llmm1 INTEGER ip1jmp1
logical, save, private guide_teta
!$Header!c!c!c include serre h!c REAL && grossismx
real, save, private lon_min_g
real, dimension(:), allocatable, save, private alpha_v
real, save, private tau_min_t
real, dimension(:,:,:), allocatable, save, private pnat2
real, save, private tau_min_p
!$Header!CDK comgeom COMMON comgeom alpha1p2
real, dimension(:,:), allocatable, save, private psnat2
subroutine pres2lev(varo, varn, lmo, lmn, po, pn, ni, nj, ok_invertp)
subroutine guide_zonave_v(typ, hsize, vsize, field)
subroutine exner_milieu_loc(ngrid, ps, p, pks, pk, pkf)
!$Id mode_top_bound COMMON comconstr kappa
logical, save, private guide_t
real, dimension(:,:,:), allocatable, save, private pnat1
!$Header!c!c!c include serre h!c REAL clon
real, save, private tau_max_t
logical, save, private guide_u
subroutine massdair_loc(p, masse)
subroutine invert_lat(xsize, ysize, vsize, field)
integer, save, private ijeu
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
!$Id mode_top_bound COMMON comconstr && pi
!$Header!CDK comgeom COMMON comgeom aire
subroutine ini_getparam(fichier)
!$Header!CDK comgeom COMMON comgeom rlatu
!$Header!CDK comgeom COMMON comgeom unscu2
integer, save, private jjeu
real, dimension(:), allocatable, save, private alpha_q
integer, save, private jjbu
logical, save, private gamma4
logical, save, private guide_zon
real, dimension(:,:), allocatable, save, private vgui2
real, dimension(:), allocatable, save, private alpha_p
subroutine guide_read2d(timestep)
integer, save, private jjev
subroutine exner_hyb_loc(ngrid, ps, p, pks, pk, pkf)
logical, save, private guide_reg
integer, save, private ijbv
real, dimension(:,:), allocatable, save, private qgui2
real, dimension(:,:,:), allocatable, save, private qnat2
!$Header llmm1 INTEGER ip1jm
integer, save, private iguide_read
subroutine pression_loc(ngrid, ap, bp, ps, p)
real, save, private tau_max_p
real, dimension(:,:), allocatable, save, private psnat1
!$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_lat
real, dimension(:), allocatable, save, private alpha_u
subroutine q_sat(np, temp, pres, qsat)
real, dimension(:,:,:), allocatable, save, private tnat1
logical, save, private guide_modele
!$Header!CDK comgeom COMMON comgeom alpha1p4
!$Header!CDK comgeom COMMON comgeom aireu
integer, save, private jjnv
real, save, private tau_min_q
logical, save, private guide_2d
real, dimension(:), allocatable, save, private alpha_pcor
!$Id mode_top_bound COMMON comconstr cpp
integer, save, private guide_plevs
subroutine tau2alpha(typ, pim, jjb, jje, factt, taumin, taumax, alpha)
logical, save, private guide_bl
integer, save, private nlevnc
real, save, private lon_max_g
real, save, private tau_max_u
integer, save, private jjnu
integer, save, private ijbu
subroutine guide_main(itau, ucov, vcov, teta, q, masse, ps)
subroutine register_hallo_u(Field, ll, RUp, Rdown, SUp, SDown, a_request)
logical, save, private guide_v
real, dimension(:), allocatable, save, private bpnc
!$Id mode_top_bound COMMON comconstr daysec
logical, save, private invert_y
real, dimension(:,:), allocatable, save, private ugui2
!$Header!CDK comgeom COMMON comgeom rlonu
!$Header!CDK comgeom COMMON comgeom rlatv
subroutine gather_field_v(field_loc, field_glo, ll)
subroutine sendrequest(a_Request)
real, save, private tau_min_u
real, save, private tau_min_v
real, dimension(:,:,:), allocatable, save, private vnat1
!$Header!CDK comgeom COMMON comgeom alpha3p4
subroutine gather_field_u(field_loc, field_glo, ll)
integer, save, private ijnu
!$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 apnc
logical, save, private guide_sav
!$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)
!$Header!CDK comgeom COMMON comgeom alpha2p3
subroutine guide_out(varname, hsize, vsize, field_loc, factt)
integer, save, private iguide_int
real, dimension(:,:,:), allocatable, save, private tnat2
subroutine dump2d(im, jm, z, nom_z)
real, save, private lat_max_g
!$Header!c!c!c include serre h!c REAL grossismy
!$Id mode_top_bound COMMON comconstr dtvr
subroutine correctbid(iim, nl, x)
logical, save, private guide_add
subroutine dump2du(var, varname)
real, dimension(:,:), allocatable, save, private tgui1
integer, save, private ijev
c c zjulian c cym CALL iim cym klev iim
real, dimension(:,:), allocatable, save, private qgui1
logical, save, private guide_p
real, save, private tau_lon
subroutine guide_interp(psi, teta)
!$Header!c!c!c include serre h!c REAL clat
real, dimension(:,:), allocatable, save, private ugui1
logical, save, private ini_anal
real, dimension(:,:), allocatable, save, private tgui2
real, dimension(:), allocatable, save, private psgui2
subroutine guide_zonave_u(typ, vsize, field)
real, save, private lat_min_g
real, dimension(:,:,:), allocatable, save, private unat2
real, dimension(:,:,:), allocatable, save, private unat1
!$Header!CDK comgeom COMMON comgeom cv
real, save, private tau_max_q
subroutine massbar_loc(masse, massebx, masseby)
subroutine guide_addfield_v(vsize, field, alpha)
subroutine guide_addfield_u(vsize, field, alpha)
integer, save, private iguide_sav
real, dimension(:), allocatable, save, private psgui1
integer, save, private ijnv
subroutine waitrequest(a_Request)
logical, save, private guide_q
integer, save, private jjbv
real, dimension(:,:,:), allocatable, save, private vnat2
!$Header!CDK comgeom COMMON comgeom airev
logical, save, private guide_hr
!$Header!CDK comgeom COMMON comgeom rlonv