15#include <grass/N_pde.h>
32 G_debug(3,
"N_calc_gradient_field_2d_stats: compute gradient field stats");
114 double dx, dy,
p1, p2,
r1,
r2,
mean, grad, res;
119 "N_compute_gradient_field_2d: the arrays are not of equal size");
123 "N_compute_gradient_field_2d: the arrays are not of equal size");
126 G_fatal_error(
"N_compute_gradient_field_2d: array sizes and geometry "
127 "data are different");
129 G_debug(3,
"N_compute_gradient_field_2d: compute gradient field");
141 G_fatal_error(
"N_compute_gradient_field_2d: gradient field sizes "
142 "and geometry data are different");
145 for (
j = 0;
j < rows;
j++)
146 for (i = 0; i < cols - 1; i++) {
155 grad = (
p1 - p2) / dx;
169 for (
j = 0;
j < rows - 1;
j++)
170 for (i = 0; i < cols; i++) {
179 grad = (
p1 - p2) / dy;
188 res = -1 *
mean * grad;
256 G_fatal_error(
"N_compute_gradient_components_2d: x array is empty");
258 G_fatal_error(
"N_compute_gradient_components_2d: y array is empty");
264 if (
x->cols != cols ||
x->rows != rows)
265 G_fatal_error(
"N_compute_gradient_components_2d: the size of the x "
266 "array doesn't fit the gradient field size");
267 if (y->
cols != cols || y->
rows != rows)
268 G_fatal_error(
"N_compute_gradient_components_2d: the size of the y "
269 "array doesn't fit the gradient field size");
271 for (
j = 0;
j < rows;
j++)
272 for (i = 0; i < cols; i++) {
276 if (grad.
WC == 0.0 || grad.
EC == 0.0)
279 vx = (grad.
WC + grad.
EC) / 2;
280 if (grad.
NC == 0.0 || grad.
SC == 0.0)
283 vy = (grad.
NC + grad.
SC) / 2;
310 G_debug(3,
"N_calc_gradient_field_3d_stats: compute gradient field stats");
403 int cols, rows, depths;
405 double dx, dy, dz,
p1, p2,
r1,
r2,
mean, grad, res;
412 "N_compute_gradient_field_3d: the arrays are not of equal size");
417 "N_compute_gradient_field_3d: the arrays are not of equal size");
422 "N_compute_gradient_field_3d: the arrays are not of equal size");
426 G_fatal_error(
"N_compute_gradient_field_3d: array sizes and geometry "
427 "data are different");
429 G_debug(3,
"N_compute_gradient_field_3d: compute gradient field");
433 depths =
geom->depths;
444 G_fatal_error(
"N_compute_gradient_field_3d: gradient field sizes "
445 "and geometry data are different");
448 for (k = 0; k < depths; k++)
449 for (
j = 0;
j < rows;
j++)
450 for (i = 0; i < cols - 1; i++) {
459 grad = (
p1 - p2) / dx;
471 "N_compute_gradient_field_3d: X-direction insert value "
472 "%6.5g at %i %i %i ",
478 for (k = 0; k < depths; k++)
479 for (
j = 0;
j < rows - 1;
j++)
480 for (i = 0; i < cols; i++) {
489 grad = (
p1 - p2) / dy;
498 res = -1 *
mean * grad;
503 "N_compute_gradient_field_3d: Y-direction insert value "
504 "%6.5g at %i %i %i ",
510 for (k = 0; k < depths - 1; k++)
511 for (
j = 0;
j < rows;
j++)
512 for (i = 0; i < cols; i++) {
521 grad = (
p1 - p2) / dz;
533 "N_compute_gradient_field_3d: Z-direction insert value "
534 "%6.5g at %i %i %i ",
599 int rows, cols, depths;
612 G_fatal_error(
"N_compute_gradient_components_3d: x array is empty");
614 G_fatal_error(
"N_compute_gradient_components_3d: y array is empty");
616 G_fatal_error(
"N_compute_gradient_components_3d: z array is empty");
623 if (
x->cols != cols ||
x->rows != rows ||
x->depths != depths)
624 G_fatal_error(
"N_compute_gradient_components_3d: the size of the x "
625 "array doesn't fit the gradient field size");
627 G_fatal_error(
"N_compute_gradient_components_3d: the size of the y "
628 "array doesn't fit the gradient field size");
630 G_fatal_error(
"N_compute_gradient_components_3d: the size of the z "
631 "array doesn't fit the gradient field size");
633 for (k = 0; k < depths; k++)
634 for (
j = 0;
j < rows;
j++)
635 for (i = 0; i < cols; i++) {
638 if (grad.
WC == 0.0 || grad.
EC == 0.0)
641 vx = (grad.
WC + grad.
EC) / 2;
642 if (grad.
NC == 0.0 || grad.
SC == 0.0)
645 vy = (grad.
NC + grad.
SC) / 2;
646 if (grad.
TC == 0.0 || grad.
BC == 0.0)
649 vz = (grad.
TC + grad.
BC) / 2;
double N_calc_harmonic_mean(double a, double b)
Calculate the harmonical mean of values a and b.
void void void void G_fatal_error(const char *,...) __attribute__((format(printf
int G_debug(int, const char *,...) __attribute__((format(printf
float mean(IClass_statistics *statistics, int band)
Helper function for computing mean.
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.
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,...
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.
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.
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.
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.
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.
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.
N_gradient_field_2d * N_alloc_gradient_field_2d(int cols, int rows)
Allocate a N_gradient_field_2d.
N_gradient_field_3d * N_alloc_gradient_field_3d(int cols, int rows, int depths)
Allocate a N_gradient_field_3d.
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].
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...
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),...
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 ...
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_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_calc_gradient_field_3d_stats(N_gradient_field_3d *field)
Calculate basic statistics of a gradient field.
Geometric information about the structured grid.
Gradient between the cells in X and Y direction.
Gradient between the cells in X, Y and Z direction.