Skip to content
GitLab
Menu
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
d093d233
Commit
d093d233
authored
Jul 27, 2016
by
Uwe Schulzweida
Browse files
Merge declaration and definition.
parent
8fc44741
Changes
10
Hide whitespace changes
Inline
Side-by-side
src/EOFs.c
View file @
d093d233
...
...
@@ -171,7 +171,7 @@ void *EOFs(void * argument)
int
nlevs
=
0
;
int
nmiss
;
int
tsID
;
int
varID
,
recID
,
levelID
;
int
varID
,
levelID
;
int
nts
=
0
;
int
n
=
0
;
int
grid_space
=
0
,
time_space
=
0
;
...
...
@@ -365,7 +365,7 @@ void *EOFs(void * argument)
nrecs
=
streamInqTimestep
(
streamID1
,
tsID
);
if
(
nrecs
==
0
)
break
;
for
(
recID
=
0
;
recID
<
nrecs
;
recID
++
)
for
(
int
recID
=
0
;
recID
<
nrecs
;
recID
++
)
{
streamInqRecord
(
streamID1
,
&
varID
,
&
levelID
);
streamReadRecord
(
streamID1
,
in
,
&
nmiss
);
...
...
src/Echam5ini.c
View file @
d093d233
...
...
@@ -1427,10 +1427,6 @@ void export_e5res(const char *filename, VAR *vars, int nvars)
void
*
Echam5ini
(
void
*
argument
)
{
int
operatorID
;
int
operfunc
;
int
IMPORT_E5ML
,
IMPORT_E5RES
;
int
EXPORT_E5ML
,
EXPORT_E5RES
;
int
streamID1
,
streamID2
=
CDI_UNDEFID
;
int
nrecs
=
0
;
int
recID
,
varID
,
levelID
;
...
...
@@ -1442,13 +1438,13 @@ void *Echam5ini(void *argument)
cdoInitialize
(
argument
);
IMPORT_E5ML
=
cdoOperatorAdd
(
"import_e5ml"
,
func_read
,
0
,
NULL
);
IMPORT_E5RES
=
cdoOperatorAdd
(
"import_e5res"
,
func_read
,
0
,
NULL
);
EXPORT_E5ML
=
cdoOperatorAdd
(
"export_e5ml"
,
func_write
,
0
,
NULL
);
EXPORT_E5RES
=
cdoOperatorAdd
(
"export_e5res"
,
func_write
,
0
,
NULL
);
int
IMPORT_E5ML
=
cdoOperatorAdd
(
"import_e5ml"
,
func_read
,
0
,
NULL
);
int
IMPORT_E5RES
=
cdoOperatorAdd
(
"import_e5res"
,
func_read
,
0
,
NULL
);
int
EXPORT_E5ML
=
cdoOperatorAdd
(
"export_e5ml"
,
func_write
,
0
,
NULL
);
int
EXPORT_E5RES
=
cdoOperatorAdd
(
"export_e5res"
,
func_write
,
0
,
NULL
);
operatorID
=
cdoOperatorID
();
operfunc
=
cdoOperatorF1
(
operatorID
);
int
operatorID
=
cdoOperatorID
();
int
operfunc
=
cdoOperatorF1
(
operatorID
);
if
(
operatorID
==
EXPORT_E5ML
&&
processSelf
()
!=
0
)
cdoAbort
(
"This operator can't be linked with other operators!"
);
...
...
src/Enlarge.c
View file @
d093d233
...
...
@@ -29,16 +29,8 @@
void
*
Enlarge
(
void
*
argument
)
{
int
i
,
index
;
int
recID
,
nrecs
;
int
varID
,
levelID
;
int
nmiss
;
int
gridsize1
;
int
gridID1
;
int
xsize1
,
ysize1
;
int
ix
,
iy
;
int
linfo
=
TRUE
;
double
missval
;
int
nrecs
;
bool
linfo
=
true
;
cdoInitialize
(
argument
);
...
...
@@ -65,7 +57,7 @@ void *Enlarge(void *argument)
cdoAbort
(
"Gridsize of input stream is greater than new gridsize!"
);
int
ngrids
=
vlistNgrids
(
vlistID1
);
for
(
index
=
0
;
index
<
ngrids
;
index
++
)
for
(
int
index
=
0
;
index
<
ngrids
;
index
++
)
{
vlistChangeGridIndex
(
vlistID2
,
index
,
gridID2
);
}
...
...
@@ -84,16 +76,17 @@ void *Enlarge(void *argument)
streamDefTimestep
(
streamID2
,
tsID
);
for
(
recID
=
0
;
recID
<
nrecs
;
recID
++
)
for
(
int
recID
=
0
;
recID
<
nrecs
;
recID
++
)
{
int
varID
,
levelID
,
nmiss
;
streamInqRecord
(
streamID1
,
&
varID
,
&
levelID
);
streamReadRecord
(
streamID1
,
array1
,
&
nmiss
);
missval
=
vlistInqVarMissval
(
vlistID1
,
varID
);
gridID1
=
vlistInqVarGrid
(
vlistID1
,
varID
);
xsize1
=
gridInqXsize
(
gridID1
);
ysize1
=
gridInqYsize
(
gridID1
);
gridsize1
=
gridInqSize
(
gridID1
);
double
missval
=
vlistInqVarMissval
(
vlistID1
,
varID
);
int
gridID1
=
vlistInqVarGrid
(
vlistID1
,
varID
);
int
xsize1
=
gridInqXsize
(
gridID1
);
int
ysize1
=
gridInqYsize
(
gridID1
);
int
gridsize1
=
gridInqSize
(
gridID1
);
if
(
xsize1
==
0
)
xsize1
=
1
;
if
(
ysize1
==
0
)
ysize1
=
1
;
...
...
@@ -104,11 +97,11 @@ void *Enlarge(void *argument)
if
(
linfo
)
{
cdoPrint
(
"Enlarge zonal"
);
linfo
=
FALSE
;
linfo
=
false
;
}
for
(
iy
=
0
;
iy
<
ysize2
;
iy
++
)
for
(
ix
=
0
;
ix
<
xsize2
;
ix
++
)
for
(
int
iy
=
0
;
iy
<
ysize2
;
iy
++
)
for
(
int
ix
=
0
;
ix
<
xsize2
;
ix
++
)
array2
[
ix
+
iy
*
xsize2
]
=
array1
[
iy
];
if
(
nmiss
)
nmiss
*=
xsize2
;
...
...
@@ -118,11 +111,11 @@ void *Enlarge(void *argument)
if
(
linfo
)
{
cdoPrint
(
"Enlarge meridional"
);
linfo
=
FALSE
;
linfo
=
false
;
}
for
(
iy
=
0
;
iy
<
ysize2
;
iy
++
)
for
(
ix
=
0
;
ix
<
xsize2
;
ix
++
)
for
(
int
iy
=
0
;
iy
<
ysize2
;
iy
++
)
for
(
int
ix
=
0
;
ix
<
xsize2
;
ix
++
)
array2
[
ix
+
iy
*
xsize2
]
=
array1
[
ix
];
if
(
nmiss
)
nmiss
*=
ysize2
;
...
...
@@ -130,7 +123,7 @@ void *Enlarge(void *argument)
else
{
memcpy
(
array2
,
array1
,
gridsize1
*
sizeof
(
double
));
for
(
i
=
gridsize1
;
i
<
gridsize2
;
i
++
)
for
(
int
i
=
gridsize1
;
i
<
gridsize2
;
i
++
)
{
array2
[
i
]
=
array1
[
gridsize1
-
1
];
}
...
...
src/Enlargegrid.c
View file @
d093d233
...
...
@@ -31,37 +31,30 @@
static
void
gen_index
(
int
gridID1
,
int
gridID2
,
int
*
index
)
{
int
nlat1
,
nlon1
;
int
nlat2
,
nlon2
;
int
gridtype1
,
gridtype2
;
int
gridsize2
;
int
i
,
j
,
k
,
i1
,
i2
;
int
*
xindex
=
NULL
,
*
yindex
=
NULL
;
double
*
xvals1
=
NULL
,
*
yvals1
=
NULL
;
double
*
xvals2
=
NULL
,
*
yvals2
=
NULL
;
int
i1
;
gridtype1
=
gridInqType
(
gridID1
);
gridtype2
=
gridInqType
(
gridID2
);
int
gridtype1
=
gridInqType
(
gridID1
);
int
gridtype2
=
gridInqType
(
gridID2
);
gridsize2
=
gridInqSize
(
gridID2
);
int
gridsize2
=
gridInqSize
(
gridID2
);
if
(
gridtype1
!=
gridtype2
)
cdoAbort
(
"Input streams have different grid types!"
);
if
(
index
==
NULL
)
cdoAbort
(
"Internal problem, index not allocated!"
);
for
(
i
=
0
;
i
<
gridsize2
;
i
++
)
index
[
i
]
=
-
1
;
for
(
int
i
=
0
;
i
<
gridsize2
;
i
++
)
index
[
i
]
=
-
1
;
if
(
gridtype1
==
GRID_LONLAT
||
gridtype1
==
GRID_GAUSSIAN
)
{
if
(
gridIsRotated
(
gridID1
)
)
cdoAbort
(
"Rotated grids unsupported!"
);
nlon1
=
gridInqXsize
(
gridID1
);
nlat1
=
gridInqYsize
(
gridID1
);
int
nlon1
=
gridInqXsize
(
gridID1
);
int
nlat1
=
gridInqYsize
(
gridID1
);
nlon2
=
gridInqXsize
(
gridID2
);
nlat2
=
gridInqYsize
(
gridID2
);
int
nlon2
=
gridInqXsize
(
gridID2
);
int
nlat2
=
gridInqYsize
(
gridID2
);
if
(
!
(
gridInqXvals
(
gridID1
,
NULL
)
&&
gridInqYvals
(
gridID1
,
NULL
))
)
cdoAbort
(
"Grid 1 has no values!"
);
...
...
@@ -69,13 +62,13 @@ void gen_index(int gridID1, int gridID2, int *index)
if
(
!
(
gridInqXvals
(
gridID2
,
NULL
)
&&
gridInqYvals
(
gridID2
,
NULL
))
)
cdoAbort
(
"Grid 2 has no values!"
);
xvals1
=
(
double
*
)
Malloc
(
nlon1
*
sizeof
(
double
));
yvals1
=
(
double
*
)
Malloc
(
nlat1
*
sizeof
(
double
));
xvals2
=
(
double
*
)
Malloc
(
nlon2
*
sizeof
(
double
));
yvals2
=
(
double
*
)
Malloc
(
nlat2
*
sizeof
(
double
));
double
*
xvals1
=
(
double
*
)
Malloc
(
nlon1
*
sizeof
(
double
));
double
*
yvals1
=
(
double
*
)
Malloc
(
nlat1
*
sizeof
(
double
));
double
*
xvals2
=
(
double
*
)
Malloc
(
nlon2
*
sizeof
(
double
));
double
*
yvals2
=
(
double
*
)
Malloc
(
nlat2
*
sizeof
(
double
));
xindex
=
(
int
*
)
Malloc
(
nlon2
*
sizeof
(
int
));
yindex
=
(
int
*
)
Malloc
(
nlat2
*
sizeof
(
int
));
int
*
xindex
=
(
int
*
)
Malloc
(
nlon2
*
sizeof
(
int
));
int
*
yindex
=
(
int
*
)
Malloc
(
nlat2
*
sizeof
(
int
));
gridInqXvals
(
gridID1
,
xvals1
);
gridInqYvals
(
gridID1
,
yvals1
);
...
...
@@ -101,7 +94,7 @@ void gen_index(int gridID1, int gridID2, int *index)
grid_to_degree
(
units
,
nlat2
,
yvals2
,
"grid2 center lat"
);
}
for
(
i2
=
0
;
i2
<
nlat2
;
i2
++
)
for
(
int
i2
=
0
;
i2
<
nlat2
;
i2
++
)
{
for
(
i1
=
0
;
i1
<
nlat1
;
i1
++
)
if
(
fabs
(
yvals2
[
i2
]
-
yvals1
[
i1
])
<
0
.
001
)
break
;
...
...
@@ -112,7 +105,7 @@ void gen_index(int gridID1, int gridID2, int *index)
yindex
[
i2
]
=
i1
;
}
for
(
i2
=
0
;
i2
<
nlon2
;
i2
++
)
for
(
int
i2
=
0
;
i2
<
nlon2
;
i2
++
)
{
for
(
i1
=
0
;
i1
<
nlon1
;
i1
++
)
if
(
fabs
(
xvals2
[
i2
]
-
xvals1
[
i1
])
<
0
.
001
)
break
;
...
...
@@ -143,9 +136,9 @@ void gen_index(int gridID1, int gridID2, int *index)
for ( i2 = 0; i2 < nlat2; i2++ )
printf("y %d %d\n", i2, yindex[i2]);
*/
k
=
0
;
for
(
j
=
0
;
j
<
nlat2
;
j
++
)
for
(
i
=
0
;
i
<
nlon2
;
i
++
)
int
k
=
0
;
for
(
int
j
=
0
;
j
<
nlat2
;
j
++
)
for
(
int
i
=
0
;
i
<
nlon2
;
i
++
)
{
if
(
xindex
[
i
]
==
-
1
||
yindex
[
j
]
==
-
1
)
index
[
k
++
]
=
-
1
;
...
...
@@ -168,13 +161,7 @@ void gen_index(int gridID1, int gridID2, int *index)
void
*
Enlargegrid
(
void
*
argument
)
{
int
varID
;
int
nrecs
=
0
;
int
recID
,
levelID
;
int
nmiss1
,
nmiss2
;
int
index
;
int
i
;
double
missval1
;
cdoInitialize
(
argument
);
...
...
@@ -191,7 +178,7 @@ void *Enlargegrid(void *argument)
int
taxisID2
=
taxisDuplicate
(
taxisID1
);
int
ndiffgrids
=
0
;
for
(
index
=
1
;
index
<
vlistNgrids
(
vlistID1
);
index
++
)
for
(
int
index
=
1
;
index
<
vlistNgrids
(
vlistID1
);
index
++
)
if
(
vlistGrid
(
vlistID1
,
0
)
!=
vlistGrid
(
vlistID1
,
index
)
)
ndiffgrids
++
;
...
...
@@ -211,7 +198,7 @@ void *Enlargegrid(void *argument)
int
vlistID2
=
vlistDuplicate
(
vlistID1
);
int
ngrids
=
vlistNgrids
(
vlistID1
);
for
(
index
=
0
;
index
<
ngrids
;
index
++
)
for
(
int
index
=
0
;
index
<
ngrids
;
index
++
)
{
vlistChangeGridIndex
(
vlistID2
,
index
,
gridID2
);
}
...
...
@@ -228,20 +215,21 @@ void *Enlargegrid(void *argument)
streamDefTimestep
(
streamID2
,
tsID
);
for
(
recID
=
0
;
recID
<
nrecs
;
recID
++
)
for
(
int
recID
=
0
;
recID
<
nrecs
;
recID
++
)
{
int
varID
,
levelID
,
nmiss1
;
streamInqRecord
(
streamID1
,
&
varID
,
&
levelID
);
streamReadRecord
(
streamID1
,
array1
,
&
nmiss1
);
missval1
=
vlistInqVarMissval
(
vlistID1
,
varID
);
double
missval1
=
vlistInqVarMissval
(
vlistID1
,
varID
);
for
(
i
=
0
;
i
<
gridsize2
;
i
++
)
array2
[
i
]
=
missval1
;
for
(
i
=
0
;
i
<
gridsize1
;
i
++
)
for
(
int
i
=
0
;
i
<
gridsize2
;
i
++
)
array2
[
i
]
=
missval1
;
for
(
int
i
=
0
;
i
<
gridsize1
;
i
++
)
if
(
gindex
[
i
]
>=
0
)
array2
[
gindex
[
i
]]
=
array1
[
i
];
nmiss2
=
0
;
for
(
i
=
0
;
i
<
gridsize2
;
i
++
)
int
nmiss2
=
0
;
for
(
int
i
=
0
;
i
<
gridsize2
;
i
++
)
if
(
DBL_IS_EQUAL
(
array2
[
i
],
missval1
)
)
nmiss2
++
;
streamDefRecord
(
streamID2
,
varID
,
levelID
);
...
...
src/Ensstat.c
View file @
d093d233
...
...
@@ -40,14 +40,8 @@
void
*
Ensstat
(
void
*
argument
)
{
int
i
;
int
varID
=
0
,
recID
;
int
gridID
;
int
nrecs
,
nrecs0
;
int
levelID
=
0
;
int
streamID
=
0
;
int
nrecs0
;
int
nmiss
;
double
missval
;
typedef
struct
{
int
streamID
;
...
...
@@ -103,7 +97,7 @@ void *Ensstat(void *argument)
ens_file_t
*
ef
=
(
ens_file_t
*
)
Malloc
(
nfiles
*
sizeof
(
ens_file_t
));
field_t
*
field
=
(
field_t
*
)
Malloc
(
ompNumThreads
*
sizeof
(
field_t
));
for
(
i
=
0
;
i
<
ompNumThreads
;
i
++
)
for
(
int
i
=
0
;
i
<
ompNumThreads
;
i
++
)
{
field_init
(
&
field
[
i
]);
field
[
i
].
size
=
nfiles
;
...
...
@@ -140,12 +134,12 @@ void *Ensstat(void *argument)
if
(
count_data
)
{
count2
=
(
double
*
)
Malloc
(
gridsize
*
sizeof
(
double
));
for
(
varID
=
0
;
varID
<
nvars
;
++
varID
)
for
(
int
varID
=
0
;
varID
<
nvars
;
++
varID
)
{
char
name
[
CDI_MAX_NAME
];
vlistInqVarName
(
vlistID2
,
varID
,
name
);
strcat
(
name
,
"_count"
);
gridID
=
vlistInqVarGrid
(
vlistID2
,
varID
);
int
gridID
=
vlistInqVarGrid
(
vlistID2
,
varID
);
int
zaxisID
=
vlistInqVarZaxis
(
vlistID2
,
varID
);
int
tsteptype
=
vlistInqVarTsteptype
(
vlistID2
,
varID
);
int
cvarID
=
vlistDefVar
(
vlistID2
,
gridID
,
zaxisID
,
tsteptype
);
...
...
@@ -165,8 +159,8 @@ void *Ensstat(void *argument)
nrecs0
=
streamInqTimestep
(
ef
[
0
].
streamID
,
tsID
);
for
(
int
fileID
=
1
;
fileID
<
nfiles
;
fileID
++
)
{
streamID
=
ef
[
fileID
].
streamID
;
nrecs
=
streamInqTimestep
(
streamID
,
tsID
);
int
streamID
=
ef
[
fileID
].
streamID
;
int
nrecs
=
streamInqTimestep
(
streamID
,
tsID
);
if
(
nrecs
!=
nrecs0
)
{
if
(
nrecs
==
0
)
...
...
@@ -183,30 +177,30 @@ void *Ensstat(void *argument)
streamDefTimestep
(
streamID2
,
tsID
);
}
for
(
recID
=
0
;
recID
<
nrecs0
;
recID
++
)
for
(
int
recID
=
0
;
recID
<
nrecs0
;
recID
++
)
{
int
varID
=
0
,
levelID
;
#if defined(_OPENMP)
#pragma omp parallel for default(none) shared(ef, nfiles) \
private(streamID, nmiss) \
lastprivate(varID, levelID)
#pragma omp parallel for default(none) shared(ef, nfiles) lastprivate(varID, levelID)
#endif
for
(
int
fileID
=
0
;
fileID
<
nfiles
;
fileID
++
)
{
streamID
=
ef
[
fileID
].
streamID
;
int
nmiss
;
int
streamID
=
ef
[
fileID
].
streamID
;
streamInqRecord
(
streamID
,
&
varID
,
&
levelID
);
streamReadRecord
(
streamID
,
ef
[
fileID
].
array
,
&
nmiss
);
ef
[
fileID
].
missval
=
vlistInqVarMissval
(
ef
[
fileID
].
vlistID
,
varID
);
}
gridID
=
vlistInqVarGrid
(
vlistID1
,
varID
);
int
gridID
=
vlistInqVarGrid
(
vlistID1
,
varID
);
gridsize
=
gridInqSize
(
gridID
);
missval
=
vlistInqVarMissval
(
vlistID1
,
varID
);
double
missval
=
vlistInqVarMissval
(
vlistID1
,
varID
);
nmiss
=
0
;
#if defined(_OPENMP)
#pragma omp parallel for default(shared)
#endif
for
(
i
=
0
;
i
<
gridsize
;
++
i
)
for
(
int
i
=
0
;
i
<
gridsize
;
++
i
)
{
int
ompthID
=
cdo_omp_get_thread_num
();
...
...
@@ -264,7 +258,7 @@ void *Ensstat(void *argument)
if
(
array2
)
Free
(
array2
);
if
(
count2
)
Free
(
count2
);
for
(
i
=
0
;
i
<
ompNumThreads
;
i
++
)
for
(
int
i
=
0
;
i
<
ompNumThreads
;
i
++
)
{
if
(
field
[
i
].
ptr
)
Free
(
field
[
i
].
ptr
);
if
(
field
[
i
].
weight
)
Free
(
field
[
i
].
weight
);
...
...
src/Ensstat3.c
View file @
d093d233
...
...
@@ -51,33 +51,23 @@ double roc_curve_integrate(const double **roc, const int n);
void
*
Ensstat3
(
void
*
argument
)
{
int
operatorID
;
int
operfunc
,
datafunc
;
int
i
,
j
;
int
nvars
,
nbins
,
nrecs
=
0
,
nrecs0
,
nmiss
,
nens
,
nfiles
;
int
nrecs
=
0
,
nrecs0
,
nmiss
;
int
cum
;
int
chksum
;
// for check of histogram population
int
levelID
,
varID
,
recID
,
tsID
,
binID
=
0
;
int
gridsize
=
0
;
int
levelID
,
varID
,
binID
=
0
;
int
vlistID
;
int
gridID
,
gridID2
;
int
have_miss
=
0
;
int
streamID
=
0
,
streamID2
=
0
;
int
vlistID
,
vlistID1
,
vlistID2
;
int
taxisID1
,
taxisID2
;
int
zaxisID2
;
int
*
varID2
;
int
time_mode
;
int
**
array2
=
NULL
;
int
**
ctg_tab
=
NULL
,
*
hist
=
NULL
;
// contingency table and histogram
double
missval
;
double
*
levs
;
double
*
dat
;
// pointer to ensemble data for ROC
double
*
uThresh
=
NULL
,
*
lThresh
=
NULL
;
// thresholds for histograms
double
**
roc
=
NULL
;
// receiver operating characteristics table
double
val
;
int
ival
;
field_t
*
field
;
const
char
*
ofilename
;
typedef
struct
{
...
...
@@ -85,7 +75,6 @@ void *Ensstat3(void *argument)
int
vlistID
;
double
*
array
;
}
ens_file_t
;
ens_file_t
*
ef
=
NULL
;
cdoInitialize
(
argument
);
...
...
@@ -93,35 +82,35 @@ void *Ensstat3(void *argument)
cdoOperatorAdd
(
"ensrkhist_space"
,
func_rank
,
space_data
,
NULL
);
cdoOperatorAdd
(
"ensrkhist_time"
,
func_rank
,
time_data
,
NULL
);
operatorID
=
cdoOperatorID
();
operfunc
=
cdoOperatorF1
(
operatorID
);
datafunc
=
cdoOperatorF2
(
operatorID
);
int
operatorID
=
cdoOperatorID
();
int
operfunc
=
cdoOperatorF1
(
operatorID
);
int
datafunc
=
cdoOperatorF2
(
operatorID
);
int
nbins
=
0
;
if
(
operfunc
==
func_roc
)
{
operatorInputArg
(
"Number of eigen functions to write out"
);
nbins
=
parameter2int
(
operatorArgv
()[
0
]);
nbins
=
parameter2int
(
operatorArgv
()[
0
]);
}
nfiles
=
cdoStreamCnt
()
-
1
;
nens
=
nfiles
-
1
;
int
nfiles
=
cdoStreamCnt
()
-
1
;
int
nens
=
nfiles
-
1
;
if
(
cdoVerbose
)
cdoPrint
(
"Ensemble over %d files."
,
nfiles
);
ofilename
=
cdoStreamName
(
nfiles
)
->
args
;
const
char
*
ofilename
=
cdoStreamName
(
nfiles
)
->
args
;
if
(
!
cdoOverwriteMode
&&
fileExists
(
ofilename
)
&&
!
userFileOverwrite
(
ofilename
)
)
cdoAbort
(
"Outputfile %s already exists!"
,
ofilename
);
ef
=
(
ens_file_t
*
)
Malloc
(
nfiles
*
sizeof
(
ens_file_t
));
ens_file_t
*
ef
=
(
ens_file_t
*
)
Malloc
(
nfiles
*
sizeof
(
ens_file_t
));
/* *************************************************** */
/* should each thread be allocating memory locally???? */
/* ("first touch strategy") */
/* --> #pragma omp parallel for ... */
/* *************************************************** */
field
=
(
field_t
*
)
Malloc
(
ompNumThreads
*
sizeof
(
field_t
));
field
_t
*
field
=
(
field_t
*
)
Malloc
(
ompNumThreads
*
sizeof
(
field_t
));
for
(
i
=
0
;
i
<
ompNumThreads
;
i
++
)
{
field_init
(
&
field
[
i
]);
...
...
@@ -146,19 +135,19 @@ void *Ensstat3(void *argument)
for
(
int
fileID
=
1
;
fileID
<
nfiles
;
fileID
++
)
vlistCompare
(
ef
[
0
].
vlistID
,
ef
[
fileID
].
vlistID
,
CMP_ALL
);
vlistID1
=
ef
[
0
].
vlistID
;
vlistID2
=
vlistCreate
();
nvars
=
vlistNvars
(
vlistID1
);
varID2
=
(
int
*
)
Malloc
(
nvars
*
sizeof
(
int
));
int
vlistID1
=
ef
[
0
].
vlistID
;
int
vlistID2
=
vlistCreate
();
int
nvars
=
vlistNvars
(
vlistID1
);
int
*
varID2
=
(
int
*
)
Malloc
(
nvars
*
sizeof
(
int
));
levs
=
(
double
*
)
Calloc
(
nfiles
,
sizeof
(
double
));
zaxisID2
=
zaxisCreate
(
ZAXIS_GENERIC
,
nfiles
);
double
*
levs
=
(
double
*
)
Calloc
(
nfiles
,
sizeof
(
double
));
int
zaxisID2
=
zaxisCreate
(
ZAXIS_GENERIC
,
nfiles
);
for
(
i
=
0
;
i
<
nfiles
;
i
++
)
levs
[
i
]
=
i
;
zaxisDefLevels
(
zaxisID2
,
levs
);
zaxisDefName
(
zaxisID2
,
"histogram_binID"
);
time_mode
=
datafunc
==
TIME
?
TSTEP_INSTANT
:
TSTEP_CONSTANT
;
int
time_mode
=
datafunc
==
TIME
?
TSTEP_INSTANT
:
TSTEP_CONSTANT
;
for
(
varID
=
0
;
varID
<
nvars
;
varID
++
)
{
...
...
@@ -182,8 +171,8 @@ void *Ensstat3(void *argument)
varID2
[
varID
]
=
vlistDefVar
(
vlistID2
,
gridID2
,
zaxisID2
,
time_mode
);
}
taxisID1
=
vlistInqTaxis
(
vlistID1
);
taxisID2
=
taxisDuplicate
(
taxisID1
);
int
taxisID1
=
vlistInqTaxis
(
vlistID1
);
int
taxisID2
=
taxisDuplicate
(
taxisID1
);
vlistDefTaxis
(
vlistID2
,
taxisID2
);
for
(
varID
=
0
;
varID
<
nvars
;
varID
++
){
...
...
@@ -202,7 +191,7 @@ void *Ensstat3(void *argument)
streamDefVlist
(
streamID2
,
vlistID2
);
}
gridsize
=
vlistGridsizeMax
(
vlistID1
);
int
gridsize
=
vlistGridsizeMax
(
vlistID1
);
for
(
int
fileID
=
0
;
fileID
<
nfiles
;
fileID
++
)
ef
[
fileID
].
array
=
(
double
*
)
Malloc
(
gridsize
*
sizeof
(
double
));
...
...
@@ -239,7 +228,7 @@ void *Ensstat3(void *argument)
}
tsID
=
0
;
int
tsID
=
0
;
do
{
nrecs0
=
streamInqTimestep
(
ef
[
0
].
streamID
,
tsID
);
...
...
@@ -265,7 +254,7 @@ void *Ensstat3(void *argument)
// fprintf(stderr,"TIMESTEP %i varID %i rec %i\n",tsID,varID,recID);
for
(
recID
=
0
;
recID
<
nrecs0
;
recID
++
)
for
(
int
recID
=
0
;
recID
<
nrecs0
;
recID
++
)
{
#if defined(_OPENMP)
#pragma omp parallel for default(none) shared(ef, nfiles) \
...
...
@@ -454,7 +443,6 @@ void *Ensstat3(void *argument)
fprintf
(
stdout
,
"# : TP FP FN TN TPR FPR
\n
"
);
for
(
i
=
0
;
i
<=
nbins
;
i
++
)
{
int
sum
;
int
p
=
ctg_tab
[
i
][
TP
]
+
ctg_tab
[
i
][
FN
];
int
n
=
ctg_tab
[
i
][
FP
]
+
ctg_tab
[
i
][
TN
];
double
tpr
=
ctg_tab
[
i
][
TP
]
/
(
double
)
p
;
...
...
@@ -464,7 +452,7 @@ void *Ensstat3(void *argument)
roc
[
i
][
TPR
]
=
tpr
;
roc
[
i
][
FPR
]
=
fpr
;
sum
=
ctg_tab
[
i
][
TP
]
+
ctg_tab
[
i
][
TN
]
+
ctg_tab
[
i
][
FP
]
+
ctg_tab
[
i
][
FN
];
int
sum
=
ctg_tab
[
i
][
TP
]
+
ctg_tab
[
i
][
TN
]
+
ctg_tab
[
i
][
FP
]
+
ctg_tab
[
i
][
FN
];
fprintf
(
stdout
,
"%3i %10.4g: %6i %6i %6i %6i (%6i): %10.4g %10.4g
\n
"
,
i
,
i
<
nbins
?
lThresh
[
i
]
:
1
,
...
...
@@ -510,12 +498,11 @@ void *Ensstat3(void *argument)
double
roc_curve_integrate
(
const
double
**
roc
,
const
int
n
)
{
double
y1
,
y0
,
x1
,
x0
,
dx
,
dy
,
area
;
double
y1
,
y0
,
x1
,
x0
,
dx
,
dy
;
double
step_area
;
int
i
=
0
;
area
=
0
;
double
area
=
0
;
for
(
i
=
1
;
i
<=
n
;
i
++
)
{
for
(
i
nt
i
=
1
;
i
<=
n
;
++
i
)
{
x1
=
roc
[
i
][
FPR
];
x0
=
roc
[
i
-
1
][
FPR
];
y1
=
roc
[
i
][
TPR
];
y0
=
roc
[
i
-
1
][
TPR
];
dx
=
x1
-
x0
;
...
...
src/Ensval.c
View file @
d093d233
...
...
@@ -42,26 +42,20 @@ enum RESTYPE_CRPS { CRPS_RES,CRPS_RELI,CRPS_POT };
void
*
Ensval
(
void
*
argument
)
{
int
operatorID
;
int
operfunc
;
int
i
,
k
;
int
nvars
,
nrecs
=
0
,
nrecs0
,
nmiss
,
nens
,
nfiles
,
nostreams
=
0
,
ngrids
;
int
levelID
,
varID
,
recID
,
tsID
;
int
nrecs
=
0
,
nrecs0
,
nmiss
,
nostreams
=
0
,
ngrids
;
int
levelID
,
varID
;
int
gridsize
=
0
;
int
gridID
=
-
1
,
gridID2
;
int
streamID1
,
vlistID
;
int
gridID
=
-
1
;
int
have_miss
=
0
;
int
stream
,
streamID1
=
-
1
,
streamID
=
0
,
*
streamID2
;
int
vlistID
,
vlistID1
,
*
vlistID2
;
int
taxisID1
,
*
taxisID2
;
int
zaxisID1
,
*
zaxisID2
;
int
stream
,
streamID
=
0
;
//int xsize,ysize;
double
missval
=
0
;
double
*
alpha
,
*
beta
,
*
alpha_weights
,
*
beta_weights
;
double
*
brs_g
,
*
brs_o
,
*
brs_g_weights
,
*
brs_o_weights
;
double
*
r
;
// Pointer to hold results for single time step
double
xval
=
0
;
double
yval
=
0
;
double
xa
,
*
x
;
double
*
val
;
double
*
weights
,
sum_weights
=
0
;
double
crps_reli
,
crps_pot
,
crps
;
double
heavyside0
,
heavysideN
;
...
...
@@ -69,11 +63,8 @@ void *Ensval(void *argument)
double
g
,
o
,
p
;
int
fileID
;
const
char
*
ofilebase
;
char
*
ofilename
;
char
file_suffix
[
32
];
char
type_suffix
[
10
];
const
char
*
refname
;