1 #include "get_region_center.h"
6 #include "wrf_projection.h"
8 int get_gridnav_projection(int wrf_projection
);
10 /****************************************************************************
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
16 ****************************************************************************/
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
,
32 float full_xcenter
, full_ycenter
;
33 float region_xcenter
, region_ycenter
;
39 MemoryOrder
= (char *)malloc((strlen1
+1)*sizeof(char));
40 memcpy(MemoryOrder
,MemoryOrderIn
,strlen1
);
41 MemoryOrder
[strlen1
] = '\0';
43 grid_projection
= get_gridnav_projection(*projection
);
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.;
52 if (strncmp(MemoryOrder
,"XS", 2) == 0)
54 x_pos
= region_xcenter
;
57 else if (strncmp(MemoryOrder
,"XE", 2) == 0)
59 x_pos
= (*full_xsize
- 1) - region_xcenter
;
62 else if (strncmp(MemoryOrder
,"YS", 2) == 0)
65 y_pos
= region_ycenter
;
67 else if (strncmp(MemoryOrder
,"YE", 2) == 0)
70 y_pos
= (*full_ysize
- 1) - region_ycenter
;
79 *region_center_lat
= *domain_center_lat
;
80 *region_center_lon
= *domain_center_lon
;
85 /* Initialize grid structure */
87 status = GRID_init(grid_info->center_lat, grid_info->central_lon,
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,
96 status
= GRID_init(*domain_center_lat
, *proj_central_lon
,
99 *full_xsize
, *full_ysize
, *dx
, *dy
,
100 *domain_center_lat
, *domain_center_lon
,
101 full_xcenter
, full_ycenter
,
105 fprintf(stderr
,"get_region_center: error from GRID_init\n");
108 /* get lat/lon of center of region */
109 status
= GRID_to_latlon(&gridnav
, x_pos
, y_pos
, region_center_lat
,
114 "get_region_cneter: error from GRID_to_latlon for first lat/lon\n");
123 /******************************************************************************
124 * translates the grid projection identifier from the WRF id to the grib id.
125 *****************************************************************************/
127 int get_gridnav_projection(int wrf_projection
)
129 int gridnav_projection
;
131 /* Set the grid projection in the gridnav units */
132 switch (wrf_projection
)
136 gridnav_projection
= GRID_LATLON
;
139 gridnav_projection
= GRID_MERCATOR
;
142 gridnav_projection
= GRID_LAMCON
;
144 case WRF_POLAR_STEREO
:
145 gridnav_projection
= GRID_POLSTR
;
148 fprintf(stderr
,"Error, invalid projection: %d\n",wrf_projection
);
149 gridnav_projection
= -1;
152 return gridnav_projection
;
155 int GET_LL_LATLON(float *central_lat
, float *central_lon
, int *projection
,
156 float *latin1
, float *latin2
, int *nx
, int *ny
,
157 float *dx
, float *dy
, float *center_lat
, float *center_lon
,
158 float *LLLa
, float *LLLo
, float *URLa
, float *URLo
, int *ierr
)
167 grid_projection
= get_gridnav_projection(*projection
);
169 /* Get coords of center of grid */
170 x_center
= (*nx
+ 1)/2.;
171 y_center
= (*ny
+ 1)/2.;
173 /* Initialize grid structure */
174 status
= GRID_init(*central_lat
, *central_lon
, grid_projection
,
175 *latin1
, *latin2
, *nx
, *ny
, *dx
, *dy
,
176 *center_lat
, *center_lon
, x_center
, y_center
,
180 fprintf(stderr
,"write_grib: error from GRID_init\n");
185 /* get lat/lon of lower left corner */
186 status
= GRID_to_latlon(&gridnav
, 1, 1, LLLa
, LLLo
);
190 "write_grib: error from GRID_to_latlon for first lat/lon\n");
195 /* get lat/lon of upper right corner */
196 status
= GRID_to_latlon(&gridnav
, *nx
, *ny
, URLa
, URLo
);
200 "write_grib: error from GRID_to_latlon for first lat/lon\n");