GRASS Programmer's Manual  6.4.2(2012)
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
test_assemble.c
Go to the documentation of this file.
1 
2 /*****************************************************************************
3 *
4 * MODULE: Grass PDE Numerical Library
5 * AUTHOR(S): Soeren Gebbert, Berlin (GER) Dec 2006
6 * soerengebbert <at> gmx <dot> de
7 *
8 * PURPOSE: Unit tests for matrix assembling
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 
18 
19 
20 #include <stdio.h>
21 #include <stdlib.h>
22 #include <string.h>
23 #include <grass/glocale.h>
24 #include <grass/N_pde.h>
25 #include "test_gpde_lib.h"
26 
27 /* prototypes */
28 static int test_matrix_assemble_2d(void);
29 static int test_matrix_assemble_3d(void);
30 static N_array_2d *create_status_array_2d(void);
31 static N_array_3d *create_status_array_3d(void);
32 static N_array_2d *create_value_array_2d(void);
33 static N_array_3d *create_value_array_3d(void);
34 
35 /* *************************************************************** */
36 /* Performe the les assmbling tests ****************************** */
37 /* *************************************************************** */
39 {
40  int sum = 0;
41 
42  G_message(_("\n++ Running assembling unit tests ++"));
43 
44  G_message(_("\t 1. testing 2d assembling"));
45  sum += test_matrix_assemble_2d();
46 
47  G_message(_("\t 2. testing 3d assembling"));
48  sum += test_matrix_assemble_3d();
49 
50  if (sum > 0)
51  G_warning(_("\n-- Assembling unit tests failure --"));
52  else
53  G_message(_("\n-- Assembling unit tests finished successfully --"));
54 
55  return sum;
56 }
57 
58 /* *************************************************************** */
59 /* Create the status array with values of 1 and 2 **************** */
60 /* *************************************************************** */
61 N_array_2d *create_status_array_2d(void)
62 {
64  int i, j;
65 
66  data = N_alloc_array_2d(TEST_N_NUM_COLS, TEST_N_NUM_ROWS, 1, CELL_TYPE);
67 
68 #pragma omp parallel for private (i, j) shared (data)
69  for (j = 0; j < TEST_N_NUM_ROWS; j++) {
70  for (i = 0; i < TEST_N_NUM_COLS; i++) {
71 
72  if (j == 1) {
73  N_put_array_2d_c_value(data, i, j, 2);
74  }
75  else {
76  N_put_array_2d_c_value(data, i, j, 1);
77  }
78  }
79  }
80  return data;
81 }
82 
83 /* *************************************************************** */
84 /* Create a value array ****************************************** */
85 /* *************************************************************** */
86 N_array_2d *create_value_array_2d(void)
87 {
89  int i, j;
90 
91  data = N_alloc_array_2d(TEST_N_NUM_COLS, TEST_N_NUM_ROWS, 1, DCELL_TYPE);
92 
93 #pragma omp parallel for private (i, j) shared (data)
94  for (j = 0; j < TEST_N_NUM_ROWS; j++) {
95  for (i = 0; i < TEST_N_NUM_COLS; i++) {
96 
97  if (j == 1) {
98  N_put_array_2d_d_value(data, i, j, 50);
99  }
100  else {
101  N_put_array_2d_d_value(data, i, j, 1);
102  }
103  }
104  }
105  return data;
106 }
107 
108 /* *************************************************************** */
109 /* Create the status array with values of 1 and 2 **************** */
110 /* *************************************************************** */
111 N_array_3d *create_status_array_3d(void)
112 {
113  N_array_3d *data;
114  int i, j, k;
115 
116  data =
118  1, FCELL_TYPE);
119 
120 #pragma omp parallel for private (i, j, k) shared (data)
121  for (k = 0; k < TEST_N_NUM_DEPTHS; k++)
122  for (j = 0; j < TEST_N_NUM_ROWS; j++) {
123  for (i = 0; i < TEST_N_NUM_COLS; i++) {
124 
125  if (i == 0 && j == 1) {
126  N_put_array_3d_f_value(data, i, j, k, 2.0);
127  }
128  else {
129 
130  N_put_array_3d_f_value(data, i, j, k, 1.0);
131  }
132  }
133  }
134 
135  return data;
136 
137 }
138 
139 /* *************************************************************** */
140 /* Create a value array ****************************************** */
141 /* *************************************************************** */
142 N_array_3d *create_value_array_3d(void)
143 {
144  N_array_3d *data;
145  int i, j, k;
146 
147  data =
148  N_alloc_array_3d(TEST_N_NUM_COLS, TEST_N_NUM_ROWS, TEST_N_NUM_DEPTHS,
149  1, DCELL_TYPE);
150 
151 #pragma omp parallel for private (i, j, k) shared (data)
152  for (k = 0; k < TEST_N_NUM_DEPTHS; k++)
153  for (j = 0; j < TEST_N_NUM_ROWS; j++) {
154  for (i = 0; i < TEST_N_NUM_COLS; i++) {
155 
156 
157  if (i == 0 && j == 1) {
158  N_put_array_3d_f_value(data, i, j, k, 50);
159  }
160  else {
161 
162  N_put_array_3d_f_value(data, i, j, k, 1);
163  }
164  }
165  }
166 
167  return data;
168 
169 }
170 
171 /* *************************************************************** */
172 /* Test the matrix assembling with 3d array data ***************** */
173 /* *************************************************************** */
174 int test_matrix_assemble_3d(void)
175 {
176  N_geom_data *geom;
177  N_les *les;
179  N_array_3d *status;
180  N_array_3d *start_val;
181 
182 
183  /*set the callback to default */
184  call = N_alloc_les_callback_3d();
185 
186  status = create_status_array_3d();
187  start_val = create_value_array_3d();
188 
189  geom = N_alloc_geom_data();
190 
191  geom->dx = 1;
192  geom->dy = 1;
193  geom->dz = 1;
194 
195  geom->Az = 1;
196 
197  geom->depths = TEST_N_NUM_DEPTHS;
198  geom->rows = TEST_N_NUM_ROWS;
199  geom->cols = TEST_N_NUM_COLS;
200 
201  /*Assemble the matrix */
202  les =
203  N_assemble_les_3d(N_SPARSE_LES, geom, status, start_val, NULL, call);
204  N_free_les(les);
205  les =
206  N_assemble_les_3d_active(N_SPARSE_LES, geom, status, start_val, NULL,
207  call);
208  N_free_les(les);
209  les =
210  N_assemble_les_3d_dirichlet(N_SPARSE_LES, geom, status, start_val,
211  NULL, call);
212  N_les_integrate_dirichlet_3d(les, geom, status, start_val);
213  N_free_les(les);
214 
215  les =
216  N_assemble_les_3d(N_NORMAL_LES, geom, status, start_val, NULL, call);
217  N_free_les(les);
218  les =
219  N_assemble_les_3d_active(N_NORMAL_LES, geom, status, start_val, NULL,
220  call);
221  N_free_les(les);
222  les =
223  N_assemble_les_3d_dirichlet(N_NORMAL_LES, geom, status, start_val,
224  NULL, call);
225  N_les_integrate_dirichlet_3d(les, geom, status, start_val);
226  N_free_les(les);
227 
228  G_free(geom);
229  G_free(call);
230 
231  return 0;
232 }
233 
234 
235 /* *************************************************************** */
236 /* Test the matrix assembling with 2d array data ***************** */
237 /* *************************************************************** */
238 int test_matrix_assemble_2d(void)
239 {
240 
241  N_geom_data *geom;
242  N_les *les;
244  N_array_2d *status;
245  N_array_2d *start_val;
246 
247  /*set the callback to default */
248  call = N_alloc_les_callback_2d();
249 
250  status = create_status_array_2d();
251  start_val = create_value_array_2d();
252 
253  geom = N_alloc_geom_data();
254 
255  geom->dx = 1;
256  geom->dy = 1;
257 
258  geom->Az = 1;
259 
260  geom->rows = TEST_N_NUM_ROWS;
261  geom->cols = TEST_N_NUM_COLS;
262 
263  /*Assemble the matrix */
264  les =
265  N_assemble_les_2d(N_SPARSE_LES, geom, status, start_val, NULL, call);
266  N_free_les(les);
267  les =
268  N_assemble_les_2d_active(N_SPARSE_LES, geom, status, start_val, NULL,
269  call);
270  N_free_les(les);
271  les =
272  N_assemble_les_2d_dirichlet(N_SPARSE_LES, geom, status, start_val,
273  NULL, call);
274  N_les_integrate_dirichlet_2d(les, geom, status, start_val);
275  N_free_les(les);
276 
277  les =
278  N_assemble_les_2d(N_NORMAL_LES, geom, status, start_val, NULL, call);
279  N_free_les(les);
280  les =
281  N_assemble_les_2d_active(N_NORMAL_LES, geom, status, start_val, NULL,
282  call);
283  N_free_les(les);
284  les =
285  N_assemble_les_2d_dirichlet(N_NORMAL_LES, geom, status, start_val,
286  NULL, call);
287  N_les_integrate_dirichlet_2d(les, geom, status, start_val);
288  N_free_les(les);
289 
290  G_free(geom);
291  G_free(call);
292 
293  return 0;
294 }