1 subroutine wstats(ngrid,nom,titre,unite,dim,px)
5 #include "dimensions.h"
9 integer,
intent(in) :: ngrid
10 character (len=*),
intent(in) :: nom,titre,unite
11 integer,
intent(in) :: dim
12 real,
dimension(ngrid,llm),
intent(in) :: px
13 integer,
parameter :: iip1=
iim+1
14 integer,
parameter :: jjp1=jjm+1
15 real,
dimension(iip1,jjp1,llm) :: mean3d,sd3d,dx3
16 real,
dimension(iip1,jjp1) :: mean2d,sd2d,dx2
17 character (len=50) :: namebis
18 character (len=50),
save :: firstvar
19 integer :: ierr,varid,nbdim,nid
20 integer :: meanid,sdid
21 integer,
dimension(4) :: id,start,size
22 logical,
save :: firstcall=.
true.
26 integer,
save :: step=0
35 if (firstvar==nom)
then
39 if (mod(step,istats).ne.0)
then
43 ierr = nf_open(
"stats.nc",nf_write,nid)
46 ierr= nf_inq_varid(nid,namebis,meanid)
48 if (ierr.ne.nf_noerr)
then
50 if (firstvar==nom)
then
59 ierr= nf_inq_dimid(nid,
"longitude",id(1))
60 ierr= nf_inq_dimid(nid,
"latitude",id(2))
62 ierr= nf_inq_dimid(nid,
"altitude",id(3))
63 ierr= nf_inq_dimid(nid,
"Time",id(4))
66 ierr= nf_inq_dimid(nid,
"Time",id(3))
70 write (*,*)
"====================="
71 write (*,*)
"STATS: creation de ",nom
73 call def_var_stats(nid,namebis,titre,unite,nbdim,id,meanid,ierr)
74 call inivar(nid,meanid,ngrid,dim,index,px,ierr)
75 namebis=trim(nom)//
"_sd"
76 call def_var_stats(nid,namebis,trim(titre)//
" total standard deviation over the season",unite,nbdim,id,sdid,ierr)
77 call inivar(nid,sdid,ngrid,dim,index,px,ierr)
83 namebis=trim(nom)//
"_sd"
84 ierr= nf_inq_varid(nid,namebis,sdid)
88 if (firstvar==nom)
then
89 count(index)=count(int(index))+1
91 if (index>istime)
then
96 if (count(index)==0)
then
99 size=(/iip1,jjp1,
llm,1/)
102 else if (dim.eq.2)
then
103 start=(/1,1,index,0/)
104 size=(/iip1,jjp1,1,0/)
110 start=(/1,1,1,index/)
111 size=(/iip1,jjp1,
llm,1/)
113 ierr = nf_get_vara_double(nid,meanid,start,
size,mean3d)
114 ierr = nf_get_vara_double(nid,sdid,start,
size,sd3d)
116 ierr = nf_get_vara_real(nid,meanid,start,
size,mean3d)
117 ierr = nf_get_vara_real(nid,sdid,start,
size,sd3d)
119 if (ierr.ne.nf_noerr)
then
120 write (*,*) nf_strerror(ierr)
124 else if (dim.eq.2)
then
125 start=(/1,1,index,0/)
126 size=(/iip1,jjp1,1,0/)
128 ierr = nf_get_vara_double(nid,meanid,start,
size,mean2d)
129 ierr = nf_get_vara_double(nid,sdid,start,
size,sd2d)
131 ierr = nf_get_vara_real(nid,meanid,start,
size,mean2d)
132 ierr = nf_get_vara_real(nid,sdid,start,
size,sd2d)
134 if (ierr.ne.nf_noerr)
then
135 write (*,*) nf_strerror(ierr)
148 dx3(i,jjp1,l)=px(ngrid,l)
153 dx3(i,j,l)=px(ig0+i,l)
155 dx3(iip1,j,l)=dx3(1,j,l)
159 mean3d(:,:,:)= mean3d(:,:,:)+dx3(:,:,:)
160 sd3d(:,:,:)= sd3d(:,:,:)+dx3(:,:,:)**2
163 ierr = nf_put_vara_double(nid,meanid,start,
size,mean3d)
164 ierr = nf_put_vara_double(nid,sdid,start,
size,sd3d)
166 ierr = nf_put_vara_real(nid,meanid,start,
size,mean3d)
167 ierr = nf_put_vara_real(nid,sdid,start,
size,sd3d)
169 if (ierr.ne.nf_noerr)
then
170 write (*,*) nf_strerror(ierr)
174 else if (dim.eq.2)
then
180 dx2(i,jjp1)=px(ngrid,1)
190 mean2d(:,:)= mean2d(:,:)+dx2(:,:)
191 sd2d(:,:)= sd2d(:,:)+dx2(:,:)**2
194 ierr = nf_put_vara_double(nid,meanid,start,
size,mean2d)
195 ierr = nf_put_vara_double(nid,sdid,start,
size,sd2d)
197 ierr = nf_put_vara_real(nid,meanid,start,
size,mean2d)
198 ierr = nf_put_vara_real(nid,sdid,start,
size,sd2d)
200 if (ierr.ne.nf_noerr)
then
201 write (*,*) nf_strerror(ierr)
212 subroutine inivar(nid,varid,ngrid,dim,index,px,ierr)
216 include
"dimensions.h"
220 integer,
intent(in) :: nid,varid,dim,index,ngrid
221 real,
dimension(ngrid,llm),
intent(in) :: px
222 integer,
intent(out) :: ierr
224 integer,
parameter :: iip1=
iim+1
225 integer,
parameter :: jjp1=jjm+1
228 integer,
dimension(4) :: start,size
229 real,
dimension(iip1,jjp1,llm) :: dx3
230 real,
dimension(iip1,jjp1) :: dx2
234 start=(/1,1,1,index/)
235 size=(/iip1,jjp1,
llm,1/)
242 dx3(i,jjp1,l)=px(ngrid,l)
247 dx3(i,j,l)=px(ig0+i,l)
249 dx3(iip1,j,l)=dx3(1,j,l)
254 ierr = nf_put_vara_double(nid,varid,start,
size,dx3)
256 ierr = nf_put_vara_real(nid,varid,start,
size,dx3)
259 else if (dim.eq.2)
then
261 start=(/1,1,index,0/)
262 size=(/iip1,jjp1,1,0/)
268 dx2(i,jjp1)=px(ngrid,1)
279 ierr = nf_put_vara_double(nid,varid,start,
size,dx2)
281 ierr = nf_put_vara_real(nid,varid,start,
size,dx2)
290 subroutine def_var_stats(nid,name,title,units,nbdim,dimids,nvarid,ierr)
303 #include "netcdf.inc"
305 integer,
intent(in) :: nid
306 character(len=*),
intent(in) :: name
307 character(len=*),
intent(in) :: title
308 character(len=*),
intent(in) :: units
309 integer,
intent(in) :: nbdim
310 integer,
dimension(nbdim),
intent(in) :: dimids
312 integer,
intent(out) :: nvarid
313 integer,
intent(out) :: ierr
320 ierr = nf_def_var(nid,adjustl(name),nf_double,nbdim,dimids,nvarid)
322 ierr = nf_def_var(nid,adjustl(name),nf_float,nbdim,dimids,nvarid)
324 if(ierr/=nf_noerr)
then
325 write(*,*)
"def_var_stats: Failed defining variable "//trim(name)
326 write(*,*) nf_strerror(ierr)
331 ierr=nf_put_att_text(nid,nvarid,
"title",&
332 len_trim(adjustl(title)),adjustl(title))
333 if(ierr/=nf_noerr)
then
334 write(*,*)
"def_var_stats: Failed writing title attribute for "//trim(name)
335 write(*,*) nf_strerror(ierr)
339 ierr=nf_put_att_text(nid,nvarid,
"units",&
340 len_trim(adjustl(units)),adjustl(units))
341 if(ierr/=nf_noerr)
then
342 write(*,*)
"def_var_stats: Failed writing units attribute for "//trim(name)
343 write(*,*) nf_strerror(ierr)
348 ierr = nf_enddef(nid)
subroutine wstats(ngrid, nom, titre, unite, dim, px)
!$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 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 inivar(nid, varid, ngrid, dim, index, px, ierr)
!$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
c c zjulian c cym CALL iim cym klev iim
subroutine inistats(ierr)
subroutine def_var_stats(nid, name, title, units, nbdim, dimids, nvarid, ierr)