FMS 2025.01-dev
Flexible Modeling System
Loading...
Searching...
No Matches
grid_utils.h
1/***********************************************************************
2 * gnu lesser general Public license
3 *
4 * this file is part of the gfdl flexible modeling system(fms).
5 *
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.
10 *
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
14 * for more details.
15 *
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/***********************************************************************
20 mosaic_util.h
21 this header file provide some utilities routine that will be used in many tools.
22
23 contact: zhi.liang@noaa.gov
24***********************************************************************/
25#ifndef GRID_UTILS_H_
26#define GRID_UTILS_H_
27
28#define TOLERANCE (1.e-6)
29#ifndef RANGE_CHECK_CRITERIA
30#define RANGE_CHECK_CRITERIA 0.05
31#endif
32
33#define MV 50
34
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 )
38
39void error_handler(const char *msg);
40
41int lon_fix(double *x, double *y, int n_in, double tlon);
42
43double minval_double(int size, const double *data);
44
45double maxval_double(int size, const double *data);
46
47double avgval_double(int size, const double *data);
48
49void latlon2xyz(int size, const double *lon, const double *lat, double *x, double *y, double *z);
50
51void xyz2latlon(int size, const double *x, const double *y, const double *z, double *lon, double *lat);
52
53int delete_vtx(double x[], double y[], int n, int n_del);
54
55int insert_vtx(double x[], double y[], int n, int n_ins, double lon_in, double lat_in);
56
57int fix_lon(double lon[], double lat[], int n, double tlon);
58
59double great_circle_distance(double *p1, double *p2);
60
61void vect_cross(const double *p1, const double *p2, double *e );
62
63double spherical_angle(const double *v1, const double *v2, const double *v3);
64
65double great_circle_area(int n, const double *x, const double *y, const double *z);
66
67double * cross(const double *p1, const double *p2);
68
69double dot(const double *p1, const double *p2);
70
71void normalize_vect(double *e);
72
73void unit_vect_latlon(int size, const double *lon, const double *lat, double *vlon, double *vlat);
74
75int intersect_tri_with_line(const double *plane, const double *l1, const double *l2, double *p,
76 double *t);
77
78int invert_matrix_3x3(long double m[], long double m_inv[]);
79
80void mult(long double m[], long double v[], long double out_v[]);
81
82double metric(const double *p);
83
84int inside_a_polygon( double *lon1, double *lat1, int *npts, double *lon2, double *lat2);
85
86int samepoint(double x1, double y1, double z1, double x2, double y2, double z2);
87
88int inside_a_polygon_(double *lon1, double *lat1, int *npts, double *lon2, double *lat2);
89
90int inside_edge(double x0, double y0, double x1, double y1, double x, double y);
91
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);
94
95double poly_ctrlon(const double lon[], const double lat[], int n, double clon);
96
97double poly_ctrlat(const double lon[], const double lat[], int n);
98
99int get_maxxgrid(void);
100
101int get_maxxgrid_(void);
102
103double get_global_area(void);
104
105double get_global_area_(void);
106
107double poly_area(const double lon[], const double lat[], int n);
108
109double poly_area_dimensionless(const double x[], const double y[], int n);
110
111double spherical_excess_area(const double* p_ll, const double* p_ul,
112 const double* p_lr, const double* p_ur, double radius);
113
114void get_grid_area(const int *nlon, const int *nlat, const double *lon, const double *lat, double *area);
115
116void get_grid_great_circle_area(const int *nlon, const int *nlat, const double *lon, const double *lat, double *area);
117
118void get_grid_area_no_adjust(const int *nlon, const int *nlat, const double *lon, const double *lat, double *area);
119
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[]);
122
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[]);
126
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[]);
130
131void get_grid_area_ug(const int *npts, const double *lon, const double *lat, double *area);
132
133void get_grid_great_circle_area_ug(const int *npts, const double *lon, const double *lat, double *area);
134
135void get_grid_area_(const int *nlon, const int *nlat, const double *lon, const double *lat, double *area);
136
137void get_grid_great_circle_area_(const int *nlon, const int *nlat, const double *lon, const double *lat, double *area);
138
139void get_grid_area_ug_(const int *npts, const double *lon, const double *lat, double *area);
140
141void get_grid_great_circle_area_ug_(const int *npts, const double *lon, const double *lat, double *area);
142
143#endif