Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
Flex Extract
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Code
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Deploy
Releases
Model registry
Monitor
Service Desk
Analyze
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Terms and privacy
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Flexpart
Flex Extract
Commits
2e62398d
Commit
2e62398d
authored
6 years ago
by
Anne Philipp
Browse files
Options
Downloads
Patches
Plain Diff
moved from grib_api to eccodes
parent
adb0b63d
No related branches found
No related tags found
No related merge requests found
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
source/python/classes/EcFlexpart.py
+74
-76
74 additions, 76 deletions
source/python/classes/EcFlexpart.py
source/python/classes/GribTools.py
+25
-30
25 additions, 30 deletions
source/python/classes/GribTools.py
with
99 additions
and
106 deletions
source/python/classes/EcFlexpart.py
+
74
−
76
View file @
2e62398d
...
...
@@ -81,14 +81,10 @@ import subprocess
from
datetime
import
datetime
,
timedelta
import
numpy
as
np
from
gribapi
import
(
grib_set
,
grib_index_select
,
grib_new_from_index
,
grib_get
,
grib_write
,
grib_get_values
,
grib_set_values
,
grib_release
,
grib_index_release
,
grib_index_get
)
# from eccodes import (codes_index_select, codes_new_from_index, codes_get,
# codes_get_values, codes_set_values, codes_set,
# codes_write, codes_release, codes_new_from_index,
# codes_index_release, codes_index_get)
from
eccodes
import
(
codes_index_select
,
codes_new_from_index
,
codes_get
,
codes_get_values
,
codes_set_values
,
codes_set
,
codes_write
,
codes_release
,
codes_new_from_index
,
codes_index_release
,
codes_index_get
)
# software specific classes and modules from flex_extract
sys
.
path
.
append
(
'
../
'
)
...
...
@@ -402,7 +398,7 @@ class EcFlexpart(object):
Return
------
iid : :obj:`
grib
_index`
iid : :obj:`
codes
_index`
This is a grib specific index structure to access
messages in a file.
...
...
@@ -426,9 +422,7 @@ class EcFlexpart(object):
# read the values of index keys
index_vals
=
[]
for
key
in
index_keys
:
#index_vals.append(grib_index_get(iid, key))
#print(index_vals[-1])
key_vals
=
grib_index_get
(
iid
,
key
)
key_vals
=
codes_index_get
(
iid
,
key
)
print
(
key_vals
)
# have to sort the steps for disaggregation,
# therefore convert to int first
...
...
@@ -770,10 +764,10 @@ class EcFlexpart(object):
print
(
'
current product:
'
,
prod
)
for
i
in
range
(
len
(
index_keys
)):
grib
_index_select
(
iid
,
index_keys
[
i
],
prod
[
i
])
codes
_index_select
(
iid
,
index_keys
[
i
],
prod
[
i
])
# get first id from current product
gid
=
grib
_new_from_index
(
iid
)
gid
=
codes
_new_from_index
(
iid
)
# if there is no data for this specific time combination / product
# skip the rest of the for loop and start with next timestep/product
...
...
@@ -781,9 +775,9 @@ class EcFlexpart(object):
continue
# create correct timestamp from the three time informations
cdate
=
str
(
grib
_get
(
gid
,
'
date
'
))
ctime
=
'
{:0>2}
'
.
format
(
grib
_get
(
gid
,
'
time
'
)
/
100
)
cstep
=
'
{:0>3}
'
.
format
(
grib
_get
(
gid
,
'
step
'
))
cdate
=
str
(
codes
_get
(
gid
,
'
date
'
))
ctime
=
'
{:0>2}
'
.
format
(
codes
_get
(
gid
,
'
time
'
)
/
100
)
cstep
=
'
{:0>3}
'
.
format
(
codes
_get
(
gid
,
'
step
'
))
t_date
=
datetime
.
strptime
(
cdate
+
ctime
,
'
%Y%m%d%H
'
)
t_dt
=
t_date
+
timedelta
(
hours
=
int
(
cstep
))
t_m1dt
=
t_date
+
timedelta
(
hours
=
int
(
cstep
)
-
int
(
c
.
dtime
))
...
...
@@ -809,19 +803,22 @@ class EcFlexpart(object):
t_dt
.
strftime
(
'
%Y%m%d%H
'
))
print
(
"
outputfile =
"
+
fnout
)
f_handle
=
open
(
fnout
,
'
w
'
)
h_handle
=
open
(
hnout
,
'
w
'
)
g_handle
=
open
(
gnout
,
'
w
'
)
# read message for message and store relevant data fields
# data keywords are stored in pars
while
1
:
if
not
gid
:
break
cparamId
=
str
(
grib
_get
(
gid
,
'
paramId
'
))
step
=
grib
_get
(
gid
,
'
step
'
)
time
=
grib
_get
(
gid
,
'
time
'
)
ni
=
grib
_get
(
gid
,
'
Ni
'
)
nj
=
grib
_get
(
gid
,
'
Nj
'
)
cparamId
=
str
(
codes
_get
(
gid
,
'
paramId
'
))
step
=
codes
_get
(
gid
,
'
step
'
)
time
=
codes
_get
(
gid
,
'
time
'
)
ni
=
codes
_get
(
gid
,
'
Ni
'
)
nj
=
codes
_get
(
gid
,
'
Nj
'
)
if
cparamId
in
valsdict
.
keys
():
values
=
grib
_get_values
(
gid
)
values
=
codes
_get_values
(
gid
)
vdp
=
valsdict
[
cparamId
]
svdp
=
svalsdict
[
cparamId
]
...
...
@@ -841,7 +838,7 @@ class EcFlexpart(object):
print
(
cparamId
,
time
,
step
,
len
(
values
),
values
[
0
],
np
.
std
(
values
))
# len(svdp) correspond to the time
# len(svdp) correspond
s
to the time
if
len
(
svdp
)
>=
3
:
if
len
(
svdp
)
>
3
:
if
cparamId
==
'
142
'
or
cparamId
==
'
143
'
:
...
...
@@ -859,17 +856,16 @@ class EcFlexpart(object):
else
:
values
=
svdp
[
0
]
grib
_set_values
(
gid
,
values
)
codes
_set_values
(
gid
,
values
)
if
c
.
maxstep
>
12
:
grib
_set
(
gid
,
'
step
'
,
max
(
0
,
step
-
2
*
int
(
c
.
dtime
)))
codes
_set
(
gid
,
'
step
'
,
max
(
0
,
step
-
2
*
int
(
c
.
dtime
)))
else
:
grib
_set
(
gid
,
'
step
'
,
0
)
grib
_set
(
gid
,
'
time
'
,
t_m2dt
.
hour
*
100
)
grib
_set
(
gid
,
'
date
'
,
int
(
t_m2dt
.
strftime
(
'
%Y%m%d
'
)))
codes
_set
(
gid
,
'
step
'
,
0
)
codes
_set
(
gid
,
'
time
'
,
t_m2dt
.
hour
*
100
)
codes
_set
(
gid
,
'
date
'
,
int
(
t_m2dt
.
strftime
(
'
%Y%m%d
'
)))
with
open
(
fnout
,
'
w
'
)
as
f_handle
:
grib_write
(
gid
,
f_handle
)
codes_write
(
gid
,
f_handle
)
if
c
.
basetime
:
t_enddate
=
datetime
.
strptime
(
c
.
end_date
+
...
...
@@ -889,16 +885,15 @@ class EcFlexpart(object):
t_dt
==
t_enddate
:
values
=
svdp
[
3
]
grib
_set_values
(
gid
,
values
)
grib
_set
(
gid
,
'
step
'
,
0
)
codes
_set_values
(
gid
,
values
)
codes
_set
(
gid
,
'
step
'
,
0
)
truedatetime
=
t_m2dt
+
timedelta
(
hours
=
2
*
int
(
c
.
dtime
))
grib
_set
(
gid
,
'
time
'
,
truedatetime
.
hour
*
100
)
grib
_set
(
gid
,
'
date
'
,
truedatetime
.
year
*
10000
+
codes
_set
(
gid
,
'
time
'
,
truedatetime
.
hour
*
100
)
codes
_set
(
gid
,
'
date
'
,
truedatetime
.
year
*
10000
+
truedatetime
.
month
*
100
+
truedatetime
.
day
)
with
open
(
hnout
,
'
w
'
)
as
h_handle
:
grib_write
(
gid
,
h_handle
)
codes_write
(
gid
,
h_handle
)
#values = (svdp[1]+svdp[2])/2.
if
cparamId
==
'
142
'
or
cparamId
==
'
143
'
:
...
...
@@ -906,21 +901,24 @@ class EcFlexpart(object):
else
:
values
=
disaggregation
.
dapoly
(
list
(
reversed
(
svdp
)))
grib
_set
(
gid
,
'
step
'
,
0
)
codes
_set
(
gid
,
'
step
'
,
0
)
truedatetime
=
t_m2dt
+
timedelta
(
hours
=
int
(
c
.
dtime
))
grib_set
(
gid
,
'
time
'
,
truedatetime
.
hour
*
100
)
grib_set
(
gid
,
'
date
'
,
truedatetime
.
year
*
10000
+
truedatetime
.
month
*
100
+
truedatetime
.
day
)
grib_set_values
(
gid
,
values
)
with
open
(
gnout
,
'
w
'
)
as
g_handle
:
grib_write
(
gid
,
g_handle
)
codes_set
(
gid
,
'
time
'
,
truedatetime
.
hour
*
100
)
codes_set
(
gid
,
'
date
'
,
truedatetime
.
year
*
10000
+
truedatetime
.
month
*
100
+
truedatetime
.
day
)
codes_set_values
(
gid
,
values
)
codes_write
(
gid
,
g_handle
)
codes_release
(
gid
)
g
rib_release
(
g
id
)
g
id
=
codes_new_from_index
(
i
id
)
gid
=
grib_new_from_index
(
iid
)
f_handle
.
close
()
g_handle
.
close
()
h_handle
.
close
()
grib
_index_release
(
iid
)
codes
_index_release
(
iid
)
return
...
...
@@ -991,10 +989,10 @@ class EcFlexpart(object):
print
(
'
current product:
'
,
prod
)
for
i
in
range
(
len
(
index_keys
)):
grib
_index_select
(
iid
,
index_keys
[
i
],
prod
[
i
])
codes
_index_select
(
iid
,
index_keys
[
i
],
prod
[
i
])
# get first id from current product
gid
=
grib
_new_from_index
(
iid
)
gid
=
codes
_new_from_index
(
iid
)
# if there is no data for this specific time combination / product
# skip the rest of the for loop and start with next timestep/product
...
...
@@ -1009,9 +1007,9 @@ class EcFlexpart(object):
fdict
[
k
]
=
open
(
fortfile
,
'
w
'
)
# create correct timestamp from the three time informations
cdate
=
str
(
grib
_get
(
gid
,
'
date
'
))
ctime
=
'
{:0>2}
'
.
format
(
grib
_get
(
gid
,
'
time
'
)
/
100
)
cstep
=
'
{:0>3}
'
.
format
(
grib
_get
(
gid
,
'
step
'
))
cdate
=
str
(
codes
_get
(
gid
,
'
date
'
))
ctime
=
'
{:0>2}
'
.
format
(
codes
_get
(
gid
,
'
time
'
)
/
100
)
cstep
=
'
{:0>3}
'
.
format
(
codes
_get
(
gid
,
'
step
'
))
timestamp
=
datetime
.
strptime
(
cdate
+
ctime
,
'
%Y%m%d%H
'
)
timestamp
+=
timedelta
(
hours
=
int
(
cstep
))
cdate_hour
=
datetime
.
strftime
(
timestamp
,
'
%Y%m%d%H
'
)
...
...
@@ -1039,34 +1037,34 @@ class EcFlexpart(object):
while
1
:
if
not
gid
:
break
paramId
=
grib
_get
(
gid
,
'
paramId
'
)
gridtype
=
grib
_get
(
gid
,
'
gridType
'
)
levtype
=
grib
_get
(
gid
,
'
typeOfLevel
'
)
paramId
=
codes
_get
(
gid
,
'
paramId
'
)
gridtype
=
codes
_get
(
gid
,
'
gridType
'
)
levtype
=
codes
_get
(
gid
,
'
typeOfLevel
'
)
if
paramId
==
77
:
# ETADOT
grib
_write
(
gid
,
fdict
[
'
21
'
])
codes
_write
(
gid
,
fdict
[
'
21
'
])
elif
paramId
==
130
:
# T
grib
_write
(
gid
,
fdict
[
'
11
'
])
codes
_write
(
gid
,
fdict
[
'
11
'
])
elif
paramId
==
131
or
paramId
==
132
:
# U, V wind component
grib
_write
(
gid
,
fdict
[
'
10
'
])
codes
_write
(
gid
,
fdict
[
'
10
'
])
elif
paramId
==
133
and
gridtype
!=
'
reduced_gg
'
:
# Q
grib
_write
(
gid
,
fdict
[
'
17
'
])
codes
_write
(
gid
,
fdict
[
'
17
'
])
elif
paramId
==
133
and
gridtype
==
'
reduced_gg
'
:
# Q, gaussian
grib
_write
(
gid
,
fdict
[
'
18
'
])
codes
_write
(
gid
,
fdict
[
'
18
'
])
elif
paramId
==
135
:
# W
grib
_write
(
gid
,
fdict
[
'
19
'
])
codes
_write
(
gid
,
fdict
[
'
19
'
])
elif
paramId
==
152
:
# LNSP
grib
_write
(
gid
,
fdict
[
'
12
'
])
codes
_write
(
gid
,
fdict
[
'
12
'
])
elif
paramId
==
155
and
gridtype
==
'
sh
'
:
# D
grib
_write
(
gid
,
fdict
[
'
13
'
])
codes
_write
(
gid
,
fdict
[
'
13
'
])
elif
paramId
==
246
or
paramId
==
247
:
# CLWC, CIWC
# sum cloud liquid water and ice
if
scwc
is
None
:
scwc
=
grib
_get_values
(
gid
)
scwc
=
codes
_get_values
(
gid
)
else
:
scwc
+=
grib
_get_values
(
gid
)
grib
_set_values
(
gid
,
scwc
)
grib
_set
(
gid
,
'
paramId
'
,
201031
)
grib
_write
(
gid
,
fdict
[
'
22
'
])
scwc
+=
codes
_get_values
(
gid
)
codes
_set_values
(
gid
,
scwc
)
codes
_set
(
gid
,
'
paramId
'
,
201031
)
codes
_write
(
gid
,
fdict
[
'
22
'
])
elif
c
.
wrf
and
paramId
in
[
129
,
138
,
155
]
and
\
levtype
==
'
hybrid
'
:
# Z, VO, D
# do not do anything right now
...
...
@@ -1076,7 +1074,7 @@ class EcFlexpart(object):
if
paramId
not
in
savedfields
:
# SD/MSL/TCC/10U/10V/2T/2D/Z/LSM/SDOR/CVL/CVH/SR
# and all ADDPAR parameter
grib
_write
(
gid
,
fdict
[
'
16
'
])
codes
_write
(
gid
,
fdict
[
'
16
'
])
savedfields
.
append
(
paramId
)
else
:
print
(
'
duplicate
'
+
str
(
paramId
)
+
'
not written
'
)
...
...
@@ -1086,15 +1084,15 @@ class EcFlexpart(object):
# model layer
if
levtype
==
'
hybrid
'
and
\
paramId
in
[
129
,
130
,
131
,
132
,
133
,
138
,
155
]:
grib
_write
(
gid
,
fwrf
)
codes
_write
(
gid
,
fwrf
)
# sfc layer
elif
paramId
in
wrfpars
:
grib
_write
(
gid
,
fwrf
)
codes
_write
(
gid
,
fwrf
)
except
AttributeError
:
pass
grib
_release
(
gid
)
gid
=
grib
_new_from_index
(
iid
)
codes
_release
(
gid
)
gid
=
codes
_new_from_index
(
iid
)
for
f
in
fdict
.
values
():
f
.
close
()
...
...
@@ -1148,7 +1146,7 @@ class EcFlexpart(object):
if
c
.
wrf
:
fwrf
.
close
()
grib
_index_release
(
iid
)
codes
_index_release
(
iid
)
return
...
...
@@ -1189,7 +1187,7 @@ class EcFlexpart(object):
ofile
=
os
.
path
.
join
(
self
.
inputdir
,
ofile
)
if
c
.
format
.
lower
()
==
'
grib2
'
:
p
=
subprocess
.
check_call
([
'
grib
_set
'
,
'
-s
'
,
'
edition=2,
'
,
p
=
subprocess
.
check_call
([
'
codes
_set
'
,
'
-s
'
,
'
edition=2,
'
,
'
productDefinitionTemplateNumber=8
'
,
ofile
,
ofile
+
'
_2
'
])
p
=
subprocess
.
check_call
([
'
mv
'
,
ofile
+
'
_2
'
,
ofile
])
...
...
This diff is collapsed.
Click to expand it.
source/python/classes/GribTools.py
+
25
−
30
View file @
2e62398d
...
...
@@ -43,16 +43,11 @@
# MODULES
# ------------------------------------------------------------------------------
import
os
from
gribapi
import
grib_new_from_file
,
grib_is_defined
,
grib_get
,
\
grib_release
,
grib_set
,
grib_write
,
grib_index_read
,
\
grib_index_new_from_file
,
grib_index_add_file
,
\
grib_index_write
# from eccodes import (codes_grib_new_from_file, codes_is_defined, codes_get,
# codes_release, codes_set, codes_write, codes_index_read,
# codes_index_new_from_file, codes_index_add_file,
# codes_index_write)
from
eccodes
import
(
codes_grib_new_from_file
,
codes_is_defined
,
codes_get
,
codes_release
,
codes_set
,
codes_write
,
codes_index_read
,
codes_index_new_from_file
,
codes_index_add_file
,
codes_index_write
)
# ------------------------------------------------------------------------------
# CLASS
...
...
@@ -108,7 +103,7 @@ class GribTools(object):
return_list
=
[]
while
1
:
gid
=
grib
_new_from_file
(
fileid
)
gid
=
codes
_new_from_file
(
fileid
)
if
gid
is
None
:
break
...
...
@@ -120,20 +115,20 @@ class GribTools(object):
select
=
True
i
=
0
for
wherekey
in
wherekeynames
:
if
not
grib
_is_defined
(
gid
,
wherekey
):
if
not
codes
_is_defined
(
gid
,
wherekey
):
raise
Exception
(
"
where key was not defined
"
)
select
=
(
select
and
(
str
(
wherekeyvalues
[
i
])
==
str
(
grib
_get
(
gid
,
wherekey
))))
str
(
codes
_get
(
gid
,
wherekey
))))
i
+=
1
if
select
:
llist
=
[]
for
key
in
keynames
:
llist
.
extend
([
str
(
grib
_get
(
gid
,
key
))])
llist
.
extend
([
str
(
codes
_get
(
gid
,
key
))])
return_list
.
append
(
llist
)
grib
_release
(
gid
)
codes
_release
(
gid
)
fileid
.
close
()
...
...
@@ -181,7 +176,7 @@ class GribTools(object):
fin
=
open
(
fromfile
)
while
1
:
gid
=
grib
_new_from_file
(
fin
)
gid
=
codes
_new_from_file
(
fin
)
if
gid
is
None
:
break
...
...
@@ -192,22 +187,22 @@ class GribTools(object):
select
=
True
i
=
0
for
wherekey
in
wherekeynames
:
if
not
grib
_is_defined
(
gid
,
wherekey
):
if
not
codes
_is_defined
(
gid
,
wherekey
):
raise
Exception
(
"
where Key was not defined
"
)
select
=
(
select
and
(
str
(
wherekeyvalues
[
i
])
==
str
(
grib
_get
(
gid
,
wherekey
))))
str
(
codes
_get
(
gid
,
wherekey
))))
i
+=
1
if
select
:
i
=
0
for
key
in
keynames
:
grib
_set
(
gid
,
key
,
keyvalues
[
i
])
codes
_set
(
gid
,
key
,
keyvalues
[
i
])
i
+=
1
grib
_write
(
gid
,
fout
)
codes
_write
(
gid
,
fout
)
grib
_release
(
gid
)
codes
_release
(
gid
)
fin
.
close
()
fout
.
close
()
...
...
@@ -249,7 +244,7 @@ class GribTools(object):
fout
=
open
(
self
.
filenames
,
filemode
)
while
1
:
gid
=
grib
_new_from_file
(
fin
)
gid
=
codes
_new_from_file
(
fin
)
if
gid
is
None
:
break
...
...
@@ -260,21 +255,21 @@ class GribTools(object):
select
=
True
i
=
0
for
key
in
keynames
:
if
not
grib
_is_defined
(
gid
,
key
):
if
not
codes
_is_defined
(
gid
,
key
):
raise
Exception
(
"
Key was not defined
"
)
if
selectWhere
:
select
=
(
select
and
(
str
(
keyvalues
[
i
])
==
str
(
grib
_get
(
gid
,
key
))))
str
(
codes
_get
(
gid
,
key
))))
else
:
select
=
(
select
and
(
str
(
keyvalues
[
i
])
!=
str
(
grib
_get
(
gid
,
key
))))
str
(
codes
_get
(
gid
,
key
))))
i
+=
1
if
select
:
grib
_write
(
gid
,
fout
)
codes
_write
(
gid
,
fout
)
grib
_release
(
gid
)
codes
_release
(
gid
)
fin
.
close
()
fout
.
close
()
...
...
@@ -305,18 +300,18 @@ class GribTools(object):
iid
=
None
if
os
.
path
.
exists
(
index_file
):
iid
=
grib
_index_read
(
index_file
)
iid
=
codes
_index_read
(
index_file
)
print
(
"
Use existing index file: %s
"
%
(
index_file
))
else
:
for
filename
in
self
.
filenames
:
print
(
"
Inputfile: %s
"
%
(
filename
))
if
iid
is
None
:
iid
=
grib
_index_new_from_file
(
filename
,
index_keys
)
iid
=
codes
_index_new_from_file
(
filename
,
index_keys
)
else
:
grib
_index_add_file
(
iid
,
filename
)
codes
_index_add_file
(
iid
,
filename
)
if
iid
is
not
None
:
grib
_index_write
(
iid
,
index_file
)
codes
_index_write
(
iid
,
index_file
)
print
(
'
... index done
'
)
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
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!
Save comment
Cancel
Please
register
or
sign in
to comment