source: trunk/WRF.COMMON/WRFV2/external/io_grib_share/get_region_center.c

Last change on this file was 11, checked in by aslmd, 14 years ago

spiga@svn-planeto:ajoute le modele meso-echelle martien

File size: 5.3 KB
Line 
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
8int 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
19int 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
127int 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
154int 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}
Note: See TracBrowser for help on using the repository browser.