metradar 0.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- metradar/__init__.py +7 -0
- metradar/cnrad_level2.py +1326 -0
- metradar/comm_func.py +135 -0
- metradar/construct_aws_refvpr_mainprog.py +515 -0
- metradar/construct_aws_refvpr_mainprog_cams.py +310 -0
- metradar/construct_aws_refvpr_mainprog_datan3d.py +386 -0
- metradar/construct_aws_refvpr_mainprog_swan.py +306 -0
- metradar/decode_fmt_pyart.py +200 -0
- metradar/decode_pup_rose.py +1993 -0
- metradar/draw_mosaic_new.py +421 -0
- metradar/draw_radar_aws_jilin_new.py +206 -0
- metradar/draw_radar_comp_func.py +1379 -0
- metradar/exceptions.py +50 -0
- metradar/geo_transforms_pyart.py +627 -0
- metradar/get_cross_section_from_pyart.py +354 -0
- metradar/get_tlogp_from_sharppy.py +93 -0
- metradar/grid.py +281 -0
- metradar/grid_data.py +64 -0
- metradar/main_pydda.py +653 -0
- metradar/make_gif.py +24 -0
- metradar/make_mosaic_mp_archive.py +538 -0
- metradar/mosaic_merge.py +64 -0
- metradar/mosaic_quickdraw.py +338 -0
- metradar/nowcast_by_pysteps.py +219 -0
- metradar/oa_couhua.py +166 -0
- metradar/oa_dig_func.py +955 -0
- metradar/parse_pal.py +148 -0
- metradar/pgmb_io.py +169 -0
- metradar/prepare_for_radar_draw.py +197 -0
- metradar/read_new_mosaic.py +33 -0
- metradar/read_new_mosaic_func.py +231 -0
- metradar/retrieve_cmadaas.py +3126 -0
- metradar/retrieve_micaps_server.py +2061 -0
- metradar/rose_structer.py +807 -0
- metradar/trans_nc_pgmb.py +62 -0
- metradar/trans_new_mosaic_nc.py +309 -0
- metradar/trans_polor2grid_func.py +203 -0
- metradar-0.1.0.dist-info/METADATA +12 -0
- metradar-0.1.0.dist-info/RECORD +41 -0
- metradar-0.1.0.dist-info/WHEEL +5 -0
- metradar-0.1.0.dist-info/top_level.txt +1 -0
metradar/oa_couhua.py
ADDED
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
'''
|
|
2
|
+
封装凑华的客观分析程序
|
|
3
|
+
2023年4月6日
|
|
4
|
+
朱文剑
|
|
5
|
+
|
|
6
|
+
'''
|
|
7
|
+
|
|
8
|
+
# %%
|
|
9
|
+
import numpy as np
|
|
10
|
+
import math
|
|
11
|
+
import time
|
|
12
|
+
from grid import *
|
|
13
|
+
from grid_data import *
|
|
14
|
+
|
|
15
|
+
# %%迭代函数
|
|
16
|
+
def frprmn2(x,targe,grads,tol = 0.001,caculate_time = 60,show = False):
|
|
17
|
+
x0 = x
|
|
18
|
+
n = len(x0)
|
|
19
|
+
x_min = math.sqrt(1.0/n)
|
|
20
|
+
df = grads(x0)
|
|
21
|
+
g_0 = -df
|
|
22
|
+
h_0 = g_0
|
|
23
|
+
f_min_line0 = 0
|
|
24
|
+
f_min_line1 = targe(x0)
|
|
25
|
+
start_time = time.time()
|
|
26
|
+
for i in range(10000):
|
|
27
|
+
d0 = np.dot(df,h_0)
|
|
28
|
+
x1 = x0 + h_0 * x_min
|
|
29
|
+
df = grads(x1)
|
|
30
|
+
d1 = np.dot(df,h_0)
|
|
31
|
+
if d0 == d1:
|
|
32
|
+
f_min_line1 = targe(x0)
|
|
33
|
+
return x0
|
|
34
|
+
else:
|
|
35
|
+
x_min = x_min * d0/(d0 - d1)
|
|
36
|
+
x0 += h_0 * x_min
|
|
37
|
+
df = grads(x0)
|
|
38
|
+
g_1 = -df
|
|
39
|
+
v1 = np.dot(g_1 - g_0, g_1)
|
|
40
|
+
v2 = np.dot(g_0,g_0)
|
|
41
|
+
h_0 = g_1 + (v1/v2) * h_0
|
|
42
|
+
g_0 = g_1
|
|
43
|
+
if i%10 == 0:
|
|
44
|
+
f_min_line0 = f_min_line1
|
|
45
|
+
f_min_line1 = targe(x0)
|
|
46
|
+
if show:print(str(i) + " " + str(f_min_line1))
|
|
47
|
+
delta = 2 * abs(f_min_line1 - f_min_line0) / (abs(f_min_line1) + abs(f_min_line0)) - tol
|
|
48
|
+
if delta < 0:
|
|
49
|
+
return x0
|
|
50
|
+
if(time.time() - start_time > caculate_time):
|
|
51
|
+
return x0
|
|
52
|
+
print('迭代分析超过10000次而退出')
|
|
53
|
+
return x0
|
|
54
|
+
|
|
55
|
+
# 客观分析算法的代码
|
|
56
|
+
# def interp_sg_oa(sta0,background,sm = 1,effectR = 1000,rate_of_model = 0,show = False):
|
|
57
|
+
def interp_sg_oa(x,y,z,reso,boundary=None,sm = 1,effectR = 1000,rate_of_model = 0,show = False):
|
|
58
|
+
|
|
59
|
+
if boundary is None:
|
|
60
|
+
wlon = int(np.min(x))
|
|
61
|
+
elon = int(np.max(x))+1
|
|
62
|
+
slat = int(np.min(y))
|
|
63
|
+
nlat = int(np.max(y))+1
|
|
64
|
+
else:
|
|
65
|
+
wlon = boundary[0]
|
|
66
|
+
elon = boundary[1]
|
|
67
|
+
slat = boundary[2]
|
|
68
|
+
nlat = boundary[3]
|
|
69
|
+
|
|
70
|
+
grid0 = grid([wlon,elon,reso],[slat,nlat,reso])
|
|
71
|
+
background = grid_data(grid0)
|
|
72
|
+
grd = background.copy()
|
|
73
|
+
ig = ((x - grid0.slon) // grid0.dlon).astype(dtype = 'int16')
|
|
74
|
+
jg = ((y - grid0.slat) // grid0.dlat).astype(dtype = 'int16')
|
|
75
|
+
dx = (x - grid0.slon) / grid0.dlon - ig
|
|
76
|
+
dy = (y - grid0.slat) / grid0.dlat - jg
|
|
77
|
+
|
|
78
|
+
# zhuwj add
|
|
79
|
+
flag1 = ig+1 <= grid0.nlon-1
|
|
80
|
+
flag2 = jg+1 <= grid0.nlat-1
|
|
81
|
+
flag = flag1 & flag2
|
|
82
|
+
ig = ig[flag]
|
|
83
|
+
jg = jg[flag]
|
|
84
|
+
dx = dx[flag]
|
|
85
|
+
dy = dy[flag]
|
|
86
|
+
z = z[flag]
|
|
87
|
+
|
|
88
|
+
c00 = (1 - dx) * (1 - dy)
|
|
89
|
+
c01 = dx * (1 - dy)
|
|
90
|
+
c10 = (1-dx) * dy
|
|
91
|
+
c11 = dx * dy
|
|
92
|
+
lat = grd["lat"].values
|
|
93
|
+
sr = 1/np.power(np.cos(lat*math.pi/180),4)
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
def targe(x):
|
|
98
|
+
grdv = x.reshape(grid0.nlat,grid0.nlon)
|
|
99
|
+
dx = grdv[:,:-2] + grdv[:,2:] - 2 * grdv[:,1:-1]
|
|
100
|
+
dx2 = dx**2
|
|
101
|
+
sum_dx =np.sum(dx2,axis=1)
|
|
102
|
+
cost1 = np.sum(sum_dx * sr)
|
|
103
|
+
|
|
104
|
+
dy = grdv[:-2,:] + grdv[2:,:] - 2 * grdv[1:-1,:]
|
|
105
|
+
dy2 = dy**2
|
|
106
|
+
sum_dy = np.sum(dy2)
|
|
107
|
+
cost1 = cost1 + sum_dy
|
|
108
|
+
|
|
109
|
+
sta_g = c00 * grdv[jg, ig] + c01 * grdv[jg, ig + 1] + c10 * grdv[jg + 1, ig] + c11 * grdv[
|
|
110
|
+
jg + 1, ig + 1]
|
|
111
|
+
error = z - sta_g
|
|
112
|
+
cost2 = np.sum(error**2)
|
|
113
|
+
cost3 = 0
|
|
114
|
+
cost = sm * cost1 + cost2 + cost3
|
|
115
|
+
return cost
|
|
116
|
+
|
|
117
|
+
def grads(x):
|
|
118
|
+
grdv = x.reshape(grid0.nlat,grid0.nlon)
|
|
119
|
+
g1 = np.zeros(grdv.shape)
|
|
120
|
+
|
|
121
|
+
sr_expend = np.tile(sr,[grid0.nlon-2,1]).T
|
|
122
|
+
|
|
123
|
+
dx = 2 * (grdv[:,:-2] + grdv[:,2:] - 2 * grdv[:,1:-1])
|
|
124
|
+
dx_sr = dx * sr_expend
|
|
125
|
+
g1[:,:-2] = dx_sr
|
|
126
|
+
g1[:,2:] += dx_sr
|
|
127
|
+
g1[:,1:-1] -= 2*dx_sr
|
|
128
|
+
|
|
129
|
+
dy = 2 *(grdv[:-2,:] + grdv[2:,:] - 2 * grdv[1:-1,:])
|
|
130
|
+
g1[:-2,:] += dy
|
|
131
|
+
g1[2:,:] += dy
|
|
132
|
+
g1[1:-1,:] -= 2 * dy
|
|
133
|
+
|
|
134
|
+
g2 = np.zeros(grdv.shape)
|
|
135
|
+
sta_g = c00 * grdv[jg, ig] + c01 * grdv[jg, ig + 1] + c10 * grdv[jg + 1, ig] + c11 * grdv[jg + 1, ig + 1]
|
|
136
|
+
d = 2 * (sta_g - z)
|
|
137
|
+
g2[jg,ig] += d * c00
|
|
138
|
+
g2[jg,ig + 1] += d * c01
|
|
139
|
+
g2[jg+1,ig] += d * c10
|
|
140
|
+
g2[jg+1,ig+1] += d * c11
|
|
141
|
+
|
|
142
|
+
g3 = 0
|
|
143
|
+
|
|
144
|
+
g = sm * g1 + g2 + g3
|
|
145
|
+
return g.reshape(-1)
|
|
146
|
+
|
|
147
|
+
x = grd.values.reshape(-1)
|
|
148
|
+
x_oa = frprmn2(x, targe, grads,show = show)
|
|
149
|
+
result = grid_data(grid0,x_oa)
|
|
150
|
+
|
|
151
|
+
grid_x = np.linspace(wlon, elon, grid0.nlon)
|
|
152
|
+
grid_y = np.linspace(slat, nlat, grid0.nlat)
|
|
153
|
+
|
|
154
|
+
gx, gy = np.meshgrid(grid_x, grid_y)
|
|
155
|
+
|
|
156
|
+
return gx, gy,result.data[0,0,0,0,:,:]
|
|
157
|
+
|
|
158
|
+
# return result
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
# %%
|
|
162
|
+
|
|
163
|
+
if __name__ == "__main__":
|
|
164
|
+
#读取观测数据
|
|
165
|
+
pass
|
|
166
|
+
|