18 #include <grass/N_gwflow.h>
270 double hc_e = 0, hc_w = 0, hc_n = 0, hc_s = 0, hc_t = 0, hc_b = 0;
271 double dx, dy, dz, Ax, Ay, Az;
272 double hc_x, hc_y, hc_z;
273 double hc_xw, hc_yn, hc_zt;
274 double hc_xe, hc_ys, hc_zb;
277 double C,
W, E,
N, S, T, B, V;
288 Ay = geom->
dx * geom->
dz;
289 Ax = geom->
dz * geom->
dy;
320 W = -1 * Ax * hc_w / dx;
322 E = -1 * Ax * hc_e / dx;
324 N = -1 * Ay * hc_n / dy;
326 S = -1 * Ay * hc_s / dy;
328 T = -1 * Az * hc_t / dz;
330 B = -1 * Az * hc_b / dz;
336 C = -1 * (
W + E +
N + S + T + B - Ss / data->
dt * Az);
339 V = (q + hc_start * Ss / data->
dt * Az);
342 if (depth == geom->
depths - 2) {
347 G_debug(5,
"N_callback_gwflow_3d: called [%i][%i][%i]", depth, col, row);
388 for (z = 0; z < depths; z++) {
389 for (y = 0; y < rows; y++) {
391 for (
x = 0;
x < cols;
x++) {
407 val += dstar->
E * (hc - h);
412 val += dstar->
W * (hc - h);
417 val += dstar->
S * (hc - h);
422 val += dstar->
N * (hc - h);
427 val += dstar->
T * (hc - h);
432 val += dstar->
B * (hc - h);
446 if (fabs(sum) < 0.0000000001)
447 G_message(
_(
"The total sum of the water budget: %g\n"), sum);
449 G_warning(
_(
"The total sum of the water budget is significantly larger "
479 double T_e = 0, T_w = 0, T_n = 0, T_s = 0;
480 double z_e = 0, z_w = 0, z_n = 0, z_s = 0;
490 double C,
W, E,
N, S, V;
493 double river_vect = 0;
494 double river_mat = 0;
495 double drain_vect = 0;
496 double drain_mat = 0;
547 if (z_w > 0 || z_w < 0 || z_w == 0)
551 if (z_e > 0 || z_e < 0 || z_e == 0)
555 if (z_n > 0 || z_n < 0 || z_n == 0)
559 if (z_s > 0 || z_s < 0 || z_s == 0)
617 W = -1 * T_w * dy / dx;
619 E = -1 * T_e * dy / dx;
621 N = -1 * T_n * dx / dy;
623 S = -1 * T_s * dx / dy;
627 (
W + E +
N + S - Az * Ss / data->
dt - river_mat * Az - drain_mat * Az);
630 V = (q + hc_start * Az * Ss / data->
dt) +
r + river_vect * Az +
633 G_debug(5,
"N_callback_gwflow_2d: called [%i][%i]", row, col);
673 for (y = 0; y < rows; y++) {
675 for (
x = 0;
x < cols;
x++) {
691 val += dstar->
E * (hc - h);
696 val += dstar->
W * (hc - h);
701 val += dstar->
S * (hc - h);
706 val += dstar->
N * (hc - h);
720 if (fabs(sum) < 0.0000000001)
721 G_message(
_(
"The total sum of the water budget: %g\n"), sum);
723 G_warning(
_(
"The total sum of the water budget is significantly larger "
double N_calc_arith_mean(double a, double b)
Calculate the arithmetic mean of values a and b.
double N_calc_harmonic_mean(double a, double b)
Calculate the harmonical mean of values a and b.
void G_percent(long, long, int)
Print percent complete messages.
void G_free(void *)
Free allocated memory.
void G_warning(const char *,...) __attribute__((format(printf
void G_message(const char *,...) __attribute__((format(printf
int G_debug(int, const char *,...) __attribute__((format(printf
void Rast_set_null_value(void *, int, RASTER_MAP_TYPE)
To set one or more raster values to null.
CELL N_get_array_2d_c_value(N_array_2d *data, int col, int row)
Returns the value of type CELL at position col, row.
void N_free_array_3d(N_array_3d *data)
Release the memory of a N_array_3d.
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.
N_array_3d * N_alloc_array_3d(int cols, int rows, int depths, int offset, int type)
Allocate memory for a N_array_3d data structure.
N_array_2d * N_alloc_array_2d(int cols, int rows, int offset, int type)
Allocate memory for a N_array_2d data structure.
void N_free_array_2d(N_array_2d *data)
Release the memory of a N_array_2d structure.
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.
double N_get_geom_data_area_of_cell(N_geom_data *geom, int row)
Get the areay size in square meter of one cell (x*y) at row.
void N_gwflow_3d_calc_water_budget(N_gwflow_data3d *data, N_geom_data *geom, N_array_3d *budget)
This function computes the water budget of the entire groundwater.
N_data_star * N_callback_gwflow_2d(void *gwdata, N_geom_data *geom, int col, int row)
This callback function creates the mass balance of a 5 point star.
void N_gwflow_2d_calc_water_budget(N_gwflow_data2d *data, N_geom_data *geom, N_array_2d *budget)
This function computes the water budget of the entire groundwater.
N_gwflow_data2d * N_alloc_gwflow_data2d(int cols, int rows, int river, int drain)
Allocate memory for the groundwater calculation data structure in 2 dimensions.
void N_free_gwflow_data3d(N_gwflow_data3d *data)
Release the memory of the groundwater flow data structure in three dimensions.
N_gwflow_data3d * N_alloc_gwflow_data3d(int cols, int rows, int depths, int river, int drain)
Allocate memory for the groundwater calculation data structure in 3 dimensions.
N_data_star * N_callback_gwflow_3d(void *gwdata, N_geom_data *geom, int col, int row, int depth)
This callback function creates the mass balance of a 7 point star.
void N_free_gwflow_data2d(N_gwflow_data2d *data)
Release the memory of the groundwater flow data structure in two dimensions.
N_data_star * N_create_7star(double C, double W, double E, double N, double S, double T, double B, double V)
allocate and initialize a 7 point star data structure
N_data_star * N_create_5star(double C, double W, double E, double N, double S, double V)
allocate and initialize a 5 point star data structure
Matrix entries for a mass balance 5/7/9 star system.
Geometric information about the structured grid.
This data structure contains all data needed to compute the groundwater mass balance in two dimension...
This data structure contains all data needed to compute the groundwater mass balance in three dimensi...