1 | #include "get_region_center.h" |
---|
2 | #include "gridnav.h" |
---|
3 | #include <stdio.h> |
---|
4 | #include <stdlib.h> |
---|
5 | |
---|
6 | #include "wrf_projection.h" |
---|
7 | |
---|
8 | int get_gridnav_projection(int wrf_projection); |
---|
9 | |
---|
10 | /**************************************************************************** |
---|
11 | * |
---|
12 | * This function calculates the center lat and lon of a region within a larger |
---|
13 | * domain. It is useful for calculating the center of the boundary regions |
---|
14 | * in a domain. |
---|
15 | * |
---|
16 | ****************************************************************************/ |
---|
17 | |
---|
18 | |
---|
19 | int GET_REGION_CENTER(char *MemoryOrderIn, int *projection, |
---|
20 | float *domain_center_lat, |
---|
21 | float *domain_center_lon, int *full_xsize, |
---|
22 | int *full_ysize, float *dx, float *dy, |
---|
23 | float *proj_central_lon, |
---|
24 | int *proj_center_flag, float *truelat1, |
---|
25 | float *truelat2, int *region_xsize, int *region_ysize, |
---|
26 | float *region_center_lat, float *region_center_lon, |
---|
27 | int strlen1) |
---|
28 | { |
---|
29 | |
---|
30 | char *MemoryOrder; |
---|
31 | int grid_projection; |
---|
32 | float full_xcenter, full_ycenter; |
---|
33 | float region_xcenter, region_ycenter; |
---|
34 | int status; |
---|
35 | int orig; |
---|
36 | int x_pos, y_pos; |
---|
37 | GridNav gridnav; |
---|
38 | |
---|
39 | MemoryOrder = (char *)malloc((strlen1+1)*sizeof(char)); |
---|
40 | memcpy(MemoryOrder,MemoryOrderIn,strlen1); |
---|
41 | MemoryOrder[strlen1] = '\0'; |
---|
42 | |
---|
43 | grid_projection = get_gridnav_projection(*projection); |
---|
44 | |
---|
45 | full_xcenter = (*full_xsize - 1) / 2.; |
---|
46 | full_ycenter = (*full_ysize - 1) / 2.; |
---|
47 | region_xcenter = (*region_xsize - 1) / 2.; |
---|
48 | region_ycenter = (*region_ysize - 1) / 2.; |
---|
49 | |
---|
50 | orig = 0; |
---|
51 | |
---|
52 | if (strncmp(MemoryOrder,"XS", 2) == 0) |
---|
53 | { |
---|
54 | x_pos = region_xcenter; |
---|
55 | y_pos = full_ycenter; |
---|
56 | } |
---|
57 | else if (strncmp(MemoryOrder,"XE", 2) == 0) |
---|
58 | { |
---|
59 | x_pos = (*full_xsize - 1) - region_xcenter; |
---|
60 | y_pos = full_ycenter; |
---|
61 | } |
---|
62 | else if (strncmp(MemoryOrder,"YS", 2) == 0) |
---|
63 | { |
---|
64 | x_pos = full_xcenter; |
---|
65 | y_pos = region_ycenter; |
---|
66 | } |
---|
67 | else if (strncmp(MemoryOrder,"YE", 2) == 0) |
---|
68 | { |
---|
69 | x_pos = full_xcenter; |
---|
70 | y_pos = (*full_ysize - 1) - region_ycenter; |
---|
71 | } |
---|
72 | else |
---|
73 | { |
---|
74 | orig = 1; |
---|
75 | } |
---|
76 | |
---|
77 | if (orig == 1) |
---|
78 | { |
---|
79 | *region_center_lat = *domain_center_lat; |
---|
80 | *region_center_lon = *domain_center_lon; |
---|
81 | status = 0; |
---|
82 | } |
---|
83 | else |
---|
84 | { |
---|
85 | /* Initialize grid structure */ |
---|
86 | /* |
---|
87 | status = GRID_init(grid_info->center_lat, grid_info->central_lon, |
---|
88 | grid_projection, |
---|
89 | grid_info->latin1, grid_info->latin2, |
---|
90 | grid_info->xpoints, grid_info->ypoints, |
---|
91 | grid_info->Di, grid_info->Dj, |
---|
92 | grid_info->center_lat, grid_info->center_lon, |
---|
93 | x_center, y_center, |
---|
94 | &gridnav); |
---|
95 | */ |
---|
96 | status = GRID_init(*domain_center_lat, *proj_central_lon, |
---|
97 | grid_projection, |
---|
98 | *truelat1, *truelat2, |
---|
99 | *full_xsize, *full_ysize, *dx, *dy, |
---|
100 | *domain_center_lat, *domain_center_lon, |
---|
101 | full_xcenter, full_ycenter, |
---|
102 | &gridnav); |
---|
103 | if (!status) |
---|
104 | { |
---|
105 | fprintf(stderr,"get_region_center: error from GRID_init\n"); |
---|
106 | } |
---|
107 | |
---|
108 | /* get lat/lon of center of region */ |
---|
109 | status = GRID_to_latlon(&gridnav, x_pos, y_pos, region_center_lat, |
---|
110 | region_center_lon); |
---|
111 | if (!status) |
---|
112 | { |
---|
113 | fprintf(stderr, |
---|
114 | "get_region_cneter: error from GRID_to_latlon for first lat/lon\n"); |
---|
115 | } |
---|
116 | |
---|
117 | } |
---|
118 | |
---|
119 | free(MemoryOrder); |
---|
120 | return status; |
---|
121 | |
---|
122 | } |
---|
123 | /****************************************************************************** |
---|
124 | * translates the grid projection identifier from the WRF id to the grib id. |
---|
125 | *****************************************************************************/ |
---|
126 | |
---|
127 | int get_gridnav_projection(int wrf_projection) |
---|
128 | { |
---|
129 | int gridnav_projection; |
---|
130 | |
---|
131 | /* Set the grid projection in the gridnav units */ |
---|
132 | switch (wrf_projection) |
---|
133 | { |
---|
134 | case WRF_LATLON: |
---|
135 | gridnav_projection = GRID_LATLON; |
---|
136 | break; |
---|
137 | case WRF_MERCATOR: |
---|
138 | gridnav_projection = GRID_MERCATOR; |
---|
139 | break; |
---|
140 | case WRF_LAMBERT: |
---|
141 | gridnav_projection = GRID_LAMCON; |
---|
142 | break; |
---|
143 | case WRF_POLAR_STEREO: |
---|
144 | gridnav_projection = GRID_POLSTR; |
---|
145 | break; |
---|
146 | default: |
---|
147 | fprintf(stderr,"Error, invalid projection: %d\n",wrf_projection); |
---|
148 | gridnav_projection = -1; |
---|
149 | } |
---|
150 | |
---|
151 | return gridnav_projection; |
---|
152 | } |
---|
153 | |
---|
154 | int GET_LL_LATLON(float *central_lat, float *central_lon, int *projection, |
---|
155 | float *latin1, float *latin2, int *nx, int *ny, |
---|
156 | float *dx, float *dy, float *center_lat, float *center_lon, |
---|
157 | float *LLLa, float *LLLo, float *URLa, float *URLo, int *ierr) |
---|
158 | { |
---|
159 | |
---|
160 | int grid_projection; |
---|
161 | float x_center; |
---|
162 | float y_center; |
---|
163 | GridNav gridnav; |
---|
164 | int status; |
---|
165 | |
---|
166 | grid_projection = get_gridnav_projection(*projection); |
---|
167 | |
---|
168 | /* Get coords of center of grid */ |
---|
169 | x_center = (*nx + 1)/2.; |
---|
170 | y_center = (*ny + 1)/2.; |
---|
171 | |
---|
172 | /* Initialize grid structure */ |
---|
173 | status = GRID_init(*central_lat, *central_lon, grid_projection, |
---|
174 | *latin1, *latin2, *nx, *ny, *dx, *dy, |
---|
175 | *center_lat, *center_lon, x_center, y_center, |
---|
176 | &gridnav); |
---|
177 | if (!status) |
---|
178 | { |
---|
179 | fprintf(stderr,"write_grib: error from GRID_init\n"); |
---|
180 | *ierr = 1; |
---|
181 | return; |
---|
182 | } |
---|
183 | |
---|
184 | /* get lat/lon of lower left corner */ |
---|
185 | status = GRID_to_latlon(&gridnav, 1, 1, LLLa, LLLo); |
---|
186 | if (!status) |
---|
187 | { |
---|
188 | fprintf(stderr, |
---|
189 | "write_grib: error from GRID_to_latlon for first lat/lon\n"); |
---|
190 | *ierr = 1; |
---|
191 | return; |
---|
192 | } |
---|
193 | |
---|
194 | /* get lat/lon of upper right corner */ |
---|
195 | status = GRID_to_latlon(&gridnav, *nx, *ny, URLa, URLo); |
---|
196 | if (!status) |
---|
197 | { |
---|
198 | fprintf(stderr, |
---|
199 | "write_grib: error from GRID_to_latlon for first lat/lon\n"); |
---|
200 | *ierr = 1; |
---|
201 | return; |
---|
202 | } |
---|
203 | |
---|
204 | *ierr = 0; |
---|
205 | return; |
---|
206 | |
---|
207 | } |
---|