n_tools.c 3.8 KB

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