18 #include <grass/N_gwflow.h>
268 double hc_e = 0, hc_w = 0, hc_n = 0, hc_s = 0, hc_t = 0, hc_b = 0;
269 double dx, dy, dz, Ax, Ay, Az;
270 double hc_x, hc_y, hc_z;
271 double hc_xw, hc_yn, hc_zt;
272 double hc_xe, hc_ys, hc_zb;
275 double C,
W, E,
N, S, T, B, V;
286 Ay = geom->
dx * geom->
dz;
287 Ax = geom->
dz * geom->
dy;
318 W = -1 * Ax * hc_w / dx;
320 E = -1 * Ax * hc_e / dx;
322 N = -1 * Ay * hc_n / dy;
324 S = -1 * Ay * hc_s / dy;
326 T = -1 * Az * hc_t / dz;
328 B = -1 * Az * hc_b / dz;
334 C = -1 * (
W + E +
N + S + T + B - Ss / data->
dt * Az);
337 V = (q + hc_start * Ss / data->
dt * Az);
340 if (depth == geom->
depths - 2) {
345 G_debug(5,
"N_callback_gwflow_3d: called [%i][%i][%i]", depth, col, row);
386 for (z = 0; z < depths; z++) {
387 for (y = 0; y < rows; y++) {
389 for (
x = 0;
x < cols;
x++) {
405 val += dstar->
E * (hc - h);
410 val += dstar->
W * (hc - h);
415 val += dstar->
S * (hc - h);
420 val += dstar->
N * (hc - h);
425 val += dstar->
T * (hc - h);
430 val += dstar->
B * (hc - h);
444 if (fabs(sum) < 0.0000000001)
445 G_message(
_(
"The total sum of the water budget: %g\n"), sum);
447 G_warning(
_(
"The total sum of the water budget is significantly larger "
477 double T_e = 0, T_w = 0, T_n = 0, T_s = 0;
478 double z_e = 0, z_w = 0, z_n = 0, z_s = 0;
488 double C,
W, E,
N, S, V;
491 double river_vect = 0;
492 double river_mat = 0;
493 double drain_vect = 0;
494 double drain_mat = 0;
545 if (z_w > 0 || z_w < 0 || z_w == 0)
549 if (z_e > 0 || z_e < 0 || z_e == 0)
553 if (z_n > 0 || z_n < 0 || z_n == 0)
557 if (z_s > 0 || z_s < 0 || z_s == 0)
615 W = -1 * T_w * dy / dx;
617 E = -1 * T_e * dy / dx;
619 N = -1 * T_n * dx / dy;
621 S = -1 * T_s * dx / dy;
625 (
W + E +
N + S - Az * Ss / data->
dt - river_mat * Az - drain_mat * Az);
628 V = (q + hc_start * Az * Ss / data->
dt) +
r + river_vect * Az +
631 G_debug(5,
"N_callback_gwflow_2d: called [%i][%i]", row, col);
671 for (y = 0; y < rows; y++) {
673 for (
x = 0;
x < cols;
x++) {
689 val += dstar->
E * (hc - h);
694 val += dstar->
W * (hc - h);
699 val += dstar->
S * (hc - h);
704 val += dstar->
N * (hc - h);
718 if (fabs(sum) < 0.0000000001)
719 G_message(
_(
"The total sum of the water budget: %g\n"), sum);
721 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...