1
2 /*****************************************************************************
3 *
4 * MODULE: Grass PDE Numerical Library
5 * AUTHOR(S): Soeren Gebbert, Berlin (GER) Dec 2006
6 * soerengebbert <at> gmx <dot> de
7 *
8 * PURPOSE: Array management functions
9 * part of the gpde library
10 *
11 * COPYRIGHT: (C) 2000 by the GRASS Development Team
12 *
13 * This program is free software under the GNU General Public
14 * License (>=v2). Read the file COPYING that comes with GRASS
15 * for details.
16 *
17 *****************************************************************************/
18
19 #include <math.h>
20 #include <grass/N_pde.h>
21 #include <grass/glocale.h>
22
23
24 /*!
25 * \brief Calculate the arithmetic mean of values a and b
26 *
27 * mean = (a+b)/2
28 *
29 * \param a double
30 * \param b double
31 * \return val double
32 * */
N_calc_arith_mean(double a,double b)33 double N_calc_arith_mean(double a, double b)
34 {
35 double val = 0;
36
37 val = (a + b) / 2.0;
38
39 return val;
40 }
41
42 /*!
43 * \brief Calculate the arithmetic mean of the values in vector a
44 * of size n
45 *
46 * n = [0 ... size[
47 * mean = (a[0] + a[1] + ... + a[n])/size
48 *
49 * \param a double * -- the value vector
50 * \param size int -- the size of the vector a
51 * \return val double
52 * */
N_calc_arith_mean_n(double * a,int size)53 double N_calc_arith_mean_n(double *a, int size)
54 {
55 double val = 0.0;
56 int i;
57
58 for (i = 0; i < size; i++)
59 val += a[i];
60
61 val = (val / (double)size);
62
63 return val;
64 }
65
66
67 /*!
68 * \brief Calculate the geometrical mean of values a and b
69 *
70 * mean = sqrt(a*b)
71 *
72 * \param a double
73 * \param b double
74 * \return val double
75 * */
N_calc_geom_mean(double a,double b)76 double N_calc_geom_mean(double a, double b)
77 {
78 double val = 0;
79
80 val = sqrt(a * b);
81
82 return val;
83 }
84
85 /*!
86 * \brief Calculate the geometrical mean of the values in vector a
87 * of size n
88 *
89 * n = [0 ... size[
90 * mean = pow((a[0] * a[1] * ... * a[n]), 1.0/size)
91 *
92 * \param a double * -- the value vector
93 * \param size int -- the size of the vector a
94 * \return val double
95 * */
N_calc_geom_mean_n(double * a,int size)96 double N_calc_geom_mean_n(double *a, int size)
97 {
98 double val = 1;
99 int i;
100
101 for (i = 0; i < size; i++)
102 val *= a[i];
103
104 val = (double)pow((long double)val, (long double)1.0 / (long double)size);
105
106 return val;
107 }
108
109
110 /*!
111 * \brief Calculate the harmonical mean of values a and b
112 *
113 * mean = 2*(a*b)/(a + b)
114 *
115 * \param a double
116 * \param b double
117 * \return val double -- if (a + b) == 0, a 0 is returned
118 * */
N_calc_harmonic_mean(double a,double b)119 double N_calc_harmonic_mean(double a, double b)
120 {
121 double val = 0.0;
122
123 if ((a + b) != 0)
124 val = 2.0 * (a * b) / (a + b);
125
126 return val;
127 }
128
129 /*!
130 * \brief Calculate the harmonical mean of the values in vector a
131 * of size n
132 *
133 * n = [0 ... size[
134 * mean = 1/(1/size *(1/a[0] + 1/a[1] + ... + 1/a[n]))
135 *
136 * \param a double * -- the value vector
137 * \param size int -- the size of the vector a
138 * \return val double -- if one division with 0 is detected, 0 will be returned
139 * */
N_calc_harmonic_mean_n(double * a,int size)140 double N_calc_harmonic_mean_n(double *a, int size)
141 {
142 double val = 0;
143 int i;
144
145 for (i = 0; i < size; i++)
146 if (a[i] != 0.0)
147 val += 1.0 / a[i];
148 else
149 return 0.0;
150
151 if (val == 0.0)
152 return 0.0;
153 else
154 val = 1.0 / (1.0 / (double)size * val);
155
156 return val;
157 }
158
159
160 /*!
161 * \brief Calculate the quadratic mean of values a and b
162 *
163 * mean = sqrt((a*a + b*b)/2)
164 *
165 * \param a double
166 * \param b double
167 * \return val double
168 * */
N_calc_quad_mean(double a,double b)169 double N_calc_quad_mean(double a, double b)
170 {
171 double val = 0.0;
172
173 val = sqrt((a * a + b * b) / 2.0);
174
175 return val;
176 }
177
178 /*!
179 * \brief Calculate the quadratic mean of the values in vector a
180 * of size n
181 *
182 * n = [0 ... size[
183 * mean = sqrt((a[0]*a[0] + a[1]*a[1] + ... + a[n]*a[n])/size)
184 *
185 * \param a double * -- the value vector
186 * \param size int -- the size of the vector a
187 * \return val double
188 * */
N_calc_quad_mean_n(double * a,int size)189 double N_calc_quad_mean_n(double *a, int size)
190 {
191 double val = 0;
192 int i;
193
194 for (i = 0; i < size; i++)
195 val += a[i] * a[i];
196
197 val = sqrt(val / (double)size);
198
199 return val;
200 }
201