19 #include <grass/N_pde.h> 37 "N_calc_gradient_field_2d_stats: compute gradient field stats");
52 field->
sum = sumx + sumy;
53 field->
nonull = nonullx + nonully;
114 double dx, dy, p1, p2, r1, r2,
mean, grad, res;
120 (
"N_compute_gradient_field_2d: the arrays are not of equal size");
124 (
"N_compute_gradient_field_2d: the arrays are not of equal size");
128 (
"N_compute_gradient_field_2d: array sizes and geometry data are different");
131 G_debug(3,
"N_compute_gradient_field_2d: compute gradient field");
144 (
"N_compute_gradient_field_2d: gradient field sizes and geometry data are different");
148 for (j = 0; j <
rows; j++)
149 for (i = 0; i < cols - 1; i++) {
158 grad = (p1 - p2) / dx;
173 for (j = 0; j < rows - 1; j++)
174 for (i = 0; i <
cols; i++) {
183 grad = (p1 - p2) / dy;
192 res = -1 * mean * grad;
261 G_fatal_error(
"N_compute_gradient_components_2d: x array is empty");
263 G_fatal_error(
"N_compute_gradient_components_2d: y array is empty");
269 if (x->
cols != cols || x->
rows != rows)
271 (
"N_compute_gradient_components_2d: the size of the x array doesn't fit the gradient field size");
272 if (y->
cols != cols || y->
rows != rows)
274 (
"N_compute_gradient_components_2d: the size of the y array doesn't fit the gradient field size");
276 for (j = 0; j <
rows; j++)
277 for (i = 0; i <
cols; i++) {
281 if (grad.
WC == 0.0 || grad.
EC == 0.0)
282 vx = (grad.
WC + grad.
EC);
284 vx = (grad.
WC + grad.
EC) / 2;
285 if (grad.
NC == 0.0 || grad.
SC == 0.0)
286 vy = (grad.
NC + grad.
SC);
288 vy = (grad.
NC + grad.
SC) / 2;
307 double minx, miny, minz;
309 double maxx, maxy, maxz;
311 double sumx, sumy, sumz;
313 int nonullx, nonully, nonullz;
316 "N_calc_gradient_field_3d_stats: compute gradient field stats");
322 if (minx <= minz && minx <= miny)
324 if (miny <= minz && miny <= minx)
326 if (minz <= minx && minz <= miny)
329 if (maxx >= maxz && maxx >= maxy)
331 if (maxy >= maxz && maxy >= maxx)
333 if (maxz >= maxx && maxz >= maxy)
336 field->
sum = sumx + sumy + sumz;
337 field->
nonull = nonullx + nonully + nonullz;
406 double dx, dy, dz, p1, p2, r1, r2,
mean, grad, res;
414 (
"N_compute_gradient_field_3d: the arrays are not of equal size");
419 (
"N_compute_gradient_field_3d: the arrays are not of equal size");
424 (
"N_compute_gradient_field_3d: the arrays are not of equal size");
429 (
"N_compute_gradient_field_3d: array sizes and geometry data are different");
431 G_debug(3,
"N_compute_gradient_field_3d: compute gradient field");
440 if (gradfield ==
NULL) {
447 (
"N_compute_gradient_field_3d: gradient field sizes and geometry data are different");
450 for (k = 0; k <
depths; k++)
451 for (j = 0; j <
rows; j++)
452 for (i = 0; i < cols - 1; i++) {
461 grad = (p1 - p2) / dx;
473 "N_compute_gradient_field_3d: X-direction insert value %6.5g at %i %i %i ",
480 for (k = 0; k <
depths; k++)
481 for (j = 0; j < rows - 1; j++)
482 for (i = 0; i <
cols; i++) {
491 grad = (p1 - p2) / dy;
500 res = -1 * mean * grad;
504 "N_compute_gradient_field_3d: Y-direction insert value %6.5g at %i %i %i ",
511 for (k = 0; k < depths - 1; k++)
512 for (j = 0; j <
rows; j++)
513 for (i = 0; i <
cols; i++) {
522 grad = (p1 - p2) / dz;
534 "N_compute_gradient_field_3d: Z-direction insert value %6.5g at %i %i %i ",
611 G_fatal_error(
"N_compute_gradient_components_3d: x array is empty");
613 G_fatal_error(
"N_compute_gradient_components_3d: y array is empty");
615 G_fatal_error(
"N_compute_gradient_components_3d: z array is empty");
624 (
"N_compute_gradient_components_3d: the size of the x array doesn't fit the gradient field size");
627 (
"N_compute_gradient_components_3d: the size of the y array doesn't fit the gradient field size");
630 (
"N_compute_gradient_components_3d: the size of the z array doesn't fit the gradient field size");
632 for (k = 0; k <
depths; k++)
633 for (j = 0; j <
rows; j++)
634 for (i = 0; i <
cols; i++) {
637 if (grad.
WC == 0.0 || grad.
EC == 0.0)
638 vx = (grad.
WC + grad.
EC);
640 vx = (grad.
WC + grad.
EC) / 2;
641 if (grad.
NC == 0.0 || grad.
SC == 0.0)
642 vy = (grad.
NC + grad.
SC);
644 vy = (grad.
NC + grad.
SC) / 2;
645 if (grad.
TC == 0.0 || grad.
BC == 0.0)
646 vz = (grad.
TC + grad.
BC);
648 vz = (grad.
TC + grad.
BC) / 2;
N_gradient_2d * N_get_gradient_2d(N_gradient_field_2d *field, N_gradient_2d *gradient, int col, int row)
Return a N_gradient_2d structure calculated from the input gradient field at position [row][col]...
void void void void G_fatal_error(const char *,...) __attribute__((format(printf
void N_calc_array_2d_stats(N_array_2d *a, double *min, double *max, double *sum, int *nonull, int withoffset)
Calculate basic statistics of the N_array_2d struct.
double N_get_array_3d_d_value(N_array_3d *data, int col, int row, int depth)
This function returns the value of type float at position col, row, depth.
Gradient between the cells in X and Y direction.
N_gradient_field_3d * N_alloc_gradient_field_3d(int cols, int rows, int depths)
Allocate a N_gradient_field_3d.
Geometric information about the structured grid.
void N_calc_gradient_field_2d_stats(N_gradient_field_2d *field)
Calculate basic statistics of a gradient field.
N_gradient_field_3d * N_compute_gradient_field_3d(N_array_3d *pot, N_array_3d *weight_x, N_array_3d *weight_y, N_array_3d *weight_z, N_geom_data *geom, N_gradient_field_3d *gradfield)
This function computes the gradient based on the input N_array_3d pot (that means potential)...
void N_put_array_3d_d_value(N_array_3d *data, int col, int row, int depth, double value)
Writes a double value to the N_array_3d struct at position col, row, depth.
int N_is_array_2d_value_null(N_array_2d *data, int col, int row)
Returns 1 if the value of N_array_2d struct at position col, row is of type null, otherwise 0...
int depths
number of depths for 3D data
Gradient between the cells in X, Y and Z direction.
void N_calc_gradient_field_3d_stats(N_gradient_field_3d *field)
Calculate basic statistics of a gradient field.
int cols
Number of columns for 2D data.
N_gradient_field_2d * N_alloc_gradient_field_2d(int cols, int rows)
Allocate a N_gradient_field_2d.
void N_compute_gradient_field_components_2d(N_gradient_field_2d *field, N_array_2d *x_comp, N_array_2d *y_comp)
Calculate the x and y vector components from a gradient field for each cell and stores them in the pr...
void N_put_array_2d_d_value(N_array_2d *data, int col, int row, DCELL value)
Writes a DCELL value to the N_array_2d struct at position col, row.
N_gradient_field_2d * N_compute_gradient_field_2d(N_array_2d *pot, N_array_2d *weight_x, N_array_2d *weight_y, N_geom_data *geom, N_gradient_field_2d *gradfield)
This function computes the gradient based on the input N_array_2d pot (potential), a weighting factor N_array_2d named weight and the distance between two cells saved in the N_geom_data struct.
void N_calc_array_3d_stats(N_array_3d *a, double *min, double *max, double *sum, int *nonull, int withoffset)
Calculate basic statistics of the N_array_3d struct.
double N_calc_harmonic_mean(double a, double b)
Calculate the harmonical mean of values a and b.
DCELL N_get_array_2d_d_value(N_array_2d *data, int col, int row)
Returns the value of type DCELL at position col, row.
float mean(IClass_statistics *statistics, int band)
Helper function for computing mean.
void N_compute_gradient_field_components_3d(N_gradient_field_3d *field, N_array_3d *x_comp, N_array_3d *y_comp, N_array_3d *z_comp)
Calculate the x, y and z vector components from a gradient field for each cell and store them in the ...
int rows
Number of rows for 2D data.
int G_debug(int, const char *,...) __attribute__((format(printf
N_gradient_3d * N_get_gradient_3d(N_gradient_field_3d *field, N_gradient_3d *gradient, int col, int row, int depth)
Return a N_gradient_3d structure calculated from the input gradient field at position [depth][row][co...
int N_is_array_3d_value_null(N_array_3d *data, int col, int row, int depth)
This function returns 1 if value of N_array_3d data at position col, row, depth is of type null...