test_gradient.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453
  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 gradient calculation
  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 <grass/N_pde.h>
  20. #include "test_gpde_lib.h"
  21. /* prototypes */
  22. static int test_gradient_2d(void);
  23. static int test_gradient_3d(void);
  24. static N_array_2d *create_relax_array_2d(void);
  25. static N_array_3d *create_relax_array_3d(void);
  26. static N_array_2d *create_potential_array_2d(void);
  27. static N_array_3d *create_potential_array_3d(void);
  28. /* *************************************************************** */
  29. /* Performe the gradient tests *********************************** */
  30. /* *************************************************************** */
  31. int unit_test_gradient(void)
  32. {
  33. int sum = 0;
  34. G_message("\n++ Running gradient unit tests ++");
  35. G_message("\t 1. testing 2d gradient");
  36. sum += test_gradient_2d();
  37. G_message("\t 2. testing 3d gradient");
  38. sum += test_gradient_3d();
  39. if (sum > 0)
  40. G_warning("\n-- Gradient unit tests failure --");
  41. else
  42. G_message("\n-- Gradient unit tests finished successfully --");
  43. return sum;
  44. }
  45. /* *************************************************************** */
  46. /* Create the status array with values of 1 and 2 **************** */
  47. /* *************************************************************** */
  48. N_array_2d *create_relax_array_2d(void)
  49. {
  50. N_array_2d *data;
  51. int i, j;
  52. data = N_alloc_array_2d(TEST_N_NUM_COLS, TEST_N_NUM_ROWS, 1, CELL_TYPE);
  53. #pragma omp parallel for private (i, j) shared (data)
  54. for (j = 0; j < TEST_N_NUM_ROWS; j++) {
  55. for (i = 0; i < TEST_N_NUM_COLS; i++) {
  56. N_put_array_2d_c_value(data, i, j, 1);
  57. }
  58. }
  59. return data;
  60. }
  61. /* *************************************************************** */
  62. /* Create a value array ****************************************** */
  63. /* *************************************************************** */
  64. N_array_2d *create_potential_array_2d(void)
  65. {
  66. N_array_2d *data;
  67. int i, j;
  68. data = N_alloc_array_2d(TEST_N_NUM_COLS, TEST_N_NUM_ROWS, 1, DCELL_TYPE);
  69. #pragma omp parallel for private (i, j) shared (data)
  70. for (j = 0; j < TEST_N_NUM_ROWS; j++) {
  71. for (i = 0; i < TEST_N_NUM_COLS; i++) {
  72. N_put_array_2d_d_value(data, i, j, (double)i*j);
  73. }
  74. }
  75. return data;
  76. }
  77. /* *************************************************************** */
  78. /* Create the status array with values of 1 and 2 **************** */
  79. /* *************************************************************** */
  80. N_array_3d *create_relax_array_3d(void)
  81. {
  82. N_array_3d *data;
  83. int i, j, k;
  84. data =
  85. N_alloc_array_3d(TEST_N_NUM_COLS, TEST_N_NUM_ROWS, TEST_N_NUM_DEPTHS, 1,
  86. FCELL_TYPE);
  87. #pragma omp parallel for private (i, j, k) shared (data)
  88. for (k = 0; k < TEST_N_NUM_DEPTHS; k++) {
  89. for (j = 0; j < TEST_N_NUM_ROWS; j++) {
  90. for (i = 0; i < TEST_N_NUM_COLS; i++) {
  91. N_put_array_3d_f_value(data, i, j, k, 1.0);
  92. }
  93. }
  94. }
  95. return data;
  96. }
  97. /* *************************************************************** */
  98. /* Create a value array ****************************************** */
  99. /* *************************************************************** */
  100. N_array_3d *create_potential_array_3d(void)
  101. {
  102. N_array_3d *data;
  103. int i, j, k;
  104. data =
  105. N_alloc_array_3d(TEST_N_NUM_COLS, TEST_N_NUM_ROWS, TEST_N_NUM_DEPTHS, 1,
  106. DCELL_TYPE);
  107. #pragma omp parallel for private (i, j, k) shared (data)
  108. for (k = 0; k < TEST_N_NUM_DEPTHS; k++)
  109. for (j = 0; j < TEST_N_NUM_ROWS; j++) {
  110. for (i = 0; i < TEST_N_NUM_COLS; i++) {
  111. N_put_array_3d_f_value(data, i, j, k, (float)i*j*k);
  112. }
  113. }
  114. return data;
  115. }
  116. /* *************************************************************** */
  117. /* Test the gradient calculation with 3d array data ************** */
  118. /* *************************************************************** */
  119. int test_gradient_3d(void)
  120. {
  121. N_array_3d *relax = NULL;
  122. N_array_3d *pot = NULL;
  123. N_array_3d *xcomp = NULL;
  124. N_array_3d *ycomp = NULL;
  125. N_array_3d *zcomp = NULL;
  126. N_gradient_field_3d *field = NULL;
  127. N_gradient_3d *grad = NULL;
  128. N_geom_data *geom = NULL;
  129. geom = N_alloc_geom_data();
  130. geom->dx = 1;
  131. geom->dy = 1;
  132. geom->dz = 1;
  133. geom->Az = 1;
  134. geom->planimetric = 1;
  135. geom->depths = TEST_N_NUM_DEPTHS;
  136. geom->rows = TEST_N_NUM_ROWS;
  137. geom->cols = TEST_N_NUM_COLS;
  138. relax = create_relax_array_3d();
  139. pot = create_potential_array_3d();
  140. field = N_compute_gradient_field_3d(pot, relax, relax, relax, geom, NULL);
  141. field = N_compute_gradient_field_3d(pot, relax, relax, relax, geom, field);
  142. /*compute stats*/
  143. N_calc_gradient_field_3d_stats(field);
  144. N_print_gradient_field_3d_info(field);
  145. N_free_gradient_field_3d(field);
  146. N_free_array_3d(relax);
  147. N_free_array_3d(pot);
  148. relax = N_alloc_array_3d(3, 3, 3, 0, DCELL_TYPE);
  149. pot = N_alloc_array_3d(3, 3, 3, 0, DCELL_TYPE);
  150. xcomp = N_alloc_array_3d(3, 3, 3, 0, DCELL_TYPE);
  151. ycomp = N_alloc_array_3d(3, 3, 3, 0, DCELL_TYPE);
  152. zcomp = N_alloc_array_3d(3, 3, 3, 0, DCELL_TYPE);
  153. N_put_array_3d_d_value(relax, 0, 0, 0, 1);
  154. N_put_array_3d_d_value(relax, 0, 1, 0, 1);
  155. N_put_array_3d_d_value(relax, 0, 2, 0, 1);
  156. N_put_array_3d_d_value(relax, 1, 0, 0, 1);
  157. N_put_array_3d_d_value(relax, 1, 1, 0, 1);
  158. N_put_array_3d_d_value(relax, 1, 2, 0, 1);
  159. N_put_array_3d_d_value(relax, 2, 0, 0, 1);
  160. N_put_array_3d_d_value(relax, 2, 1, 0, 1);
  161. N_put_array_3d_d_value(relax, 2, 2, 0, 1);
  162. N_put_array_3d_d_value(relax, 0, 0, 1, 1);
  163. N_put_array_3d_d_value(relax, 0, 1, 1, 1);
  164. N_put_array_3d_d_value(relax, 0, 2, 1, 1);
  165. N_put_array_3d_d_value(relax, 1, 0, 1, 1);
  166. N_put_array_3d_d_value(relax, 1, 1, 1, 1);
  167. N_put_array_3d_d_value(relax, 1, 2, 1, 1);
  168. N_put_array_3d_d_value(relax, 2, 0, 1, 1);
  169. N_put_array_3d_d_value(relax, 2, 1, 1, 1);
  170. N_put_array_3d_d_value(relax, 2, 2, 1, 1);
  171. N_put_array_3d_d_value(relax, 0, 0, 2, 1);
  172. N_put_array_3d_d_value(relax, 0, 1, 2, 1);
  173. N_put_array_3d_d_value(relax, 0, 2, 2, 1);
  174. N_put_array_3d_d_value(relax, 1, 0, 2, 1);
  175. N_put_array_3d_d_value(relax, 1, 1, 2, 1);
  176. N_put_array_3d_d_value(relax, 1, 2, 2, 1);
  177. N_put_array_3d_d_value(relax, 2, 0, 2, 1);
  178. N_put_array_3d_d_value(relax, 2, 1, 2, 1);
  179. N_put_array_3d_d_value(relax, 2, 2, 2, 1);
  180. /**
  181. * 1 2 6 5
  182. * 3 7 10 == -4 -3
  183. * 8 15 25 8
  184. * */
  185. N_put_array_3d_d_value(pot, 0, 0, 0, 1.0);
  186. N_put_array_3d_d_value(pot, 1, 0, 0, 2.0);
  187. N_put_array_3d_d_value(pot, 2, 0, 0, 6.0);
  188. N_put_array_3d_d_value(pot, 0, 1, 0, 3.0);
  189. N_put_array_3d_d_value(pot, 1, 1, 0, 7.0);
  190. N_put_array_3d_d_value(pot, 2, 1, 0, 10.0);
  191. N_put_array_3d_d_value(pot, 0, 2, 0, 8.0);
  192. N_put_array_3d_d_value(pot, 1, 2, 0, 15.0);
  193. N_put_array_3d_d_value(pot, 2, 2, 0, 25.0);
  194. N_put_array_3d_d_value(pot, 0, 0, 1, 1.2);
  195. N_put_array_3d_d_value(pot, 1, 0, 1, 2.2);
  196. N_put_array_3d_d_value(pot, 2, 0, 1, 6.2);
  197. N_put_array_3d_d_value(pot, 0, 1, 1, 3.2);
  198. N_put_array_3d_d_value(pot, 1, 1, 1, 7.2);
  199. N_put_array_3d_d_value(pot, 2, 1, 1, 10.2);
  200. N_put_array_3d_d_value(pot, 0, 2, 1, 8.2);
  201. N_put_array_3d_d_value(pot, 1, 2, 1, 15.2);
  202. N_put_array_3d_d_value(pot, 2, 2, 1, 25.2);
  203. N_put_array_3d_d_value(pot, 0, 0, 2, 1.5);
  204. N_put_array_3d_d_value(pot, 1, 0, 2, 2.5);
  205. N_put_array_3d_d_value(pot, 2, 0, 2, 6.5);
  206. N_put_array_3d_d_value(pot, 0, 1, 2, 3.5);
  207. N_put_array_3d_d_value(pot, 1, 1, 2, 7.5);
  208. N_put_array_3d_d_value(pot, 2, 1, 2, 10.5);
  209. N_put_array_3d_d_value(pot, 0, 2, 2, 8.5);
  210. N_put_array_3d_d_value(pot, 1, 2, 2, 15.5);
  211. N_put_array_3d_d_value(pot, 2, 2, 2, 25.5);
  212. geom->depths = 3;
  213. geom->rows = 3;
  214. geom->cols = 3;
  215. field = N_compute_gradient_field_3d(pot, relax, relax, relax, geom, NULL);
  216. field = N_compute_gradient_field_3d(pot, relax, relax, relax, geom, field);
  217. N_print_gradient_field_3d_info(field);
  218. grad = N_get_gradient_3d(field, NULL, 0, 0, 0);
  219. printf
  220. ("Gradient 3d: NC %g == 0 ; SC %g == 2 ; WC %g == 0 ; EC %g == -1 BC %g == 0 TC %g == -0.2\n",
  221. grad->NC, grad->SC, grad->WC, grad->EC, grad->BC, grad->TC);
  222. grad = N_get_gradient_3d(field, grad, 1, 0, 0);
  223. printf
  224. ("Gradient 3d: NC %g == 0 ; SC %g == 5 ; WC %g == -1 ; EC %g == -4 BC %g == 0 TC %g == -0.2\n",
  225. grad->NC, grad->SC, grad->WC, grad->EC, grad->BC, grad->TC);
  226. N_free_gradient_3d(grad);
  227. grad = N_get_gradient_3d(field, NULL, 1, 1, 1);
  228. printf
  229. ("Gradient 3d: NC %g == 5 ; SC %g == 8 ; WC %g == -4 ; EC %g == -3 BC %g == -0.2 TC %g == -0.3\n",
  230. grad->NC, grad->SC, grad->WC, grad->EC, grad->BC, grad->TC);
  231. grad = N_get_gradient_3d(field, grad, 1, 2, 2);
  232. printf
  233. ("Gradient 3d: NC %g == 8 ; SC %g == 0 ; WC %g == -7 ; EC %g == -10 BC %g == -0.3 TC %g == 0\n",
  234. grad->NC, grad->SC, grad->WC, grad->EC, grad->BC, grad->TC);
  235. N_free_gradient_3d(grad);
  236. grad = N_get_gradient_3d(field, NULL, 2, 2, 2);
  237. printf
  238. ("Gradient 3d: NC %g ==15 ; SC %g == 0 ; WC %g == -10 ; EC %g == 0 BC %g == -0.3 TC %g == 0\n",
  239. grad->NC, grad->SC, grad->WC, grad->EC, grad->BC, grad->TC);
  240. N_free_gradient_3d(grad);
  241. N_compute_gradient_field_components_3d(field, xcomp, ycomp, zcomp);
  242. /*
  243. N_print_array_3d(xcomp);
  244. N_print_array_3d(ycomp);
  245. N_print_array_3d(zcomp);
  246. */
  247. N_free_gradient_field_3d(field);
  248. G_free(geom);
  249. N_free_array_3d(xcomp);
  250. N_free_array_3d(ycomp);
  251. N_free_array_3d(zcomp);
  252. N_free_array_3d(relax);
  253. N_free_array_3d(pot);
  254. return 0;
  255. }
  256. /* *************************************************************** */
  257. /* Test the gradient calculation with 2d array data ************** */
  258. /* *************************************************************** */
  259. int test_gradient_2d(void)
  260. {
  261. N_array_2d *relax = NULL;
  262. N_array_2d *pot = NULL;
  263. N_array_2d *xcomp = NULL;
  264. N_array_2d *ycomp = NULL;
  265. N_gradient_field_2d *field = NULL;
  266. N_geom_data *geom = NULL;
  267. N_gradient_2d *grad = NULL;
  268. N_gradient_neighbours_2d *grad_2d = NULL;
  269. geom = N_alloc_geom_data();
  270. geom->dx = 1;
  271. geom->dy = 1;
  272. geom->dz = 1;
  273. geom->Az = 1;
  274. geom->planimetric = 1;
  275. geom->rows = TEST_N_NUM_ROWS;
  276. geom->cols = TEST_N_NUM_COLS;
  277. relax = create_relax_array_2d();
  278. pot = create_potential_array_2d();
  279. field = N_compute_gradient_field_2d(pot, relax, relax, geom, field);
  280. field = N_compute_gradient_field_2d(pot, relax, relax, geom, field);
  281. /*compute stats*/
  282. N_calc_gradient_field_2d_stats(field);
  283. N_print_gradient_field_2d_info(field);
  284. N_free_gradient_field_2d(field);
  285. N_free_array_2d(relax);
  286. N_free_array_2d(pot);
  287. relax = N_alloc_array_2d(3, 3, 0, DCELL_TYPE);
  288. pot = N_alloc_array_2d(3, 3, 0, DCELL_TYPE);
  289. xcomp = N_alloc_array_2d(3, 3, 0, DCELL_TYPE);
  290. ycomp = N_alloc_array_2d(3, 3, 0, DCELL_TYPE);
  291. N_put_array_2d_d_value(relax, 0, 0, 1.0);
  292. N_put_array_2d_d_value(relax, 0, 1, 1.0);
  293. N_put_array_2d_d_value(relax, 0, 2, 1.0);
  294. N_put_array_2d_d_value(relax, 1, 0, 1.0);
  295. N_put_array_2d_d_value(relax, 1, 1, 1.0);
  296. N_put_array_2d_d_value(relax, 1, 2, 1.0);
  297. N_put_array_2d_d_value(relax, 2, 0, 1.0);
  298. N_put_array_2d_d_value(relax, 2, 1, 1.0);
  299. N_put_array_2d_d_value(relax, 2, 2, 1.0);
  300. /**
  301. * 1 2 6 5
  302. * 3 7 10 == -4 -3
  303. * 8 15 25 8
  304. * */
  305. N_put_array_2d_d_value(pot, 0, 0, 1.0);
  306. N_put_array_2d_d_value(pot, 1, 0, 2.0);
  307. N_put_array_2d_d_value(pot, 2, 0, 6.0);
  308. N_put_array_2d_d_value(pot, 0, 1, 3.0);
  309. N_put_array_2d_d_value(pot, 1, 1, 7.0);
  310. N_put_array_2d_d_value(pot, 2, 1, 10.0);
  311. N_put_array_2d_d_value(pot, 0, 2, 8.0);
  312. N_put_array_2d_d_value(pot, 1, 2, 15.0);
  313. N_put_array_2d_d_value(pot, 2, 2, 25.0);
  314. geom->rows = 3;
  315. geom->cols = 3;
  316. field = N_compute_gradient_field_2d(pot, relax, relax, geom, NULL);
  317. field = N_compute_gradient_field_2d(pot, relax, relax, geom, field);
  318. N_print_gradient_field_2d_info(field);
  319. /*common gradient calculation*/
  320. grad = N_get_gradient_2d(field, NULL, 0, 0);
  321. G_message("Gradient 2d: pos 0,0 NC %g == 0 ; SC %g == 2 ; WC %g == 0 ; EC %g == -1\n",
  322. grad->NC, grad->SC, grad->WC, grad->EC);
  323. grad = N_get_gradient_2d(field, grad, 1, 0);
  324. G_message("Gradient 2d: pos 1,0 NC %g == 0 ; SC %g == 5 ; WC %g == -1 ; EC %g == -4\n",
  325. grad->NC, grad->SC, grad->WC, grad->EC);
  326. N_free_gradient_2d(grad);
  327. grad = N_get_gradient_2d(field, NULL, 1, 1);
  328. G_message("Gradient 2d: pos 1,1 NC %g == 5 ; SC %g == 8 ; WC %g == -4 ; EC %g == -3\n",
  329. grad->NC, grad->SC, grad->WC, grad->EC);
  330. grad = N_get_gradient_2d(field, grad, 1, 2);
  331. G_message("Gradient 2d: pos 1,2 NC %g == 8 ; SC %g == 0 ; WC %g == -7 ; EC %g == -10\n",
  332. grad->NC, grad->SC, grad->WC, grad->EC);
  333. N_free_gradient_2d(grad);
  334. grad = N_get_gradient_2d(field, NULL, 2, 2);
  335. G_message("Gradient 2d: pos 2,2 NC %g ==15 ; SC %g == 0 ; WC %g == -10 ; EC %g == 0\n",
  336. grad->NC, grad->SC, grad->WC, grad->EC);
  337. N_free_gradient_2d(grad);
  338. N_compute_gradient_field_components_2d(field, xcomp, ycomp);
  339. /*gradient neighbour calculation*/
  340. grad_2d = N_get_gradient_neighbours_2d(field, NULL, 1, 1);
  341. grad_2d = N_get_gradient_neighbours_2d(field, grad_2d, 1, 1);
  342. G_message("N_gradient_neighbours_x; pos 1,1 NWN %g NEN %g WC %g EC %g SWS %g SES %g\n",
  343. grad_2d->x->NWN, grad_2d->x->NEN, grad_2d->x->WC, grad_2d->x->EC, grad_2d->x->SWS, grad_2d->x->SES);
  344. G_message("N_gradient_neighbours_y: pos 1,1 NWW %g NEE %g NC %g SC %g SWW %g SEE %g\n",
  345. grad_2d->y->NWW, grad_2d->y->NEE, grad_2d->y->NC, grad_2d->y->SC, grad_2d->y->SWW, grad_2d->y->SEE);
  346. N_free_gradient_neighbours_2d(grad_2d);
  347. /*
  348. N_print_array_2d(xcomp);
  349. N_print_array_2d(ycomp);
  350. */
  351. N_free_gradient_field_2d(field);
  352. G_free(geom);
  353. N_free_array_2d(xcomp);
  354. N_free_array_2d(ycomp);
  355. N_free_array_2d(relax);
  356. N_free_array_2d(pot);
  357. return 0;
  358. }