Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Open sidebar
IPSL
LMD
InTro
RoutingPP
Commits
b43c409d
Commit
b43c409d
authored
Jan 18, 2021
by
Lucia Rinchiuso
Browse files
Selection by ID, country and river
parent
dad41b15
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
93 additions
and
7 deletions
+93
-7
StationDiag.py
StationDiag.py
+39
-6
Stations/AllStations.py
Stations/AllStations.py
+54
-1
No files found.
StationDiag.py
View file @
b43c409d
...
...
@@ -3,12 +3,24 @@ import numpy as np
import
datetime
import
sys
import
os
from
inspect
import
currentframe
,
getframeinfo
from
inspect
import
currentframe
,
getframeinfo
,
getabsfile
from
netCDF4
import
Dataset
from
netCDF4
import
stringtochar
,
chartostring
,
stringtoarr
#
localdir
=
os
.
path
.
dirname
(
getframeinfo
(
currentframe
()).
filename
)
def
localdir
(
follow_symlinks
=
True
):
if
getattr
(
sys
,
'frozen'
,
False
):
# py2exe, PyInstaller, cx_Freeze
path
=
os
.
path
.
abspath
(
sys
.
executable
)
else
:
path
=
getabsfile
(
localdir
)
if
follow_symlinks
:
path
=
os
.
path
.
realpath
(
path
)
return
os
.
path
.
dirname
(
path
)
localdir
=
localdir
()
#localdir=os.path.dirname(getframeinfo(currentframe()).filename)
#localdir=os.path.dirname(os.path.realpath(__file__))
sys
.
path
.
append
(
localdir
+
'/Stations'
)
sys
.
path
.
append
(
localdir
+
'/F90subroutines'
)
FillValue
=
1.e+20
#
# Gather user input.
...
...
@@ -53,20 +65,41 @@ A.fetchnetcdf(GRDCFile, metaonly=True, region=[L.lonrange,L.latrange])
# Find the IDs of all the stations listed in stations.def
#
IDs
=
[]
initial_calls
=
[]
#create a FindID function that calls other functions depending on the input
for
teststn
in
StationList
:
IDs
.
append
(
A
.
FindID
(
teststn
.
strip
()))
#next step: when there is a @ in the string look at what is before
#if there is a name!=all it is a river, if it's a nuber it's a region or subregion
#this info must go in input to the ID finder
#next next step: add an exclusion list that uses the same function as below but creates a list of ID_excluded to subtract from the IDs list
#for the moment just add:
#elif there is a @ in the string:
#if after @ there is an integer
#if <10 -> region -> FindIDfromWMOreg and extend
#else -> subregion -> FindIDfromWMOsubreg and extend
#elif after @ is a string
#if 2 char and isupper true -> country -> FindIDfromCountry and extend
#else -> river -> FindIDfromRiver and extend
IDs
.
extend
(
A
.
FindID
(
teststn
))
for
i
in
A
.
FindID
(
teststn
):
initial_calls
.
append
(
teststn
)
print
(
A
.
FindID
(
teststn
))
if
IDs
[
-
1
]
<
0
:
print
(
"Station "
,
teststn
,
" could not be found in the GRDC file over your regions."
)
if
len
(
IDs
)
!=
len
(
initial_calls
):
print
(
'WARNING'
)
# Get additional information from the GRDC file.
Rivers
=
[]
Upstream
=
[]
Names
=
[]
for
istn
in
IDs
:
if
istn
>=
0
:
Rivers
.
append
(
A
.
RiverfromID
(
istn
))
Upstream
.
append
(
A
.
UpstreamfromID
(
istn
))
Names
.
append
(
A
.
NamefromID
(
istn
))
else
:
Rivers
.
append
(
"-"
)
Upstream
.
append
(
0
)
Names
.
append
(
"_"
)
#
# Find the location within the routing graph of the stations to be diagnosed.
#
...
...
@@ -76,7 +109,7 @@ for i in IDs :
if
i
in
L
.
ids
:
Lind
.
append
(
L
.
ids
.
index
(
i
))
else
:
print
(
"Station "
,
StationList
[
IDs
.
index
(
i
)],
" (ID ="
,
i
,
") has not been located in the routing graph."
)
print
(
"Station "
,
initial_calls
[
IDs
.
index
(
i
)],
" (ID ="
,
i
,
") has not been located in the routing graph."
)
Lind
.
append
(
-
1
)
else
:
Lind
.
append
(
-
1
)
...
...
@@ -103,9 +136,9 @@ ncvar=[]
for
i
,
loc
in
enumerate
(
Lind
)
:
if
loc
>=
0
:
vname
=
"ST"
+
str
(
IDs
[
i
])
print
(
"Creating Variable : "
,
vname
,
StationList
[
i
])
print
(
"Creating Variable : "
,
vname
,
initial_calls
[
i
])
ncvar
.
append
(
nc
.
createVariable
(
vname
,
float
,
(
'y'
,
'x'
)))
ncvar
[
-
1
].
Name
=
StationList
[
i
]
ncvar
[
-
1
].
Name
=
Names
[
i
]
ncvar
[
-
1
].
River
=
Rivers
[
i
]
ncvar
[
-
1
].
ObsUpstream
=
Upstream
[
i
]
ncvar
[
-
1
].
Fiindex
=
L
.
Fiindex
[
loc
]
...
...
Stations/AllStations.py
View file @
b43c409d
...
...
@@ -42,7 +42,14 @@ class AllStations :
#
# Inquiry function
#
def
FindID
(
self
,
name
)
:
def
is_integer
(
self
,
n
):
try
:
float
(
n
)
except
ValueError
:
return
False
else
:
return
float
(
n
).
is_integer
()
def
FindIDfromName
(
self
,
name
)
:
ID
=
-
1
for
i
,
stn
in
enumerate
(
self
.
stations
)
:
if
isinstance
(
stn
.
Name
,
str
)
:
...
...
@@ -53,6 +60,45 @@ class AllStations :
if
stnname
.
lower
().
find
(
name
.
lower
())
>=
0
:
ID
=
stn
.
Number
return
ID
def
FindIDfromCountry
(
self
,
country
)
:
ID
=
[]
for
i
in
self
.
stations
:
if
isinstance
(
i
.
Country
,
str
):
stncountry
=
i
.
Country
else
:
stncountry
=
i
.
Country
.
tolist
()
if
stncountry
==
country
:
ID
.
append
(
i
.
Number
)
return
ID
def
FindIDfromRiver
(
self
,
river
)
:
ID
=
[]
for
i
in
self
.
stations
:
if
isinstance
(
i
.
River
,
str
):
stnriver
=
i
.
River
else
:
stnriver
=
i
.
River
.
tolist
()
if
stnriver
.
lower
()
==
river
.
lower
():
ID
.
append
(
i
.
Number
)
return
ID
def
FindID
(
self
,
teststn
)
:
IDs
=
[]
if
self
.
is_integer
(
teststn
):
IDs
.
append
(
int
(
teststn
))
elif
isinstance
(
teststn
,
str
):
if
teststn
.
find
(
'@'
)
!=-
1
:
selection
=
teststn
.
split
(
'@'
)[
0
]
place
=
teststn
.
split
(
'@'
)[
1
]
if
self
.
is_integer
(
place
):
print
(
'it is a region, still to be implemented'
)
else
:
if
len
(
place
)
==
2
and
place
.
isupper
():
IDs
.
extend
(
self
.
FindIDfromCountry
(
place
.
strip
()))
else
:
IDs
.
extend
(
self
.
FindIDfromRiver
(
place
.
strip
()))
else
:
IDs
.
append
(
self
.
FindIDfromName
(
teststn
.
strip
()))
return
IDs
def
RiverfromID
(
self
,
stnid
)
:
allids
=
[
i
.
Number
for
i
in
self
.
stations
]
if
isinstance
(
self
.
stations
[
allids
.
index
(
stnid
)].
River
,
str
)
:
...
...
@@ -63,6 +109,13 @@ class AllStations :
def
UpstreamfromID
(
self
,
stnid
)
:
allids
=
[
i
.
Number
for
i
in
self
.
stations
]
return
self
.
stations
[
allids
.
index
(
stnid
)].
Area
def
NamefromID
(
self
,
stnid
)
:
allids
=
[
i
.
Number
for
i
in
self
.
stations
]
if
isinstance
(
self
.
stations
[
allids
.
index
(
stnid
)].
Name
,
str
)
:
name
=
self
.
stations
[
allids
.
index
(
stnid
)].
Name
else
:
name
=
self
.
stations
[
allids
.
index
(
stnid
)].
Name
.
tolist
()
return
name
#
# Function to dump all stations into a NetCDF file
#
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a 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