1 #include "get_region_center.h"
7 #include "wrf_projection.h"
9 int get_gridnav_projection(int wrf_projection
);
11 /****************************************************************************
13 * This function calculates the center lat and lon of a region within a larger
14 * domain. It is useful for calculating the center of the boundary regions
17 ****************************************************************************/
20 int GET_REGION_CENTER(char *MemoryOrderIn
, int *projection
,
21 float *domain_center_lat
,
22 float *domain_center_lon
, int *full_xsize
,
23 int *full_ysize
, float *dx
, float *dy
,
24 float *proj_central_lon
,
25 int *proj_center_flag
, float *truelat1
,
26 float *truelat2
, int *region_xsize
, int *region_ysize
,
27 float *region_center_lat
, float *region_center_lon
,
33 float full_xcenter
, full_ycenter
;
34 float region_xcenter
, region_ycenter
;
40 MemoryOrder
= (char *)malloc((strlen1
+1)*sizeof(char));
41 memcpy(MemoryOrder
,MemoryOrderIn
,strlen1
);
42 MemoryOrder
[strlen1
] = '\0';
44 grid_projection
= get_gridnav_projection(*projection
);
46 full_xcenter
= (*full_xsize
- 1) / 2.;
47 full_ycenter
= (*full_ysize
- 1) / 2.;
48 region_xcenter
= (*region_xsize
- 1) / 2.;
49 region_ycenter
= (*region_ysize
- 1) / 2.;
53 if (strncmp(MemoryOrder
,"XS", 2) == 0)
55 x_pos
= region_xcenter
;
58 else if (strncmp(MemoryOrder
,"XE", 2) == 0)
60 x_pos
= (*full_xsize
- 1) - region_xcenter
;
63 else if (strncmp(MemoryOrder
,"YS", 2) == 0)
66 y_pos
= region_ycenter
;
68 else if (strncmp(MemoryOrder
,"YE", 2) == 0)
71 y_pos
= (*full_ysize
- 1) - region_ycenter
;
80 *region_center_lat
= *domain_center_lat
;
81 *region_center_lon
= *domain_center_lon
;
86 /* Initialize grid structure */
88 status = GRID_init(grid_info->center_lat, grid_info->central_lon,
90 grid_info->latin1, grid_info->latin2,
91 grid_info->xpoints, grid_info->ypoints,
92 grid_info->Di, grid_info->Dj,
93 grid_info->center_lat, grid_info->center_lon,
97 status
= GRID_init(*domain_center_lat
, *proj_central_lon
,
100 *full_xsize
, *full_ysize
, *dx
, *dy
,
101 *domain_center_lat
, *domain_center_lon
,
102 full_xcenter
, full_ycenter
,
106 fprintf(stderr
,"get_region_center: error from GRID_init\n");
109 /* get lat/lon of center of region */
110 status
= GRID_to_latlon(&gridnav
, x_pos
, y_pos
, region_center_lat
,
115 "get_region_cneter: error from GRID_to_latlon for first lat/lon\n");
124 /******************************************************************************
125 * translates the grid projection identifier from the WRF id to the grib id.
126 *****************************************************************************/
128 int get_gridnav_projection(int wrf_projection
)
130 int gridnav_projection
;
132 /* Set the grid projection in the gridnav units */
133 switch (wrf_projection
)
137 gridnav_projection
= GRID_LATLON
;
140 gridnav_projection
= GRID_MERCATOR
;
143 gridnav_projection
= GRID_LAMCON
;
145 case WRF_POLAR_STEREO
:
146 gridnav_projection
= GRID_POLSTR
;
149 fprintf(stderr
,"Error, invalid projection: %d\n",wrf_projection
);
150 gridnav_projection
= -1;
153 return gridnav_projection
;
156 int GET_LL_LATLON(float *central_lat
, float *central_lon
, int *projection
,
157 float *latin1
, float *latin2
, int *nx
, int *ny
,
158 float *dx
, float *dy
, float *center_lat
, float *center_lon
,
159 float *LLLa
, float *LLLo
, float *URLa
, float *URLo
, int *ierr
)
168 grid_projection
= get_gridnav_projection(*projection
);
170 /* Get coords of center of grid */
171 x_center
= (*nx
+ 1)/2.;
172 y_center
= (*ny
+ 1)/2.;
174 /* Initialize grid structure */
175 status
= GRID_init(*central_lat
, *central_lon
, grid_projection
,
176 *latin1
, *latin2
, *nx
, *ny
, *dx
, *dy
,
177 *center_lat
, *center_lon
, x_center
, y_center
,
181 fprintf(stderr
,"write_grib: error from GRID_init\n");
186 /* get lat/lon of lower left corner */
187 status
= GRID_to_latlon(&gridnav
, 1, 1, LLLa
, LLLo
);
191 "write_grib: error from GRID_to_latlon for first lat/lon\n");
196 /* get lat/lon of upper right corner */
197 status
= GRID_to_latlon(&gridnav
, *nx
, *ny
, URLa
, URLo
);
201 "write_grib: error from GRID_to_latlon for first lat/lon\n");