gmath.h 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. /******************************************************************************
  2. * gmath.h
  3. * Top level header file for gmath units
  4. * @Copyright David D.Gray <ddgray@armadce.demon.co.uk>
  5. * 27th. Sep. 2000
  6. * Last updated: $Id$
  7. *
  8. * This file is part of GRASS GIS. It is free software. You can
  9. * redistribute it and/or modify it under the terms of
  10. * the GNU General Public License as published by the Free Software
  11. * Foundation; either version 2 of the License, or (at your option)
  12. * any later version.
  13. * This program is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. * GNU General Public License for more details.
  17. ******************************************************************************/
  18. #ifndef GMATH_H_
  19. #define GMATH_H_
  20. #include <grass/config.h>
  21. #if defined(HAVE_LIBLAPACK) && defined(HAVE_LIBBLAS) && defined(HAVE_G2C_H)
  22. /* only include if available */
  23. #include <grass/la.h>
  24. #endif
  25. #include <stddef.h>
  26. /*solver names */
  27. #define G_MATH_SOLVER_DIRECT_GAUSS "gauss"
  28. #define G_MATH_SOLVER_DIRECT_LU "lu"
  29. #define G_MATH_SOLVER_DIRECT_CHOLESKY "cholesky"
  30. #define G_MATH_SOLVER_ITERATIVE_JACOBI "jacobi"
  31. #define G_MATH_SOLVER_ITERATIVE_SOR "sor"
  32. #define G_MATH_SOLVER_ITERATIVE_CG "cg"
  33. #define G_MATH_SOLVER_ITERATIVE_PCG "pcg"
  34. #define G_MATH_SOLVER_ITERATIVE_BICGSTAB "bicgstab"
  35. /*preconditioner */
  36. #define G_MATH_DIAGONAL_PRECONDITION 1
  37. #define G_MATH_ROWSCALE_ABSSUMNORM_PRECONDITION 2
  38. #define G_MATH_ROWSCALE_EUKLIDNORM_PRECONDITION 3
  39. #define G_MATH_ROWSCALE_MAXNORM_PRECONDITION 4
  40. /* dalloc.c */
  41. double *G_alloc_vector(size_t);
  42. double **G_alloc_matrix(int, int);
  43. float *G_alloc_fvector(size_t);
  44. float **G_alloc_fmatrix(int, int);
  45. void G_free_vector(double *);
  46. void G_free_matrix(double **);
  47. void G_free_fvector(float *);
  48. void G_free_fmatrix(float **);
  49. /* ialloc.c */
  50. int *G_alloc_ivector(size_t);
  51. int **G_alloc_imatrix(int, int);
  52. void G_free_ivector(int *);
  53. void G_free_imatrix(int **);
  54. /* fft.c */
  55. extern int fft(int, double *[2], int, int, int);
  56. extern int fft2(int, double (*)[2], int, int, int);
  57. /* gauss.c */
  58. extern double G_math_rand_gauss(int, double);
  59. /* max_pow2.c */
  60. extern long G_math_max_pow2 (long n);
  61. extern long G_math_min_pow2 (long n);
  62. /* rand1.c */
  63. extern float G_math_rand(int);
  64. /* del2g.c */
  65. extern int del2g(double *[2], int, double);
  66. /* getg.c */
  67. extern int getg(double, double *[2], int);
  68. /* eigen_tools.c */
  69. extern int G_math_egvorder(double *, double **, long);
  70. /* mult.c */
  71. extern int G_math_complex_mult (double *v1[2], int size1, double *v2[2], int size2, double *v3[2], int size3);
  72. /* lu.c*/
  73. extern int G_ludcmp(double **, int, int *, double *);
  74. extern void G_lubksb(double **a, int n, int *indx, double b[]);
  75. /* findzc.c */
  76. extern int G_math_findzc(double conv[], int size, double zc[], double thresh, int num_orients);
  77. /* *************************************************************** */
  78. /* ***** WRAPPER FOR CCMATH FUNCTIONS USED IN GRASS ************** */
  79. /* *************************************************************** */
  80. extern int G_math_solv(double **,double *,int);
  81. extern int G_math_solvps(double **,double *,int);
  82. extern void G_math_solvtd(double *,double *,double *,double *,int);
  83. extern int G_math_solvru(double **,double *,int);
  84. extern int G_math_minv(double **,int);
  85. extern int G_math_psinv(double **,int);
  86. extern int G_math_ruinv(double **,int);
  87. extern void G_math_eigval(double **,double *,int);
  88. extern void G_math_eigen(double **,double *,int);
  89. extern double G_math_evmax(double **,double *,int);
  90. extern int G_math_svdval(double *,double **,int,int);
  91. extern int G_math_sv2val(double *,double **,int,int);
  92. extern int G_math_svduv(double *,double **,double **, int,double **,int);
  93. extern int G_math_sv2uv(double *,double **,double **,int,double **,int);
  94. extern int G_math_svdu1v(double *,double **,int,double **,int);
  95. /* *************************************************************** */
  96. /* *************** LINEARE EQUATION SYSTEM PART ****************** */
  97. /* *************************************************************** */
  98. /*!
  99. * \brief The row vector of the sparse matrix
  100. * */
  101. typedef struct
  102. {
  103. double *values; /*The non null values of the row */
  104. unsigned int cols; /*Number of entries */
  105. unsigned int *index; /*the index number */
  106. } G_math_spvector;
  107. /* Sparse matrix and sparse vector functions
  108. * */
  109. extern G_math_spvector *G_math_alloc_spvector(int );
  110. extern G_math_spvector **G_math_alloc_spmatrix(int );
  111. extern void G_math_free_spmatrix(G_math_spvector ** , int );
  112. extern void G_math_free_spvector(G_math_spvector * );
  113. extern int G_math_add_spvector(G_math_spvector **, G_math_spvector * , int );
  114. extern G_math_spvector **G_math_A_to_Asp(double **, int, double);
  115. extern double **G_math_Asp_to_A(G_math_spvector **, int);
  116. extern double **G_math_Asp_to_sband_matrix(G_math_spvector **, int, int);
  117. extern G_math_spvector **G_math_sband_matrix_to_Asp(double **, int, int, double);
  118. extern void G_math_print_spmatrix(G_math_spvector **, int);
  119. extern void G_math_Ax_sparse(G_math_spvector **, double *, double *, int );
  120. /*Symmetric band matrix handling */
  121. extern double **G_math_matrix_to_sband_matrix(double **, int, int);
  122. extern double **G_math_sband_matrix_to_matrix(double **, int, int);
  123. extern void G_math_Ax_sband(double ** A, double *x, double *y, int rows, int bandwidth);
  124. /*linear equation solver, most of them are multithreaded wih OpenMP*/
  125. extern int G_math_solver_gauss(double **, double *, double *, int );
  126. extern int G_math_solver_lu(double **, double *, double *, int );
  127. extern int G_math_solver_cholesky(double **, double *, double *, int , int );
  128. extern void G_math_solver_cholesky_sband(double **, double *, double *, int, int);
  129. extern int G_math_solver_jacobi(double **, double *, double *, int , int , double , double );
  130. extern int G_math_solver_gs(double **, double *, double *, int , int , double , double );
  131. extern int G_math_solver_pcg(double **, double *, double *, int , int , double , int );
  132. extern int G_math_solver_cg(double **, double *, double *, int , int , double );
  133. extern int G_math_solver_cg_sband(double **, double *, double *, int, int, int, double);
  134. extern int G_math_solver_bicgstab(double **, double *, double *, int , int , double );
  135. extern int G_math_solver_sparse_jacobi(G_math_spvector **, double *, double *, int , int , double , double );
  136. extern int G_math_solver_sparse_gs(G_math_spvector **, double *, double *, int , int , double , double );
  137. extern int G_math_solver_sparse_pcg(G_math_spvector **, double *, double *, int , int , double , int );
  138. extern int G_math_solver_sparse_cg(G_math_spvector **, double *, double *, int , int , double );
  139. extern int G_math_solver_sparse_bicgstab(G_math_spvector **, double *, double *, int , int , double );
  140. /* solver algoithms and helper functions*/
  141. extern void G_math_gauss_elimination(double **, double *, int );
  142. extern void G_math_lu_decomposition(double **, double *, int );
  143. extern int G_math_cholesky_decomposition(double **, int , int );
  144. extern void G_math_cholesky_sband_decomposition(double **, double **, int, int);
  145. extern void G_math_backward_substitution(double **, double *, double *, int );
  146. extern void G_math_forward_substitution(double **, double *, double *, int );
  147. extern void G_math_cholesky_sband_substitution(double **, double *, double *, int, int);
  148. /*BLAS like level 1,2 and 3 functions*/
  149. /*level 1 vector - vector grass implementation with OpenMP thread support*/
  150. extern void G_math_d_x_dot_y(double *, double *, double *, int );
  151. extern void G_math_d_asum_norm(double *, double *, int );
  152. extern void G_math_d_euclid_norm(double *, double *, int );
  153. extern void G_math_d_max_norm(double *, double *, int );
  154. extern void G_math_d_ax_by(double *, double *, double *, double , double , int );
  155. extern void G_math_d_copy(double *, double *, int );
  156. extern void G_math_f_x_dot_y(float *, float *, float *, int );
  157. extern void G_math_f_asum_norm(float *, float *, int );
  158. extern void G_math_f_euclid_norm(float *, float *, int );
  159. extern void G_math_f_max_norm(float *, float *, int );
  160. extern void G_math_f_ax_by(float *, float *, float *, float , float , int );
  161. extern void G_math_f_copy(float *, float *, int );
  162. extern void G_math_i_x_dot_y(int *, int *, double *, int );
  163. extern void G_math_i_asum_norm(int *, double *, int );
  164. extern void G_math_i_euclid_norm(int *, double *,int );
  165. extern void G_math_i_max_norm(int *, int *, int );
  166. extern void G_math_i_ax_by(int *, int *, int *, int , int , int );
  167. extern void G_math_i_copy(int *, int *, int );
  168. /*ATLAS blas level 1 wrapper*/
  169. extern double G_math_ddot(double *, double *, int );
  170. extern float G_math_sdot(float *, float *, int );
  171. extern float G_math_sdsdot(float *, float *, float , int );
  172. extern double G_math_dnrm2(double *, int );
  173. extern double G_math_dasum(double *, int );
  174. extern double G_math_idamax(double *, int );
  175. extern float G_math_snrm2(float *, int );
  176. extern float G_math_sasum(float *, int );
  177. extern float G_math_isamax(float *, int );
  178. extern void G_math_dscal(double *, double , int );
  179. extern void G_math_sscal(float *, float , int );
  180. extern void G_math_dcopy(double *, double *, int );
  181. extern void G_math_scopy(float *, float *, int );
  182. extern void G_math_daxpy(double *, double *, double , int );
  183. extern void G_math_saxpy(float *, float *, float , int );
  184. /*level 2 matrix - vector grass implementation with OpenMP thread support*/
  185. extern void G_math_d_Ax(double **, double *, double *, int , int );
  186. extern void G_math_f_Ax(float **, float *, float *, int , int );
  187. extern void G_math_d_x_dyad_y(double *, double *, double **, int, int );
  188. extern void G_math_f_x_dyad_y(float *, float *, float **, int, int );
  189. extern void G_math_d_aAx_by(double **, double *, double *, double , double , double *, int , int );
  190. extern void G_math_f_aAx_by(float **, float *, float *, float , float , float *, int , int );
  191. extern int G_math_d_A_T(double **A, int rows);
  192. extern int G_math_f_A_T(float **A, int rows);
  193. /*level 3 matrix - matrix grass implementation with OpenMP thread support*/
  194. extern void G_math_d_aA_B(double **, double **, double , double **, int , int );
  195. extern void G_math_f_aA_B(float **, float **, float , float **, int , int );
  196. extern void G_math_d_AB(double **, double **, double **, int , int , int );
  197. extern void G_math_f_AB(float **, float **, float **, int , int , int );
  198. #endif /* GMATH_H_ */