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)
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/)
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)
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",&
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)