Skip to content

Commit 4b7de0f

Browse files
Merge branch 'OSGeo:main' into r.random.surface_tests
2 parents fcbe9f9 + a27e3c1 commit 4b7de0f

File tree

8 files changed

+441
-638
lines changed

8 files changed

+441
-638
lines changed

raster/r.sim/r.sim.sediment/main.c

Lines changed: 46 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -321,50 +321,32 @@ int main(int argc, char *argv[])
321321

322322
G_get_set_window(&cellhd);
323323

324+
Geometry geometry = {0};
325+
Settings settings = {0};
326+
Setup setup = {0};
327+
Simulation sim = {0};
328+
settings.hhmax = settings.halpha = settings.hbeta = 0;
329+
settings.ts = false;
330+
324331
WaterParams_init(&wp);
325332

326-
wp.conv = G_database_units_to_meters_factor();
327-
328-
wp.mixx = cellhd.west * wp.conv;
329-
wp.maxx = cellhd.east * wp.conv;
330-
wp.miyy = cellhd.south * wp.conv;
331-
wp.mayy = cellhd.north * wp.conv;
332-
333-
wp.stepx = cellhd.ew_res * wp.conv;
334-
wp.stepy = cellhd.ns_res * wp.conv;
335-
/* wp.step = amin1(wp.stepx,wp.stepy); */
336-
wp.step = (wp.stepx + wp.stepy) / 2.;
337-
wp.mx = cellhd.cols;
338-
wp.my = cellhd.rows;
339-
wp.xmin = 0.;
340-
wp.ymin = 0.;
341-
wp.xp0 = wp.xmin + wp.stepx / 2.;
342-
wp.yp0 = wp.ymin + wp.stepy / 2.;
343-
wp.xmax = wp.xmin + wp.stepx * (float)wp.mx;
344-
wp.ymax = wp.ymin + wp.stepy * (float)wp.my;
345-
wp.hhc = wp.hhmax = 0.;
346-
347-
#if 0
348-
wp.bxmi = 2093113. * wp.conv;
349-
wp.bymi = 731331. * wp.conv;
350-
wp.bxma = 2093461. * wp.conv;
351-
wp.byma = 731529. * wp.conv;
352-
wp.bresx = 2. * wp.conv;
353-
wp.bresy = 2. * wp.conv;
354-
wp.maxwab = 100000;
355-
356-
wp.mx2o = (int)((wp.bxma - wp.bxmi) / wp.bresx);
357-
wp.my2o = (int)((wp.byma - wp.bymi) / wp.bresy);
358-
359-
/* relative small box coordinates: leave 1 grid layer for overlap */
360-
361-
wp.bxmi = wp.bxmi - wp.mixx + wp.stepx;
362-
wp.bymi = wp.bymi - wp.miyy + wp.stepy;
363-
wp.bxma = wp.bxma - wp.mixx - wp.stepx;
364-
wp.byma = wp.byma - wp.miyy - wp.stepy;
365-
wp.mx2 = wp.mx2o - 2 * ((int)(wp.stepx / wp.bresx));
366-
wp.my2 = wp.my2o - 2 * ((int)(wp.stepy / wp.bresy));
367-
#endif
333+
geometry.conv = G_database_units_to_meters_factor();
334+
335+
geometry.mixx = cellhd.west * geometry.conv;
336+
geometry.miyy = cellhd.south * geometry.conv;
337+
338+
geometry.stepx = cellhd.ew_res * geometry.conv;
339+
geometry.stepy = cellhd.ns_res * geometry.conv;
340+
/* geometry.step = amin1(geometry.stepx,geometry.stepy); */
341+
geometry.step = (geometry.stepx + geometry.stepy) / 2.;
342+
geometry.mx = cellhd.cols;
343+
geometry.my = cellhd.rows;
344+
geometry.xmin = 0.;
345+
geometry.ymin = 0.;
346+
geometry.xp0 = geometry.xmin + geometry.stepx / 2.;
347+
geometry.yp0 = geometry.ymin + geometry.stepy / 2.;
348+
geometry.xmax = geometry.xmin + geometry.stepx * (float)geometry.mx;
349+
geometry.ymax = geometry.ymin + geometry.stepy * (float)geometry.my;
368350

369351
wp.elevin = parm.elevin->answer;
370352
wp.wdepth = parm.wdepth->answer;
@@ -400,35 +382,35 @@ int main(int argc, char *argv[])
400382
G_message(_("Number of threads: %d"), threads);
401383

402384
/* sscanf(parm.nwalk->answer, "%d", &wp.maxwa); */
403-
sscanf(parm.niter->answer, "%d", &wp.timesec);
404-
sscanf(parm.mintimestep->answer, "%lf", &wp.mintimestep);
405-
sscanf(parm.outiter->answer, "%d", &wp.iterout);
385+
sscanf(parm.niter->answer, "%d", &settings.timesec);
386+
sscanf(parm.outiter->answer, "%d", &settings.iterout);
387+
sscanf(parm.mintimestep->answer, "%lf", &settings.mintimestep);
406388
/* sscanf(parm.density->answer, "%d", &wp.ldemo); */
407-
sscanf(parm.diffc->answer, "%lf", &wp.frac);
389+
sscanf(parm.diffc->answer, "%lf", &settings.frac);
408390
sscanf(parm.maninval->answer, "%lf", &wp.manin_val);
409391

410392
/* Recompute timesec from user input in minutes
411393
* to real timesec in seconds */
412-
wp.timesec = wp.timesec * 60;
413-
wp.iterout = wp.iterout * 60;
414-
if ((wp.timesec / wp.iterout) > 100)
394+
settings.timesec = settings.timesec * 60;
395+
settings.iterout = settings.iterout * 60;
396+
if ((settings.timesec / settings.iterout) > 100)
415397
G_message(_("More than 100 files are going to be created !!!!!"));
416398

417399
/* compute how big the raster is and set this to appr 2 walkers per cell */
418400
if (parm.nwalk->answer == NULL) {
419-
wp.maxwa = wp.mx * wp.my * 2;
420-
wp.rwalk = (double)(wp.mx * wp.my * 2.);
421-
G_message(_("default nwalk=%d, rwalk=%f"), wp.maxwa, wp.rwalk);
401+
sim.maxwa = geometry.mx * geometry.my * 2;
402+
sim.rwalk = (double)(geometry.mx * geometry.my * 2.);
403+
G_message(_("default nwalk=%d, rwalk=%f"), sim.maxwa, sim.rwalk);
422404
}
423405
else {
424-
sscanf(parm.nwalk->answer, "%d", &wp.maxwa);
425-
wp.rwalk = (double)wp.maxwa;
406+
sscanf(parm.nwalk->answer, "%d", &sim.maxwa);
407+
sim.rwalk = (double)sim.maxwa;
426408
}
427409
/*rwalk = (double) maxwa; */
428410

429-
if (wp.conv != 1.0)
430-
G_message(_("Using metric conversion factor %f, step=%f"), wp.conv,
431-
wp.step);
411+
if (geometry.conv != 1.0)
412+
G_message(_("Using metric conversion factor %f, step=%f"),
413+
geometry.conv, geometry.step);
432414

433415
wp.observation = parm.observation->answer;
434416
wp.logfile = parm.logfile->answer;
@@ -437,24 +419,24 @@ int main(int argc, char *argv[])
437419
if ((wp.tc == NULL) && (wp.et == NULL) && (wp.conc == NULL) &&
438420
(wp.flux == NULL) && (wp.erdep == NULL))
439421
G_warning(_("You are not outputting any raster or site files"));
440-
ret_val = input_data();
422+
ret_val = input_data(geometry.my, geometry.mx, &sim);
441423
if (ret_val != 1)
442424
G_fatal_error(_("Input failed"));
443425

444-
alloc_grids_sediment();
426+
alloc_grids_sediment(&geometry);
445427

446-
grad_check();
447-
init_grids_sediment();
428+
grad_check(&setup, &geometry, &settings);
429+
init_grids_sediment(&setup, &geometry);
448430
/* treba dat output pre topoerdep */
449-
main_loop();
431+
main_loop(&setup, &geometry, &settings, &sim);
450432

451433
/* always true for sediment? */
452434
if (wp.tserie == NULL) {
453-
ii = output_data(0, 1.);
435+
ii = output_data(0, 1., &setup, &geometry, &settings, &sim);
454436
if (ii != 1)
455437
G_fatal_error(_("Cannot write raster maps"));
456438
}
457-
free_walkers();
439+
free_walkers(&sim);
458440

459441
/* Exit with Success */
460442
exit(EXIT_SUCCESS);

raster/r.sim/r.sim.water/main.c

Lines changed: 45 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -355,35 +355,38 @@ int main(int argc, char *argv[])
355355

356356
G_get_set_window(&cellhd);
357357

358+
Geometry geometry = {0};
359+
Settings settings = {0};
360+
Setup setup = {0};
361+
Simulation sim = {0};
362+
358363
WaterParams_init(&wp);
359364

360-
wp.conv = G_database_units_to_meters_factor();
365+
geometry.conv = G_database_units_to_meters_factor();
361366

362-
G_debug(3, "Conversion factor is set to: %f", wp.conv);
367+
G_debug(3, "Conversion factor is set to: %f", geometry.conv);
363368

364-
wp.mixx = wp.conv * cellhd.west;
365-
wp.maxx = wp.conv * cellhd.east;
366-
wp.miyy = wp.conv * cellhd.south;
367-
wp.mayy = wp.conv * cellhd.north;
369+
geometry.mixx = geometry.conv * cellhd.west;
370+
geometry.miyy = geometry.conv * cellhd.south;
368371

369-
wp.stepx = cellhd.ew_res * wp.conv;
370-
wp.stepy = cellhd.ns_res * wp.conv;
372+
geometry.stepx = cellhd.ew_res * geometry.conv;
373+
geometry.stepy = cellhd.ns_res * geometry.conv;
371374
/* step = amin1(stepx,stepy); */
372-
wp.step = (wp.stepx + wp.stepy) / 2.;
373-
wp.mx = cellhd.cols;
374-
wp.my = cellhd.rows;
375+
geometry.step = (geometry.stepx + geometry.stepy) / 2.;
376+
geometry.mx = cellhd.cols;
377+
geometry.my = cellhd.rows;
375378
/* x_orig = cellhd.west * wp.conv;
376379
y_orig = cellhd.south * wp.conv; *//* do we need this? */
377-
wp.xmin = 0.;
378-
wp.ymin = 0.;
379-
wp.xp0 = wp.xmin + wp.stepx / 2.;
380-
wp.yp0 = wp.ymin + wp.stepy / 2.;
381-
wp.xmax = wp.xmin + wp.stepx * (float)wp.mx;
382-
wp.ymax = wp.ymin + wp.stepy * (float)wp.my;
380+
geometry.xmin = 0.;
381+
geometry.ymin = 0.;
382+
geometry.xp0 = geometry.xmin + geometry.stepx / 2.;
383+
geometry.yp0 = geometry.ymin + geometry.stepy / 2.;
384+
geometry.xmax = geometry.xmin + geometry.stepx * (float)geometry.mx;
385+
geometry.ymax = geometry.ymin + geometry.stepy * (float)geometry.my;
383386

384-
G_debug(3, "xmax: %f, ymax: %f", wp.xmax, wp.ymax);
387+
G_debug(3, "xmax: %f, ymax: %f", geometry.xmax, geometry.ymax);
385388

386-
wp.ts = flag.tserie->answer;
389+
settings.ts = flag.tserie->answer;
387390

388391
wp.elevin = parm.elevin->answer;
389392
wp.dxin = parm.dxin->answer;
@@ -399,13 +402,13 @@ int main(int argc, char *argv[])
399402

400403
G_debug(3, "Parsing numeric parameters");
401404

402-
sscanf(parm.niter->answer, "%d", &wp.timesec);
403-
sscanf(parm.mintimestep->answer, "%lf", &wp.mintimestep);
404-
sscanf(parm.outiter->answer, "%d", &wp.iterout);
405-
sscanf(parm.diffc->answer, "%lf", &wp.frac);
406-
sscanf(parm.hmax->answer, "%lf", &wp.hhmax);
407-
sscanf(parm.halpha->answer, "%lf", &wp.halpha);
408-
sscanf(parm.hbeta->answer, "%lf", &wp.hbeta);
405+
sscanf(parm.niter->answer, "%d", &settings.timesec);
406+
sscanf(parm.outiter->answer, "%d", &settings.iterout);
407+
sscanf(parm.mintimestep->answer, "%lf", &settings.mintimestep);
408+
sscanf(parm.diffc->answer, "%lf", &settings.frac);
409+
sscanf(parm.hmax->answer, "%lf", &settings.hhmax);
410+
sscanf(parm.halpha->answer, "%lf", &settings.halpha);
411+
sscanf(parm.hbeta->answer, "%lf", &settings.hbeta);
409412

410413
G_debug(3, "Parsing rain parameters");
411414

@@ -516,43 +519,43 @@ int main(int argc, char *argv[])
516519

517520
/* Recompute timesec from user input in minutes
518521
* to real timesec in seconds */
519-
wp.timesec = wp.timesec * 60.0;
520-
wp.iterout = wp.iterout * 60.0;
521-
if ((wp.timesec / wp.iterout) > 100.0 && wp.ts == 1)
522+
settings.timesec = settings.timesec * 60.0;
523+
settings.iterout = settings.iterout * 60.0;
524+
if ((settings.timesec / settings.iterout) > 100.0 && settings.ts)
522525
G_message(_("More than 100 files are going to be created !!!!!"));
523526

524527
/* compute how big the raster is and set this to appr 2 walkers per cell */
525528
if (parm.nwalk->answer == NULL) {
526-
wp.maxwa = wp.mx * wp.my * 2;
527-
wp.rwalk = (double)(wp.mx * wp.my * 2.);
528-
G_message(_("default nwalk=%d, rwalk=%f"), wp.maxwa, wp.rwalk);
529+
sim.maxwa = geometry.mx * geometry.my * 2;
530+
sim.rwalk = (double)(geometry.mx * geometry.my * 2.);
531+
G_message(_("default nwalk=%d, rwalk=%f"), sim.maxwa, sim.rwalk);
529532
}
530533
else {
531-
sscanf(parm.nwalk->answer, "%d", &wp.maxwa);
532-
wp.rwalk = (double)wp.maxwa;
534+
sscanf(parm.nwalk->answer, "%d", &sim.maxwa);
535+
sim.rwalk = (double)sim.maxwa;
533536
}
534537

535538
/* rwalk = (double) maxwa; */
536539

537-
if (wp.conv != 1.0)
538-
G_message(_("Using metric conversion factor %f, step=%f"), wp.conv,
539-
wp.step);
540+
if (geometry.conv != 1.0)
541+
G_message(_("Using metric conversion factor %f, step=%f"),
542+
geometry.conv, geometry.step);
540543

541544
wp.observation = parm.observation->answer;
542545
wp.logfile = parm.logfile->answer;
543546
init_library_globals(&wp);
544547

545548
if ((wp.depth == NULL) && (wp.disch == NULL) && (wp.err == NULL))
546549
G_warning(_("You are not outputting any raster maps"));
547-
ret_val = input_data();
550+
ret_val = input_data(geometry.my, geometry.mx, &sim);
548551
if (ret_val != 1)
549552
G_fatal_error(_("Input failed"));
550553

551-
alloc_grids_water();
554+
alloc_grids_water(&geometry);
552555

553-
grad_check();
554-
main_loop();
555-
free_walkers();
556+
grad_check(&setup, &geometry, &settings);
557+
main_loop(&setup, &geometry, &settings, &sim);
558+
free_walkers(&sim);
556559

557560
/* Exit with Success */
558561
exit(EXIT_SUCCESS);

raster/r.sim/simlib/erod.c

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,41 +22,46 @@
2222
#include <grass/linkm.h>
2323

2424
#include <grass/waterglobs.h>
25+
#include <grass/simlib.h>
2526

2627
/* divergence computation from a given field */
2728

28-
void erod(double **hw)
29+
void erod(double **hw, const Setup *setup, const Geometry *geometry)
2930
{
3031
/* hw = sigma or gamma */
3132

3233
double dyp, dyn, dya, dxp, dxn, dxa;
3334
int k, l;
3435
int l1, lp, k1, kp, ln, kn, k2, l2;
3536

36-
for (k = 0; k < my; k++) {
37-
for (l = 0; l < mx; l++) {
37+
for (k = 0; k < geometry->my; k++) {
38+
for (l = 0; l < geometry->mx; l++) {
3839
lp = max(0, l - 2);
3940
l1 = lp + 1;
4041
kp = max(0, k - 2);
4142
k1 = kp + 1;
42-
ln = min(mx - 1, l + 1);
43+
ln = min(geometry->mx - 1, l + 1);
4344
l2 = ln - 1;
44-
kn = min(my - 1, k + 1);
45+
kn = min(geometry->my - 1, k + 1);
4546
k2 = kn - 1;
4647

4748
if (zz[k][l] != UNDEF || zz[k][ln] != UNDEF || zz[kp][l] != UNDEF ||
4849
zz[k][lp] != UNDEF || zz[k][l1] != UNDEF ||
4950
zz[k1][l] != UNDEF || zz[kn][l] != UNDEF) { /* jh fix */
5051

51-
dxp = (v1[k][lp] * hw[k][lp] - v1[k][l1] * hw[k][l1]) / stepx;
52-
dxn = (v1[k][l2] * hw[k][l2] - v1[k][ln] * hw[k][ln]) / stepx;
52+
dxp = (v1[k][lp] * hw[k][lp] - v1[k][l1] * hw[k][l1]) /
53+
geometry->stepx;
54+
dxn = (v1[k][l2] * hw[k][l2] - v1[k][ln] * hw[k][ln]) /
55+
geometry->stepx;
5356
dxa = 0.5 * (dxp + dxn);
5457

55-
dyp = (v2[kp][l] * hw[kp][l] - v2[k1][l] * hw[k1][l]) / stepy;
56-
dyn = (v2[k2][l] * hw[k2][l] - v2[kn][l] * hw[kn][l]) / stepy;
58+
dyp = (v2[kp][l] * hw[kp][l] - v2[k1][l] * hw[k1][l]) /
59+
geometry->stepy;
60+
dyn = (v2[k2][l] * hw[k2][l] - v2[kn][l] * hw[kn][l]) /
61+
geometry->stepy;
5762
dya = 0.5 * (dyp + dyn);
5863

59-
er[k][l] = (dxa + dya) / deltap;
64+
er[k][l] = (dxa + dya) / setup->deltap;
6065
}
6166
else
6267
er[k][l] = UNDEF;

0 commit comments

Comments
 (0)