56 strTexture =
"coarse";
59 double dStillToErodeOnPolygon = dErosionTargetOnPolygon;
75 LogStream <<
m_ulIter <<
": " <<
ERR <<
"while eroding unconsolidated " + strTexture +
" sediment on polygon " << pPolygon->
nGetCoastID() <<
", could not find the seaward end point of the up-coast profile (" << nUpCoastProfile <<
") for depth of closure = " <<
m_dDepthOfClosure << endl;
81 int const nUpCoastPartProfileLen = nIndex + 1;
86 vector<CGeom2DIPoint> PtiVUpCoastPartProfileCell;
90 for (
int n = nUpCoastPartProfileLen - 1; n >= 0; n--)
93 PtiVUpCoastPartProfileCell.push_back(Pti);
96 int const nUpCoastProfileCoastPoint = pUpCoastProfile->
nGetCoastPoint();
97 int const nDownCoastProfileCoastPoint = pDownCoastProfile->
nGetCoastPoint();
98 int const nXUpCoastProfileExistingCoastPoint =
m_VCoast[nCoast].pPtiGetCellMarkedAsCoastline(nUpCoastProfileCoastPoint)->nGetX();
99 int const nYUpCoastProfileExistingCoastPoint =
m_VCoast[nCoast].pPtiGetCellMarkedAsCoastline(nUpCoastProfileCoastPoint)->nGetY();
103 vector<int> nVCoastPoint;
105 if (nDownCoastProfileCoastPoint ==
m_VCoast[nCoast].nGetCoastlineSize() - 1)
108 nCoastSegLen = nDownCoastProfileCoastPoint - nUpCoastProfileCoastPoint + 1;
110 for (
int nCoastPoint = nUpCoastProfileCoastPoint; nCoastPoint <= nDownCoastProfileCoastPoint; nCoastPoint++)
111 nVCoastPoint.push_back(nCoastPoint);
117 nCoastSegLen = nDownCoastProfileCoastPoint - nUpCoastProfileCoastPoint;
119 for (
int nCoastPoint = nUpCoastProfileCoastPoint; nCoastPoint < nDownCoastProfileCoastPoint; nCoastPoint++)
120 nVCoastPoint.push_back(nCoastPoint);
124 double const dAllTargetPerProfile = dErosionTargetOnPolygon / nCoastSegLen;
127 shuffle(nVCoastPoint.begin(), nVCoastPoint.begin() + nCoastSegLen,
m_Rand[1]);
130 for (
int n = 0; n < nCoastSegLen; n++)
133 int const nCoastPoint = nVCoastPoint[n];
136 int const nCoastX = PtiCoastPoint.
nGetX();
137 int const nCoastY = PtiCoastPoint.
nGetY();
153 int const nXOffset = nCoastX - PtiVUpCoastPartProfileCell.back().nGetX();
154 int const nYOffset = nCoastY - PtiVUpCoastPartProfileCell.back().nGetY();
157 vector<CGeom2DIPoint> VPtiParProfile;
159 for (
int m = 0; m < nUpCoastPartProfileLen; m++)
162 CGeom2DIPoint const PtiTmp(PtiVUpCoastPartProfileCell[m].nGetX() + nXOffset, PtiVUpCoastPartProfileCell[m].nGetY() + nYOffset);
163 VPtiParProfile.push_back(PtiTmp);
167 int nParProfEndX = VPtiParProfile[0].nGetX();
168 int nParProfEndY = VPtiParProfile[0].nGetY();
177 VPtiParProfile[0].SetX(nParProfEndX);
178 VPtiParProfile[0].SetY(nParProfEndY);
181 bool bHitEdge =
false;
182 bool bEndProfile =
false;
183 bool bZeroGradient =
false;
184 bool bEnoughEroded =
false;
187 int nInlandOffset = -1;
189 double const dParProfCoastElev =
m_pRasterGrid->m_Cell[nCoastX][nCoastY].dGetSedimentTopElev();
190 double const dParProfEndElev =
m_pRasterGrid->m_Cell[nParProfEndX][nParProfEndY].dGetSedimentTopElev();
192 vector<double> VdParProfileDeanElev;
195 vector<int> VnParProfLenEachOffset;
196 vector<double> VdAmountEachOffset;
197 vector<vector<CGeom2DIPoint>> VVPtiParProfileEachOffset;
198 vector<vector<double>> VVdParProfileDeanElevEachOffset;
206 if (nInlandOffset > 0)
211 LogStream <<
m_ulIter <<
": reached end of up-coast profile " << nUpCoastProfile <<
" during down-coast erosion of unconsolidated " + strTexture +
" sediment for coast " << nCoast <<
" polygon " << pPolygon->
nGetCoastID() <<
" (nCoastPoint = " << nCoastPoint <<
" nInlandOffset = " << nInlandOffset <<
")" << endl;
221 int const nXUpCoastStartOffset = PtiUpCoastTmp.
nGetX() - nXUpCoastProfileExistingCoastPoint;
222 int const nYUpCoastStartOffset = PtiUpCoastTmp.
nGetY() - nYUpCoastProfileExistingCoastPoint;
223 int const nXUpCoastThisStart = nCoastX - nXUpCoastStartOffset;
224 int const nYUpCoastThisStart = nCoastY - nYUpCoastStartOffset;
241 nXParNew = nXUpCoastThisStart + nXOffset,
242 nYParNew = nYUpCoastThisStart + nYOffset;
254 if ((VPtiParProfile.back().nGetX() != nXParNew) || (VPtiParProfile.back().nGetY() != nYParNew))
258 VPtiParProfile.push_back(PtiTmp);
266 VPtiParProfile.push_back(PtiTmp);
270 nParProfLen =
static_cast<int>(VPtiParProfile.size());
292 double const dElevDiff = dParProfCoastElev - dParProfEndElev;
300 bZeroGradient =
true;
305 if (dParProfileLen <= 0)
309 double const dParProfA = dElevDiff / pow(dParProfileLen,
DEAN_POWER);
310 VdParProfileDeanElev.resize(nParProfLen, 0);
311 double const dInc = dParProfileLen / (nParProfLen - 1);
314 CalcDeanProfile(&VdParProfileDeanElev, dInc, dParProfCoastElev, dParProfA,
false, 0, 0);
316 vector<double> dVParProfileNow(nParProfLen, 0);
317 vector<bool> bVProfileValid(nParProfLen,
true);
319 for (
int m = 0; m < nParProfLen; m++)
321 int const nX = VPtiParProfile[nParProfLen - m - 1].nGetX();
322 int const nY = VPtiParProfile[nParProfLen - m - 1].nGetY();
330 bVProfileValid[m] =
false;
336 bVProfileValid[m] =
false;
338 dVParProfileNow[m] =
m_pRasterGrid->m_Cell[nX][nY].dGetSedimentTopElev();
342 double const dParProfTotDiff =
dSubtractProfiles(&dVParProfileNow, &VdParProfileDeanElev, &bVProfileValid);
381 if (dParProfTotDiff > dAllTargetPerProfile)
385 bEnoughEroded =
true;
393 LogStream <<
m_ulIter <<
": leaving loop because nInlandOffset (" << nInlandOffset <<
") >= MIN_INLAND_OFFSET_UNCONS_EROSION) and dParProfTotDiff = " << dParProfTotDiff << endl;
399 VdAmountEachOffset.push_back(dParProfTotDiff);
400 VnParProfLenEachOffset.push_back(nParProfLen);
401 VVPtiParProfileEachOffset.push_back(VPtiParProfile);
402 VVdParProfileDeanElevEachOffset.push_back(VdParProfileDeanElev);
407 if (bHitEdge || bEndProfile || bZeroGradient)
411 double dStillToErodeOnProfile = dAllTargetPerProfile;
416 int nOffsetForLargestPossible = -1;
417 double dLargestPossibleErosion = 0;
419 for (
unsigned int nn = 0; nn < VdAmountEachOffset.size(); nn++)
421 if (VdAmountEachOffset[nn] > dLargestPossibleErosion)
423 dLargestPossibleErosion = VdAmountEachOffset[nn];
424 nOffsetForLargestPossible = nn;
429 if (nOffsetForLargestPossible < 0)
433 nInlandOffset = nOffsetForLargestPossible;
434 dStillToErodeOnProfile = dLargestPossibleErosion;
435 nParProfLen = VnParProfLenEachOffset[nInlandOffset];
436 VPtiParProfile = VVPtiParProfileEachOffset[nInlandOffset];
437 VdParProfileDeanElev = VVdParProfileDeanElevEachOffset[nInlandOffset];
443 int const nRet =
nDoParallelProfileUnconsErosion(pPolygon, nCoastPoint, nCoastX, nCoastY, nTexture, nInlandOffset, nParProfLen, &VPtiParProfile, &VdParProfileDeanElev, dStillToErodeOnProfile, dStillToErodeOnPolygon, dEroded);
458 if (dStillToErodeOnPolygon <= 0)
494int CSimulation::nDoParallelProfileUnconsErosion(
CGeomCoastPolygon* pPolygon,
int const nCoastPoint,
int const nCoastX,
int const nCoastY,
int const nTexture,
int const nInlandOffset,
int const nParProfLen, vector<CGeom2DIPoint>
const* pVPtiParProfile, vector<double>
const* pVdParProfileDeanElev,
double& dStillToErodeOnProfile,
double& dStillToErodeOnPolygon,
double& dTotEroded)
496 for (
int nDistSeawardFromNewCoast = 0; nDistSeawardFromNewCoast < nParProfLen; nDistSeawardFromNewCoast++)
499 if (dStillToErodeOnPolygon <= 0)
502 LogStream <<
m_ulIter <<
": AAA in polygon " << pPolygon->
nGetCoastID() <<
" at coast point " << nCoastPoint <<
" nInlandOffset = " << nInlandOffset <<
", leaving loop because enough erosion for polygon, dStillToErodeOnPolygon = " << dStillToErodeOnPolygon <<
" dStillToErodeOnProfile = " << dStillToErodeOnProfile << endl;
508 if (dStillToErodeOnProfile <= 0)
511 LogStream <<
m_ulIter <<
": BBB in polygon " << pPolygon->
nGetCoastID() <<
" at coast point " << nCoastPoint <<
" nInlandOffset = " << nInlandOffset <<
", leaving loop because enough erosion for profile, dStillToErodeOnPolygon = " << dStillToErodeOnPolygon <<
" dStillToErodeOnProfile = " << dStillToErodeOnProfile << endl;
516 CGeom2DIPoint PtiTmp = pVPtiParProfile->at(nParProfLen - nDistSeawardFromNewCoast - 1);
536 if (!
m_pRasterGrid->m_Cell[nX][nY].bBeachErosionOrDepositionThisIter())
539 double const dThisElevNow =
m_pRasterGrid->m_Cell[nX][nY].dGetSedimentTopElev();
544 double const dElevDiff = dThisElevNow - pVdParProfileDeanElev->at(nDistSeawardFromNewCoast);
546 if ((dElevDiff > 0) && (
m_pRasterGrid->m_Cell[nX][nY].bIsInContiguousSea()))
552 int const nThisLayer =
m_pRasterGrid->m_Cell[nX][nY].nGetTopNonZeroLayerAboveBasement();
561 double const dToErode =
tMin(dElevDiff, dStillToErodeOnProfile, dStillToErodeOnPolygon);
572 dTotEroded += dRemoved;
573 dStillToErodeOnProfile -= dRemoved;
574 dStillToErodeOnPolygon -= dRemoved;
602 else if ((dElevDiff < 0) && (
m_pRasterGrid->m_Cell[nX][nY].bIsInContiguousSea()))
609 double dTotToDeposit =
tMin(-dElevDiff, dTotEroded);
611 int const nTopLayer =
m_pRasterGrid->m_Cell[nX][nY].nGetTopLayerAboveBasement();
617 if (dTotToDeposit > 0)
619 dTotToDeposit =
tMin(dTotToDeposit, dTotEroded);
623 double const dSandNow =
m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(nTopLayer)->pGetUnconsolidatedSediment()->dGetSandDepth();
624 m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(nTopLayer)->pGetUnconsolidatedSediment()->SetSandDepth(dSandNow + dTotToDeposit);
629 dTotEroded -= dTotToDeposit;
631 dStillToErodeOnProfile += dTotToDeposit;
632 dStillToErodeOnPolygon += dTotToDeposit;
641 double const dCoarseNow =
m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(nTopLayer)->pGetUnconsolidatedSediment()->dGetCoarseDepth();
642 m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(nTopLayer)->pGetUnconsolidatedSediment()->SetCoarseDepth(dCoarseNow + dTotToDeposit);
647 dTotEroded -= dTotToDeposit;
649 dStillToErodeOnProfile += dTotToDeposit;
650 dStillToErodeOnPolygon += dTotToDeposit;
665 m_pRasterGrid->m_Cell[nX][nY].IncrBeachDeposition(dTotToDeposit);
777 strTexture =
"coarse";
797 LogStream <<
m_ulIter <<
": " <<
ERR <<
"while depositing " + strTexture +
" unconsolidated sediment for coast " << nCoast <<
" polygon " << pPolygon->
nGetCoastID() <<
", could not find the seaward end point of the up-coast profile (" << nUpCoastProfile <<
") for depth of closure = " <<
m_dDepthOfClosure << endl;
803 int const nUpCoastDeanLen = nIndex + 1;
814 int const nUpCoastProfileCoastPoint = pUpCoastProfile->
nGetCoastPoint();
815 int const nDownCoastProfileCoastPoint = pDownCoastProfile->
nGetCoastPoint();
816 int const nXUpCoastProfileExistingCoastPoint =
m_VCoast[nCoast].pPtiGetCellMarkedAsCoastline(nUpCoastProfileCoastPoint)->nGetX();
817 int const nYUpCoastProfileExistingCoastPoint =
m_VCoast[nCoast].pPtiGetCellMarkedAsCoastline(nUpCoastProfileCoastPoint)->nGetY();
821 vector<int> nVCoastPoint;
823 if (nDownCoastProfileCoastPoint ==
m_VCoast[nCoast].nGetCoastlineSize() - 1)
826 nCoastSegLen = nDownCoastProfileCoastPoint - nUpCoastProfileCoastPoint + 1;
828 for (
int nCoastPoint = nUpCoastProfileCoastPoint; nCoastPoint <= nDownCoastProfileCoastPoint; nCoastPoint++)
829 nVCoastPoint.push_back(nCoastPoint);
835 nCoastSegLen = nDownCoastProfileCoastPoint - nUpCoastProfileCoastPoint;
837 for (
int nCoastPoint = nUpCoastProfileCoastPoint; nCoastPoint < nDownCoastProfileCoastPoint; nCoastPoint++)
838 nVCoastPoint.push_back(nCoastPoint);
841 double dStillToDepositOnPoly = dTargetToDepositOnPoly;
842 double dTargetToDepositOnProfile = dTargetToDepositOnPoly / nCoastSegLen;
843 double dStillToDepositOnProfile;
846 shuffle(nVCoastPoint.begin(), nVCoastPoint.begin() + nCoastSegLen,
m_Rand[1]);
887 for (
int n = 0; n < nCoastSegLen; n++)
890 int const nCoastPoint = nVCoastPoint[n];
892 int const nCoastX = PtiCoastPoint.
nGetX();
893 int const nCoastY = PtiCoastPoint.
nGetY();
896 int const nXOffset = nCoastX - nXUpCoastProfileExistingCoastPoint;
897 int const nYOffset = nCoastY - nYUpCoastProfileExistingCoastPoint;
898 int nSeawardOffset = -1;
900 vector<CGeom2DIPoint> PtiVParProfile;
901 vector<double> VdParProfileDeanElev;
910 int nParProfLen = nUpCoastDeanLen + nSeawardOffset;
922 PtiVParProfile.resize(0);
924 for (
int m = 0; m < nParProfLen; m++)
928 PtiVParProfile.push_back(PtiTmp);
932 int nSeaEndX = PtiVParProfile.back().nGetX();
933 int nSeaEndY = PtiVParProfile.back().nGetY();
942 PtiVParProfile.back().SetX(nSeaEndX);
943 PtiVParProfile.back().SetY(nSeaEndY);
946 double const dParProfEndElev =
m_pRasterGrid->m_Cell[nSeaEndX][nSeaEndY].dGetSedimentTopElev();
952 double const dParProfLen =
dGetDistanceBetween(&PtiVParProfile.front(), &PtiVParProfile.back());
955 double dParProfDeanLen = dParProfLen - (nSeawardOffset *
m_dCellSide);
958 if (dParProfDeanLen <= 0)
962 double const dParProfA = (dParProfStartElev - dParProfEndElev) / pow(dParProfDeanLen,
DEAN_POWER);
964 nParProfLen =
static_cast<int>(PtiVParProfile.size());
965 VdParProfileDeanElev.resize(nParProfLen, 0);
971 double const dInc = dParProfDeanLen / (nParProfLen - nSeawardOffset - 2);
974 double const dCoastElev =
m_pRasterGrid->m_Cell[nCoastX][nCoastY].dGetSedimentTopElev();
977 CalcDeanProfile(&VdParProfileDeanElev, dInc, dParProfStartElev, dParProfA,
true, nSeawardOffset, dCoastElev);
979 double dParProfTotDiff = 0;
981 for (
int m = 0; m < nParProfLen; m++)
984 int nX = PtiTmp.
nGetX();
985 int nY = PtiTmp.
nGetY();
1002 if (!
m_pRasterGrid->m_Cell[nX][nY].bBeachErosionOrDepositionThisIter())
1004 double const dTmpElev =
m_pRasterGrid->m_Cell[nX][nY].dGetSedimentTopElev();
1005 double const dDiff = VdParProfileDeanElev[m] - dTmpElev;
1007 dParProfTotDiff += dDiff;
1058 if (dParProfTotDiff >= dTargetToDepositOnProfile)
1069 double dDepositedOnProfile = 0;
1073 dStillToDepositOnProfile = dTargetToDepositOnProfile;
1075 for (
unsigned int nSeawardFromCoast = 0; nSeawardFromCoast < PtiVParProfile.size(); nSeawardFromCoast++)
1095 int nX = PtiTmp.
nGetX();
1096 int nY = PtiTmp.
nGetY();
1113 if (!
m_pRasterGrid->m_Cell[nX][nY].bBeachErosionOrDepositionThisIter())
1116 double const dThisElevNow =
m_pRasterGrid->m_Cell[nX][nY].dGetSedimentTopElev();
1121 double const dElevDiff = VdParProfileDeanElev[nSeawardFromCoast] - dThisElevNow;
1126 bool bDeposited =
false;
1127 double dToDepositHere = 0;
1132 dToDepositHere =
tMin(dElevDiff, dStillToDepositOnProfile, dStillToDepositOnPoly);
1136 int const nTopLayer =
m_pRasterGrid->m_Cell[nX][nY].nGetTopLayerAboveBasement();
1148 double const dSandNow =
m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(nTopLayer)->pGetUnconsolidatedSediment()->dGetSandDepth();
1150 m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(nTopLayer)->pGetUnconsolidatedSediment()->SetSandDepth(dSandNow + dToDepositHere);
1155 dDepositedOnProfile += dToDepositHere;
1156 dDepositedOnPoly += dToDepositHere;
1161 m_pRasterGrid->m_Cell[nX][nY].IncrBeachDeposition(dToDepositHere);
1163 dStillToDepositOnPoly -= dToDepositHere;
1164 dStillToDepositOnProfile -= dToDepositHere;
1176 double const dCoarseNow =
m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(nTopLayer)->pGetUnconsolidatedSediment()->dGetCoarseDepth();
1178 m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(nTopLayer)->pGetUnconsolidatedSediment()->SetCoarseDepth(dCoarseNow + dToDepositHere);
1188 dDepositedOnProfile += dToDepositHere;
1189 dDepositedOnPoly += dToDepositHere;
1194 m_pRasterGrid->m_Cell[nX][nY].IncrBeachDeposition(dToDepositHere);
1196 dStillToDepositOnPoly -= dToDepositHere;
1197 dStillToDepositOnProfile -= dToDepositHere;
1239 m_pRasterGrid->m_Cell[nX][nY].SetPotentialBeachErosion(-dElevDiff);
1244 int const nThisLayer =
m_pRasterGrid->m_Cell[nX][nY].nGetTopNonZeroLayerAboveBasement();
1255 double dSandRemoved = 0;
1259 dDepositedOnProfile -= dSandRemoved;
1260 dStillToDepositOnProfile += dSandRemoved;
1263 dDepositedOnPoly -= dSandRemoved;
1264 dStillToDepositOnPoly += dSandRemoved;
1282 double dCoarseRemoved = 0;
1286 dDepositedOnProfile -= dCoarseRemoved;
1287 dStillToDepositOnProfile += dCoarseRemoved;
1290 dDepositedOnPoly -= dCoarseRemoved;
1291 dStillToDepositOnPoly += dCoarseRemoved;
1319 if (dTargetToDepositOnPoly > 0)
1332 LogStream <<
m_ulIter <<
": " <<
ERR <<
"while depositing beach for coast " << nCoast <<
" polygon " << pPolygon->
nGetCoastID() <<
", could not find the seaward end point of the down-coast profile (" << nUpCoastProfile <<
") for depth of closure = " <<
m_dDepthOfClosure << endl;
1338 int const nDownCoastDeanLen = nIndex1 + 1;
1349 int const nXDownCoastProfileExistingCoastPoint =
m_VCoast[nCoast].pPtiGetCellMarkedAsCoastline(nDownCoastProfileCoastPoint)->nGetX();
1350 int const nYDownCoastProfileExistingCoastPoint =
m_VCoast[nCoast].pPtiGetCellMarkedAsCoastline(nDownCoastProfileCoastPoint)->nGetY();
1355 nVCoastPoint.resize(0);
1357 if (nUpCoastProfileCoastPoint == 0)
1360 nCoastSegLen = nDownCoastProfileCoastPoint - nUpCoastProfileCoastPoint + 1;
1362 for (
int nCoastPoint = nUpCoastProfileCoastPoint; nCoastPoint <= nDownCoastProfileCoastPoint; nCoastPoint++)
1363 nVCoastPoint.push_back(nCoastPoint);
1369 nCoastSegLen = nDownCoastProfileCoastPoint - nUpCoastProfileCoastPoint;
1371 for (
int nCoastPoint = nUpCoastProfileCoastPoint; nCoastPoint < nDownCoastProfileCoastPoint; nCoastPoint++)
1372 nVCoastPoint.push_back(nCoastPoint);
1376 shuffle(nVCoastPoint.begin(), nVCoastPoint.begin() + nCoastSegLen,
m_Rand[1]);
1379 dTargetToDepositOnProfile = dStillToDepositOnPoly / nCoastSegLen;
1382 bool bEnoughDepositedOnPolygon =
false;
1385 for (
int n = 0; n < nCoastSegLen; n++)
1388 if (bEnoughDepositedOnPolygon)
1392 int const nCoastPoint = nVCoastPoint[n];
1394 int const nCoastX = PtiCoastPoint.
nGetX();
1395 int const nCoastY = PtiCoastPoint.
nGetY();
1398 int const nXOffset = nCoastX - nXDownCoastProfileExistingCoastPoint;
1399 int const nYOffset = nCoastY - nYDownCoastProfileExistingCoastPoint;
1400 int nSeawardOffset = -1;
1402 vector<CGeom2DIPoint> PtiVParProfile;
1403 vector<double> VdParProfileDeanElev;
1412 int nParProfLen = nDownCoastDeanLen + nSeawardOffset;
1424 PtiVParProfile.resize(0);
1426 for (
int m = 0; m < nParProfLen; m++)
1430 PtiVParProfile.push_back(PtiTmp);
1434 int nSeaEndX = PtiVParProfile.back().nGetX();
1435 int nSeaEndY = PtiVParProfile.back().nGetY();
1443 PtiVParProfile.back().SetX(nSeaEndX);
1444 PtiVParProfile.back().SetY(nSeaEndY);
1447 double const dParProfEndElev =
m_pRasterGrid->m_Cell[nSeaEndX][nSeaEndY].dGetSedimentTopElev();
1453 double const dParProfLen =
dGetDistanceBetween(&PtiVParProfile.front(), &PtiVParProfile.back());
1456 double dParProfDeanLen = dParProfLen - (nSeawardOffset *
m_dCellSide);
1459 if (dParProfDeanLen <= 0)
1460 dParProfDeanLen = 1;
1463 double const dParProfA = (dParProfStartElev - dParProfEndElev) / pow(dParProfDeanLen,
DEAN_POWER);
1465 nParProfLen =
static_cast<int>(PtiVParProfile.size());
1466 VdParProfileDeanElev.resize(nParProfLen, 0);
1468 double const dInc = dParProfDeanLen / (nParProfLen - nSeawardOffset - 2);
1471 double const dCoastElev =
m_pRasterGrid->m_Cell[nCoastX][nCoastY].dGetSedimentTopElev();
1474 CalcDeanProfile(&VdParProfileDeanElev, dInc, dParProfStartElev, dParProfA,
true, nSeawardOffset, dCoastElev);
1476 double dParProfTotDiff = 0;
1478 for (
int m = 0; m < nParProfLen; m++)
1481 int nX = PtiTmp.
nGetX();
1482 int nY = PtiTmp.
nGetY();
1499 if (!
m_pRasterGrid->m_Cell[nX][nY].bBeachErosionOrDepositionThisIter())
1501 double const dTmpElev =
m_pRasterGrid->m_Cell[nX][nY].dGetSedimentTopElev();
1502 double const dDiff = VdParProfileDeanElev[m] - dTmpElev;
1504 dParProfTotDiff += dDiff;
1555 if (dParProfTotDiff >= dTargetToDepositOnProfile)
1566 double dDepositedOnProfile = 0;
1568 dStillToDepositOnProfile = dTargetToDepositOnProfile;
1570 for (
unsigned int nSeawardFromCoast = 0; nSeawardFromCoast < PtiVParProfile.size(); nSeawardFromCoast++)
1577 bEnoughDepositedOnPolygon =
true;
1592 int nX = PtiTmp.
nGetX();
1593 int nY = PtiTmp.
nGetY();
1610 if (!
m_pRasterGrid->m_Cell[nX][nY].bBeachErosionOrDepositionThisIter())
1613 double const dThisElevNow =
m_pRasterGrid->m_Cell[nX][nY].dGetSedimentTopElev();
1618 double const dElevDiff = VdParProfileDeanElev[nSeawardFromCoast] - dThisElevNow;
1623 bool bDeposited =
false;
1624 double dToDepositHere = 0;
1629 dToDepositHere =
tMin(dElevDiff, dStillToDepositOnProfile, dStillToDepositOnPoly);
1633 int const nTopLayer =
m_pRasterGrid->m_Cell[nX][nY].nGetTopLayerAboveBasement();
1645 double const dSandNow =
m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(nTopLayer)->pGetUnconsolidatedSediment()->dGetSandDepth();
1647 m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(nTopLayer)->pGetUnconsolidatedSediment()->SetSandDepth(dSandNow + dToDepositHere);
1652 dDepositedOnProfile += dToDepositHere;
1653 dDepositedOnPoly += dToDepositHere;
1658 m_pRasterGrid->m_Cell[nX][nY].IncrBeachDeposition(dToDepositHere);
1660 dStillToDepositOnPoly -= dToDepositHere;
1661 dStillToDepositOnProfile -= dToDepositHere;
1673 double const dCoarseNow =
m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(nTopLayer)->pGetUnconsolidatedSediment()->dGetCoarseDepth();
1675 m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(nTopLayer)->pGetUnconsolidatedSediment()->SetCoarseDepth(dCoarseNow + dToDepositHere);
1680 if (dDepositedOnPoly > dTargetToDepositOnPoly)
1685 dDepositedOnProfile += dToDepositHere;
1686 dDepositedOnPoly += dToDepositHere;
1691 m_pRasterGrid->m_Cell[nX][nY].IncrBeachDeposition(dToDepositHere);
1693 dStillToDepositOnPoly -= dToDepositHere;
1694 dStillToDepositOnProfile -= dToDepositHere;
1730 m_pRasterGrid->m_Cell[nX][nY].SetPotentialBeachErosion(-dElevDiff);
1735 int const nThisLayer =
m_pRasterGrid->m_Cell[nX][nY].nGetTopNonZeroLayerAboveBasement();
1746 double dSandRemoved = 0;
1750 dDepositedOnProfile -= dSandRemoved;
1751 dStillToDepositOnProfile += dSandRemoved;
1754 dDepositedOnPoly -= dSandRemoved;
1755 dStillToDepositOnPoly += dSandRemoved;
1773 double dCoarseRemoved = 0;
1777 dDepositedOnProfile -= dCoarseRemoved;
1778 dStillToDepositOnProfile += dCoarseRemoved;
1781 dDepositedOnPoly -= dCoarseRemoved;
1782 dStillToDepositOnPoly += dCoarseRemoved;