55 strTexture =
"coarse";
58 double dStillToErodeOnPolygon = dErosionTargetOnPolygon;
74 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;
80 int nUpCoastPartProfileLen = nIndex + 1;
85 vector<CGeom2DIPoint> PtiVUpCoastPartProfileCell;
89 for (
int n = nUpCoastPartProfileLen - 1; n >= 0; n--)
92 PtiVUpCoastPartProfileCell.push_back(Pti);
96 int nDownCoastProfileCoastPoint = pDownCoastProfile->
nGetCoastPoint();
97 int nXUpCoastProfileExistingCoastPoint =
m_VCoast[nCoast].pPtiGetCellMarkedAsCoastline(nUpCoastProfileCoastPoint)->nGetX();
98 int nYUpCoastProfileExistingCoastPoint =
m_VCoast[nCoast].pPtiGetCellMarkedAsCoastline(nUpCoastProfileCoastPoint)->nGetY();
102 vector<int> nVCoastPoint;
104 if (nDownCoastProfileCoastPoint ==
m_VCoast[nCoast].nGetCoastlineSize() - 1)
107 nCoastSegLen = nDownCoastProfileCoastPoint - nUpCoastProfileCoastPoint + 1;
109 for (
int nCoastPoint = nUpCoastProfileCoastPoint; nCoastPoint <= nDownCoastProfileCoastPoint; nCoastPoint++)
110 nVCoastPoint.push_back(nCoastPoint);
116 nCoastSegLen = nDownCoastProfileCoastPoint - nUpCoastProfileCoastPoint;
118 for (
int nCoastPoint = nUpCoastProfileCoastPoint; nCoastPoint < nDownCoastProfileCoastPoint; nCoastPoint++)
119 nVCoastPoint.push_back(nCoastPoint);
123 double dAllTargetPerProfile = dErosionTargetOnPolygon / nCoastSegLen;
126 shuffle(nVCoastPoint.begin(), nVCoastPoint.begin() + nCoastSegLen,
m_Rand[1]);
129 for (
int n = 0; n < nCoastSegLen; n++)
132 int nCoastPoint = nVCoastPoint[n];
135 int nCoastX = PtiCoastPoint.
nGetX();
136 int nCoastY = PtiCoastPoint.
nGetY();
152 int nXOffset = nCoastX - PtiVUpCoastPartProfileCell.back().nGetX();
153 int nYOffset = nCoastY - PtiVUpCoastPartProfileCell.back().nGetY();
156 vector<CGeom2DIPoint> VPtiParProfile;
158 for (
int m = 0; m < nUpCoastPartProfileLen; m++)
161 CGeom2DIPoint PtiTmp(PtiVUpCoastPartProfileCell[m].nGetX() + nXOffset, PtiVUpCoastPartProfileCell[m].nGetY() + nYOffset);
162 VPtiParProfile.push_back(PtiTmp);
166 int nParProfEndX = VPtiParProfile[0].nGetX();
167 int nParProfEndY = VPtiParProfile[0].nGetY();
176 VPtiParProfile[0].SetX(nParProfEndX);
177 VPtiParProfile[0].SetY(nParProfEndY);
180 bool bHitEdge =
false;
181 bool bEndProfile =
false;
182 bool bZeroGradient =
false;
183 bool bEnoughEroded =
false;
186 int nInlandOffset = -1;
188 double dParProfCoastElev =
m_pRasterGrid->m_Cell[nCoastX][nCoastY].dGetSedimentTopElev();
189 double dParProfEndElev =
m_pRasterGrid->m_Cell[nParProfEndX][nParProfEndY].dGetSedimentTopElev();
191 vector<double> VdParProfileDeanElev;
194 vector<int> VnParProfLenEachOffset;
195 vector<double> VdAmountEachOffset;
196 vector<vector<CGeom2DIPoint>> VVPtiParProfileEachOffset;
197 vector<vector<double>> VVdParProfileDeanElevEachOffset;
205 if (nInlandOffset > 0)
210 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;
220 int nXUpCoastStartOffset = PtiUpCoastTmp.
nGetX() - nXUpCoastProfileExistingCoastPoint;
221 int nYUpCoastStartOffset = PtiUpCoastTmp.
nGetY() - nYUpCoastProfileExistingCoastPoint;
222 int nXUpCoastThisStart = nCoastX - nXUpCoastStartOffset;
223 int nYUpCoastThisStart = nCoastY - nYUpCoastStartOffset;
240 nXParNew = nXUpCoastThisStart + nXOffset,
241 nYParNew = nYUpCoastThisStart + nYOffset;
253 if ((VPtiParProfile.back().nGetX() != nXParNew) || (VPtiParProfile.back().nGetY() != nYParNew))
257 VPtiParProfile.push_back(PtiTmp);
265 VPtiParProfile.push_back(PtiTmp);
269 nParProfLen =
static_cast<int>(VPtiParProfile.size());
291 double dElevDiff = dParProfCoastElev - dParProfEndElev;
299 bZeroGradient =
true;
304 if (dParProfileLen <= 0)
308 double dParProfA = dElevDiff / pow(dParProfileLen,
DEAN_POWER);
309 VdParProfileDeanElev.resize(nParProfLen, 0);
310 double dInc = dParProfileLen / (nParProfLen - 1);
313 CalcDeanProfile(&VdParProfileDeanElev, dInc, dParProfCoastElev, dParProfA,
false, 0, 0);
315 vector<double> dVParProfileNow(nParProfLen, 0);
316 vector<bool> bVProfileValid(nParProfLen,
true);
318 for (
int m = 0; m < nParProfLen; m++)
320 int nX = VPtiParProfile[nParProfLen - m - 1].nGetX();
321 int nY = VPtiParProfile[nParProfLen - m - 1].nGetY();
329 bVProfileValid[m] =
false;
335 bVProfileValid[m] =
false;
337 dVParProfileNow[m] =
m_pRasterGrid->m_Cell[nX][nY].dGetSedimentTopElev();
341 double dParProfTotDiff =
dSubtractProfiles(&dVParProfileNow, &VdParProfileDeanElev, &bVProfileValid);
380 if (dParProfTotDiff > dAllTargetPerProfile)
384 bEnoughEroded =
true;
392 LogStream <<
m_ulIter <<
": leaving loop because nInlandOffset (" << nInlandOffset <<
") >= MIN_INLAND_OFFSET_UNCONS_EROSION) and dParProfTotDiff = " << dParProfTotDiff << endl;
398 VdAmountEachOffset.push_back(dParProfTotDiff);
399 VnParProfLenEachOffset.push_back(nParProfLen);
400 VVPtiParProfileEachOffset.push_back(VPtiParProfile);
401 VVdParProfileDeanElevEachOffset.push_back(VdParProfileDeanElev);
406 if (bHitEdge || bEndProfile || bZeroGradient)
410 double dStillToErodeOnProfile = dAllTargetPerProfile;
415 int nOffsetForLargestPossible = -1;
416 double dLargestPossibleErosion = 0;
418 for (
unsigned int nn = 0; nn < VdAmountEachOffset.size(); nn++)
420 if (VdAmountEachOffset[nn] > dLargestPossibleErosion)
422 dLargestPossibleErosion = VdAmountEachOffset[nn];
423 nOffsetForLargestPossible = nn;
428 if (nOffsetForLargestPossible < 0)
432 nInlandOffset = nOffsetForLargestPossible;
433 dStillToErodeOnProfile = dLargestPossibleErosion;
434 nParProfLen = VnParProfLenEachOffset[nInlandOffset];
435 VPtiParProfile = VVPtiParProfileEachOffset[nInlandOffset];
436 VdParProfileDeanElev = VVdParProfileDeanElevEachOffset[nInlandOffset];
442 int nRet =
nDoParallelProfileUnconsErosion(pPolygon, nCoastPoint, nCoastX, nCoastY, nTexture, nInlandOffset, nParProfLen, &VPtiParProfile, &VdParProfileDeanElev, dStillToErodeOnProfile, dStillToErodeOnPolygon, dEroded);
457 if (dStillToErodeOnPolygon <= 0)
493int 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)
495 for (
int nDistSeawardFromNewCoast = 0; nDistSeawardFromNewCoast < nParProfLen; nDistSeawardFromNewCoast++)
498 if (dStillToErodeOnPolygon <= 0)
501 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;
507 if (dStillToErodeOnProfile <= 0)
510 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;
515 CGeom2DIPoint PtiTmp = pVPtiParProfile->at(nParProfLen - nDistSeawardFromNewCoast - 1);
535 if (!
m_pRasterGrid->m_Cell[nX][nY].bBeachErosionOrDepositionThisIter())
538 double dThisElevNow =
m_pRasterGrid->m_Cell[nX][nY].dGetSedimentTopElev();
543 double dElevDiff = dThisElevNow - pVdParProfileDeanElev->at(nDistSeawardFromNewCoast);
545 if ((dElevDiff > 0) && (
m_pRasterGrid->m_Cell[nX][nY].bIsInContiguousSea()))
551 int nThisLayer =
m_pRasterGrid->m_Cell[nX][nY].nGetTopNonZeroLayerAboveBasement();
560 double dToErode =
tMin(dElevDiff, dStillToErodeOnProfile, dStillToErodeOnPolygon);
571 dTotEroded += dRemoved;
572 dStillToErodeOnProfile -= dRemoved;
573 dStillToErodeOnPolygon -= dRemoved;
602 else if ((dElevDiff < 0) && (
m_pRasterGrid->m_Cell[nX][nY].bIsInContiguousSea()))
609 double dTotToDeposit =
tMin(-dElevDiff, dTotEroded);
611 int nTopLayer =
m_pRasterGrid->m_Cell[nX][nY].nGetTopLayerAboveBasement();
617 if (dTotToDeposit > 0)
619 dTotToDeposit =
tMin(dTotToDeposit, dTotEroded);
623 double 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 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 nUpCoastDeanLen = nIndex + 1;
814 int nUpCoastProfileCoastPoint = pUpCoastProfile->
nGetCoastPoint();
815 int nDownCoastProfileCoastPoint = pDownCoastProfile->
nGetCoastPoint();
816 int nXUpCoastProfileExistingCoastPoint =
m_VCoast[nCoast].pPtiGetCellMarkedAsCoastline(nUpCoastProfileCoastPoint)->nGetX();
817 int 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 nCoastPoint = nVCoastPoint[n];
892 int nCoastX = PtiCoastPoint.
nGetX();
893 int nCoastY = PtiCoastPoint.
nGetY();
896 int nXOffset = nCoastX - nXUpCoastProfileExistingCoastPoint;
897 int 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 dParProfEndElev =
m_pRasterGrid->m_Cell[nSeaEndX][nSeaEndY].dGetSedimentTopElev();
955 double dParProfDeanLen = dParProfLen - (nSeawardOffset *
m_dCellSide);
958 if (dParProfDeanLen <= 0)
962 double dParProfA = (dParProfStartElev - dParProfEndElev) / pow(dParProfDeanLen,
DEAN_POWER);
964 nParProfLen =
static_cast<int>(PtiVParProfile.size());
965 VdParProfileDeanElev.resize(nParProfLen, 0);
971 double dInc = dParProfDeanLen / (nParProfLen - nSeawardOffset - 2);
974 double 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 dTmpElev =
m_pRasterGrid->m_Cell[nX][nY].dGetSedimentTopElev();
1005 double 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 dThisElevNow =
m_pRasterGrid->m_Cell[nX][nY].dGetSedimentTopElev();
1121 double dElevDiff = VdParProfileDeanElev[nSeawardFromCoast] - dThisElevNow;
1126 bool bDeposited =
false;
1127 double dToDepositHere = 0;
1132 dToDepositHere =
tMin(dElevDiff, dStillToDepositOnProfile, dStillToDepositOnPoly);
1136 int nTopLayer =
m_pRasterGrid->m_Cell[nX][nY].nGetTopLayerAboveBasement();
1148 double 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 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 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 nDownCoastDeanLen = nIndex1 + 1;
1349 int nXDownCoastProfileExistingCoastPoint =
m_VCoast[nCoast].pPtiGetCellMarkedAsCoastline(nDownCoastProfileCoastPoint)->nGetX();
1350 int 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 nCoastPoint = nVCoastPoint[n];
1394 int nCoastX = PtiCoastPoint.
nGetX();
1395 int nCoastY = PtiCoastPoint.
nGetY();
1398 int nXOffset = nCoastX - nXDownCoastProfileExistingCoastPoint;
1399 int 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 dParProfEndElev =
m_pRasterGrid->m_Cell[nSeaEndX][nSeaEndY].dGetSedimentTopElev();
1453 double dParProfLen =
dGetDistanceBetween(&PtiVParProfile.front(), &PtiVParProfile.back());
1456 double dParProfDeanLen = dParProfLen - (nSeawardOffset *
m_dCellSide);
1459 if (dParProfDeanLen <= 0)
1460 dParProfDeanLen = 1;
1463 double dParProfA = (dParProfStartElev - dParProfEndElev) / pow(dParProfDeanLen,
DEAN_POWER);
1465 nParProfLen =
static_cast<int>(PtiVParProfile.size());
1466 VdParProfileDeanElev.resize(nParProfLen, 0);
1468 double dInc = dParProfDeanLen / (nParProfLen - nSeawardOffset - 2);
1471 double 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 dTmpElev =
m_pRasterGrid->m_Cell[nX][nY].dGetSedimentTopElev();
1502 double 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 dThisElevNow =
m_pRasterGrid->m_Cell[nX][nY].dGetSedimentTopElev();
1618 double dElevDiff = VdParProfileDeanElev[nSeawardFromCoast] - dThisElevNow;
1623 bool bDeposited =
false;
1624 double dToDepositHere = 0;
1629 dToDepositHere =
tMin(dElevDiff, dStillToDepositOnProfile, dStillToDepositOnPoly);
1633 int nTopLayer =
m_pRasterGrid->m_Cell[nX][nY].nGetTopLayerAboveBasement();
1645 double 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 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 nThisLayer =
m_pRasterGrid->m_Cell[nX][nY].nGetTopNonZeroLayerAboveBasement();
1746 double dSandRemoved = 0;
1750 dDepositedOnProfile -= dSandRemoved;
1751 dStillToDepositOnProfile += dSandRemoved;
1754 dDepositedOnPoly -= dSandRemoved;
1755 dStillToDepositOnPoly += dSandRemoved;
1774 double dCoarseRemoved = 0;
1778 dDepositedOnProfile -= dCoarseRemoved;
1779 dStillToDepositOnProfile += dCoarseRemoved;
1782 dDepositedOnPoly -= dCoarseRemoved;
1783 dStillToDepositOnPoly += dCoarseRemoved;