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
GitLab community forum
Contribute to GitLab
Provide feedback
Terms and privacy
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Flexpart
Flex Extract
Commits
0934db12
Commit
0934db12
authored
Oct 12, 2018
by
Anne Philipp
Browse files
Options
Downloads
Patches
Plain Diff
rechanged eccodes implementation, does not work with fortran grib_api lib
parent
40408cbb
No related branches found
No related tags found
No related merge requests found
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
source/python/classes/EcFlexpart.py
+67
-63
67 additions, 63 deletions
source/python/classes/EcFlexpart.py
source/python/classes/GribTools.py
+30
-25
30 additions, 25 deletions
source/python/classes/GribTools.py
with
97 additions
and
88 deletions
source/python/classes/EcFlexpart.py
+
67
−
63
View file @
0934db12
...
...
@@ -81,10 +81,14 @@ import subprocess
from
datetime
import
datetime
,
timedelta
import
numpy
as
np
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
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)
# software specific classes and modules from flex_extract
sys
.
path
.
append
(
'
../
'
)
...
...
@@ -432,7 +436,7 @@ class EcFlexpart(object):
for
key
in
index_keys
:
#index_vals.append(grib_index_get(iid, key))
#print(index_vals[-1])
key_vals
=
codes
_index_get
(
iid
,
key
)
key_vals
=
grib
_index_get
(
iid
,
key
)
print
(
key_vals
)
# have to sort the steps for disaggregation,
# therefore convert to int first
...
...
@@ -790,10 +794,10 @@ class EcFlexpart(object):
print
(
'
current product:
'
,
prod
)
for
i
in
range
(
len
(
index_keys
)):
codes
_index_select
(
iid
,
index_keys
[
i
],
prod
[
i
])
grib
_index_select
(
iid
,
index_keys
[
i
],
prod
[
i
])
# get first id from current product
gid
=
codes
_new_from_index
(
iid
)
gid
=
grib
_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
...
...
@@ -801,9 +805,9 @@ class EcFlexpart(object):
continue
# create correct timestamp from the three time informations
cdate
=
str
(
codes
_get
(
gid
,
'
date
'
))
ctime
=
'
{:0>2}
'
.
format
(
codes
_get
(
gid
,
'
time
'
)
/
100
)
cstep
=
'
{:0>3}
'
.
format
(
codes
_get
(
gid
,
'
step
'
))
cdate
=
str
(
grib
_get
(
gid
,
'
date
'
))
ctime
=
'
{:0>2}
'
.
format
(
grib
_get
(
gid
,
'
time
'
)
/
100
)
cstep
=
'
{:0>3}
'
.
format
(
grib
_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
))
...
...
@@ -835,13 +839,13 @@ class EcFlexpart(object):
while
1
:
if
not
gid
:
break
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
'
)
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
'
)
if
cparamId
in
valsdict
.
keys
():
values
=
codes
_get_values
(
gid
)
values
=
grib
_get_values
(
gid
)
vdp
=
valsdict
[
cparamId
]
svdp
=
svalsdict
[
cparamId
]
# sd = stepsdict[cparamId]
...
...
@@ -880,17 +884,17 @@ class EcFlexpart(object):
else
:
values
=
svdp
[
0
]
codes
_set_values
(
gid
,
values
)
grib
_set_values
(
gid
,
values
)
if
c
.
maxstep
>
12
:
codes
_set
(
gid
,
'
step
'
,
max
(
0
,
step
-
2
*
int
(
c
.
dtime
)))
grib
_set
(
gid
,
'
step
'
,
max
(
0
,
step
-
2
*
int
(
c
.
dtime
)))
else
:
codes
_set
(
gid
,
'
step
'
,
0
)
codes
_set
(
gid
,
'
time
'
,
t_m2dt
.
hour
*
100
)
codes
_set
(
gid
,
'
date
'
,
int
(
t_m2dt
.
strftime
(
'
%Y%m%d
'
)))
grib
_set
(
gid
,
'
step
'
,
0
)
grib
_set
(
gid
,
'
time
'
,
t_m2dt
.
hour
*
100
)
grib
_set
(
gid
,
'
date
'
,
int
(
t_m2dt
.
strftime
(
'
%Y%m%d
'
)))
with
open
(
fnout
,
'
w
'
)
as
f_handle
:
codes
_write
(
gid
,
f_handle
)
grib
_write
(
gid
,
f_handle
)
if
c
.
basetime
:
t_enddate
=
datetime
.
strptime
(
c
.
end_date
+
...
...
@@ -910,16 +914,16 @@ class EcFlexpart(object):
t_dt
==
t_enddate
:
values
=
svdp
[
3
]
codes
_set_values
(
gid
,
values
)
codes
_set
(
gid
,
'
step
'
,
0
)
grib
_set_values
(
gid
,
values
)
grib
_set
(
gid
,
'
step
'
,
0
)
truedatetime
=
t_m2dt
+
timedelta
(
hours
=
2
*
int
(
c
.
dtime
))
codes
_set
(
gid
,
'
time
'
,
truedatetime
.
hour
*
100
)
codes
_set
(
gid
,
'
date
'
,
truedatetime
.
year
*
10000
+
grib
_set
(
gid
,
'
time
'
,
truedatetime
.
hour
*
100
)
grib
_set
(
gid
,
'
date
'
,
truedatetime
.
year
*
10000
+
truedatetime
.
month
*
100
+
truedatetime
.
day
)
with
open
(
hnout
,
'
w
'
)
as
h_handle
:
codes
_write
(
gid
,
h_handle
)
grib
_write
(
gid
,
h_handle
)
#values = (svdp[1]+svdp[2])/2.
if
cparamId
==
'
142
'
or
cparamId
==
'
143
'
:
...
...
@@ -927,21 +931,21 @@ class EcFlexpart(object):
else
:
values
=
disaggregation
.
dapoly
(
list
(
reversed
(
svdp
)))
codes
_set
(
gid
,
'
step
'
,
0
)
grib
_set
(
gid
,
'
step
'
,
0
)
truedatetime
=
t_m2dt
+
timedelta
(
hours
=
int
(
c
.
dtime
))
codes
_set
(
gid
,
'
time
'
,
truedatetime
.
hour
*
100
)
codes
_set
(
gid
,
'
date
'
,
truedatetime
.
year
*
10000
+
grib
_set
(
gid
,
'
time
'
,
truedatetime
.
hour
*
100
)
grib
_set
(
gid
,
'
date
'
,
truedatetime
.
year
*
10000
+
truedatetime
.
month
*
100
+
truedatetime
.
day
)
codes
_set_values
(
gid
,
values
)
grib
_set_values
(
gid
,
values
)
with
open
(
gnout
,
'
w
'
)
as
g_handle
:
codes
_write
(
gid
,
g_handle
)
grib
_write
(
gid
,
g_handle
)
codes
_release
(
gid
)
grib
_release
(
gid
)
gid
=
codes
_new_from_index
(
iid
)
gid
=
grib
_new_from_index
(
iid
)
codes
_index_release
(
iid
)
grib
_index_release
(
iid
)
return
...
...
@@ -1015,10 +1019,10 @@ class EcFlexpart(object):
print
(
'
current product:
'
,
prod
)
for
i
in
range
(
len
(
index_keys
)):
codes
_index_select
(
iid
,
index_keys
[
i
],
prod
[
i
])
grib
_index_select
(
iid
,
index_keys
[
i
],
prod
[
i
])
# get first id from current product
gid
=
codes
_new_from_index
(
iid
)
gid
=
grib
_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
...
...
@@ -1033,9 +1037,9 @@ class EcFlexpart(object):
fdict
[
k
]
=
open
(
fortfile
,
'
w
'
)
# create correct timestamp from the three time informations
cdate
=
str
(
codes
_get
(
gid
,
'
date
'
))
ctime
=
'
{:0>2}
'
.
format
(
codes
_get
(
gid
,
'
time
'
)
/
100
)
cstep
=
'
{:0>3}
'
.
format
(
codes
_get
(
gid
,
'
step
'
))
cdate
=
str
(
grib
_get
(
gid
,
'
date
'
))
ctime
=
'
{:0>2}
'
.
format
(
grib
_get
(
gid
,
'
time
'
)
/
100
)
cstep
=
'
{:0>3}
'
.
format
(
grib
_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
'
)
...
...
@@ -1063,34 +1067,34 @@ class EcFlexpart(object):
while
1
:
if
not
gid
:
break
paramId
=
codes
_get
(
gid
,
'
paramId
'
)
gridtype
=
codes
_get
(
gid
,
'
gridType
'
)
levtype
=
codes
_get
(
gid
,
'
typeOfLevel
'
)
paramId
=
grib
_get
(
gid
,
'
paramId
'
)
gridtype
=
grib
_get
(
gid
,
'
gridType
'
)
levtype
=
grib
_get
(
gid
,
'
typeOfLevel
'
)
if
paramId
==
77
:
# ETADOT
codes
_write
(
gid
,
fdict
[
'
21
'
])
grib
_write
(
gid
,
fdict
[
'
21
'
])
elif
paramId
==
130
:
# T
codes
_write
(
gid
,
fdict
[
'
11
'
])
grib
_write
(
gid
,
fdict
[
'
11
'
])
elif
paramId
==
131
or
paramId
==
132
:
# U, V wind component
codes
_write
(
gid
,
fdict
[
'
10
'
])
grib
_write
(
gid
,
fdict
[
'
10
'
])
elif
paramId
==
133
and
gridtype
!=
'
reduced_gg
'
:
# Q
codes
_write
(
gid
,
fdict
[
'
17
'
])
grib
_write
(
gid
,
fdict
[
'
17
'
])
elif
paramId
==
133
and
gridtype
==
'
reduced_gg
'
:
# Q, gaussian
codes
_write
(
gid
,
fdict
[
'
18
'
])
grib
_write
(
gid
,
fdict
[
'
18
'
])
elif
paramId
==
135
:
# W
codes
_write
(
gid
,
fdict
[
'
19
'
])
grib
_write
(
gid
,
fdict
[
'
19
'
])
elif
paramId
==
152
:
# LNSP
codes
_write
(
gid
,
fdict
[
'
12
'
])
grib
_write
(
gid
,
fdict
[
'
12
'
])
elif
paramId
==
155
and
gridtype
==
'
sh
'
:
# D
codes
_write
(
gid
,
fdict
[
'
13
'
])
grib
_write
(
gid
,
fdict
[
'
13
'
])
elif
paramId
==
246
or
paramId
==
247
:
# CLWC, CIWC
# sum cloud liquid water and ice
if
not
scwc
:
scwc
=
codes
_get_values
(
gid
)
if
scwc
is
None
:
scwc
=
grib
_get_values
(
gid
)
else
:
scwc
+=
codes
_get_values
(
gid
)
codes
_set_values
(
gid
,
scwc
)
codes
_set
(
gid
,
'
paramId
'
,
201031
)
codes
_write
(
gid
,
fdict
[
'
22
'
])
scwc
+=
grib
_get_values
(
gid
)
grib
_set_values
(
gid
,
scwc
)
grib
_set
(
gid
,
'
paramId
'
,
201031
)
grib
_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
...
...
@@ -1100,7 +1104,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
codes
_write
(
gid
,
fdict
[
'
16
'
])
grib
_write
(
gid
,
fdict
[
'
16
'
])
savedfields
.
append
(
paramId
)
else
:
print
(
'
duplicate
'
+
str
(
paramId
)
+
'
not written
'
)
...
...
@@ -1110,15 +1114,15 @@ class EcFlexpart(object):
# model layer
if
levtype
==
'
hybrid
'
and
\
paramId
in
[
129
,
130
,
131
,
132
,
133
,
138
,
155
]:
codes
_write
(
gid
,
fwrf
)
grib
_write
(
gid
,
fwrf
)
# sfc layer
elif
paramId
in
wrfpars
:
codes
_write
(
gid
,
fwrf
)
grib
_write
(
gid
,
fwrf
)
except
AttributeError
:
pass
codes
_release
(
gid
)
gid
=
codes
_new_from_index
(
iid
)
grib
_release
(
gid
)
gid
=
grib
_new_from_index
(
iid
)
for
f
in
fdict
.
values
():
f
.
close
()
...
...
@@ -1172,7 +1176,7 @@ class EcFlexpart(object):
if
c
.
wrf
:
fwrf
.
close
()
codes
_index_release
(
iid
)
grib
_index_release
(
iid
)
return
...
...
This diff is collapsed.
Click to expand it.
source/python/classes/GribTools.py
+
30
−
25
View file @
0934db12
...
...
@@ -43,11 +43,16 @@
# 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
...
...
@@ -104,7 +109,7 @@ class GribTools(object):
return_list
=
[]
while
1
:
gid
=
codes
_new_from_file
(
fileid
)
gid
=
grib
_new_from_file
(
fileid
)
if
gid
is
None
:
break
...
...
@@ -116,20 +121,20 @@ class GribTools(object):
select
=
True
i
=
0
for
wherekey
in
wherekeynames
:
if
not
codes
_is_defined
(
gid
,
wherekey
):
if
not
grib
_is_defined
(
gid
,
wherekey
):
raise
Exception
(
"
where key was not defined
"
)
select
=
(
select
and
(
str
(
wherekeyvalues
[
i
])
==
str
(
codes
_get
(
gid
,
wherekey
))))
str
(
grib
_get
(
gid
,
wherekey
))))
i
+=
1
if
select
:
llist
=
[]
for
key
in
keynames
:
llist
.
extend
([
str
(
codes
_get
(
gid
,
key
))])
llist
.
extend
([
str
(
grib
_get
(
gid
,
key
))])
return_list
.
append
(
llist
)
codes
_release
(
gid
)
grib
_release
(
gid
)
fileid
.
close
()
...
...
@@ -178,7 +183,7 @@ class GribTools(object):
fin
=
open
(
fromfile
)
while
1
:
gid
=
codes
_new_from_file
(
fin
)
gid
=
grib
_new_from_file
(
fin
)
if
gid
is
None
:
break
...
...
@@ -189,22 +194,22 @@ class GribTools(object):
select
=
True
i
=
0
for
wherekey
in
wherekeynames
:
if
not
codes
_is_defined
(
gid
,
wherekey
):
if
not
grib
_is_defined
(
gid
,
wherekey
):
raise
Exception
(
"
where Key was not defined
"
)
select
=
(
select
and
(
str
(
wherekeyvalues
[
i
])
==
str
(
codes
_get
(
gid
,
wherekey
))))
str
(
grib
_get
(
gid
,
wherekey
))))
i
+=
1
if
select
:
i
=
0
for
key
in
keynames
:
codes
_set
(
gid
,
key
,
keyvalues
[
i
])
grib
_set
(
gid
,
key
,
keyvalues
[
i
])
i
+=
1
codes
_write
(
gid
,
fout
)
grib
_write
(
gid
,
fout
)
codes
_release
(
gid
)
grib
_release
(
gid
)
fin
.
close
()
fout
.
close
()
...
...
@@ -245,7 +250,7 @@ class GribTools(object):
fout
=
open
(
self
.
filenames
,
filemode
)
while
1
:
gid
=
codes
_new_from_file
(
fin
)
gid
=
grib
_new_from_file
(
fin
)
if
gid
is
None
:
break
...
...
@@ -256,21 +261,21 @@ class GribTools(object):
select
=
True
i
=
0
for
key
in
keynames
:
if
not
codes
_is_defined
(
gid
,
key
):
if
not
grib
_is_defined
(
gid
,
key
):
raise
Exception
(
"
Key was not defined
"
)
if
selectWhere
:
select
=
(
select
and
(
str
(
keyvalues
[
i
])
==
str
(
codes
_get
(
gid
,
key
))))
str
(
grib
_get
(
gid
,
key
))))
else
:
select
=
(
select
and
(
str
(
keyvalues
[
i
])
!=
str
(
codes
_get
(
gid
,
key
))))
str
(
grib
_get
(
gid
,
key
))))
i
+=
1
if
select
:
codes
_write
(
gid
,
fout
)
grib
_write
(
gid
,
fout
)
codes
_release
(
gid
)
grib
_release
(
gid
)
fin
.
close
()
fout
.
close
()
...
...
@@ -301,18 +306,18 @@ class GribTools(object):
iid
=
None
if
os
.
path
.
exists
(
index_file
):
iid
=
codes
_index_read
(
index_file
)
iid
=
grib
_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
=
codes
_index_new_from_file
(
filename
,
index_keys
)
iid
=
grib
_index_new_from_file
(
filename
,
index_keys
)
else
:
codes
_index_add_file
(
iid
,
filename
)
grib
_index_add_file
(
iid
,
filename
)
if
iid
is
not
None
:
codes
_index_write
(
iid
,
index_file
)
grib
_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