basin.hpp 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. #ifndef BASIN_HPP
  2. #define BASIN_HPP
  3. #include <string>
  4. #include "physics.hpp"
  5. #include "debug.hpp"
  6. using namespace std;
  7. enum Direction{None,Left,Right,Both};
  8. enum BasinPosition{Middle,BorderLeft,BorderRight,BorderBoth};
  9. struct Summit{
  10. size_t ix;
  11. double h;
  12. bool operator<(const Summit& S) const;
  13. Summit(size_t ix,double h);
  14. };
  15. class Basin{
  16. public:
  17. static constexpr double delta_both_leak=0.01;
  18. bool overflow;
  19. size_t xleft,xright;
  20. size_t xmax_left,xmax_right;
  21. size_t xacc;
  22. Direction leak_direction;
  23. BasinPosition position;
  24. double hmin,hleft,hright,hmax;
  25. Basin* left;
  26. Basin* right;
  27. double vmin;
  28. double vflow;
  29. double vmax;
  30. double vleak;
  31. void compute_leak_direction();
  32. void compute_maxs(double* hsoil);
  33. void compute_vflow(double* hsoil,double* hov);
  34. void repartition(double* hsoil,double* hov,Direction* rundir);
  35. void runoff(size_t xstart,Direction dir,Direction* rundir,double* hsoil,double* hov);
  36. double f(double r,double* hsoil,double* hov,double vext);
  37. double df(double r,double* hsoil,double* hov,double vext);
  38. public:
  39. Basin();
  40. Basin(Basin* left,Basin* right);
  41. void display(string indent="");
  42. bool is_primitive();
  43. void flatten(double* hsoil,double* hov);
  44. };
  45. inline
  46. Summit::Summit(size_t ix_,double h_):ix(ix_),h(h_){
  47. }
  48. inline bool
  49. Summit::operator<(const Summit& S) const{
  50. return h<S.h;
  51. }
  52. inline Basin::Basin(){
  53. left=nullptr;
  54. right=nullptr;
  55. position=Middle;
  56. }
  57. inline bool
  58. Basin::is_primitive(){
  59. return left==nullptr;
  60. }
  61. #endif