#include "geometry.hpp" #include "physics.hpp" double inf = numeric_limits::infinity(); Geometry::Geometry(){ lX=0; nX=0; dX=0; hsoil=nullptr; dhsoil=nullptr; hbot=nullptr; dhbot=nullptr; nZ=nullptr; dZ=nullptr; Z=nullptr; } Geometry::~Geometry(){ if(hsoil!=nullptr){ delete[] hsoil; delete[] dhsoil; delete[] hbot; delete[] dhbot; delete[] dZ; delete[] nZ; for(size_t i=0;i::iterator,list::iterator> Geometry::find_basins(const Summit& s,list& basins){ list::iterator it_left; list::iterator it_right; for(list::iterator it=basins.begin();it!=basins.end();++it){ Basin* b=*it; if(b->xleft==s.ix){ it_right=it; } if(b->xright==s.ix){ it_left=it; } } return pair::iterator,list::iterator>(it_left,it_right); } void Geometry::compute_basins(){ //Find local min point of hsoil vector v_min; if(hsoil[0]h and hhsoil[nX-1]) v_min.push_back(nX-1); size_t nb=v_min.size(); //Primitive Basins vector summits; list basins_to_merge; for(size_t ib=0;ibxacc=xb; if(xb==0){ b->xleft=xb; b->position=BorderLeft; } else{ size_t ix=xb; while(ix>0 and hsoil[ix-1]>hsoil[ix]) --ix; b->xleft=ix; if(ix==0) b->position=BorderLeft; if(ix>0) summits.emplace_back(ix,hsoil[ix]); } //Find right bound if(xb==nX-1){ b->xright=xb; b->position=BorderRight; } else{ size_t ix=xb; while(ixhsoil[ix]) ++ix; if(ix==nX-1)b->position=BorderRight; b->xright=ix; } b->hleft=hsoil[b->xleft]+Physics::minimal_height_to_runoff; b->hright=hsoil[b->xright]+Physics::minimal_height_to_runoff; b->compute_leak_direction(); b->compute_maxs(hsoil); // Set hmin b->hmin=hsoil[xb]+Physics::minimal_height_to_runoff; basins_to_merge.push_back(b); } //Determine meta basins if(summits.empty()){ root_basin=new Basin; root_basin->position=BorderBoth; root_basin->left=nullptr; root_basin->right=nullptr; root_basin->xacc=0; root_basin->leak_direction=None; root_basin->xleft=0; root_basin->xright=nX-1; double h=hsoil[0]; root_basin->hleft=h; root_basin->hright=h; root_basin->hmin=h; } else{ sort(summits.begin(),summits.end()); for(auto it=summits.begin();it!=summits.end();++it){ Summit& s=*it; auto res=find_basins(s,basins_to_merge); list::iterator it_left=res.first; list::iterator it_right=res.second; Basin* b_left=*it_left; Basin* b_right=*it_right; basins_to_merge.erase(it_left); basins_to_merge.erase(it_right); Basin* b=new Basin(b_left,b_right); b->compute_maxs(hsoil); basins_to_merge.push_back(b); } root_basin=basins_to_merge.front(); root_basin->display(); } // Compute Runoff directions runoff_directions=new Direction[nX]; for(size_t ix=1;ix0)?Left:Right; } for(size_t ib=0;ib