Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
mpim-sw
cdo
Commits
d2174fdb
Commit
d2174fdb
authored
May 30, 2017
by
Uwe Schulzweida
Browse files
Added operator runrange.
parent
2de2ed8f
Changes
12
Hide whitespace changes
Inline
Side-by-side
ChangeLog
View file @
d2174fdb
...
...
@@ -7,6 +7,7 @@
* New operator seasrange: seasonal range (seasmax-seasmin)
* New operator timselrange: time selection range (timmax-timmin)
* New operator runrange: running range (runmax-runmin)
2017-05-26 Uwe Schulzweida
...
...
src/Runstat.cc
View file @
d2174fdb
...
...
@@ -18,6 +18,7 @@
/*
This module contains the following operators:
Runstat runrange Running range
Runstat runmin Running minimum
Runstat runmax Running maximum
Runstat runsum Running sum
...
...
@@ -34,6 +35,12 @@
#include
"pstream.h"
typedef
struct
{
short
varID
;
short
levelID
;
}
recinfo_t
;
void
*
Runstat
(
void
*
argument
)
{
int
timestat_date
=
TIMESTAT_MEAN
;
...
...
@@ -52,15 +59,16 @@ void *Runstat(void *argument)
if
(
envval
==
1
)
runstat_nomiss
=
1
;
}
cdoOperatorAdd
(
"runmin"
,
func_min
,
0
,
NULL
);
cdoOperatorAdd
(
"runmax"
,
func_max
,
0
,
NULL
);
cdoOperatorAdd
(
"runsum"
,
func_sum
,
0
,
NULL
);
cdoOperatorAdd
(
"runmean"
,
func_mean
,
0
,
NULL
);
cdoOperatorAdd
(
"runavg"
,
func_avg
,
0
,
NULL
);
cdoOperatorAdd
(
"runvar"
,
func_var
,
0
,
NULL
);
cdoOperatorAdd
(
"runvar1"
,
func_var1
,
0
,
NULL
);
cdoOperatorAdd
(
"runstd"
,
func_std
,
0
,
NULL
);
cdoOperatorAdd
(
"runstd1"
,
func_std1
,
0
,
NULL
);
cdoOperatorAdd
(
"runrange"
,
func_range
,
0
,
NULL
);
cdoOperatorAdd
(
"runmin"
,
func_min
,
0
,
NULL
);
cdoOperatorAdd
(
"runmax"
,
func_max
,
0
,
NULL
);
cdoOperatorAdd
(
"runsum"
,
func_sum
,
0
,
NULL
);
cdoOperatorAdd
(
"runmean"
,
func_mean
,
0
,
NULL
);
cdoOperatorAdd
(
"runavg"
,
func_avg
,
0
,
NULL
);
cdoOperatorAdd
(
"runvar"
,
func_var
,
0
,
NULL
);
cdoOperatorAdd
(
"runvar1"
,
func_var1
,
0
,
NULL
);
cdoOperatorAdd
(
"runstd"
,
func_std
,
0
,
NULL
);
cdoOperatorAdd
(
"runstd1"
,
func_std1
,
0
,
NULL
);
int
operatorID
=
cdoOperatorID
();
int
operfunc
=
cdoOperatorF1
(
operatorID
);
...
...
@@ -68,10 +76,11 @@ void *Runstat(void *argument)
operatorInputArg
(
"number of timesteps"
);
int
ndates
=
parameter2int
(
operatorArgv
()[
0
]);
int
lmean
=
operfunc
==
func_mean
||
operfunc
==
func_avg
;
int
lstd
=
operfunc
==
func_std
||
operfunc
==
func_std1
;
int
lvarstd
=
operfunc
==
func_std
||
operfunc
==
func_var
||
operfunc
==
func_std1
||
operfunc
==
func_var1
;
int
divisor
=
operfunc
==
func_std1
||
operfunc
==
func_var1
;
bool
lrange
=
operfunc
==
func_range
;
bool
lmean
=
operfunc
==
func_mean
||
operfunc
==
func_avg
;
bool
lstd
=
operfunc
==
func_std
||
operfunc
==
func_std1
;
bool
lvarstd
=
operfunc
==
func_std
||
operfunc
==
func_var
||
operfunc
==
func_std1
||
operfunc
==
func_var1
;
int
divisor
=
operfunc
==
func_std1
||
operfunc
==
func_var1
;
int
streamID1
=
streamOpenRead
(
cdoStreamName
(
0
));
...
...
@@ -94,11 +103,9 @@ void *Runstat(void *argument)
streamDefVlist
(
streamID2
,
vlistID2
);
int
nvars
=
vlistNvars
(
vlistID1
);
int
nrecords
=
vlistNrecs
(
vlistID1
);
int
maxrecs
=
vlistNrecs
(
vlistID1
);
int
*
recVarID
=
(
int
*
)
Malloc
(
nrecords
*
sizeof
(
int
));
int
*
recLevelID
=
(
int
*
)
Malloc
(
nrecords
*
sizeof
(
int
));
recinfo_t
*
recinfo
=
(
recinfo_t
*
)
Malloc
(
maxrecs
*
sizeof
(
recinfo_t
));
dtlist_type
*
dtlist
=
dtlist_new
();
dtlist_set_stat
(
dtlist
,
timestat_date
);
...
...
@@ -108,7 +115,7 @@ void *Runstat(void *argument)
field_type
***
vars2
=
NULL
,
***
samp1
=
NULL
;
if
(
!
runstat_nomiss
)
samp1
=
(
field_type
***
)
Malloc
((
ndates
+
1
)
*
sizeof
(
field_type
**
));
if
(
lvarstd
)
if
(
lvarstd
||
lrange
)
vars2
=
(
field_type
***
)
Malloc
((
ndates
+
1
)
*
sizeof
(
field_type
**
));
for
(
int
its
=
0
;
its
<
ndates
;
its
++
)
...
...
@@ -116,7 +123,7 @@ void *Runstat(void *argument)
vars1
[
its
]
=
field_malloc
(
vlistID1
,
FIELD_PTR
);
if
(
!
runstat_nomiss
)
samp1
[
its
]
=
field_malloc
(
vlistID1
,
FIELD_PTR
);
if
(
lvarstd
)
if
(
lvarstd
||
lrange
)
vars2
[
its
]
=
field_malloc
(
vlistID1
,
FIELD_PTR
);
}
...
...
@@ -137,25 +144,32 @@ void *Runstat(void *argument)
if
(
tsID
==
0
)
{
rec
VarID
[
recID
]
=
varID
;
rec
LevelID
[
recID
]
=
levelID
;
rec
info
[
recID
]
.
varID
=
varID
;
rec
info
[
recID
].
levelID
=
levelID
;
}
streamReadRecord
(
streamID1
,
vars1
[
tsID
][
varID
][
levelID
].
ptr
,
&
nmiss
);
vars1
[
tsID
][
varID
][
levelID
].
nmiss
=
nmiss
;
field_type
*
pvars1
=
&
vars1
[
tsID
][
varID
][
levelID
];
field_type
*
pvars2
=
vars2
?
&
vars2
[
tsID
][
varID
][
levelID
]
:
NULL
;
int
gridsize
=
pvars1
->
size
;
streamReadRecord
(
streamID1
,
pvars1
->
ptr
,
&
nmiss
);
pvars1
->
nmiss
=
nmiss
;
if
(
lrange
)
{
pvars2
->
nmiss
=
pvars1
->
nmiss
;
for
(
int
i
=
0
;
i
<
gridsize
;
i
++
)
pvars2
->
ptr
[
i
]
=
pvars1
->
ptr
[
i
];
}
if
(
runstat_nomiss
&&
nmiss
>
0
)
cdoAbort
(
"Missing values supported swichted off!"
);
if
(
!
runstat_nomiss
)
{
int
gridsize
=
gridInqSize
(
vars1
[
0
][
varID
][
levelID
].
grid
);
double
missval
=
vars1
[
0
][
varID
][
levelID
].
missval
;
double
missval
=
pvars1
->
missval
;
for
(
int
i
=
0
;
i
<
gridsize
;
i
++
)
if
(
DBL_IS_EQUAL
(
vars1
[
tsID
][
varID
][
levelID
].
ptr
[
i
],
missval
)
)
imask
[
i
]
=
false
;
else
imask
[
i
]
=
true
;
imask
[
i
]
=
!
DBL_IS_EQUAL
(
pvars1
->
ptr
[
i
],
missval
);
for
(
int
i
=
0
;
i
<
gridsize
;
i
++
)
samp1
[
tsID
][
varID
][
levelID
].
ptr
[
i
]
=
(
double
)
imask
[
i
];
...
...
@@ -173,24 +187,35 @@ void *Runstat(void *argument)
if
(
lvarstd
)
{
farmoq
(
&
vars2
[
tsID
][
varID
][
levelID
],
vars1
[
tsID
][
varID
][
levelID
]
);
farmoq
(
p
vars2
,
*
pvars1
);
#if defined(_OPENMP)
#pragma omp parallel for default(none) shared(tsID,vars1,vars2,varID,levelID)
#pragma omp parallel for default(none) shared(tsID,vars1,vars2,varID,levelID
,pvars1
)
#endif
for
(
int
inp
=
0
;
inp
<
tsID
;
inp
++
)
{
farsumq
(
&
vars2
[
inp
][
varID
][
levelID
],
vars1
[
tsID
][
varID
][
levelID
]);
farsum
(
&
vars1
[
inp
][
varID
][
levelID
],
vars1
[
tsID
][
varID
][
levelID
]);
farsumq
(
&
vars2
[
inp
][
varID
][
levelID
],
*
pvars1
);
farsum
(
&
vars1
[
inp
][
varID
][
levelID
],
*
pvars1
);
}
}
else
if
(
lrange
)
{
#if defined(_OPENMP)
#pragma omp parallel for default(none) shared(tsID,vars1,vars2,varID,levelID,pvars1)
#endif
for
(
int
inp
=
0
;
inp
<
tsID
;
inp
++
)
{
farmin
(
&
vars2
[
inp
][
varID
][
levelID
],
*
pvars1
);
farmax
(
&
vars1
[
inp
][
varID
][
levelID
],
*
pvars1
);
}
}
else
{
#if defined(_OPENMP)
#pragma omp parallel for default(none) shared(tsID,vars1,operfunc,varID,levelID)
#pragma omp parallel for default(none) shared(tsID,vars1,operfunc,varID,levelID
,pvars1
)
#endif
for
(
int
inp
=
0
;
inp
<
tsID
;
inp
++
)
{
farfun
(
&
vars1
[
inp
][
varID
][
levelID
],
vars1
[
tsID
][
varID
][
levelID
]
,
operfunc
);
farfun
(
&
vars1
[
inp
][
varID
][
levelID
],
*
p
vars1
,
operfunc
);
}
}
}
...
...
@@ -200,54 +225,66 @@ void *Runstat(void *argument)
while
(
TRUE
)
{
if
(
lmean
)
for
(
varID
=
0
;
varID
<
nvars
;
varID
++
)
{
for
(
int
recID
=
0
;
recID
<
maxrecs
;
recID
++
)
{
int
varID
=
recinfo
[
recID
].
varID
;
int
levelID
=
recinfo
[
recID
].
levelID
;
field_type
*
pvars1
=
&
vars1
[
0
][
varID
][
levelID
];
if
(
vlistInqVarTsteptype
(
vlistID1
,
varID
)
==
TSTEP_CONSTANT
)
continue
;
int
nlevel
=
zaxisInqSize
(
vlistInqVarZaxis
(
vlistID1
,
varID
));
for
(
levelID
=
0
;
levelID
<
nlevel
;
levelID
++
)
{
if
(
runstat_nomiss
)
farcdiv
(
&
vars1
[
0
][
varID
][
levelID
],
(
double
)
ndates
);
else
fardiv
(
&
vars1
[
0
][
varID
][
levelID
],
samp1
[
0
][
varID
][
levelID
]);
}
if
(
runstat_nomiss
)
farcdiv
(
pvars1
,
(
double
)
ndates
);
else
fardiv
(
pvars1
,
samp1
[
0
][
varID
][
levelID
]);
}
else
if
(
lvarstd
)
for
(
varID
=
0
;
varID
<
nvars
;
varID
++
)
{
if
(
vlistInqVarTsteptype
(
vlistID1
,
varID
)
==
TSTEP_CONSTANT
)
continue
;
int
nlevel
=
zaxisInqSize
(
vlistInqVarZaxis
(
vlistID1
,
varID
));
for
(
levelID
=
0
;
levelID
<
nlevel
;
levelID
++
)
{
if
(
runstat_nomiss
)
{
if
(
lstd
)
farcstd
(
&
vars1
[
0
][
varID
][
levelID
],
vars2
[
0
][
varID
][
levelID
],
ndates
,
divisor
);
else
farcvar
(
&
vars1
[
0
][
varID
][
levelID
],
vars2
[
0
][
varID
][
levelID
],
ndates
,
divisor
);
}
else
{
if
(
lstd
)
farstd
(
&
vars1
[
0
][
varID
][
levelID
],
vars2
[
0
][
varID
][
levelID
],
samp1
[
0
][
varID
][
levelID
],
divisor
);
else
farvar
(
&
vars1
[
0
][
varID
][
levelID
],
vars2
[
0
][
varID
][
levelID
],
samp1
[
0
][
varID
][
levelID
],
divisor
);
}
for
(
int
recID
=
0
;
recID
<
maxrecs
;
recID
++
)
{
int
varID
=
recinfo
[
recID
].
varID
;
int
levelID
=
recinfo
[
recID
].
levelID
;
field_type
*
pvars1
=
&
vars1
[
0
][
varID
][
levelID
];
field_type
*
pvars2
=
&
vars2
[
0
][
varID
][
levelID
];
if
(
vlistInqVarTsteptype
(
vlistID1
,
varID
)
==
TSTEP_CONSTANT
)
continue
;
if
(
runstat_nomiss
)
{
if
(
lstd
)
farcstd
(
pvars1
,
*
pvars2
,
ndates
,
divisor
);
else
farcvar
(
pvars1
,
*
pvars2
,
ndates
,
divisor
);
}
else
{
if
(
lstd
)
farstd
(
pvars1
,
*
pvars2
,
samp1
[
0
][
varID
][
levelID
],
divisor
);
else
farvar
(
pvars1
,
*
pvars2
,
samp1
[
0
][
varID
][
levelID
],
divisor
);
}
}
else
if
(
lrange
)
for
(
int
recID
=
0
;
recID
<
maxrecs
;
recID
++
)
{
int
varID
=
recinfo
[
recID
].
varID
;
int
levelID
=
recinfo
[
recID
].
levelID
;
field_type
*
pvars1
=
&
vars1
[
0
][
varID
][
levelID
];
field_type
*
pvars2
=
&
vars2
[
0
][
varID
][
levelID
];
if
(
vlistInqVarTsteptype
(
vlistID1
,
varID
)
==
TSTEP_CONSTANT
)
continue
;
farsub
(
pvars1
,
*
pvars2
);
}
dtlist_stat_taxisDefTimestep
(
dtlist
,
taxisID2
,
ndates
);
streamDefTimestep
(
streamID2
,
otsID
);
for
(
int
recID
=
0
;
recID
<
nrecord
s
;
recID
++
)
for
(
int
recID
=
0
;
recID
<
maxrec
s
;
recID
++
)
{
varID
=
recVarID
[
recID
];
levelID
=
recLevelID
[
recID
];
int
varID
=
recinfo
[
recID
].
varID
;
int
levelID
=
recinfo
[
recID
].
levelID
;
field_type
*
pvars1
=
&
vars1
[
0
][
varID
][
levelID
];
if
(
otsID
&&
vlistInqVarTsteptype
(
vlistID1
,
varID
)
==
TSTEP_CONSTANT
)
continue
;
streamDefRecord
(
streamID2
,
varID
,
levelID
);
streamWriteRecord
(
streamID2
,
vars1
[
0
][
varID
][
levelID
].
ptr
,
vars1
[
0
][
varID
][
levelID
].
nmiss
);
streamWriteRecord
(
streamID2
,
p
vars1
->
ptr
,
p
vars1
->
nmiss
);
}
otsID
++
;
...
...
@@ -257,7 +294,7 @@ void *Runstat(void *argument)
vars1
[
ndates
]
=
vars1
[
0
];
if
(
!
runstat_nomiss
)
samp1
[
ndates
]
=
samp1
[
0
];
if
(
lvarstd
)
if
(
lvarstd
||
lrange
)
vars2
[
ndates
]
=
vars2
[
0
];
for
(
int
inp
=
0
;
inp
<
ndates
;
inp
++
)
...
...
@@ -265,7 +302,7 @@ void *Runstat(void *argument)
vars1
[
inp
]
=
vars1
[
inp
+
1
];
if
(
!
runstat_nomiss
)
samp1
[
inp
]
=
samp1
[
inp
+
1
];
if
(
lvarstd
)
if
(
lvarstd
||
lrange
)
vars2
[
inp
]
=
vars2
[
inp
+
1
];
}
...
...
@@ -278,21 +315,28 @@ void *Runstat(void *argument)
{
streamInqRecord
(
streamID1
,
&
varID
,
&
levelID
);
streamReadRecord
(
streamID1
,
vars1
[
ndates
-
1
][
varID
][
levelID
].
ptr
,
&
nmiss
);
vars1
[
ndates
-
1
][
varID
][
levelID
].
nmiss
=
nmiss
;
field_type
*
pvars1
=
&
vars1
[
ndates
-
1
][
varID
][
levelID
];
field_type
*
pvars2
=
vars2
?
&
vars2
[
ndates
-
1
][
varID
][
levelID
]
:
NULL
;
int
gridsize
=
pvars1
->
size
;
streamReadRecord
(
streamID1
,
pvars1
->
ptr
,
&
nmiss
);
pvars1
->
nmiss
=
nmiss
;
if
(
lrange
)
{
pvars2
->
nmiss
=
pvars1
->
nmiss
;
for
(
int
i
=
0
;
i
<
gridsize
;
i
++
)
pvars2
->
ptr
[
i
]
=
pvars1
->
ptr
[
i
];
}
if
(
runstat_nomiss
&&
nmiss
>
0
)
cdoAbort
(
"Missing values supported swichted off!"
);
if
(
!
runstat_nomiss
)
{
int
gridsize
=
gridInqSize
(
vars1
[
0
][
varID
][
levelID
].
grid
);
double
missval
=
vars1
[
0
][
varID
][
levelID
].
missval
;
double
missval
=
pvars1
->
missval
;
for
(
int
i
=
0
;
i
<
gridsize
;
i
++
)
if
(
DBL_IS_EQUAL
(
vars1
[
ndates
-
1
][
varID
][
levelID
].
ptr
[
i
],
missval
)
)
imask
[
i
]
=
false
;
else
imask
[
i
]
=
true
;
imask
[
i
]
=
!
DBL_IS_EQUAL
(
pvars1
->
ptr
[
i
],
missval
);
for
(
int
i
=
0
;
i
<
gridsize
;
i
++
)
samp1
[
ndates
-
1
][
varID
][
levelID
].
ptr
[
i
]
=
(
double
)
imask
[
i
];
...
...
@@ -310,24 +354,35 @@ void *Runstat(void *argument)
if
(
lvarstd
)
{
farmoq
(
&
vars2
[
ndates
-
1
][
varID
][
levelID
],
vars1
[
ndates
-
1
][
varID
][
levelID
]);
farmoq
(
pvars2
,
*
pvars1
);
#if defined(_OPENMP)
#pragma omp parallel for default(none) shared(ndates,vars1,vars2,varID,levelID,pvars1)
#endif
for
(
int
inp
=
0
;
inp
<
ndates
-
1
;
inp
++
)
{
farsumq
(
&
vars2
[
inp
][
varID
][
levelID
],
*
pvars1
);
farsum
(
&
vars1
[
inp
][
varID
][
levelID
],
*
pvars1
);
}
}
else
if
(
lrange
)
{
#if defined(_OPENMP)
#pragma omp parallel for default(none) shared(ndates,vars1,vars2,varID,levelID)
#pragma omp parallel for default(none) shared(ndates,vars1,vars2,varID,levelID
,pvars1
)
#endif
for
(
int
inp
=
0
;
inp
<
ndates
-
1
;
inp
++
)
{
far
sumq
(
&
vars2
[
inp
][
varID
][
levelID
],
vars1
[
ndates
-
1
][
varID
][
levelID
]
);
far
sum
(
&
vars1
[
inp
][
varID
][
levelID
],
vars1
[
ndates
-
1
][
varID
][
levelID
]
);
far
min
(
&
vars2
[
inp
][
varID
][
levelID
],
*
p
vars1
);
far
max
(
&
vars1
[
inp
][
varID
][
levelID
],
*
p
vars1
);
}
}
else
{
#if defined(_OPENMP)
#pragma omp parallel for default(none) shared(ndates,vars1,varID,levelID,operfunc)
#pragma omp parallel for default(none) shared(ndates,vars1,varID,levelID,operfunc
,pvars1
)
#endif
for
(
int
inp
=
0
;
inp
<
ndates
-
1
;
inp
++
)
{
farfun
(
&
vars1
[
inp
][
varID
][
levelID
],
vars1
[
ndates
-
1
][
varID
][
levelID
]
,
operfunc
);
farfun
(
&
vars1
[
inp
][
varID
][
levelID
],
*
p
vars1
,
operfunc
);
}
}
}
...
...
@@ -339,19 +394,19 @@ void *Runstat(void *argument)
{
field_free
(
vars1
[
its
],
vlistID1
);
if
(
!
runstat_nomiss
)
field_free
(
samp1
[
its
],
vlistID1
);
if
(
lvarstd
)
field_free
(
vars2
[
its
],
vlistID1
);
if
(
lvarstd
||
lrange
)
field_free
(
vars2
[
its
],
vlistID1
);
}
Free
(
vars1
);
if
(
!
runstat_nomiss
)
Free
(
samp1
);
if
(
lvarstd
)
Free
(
vars2
);
if
(
lvarstd
||
lrange
)
Free
(
vars2
);
if
(
recVarID
)
Free
(
recVarID
);
if
(
recLevelID
)
Free
(
recLevelID
);
if
(
imask
)
Free
(
imask
);
if
(
imask
)
Free
(
imask
);
dtlist_delete
(
dtlist
);
Free
(
recinfo
);
streamClose
(
streamID2
);
streamClose
(
streamID1
);
...
...
src/Seasstat.cc
View file @
d2174fdb
...
...
@@ -162,7 +162,7 @@ void *Seasstat(void *argument)
field_type
*
pvars1
=
&
vars1
[
varID
][
levelID
];
field_type
*
pvars2
=
vars2
?
&
vars2
[
varID
][
levelID
]
:
NULL
;
gridsize
=
gridInqSize
(
vlistInqVarGrid
(
vlistID1
,
varID
))
;
gridsize
=
pvars1
->
size
;
if
(
nsets
==
0
)
{
...
...
@@ -170,7 +170,7 @@ void *Seasstat(void *argument)
pvars1
->
nmiss
=
(
size_t
)
nmiss
;
if
(
lrange
)
{
pvars2
->
nmiss
=
(
size_t
)
nmiss
;
pvars2
->
nmiss
=
pvars1
->
nmiss
;
for
(
int
i
=
0
;
i
<
gridsize
;
i
++
)
pvars2
->
ptr
[
i
]
=
pvars1
->
ptr
[
i
];
}
...
...
src/Timselstat.cc
View file @
d2174fdb
...
...
@@ -104,11 +104,11 @@ void *Timselstat(void *argument)
dtlist_set_stat
(
dtlist
,
timestat_date
);
dtlist_set_calendar
(
dtlist
,
taxisInqCalendar
(
taxisID1
));
int
gridsize
=
vlistGridsizeMax
(
vlistID1
);
int
gridsize
max
=
vlistGridsizeMax
(
vlistID1
);
field_type
field
;
field_init
(
&
field
);
field
.
ptr
=
(
double
*
)
Malloc
(
gridsize
*
sizeof
(
double
));
field
.
ptr
=
(
double
*
)
Malloc
(
gridsize
max
*
sizeof
(
double
));
field_type
**
samp1
=
field_malloc
(
vlistID1
,
FIELD_NONE
);
field_type
**
vars1
=
field_malloc
(
vlistID1
,
FIELD_PTR
);
...
...
@@ -161,7 +161,7 @@ void *Timselstat(void *argument)
field_type
*
pvars1
=
&
vars1
[
varID
][
levelID
];
field_type
*
pvars2
=
vars2
?
&
vars2
[
varID
][
levelID
]
:
NULL
;
gridsize
=
gridInqSize
(
vlistInqVarGrid
(
vlistID1
,
varID
))
;
int
gridsize
=
pvars1
->
size
;
if
(
nsets
==
0
)
{
...
...
src/Timstat.cc
View file @
d2174fdb
...
...
@@ -97,7 +97,6 @@ void *Timstat(void *argument)
int
nwpv
;
// number of words per value; real:1 complex:2
char
indate1
[
DATE_LEN
+
1
],
indate2
[
DATE_LEN
+
1
];
double
vfrac
=
1
;
double
missval
;
cdoInitialize
(
argument
);
...
...
@@ -243,8 +242,8 @@ void *Timstat(void *argument)
dtlist_set_stat
(
dtlist
,
timestat_date
);
dtlist_set_calendar
(
dtlist
,
taxisInqCalendar
(
taxisID1
));
int
gridsize
=
vlistGridsizeMax
(
vlistID1
);
if
(
vlistNumber
(
vlistID1
)
!=
CDI_REAL
)
gridsize
*=
2
;
int
gridsize
max
=
vlistGridsizeMax
(
vlistID1
);
if
(
vlistNumber
(
vlistID1
)
!=
CDI_REAL
)
gridsize
max
*=
2
;
int
FIELD_MEMTYPE
=
0
;
if
(
CDO_Memtype
==
MEMTYPE_FLOAT
)
FIELD_MEMTYPE
=
MEMTYPE_FLOAT
;
...
...
@@ -253,9 +252,9 @@ void *Timstat(void *argument)
field_init
(
&
field
);
field
.
memtype
=
FIELD_MEMTYPE
;
if
(
FIELD_MEMTYPE
==
MEMTYPE_FLOAT
)
field
.
ptrf
=
(
float
*
)
Malloc
(
gridsize
*
sizeof
(
float
));
field
.
ptrf
=
(
float
*
)
Malloc
(
gridsize
max
*
sizeof
(
float
));
else
field
.
ptr
=
(
double
*
)
Malloc
(
gridsize
*
sizeof
(
double
));
field
.
ptr
=
(
double
*
)
Malloc
(
gridsize
max
*
sizeof
(
double
));
field_type
**
vars1
=
field_malloc
(
vlistID1
,
FIELD_PTR
);
field_type
**
samp1
=
field_malloc
(
vlistID1
,
FIELD_NONE
);
...
...
@@ -292,7 +291,7 @@ void *Timstat(void *argument)
field_type
*
pvars2
=
vars2
?
&
vars2
[
varID
][
levelID
]
:
NULL
;
nwpv
=
pvars1
->
nwpv
;
gridsize
=
gridInqSize
(
pvars1
->
grid
)
;
int
gridsize
=
pvars1
->
size
;
if
(
nsets
==
0
)
{
...
...
@@ -441,9 +440,9 @@ void *Timstat(void *argument)
if
(
vlistInqVarTsteptype
(
vlistID1
,
varID
)
==
TSTEP_CONSTANT
)
continue
;
nwpv
=
pvars1
->
nwpv
;
gridsize
=
gridInqSize
(
pvars1
->
grid
);
missval
=
pvars1
->
missval
;
int
nwpv
=
pvars1
->
nwpv
;
int
gridsize
=
gridInqSize
(
pvars1
->
grid
);
double
missval
=
pvars1
->
missval
;
if
(
samp1
[
varID
][
levelID
].
ptr
)
{
int
irun
=
0
;
...
...
@@ -492,7 +491,7 @@ void *Timstat(void *argument)
if
(
samp1
[
varID
][
levelID
].
ptr
)
sampptr
=
samp1
[
varID
][
levelID
].
ptr
;
else
{
gridsize
=
gridInqSize
(
pvars1
->
grid
)
;
int
gridsize
=
pvars1
->
size
;
for
(
int
i
=
0
;
i
<
gridsize
;
++
i
)
sampptr
[
i
]
=
nsets
;
}
...
...
src/XTimstat.cc
View file @
d2174fdb
...
...
@@ -158,7 +158,6 @@ void *XTimstat(void *argument)
{
enum
{
HOUR_LEN
=
4
,
DAY_LEN
=
6
,
MON_LEN
=
8
,
YEAR_LEN
=
10
};
int
timestat_date
=
TIMESTAT_MEAN
;
int
gridsize
;
int
vdate
=
0
,
vtime
=
0
;
int
vdate0
=
0
,
vtime0
=
0
;
int
varID
;
...
...
@@ -169,7 +168,6 @@ void *XTimstat(void *argument)
int
nwpv
;
// number of words per value; real:1 complex:2
char
indate1
[
DATE_LEN
+
1
],
indate2
[
DATE_LEN
+
1
];
double
vfrac
=
1
;
double
missval
;
cdoInitialize
(
argument
);
...
...
@@ -288,8 +286,8 @@ void *XTimstat(void *argument)
dtlist_set_stat
(
dtlist
,
timestat_date
);
dtlist_set_calendar
(
dtlist
,
taxisInqCalendar
(
taxisID1
));
gridsize
=
vlistGridsizeMax
(
vlistID1
);
if
(
vlistNumber
(
vlistID1
)
!=
CDI_REAL
)
gridsize
*=
2
;
int
gridsize
max
=
vlistGridsizeMax
(
vlistID1
);
if
(
vlistNumber
(
vlistID1
)
!=
CDI_REAL
)
gridsize
max
*=
2
;
int
FIELD_MEMTYPE
=
0
;
if
(
CDO_Memtype
==
MEMTYPE_FLOAT
)
FIELD_MEMTYPE
=
FIELD_FLT
;
...
...
@@ -388,10 +386,7 @@ void *XTimstat(void *argument)
samp1
[
varID
][
levelID
].
ptr
=
(
double
*
)
malloc
(
nwpv
*
gridsize
*
sizeof
(
double
));
for
(
int
i
=
0
;
i
<
nwpv
*
gridsize
;
i
++
)
if
(
DBL_IS_EQUAL
(
pvars1
->
ptr
[
i
],
pvars1
->
missval
)
)
samp1
[
varID
][
levelID
].
ptr
[
i
]
=
0
;
else
samp1
[
varID
][
levelID
].
ptr
[
i
]
=
1
;
samp1
[
varID
][
levelID
].
ptr
[
i
]
=
!
DBL_IS_EQUAL
(
pvars1
->
ptr
[
i
],
pvars1
->
missval
);
}
}
}
...
...
@@ -521,8 +516,8 @@ void *XTimstat(void *argument)
if
(
vlistInqVarTsteptype
(
vlistID1
,
varID
)
==
TSTEP_CONSTANT
)
continue
;
nwpv
=
pvars1
->
nwpv
;
gridsize
=
gridInqSize
(
pvars1
->
grid
)
;
missval
=
pvars1
->
missval
;
int
gridsize
=
pvars1
->
size
;
double
missval
=
pvars1
->
missval
;
if
(
samp1
[
varID
][
levelID
].
ptr
)
{
int
irun
=
0
;
...
...
src/modules.cc
View file @
d2174fdb
...
...
@@ -402,7 +402,7 @@ void *Samplegrid(void *argument); // "samplegrid", "subgrid"
#define RhopotOperators {"rhopot"}
#define RotuvOperators {"rotuvb"}
#define RunpctlOperators {"runpctl"}
#define RunstatOperators {"runmin", "runmax", "runsum", "runmean", "runavg", "runstd", "runstd1", "runvar", "runvar1"}
#define RunstatOperators {
"runrange",
"runmin", "runmax", "runsum", "runmean", "runavg", "runstd", "runstd1", "runvar", "runvar1"}
#define SamplegridiconOperators {"samplegridicon"}
#define SeascountOperators {"seascount"}
#define SeaspctlOperators {"seaspctl"}
...
...
test/Runstat.test.in
View file @
d2174fdb
#! @BASH@
echo 1..
9
# Number of tests to be executed.
echo 1..
10
# Number of tests to be executed.
#
test -n "$CDO" || CDO=cdo
test -n "$DATAPATH" || DATAPATH=./data
...
...
@@ -7,7 +7,7 @@ test -n "$DATAPATH" || DATAPATH=./data
CDOOUT=cout$$
CDOERR=cerr$$
TYPE=run
STATS="min max sum avg mean std std1 var var1"
STATS="min max
range
sum avg mean std std1 var var1"
NTEST=1
#
IFILE=$DATAPATH/ts_mm_5years
...
...
test/data/Makefile.am
View file @
d2174fdb
...
...
@@ -10,7 +10,7 @@ EOF_REF = eval_ref eof_ref pcoeff00000
YMONSTAT_REF
=
ymonmin_ref ymonmax_ref ymonsum_ref ymonavg_ref ymonmean_ref ymonstd_ref ymonstd1_ref ymonvar_ref ymonvar1_ref
YSEASSTAT_REF
=
yseasmin_ref yseasmax_ref yseassum_ref yseasavg_ref yseasmean_ref yseasstd_ref yseasstd1_ref yseasvar_ref yseasvar1_ref
SEASSTAT_REF
=
seasmin_ref seasmax_ref seassum_ref seasavg_ref seasmean_ref seasstd_ref seasstd1_ref seasvar_ref seasvar1_ref seasrange_ref
RUNSTAT_REF
=
runmin_ref runmax_ref runsum_ref runavg_ref runmean_ref runstd_ref runstd1_ref runvar_ref runvar1_ref
RUNSTAT_REF
=
runmin_ref runmax_ref runsum_ref runavg_ref runmean_ref runstd_ref runstd1_ref runvar_ref runvar1_ref
runrange_ref
TIMSTAT_REF
=
timmin_ref timmax_ref timsum_ref timavg_ref timmean_ref timstd_ref timstd1_ref timvar_ref timvar1_ref timrange_ref
YEARSTAT_REF
=
yearmin_ref yearmax_ref yearsum_ref yearavg_ref yearmean_ref yearstd_ref yearstd1_ref yearvar_ref yearvar1_ref yearrange_ref
MONSTAT_REF
=
monmin_ref monmax_ref monsum_ref monavg_ref monmean_ref monstd_ref monstd1_ref monvar_ref monvar1_ref monrange_ref
...
...
test/data/Makefile.in
View file @
d2174fdb
...
...
@@ -300,7 +300,7 @@ EOF_REF = eval_ref eof_ref pcoeff00000
YMONSTAT_REF
=
ymonmin_ref ymonmax_ref ymonsum_ref ymonavg_ref ymonmean_ref ymonstd_ref ymonstd1_ref ymonvar_ref ymonvar1_ref
YSEASSTAT_REF
=
yseasmin_ref yseasmax_ref yseassum_ref yseasavg_ref yseasmean_ref yseasstd_ref yseasstd1_ref yseasvar_ref yseasvar1_ref
SEASSTAT_REF
=
seasmin_ref seasmax_ref seassum_ref seasavg_ref seasmean_ref seasstd_ref seasstd1_ref seasvar_ref seasvar1_ref seasrange_ref
RUNSTAT_REF
=
runmin_ref runmax_ref runsum_ref runavg_ref runmean_ref runstd_ref runstd1_ref runvar_ref runvar1_ref
RUNSTAT_REF
=
runmin_ref runmax_ref runsum_ref runavg_ref runmean_ref runstd_ref runstd1_ref runvar_ref runvar1_ref
runrange_ref
TIMSTAT_REF
=
timmin_ref timmax_ref timsum_ref timavg_ref timmean_ref timstd_ref timstd1_ref timvar_ref timvar1_ref timrange_ref
YEARSTAT_REF
=
yearmin_ref yearmax_ref yearsum_ref yearavg_ref yearmean_ref yearstd_ref yearstd1_ref yearvar_ref yearvar1_ref yearrange_ref
MONSTAT_REF
=
monmin_ref monmax_ref monsum_ref monavg_ref monmean_ref monstd_ref monstd1_ref monvar_ref monvar1_ref monrange_ref
...
...
test/data/gen_refdata.sh
View file @
d2174fdb
...
...
@@ -22,7 +22,6 @@ $CDO $FORMAT -settime,12:00:00 -setday,15 -monmean $IFILE $OFILE
$CDO
selyear,1991
$IFILE
ts_1d_1year
#
STATS
=
"min max sum avg mean std std1 var var1 range"
STATS
=
"range"
#
IFILE
=
ts_mm_5years
for
STAT
in
$STATS
;
do
...
...
@@ -30,9 +29,9 @@ for STAT in $STATS; do