test_arrays.c 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870
  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 arrays
  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 fill_array_2d(N_array_2d * a);
  23. static int fill_array_2d_null(N_array_2d * a);
  24. static int compare_array_2d(N_array_2d * a, N_array_2d * b);
  25. static int fill_array_3d(N_array_3d * a);
  26. static int fill_array_3d_null(N_array_3d * a);
  27. static int compare_array_3d(N_array_3d * a, N_array_3d * b);
  28. static int test_array_2d(void);
  29. static int test_array_3d(void);
  30. static int io_bench_2d(void);
  31. static int io_bench_3d(void);
  32. /* ************************************************************************* */
  33. /* Performe the array unit tests ******************************************* */
  34. /* ************************************************************************* */
  35. int unit_test_arrays(void)
  36. {
  37. int sum = 0;
  38. io_bench_2d();
  39. return sum;
  40. G_message("\n++ Running array unit tests ++");
  41. G_message("\t 1. testing 2d arrays");
  42. sum += test_array_2d();
  43. G_message("\t 2. testing 3d arrays");
  44. sum += test_array_3d();
  45. if (sum > 0)
  46. G_warning("\n-- Array unit tests failure --");
  47. else
  48. G_message("\n-- Array unit tests finished successfully --");
  49. return sum;
  50. }
  51. /* ************************************************************************* */
  52. /* Fill an 2d array with valid data **************************************** */
  53. /* ************************************************************************* */
  54. int fill_array_2d(N_array_2d * a)
  55. {
  56. int rows, cols, type;
  57. int i, j, res = 0;
  58. rows = a->rows;
  59. cols = a->cols;
  60. type = N_get_array_2d_type(a);
  61. #pragma omp parallel for private (i, j) shared (cols, rows, type, a) reduction(+:res)
  62. for (j = 0; j < rows; j++) {
  63. for (i = 0; i < cols; i++) {
  64. if (type == CELL_TYPE) {
  65. N_put_array_2d_c_value(a, i, j, (CELL) i * (CELL) j);
  66. if (N_get_array_2d_c_value(a, i, j) != (CELL) i * (CELL) j)
  67. res++;
  68. }
  69. if (type == FCELL_TYPE) {
  70. N_put_array_2d_f_value(a, i, j, (FCELL) i * (FCELL) j);
  71. if (N_get_array_2d_f_value(a, i, j) != (FCELL) i * (FCELL) j)
  72. res++;
  73. }
  74. if (type == DCELL_TYPE) {
  75. N_put_array_2d_d_value(a, i, j, (DCELL) i * (DCELL) j);
  76. if (N_get_array_2d_d_value(a, i, j) != (DCELL) i * (DCELL) j)
  77. res++;
  78. }
  79. }
  80. }
  81. return res;
  82. }
  83. /* ************************************************************************* */
  84. /* Fill an 2d array with null values *************************************** */
  85. /* ************************************************************************* */
  86. int fill_array_2d_null(N_array_2d * a)
  87. {
  88. int rows, cols;
  89. int i, j, res = 0;
  90. cols = a->cols;
  91. rows = a->rows;
  92. #pragma omp parallel for private (i, j) shared (rows, cols, a) reduction(+:res)
  93. for (j = 0; j < rows; j++) {
  94. for (i = 0; i < cols; i++) {
  95. N_put_array_2d_value_null(a, i, j);
  96. if (!N_is_array_2d_value_null(a, i, j))
  97. res++;
  98. }
  99. }
  100. return res;
  101. }
  102. /* ************************************************************************* */
  103. /* Compare two 2d arrays *************************************************** */
  104. /* ************************************************************************* */
  105. int compare_array_2d(N_array_2d * a, N_array_2d * b)
  106. {
  107. int rows, cols, type;
  108. int i, j, res = 0;
  109. cols = a->cols;
  110. rows = a->rows;
  111. type = N_get_array_2d_type(a);
  112. #pragma omp parallel for private (i, j) shared (cols, rows, type, a, b) reduction(+:res)
  113. for (j = 0; j < rows; j++) {
  114. for (i = 0; i < cols; i++) {
  115. if (type == CELL_TYPE) {
  116. if (N_get_array_2d_c_value(a, i, j) !=
  117. N_get_array_2d_c_value(b, i, j))
  118. res++;
  119. }
  120. if (type == FCELL_TYPE) {
  121. if (N_get_array_2d_f_value(a, i, j) !=
  122. N_get_array_2d_f_value(b, i, j))
  123. res++;
  124. }
  125. if (type == DCELL_TYPE) {
  126. if (N_get_array_2d_d_value(a, i, j) !=
  127. N_get_array_2d_d_value(b, i, j))
  128. res++;
  129. }
  130. }
  131. }
  132. return res;
  133. }
  134. /* ************************************************************************* */
  135. /* Fill an 3d array with valid data **************************************** */
  136. /* ************************************************************************* */
  137. int fill_array_3d(N_array_3d * a)
  138. {
  139. int rows, cols, depths, type;
  140. int i, j, k, res = 0;
  141. cols = a->cols;
  142. rows = a->rows;
  143. depths = a->depths;
  144. type = N_get_array_3d_type(a);
  145. #pragma omp parallel for private (i, j, k) shared (depths, rows, cols, type, a) reduction(+:res)
  146. for (k = 0; k < depths; k++) {
  147. for (j = 0; j < rows; j++) {
  148. for (i = 0; i < cols; i++) {
  149. if (type == FCELL_TYPE) {
  150. N_put_array_3d_f_value(a, i, j, k,
  151. (float)i * (float)j * (float)k);
  152. if (N_get_array_3d_f_value(a, i, j, k) !=
  153. (float)i * (float)j * (float)k)
  154. res++;
  155. }
  156. if (type == DCELL_TYPE) {
  157. N_put_array_3d_d_value(a, i, j, k,
  158. (double)i * (double)j * (double)k);
  159. if (N_get_array_3d_d_value(a, i, j, k) !=
  160. (double)i * (double)j * (double)k)
  161. res++;
  162. }
  163. }
  164. }
  165. }
  166. return res;
  167. }
  168. /* ************************************************************************* */
  169. /* Fill an 3d array with null data ***************************************** */
  170. /* ************************************************************************* */
  171. int fill_array_3d_null(N_array_3d * a)
  172. {
  173. int rows, cols, depths, type;
  174. int i, j, k, res = 0;
  175. cols = a->cols;
  176. rows = a->rows;
  177. depths = a->depths;
  178. type = N_get_array_3d_type(a);
  179. #pragma omp parallel for private (i, j, k) shared (cols, rows, depths, type, a) reduction(+:res)
  180. for (k = 0; k < depths; k++) {
  181. for (j = 0; j < rows; j++) {
  182. for (i = 0; i < cols; i++) {
  183. N_put_array_3d_value_null(a, i, j, k);
  184. if (!N_is_array_3d_value_null(a, i, j, k))
  185. res++;
  186. }
  187. }
  188. }
  189. return res;
  190. }
  191. /* ************************************************************************* */
  192. /* Compare two 3d arrays *************************************************** */
  193. /* ************************************************************************* */
  194. int compare_array_3d(N_array_3d * a, N_array_3d * b)
  195. {
  196. int rows, cols, depths, type;
  197. int i, j, k, res = 0;
  198. rows = a->rows;
  199. cols = a->cols;
  200. depths = a->depths;
  201. type = N_get_array_3d_type(a);
  202. #pragma omp parallel for private (i, j, k) shared (depths, rows, cols, type, a, b) reduction(+:res)
  203. for (k = 0; k < depths; k++) {
  204. for (i = 0; i < rows; i++) {
  205. for (j = 0; j < cols; j++) {
  206. if (type == FCELL_TYPE) {
  207. if (N_get_array_3d_f_value(a, i, j, k) !=
  208. N_get_array_3d_f_value(b, i, j, k))
  209. res++;
  210. }
  211. if (type == DCELL_TYPE) {
  212. if (N_get_array_3d_d_value(a, i, j, k) !=
  213. N_get_array_3d_d_value(b, i, j, k))
  214. res++;
  215. }
  216. }
  217. }
  218. }
  219. return res;
  220. }
  221. /* *************************************************************** */
  222. /* *************************************************************** */
  223. /* *************************************************************** */
  224. int io_bench_2d(void)
  225. {
  226. int sum = 0, res = 0;
  227. char buff[1024];
  228. struct Cell_head region;
  229. N_array_2d *data1;
  230. N_array_2d *data2;
  231. N_array_2d *data3;
  232. N_array_2d *tmp;
  233. G_get_set_window(&region);
  234. data1 = N_alloc_array_2d(region.cols, region.rows, 0, CELL_TYPE);
  235. data2 = N_alloc_array_2d(region.cols, region.rows, 0, FCELL_TYPE);
  236. data3 = N_alloc_array_2d(region.cols, region.rows, 0, DCELL_TYPE);
  237. fill_array_2d(data1);
  238. fill_array_2d(data2);
  239. fill_array_2d(data3);
  240. /*raster IO methods */
  241. N_write_array_2d_to_rast(data1, "gpde_lib_test_raster_1");
  242. N_write_array_2d_to_rast(data2, "gpde_lib_test_raster_2");
  243. N_write_array_2d_to_rast(data2, "gpde_lib_test_raster_3");
  244. tmp = N_read_rast_to_array_2d("gpde_lib_test_raster_1", NULL);
  245. N_read_rast_to_array_2d("gpde_lib_test_raster_1", tmp);
  246. N_free_array_2d(tmp);
  247. tmp = N_read_rast_to_array_2d("gpde_lib_test_raster_2", NULL);
  248. N_read_rast_to_array_2d("gpde_lib_test_raster_2", tmp);
  249. N_free_array_2d(tmp);
  250. tmp = N_read_rast_to_array_2d("gpde_lib_test_raster_3", NULL);
  251. N_read_rast_to_array_2d("gpde_lib_test_raster_3", tmp);
  252. N_free_array_2d(tmp);
  253. sprintf(buff,
  254. "g.remove -f type=raster name=gpde_lib_test_raster_1,gpde_lib_test_raster_2,gpde_lib_test_raster_3");
  255. system(buff);
  256. N_free_array_2d(data1);
  257. N_free_array_2d(data2);
  258. N_free_array_2d(data3);
  259. return sum;
  260. }
  261. /* *************************************************************** */
  262. /* *************************************************************** */
  263. /* *************************************************************** */
  264. int test_array_2d(void)
  265. {
  266. int sum = 0, res = 0;
  267. struct Cell_head region;
  268. N_array_2d *data1;
  269. N_array_2d *data11;
  270. N_array_2d *data2;
  271. N_array_2d *data22;
  272. N_array_2d *data3;
  273. N_array_2d *data33;
  274. char buff[1024];
  275. double min, max, ssum;
  276. int nonzero;
  277. N_array_2d *tmp;
  278. /*Alloacte memory for all arrays */
  279. data1 = N_alloc_array_2d(TEST_N_NUM_COLS, TEST_N_NUM_ROWS, 1, CELL_TYPE);
  280. N_print_array_2d_info(data1);
  281. data11 = N_alloc_array_2d(TEST_N_NUM_COLS, TEST_N_NUM_ROWS, 1, CELL_TYPE);
  282. data2 = N_alloc_array_2d(TEST_N_NUM_COLS, TEST_N_NUM_ROWS, 1, FCELL_TYPE);
  283. N_print_array_2d_info(data2);
  284. data22 = N_alloc_array_2d(TEST_N_NUM_COLS, TEST_N_NUM_ROWS, 1, FCELL_TYPE);
  285. data3 = N_alloc_array_2d(TEST_N_NUM_COLS, TEST_N_NUM_ROWS, 1, DCELL_TYPE);
  286. N_print_array_2d_info(data3);
  287. data33 = N_alloc_array_2d(TEST_N_NUM_COLS, TEST_N_NUM_ROWS, 1, DCELL_TYPE);
  288. /*Fill the first arrays with data */
  289. res = fill_array_2d(data1);
  290. if (res != 0)
  291. G_warning("test_array_2d: error while filling array with values");
  292. sum += res;
  293. res = fill_array_2d(data2);
  294. if (res != 0)
  295. G_warning("test_array_2d: error while filling array with values");
  296. sum += res;
  297. res = fill_array_2d(data3);
  298. if (res != 0)
  299. G_warning("test_array_2d: error while filling array with values");
  300. sum += res;
  301. /*Copy the data */
  302. N_copy_array_2d(data1, data11);
  303. N_copy_array_2d(data2, data22);
  304. N_copy_array_2d(data3, data33);
  305. /*Compare the data */
  306. res = compare_array_2d(data1, data11);
  307. if (res != 0)
  308. G_warning("test_array_2d: error in N_copy_array_2d");
  309. sum += res;
  310. res = compare_array_2d(data2, data22);
  311. if (res != 0)
  312. G_warning("test_array_2d: error in N_copy_array_2d");
  313. sum += res;
  314. res = compare_array_2d(data3, data33);
  315. if (res != 0)
  316. G_warning("test_array_2d: error in N_copy_array_2d");
  317. sum += res;
  318. /*compute statistics */
  319. N_calc_array_2d_stats(data1, &min, &max, &ssum, &nonzero, 0);
  320. G_message("CELL Min %g Max %g Sum %g nonzero %i\n", min, max, ssum,
  321. nonzero);
  322. if (min != 0 || max != 81 || ssum != 2025 || nonzero != 100) {
  323. G_warning("test_array_2d: error in N_calc_array_2d_stats");
  324. sum++;
  325. }
  326. N_calc_array_2d_stats(data1, &min, &max, &ssum, &nonzero, 1);
  327. G_message("CELL Min %g Max %g Sum %g nonzero %i\n", min, max, ssum,
  328. nonzero);
  329. if (min != 0 || max != 81 || ssum != 2025 || nonzero != 144) {
  330. G_warning("test_array_2d: error in N_calc_array_2d_stats");
  331. sum++;
  332. }
  333. N_calc_array_2d_stats(data2, &min, &max, &ssum, &nonzero, 0);
  334. G_message("FCELL Min %g Max %g Sum %g nonzero %i\n", min, max, ssum,
  335. nonzero);
  336. if (min != 0 || max != 81 || ssum != 2025 || nonzero != 100) {
  337. G_warning("test_array_2d: error in N_calc_array_2d_stats");
  338. sum++;
  339. }
  340. N_calc_array_2d_stats(data2, &min, &max, &ssum, &nonzero, 1);
  341. G_message("FCELL Min %g Max %g Sum %g nonzero %i\n", min, max, ssum,
  342. nonzero);
  343. if (min != 0 || max != 81 || ssum != 2025 || nonzero != 144) {
  344. G_warning("test_array_2d: error in N_calc_array_2d_stats");
  345. sum++;
  346. }
  347. N_calc_array_2d_stats(data3, &min, &max, &ssum, &nonzero, 0);
  348. G_message("DCELL Min %g Max %g Sum %g nonzero %i\n", min, max, ssum,
  349. nonzero);
  350. if (min != 0 || max != 81 || ssum != 2025 || nonzero != 100) {
  351. G_warning("test_array_2d: error in N_calc_array_2d_stats");
  352. sum++;
  353. }
  354. N_calc_array_2d_stats(data3, &min, &max, &ssum, &nonzero, 1);
  355. G_message("DCELL Min %g Max %g Sum %g nonzero %i\n", min, max, ssum,
  356. nonzero);
  357. if (min != 0 || max != 81 || ssum != 2025 || nonzero != 144) {
  358. G_warning("test_array_2d: error in N_calc_array_2d_stats");
  359. sum++;
  360. }
  361. /*test the array math functions */
  362. tmp = N_math_array_2d(data1, data2, NULL, N_ARRAY_SUM);
  363. N_math_array_2d(data2, data2, tmp, N_ARRAY_SUM);
  364. res = N_convert_array_2d_null_to_zero(tmp);
  365. if (res != 0)
  366. G_warning("test_array_2d: error in N_convert_array_2d_null_to_zero");
  367. sum = res;
  368. N_free_array_2d(tmp);
  369. tmp = N_math_array_2d(data2, data3, NULL, N_ARRAY_DIF);
  370. N_math_array_2d(data1, data2, tmp, N_ARRAY_DIF);
  371. res = N_convert_array_2d_null_to_zero(tmp);
  372. if (res != 0)
  373. G_warning("test_array_2d: error in N_convert_array_2d_null_to_zero");
  374. sum = res;
  375. N_free_array_2d(tmp);
  376. tmp = N_math_array_2d(data1, data1, NULL, N_ARRAY_MUL);
  377. N_math_array_2d(data1, data1, tmp, N_ARRAY_MUL);
  378. res = N_convert_array_2d_null_to_zero(tmp);
  379. if (res != 0)
  380. G_warning("test_array_2d: error in N_convert_array_2d_null_to_zero");
  381. sum = res;
  382. N_free_array_2d(tmp);
  383. tmp = N_math_array_2d(data2, data3, NULL, N_ARRAY_DIV);
  384. N_math_array_2d(data1, data2, tmp, N_ARRAY_DIV);
  385. res = N_convert_array_2d_null_to_zero(tmp);
  386. if (res == 0) { /* if a division with zero is detected, the value is set to null, not to nan */
  387. G_warning("test_array_2d: error in N_convert_array_2d_null_to_zero");
  388. sum++;
  389. }
  390. N_free_array_2d(tmp);
  391. /*check for correct norm calculation */
  392. if (N_norm_array_2d(data1, data11, N_EUKLID_NORM) != 0.0) {
  393. G_warning("test_array_2d: error in N_norm_array_2d");
  394. sum++;
  395. }
  396. if (N_norm_array_2d(data1, data11, N_MAXIMUM_NORM) != 0.0) {
  397. G_warning("test_array_2d: error in N_norm_array_2d");
  398. sum++;
  399. }
  400. if (N_norm_array_2d(data2, data3, N_EUKLID_NORM) != 0.0) {
  401. G_warning("test_array_2d: error in N_norm_array_2d");
  402. sum++;
  403. }
  404. if (N_norm_array_2d(data2, data3, N_MAXIMUM_NORM) != 0.0) {
  405. G_warning("test_array_2d: error in N_norm_array_2d");
  406. sum++;
  407. }
  408. /*fill arrays with null values */
  409. res = fill_array_2d_null(data1);
  410. if (res != 0)
  411. G_warning
  412. ("test_array_2d: error while filling array with cell null values");
  413. sum += res;
  414. res = fill_array_2d_null(data2);
  415. if (res != 0)
  416. G_warning
  417. ("test_array_2d: error while filling array with fcell null values");
  418. sum += res;
  419. res = fill_array_2d_null(data3);
  420. if (res != 0)
  421. G_warning
  422. ("test_array_2d: error while filling array with dcell null values");
  423. sum += res;
  424. /*Copy the data */
  425. N_copy_array_2d(data1, data11);
  426. N_copy_array_2d(data2, data22);
  427. N_copy_array_2d(data3, data33);
  428. /*Compare the data */
  429. compare_array_2d(data1, data11);
  430. compare_array_2d(data2, data22);
  431. compare_array_2d(data3, data33);
  432. /*check for correct norm calculation in case of null values */
  433. if (N_norm_array_2d(data1, data11, N_EUKLID_NORM) != 0.0) {
  434. G_warning("test_array_2d: error in N_norm_array_2d");
  435. sum++;
  436. }
  437. if (N_norm_array_2d(data1, data11, N_MAXIMUM_NORM) != 0.0) {
  438. G_warning("test_array_2d: error in N_norm_array_2d");
  439. sum++;
  440. }
  441. if (N_norm_array_2d(data2, data3, N_EUKLID_NORM) != 0.0) {
  442. G_warning("test_array_2d: error in N_norm_array_2d");
  443. sum++;
  444. }
  445. if (N_norm_array_2d(data2, data3, N_MAXIMUM_NORM) != 0.0) {
  446. G_warning("test_array_2d: error in N_norm_array_2d");
  447. sum++;
  448. }
  449. /*test the array math functions with null values */
  450. tmp = N_math_array_2d(data1, data11, NULL, N_ARRAY_SUM);
  451. N_math_array_2d(data2, data22, tmp, N_ARRAY_SUM);
  452. res = N_convert_array_2d_null_to_zero(tmp);
  453. if (res == 0) {
  454. G_warning("test_array_2d: error in N_convert_array_2d_null_to_zero ");
  455. sum++;
  456. }
  457. N_free_array_2d(tmp);
  458. tmp = N_math_array_2d(data2, data22, NULL, N_ARRAY_DIF);
  459. N_math_array_2d(data3, data33, tmp, N_ARRAY_DIF);
  460. res = N_convert_array_2d_null_to_zero(tmp);
  461. if (res == 0) {
  462. G_warning("test_array_2d: error in N_convert_array_2d_null_to_zero");
  463. sum++;
  464. }
  465. N_free_array_2d(tmp);
  466. tmp = N_math_array_2d(data1, data11, NULL, N_ARRAY_MUL);
  467. N_math_array_2d(data3, data33, tmp, N_ARRAY_MUL);
  468. res = N_convert_array_2d_null_to_zero(tmp);
  469. if (res == 0) {
  470. G_warning("test_array_2d: error in N_convert_array_2d_null_to_zero");
  471. sum++;
  472. }
  473. N_free_array_2d(tmp);
  474. tmp = N_math_array_2d(data2, data3, NULL, N_ARRAY_DIV);
  475. N_math_array_2d(data1, data11, tmp, N_ARRAY_DIV);
  476. res = N_convert_array_2d_null_to_zero(tmp);
  477. if (res == 0) {
  478. G_warning("test_array_2d: error in N_convert_array_2d_null_to_zero");
  479. sum++;
  480. }
  481. N_free_array_2d(tmp);
  482. N_free_array_2d(data1);
  483. N_free_array_2d(data2);
  484. N_free_array_2d(data3);
  485. G_get_set_window(&region);
  486. data1 = N_alloc_array_2d(region.cols, region.rows, 0, CELL_TYPE);
  487. data2 = N_alloc_array_2d(region.cols, region.rows, 0, FCELL_TYPE);
  488. data3 = N_alloc_array_2d(region.cols, region.rows, 0, DCELL_TYPE);
  489. fill_array_2d(data1);
  490. fill_array_2d(data2);
  491. fill_array_2d(data3);
  492. /*raster IO methods */
  493. N_write_array_2d_to_rast(data1, "gpde_lib_test_raster_1");
  494. N_write_array_2d_to_rast(data2, "gpde_lib_test_raster_2");
  495. N_write_array_2d_to_rast(data2, "gpde_lib_test_raster_3");
  496. tmp = N_read_rast_to_array_2d("gpde_lib_test_raster_1", NULL);
  497. N_read_rast_to_array_2d("gpde_lib_test_raster_1", tmp);
  498. N_free_array_2d(tmp);
  499. tmp = N_read_rast_to_array_2d("gpde_lib_test_raster_2", NULL);
  500. N_read_rast_to_array_2d("gpde_lib_test_raster_2", tmp);
  501. N_free_array_2d(tmp);
  502. tmp = N_read_rast_to_array_2d("gpde_lib_test_raster_3", NULL);
  503. N_read_rast_to_array_2d("gpde_lib_test_raster_3", tmp);
  504. N_free_array_2d(tmp);
  505. sprintf(buff,
  506. "g.remove -f type=raster name=gpde_lib_test_raster_1,gpde_lib_test_raster_2,gpde_lib_test_raster_3");
  507. system(buff);
  508. N_free_array_2d(data1);
  509. N_free_array_2d(data11);
  510. N_free_array_2d(data2);
  511. N_free_array_2d(data22);
  512. N_free_array_2d(data3);
  513. N_free_array_2d(data33);
  514. return sum;
  515. }
  516. /* *************************************************************** */
  517. /* *************************************************************** */
  518. /* *************************************************************** */
  519. int test_array_3d(void)
  520. {
  521. int sum = 0, res = 0;
  522. char buff[1024];
  523. RASTER3D_Region region;
  524. N_array_3d *data1;
  525. N_array_3d *data11;
  526. N_array_3d *data2;
  527. N_array_3d *data22;
  528. N_array_3d *tmp;
  529. double min, max, ssum;
  530. int nonzero;
  531. /*Alloacte memory for all arrays */
  532. data1 =
  533. N_alloc_array_3d(TEST_N_NUM_COLS, TEST_N_NUM_ROWS, TEST_N_NUM_DEPTHS, 2,
  534. FCELL_TYPE);
  535. N_print_array_3d_info(data1);
  536. data11 =
  537. N_alloc_array_3d(TEST_N_NUM_COLS, TEST_N_NUM_ROWS, TEST_N_NUM_DEPTHS, 2,
  538. FCELL_TYPE);
  539. data2 =
  540. N_alloc_array_3d(TEST_N_NUM_COLS, TEST_N_NUM_ROWS, TEST_N_NUM_DEPTHS, 2,
  541. DCELL_TYPE);
  542. N_print_array_3d_info(data2);
  543. data22 =
  544. N_alloc_array_3d(TEST_N_NUM_COLS, TEST_N_NUM_ROWS, TEST_N_NUM_DEPTHS, 2,
  545. DCELL_TYPE);
  546. /*Fill the first arrays with data */
  547. res = fill_array_3d(data1);
  548. if (res != 0)
  549. G_warning("test_array_3d: error while filling array with values");
  550. sum += res;
  551. res = fill_array_3d(data2);
  552. if (res != 0)
  553. G_warning("test_array_3d: error while filling array with values");
  554. sum += res;
  555. /*Copy the data */
  556. N_copy_array_3d(data1, data11);
  557. N_copy_array_3d(data2, data22);
  558. /*Compare the data */
  559. res = compare_array_3d(data1, data11);
  560. if (res != 0)
  561. G_warning("test_array_3d: error in N_copy_array_2d");
  562. sum += res;
  563. res = compare_array_3d(data1, data11);
  564. if (res != 0)
  565. G_warning("test_array_3d: error in N_copy_array_2d");
  566. sum += res;
  567. /*compute statistics */
  568. N_calc_array_3d_stats(data1, &min, &max, &ssum, &nonzero, 0);
  569. G_message("FELL Min %g Max %g Sum %g nonzero %i\n", min, max, ssum,
  570. nonzero);
  571. if (min != 0 || max != 729 || ssum != 91125 || nonzero != 1000) {
  572. G_warning("test_array_3d: error in N_calc_array_3d_stats");
  573. sum++;
  574. }
  575. N_calc_array_3d_stats(data1, &min, &max, &ssum, &nonzero, 1);
  576. G_message("FELL Min %g Max %g Sum %g nonzero %i\n", min, max, ssum,
  577. nonzero);
  578. if (min != 0 || max != 729 || ssum != 91125 || nonzero != 2744) {
  579. G_warning("test_array_3d: error in N_calc_array_3d_stats");
  580. sum++;
  581. }
  582. N_calc_array_3d_stats(data2, &min, &max, &ssum, &nonzero, 0);
  583. G_message("DCELL Min %g Max %g Sum %g nonzero %i\n", min, max, ssum,
  584. nonzero);
  585. if (min != 0 || max != 729 || ssum != 91125 || nonzero != 1000) {
  586. G_warning("test_array_3d: error in N_calc_array_3d_stats");
  587. sum++;
  588. }
  589. N_calc_array_3d_stats(data2, &min, &max, &ssum, &nonzero, 1);
  590. G_message("DCELL Min %g Max %g Sum %g nonzero %i\n", min, max, ssum,
  591. nonzero);
  592. if (min != 0 || max != 729 || ssum != 91125 || nonzero != 2744) {
  593. G_warning("test_array_3d: error in N_calc_array_3d_stats");
  594. sum++;
  595. }
  596. /*test the array math functions */
  597. tmp = N_math_array_3d(data1, data2, NULL, N_ARRAY_SUM);
  598. N_math_array_3d(data2, data2, tmp, N_ARRAY_SUM);
  599. res = N_convert_array_3d_null_to_zero(tmp);
  600. if (res != 0)
  601. G_warning("test_array_3d: error in N_convert_array_3d_null_to_zero");
  602. sum = res;
  603. N_free_array_3d(tmp);
  604. tmp = N_math_array_3d(data2, data1, NULL, N_ARRAY_DIF);
  605. N_math_array_3d(data1, data2, tmp, N_ARRAY_DIF);
  606. res = N_convert_array_3d_null_to_zero(tmp);
  607. if (res != 0)
  608. G_warning("test_array_3d: error in N_convert_array_3d_null_to_zero");
  609. sum = res;
  610. N_free_array_3d(tmp);
  611. tmp = N_math_array_3d(data1, data1, NULL, N_ARRAY_MUL);
  612. N_math_array_3d(data1, data1, tmp, N_ARRAY_MUL);
  613. res = N_convert_array_3d_null_to_zero(tmp);
  614. if (res != 0)
  615. G_warning("test_array_3d: error in N_convert_array_3d_null_to_zero");
  616. sum = res;
  617. N_free_array_3d(tmp);
  618. tmp = N_math_array_3d(data2, data1, NULL, N_ARRAY_DIV);
  619. N_math_array_3d(data1, data2, tmp, N_ARRAY_DIV);
  620. res = N_convert_array_3d_null_to_zero(tmp);
  621. if (res == 0) { /* if a division with zero is detected, the value is set to null, not to nan */
  622. G_warning("test_array_3d: error in N_convert_array_3d_null_to_zero");
  623. sum++;
  624. }
  625. N_free_array_3d(tmp);
  626. /*check for correct norm calculation */
  627. if (N_norm_array_3d(data1, data11, N_EUKLID_NORM) != 0.0) {
  628. G_warning("test_array_3d: error in N_norm_array_3d");
  629. sum++;
  630. }
  631. if (N_norm_array_3d(data1, data11, N_MAXIMUM_NORM) != 0.0) {
  632. G_warning("test_array_3d: error in N_norm_array_3d");
  633. sum++;
  634. }
  635. if (N_norm_array_3d(data1, data2, N_EUKLID_NORM) != 0.0) {
  636. G_warning("test_array_3d: error in N_norm_array_3d");
  637. sum++;
  638. }
  639. if (N_norm_array_3d(data1, data2, N_MAXIMUM_NORM) != 0.0) {
  640. G_warning("test_array_3d: error in N_norm_array_3d");
  641. sum++;
  642. }
  643. /*fill arrays with null values */
  644. res = fill_array_3d_null(data1);
  645. if (res != 0)
  646. G_warning
  647. ("test_array_3d: error while filling array with float null values");
  648. sum += res;
  649. res = fill_array_3d_null(data2);
  650. if (res != 0)
  651. G_warning
  652. ("test_array_3d: error while filling array with double null values");
  653. sum += res;
  654. /*Copy the data */
  655. N_copy_array_3d(data1, data11);
  656. N_copy_array_3d(data2, data22);
  657. /*Compare the data */
  658. compare_array_3d(data1, data11);
  659. compare_array_3d(data2, data22);
  660. /*test the array math functions */
  661. tmp = N_math_array_3d(data1, data2, NULL, N_ARRAY_SUM);
  662. N_math_array_3d(data2, data2, tmp, N_ARRAY_SUM);
  663. res = N_convert_array_3d_null_to_zero(tmp);
  664. if (res == 0) {
  665. G_warning("test_array_3d: error in N_convert_array_3d_null_to_zero");
  666. sum++;
  667. }
  668. N_free_array_3d(tmp);
  669. tmp = N_math_array_3d(data2, data1, NULL, N_ARRAY_DIF);
  670. N_math_array_3d(data1, data2, tmp, N_ARRAY_DIF);
  671. res = N_convert_array_3d_null_to_zero(tmp);
  672. if (res == 0) {
  673. G_warning("test_array_3d: error in N_convert_array_3d_null_to_zero");
  674. sum++;
  675. }
  676. N_free_array_3d(tmp);
  677. tmp = N_math_array_3d(data1, data1, NULL, N_ARRAY_MUL);
  678. N_math_array_3d(data1, data1, tmp, N_ARRAY_MUL);
  679. res = N_convert_array_3d_null_to_zero(tmp);
  680. if (res == 0) {
  681. G_warning("test_array_3d: error in N_convert_array_3d_null_to_zero");
  682. sum++;
  683. }
  684. N_free_array_3d(tmp);
  685. tmp = N_math_array_3d(data2, data1, NULL, N_ARRAY_DIV);
  686. N_math_array_3d(data1, data2, tmp, N_ARRAY_DIV);
  687. res = N_convert_array_3d_null_to_zero(tmp);
  688. if (res == 0) {
  689. G_warning("test_array_3d: error in N_convert_array_3d_null_to_zero");
  690. sum++;
  691. }
  692. N_free_array_3d(tmp);
  693. /*check for correct norm calculation in case of null values */
  694. if (N_norm_array_3d(data1, data11, N_EUKLID_NORM) != 0.0) {
  695. G_warning("test_array_3d: error in N_norm_array_3d");
  696. sum++;
  697. }
  698. if (N_norm_array_3d(data1, data11, N_MAXIMUM_NORM) != 0.0) {
  699. G_warning("test_array_3d: error in N_norm_array_3d");
  700. sum++;
  701. }
  702. if (N_norm_array_3d(data1, data2, N_EUKLID_NORM) != 0.0) {
  703. G_warning("test_array_3d: error in N_norm_array_3d");
  704. sum++;
  705. }
  706. if (N_norm_array_3d(data1, data2, N_MAXIMUM_NORM) != 0.0) {
  707. G_warning("test_array_3d: error in N_norm_array_3d");
  708. sum++;
  709. }
  710. N_free_array_3d(data1);
  711. N_free_array_3d(data2);
  712. /*Set the defaults */
  713. Rast3d_init_defaults();
  714. Rast3d_get_window(&region);
  715. data1 =
  716. N_alloc_array_3d(region.cols, region.rows, region.depths, 0,
  717. FCELL_TYPE);
  718. data2 =
  719. N_alloc_array_3d(region.cols, region.rows, region.depths, 0,
  720. DCELL_TYPE);
  721. fill_array_3d(data1);
  722. fill_array_3d(data2);
  723. /*Volume IO methods */
  724. N_write_array_3d_to_rast3d(data1, "gpde_lib_test_volume_1", 1);
  725. N_write_array_3d_to_rast3d(data2, "gpde_lib_test_volume_2", 1);
  726. tmp = N_read_rast3d_to_array_3d("gpde_lib_test_volume_1", NULL, 1);
  727. N_read_rast3d_to_array_3d("gpde_lib_test_volume_1", tmp, 1);
  728. N_free_array_3d(tmp);
  729. tmp = N_read_rast3d_to_array_3d("gpde_lib_test_volume_2", NULL, 1);
  730. N_read_rast3d_to_array_3d("gpde_lib_test_volume_2", tmp, 1);
  731. N_free_array_3d(tmp);
  732. sprintf(buff,
  733. "g.remove -f type=raster_3d name=gpde_lib_test_volume_1,gpde_lib_test_volume_2");
  734. system(buff);
  735. N_free_array_3d(data1);
  736. N_free_array_3d(data11);
  737. N_free_array_3d(data2);
  738. N_free_array_3d(data22);
  739. return sum;
  740. }