50 strTexture =
"coarse";
53 double dStillToErodeOnPolygon = dErosionTargetOnPolygon;
68 LogStream <<
m_ulIter <<
": " <<
ERR <<
"while eroding unconsolidated " + strTexture +
" sediment on polygon " << pPolygon->
nGetPolygonCoastID() <<
", could not find the seaward end point of the up-coast profile (" << nUpCoastProfile <<
") for depth of closure = " <<
m_dDepthOfClosure << endl;
74 int const nUpCoastPartProfileLen = nIndex + 1;
79 vector<CGeom2DIPoint> PtiVUpCoastPartProfileCell;
83 for (
int n = nUpCoastPartProfileLen - 1; n >= 0; n--)
86 PtiVUpCoastPartProfileCell.push_back(Pti);
89 int const nUpCoastProfileCoastPoint = pUpCoastProfile->
nGetCoastPoint();
90 int const nDownCoastProfileCoastPoint = pDownCoastProfile->
nGetCoastPoint();
91 int const nXUpCoastProfileExistingCoastPoint =
m_VCoast[nCoast].pPtiGetCellMarkedAsCoastline(nUpCoastProfileCoastPoint)->nGetX();
92 int const nYUpCoastProfileExistingCoastPoint =
m_VCoast[nCoast].pPtiGetCellMarkedAsCoastline(nUpCoastProfileCoastPoint)->nGetY();
96 vector<int> nVCoastPoint;
98 if (nDownCoastProfileCoastPoint ==
m_VCoast[nCoast].nGetCoastlineSize() - 1)
101 nCoastSegLen = nDownCoastProfileCoastPoint - nUpCoastProfileCoastPoint + 1;
103 for (
int nCoastPoint = nUpCoastProfileCoastPoint; nCoastPoint <= nDownCoastProfileCoastPoint; nCoastPoint++)
104 nVCoastPoint.push_back(nCoastPoint);
109 nCoastSegLen = nDownCoastProfileCoastPoint - nUpCoastProfileCoastPoint;
111 for (
int nCoastPoint = nUpCoastProfileCoastPoint; nCoastPoint < nDownCoastProfileCoastPoint; nCoastPoint++)
112 nVCoastPoint.push_back(nCoastPoint);
116 double const dAllTargetPerProfile = dErosionTargetOnPolygon / nCoastSegLen;
119 shuffle(nVCoastPoint.begin(), nVCoastPoint.begin() + nCoastSegLen,
m_Rand[1]);
122 for (
int n = 0; n < nCoastSegLen; n++)
125 int const nCoastPoint = nVCoastPoint[n];
128 int const nCoastX = PtiCoastPoint.
nGetX();
129 int const nCoastY = PtiCoastPoint.
nGetY();
145 int const nXOffset = nCoastX - PtiVUpCoastPartProfileCell.back().nGetX();
146 int const nYOffset = nCoastY - PtiVUpCoastPartProfileCell.back().nGetY();
149 vector<CGeom2DIPoint> VPtiParProfile;
151 for (
int m = 0; m < nUpCoastPartProfileLen; m++)
154 CGeom2DIPoint const PtiTmp(PtiVUpCoastPartProfileCell[m].nGetX() + nXOffset, PtiVUpCoastPartProfileCell[m].nGetY() + nYOffset);
155 VPtiParProfile.push_back(PtiTmp);
159 int nParProfEndX = VPtiParProfile[0].nGetX();
160 int nParProfEndY = VPtiParProfile[0].nGetY();
169 VPtiParProfile[0].SetX(nParProfEndX);
170 VPtiParProfile[0].SetY(nParProfEndY);
173 bool bHitEdge =
false;
174 bool bEndProfile =
false;
175 bool bZeroGradient =
false;
176 bool bEnoughEroded =
false;
179 int nInlandOffset = -1;
182 double const dParProfCoastElev =
m_pRasterGrid->m_Cell[nCoastX][nCoastY].dGetAllSedTopElevOmitTalus();
183 double const dParProfEndElev =
m_pRasterGrid->m_Cell[nParProfEndX][nParProfEndY].dGetAllSedTopElevOmitTalus();
185 vector<double> VdParProfileDeanElev;
188 vector<int> VnParProfLenEachOffset;
189 vector<double> VdAmountEachOffset;
190 vector<vector<CGeom2DIPoint>> VVPtiParProfileEachOffset;
191 vector<vector<double>> VVdParProfileDeanElevEachOffset;
199 if (nInlandOffset > 0)
204 LogStream <<
m_ulIter <<
": \tcoast " << nCoast <<
" reached end of up-coast profile " << nUpCoastProfile <<
" during down-coast erosion of unconsolidated " + strTexture +
" sediment for coast " << nCoast <<
" polygon " << pPolygon->
nGetPolygonCoastID() <<
" (nCoastPoint = " << nCoastPoint <<
" nInlandOffset = " << nInlandOffset <<
")" << endl;
214 int const nXUpCoastStartOffset = PtiUpCoastTmp.
nGetX() - nXUpCoastProfileExistingCoastPoint;
215 int const nYUpCoastStartOffset = PtiUpCoastTmp.
nGetY() - nYUpCoastProfileExistingCoastPoint;
216 int const nXUpCoastThisStart = nCoastX - nXUpCoastStartOffset;
217 int const nYUpCoastThisStart = nCoastY - nYUpCoastStartOffset;
233 int nXParNew = nXUpCoastThisStart + nXOffset;
234 int nYParNew = nYUpCoastThisStart + nYOffset;
246 if ((VPtiParProfile.back().nGetX() != nXParNew) || (VPtiParProfile.back().nGetY() != nYParNew))
250 VPtiParProfile.push_back(PtiTmp);
258 VPtiParProfile.push_back(PtiTmp);
262 nParProfLen =
static_cast<int>(VPtiParProfile.size());
284 double const dElevDiff = dParProfCoastElev - dParProfEndElev;
292 bZeroGradient =
true;
297 if (dParProfileLen <= 0)
301 double const dParProfA = dElevDiff / pow(dParProfileLen,
DEAN_POWER);
302 VdParProfileDeanElev.resize(nParProfLen, 0);
303 double const dInc = dParProfileLen / (nParProfLen - 1);
306 CalcDeanProfile(&VdParProfileDeanElev, dInc, dParProfCoastElev, dParProfA,
false, 0, 0);
308 vector<double> dVParProfileNow(nParProfLen, 0);
309 vector<bool> bVProfileValid(nParProfLen,
true);
311 for (
int m = 0; m < nParProfLen; m++)
313 int const nX = VPtiParProfile[nParProfLen - m - 1].nGetX();
314 int const nY = VPtiParProfile[nParProfLen - m - 1].nGetY();
322 bVProfileValid[m] =
false;
328 bVProfileValid[m] =
false;
330 dVParProfileNow[m] =
m_pRasterGrid->m_Cell[nX][nY].dGetAllSedTopElevOmitTalus();
334 double const dParProfTotDiff =
dSubtractProfiles(&dVParProfileNow, &VdParProfileDeanElev, &bVProfileValid);
373 if (dParProfTotDiff > dAllTargetPerProfile)
377 bEnoughEroded =
true;
385 LogStream <<
m_ulIter <<
": leaving loop because nInlandOffset (" << nInlandOffset <<
") >= MIN_INLAND_OFFSET_UNCONS_EROSION) and dParProfTotDiff = " << dParProfTotDiff << endl;
391 VdAmountEachOffset.push_back(dParProfTotDiff);
392 VnParProfLenEachOffset.push_back(nParProfLen);
393 VVPtiParProfileEachOffset.push_back(VPtiParProfile);
394 VVdParProfileDeanElevEachOffset.push_back(VdParProfileDeanElev);
399 if (bHitEdge || bEndProfile || bZeroGradient)
403 double dStillToErodeOnProfile = dAllTargetPerProfile;
408 int nOffsetForLargestPossible = -1;
409 double dLargestPossibleErosion = 0;
411 for (
unsigned int nn = 0; nn < VdAmountEachOffset.size(); nn++)
413 if (VdAmountEachOffset[nn] > dLargestPossibleErosion)
415 dLargestPossibleErosion = VdAmountEachOffset[nn];
416 nOffsetForLargestPossible = nn;
421 if (nOffsetForLargestPossible < 0)
425 nInlandOffset = nOffsetForLargestPossible;
426 dStillToErodeOnProfile = dLargestPossibleErosion;
427 nParProfLen = VnParProfLenEachOffset[nInlandOffset];
428 VPtiParProfile = VVPtiParProfileEachOffset[nInlandOffset];
429 VdParProfileDeanElev = VVdParProfileDeanElevEachOffset[nInlandOffset];
435 int const nRet =
nDoParallelProfileUnconsErosion(pPolygon, nCoastPoint, nCoastX, nCoastY, nTexture, nInlandOffset, nParProfLen, &VPtiParProfile, &VdParProfileDeanElev, dStillToErodeOnProfile, dStillToErodeOnPolygon, dEroded);
450 if (dStillToErodeOnPolygon <= 0)
486int 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)
488 for (
int nDistSeawardFromNewCoast = 0; nDistSeawardFromNewCoast < nParProfLen; nDistSeawardFromNewCoast++)
491 if (dStillToErodeOnPolygon <= 0)
494 LogStream <<
m_ulIter <<
": AAA in polygon " << pPolygon->
nGetPolygonCoastID() <<
" at coast point " << nCoastPoint <<
" nInlandOffset = " << nInlandOffset <<
", leaving loop because enough erosion for polygon, dStillToErodeOnPolygon = " << dStillToErodeOnPolygon <<
" dStillToErodeOnProfile = " << dStillToErodeOnProfile << endl;
500 if (dStillToErodeOnProfile <= 0)
503 LogStream <<
m_ulIter <<
": BBB in polygon " << pPolygon->
nGetPolygonCoastID() <<
" at coast point " << nCoastPoint <<
" nInlandOffset = " << nInlandOffset <<
", leaving loop because enough erosion for profile, dStillToErodeOnPolygon = " << dStillToErodeOnPolygon <<
" dStillToErodeOnProfile = " << dStillToErodeOnProfile << endl;
508 CGeom2DIPoint PtiTmp = pVPtiParProfile->at(nParProfLen - nDistSeawardFromNewCoast - 1);
528 if (!
m_pRasterGrid->m_Cell[nX][nY].bBeachErosionOrDepositionThisIter())
531 double const dThisElevNow =
m_pRasterGrid->m_Cell[nX][nY].dGetAllSedTopElevOmitTalus();
536 double const dElevDiff = dThisElevNow - pVdParProfileDeanElev->at(nDistSeawardFromNewCoast);
538 if ((dElevDiff > 0) && (
m_pRasterGrid->m_Cell[nX][nY].bIsInContiguousSea()))
544 int const nThisLayer =
m_pRasterGrid->m_Cell[nX][nY].nGetTopNonZeroLayerAboveBasement();
553 double const dToErode =
tMin(dElevDiff, dStillToErodeOnProfile, dStillToErodeOnPolygon);
564 dTotEroded += dRemoved;
565 dStillToErodeOnProfile -= dRemoved;
566 dStillToErodeOnPolygon -= dRemoved;
594 else if ((dElevDiff < 0) && (
m_pRasterGrid->m_Cell[nX][nY].bIsInContiguousSea()))
601 double dTotToDeposit =
tMin(-dElevDiff, dTotEroded);
603 int const nTopLayer =
m_pRasterGrid->m_Cell[nX][nY].nGetNumOfTopLayerAboveBasement();
609 if (dTotToDeposit > 0)
611 dTotToDeposit =
tMin(dTotToDeposit, dTotEroded);
615 double const dSandNow =
m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(nTopLayer)->pGetUnconsolidatedSediment()->dGetSandDepth();
616 m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(nTopLayer)->pGetUnconsolidatedSediment()->SetSandDepth(dSandNow + dTotToDeposit);
621 dTotEroded -= dTotToDeposit;
623 dStillToErodeOnProfile += dTotToDeposit;
624 dStillToErodeOnPolygon += dTotToDeposit;
633 double const dCoarseNow =
m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(nTopLayer)->pGetUnconsolidatedSediment()->dGetCoarseDepth();
634 m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(nTopLayer)->pGetUnconsolidatedSediment()->SetCoarseDepth(dCoarseNow + dTotToDeposit);
639 dTotEroded -= dTotToDeposit;
641 dStillToErodeOnProfile += dTotToDeposit;
642 dStillToErodeOnPolygon += dTotToDeposit;
657 m_pRasterGrid->m_Cell[nX][nY].IncrBeachDeposition(dTotToDeposit);
765 strTexture =
"coarse";
785 LogStream <<
m_ulIter <<
": " <<
ERR <<
"while depositing " + strTexture +
" unconsolidated sediment for coast " << nCoast <<
" polygon " << pPolygon->
nGetPolygonCoastID() <<
", could not find the seaward end point of the up-coast profile (" << nUpCoastProfile <<
") for depth of closure = " <<
m_dDepthOfClosure << endl;
791 int const nUpCoastDeanLen = nIndex + 1;
802 int const nUpCoastProfileCoastPoint = pUpCoastProfile->
nGetCoastPoint();
803 int const nDownCoastProfileCoastPoint = pDownCoastProfile->
nGetCoastPoint();
804 int const nXUpCoastProfileExistingCoastPoint =
m_VCoast[nCoast].pPtiGetCellMarkedAsCoastline(nUpCoastProfileCoastPoint)->nGetX();
805 int const nYUpCoastProfileExistingCoastPoint =
m_VCoast[nCoast].pPtiGetCellMarkedAsCoastline(nUpCoastProfileCoastPoint)->nGetY();
809 vector<int> nVCoastPoint;
811 if (nDownCoastProfileCoastPoint ==
m_VCoast[nCoast].nGetCoastlineSize() - 1)
814 nCoastSegLen = nDownCoastProfileCoastPoint - nUpCoastProfileCoastPoint + 1;
816 for (
int nCoastPoint = nUpCoastProfileCoastPoint; nCoastPoint <= nDownCoastProfileCoastPoint; nCoastPoint++)
817 nVCoastPoint.push_back(nCoastPoint);
822 nCoastSegLen = nDownCoastProfileCoastPoint - nUpCoastProfileCoastPoint;
824 for (
int nCoastPoint = nUpCoastProfileCoastPoint; nCoastPoint < nDownCoastProfileCoastPoint; nCoastPoint++)
825 nVCoastPoint.push_back(nCoastPoint);
828 double dStillToDepositOnPoly = dTargetToDepositOnPoly;
829 double dTargetToDepositOnProfile = dTargetToDepositOnPoly / nCoastSegLen;
830 double dStillToDepositOnProfile;
833 shuffle(nVCoastPoint.begin(), nVCoastPoint.begin() + nCoastSegLen,
m_Rand[1]);
874 for (
int n = 0; n < nCoastSegLen; n++)
877 int const nCoastPoint = nVCoastPoint[n];
879 int const nCoastX = PtiCoastPoint.
nGetX();
880 int const nCoastY = PtiCoastPoint.
nGetY();
883 int const nXOffset = nCoastX - nXUpCoastProfileExistingCoastPoint;
884 int const nYOffset = nCoastY - nYUpCoastProfileExistingCoastPoint;
885 int nSeawardOffset = -1;
887 vector<CGeom2DIPoint> PtiVParProfile;
888 vector<double> VdParProfileDeanElev;
897 int nParProfLen = nUpCoastDeanLen + nSeawardOffset;
909 PtiVParProfile.resize(0);
911 for (
int m = 0; m < nParProfLen; m++)
915 PtiVParProfile.push_back(PtiTmp);
919 int nSeaEndX = PtiVParProfile.back().nGetX();
920 int nSeaEndY = PtiVParProfile.back().nGetY();
929 PtiVParProfile.back().SetX(nSeaEndX);
930 PtiVParProfile.back().SetY(nSeaEndY);
933 double const dParProfEndElev =
m_pRasterGrid->m_Cell[nSeaEndX][nSeaEndY].dGetAllSedTopElevOmitTalus();
939 double const dParProfLen =
dGetDistanceBetween(&PtiVParProfile.front(), &PtiVParProfile.back());
942 double dParProfDeanLen = dParProfLen - (nSeawardOffset *
m_dCellSide);
945 if (dParProfDeanLen <= 0)
949 double const dParProfA = (dParProfStartElev - dParProfEndElev) / pow(dParProfDeanLen,
DEAN_POWER);
951 nParProfLen =
static_cast<int>(PtiVParProfile.size());
952 VdParProfileDeanElev.resize(nParProfLen, 0);
958 double const dInc = dParProfDeanLen / (nParProfLen - nSeawardOffset - 2);
961 double const dCoastElev =
m_pRasterGrid->m_Cell[nCoastX][nCoastY].dGetAllSedTopElevOmitTalus();
964 CalcDeanProfile(&VdParProfileDeanElev, dInc, dParProfStartElev, dParProfA,
true, nSeawardOffset, dCoastElev);
966 double dParProfTotDiff = 0;
968 for (
int m = 0; m < nParProfLen; m++)
971 int nX = PtiTmp.
nGetX();
972 int nY = PtiTmp.
nGetY();
989 if (!
m_pRasterGrid->m_Cell[nX][nY].bBeachErosionOrDepositionThisIter())
991 double const dTmpElev =
m_pRasterGrid->m_Cell[nX][nY].dGetAllSedTopElevOmitTalus();
992 double const dDiff = VdParProfileDeanElev[m] - dTmpElev;
994 dParProfTotDiff += dDiff;
1045 if (dParProfTotDiff >= dTargetToDepositOnProfile)
1056 double dDepositedOnProfile = 0;
1060 dStillToDepositOnProfile = dTargetToDepositOnProfile;
1062 for (
unsigned int nSeawardFromCoast = 0; nSeawardFromCoast < PtiVParProfile.size(); nSeawardFromCoast++)
1082 int nX = PtiTmp.
nGetX();
1083 int nY = PtiTmp.
nGetY();
1100 if (!
m_pRasterGrid->m_Cell[nX][nY].bBeachErosionOrDepositionThisIter())
1103 double const dThisElevNow =
m_pRasterGrid->m_Cell[nX][nY].dGetAllSedTopElevOmitTalus();
1108 double const dElevDiff = VdParProfileDeanElev[nSeawardFromCoast] - dThisElevNow;
1113 bool bDeposited =
false;
1114 double dToDepositHere = 0;
1119 dToDepositHere =
tMin(dElevDiff, dStillToDepositOnProfile, dStillToDepositOnPoly);
1123 int const nTopLayer =
m_pRasterGrid->m_Cell[nX][nY].nGetNumOfTopLayerAboveBasement();
1135 double const dSandNow =
m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(nTopLayer)->pGetUnconsolidatedSediment()->dGetSandDepth();
1137 m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(nTopLayer)->pGetUnconsolidatedSediment()->SetSandDepth(dSandNow + dToDepositHere);
1142 dDepositedOnProfile += dToDepositHere;
1143 dDepositedOnPoly += dToDepositHere;
1148 m_pRasterGrid->m_Cell[nX][nY].IncrBeachDeposition(dToDepositHere);
1150 dStillToDepositOnPoly -= dToDepositHere;
1151 dStillToDepositOnProfile -= dToDepositHere;
1162 double const dCoarseNow =
m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(nTopLayer)->pGetUnconsolidatedSediment()->dGetCoarseDepth();
1164 m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(nTopLayer)->pGetUnconsolidatedSediment()->SetCoarseDepth(dCoarseNow + dToDepositHere);
1174 dDepositedOnProfile += dToDepositHere;
1175 dDepositedOnPoly += dToDepositHere;
1180 m_pRasterGrid->m_Cell[nX][nY].IncrBeachDeposition(dToDepositHere);
1182 dStillToDepositOnPoly -= dToDepositHere;
1183 dStillToDepositOnProfile -= dToDepositHere;
1224 m_pRasterGrid->m_Cell[nX][nY].SetPotentialBeachErosion(-dElevDiff);
1229 int const nThisLayer =
m_pRasterGrid->m_Cell[nX][nY].nGetTopNonZeroLayerAboveBasement();
1240 double dSandRemoved = 0;
1244 dDepositedOnProfile -= dSandRemoved;
1245 dStillToDepositOnProfile += dSandRemoved;
1248 dDepositedOnPoly -= dSandRemoved;
1249 dStillToDepositOnPoly += dSandRemoved;
1266 double dCoarseRemoved = 0;
1270 dDepositedOnProfile -= dCoarseRemoved;
1271 dStillToDepositOnProfile += dCoarseRemoved;
1274 dDepositedOnPoly -= dCoarseRemoved;
1275 dStillToDepositOnPoly += dCoarseRemoved;
1303 if (dTargetToDepositOnPoly > 0)
1316 LogStream <<
m_ulIter <<
": " <<
ERR <<
"while depositing beach for coast " << nCoast <<
" polygon " << pPolygon->
nGetPolygonCoastID() <<
", could not find the seaward end point of the up-coast profile (" << nUpCoastProfile <<
") for depth of closure = " <<
m_dDepthOfClosure << endl;
1322 int const nDownCoastDeanLen = nIndex1 + 1;
1333 int const nXDownCoastProfileExistingCoastPoint =
m_VCoast[nCoast].pPtiGetCellMarkedAsCoastline(nDownCoastProfileCoastPoint)->nGetX();
1334 int const nYDownCoastProfileExistingCoastPoint =
m_VCoast[nCoast].pPtiGetCellMarkedAsCoastline(nDownCoastProfileCoastPoint)->nGetY();
1339 nVCoastPoint.resize(0);
1341 if (nUpCoastProfileCoastPoint == 0)
1344 nCoastSegLen = nDownCoastProfileCoastPoint - nUpCoastProfileCoastPoint + 1;
1346 for (
int nCoastPoint = nUpCoastProfileCoastPoint; nCoastPoint <= nDownCoastProfileCoastPoint; nCoastPoint++)
1347 nVCoastPoint.push_back(nCoastPoint);
1352 nCoastSegLen = nDownCoastProfileCoastPoint - nUpCoastProfileCoastPoint;
1354 for (
int nCoastPoint = nUpCoastProfileCoastPoint; nCoastPoint < nDownCoastProfileCoastPoint; nCoastPoint++)
1355 nVCoastPoint.push_back(nCoastPoint);
1359 shuffle(nVCoastPoint.begin(), nVCoastPoint.begin() + nCoastSegLen,
m_Rand[1]);
1362 dTargetToDepositOnProfile = dStillToDepositOnPoly / nCoastSegLen;
1365 bool bEnoughDepositedOnPolygon =
false;
1368 for (
int n = 0; n < nCoastSegLen; n++)
1371 if (bEnoughDepositedOnPolygon)
1375 int const nCoastPoint = nVCoastPoint[n];
1377 int const nCoastX = PtiCoastPoint.
nGetX();
1378 int const nCoastY = PtiCoastPoint.
nGetY();
1381 int const nXOffset = nCoastX - nXDownCoastProfileExistingCoastPoint;
1382 int const nYOffset = nCoastY - nYDownCoastProfileExistingCoastPoint;
1383 int nSeawardOffset = -1;
1385 vector<CGeom2DIPoint> PtiVParProfile;
1386 vector<double> VdParProfileDeanElev;
1395 int nParProfLen = nDownCoastDeanLen + nSeawardOffset;
1407 PtiVParProfile.resize(0);
1409 for (
int m = 0; m < nParProfLen; m++)
1413 PtiVParProfile.push_back(PtiTmp);
1417 int nSeaEndX = PtiVParProfile.back().nGetX();
1418 int nSeaEndY = PtiVParProfile.back().nGetY();
1426 PtiVParProfile.back().SetX(nSeaEndX);
1427 PtiVParProfile.back().SetY(nSeaEndY);
1430 double const dParProfEndElev =
m_pRasterGrid->m_Cell[nSeaEndX][nSeaEndY].dGetAllSedTopElevOmitTalus();
1436 double const dParProfLen =
dGetDistanceBetween(&PtiVParProfile.front(), &PtiVParProfile.back());
1439 double dParProfDeanLen = dParProfLen - (nSeawardOffset *
m_dCellSide);
1442 if (dParProfDeanLen <= 0)
1443 dParProfDeanLen = 1;
1446 double const dParProfA = (dParProfStartElev - dParProfEndElev) / pow(dParProfDeanLen,
DEAN_POWER);
1448 nParProfLen =
static_cast<int>(PtiVParProfile.size());
1449 VdParProfileDeanElev.resize(nParProfLen, 0);
1451 double const dInc = dParProfDeanLen / (nParProfLen - nSeawardOffset - 2);
1454 double const dCoastElev =
m_pRasterGrid->m_Cell[nCoastX][nCoastY].dGetAllSedTopElevOmitTalus();
1457 CalcDeanProfile(&VdParProfileDeanElev, dInc, dParProfStartElev, dParProfA,
true, nSeawardOffset, dCoastElev);
1459 double dParProfTotDiff = 0;
1461 for (
int m = 0; m < nParProfLen; m++)
1464 int nX = PtiTmp.
nGetX();
1465 int nY = PtiTmp.
nGetY();
1482 if (!
m_pRasterGrid->m_Cell[nX][nY].bBeachErosionOrDepositionThisIter())
1484 double const dTmpElev =
m_pRasterGrid->m_Cell[nX][nY].dGetAllSedTopElevOmitTalus();
1485 double const dDiff = VdParProfileDeanElev[m] - dTmpElev;
1487 dParProfTotDiff += dDiff;
1538 if (dParProfTotDiff >= dTargetToDepositOnProfile)
1549 double dDepositedOnProfile = 0;
1551 dStillToDepositOnProfile = dTargetToDepositOnProfile;
1553 for (
unsigned int nSeawardFromCoast = 0; nSeawardFromCoast < PtiVParProfile.size(); nSeawardFromCoast++)
1560 bEnoughDepositedOnPolygon =
true;
1575 int nX = PtiTmp.
nGetX();
1576 int nY = PtiTmp.
nGetY();
1593 if (!
m_pRasterGrid->m_Cell[nX][nY].bBeachErosionOrDepositionThisIter())
1596 double const dThisElevNow =
m_pRasterGrid->m_Cell[nX][nY].dGetAllSedTopElevOmitTalus();
1601 double const dElevDiff = VdParProfileDeanElev[nSeawardFromCoast] - dThisElevNow;
1606 bool bDeposited =
false;
1607 double dToDepositHere = 0;
1612 dToDepositHere =
tMin(dElevDiff, dStillToDepositOnProfile, dStillToDepositOnPoly);
1616 int const nTopLayer =
m_pRasterGrid->m_Cell[nX][nY].nGetNumOfTopLayerAboveBasement();
1628 double const dSandNow =
m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(nTopLayer)->pGetUnconsolidatedSediment()->dGetSandDepth();
1630 m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(nTopLayer)->pGetUnconsolidatedSediment()->SetSandDepth(dSandNow + dToDepositHere);
1635 dDepositedOnProfile += dToDepositHere;
1636 dDepositedOnPoly += dToDepositHere;
1641 m_pRasterGrid->m_Cell[nX][nY].IncrBeachDeposition(dToDepositHere);
1643 dStillToDepositOnPoly -= dToDepositHere;
1644 dStillToDepositOnProfile -= dToDepositHere;
1655 double const dCoarseNow =
m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(nTopLayer)->pGetUnconsolidatedSediment()->dGetCoarseDepth();
1657 m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(nTopLayer)->pGetUnconsolidatedSediment()->SetCoarseDepth(dCoarseNow + dToDepositHere);
1662 if (dDepositedOnPoly > dTargetToDepositOnPoly)
1667 dDepositedOnProfile += dToDepositHere;
1668 dDepositedOnPoly += dToDepositHere;
1673 m_pRasterGrid->m_Cell[nX][nY].IncrBeachDeposition(dToDepositHere);
1675 dStillToDepositOnPoly -= dToDepositHere;
1676 dStillToDepositOnProfile -= dToDepositHere;
1711 m_pRasterGrid->m_Cell[nX][nY].SetPotentialBeachErosion(-dElevDiff);
1716 int const nThisLayer =
m_pRasterGrid->m_Cell[nX][nY].nGetTopNonZeroLayerAboveBasement();
1727 double dSandRemoved = 0;
1731 dDepositedOnProfile -= dSandRemoved;
1732 dStillToDepositOnProfile += dSandRemoved;
1735 dDepositedOnPoly -= dSandRemoved;
1736 dStillToDepositOnPoly += dSandRemoved;
1753 double dCoarseRemoved = 0;
1757 dDepositedOnProfile -= dCoarseRemoved;
1758 dStillToDepositOnProfile += dCoarseRemoved;
1761 dDepositedOnPoly -= dCoarseRemoved;
1762 dStillToDepositOnPoly += dCoarseRemoved;