1/***********************************************************************
2 * gnu lesser general
Public license
4 * this file is part of the gfdl flexible modeling system(fms).
6 * fms is free software: you can redistribute it and/or modify it under
7 * the terms of the gnu lesser general
Public license as published by
8 * the free software foundation, either version 3 of the license, or(at
9 * your option) any later version.
11 * fms is distributed in the hope that it will be useful, but without
12 * any warranty; without even the implied warranty of merchantability or
13 * fitness for a particular purpose. see the gnu general
Public license
16 * you should have received a copy of the gnu lesser general
Public
17 * license along with fms.
If not, see <http://www.gnu.org/licenses/>.
18 **********************************************************************/
19/***********************************************************************
21 this header file provide some utilities routine that will be used in many tools.
23 contact: zhi.liang@noaa.gov
24***********************************************************************/
28#define TOLERANCE (1.e-6)
29#ifndef RANGE_CHECK_CRITERIA
30#define RANGE_CHECK_CRITERIA 0.05
35#define min(a,b) (a<b ? a:b)
36#define max(a,b) (a>b ? a:b)
37#define SMALL_VALUE ( 1.e-10 )
39void error_handler(const char *msg);
41int lon_fix(double *x, double *y, int n_in, double tlon);
43double minval_double(int
size, const double *data);
45double maxval_double(int
size, const double *data);
47double avgval_double(int
size, const double *data);
49void latlon2xyz(int
size, const double *lon, const double *lat, double *x, double *y, double *z);
51void xyz2latlon(int
size, const double *x, const double *y, const double *z, double *lon, double *lat);
53int delete_vtx(double x[], double y[], int n, int n_del);
55int insert_vtx(double x[], double y[], int n, int n_ins, double lon_in, double lat_in);
57int fix_lon(double lon[], double lat[], int n, double tlon);
59double great_circle_distance(double *p1, double *p2);
61void vect_cross(const double *p1, const double *p2, double *e );
63double spherical_angle(const double *v1, const double *v2, const double *v3);
65double great_circle_area(int n, const double *x, const double *y, const double *z);
67double * cross(const double *p1, const double *p2);
69double dot(const double *p1, const double *p2);
71void normalize_vect(double *e);
73void unit_vect_latlon(int
size, const double *lon, const double *lat, double *vlon, double *vlat);
75int intersect_tri_with_line(const double *plane, const double *l1, const double *l2, double *p,
78int invert_matrix_3x3(long double m[], long double m_inv[]);
80void mult(long double m[], long double v[], long double out_v[]);
82double metric(const double *p);
84int inside_a_polygon( double *lon1, double *lat1, int *npts, double *lon2, double *lat2);
86int samepoint(double x1, double y1, double z1, double x2, double y2, double z2);
88int inside_a_polygon_(double *lon1, double *lat1, int *npts, double *lon2, double *lat2);
90int inside_edge(double x0, double y0, double x1, double y1, double x, double y);
92int line_intersect_2d_3d(double *a1, double *a2, double *q1, double *q2, double *q3,
93 double *intersect, double *u_a, double *u_q, int *inbound);
95double poly_ctrlon(const double lon[], const double lat[], int n, double clon);
97double poly_ctrlat(const double lon[], const double lat[], int n);
99int get_maxxgrid(void);
101int get_maxxgrid_(void);
103double get_global_area(void);
105double get_global_area_(void);
107double poly_area(const double lon[], const double lat[], int n);
109double poly_area_dimensionless(const double x[], const double y[], int n);
111double spherical_excess_area(const double* p_ll, const double* p_ul,
112 const double* p_lr, const double* p_ur, double radius);
114void get_grid_area(const int *nlon, const int *nlat, const double *lon, const double *lat, double *area);
116void get_grid_great_circle_area(const int *nlon, const int *nlat, const double *lon, const double *lat, double *area);
118void get_grid_area_no_adjust(const int *nlon, const int *nlat, const double *lon, const double *lat, double *area);
120int clip(const double lon_in[], const double lat_in[], int n_in, double ll_lon, double ll_lat,
121 double ur_lon, double ur_lat, double lon_out[], double lat_out[]);
123int clip_2dx2d(const double lon1_in[], const double lat1_in[], int n1_in,
124 const double lon2_in[], const double lat2_in[], int n2_in,
125 double lon_out[], double lat_out[]);
127int clip_2dx2d_great_circle(const double x1_in[], const double y1_in[], const double z1_in[], int n1_in,
128 const double x2_in[], const double y2_in[], const double z2_in [], int n2_in,
129 double x_out[], double y_out[], double z_out[]);
131void get_grid_area_ug(const int *npts, const double *lon, const double *lat, double *area);
133void get_grid_great_circle_area_ug(const int *npts, const double *lon, const double *lat, double *area);
135void get_grid_area_(const int *nlon, const int *nlat, const double *lon, const double *lat, double *area);
137void get_grid_great_circle_area_(const int *nlon, const int *nlat, const double *lon, const double *lat, double *area);
139void get_grid_area_ug_(const int *npts, const double *lon, const double *lat, double *area);
141void get_grid_great_circle_area_ug_(const int *npts, const double *lon, const double *lat, double *area);