Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
MLAir
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Container registry
Model registry
Operate
Environments
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
esde
machine-learning
MLAir
Commits
117e11ed
Commit
117e11ed
authored
4 years ago
by
Felix Kleinert
Browse files
Options
Downloads
Patches
Plain Diff
restructure rotation class. Baseclass contains all methods which are not explicitly rotation
parent
c87b4fc0
Branches
Branches containing commit
Tags
Tags containing commit
1 merge request
!259
Draft: Resolve "WRF-Datahandler should inherit from SingleStationDatahandler"
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
mlair/helpers/geofunctions.py
+109
-77
109 additions, 77 deletions
mlair/helpers/geofunctions.py
with
109 additions
and
77 deletions
mlair/helpers/geofunctions.py
+
109
−
77
View file @
117e11ed
...
@@ -177,6 +177,20 @@ class VectorRotate:
...
@@ -177,6 +177,20 @@ class VectorRotate:
RAD_PER_DEG
=
np
.
pi
/
180.
RAD_PER_DEG
=
np
.
pi
/
180.
DEG_PER_RAD
=
180.
/
np
.
pi
DEG_PER_RAD
=
180.
/
np
.
pi
def
__init__
(
self
,
xlat
=
'
XLAT
'
,
xlong
=
'
XLONG
'
):
self
.
xlat
=
self
.
_set_llcoords
(
None
,
xlat
)
self
.
xlong
=
self
.
_set_llcoords
(
None
,
xlong
)
@staticmethod
def
_set_llcoords
(
wind_grd
,
xll
):
if
isinstance
(
xll
,
str
):
return
wind_grd
[
xll
]
elif
isinstance
(
xll
,
np
.
ndarray
)
or
isinstance
(
xll
,
da
.
core
.
Array
)
or
isinstance
(
xll
,
xr
.
DataArray
):
return
xll
else
:
raise
TypeError
(
f
"
`xll
'
must be name of xll coord of wind_grd as str or np/da/xr array. But is of type
{
type
(
xll
)
}
"
)
@staticmethod
@staticmethod
def
interpolate_to_grid_center
(
data
:
xr
.
DataArray
,
interpolation_dim
:
str
,
**
kwargs
)
->
da
.
array
:
def
interpolate_to_grid_center
(
data
:
xr
.
DataArray
,
interpolation_dim
:
str
,
**
kwargs
)
->
da
.
array
:
"""
"""
...
@@ -212,6 +226,98 @@ class VectorRotate:
...
@@ -212,6 +226,98 @@ class VectorRotate:
d
=
da
.
transpose
(
d
,
idx_to_backward_transpose
)
d
=
da
.
transpose
(
d
,
idx_to_backward_transpose
)
return
d
return
d
def
ugrd2ull
(
self
,
ugrd
,
vgrd
):
"""
Rotate u from to defined system to geographic lat/lon.
:param ugrd: Wind
'
s u-component on grid cell center in to defined system
:type ugrd:
:param vgrd: Wind
'
s v-component on grid cell center in to defined system
:type vgrd:
:return:
:rtype:
"""
raise
NotImplementedError
def
vgrd2vll
(
self
,
ugrd
,
vgrd
):
"""
Rotate v from to defined system to geographic lat/lon.
:param ugrd: Wind
'
s u-component on grid cell center in to defined system
:type ugrd:
:param vgrd: Wind
'
s v-component on grid cell center in to defined system
:type vgrd:
:return:
:rtype:
"""
raise
NotImplementedError
def
ugrd_vgrd2ull_vll
(
self
,
ugrd
,
vgrd
):
"""
Rotate u, v from defined system to u, v in geographic lat/lon.
:param ugrd: Wind
'
s u-component on grid cell center in defined system
:type ugrd:
:param vgrd: Wind
'
s v-component on grid cell center in defined system
:type vgrd:
:return:
:rtype:
"""
return
self
.
ugrd2ull
(
ugrd
,
vgrd
),
self
.
vgrd2vll
(
ugrd
,
vgrd
)
def
ustg_vstg2ull_vll
(
self
,
ustg
,
vstg
,
ustg_dim
:
str
,
vstg_dim
:
str
):
"""
First interpolate u, v from staged grid cells to grid center, than rotate u, v from defined system to u, v
in geographic lat/lon.
:param ustg: Wind
'
s u-component on staged (
"
half
"
) grid in defined system
:type ustg:
:param vstg: Wind
'
s v-component on staged (
"
half
"
) grid in defined system
:type vstg:
:param ustg_dim: Dimension name of staged u-component
:type ustg_dim:
:param vstg_dim: Dimension name of staged v-component
:type vstg_dim:
:return: u, v on grid cell center in geographic lat/lon direction
:rtype:
"""
ugrd
=
self
.
interpolate_to_grid_center
(
ustg
,
ustg_dim
)
vgrd
=
self
.
interpolate_to_grid_center
(
vstg
,
vstg_dim
)
return
self
.
ugrd_vgrd2ull_vll
(
ugrd
,
vgrd
)
def
ugrd_vgrd2wspd_wdir
(
self
,
ugrd
,
vgrd
):
"""
Convert u, v from defined system to wdspd, wdir in geographic lat/lon.
:param ugrd: Wind
'
s u-component on grid center in defined system
:type ugrd:
:param vgrd: Wind
'
s v-component on grid center in defined system
:type vgrd:
:return:
:rtype:
"""
ull
,
vll
=
self
.
ugrd_vgrd2ull_vll
(
ugrd
,
vgrd
)
return
self
.
ull_vll2wspd_wdir
(
ull
,
vll
)
def
ustg_vstg2wspd_wdir
(
self
,
ustg
,
vstg
,
ustg_dim
:
str
,
vstg_dim
:
str
):
"""
First interpolate u, v from staged grid cells to grid center, than rotate u, v from defined system to
wdspd, wdir in geographic lat/lon.
:param ustg: Wind
'
s u-component on staged (
"
half
"
) grid in defined system
:type ustg:
:param vstg: Wind
'
s v-component on staged (
"
half
"
) grid in defined system
:type vstg:
:param ustg_dim: Dimension name of staged u-component
:type ustg_dim:
:param vstg_dim: Dimension name of staged u-component
:type vstg_dim:
:return:
:rtype:
"""
ull
,
vll
=
self
.
ustg_vstg2ull_vll
(
ustg
,
vstg
,
ustg_dim
,
vstg_dim
)
return
self
.
ull_vll2wspd_wdir
(
ull
,
vll
)
@staticmethod
@staticmethod
def
ull_vll2wspd
(
ull
,
vll
):
def
ull_vll2wspd
(
ull
,
vll
):
"""
"""
...
@@ -262,24 +368,14 @@ class VectorRotateLambertConformal2latlon(VectorRotate):
...
@@ -262,24 +368,14 @@ class VectorRotateLambertConformal2latlon(VectorRotate):
TRUELAT2
=
60.
TRUELAT2
=
60.
STAND_LON
=
12.
STAND_LON
=
12.
def
__init__
(
self
,
uu
,
vv
,
xlat
=
'
XLAT
'
,
xlong
=
'
XLONG
'
,
cen_lon
=
CEN_LON
,
cen_lat
=
CEN_LAT
,
truelat1
=
TRUELAT1
,
truelat2
=
TRUELAT2
,
stand_lon
=
STAND_LON
):
def
__init__
(
self
,
cen_lon
=
CEN_LON
,
cen_lat
=
CEN_LAT
,
truelat1
=
TRUELAT1
,
truelat2
=
TRUELAT2
,
stand_lon
=
STAND_LON
,
**
kwargs
):
super
().
__init__
(
**
kwargs
)
self
.
cen_lon
=
cen_lon
self
.
cen_lon
=
cen_lon
self
.
cen_lat
=
cen_lat
self
.
cen_lat
=
cen_lat
self
.
truelat1
=
truelat1
self
.
truelat1
=
truelat1
self
.
truelat2
=
truelat2
self
.
truelat2
=
truelat2
self
.
stand_lon
=
stand_lon
self
.
stand_lon
=
stand_lon
self
.
xlat
=
self
.
_set_llcoords
(
None
,
xlat
)
self
.
xlong
=
self
.
_set_llcoords
(
None
,
xlong
)
@staticmethod
def
_set_llcoords
(
wind_grd
,
xll
):
if
isinstance
(
xll
,
str
):
return
wind_grd
[
xll
]
elif
isinstance
(
xll
,
np
.
ndarray
)
or
isinstance
(
xll
,
da
.
core
.
Array
)
or
isinstance
(
xll
,
xr
.
DataArray
):
return
xll
else
:
raise
TypeError
(
f
"
`xll
'
must be name of xll coord of wind_grd as str or np/da/xr array. But is of type
{
type
(
xll
)
}
"
)
@property
@property
def
cone
(
self
):
def
cone
(
self
):
...
@@ -335,71 +431,7 @@ class VectorRotateLambertConformal2latlon(VectorRotate):
...
@@ -335,71 +431,7 @@ class VectorRotateLambertConformal2latlon(VectorRotate):
"""
"""
return
vgrd
*
da
.
cos
(
self
.
_alpha
)
-
ugrd
*
da
.
sin
(
self
.
_alpha
)
return
vgrd
*
da
.
cos
(
self
.
_alpha
)
-
ugrd
*
da
.
sin
(
self
.
_alpha
)
def
ugrd_vgrd2ull_vll
(
self
,
ugrd
,
vgrd
):
"""
Rotate u, v from Lambert conformal to u, v in geographic lat/lon.
:param ugrd: Wind
'
s u-component on grid cell center in Lambert conformal
:type ugrd:
:param vgrd: Wind
'
s v-component on grid cell center in Lambert conformal
:type vgrd:
:return:
:rtype:
"""
return
self
.
ugrd2ull
(
ugrd
,
vgrd
),
self
.
vgrd2vll
(
ugrd
,
vgrd
)
def
ustg_vstg2ull_vll
(
self
,
ustg
,
vstg
,
ustg_dim
:
str
,
vstg_dim
:
str
):
"""
First interpolate u, v from staged grid cells to grid center, than rotate u, v from Lambert conformal to u, v
in geographic lat/lon.
:param ustg: Wind
'
s u-component on staged (
"
half
"
) grid in Lambert conformal
:type ustg:
:param vstg: Wind
'
s v-component on staged (
"
half
"
) grid in Lambert conformal
:type vstg:
:param ustg_dim: Dimension name of staged u-component
:type ustg_dim:
:param vstg_dim: Dimension name of staged v-component
:type vstg_dim:
:return: u, v on grid cell center in geographic lat/lon direction
:rtype:
"""
ugrd
=
self
.
interpolate_to_grid_center
(
ustg
,
ustg_dim
)
vgrd
=
self
.
interpolate_to_grid_center
(
vstg
,
vstg_dim
)
return
self
.
ugrd_vgrd2ull_vll
(
ugrd
,
vgrd
)
def
ugrd_vgrd2wspd_wdir
(
self
,
ugrd
,
vgrd
):
"""
Convert u, v from Lambert conformal to wdspd, wdir in geographic lat/lon.
:param ugrd: Wind
'
s u-component on grid center in Lambert conformal
:type ugrd:
:param vgrd: Wind
'
s v-component on grid center in Lambert conformal
:type vgrd:
:return:
:rtype:
"""
ull
,
vll
=
self
.
ugrd_vgrd2ull_vll
(
ugrd
,
vgrd
)
return
self
.
ull_vll2wspd_wdir
(
ull
,
vll
)
def
ustg_vstg2wspd_wdir
(
self
,
ustg
,
vstg
,
ustg_dim
:
str
,
vstg_dim
:
str
):
"""
First interpolate u, v from staged grid cells to grid center, than rotate u, v from Lambert conformal to
wdspd, wdir in geographic lat/lon.
:param ustg: Wind
'
s u-component on staged (
"
half
"
) grid in Lambert conformal
:type ustg:
:param vstg: Wind
'
s v-component on staged (
"
half
"
) grid in Lambert conformal
:type vstg:
:param ustg_dim: Dimension name of staged u-component
:type ustg_dim:
:param vstg_dim: Dimension name of staged u-component
:type vstg_dim:
:return:
:rtype:
"""
ull
,
vll
=
self
.
ustg_vstg2ull_vll
(
ustg
,
vstg
,
ustg_dim
,
vstg_dim
)
return
self
.
ull_vll2wspd_wdir
(
ull
,
vll
)
...
...
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