//--------------------------------------------------------- void CFlow_by_Slope::Set_Area(int x, int y) { double Decay; if( Get_Decay(x, y, Decay) ) { int i, ix, iy; double z, dzSum, dz[8]; for(i=0, dzSum=0.0, z=m_pDEM->asDouble(x, y); i<8; i++) { if( m_pDEM->is_InGrid(ix = Get_xTo(i, x), iy = Get_yTo(i, y)) && (dz[i] = z - m_pDEM->asDouble(ix, iy)) > 0.0 ) { dzSum += (dz[i] = pow(dz[i] / Get_Length(i), 1.1)); } else { dz[i] = 0.0; } } if( dzSum > 0.0 ) { Decay *= m_pFlow->asDouble(x, y) / dzSum; for(i=0; i<8; i++) { if( dz[i] > 0.0 ) { m_pFlow->Add_Value(Get_xTo(i, x), Get_yTo(i, y), Decay * dz[i]); } } } } }
//--------------------------------------------------------- void CFlow_Parallel::BRM_GetOrtho(int Dir, int x, int y, int ix[3], int iy[3], double nnei[6], int nexp[6]) { int jx, jy, i, i0 = (Dir + 2) % 8, i4 = (Dir + 6) % 8; double Slope, Aspect; for(i=0; i<3; i++) { jx = ix[i]; jy = iy[i]; Get_Gradient(jx, jy, Slope, Aspect); nnei[i] = M_RAD_TO_DEG * Slope; nexp[i] = (int)(M_RAD_TO_DEG * Aspect); } jx = Get_xTo(i0,x); jy = Get_yTo(i0,y); Get_Gradient(jx, jy, Slope, Aspect); nnei[3] = M_RAD_TO_DEG * Slope; nexp[3] = (int)(M_RAD_TO_DEG * Aspect); jx = Get_xTo(i4,x); jy = Get_yTo(i4,y); Get_Gradient(jx, jy, Slope, Aspect); nnei[5] = M_RAD_TO_DEG * Slope; nexp[5] = (int)(M_RAD_TO_DEG * Aspect); Get_Gradient(x, y, Slope, Aspect); nnei[4] = M_RAD_TO_DEG * Slope; nexp[4] = (int)(M_RAD_TO_DEG * Aspect); //[jy][jx]) ????!!!!...; for(i=0; i<6; i++) if(nexp[i]<0) nexp[i] = nexp[4]; for(i=0; i<6; i++) { nexp[i] += BRM_idreh[Dir]; if(nexp[i]>360) nexp[i] -= 360; } }
//--------------------------------------------------------- void CFlow_Parallel::Set_MFD(int x, int y) { int i, ix, iy; double z, d, dzSum, dz[8]; //----------------------------------------------------- for(i=0, dzSum=0.0, z=m_pDTM->asDouble(x, y); i<8; i++) { ix = Get_xTo(i, x); iy = Get_yTo(i, y); if( m_pDTM->is_InGrid(ix, iy) ) { d = z - m_pDTM->asDouble(ix, iy); } else { ix = Get_xTo(i + 4, x); iy = Get_yTo(i + 4, y); if( m_pDTM->is_InGrid(ix, iy) ) { d = m_pDTM->asDouble(ix, iy) - z; } else { d = 0.0; } } if( d > 0.0 ) { dzSum += (dz[i] = pow(d / Get_Length(i), m_Converge)); } else { dz[i] = 0.0; } } //----------------------------------------------------- if( dzSum > 0.0 ) { for(i=0; i<8; i++) { if( dz[i] > 0.0 ) { Add_Fraction(x, y, i, dz[i] / dzSum); } } } }
//--------------------------------------------------------- void CChannelNetwork_Distance::Initialize_MFD(int x, int y) { const double MFD_Convergence = 1.1; double Flow[8], dz, zSum = 0.0, z = m_pDEM->asDouble(x, y); if( m_pRoute ) { for(int i=0, ix, iy; i<8; i++) { if( m_pDEM->is_InGrid(ix=Get_xTo(i, x), iy=Get_yTo(i, y)) && !m_pRoute->is_NoData(ix, iy) && (dz = z - m_pDEM->asDouble(ix, iy)) > 0.0 ) { zSum += (Flow[i] = pow(dz / Get_Length(i), MFD_Convergence)); } else { Flow[i] = 0.0; } } } if( zSum == 0.0 ) { for(int i=0, ix, iy; i<8; i++) { if( m_pDEM->is_InGrid(ix=Get_xTo(i, x), iy=Get_yTo(i, y)) && (dz = z - m_pDEM->asDouble(ix, iy)) > 0.0 ) { zSum += (Flow[i] = pow(dz / Get_Length(i), MFD_Convergence)); } else { Flow[i] = 0.0; } } } if( zSum > 0.0 ) { m_Flow[8].Set_Value(x, y, zSum); for(int i=0; i<8; i++) { if( Flow[i] > 0.0 ) { m_Flow[i].Set_Value(x, y, Flow[i] / zSum); } } } }
//--------------------------------------------------------- // Calculation according to Milledge et al. 2012 //--------------------------------------------------------- bool CDiffuse_Pollution_Risk::Get_Risk_Diffuse(void) { Process_Set_Text(_TL("Difuse Pollution Risk")); m_pRisk_Diffuse->Assign(0.0); //----------------------------------------------------- for(sLong n=0; n<Get_NCells() && Set_Progress_NCells(n); n++) { int x, y; if( !m_pDEM->Get_Sorted(n, x, y, true) || m_pDelivery->is_NoData(x, y) || m_pRisk_Point->is_NoData(x, y) || m_RainAcc.asDouble(x, y) <= 0.0 ) { m_pRisk_Diffuse->Set_NoData(x, y); } else { double d[8], Risk; m_pRisk_Point->Mul_Value(x, y, m_pDelivery->asDouble(x, y)); // locational risk = generation risk * connection risk Risk = m_pRisk_Diffuse->asDouble(x, y) + m_pRisk_Point->asDouble(x, y); // risk load = sum of upslope locational risk m_pRisk_Diffuse->Set_Value(x, y, Risk / m_RainAcc.asDouble(x, y)); // risk concentration = risk load / sum of upslope rain if( m_bSingle ) { int i = !m_FlowDir.is_NoData(x, y) ? m_FlowDir.asInt(x, y) : -1; if( i > 0 && m_pDEM->is_InGrid(Get_xTo(i, x), Get_yTo(i, y)) ) { m_pRisk_Diffuse->Add_Value(Get_xTo(i, x), Get_yTo(i, y), Risk); } } else if( Get_Flow_Proportions(x, y, d) ) { for(int i=0; i<8; i++) { if( d[i] > 0.0 ) { m_pRisk_Diffuse->Add_Value(Get_xTo(i, x), Get_yTo(i, y), Risk * d[i]); } } } } } //----------------------------------------------------- return( true ); }
//--------------------------------------------------------- bool CDiffuse_Pollution_Risk::Set_Flow(int x, int y, double Rain) { //----------------------------------------------------- if( m_pDEM->is_NoData(x, y) ) { return( false ); } double d[8]; m_FlowDir.Set_Value(x, y, m_pDEM->Get_Gradient_NeighborDir(x, y)); m_RainAcc.Set_Value(x, y, Rain = Rain * Get_Cellarea() + m_RainAcc.asDouble(x, y)); //----------------------------------------------------- if( m_bSingle ) { if( Get_System()->Get_Neighbor_Pos(m_FlowDir.asInt(x, y), x, y, x, y) && m_pDEM->is_InGrid(x, y) ) { m_RainAcc.Add_Value(x, y, Rain); } } else if( Get_Flow_Proportions(x, y, d) ) { for(int i=0; i<8; i++) { if( d[i] > 0.0 ) { m_RainAcc.Add_Value(Get_xTo(i, x), Get_yTo(i, y), Rain * d[i]); } } } //----------------------------------------------------- return( true ); }
//--------------------------------------------------------- void CChannelNetwork::Set_Route_Standard(int x, int y) { int i, ix, iy, iMin; double z, dz, dzMin; z = pDTM->asDouble(x,y); iMin = 0; for(i=1; i<=8; i++) { ix = Get_xTo(i,x); iy = Get_yTo(i,y); if( !pDTM->is_InGrid(ix,iy) ) { iMin = i; break; } else { dz = (z - pDTM->asDouble(ix,iy)) / Get_Length(i); if( iMin <= 0 || dzMin < dz ) { iMin = i; dzMin = dz; } } } pChannels->Set_Value(x,y, iMin ); }
//--------------------------------------------------------- void CPit_Eliminator::Dig_Channel(int x, int y) { bool bContinue; int goDir; double z; z = pDTM->asDouble(x, y); bContinue = true; do { z -= M_ALMOST_ZERO; goDir = goRoute->asChar(x, y); if( goDir < 0 ) { bContinue = false; } else { x = Get_xTo(goDir, x); y = Get_yTo(goDir, y); if( !is_InGrid(x, y) || z > pDTM->asDouble(x, y) ) { bContinue = false; } else { pDTM->Set_Value(x, y, z); } } } while( bContinue ); }
//--------------------------------------------------------- void CHillslope_Evolution_FTCS::Set_Diffusion(double dFactor) { int iStep = Parameters("NEIGHBOURS")->asInt() == 1 ? 1 : 2; m_pDEM_Old->Assign(m_pDEM); #pragma omp parallel for for(int y=0; y<Get_NY(); y++) { for(int x=0; x<Get_NX(); x++) { if( !m_pDEM_Old->is_NoData(x, y) ) { double z = m_pDEM_Old->asDouble(x, y); double dz = 0.0; for(int i=0; i<8; i+=iStep) { int ix = Get_xTo(i, x); int iy = Get_yTo(i, y); if( m_pDEM_Old->is_InGrid(ix, iy) ) { dz += (m_pDEM_Old->asDouble(ix, iy) - z) / Get_UnitLength(i); } } m_pDEM->Add_Value(x, y, dFactor * dz); } } } }
//--------------------------------------------------------- void CFlow_RecursiveUp::Get_Flow(int x, int y) { int i, ix, iy, j; double jFlow; if( !is_Locked(x,y) ) { Lock_Set(x,y); Init_Cell(x,y); for(i=0, j=4; i<8; i++, j=(j+1)%8) { ix = Get_xTo(i,x); iy = Get_yTo(i,y); if( is_InGrid(ix,iy) ) { jFlow = Flow[iy][ix][j]; if( jFlow > 0 ) { Get_Flow(ix,iy); Add_Fraction(ix,iy,j,jFlow); } } } } }
//--------------------------------------------------------- bool CChannelNetwork_Distance::Set_D8(int x, int y) { int Direction; if( !Get_D8(x, y, Direction) ) { return( false ); } int ix = Get_xTo(Direction, x), iy = Get_yTo(Direction, y); double dz = m_pDEM->asDouble(x, y) - m_pDEM->asDouble(ix, iy); double dx = Get_Length(Direction); m_pDistance->Set_Value(x, y, m_pDistance->asDouble(ix, iy) + sqrt(dz*dz + dx*dx)); m_pDistVert->Set_Value(x, y, m_pDistVert->asDouble(ix, iy) + dz); m_pDistHorz->Set_Value(x, y, m_pDistHorz->asDouble(ix, iy) + dx); if( m_pTime ) { double dt = Get_Travel_Time(x, y, Direction); m_pTime->Set_Value(x, y, m_pTime->asDouble(ix, iy) + dt); } if( m_pFields ) { int Crossed = m_pFields->asDouble(ix, iy) == m_pFields->asDouble(x, y) ? 0 : 1; m_pPasses->Set_Value(x, y, m_pPasses->asInt(ix, iy) + Crossed); } return( true ); }
//--------------------------------------------------------- inline double CChannelNetwork_Distance::Get_Travel_Time(int x, int y, int Direction) { int ix = Get_xTo(Direction, x), iy = Get_yTo(Direction, y); double v, k, R, dz, dx; dz = m_pDEM->is_InGrid(ix, iy) ? m_pDEM->asDouble(x, y) - m_pDEM->asDouble(ix, iy) : 0.1; dx = Get_Length(Direction); // k = m_pFlow_K && !m_pFlow_K->is_NoData(x, y) ? m_pFlow_K->asDouble(x, y) : m_Flow_K; k = !m_pFlow_K || (m_pFlow_K->is_NoData(x, y) && m_pFlow_K->is_NoData(ix, iy)) ? m_Flow_K : m_pFlow_K->is_NoData( x, y) ? m_pFlow_K->asDouble(ix, iy) : m_pFlow_K->is_NoData(ix, iy) ? m_pFlow_K->asDouble( x, y) : (m_pFlow_K->asDouble(x, y) + m_pFlow_K->asDouble(ix, iy)) / 2.0; // R = m_pFlow_R && !m_pFlow_R->is_NoData(x, y) ? m_pFlow_R->asDouble(x, y) : m_Flow_R; R = !m_pFlow_R || (m_pFlow_R->is_NoData(x, y) && m_pFlow_R->is_NoData(ix, iy)) ? m_Flow_R : m_pFlow_R->is_NoData( x, y) ? m_pFlow_R->asDouble(ix, iy) : m_pFlow_R->is_NoData(ix, iy) ? m_pFlow_R->asDouble( x, y) : (m_pFlow_R->asDouble(x, y) + m_pFlow_R->asDouble(ix, iy)) / 2.0; v = k * pow(R, 2.0 / 3.0) * sqrt(dz / dx); // [m / s], simplified Manning equation return( dx / (v * 3600.0) ); // return travel time in hours }
//--------------------------------------------------------- double CErosion_LS_Fields::Get_Flow(int x, int y, double dz[8]) { if( m_Fields.is_NoData(x, y) ) { return( 0.0 ); } double d, z = m_pDEM->asDouble(x, y), dzSum = 0.0; int ID = m_Fields.asInt(x, y); for(int i=0; i<8; i++) { dz[i] = 0.0; int ix = Get_xTo(i, x); int iy = Get_yTo(i, y); if( m_pDEM->is_InGrid(ix, iy) && (d = z - m_pDEM->asDouble(ix, iy)) > 0.0 ) { if( ID == m_Fields.asInt(ix, iy) ) { dzSum += (dz[i] = pow(d / Get_Length(i), 1.1)); } else if( m_bStopAtEdge ) { dzSum += pow(d / Get_Length(i), 1.1); } } } return( dzSum ); }
//--------------------------------------------------------- int CFlow_Parallel::BRM_InitRZ(int x, int y, int ix[3], int iy[3]) { int i, j, Dir; double Slope, Aspect; Get_Gradient(x, y, Slope, Aspect); Aspect *= M_RAD_TO_DEG; if( Aspect < 0 ) { return( -1 ); } //---Kategorisierte-Exposition------------------------- Dir = 0; while( Aspect > BRM_kgexp[Dir] && Dir < 8 ) Dir++; Dir %=8; //---Finde-Die-3-ZielRasterZellen---------------------- for(i=0; i<3; i++) // zxy[]: 0=Recht, 1=Mitte, 2=Links { j = (Dir + 7 + i) % 8; ix[2-i] = Get_xTo(j,x); iy[2-i] = Get_yTo(j,y); } return(Dir); }
//--------------------------------------------------------- void CChannelNetwork::Set_Channel_Mouth(int x, int y) { int Order, goDir, ix, iy; Order = pChannels->asInt(x,y); if( Order > 0 ) { goDir = pChannelRoute->asChar(x,y); if( goDir > 0 ) { ix = Get_xTo(goDir,x); iy = Get_yTo(goDir,y); if( !pDTM->is_InGrid(ix,iy) || (pChannels->asInt(ix,iy) > 0 && Order != pChannels->asInt(ix,iy)) ) { pChannels->Set_Value(x,y, -1 ); } } else { pChannels->Set_Value(x,y, -1 ); } } }
//--------------------------------------------------------- void CChannelNetwork_Distance::Initialize_D8(int x, int y) { int i, iMax, iRoute; double z, dz, dzMax, dzRoute; for(i=0, iMax=-1, dzMax=0.0, iRoute=-1, dzRoute=0.0, z=m_pDEM->asDouble(x, y); i<8; i++) { int ix = Get_xTo(i, x); int iy = Get_yTo(i, y); if( is_InGrid(ix, iy) && (dz = (z - m_pDEM->asDouble(ix, iy)) / Get_Length(i)) > 0.0 ) { if( dz > dzMax ) { iMax = i; dzMax = dz; } if( m_pRoute && !m_pRoute->is_NoData(ix, iy) && dz > dzRoute ) { iRoute = i; dzRoute = dz; } } } m_Dir.Set_Value(x, y, iRoute >= 0 ? iRoute : iMax); }
//--------------------------------------------------------- bool CPit_Eliminator::Dig_Channels(void) { bool bPit; int x, y, i, ix, iy; double z; for(y=0; y<Get_NY() && Set_Progress(y); y++) { for(x=0; x<Get_NX(); x++) { z = pDTM->asDouble(x, y); for(i=0, bPit=true; i<8 && bPit; i++) { ix = Get_xTo(i, x); iy = Get_yTo(i, y); if( !is_InGrid(ix, iy) || z > pDTM->asDouble(ix, iy) ) { bPit = false; } } if( bPit ) { Dig_Channel(x, y); } } } return( is_Progress() ); }
//--------------------------------------------------------- double CExercise_14::Vectorise(int x, int y, CSG_Shape *pSegment) { int Dir, ix, iy; double Length; Length = 0.0; pSegment->Add_Point(Get_XMin() + x * Get_Cellsize(), Get_YMin() + y * Get_Cellsize()); if( (Dir = m_pDir->asInt(x, y)) >= 0 ) { Length = Get_Length(Dir); ix = Get_xTo(Dir, x); iy = Get_yTo(Dir, y); switch( m_pChnl->asInt(ix, iy) ) { case CHANNEL: Length += Vectorise(ix, iy, pSegment); // recursive function call... break; case MOUTH: Length += Get_Length(Dir); pSegment->Add_Point(Get_XMin() + ix * Get_Cellsize(), Get_YMin() + iy * Get_Cellsize()); break; } } return( Length ); }
//--------------------------------------------------------- void CFlow_RecursiveUp::Set_MFD(int x, int y) { int i, ix, iy; double z, d, *dz, dzSum; z = pDTM->asDouble(x,y); dz = Flow[y][x]; dzSum = 0; for(i=0; i<8; i++) { ix = Get_xTo(i,x); iy = Get_yTo(i,y); if( is_InGrid(ix,iy) ) { d = z - pDTM->asDouble(ix,iy); if( d > 0 ) dzSum += dz[i] = pow(d / Get_Length(i), MFD_Converge); } } if( dzSum ) { for(i=0; i<8; i++) if( dz[i] > 0 ) dz[i] /= dzSum; } }
//--------------------------------------------------------- void CFlow_Parallel::Check_Route(int x, int y) { if( m_pRoute->asChar(x, y) <= 0 ) { return; } //----------------------------------------------------- int i, ix, iy; double z = m_pDTM->asDouble(x, y); for(i=0; i<8; i++) { if( !m_pDTM->is_InGrid(ix = Get_xTo(i, x), iy = Get_yTo(i, y)) || z > m_pDTM->asDouble(ix, iy) ) { return; // cell is no sink } } //----------------------------------------------------- i = m_pRoute->asChar(x, y); ix = Get_xTo(i, ix); iy = Get_yTo(i, iy); //--------------------------------------------- while( m_pDTM->is_InGrid(ix, iy) ) { Add_Portion(x, y, ix, iy, i); if( (i = m_pRoute->asChar(ix, iy)) > 0 ) { ix = Get_xTo(i, ix); iy = Get_yTo(i, iy); } else if( (i = m_pDTM->Get_Gradient_NeighborDir(ix, iy)) >= 0 ) { ix = Get_xTo(i, ix); iy = Get_yTo(i, iy); } else { return; } } }
//--------------------------------------------------------- bool CKinWav_D8::Gauges_Initialise(void) { if( m_pGauges_Flow != NULL ) { if( m_pGauges == NULL ) { DataObject_Add(m_pGauges = SG_Create_Shapes(SHAPE_TYPE_Point, _TL("Gauges"))); Parameters("GAUGES")->Set_Value(m_pGauges); m_pGauges->Add_Field(_TL("ID"), SG_DATATYPE_Int); for(int y=0; y<Get_NY() && Set_Progress(y); y++) { for(int x=0; x<Get_NX(); x++) { bool bBorder = false; bool bLowest = true; for(int i=0; i<8; i++) { int ix = Get_xTo(i, x); int iy = Get_yTo(i, y); if( !m_pDEM->is_InGrid(ix, iy) ) { bBorder = true; } else if( m_pDEM->asDouble(ix, iy) < m_pDEM->asDouble(x, y) ) { bLowest = false; } } if( bLowest && bBorder ) { CSG_Shape *pGauge = m_pGauges->Add_Shape(); pGauge->Add_Point(Get_System()->Get_Grid_to_World(x, y)); pGauge->Set_Value(0, m_pGauges->Get_Count() + 1); } } } } m_pGauges_Flow->Destroy(); m_pGauges_Flow->Set_Name(_TL("Outlet Hydrographs")); m_pGauges_Flow->Add_Field("TIME", SG_DATATYPE_Double); for(int i=0; i<m_pGauges->Get_Count(); i++) { m_pGauges_Flow->Add_Field(CSG_String::Format(SG_T("GAUGE_%02d"), i + 1), SG_DATATYPE_Double); } return( true ); } return( false ); }
//--------------------------------------------------------- void CFlow_Distance::Set_Length_MFD(int x, int y) { int i, ix, iy; double z, d, dzSum, dz[8]; if( m_pDTM->is_InGrid(x, y) ) { z = m_pDTM->asDouble(x, y); dzSum = 0.0; for(i=0; i<8; i++) { ix = Get_xTo(i, x); iy = Get_yTo(i, y); if( m_pDTM->is_InGrid(ix, iy) && (d = z - m_pDTM->asDouble(ix, iy)) > 0.0 ) { dz[i] = pow(d / Get_Length(i), m_Converge); dzSum += dz[i]; } else { dz[i] = 0.0; } } if( dzSum > 0.0 ) { d = m_pLength->asDouble(x, y); for(i=0; i<8; i++) { if( dz[i] > 0.0 ) { ix = Get_xTo(i, x); iy = Get_yTo(i, y); dz[i] /= dzSum; m_pLength->Add_Value(ix, iy, dz[i] * (d + Get_Length(i))); m_pWeight->Add_Value(ix, iy, dz[i]); } } } } }
//--------------------------------------------------------- bool CChannelNetwork_Distance::Get_MFD(int x, int y, CSG_Vector &Flow) { const double MFD_Convergence = 1.1; double dz, Sum = 0.0, z = m_pDEM->asDouble(x, y); if( m_pRoute ) { for(int i=0; i<8; i++) { int ix = Get_xTo(i, x), iy = Get_yTo(i, y); if( m_pDEM->is_InGrid(ix, iy) && !m_pRoute->is_NoData(ix, iy) && (dz = z - m_pDEM->asDouble(ix, iy)) > 0.0 ) { Sum += (Flow[i] = pow(dz / Get_Length(i), MFD_Convergence)); } } if( Sum > 0.0 ) { Flow *= 1. / Sum; return( true ); } } for(int i=0; i<8; i++) { int ix = Get_xTo(i, x), iy = Get_yTo(i, y); if( m_pDEM->is_InGrid(ix, iy) && !m_pDistance->is_NoData(ix, iy) && (dz = z - m_pDEM->asDouble(ix, iy)) > 0.0 ) { Sum += (Flow[i] = pow(dz / Get_Length(i), MFD_Convergence)); } } if( Sum > 0.0 ) { Flow *= 1. / Sum; return( true ); } return( false ); }
//--------------------------------------------------------- void CChannelNetwork_Distance::Execute_MFD(int x, int y) { double df = m_Flow[8].asDouble(x, y); if( df > 0.0 ) { if( m_pDistance ) m_pDistance->Mul_Value(x, y, 1.0 / df); if( m_pDistVert ) m_pDistVert->Mul_Value(x, y, 1.0 / df); if( m_pDistHorz ) m_pDistHorz->Mul_Value(x, y, 1.0 / df); if( m_pTime ) m_pTime ->Mul_Value(x, y, 1.0 / df); if( m_pSDR ) m_pSDR ->Mul_Value(x, y, 1.0 / df); } double sz = m_pDistVert->asDouble(x, y); double sx = m_pDistHorz->asDouble(x, y); double sd = m_pDistance->asDouble(x, y); for(int i=0; i<8; i++) { int ix = Get_xTo(i, x); int iy = Get_yTo(i, y); if( m_pDEM->is_InGrid(ix, iy) && (df = m_Flow[(i + 4) % 8].asDouble(ix, iy)) > 0.0 ) { double dz = m_pDEM->asDouble(ix, iy) - m_pDEM->asDouble(x, y); double dx = Get_Length(i); double dt = m_pTime || m_pSDR ? Get_Travel_Time(x, y, i) : 1.0; if( m_pDistance->is_NoData(ix, iy) ) { m_Flow[8].Set_Value(ix, iy, df); if( m_pDistVert ) m_pDistVert->Set_Value(ix, iy, df * (sz + dz)); if( m_pDistHorz ) m_pDistHorz->Set_Value(ix, iy, df * (sx + dx)); if( m_pDistance ) m_pDistance->Set_Value(ix, iy, df * (sd + sqrt(dz*dz + dx*dx))); if( m_pTime ) m_pTime ->Set_Value(ix, iy, df * (m_pTime->asDouble(x, y) + dt)); if( m_pSDR ) m_pSDR ->Set_Value(ix, iy, df * (m_pSDR ->asDouble(x, y) + dt)); } else { m_Flow[8].Add_Value(ix, iy, df); if( m_pDistVert ) m_pDistVert->Add_Value(ix, iy, df * (sz + dz)); if( m_pDistHorz ) m_pDistHorz->Add_Value(ix, iy, df * (sx + dx)); if( m_pDistance ) m_pDistance->Add_Value(ix, iy, df * (sd + sqrt(dz*dz + dx*dx))); if( m_pTime ) m_pTime ->Add_Value(ix, iy, df * (m_pTime->asDouble(x, y) + dt)); if( m_pSDR ) m_pSDR ->Add_Value(ix, iy, df * (m_pSDR ->asDouble(x, y) + dt)); } } } if( m_pSDR ) { m_pSDR->Set_Value(x, y, exp(-m_Flow_B * m_pSDR->asDouble(x, y))); } }
//--------------------------------------------------------- void CCellBalance::Set_MFD(int x, int y, double Weight) { const double MFD_Converge = 1.1; int i, ix, iy; double z, d, dzSum, dz[8]; z = m_pDEM->asDouble(x, y); dzSum = 0.0; for(i=0; i<8; i++) { ix = Get_xTo(i, x); iy = Get_yTo(i, y); if( m_pDEM->is_InGrid(ix, iy) && (d = z - m_pDEM->asDouble(ix, iy)) > 0.0 ) { dz[i] = pow(d / Get_Length(i), MFD_Converge); dzSum += dz[i]; } else { dz[i] = 0.0; } } if( dzSum > 0.0 ) { d = Weight / dzSum; for(i=0; i<8; i++) { if( dz[i] > 0.0 ) { ix = Get_xTo(i, x); iy = Get_yTo(i, y); m_pBalance->Add_Value(ix, iy, dz[i] * d); } } } }
//--------------------------------------------------------- inline double CChannelNetwork_Distance::Get_Travel_Time(int x, int y, int i) { double dz = m_pDEM->asDouble(Get_xTo(i, x), Get_yTo(i, y)) - m_pDEM->asDouble(x, y); double dx = Get_Length(i); double k = m_pFlow_K && !m_pFlow_K->is_NoData(x, y) ? m_pFlow_K->asDouble(x, y) : m_Flow_K; double R = m_pFlow_R && !m_pFlow_R->is_NoData(x, y) ? m_pFlow_R->asDouble(x, y) : m_Flow_R; double v = k * pow(R, 2.0 / 3.0) * sqrt(dz / dx); // [m / s], simplified Manning equation return( dx / (v * 3600.0) ); // return travel time in hours }
//--------------------------------------------------------- void CChannelNetwork::Set_Channel_Order(int x, int y) { int i, ix, iy, j, n; //----------------------------------------------------- if( pChannelRoute->asChar(x,y) > 0 ) { for(i=n=0, j=4; i<8; i++, j=(j+1)%8) { ix = Get_xTo(i,x); iy = Get_yTo(i,y); if( pDTM->is_InGrid(ix,iy) && pChannelRoute->asChar(ix,iy) && j == pChannelRoute->asChar(ix,iy) % 8 ) { n++; } } //----------------------------------------------------- if( n == 0 ) { Lock_Create(); do { Lock_Set(x,y); pChannels->Add_Value(x,y, 1 ); i = pChannelRoute->asChar(x,y); if( i > 0 ) { x = Get_xTo(i,x); y = Get_yTo(i,y); } } while( pDTM->is_InGrid(x,y) && i > 0 && !is_Locked(x,y) ); } } }
//--------------------------------------------------------- void CPit_Eliminator::Fill_Check(int x, int y) { bool bOutlet; int i, ix, iy, j; double z; z = pDTM ->asDouble (x, y); i = goRoute ->asChar (x, y); ix = Get_xTo(i, x); iy = Get_yTo(i, y); if( !is_InGrid(ix, iy) || z > pDTM->asDouble(ix, iy) ) { for(i=0, j=4, bOutlet=false; i<8 && !bOutlet; i++, j=(j+1)%8) { ix = Get_xTo(i, x); iy = Get_yTo(i, y); if( is_InGrid(ix, iy) && goRoute->asChar(ix, iy) == j && z > pDTM->asDouble(ix, iy) ) { bOutlet = true; } } if( bOutlet ) { Lock_Create(); Lock_Set(x, y); for(i=0, j=4; i<8; i++, j=(j+1)%8) { ix = Get_xTo(i, x); iy = Get_yTo(i, y); Fill_Sink(ix, iy, j, z); } } } }
//--------------------------------------------------------- bool CKinWav_D8::Initialize(double Roughness) { m_Flow_Last .Create(*Get_System(), SG_DATATYPE_Float); m_Alpha .Create(*Get_System(), SG_DATATYPE_Float); m_Direction .Create(*Get_System(), SG_DATATYPE_Char); m_Direction .Set_NoData_Value(-1); m_pFlow->Assign(0.0); DataObject_Set_Colors(m_pFlow, 100, SG_COLORS_WHITE_BLUE); DataObject_Update(m_pFlow, 0.0, 100.0, SG_UI_DATAOBJECT_SHOW); //----------------------------------------------------- for(int y=0; y<Get_NY() && Set_Progress(y); y++) { for(int x=0; x<Get_NX(); x++) { if( !m_pDEM->is_NoData(x, y) ) { int i, ix, iy, iMax; double z, d, dMax; for(i=0, iMax=-1, dMax=0.0, z=m_pDEM->asDouble(x, y); i<8; i++) { ix = Get_xTo(i, x); iy = Get_yTo(i, y); if( is_InGrid(ix, iy) && (d = (z - m_pDEM->asDouble(ix, iy)) / Get_Length(i)) > dMax ) { dMax = d; iMax = i; } } if( iMax < 0 ) { m_Direction .Set_NoData(x, y); } else { m_Direction .Set_Value(x, y, iMax); m_Alpha .Set_Value(x, y, pow(Roughness / sqrt(dMax), Beta_0)); if( m_Alpha.asDouble(x, y) > 10 ) m_Alpha.Set_Value(x, y, 10); } } } } return( true ); }
//--------------------------------------------------------- bool CChannelNetwork_Distance::Set_MFD(int x, int y) { CSG_Vector Flow(8); if( !Get_MFD(x, y, Flow) ) { return( false ); } double Distance = 0.0, DistVert = 0.0, DistHorz = 0.0, Time = 0.0, SDR = 0.0; double z = m_pDEM->asDouble(x, y); for(int i=0; i<8; i++) { if( Flow[i] > 0.0 ) { int ix = Get_xTo(i, x), iy = Get_yTo(i, y); double dz = z - m_pDEM->asDouble(ix, iy); double dx = Get_Length(i); Distance += Flow[i] * (m_pDistance->asDouble(ix, iy) + sqrt(dz*dz + dx*dx)); DistVert += Flow[i] * (m_pDistVert->asDouble(ix, iy) + dz); DistHorz += Flow[i] * (m_pDistHorz->asDouble(ix, iy) + dx); if( m_pTime ) { double dt = Get_Travel_Time(x, y, i); Time += Flow[i] * (m_pTime->asDouble(ix, iy) + dt); } } } if( Distance > 0.0 ) { m_pDistance->Set_Value(x, y, Distance); m_pDistVert->Set_Value(x, y, DistVert); m_pDistHorz->Set_Value(x, y, DistHorz); if( m_pTime ) { m_pTime->Set_Value(x, y, Time); } } return( true ); }