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
libcdi
Commits
f799a0bc
Commit
f799a0bc
authored
Jan 06, 2012
by
Uwe Schulzweida
Browse files
added support for GRIB Gaussian grid parameter N
parent
f53677f6
Changes
3
Hide whitespace changes
Inline
Side-by-side
src/grid.c
View file @
f799a0bc
...
...
@@ -2523,7 +2523,7 @@ int gridCompare(int gridID, grid_t grid)
printf("grid xlast %f\n", gridInqXval(gridID, grid.size-1));
printf("grid ylast %f\n", gridInqYval(gridID, grid.size-1));
printf("grid.nv %d\n", grid.nvertex);
printf("grid nv %d\n", gridInqNvertex(gridID));
printf("grid nv %d\n", gridInqNvertex(gridID));
*/
if
(
grid
.
xsize
==
gridInqXsize
(
gridID
)
&&
grid
.
ysize
==
gridInqYsize
(
gridID
)
)
differ
=
compareXYvals2
(
gridID
,
grid
.
size
,
grid
.
xvals
,
grid
.
yvals
);
...
...
@@ -2552,7 +2552,7 @@ int gridGenerate(grid_t grid)
grid_check_ptr
(
gridID
,
gridptr
);
gridDefPrec
(
gridID
,
grid
.
prec
);
switch
(
grid
.
type
)
{
case
GRID_LONLAT
:
...
...
@@ -2569,6 +2569,8 @@ int gridGenerate(grid_t grid)
if
(
grid
.
xsize
>
0
)
gridDefXsize
(
gridID
,
grid
.
xsize
);
if
(
grid
.
ysize
>
0
)
gridDefYsize
(
gridID
,
grid
.
ysize
);
if
(
grid
.
type
==
GRID_GAUSSIAN
)
gridDefNP
(
gridID
,
grid
.
np
);
if
(
grid
.
nvertex
>
0
)
gridDefNvertex
(
gridID
,
grid
.
nvertex
);
...
...
@@ -2647,6 +2649,7 @@ int gridGenerate(grid_t grid)
}
case
GRID_GAUSSIAN_REDUCED
:
{
gridDefNP
(
gridID
,
grid
.
np
);
gridDefYsize
(
gridID
,
grid
.
ysize
);
gridDefRowlon
(
gridID
,
grid
.
ysize
,
grid
.
rowlon
);
...
...
src/stream_cgribex.c
View file @
f799a0bc
...
...
@@ -162,7 +162,7 @@ int cgribexGetTsteptype(int timerange)
static
void
cgribexGetGrid
(
stream_t
*
streamptr
,
int
*
isec2
,
int
*
isec4
,
grid_t
*
grid
)
{
int
gridtype
;
int
gridtype
;
gridtype
=
cgribexGetGridType
(
isec2
);
...
...
@@ -185,6 +185,7 @@ void cgribexGetGrid(stream_t *streamptr, int *isec2, int *isec4, grid_t *grid)
grid
->
size
=
ISEC4_NumValues
;
grid
->
xsize
=
ISEC2_NumLon
;
grid
->
ysize
=
ISEC2_NumLat
;
if
(
gridtype
==
GRID_GAUSSIAN
)
grid
->
np
=
ISEC2_NumPar
;
grid
->
xinc
=
0
;
grid
->
yinc
=
0
;
grid
->
xdef
=
0
;
...
...
@@ -214,7 +215,7 @@ void cgribexGetGrid(stream_t *streamptr, int *isec2, int *isec4, grid_t *grid)
}
grid
->
xfirst
=
ISEC2_FirstLon
*
0
.
001
;
grid
->
xlast
=
ISEC2_LastLon
*
0
.
001
;
grid
->
xdef
=
2
;
grid
->
xdef
=
2
;
}
grid
->
ydef
=
0
;
/* if ( ISEC2_FirstLat != 0 || ISEC2_LastLat != 0 ) */
...
...
@@ -231,18 +232,19 @@ void cgribexGetGrid(stream_t *streamptr, int *isec2, int *isec4, grid_t *grid)
}
grid
->
yfirst
=
ISEC2_FirstLat
*
0
.
001
;
grid
->
ylast
=
ISEC2_LastLat
*
0
.
001
;
grid
->
ydef
=
2
;
grid
->
ydef
=
2
;
}
break
;
}
case
GRID_GAUSSIAN_REDUCED
:
{
grid
->
np
=
ISEC2_NumPar
;
grid
->
size
=
ISEC4_NumValues
;
grid
->
rowlon
=
ISEC2_RowLonPtr
;
grid
->
ysize
=
ISEC2_NumLat
;
grid
->
xinc
=
0
;
grid
->
yinc
=
0
;
grid
->
xdef
=
0
;
grid
->
xinc
=
0
;
grid
->
yinc
=
0
;
grid
->
xdef
=
0
;
/* if ( ISEC2_FirstLon != 0 || ISEC2_LastLon != 0 ) */
{
if
(
grid
->
xsize
>
1
)
...
...
@@ -254,7 +256,7 @@ void cgribexGetGrid(stream_t *streamptr, int *isec2, int *isec4, grid_t *grid)
}
grid
->
xfirst
=
ISEC2_FirstLon
*
0
.
001
;
grid
->
xlast
=
ISEC2_LastLon
*
0
.
001
;
grid
->
xdef
=
2
;
grid
->
xdef
=
2
;
}
grid
->
ydef
=
0
;
/* if ( ISEC2_FirstLat != 0 || ISEC2_LastLat != 0 ) */
...
...
@@ -268,7 +270,7 @@ void cgribexGetGrid(stream_t *streamptr, int *isec2, int *isec4, grid_t *grid)
}
grid
->
yfirst
=
ISEC2_FirstLat
*
0
.
001
;
grid
->
ylast
=
ISEC2_LastLat
*
0
.
001
;
grid
->
ydef
=
2
;
grid
->
ydef
=
2
;
}
break
;
}
...
...
@@ -292,7 +294,7 @@ void cgribexGetGrid(stream_t *streamptr, int *isec2, int *isec4, grid_t *grid)
grid
->
lcc_projflag
=
ISEC2_Lambert_ProjFlag
;
grid
->
lcc_scanflag
=
ISEC2_ScanFlag
;
grid
->
xdef
=
0
;
grid
->
xdef
=
0
;
grid
->
ydef
=
0
;
break
;
...
...
@@ -1711,8 +1713,8 @@ void cgribexDefGrid(int *isec1, int *isec2, int *isec4, int gridID)
double
yfirst
=
0
,
ylast
=
0
,
yinc
=
0
;
if
(
gridtype
==
GRID_GAUSSIAN
||
gridtype
==
GRID_GAUSSIAN_REDUCED
)
ISEC2_GridType
=
GRIB1_GTYPE_GAUSSIAN
;
else
if
(
gridtype
==
GRID_LONLAT
&&
gridIsRotated
(
gridID
)
)
ISEC2_GridType
=
GRIB1_GTYPE_GAUSSIAN
;
else
if
(
gridtype
==
GRID_LONLAT
&&
gridIsRotated
(
gridID
)
)
ISEC2_GridType
=
GRIB1_GTYPE_LATLON_ROT
;
else
ISEC2_GridType
=
GRIB1_GTYPE_LATLON
;
...
...
@@ -1778,7 +1780,11 @@ void cgribexDefGrid(int *isec1, int *isec2, int *isec4, int gridID)
ISEC2_LonIncr
=
0
;
if
(
gridtype
==
GRID_GAUSSIAN
||
gridtype
==
GRID_GAUSSIAN_REDUCED
)
ISEC2_NumPar
=
nlat
/
2
;
{
int
np
=
gridInqNP
(
gridID
);
if
(
np
==
0
)
np
=
nlat
/
2
;
ISEC2_NumPar
=
np
;
}
else
{
ISEC2_LatIncr
=
NINT
(
yinc
*
1000
);
...
...
src/stream_gribapi.c
View file @
f799a0bc
...
...
@@ -270,9 +270,16 @@ void gribapiGetGrid(grib_handle *gh, grid_t *grid)
GRIB_CHECK
(
grib_get_long
(
gh
,
"Nj"
,
&
lpar
),
0
);
nlat
=
lpar
;
if
(
gridtype
==
GRID_GAUSSIAN
)
{
GRIB_CHECK
(
grib_get_long
(
gh
,
"numberOfParallelsBetweenAPoleAndTheEquator"
,
&
lpar
),
0
);
grid
->
np
=
lpar
;
}
if
(
numberOfPoints
!=
nlon
*
nlat
)
Error
(
"numberOfPoints (%d) and gridSize (%d) differ!"
,
(
int
)
numberOfPoints
,
nlon
*
nlat
);
grid
->
size
=
numberOfPoints
;
grid
->
xsize
=
nlon
;
grid
->
ysize
=
nlat
;
...
...
@@ -331,6 +338,9 @@ void gribapiGetGrid(grib_handle *gh, grid_t *grid)
size_t
dummy
;
long
*
pl
;
GRIB_CHECK
(
grib_get_long
(
gh
,
"numberOfParallelsBetweenAPoleAndTheEquator"
,
&
lpar
),
0
);
grid
->
np
=
lpar
;
GRIB_CHECK
(
grib_get_long
(
gh
,
"Nj"
,
&
lpar
),
0
);
nlat
=
lpar
;
...
...
@@ -1628,7 +1638,7 @@ int gribapiScanTimestep(int streamID)
cdiParamToString
(
param
,
paramstr
,
sizeof
(
paramstr
));
if
(
memcmp
(
&
datetime
,
&
datetime0
,
sizeof
(
DateTime
))
!=
0
)
break
;
if
(
CDI_Debug
)
Warning
(
"Param=%s level=%d already exist, skipped!"
,
paramstr
,
level1
);
...
...
@@ -1638,7 +1648,7 @@ int gribapiScanTimestep(int streamID)
{
streamptr
->
tsteps
[
tsID
].
records
[
recID
].
used
=
TRUE
;
streamptr
->
tsteps
[
tsID
].
recIDs
[
rindex
]
=
recID
;
}
}
}
if
(
CDI_Debug
)
...
...
@@ -1657,7 +1667,7 @@ int gribapiScanTimestep(int streamID)
streamptr
->
tsteps
[
tsID
].
records
[
recID
].
ilevel
,
level1
);
Error
(
"Invalid, unsupported or inconsistent record structure"
);
}
streamptr
->
tsteps
[
tsID
].
records
[
recID
].
position
=
recpos
;
streamptr
->
tsteps
[
tsID
].
records
[
recID
].
size
=
recsize
;
...
...
@@ -2147,7 +2157,11 @@ void gribapiDefGrid(grib_handle *gh, int gridID, int ljpeg)
ISEC2_LonIncr = 0;
*/
if
(
gridtype
==
GRID_GAUSSIAN
||
gridtype
==
GRID_GAUSSIAN_REDUCED
)
GRIB_CHECK
(
grib_set_long
(
gh
,
"numberOfParallelsBetweenAPoleAndTheEquator"
,
nlat
/
2
),
0
);
{
int
np
=
gridInqNP
(
gridID
);
if
(
np
==
0
)
np
=
nlat
/
2
;
GRIB_CHECK
(
grib_set_long
(
gh
,
"numberOfParallelsBetweenAPoleAndTheEquator"
,
np
),
0
);
}
else
{
latIncr
=
yinc
;
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment