test_tools.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495
  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: Unit tests for les solving
  8. *
  9. * COPYRIGHT: (C) 2000 by the GRASS Development Team
  10. *
  11. * This program is free software under the GNU General Public
  12. * License (>=v2). Read the file COPYING that comes with GRASS
  13. * for details.
  14. *
  15. *****************************************************************************/
  16. #include <stdio.h>
  17. #include <stdlib.h>
  18. #include <string.h>
  19. #include <math.h>
  20. #include <grass/glocale.h>
  21. #include <grass/gmath.h>
  22. #include "test_gmath_lib.h"
  23. #include <sys/time.h>
  24. /* *************************************************************** */
  25. /* Compute the difference between two time steps ***************** */
  26. /* *************************************************************** */
  27. double compute_time_difference(struct timeval start, struct timeval end) {
  28. int sec;
  29. int usec;
  30. sec = end.tv_sec - start.tv_sec;
  31. usec = end.tv_usec - start.tv_usec;
  32. return (double) sec + (double) usec / 1000000;
  33. }
  34. /* *************************************************************** */
  35. /* create a normal matrix with values ** Hilbert matrix ********** */
  36. /* *************************************************************** */
  37. G_math_les *create_normal_symmetric_les(int rows)
  38. {
  39. G_math_les *les;
  40. int i, j;
  41. int size =rows;
  42. double val;
  43. les = G_math_alloc_les(rows, G_MATH_NORMAL_LES);
  44. for (i = 0; i < size; i++)
  45. {
  46. val = 0.0;
  47. for (j = 0; j < size; j++)
  48. {
  49. if (j == i)
  50. les->A[i][j] = (double)(1.0/(((double)i + 1.0) + ((double)j + 1.0)));
  51. else
  52. les->A[i][j] = (double)(1.0/((((double)i + 1.0) + ((double)j + 1.0) + 100.0)));
  53. val += les->A[i][j];
  54. }
  55. les->b[i] = val;
  56. les->x[i] = 0.5;
  57. }
  58. return les;
  59. }
  60. /* *************************************************************** */
  61. /* create a symmetric band matrix with values ** Hilbert matrix ** */
  62. /* *************************************************************** */
  63. G_math_les *create_symmetric_band_les(int rows)
  64. {
  65. G_math_les *les;
  66. int i, j;
  67. int size =rows;
  68. double val;
  69. les = G_math_alloc_les(rows, G_MATH_NORMAL_LES);
  70. for (i = 0; i < size; i++)
  71. {
  72. val = 0.0;
  73. for (j = 0; j < size; j++)
  74. {
  75. if(i + j < size) {
  76. les->A[i][j] = (double)(1.0/((((double)i + 1.0) + ((double)(i + j) + 1.0) + 100.0)));
  77. } else if (j != i){
  78. les->A[i][j] = 0.0;
  79. }
  80. if (j == i) {
  81. les->A[i][0] = (double)(1.0/(((double)i + 1.0) + ((double)j + 1.0)));
  82. }
  83. if (j == i)
  84. val += (double)(1.0/(((double)i + 1.0) + ((double)j + 1.0)));
  85. else
  86. val += (double)(1.0/((((double)i + 1.0) + ((double)j + 1.0) + 100.0)));
  87. }
  88. les->b[i] = val;
  89. les->x[i] = 0.5;
  90. }
  91. return les;
  92. }
  93. /* ********************************************************************* */
  94. /* create a bad conditioned normal matrix with values ** Hilbert matrix */
  95. /* ********************************************************************* */
  96. G_math_les *create_normal_symmetric_pivot_les(int rows)
  97. {
  98. G_math_les *les;
  99. int i, ii, j, jj;
  100. double val;
  101. les = G_math_alloc_les(rows, G_MATH_NORMAL_LES);
  102. for (i = 0, ii = rows - 1; i < rows; i++, ii--)
  103. {
  104. val = 0.0;
  105. for (j = 0, jj = rows - 1; j < rows; j++, jj--)
  106. {
  107. if (j == i)
  108. les->A[i][j] = (double)(1.0/(((double)ii*ii*ii*ii*ii + 1.0)*1.1
  109. + ((double)jj*jj*jj*jj*jj + 1.0)*1.1));
  110. else
  111. les->A[i][j] = (double)(1.0/((((double)ii*ii*ii + 1.0)
  112. + ((double)jj*jj*jj + 1.0))));
  113. val += les->A[i][j];
  114. }
  115. les->b[i] = val;
  116. les->x[i] = 0.0;
  117. }
  118. return les;
  119. }
  120. /* *************************************************************** */
  121. /* create a normal matrix with values ** Hilbert matrix ********** */
  122. /* *************************************************************** */
  123. G_math_f_les *create_normal_symmetric_f_les(int rows)
  124. {
  125. G_math_f_les *les;
  126. int i, j;
  127. int size =rows;
  128. float val;
  129. les = G_math_alloc_f_les(rows, G_MATH_NORMAL_LES);
  130. for (i = 0; i < size; i++)
  131. {
  132. val = 0.0;
  133. for (j = 0; j < size; j++)
  134. {
  135. if (j == i)
  136. les->A[i][j] = (float)(1.0
  137. /(((float)i + 1.0) + ((float)j + 1.0)));
  138. else
  139. les->A[i][j] = (float)(1.0/((((float)i + 1.0)
  140. + ((float)j + 1.0) + 100.0)));
  141. val += les->A[i][j];
  142. }
  143. les->b[i] = val;
  144. les->x[i] = 0.5;
  145. }
  146. return les;
  147. }
  148. /* *************************************************************** */
  149. /* create a sparse matrix with values ** Hilbert matrix ********** */
  150. /* *************************************************************** */
  151. G_math_les *create_sparse_unsymmetric_les(int rows)
  152. {
  153. G_math_les *les;
  154. G_math_spvector *spvector;
  155. int i, j;
  156. double val;
  157. les = G_math_alloc_les(rows, G_MATH_SPARSE_LES);
  158. for (i = 0; i < rows; i++)
  159. {
  160. spvector = G_math_alloc_spvector(rows);
  161. val = 0;
  162. for (j = 0; j < rows; j++)
  163. {
  164. if (j == i)
  165. {
  166. spvector->values[j] = (double)(1.0/((((double)i + 1.0)
  167. + ((double)j))));
  168. spvector->index[j] = j;
  169. }
  170. if (j < i)
  171. {
  172. spvector->values[j] = (double)(1.0/((((double)i + 1.0)
  173. + ((double)j + 1.0) + 100)));
  174. spvector->index[j] = j;
  175. }
  176. if (j > i)
  177. {
  178. spvector->values[j] = (double)(1.0/((((double)i + 1.0)
  179. + ((double)j + 1.0) + 120)));
  180. spvector->index[j] = j;
  181. }
  182. val += spvector->values[j];
  183. }
  184. G_math_add_spvector_to_les(les, spvector, i);
  185. les->b[i] = val;
  186. les->x[i] = 0.5;
  187. }
  188. return les;
  189. }
  190. /* *************************************************************** */
  191. /* create a normal matrix with values ** Hilbert matrix ********** */
  192. /* *************************************************************** */
  193. G_math_les *create_normal_unsymmetric_les(int rows)
  194. {
  195. G_math_les *les;
  196. int i, j;
  197. int size =rows;
  198. double val;
  199. les = G_math_alloc_les(rows, G_MATH_NORMAL_LES);
  200. for (i = 0; i < size; i++)
  201. {
  202. val = 0.0;
  203. for (j = 0; j < size; j++)
  204. {
  205. if (j == i)
  206. les->A[i][j]
  207. = (double)(1.0/((((double)i + 1.0) + ((double)j))));
  208. if (j < i)
  209. les->A[i][j] = (double)(1.0/((((double)i + 1.0) + ((double)j
  210. + 1.0) + 100)));
  211. if (j > i)
  212. les->A[i][j] = (double)(1.0/((((double)i + 1.0) + ((double)j
  213. + 1.0) + 120)));
  214. val += les->A[i][j];
  215. }
  216. les->b[i] = val;
  217. les->x[i] = 0.5;
  218. }
  219. return les;
  220. }
  221. /* *********************************************************************** */
  222. /* create a non quadratic unsymmetric matrix with values ** Hilbert matrix */
  223. /* *********************************************************************** */
  224. G_math_les *create_normal_unsymmetric_nquad_les_A(int rows, int cols)
  225. {
  226. G_math_les *les;
  227. int i, j;
  228. les = G_math_alloc_nquad_les_A(rows, cols, G_MATH_NORMAL_LES);
  229. for (i = 0; i < rows; i++)
  230. {
  231. for (j = 0; j < cols; j++)
  232. {
  233. if (j == i)
  234. les->A[i][j] = (float)(1.0/((((float)i + 1.0) + ((float)j))));
  235. if (j < i && j < cols && i < rows)
  236. les->A[i][j] = (float)(1.0/((((float)i + 1.0)
  237. + ((float)j + 1.0) + 100)));
  238. if (j > i && j < cols && i < rows)
  239. les->A[i][j] = (float)(1.0/((((float)i + 1.0)
  240. + ((float)j + 1.0) + 120)));
  241. }
  242. }
  243. return les;
  244. }
  245. /* ***************************************************************************** */
  246. /* create a non quadratic unsymmetric float matrix with values ** Hilbert matrix */
  247. /* ***************************************************************************** */
  248. G_math_f_les *create_normal_unsymmetric_f_nquad_les_A(int rows, int cols)
  249. {
  250. G_math_f_les *les;
  251. int i, j;
  252. les = G_math_alloc_f_nquad_les_A(rows, cols, G_MATH_NORMAL_LES);
  253. for (i = 0; i < rows; i++)
  254. {
  255. for (j = 0; j < cols; j++)
  256. {
  257. if (j == i)
  258. les->A[i][j] = (float)(1.0/((((float)i + 1.0) + ((float)j))));
  259. if (j < i&& j < cols && i < rows)
  260. les->A[i][j] = (float)(1.0/((((float)i + 1.0)
  261. + ((float)j + 1.0) + 100)));
  262. if (j > i&& j < cols && i < rows)
  263. les->A[i][j] = (float)(1.0/((((float)i + 1.0)
  264. + ((float)j + 1.0) + 120)));
  265. }
  266. }
  267. return les;
  268. }
  269. /* *************************************************************** */
  270. /* create a normal matrix with values ** Hilbert matrix ********** */
  271. /* *************************************************************** */
  272. G_math_f_les *create_normal_unsymmetric_f_les(int rows)
  273. {
  274. G_math_f_les *les;
  275. int i, j;
  276. int size =rows;
  277. float val;
  278. les = G_math_alloc_f_les(rows, G_MATH_NORMAL_LES);
  279. for (i = 0; i < size; i++)
  280. {
  281. val = 0.0;
  282. for (j = 0; j < size; j++)
  283. {
  284. if (j == i)
  285. les->A[i][j] = (float)(1.0/((((float)i + 1.0) + ((float)j))));
  286. if (j < i)
  287. les->A[i][j] = (float)(1.0/((((float)i + 1.0)
  288. + ((float)j + 1.0) + 100)));
  289. if (j > i)
  290. les->A[i][j] = (float)(1.0/((((float)i + 1.0)
  291. + ((float)j + 1.0) + 120)));
  292. val += les->A[i][j];
  293. }
  294. les->b[i] = val;
  295. les->x[i] = 0.5;
  296. }
  297. return les;
  298. }
  299. /* *************************************************************** */
  300. /* create a sparse matrix with values ** Hilbert matrix ********** */
  301. /* *************************************************************** */
  302. G_math_les *create_sparse_symmetric_les(int rows)
  303. {
  304. G_math_les *les;
  305. G_math_spvector *spvector;
  306. int i, j;
  307. double val;
  308. les = G_math_alloc_les(rows, G_MATH_SPARSE_LES);
  309. for (i = 0; i < rows; i++)
  310. {
  311. spvector = G_math_alloc_spvector(rows);
  312. val = 0;
  313. for (j = 0; j < rows; j++)
  314. {
  315. if (j == i)
  316. {
  317. spvector->values[j] = (double)(1.0/((((double)i + 1.0)
  318. + ((double)j + 1.0))));
  319. spvector->index[j] = j;
  320. }
  321. else
  322. {
  323. spvector->values[j] = (double)(1.0/(((((double)i + 1.0)
  324. + ((double)j + 1.0)) + 100)));
  325. spvector->index[j] = j;
  326. }
  327. val += spvector->values[j];
  328. }
  329. G_math_add_spvector_to_les(les, spvector, i);
  330. les->b[i] = val;
  331. les->x[i] = 0.5;
  332. }
  333. return les;
  334. }
  335. /* *************************************************************** */
  336. void fill_d_vector_range_1(double *x, double a, int rows)
  337. {
  338. int i = 0;
  339. for (i = 0; i < rows; i++)
  340. {
  341. x[i] = a*(double)i;
  342. }
  343. }
  344. /* *************************************************************** */
  345. void fill_d_vector_range_2(double *x, double a, int rows)
  346. {
  347. int i = 0, count = 0;
  348. for (i = rows - 1; i >= 0; i--)
  349. {
  350. x[i] = a*(double)count;
  351. count ++;
  352. }
  353. }
  354. /* *************************************************************** */
  355. void fill_d_vector_scalar(double *x, double a, int rows)
  356. {
  357. int i = 0;
  358. for (i = 0; i < rows; i++)
  359. {
  360. x[i] = a;
  361. }
  362. }
  363. /* *************************************************************** */
  364. void fill_f_vector_range_1(float *x, float a, int rows)
  365. {
  366. int i = 0;
  367. for (i = 0; i < rows; i++)
  368. {
  369. x[i] = a*(float)i;
  370. //printf("%f ", x[i]);
  371. }
  372. }
  373. /* *************************************************************** */
  374. void fill_f_vector_range_2(float *x, float a, int rows)
  375. {
  376. int i = 0, count = 0;
  377. for (i = rows - 1; i >= 0; i--)
  378. {
  379. x[i] = a*(float)count;
  380. //printf("%f ", x[i]);
  381. count ++;
  382. }
  383. }
  384. /* *************************************************************** */
  385. void fill_f_vector_scalar(float *x, float a, int rows)
  386. {
  387. int i = 0;
  388. for (i = 0; i < rows; i++)
  389. {
  390. x[i] = a;
  391. //printf("%f ", x[i]);
  392. }
  393. }
  394. /* *************************************************************** */
  395. void fill_i_vector_range_1(int *x, int a, int rows)
  396. {
  397. int i = 0;
  398. for (i = 0; i < rows; i++)
  399. {
  400. x[i] = a*i;
  401. }
  402. }
  403. /* *************************************************************** */
  404. void fill_i_vector_range_2(int *x, int a, int rows)
  405. {
  406. int i = 0, count = 0;
  407. for (i = rows - 1; i >= 0; i--)
  408. {
  409. x[i] = a*count;
  410. count ++;
  411. }
  412. }
  413. /* *************************************************************** */
  414. void fill_i_vector_scalar(int *x, int a, int rows)
  415. {
  416. int i = 0;
  417. for (i = 0; i < rows; i++)
  418. {
  419. x[i] = a;
  420. }
  421. }