52 strTexture =
"coarse";
55 double dStillToErodeOnPolygon = dErosionTargetOnPolygon;
70 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;
76 int nUpCoastPartProfileLen = nIndex + 1;
81 vector<CGeom2DIPoint> PtiVUpCoastPartProfileCell;
84 for (
int n = nUpCoastPartProfileLen-1; n >= 0; n--)
87 PtiVUpCoastPartProfileCell.push_back(Pti);
91 int nDownCoastProfileCoastPoint = pDownCoastProfile->
nGetCoastPoint();
92 int nXUpCoastProfileExistingCoastPoint =
m_VCoast[nCoast].pPtiGetCellMarkedAsCoastline(nUpCoastProfileCoastPoint)->nGetX();
93 int nYUpCoastProfileExistingCoastPoint =
m_VCoast[nCoast].pPtiGetCellMarkedAsCoastline(nUpCoastProfileCoastPoint)->nGetY();
97 vector<int> nVCoastPoint;
98 if (nDownCoastProfileCoastPoint ==
m_VCoast[nCoast].nGetCoastlineSize() - 1)
101 nCoastSegLen = nDownCoastProfileCoastPoint - nUpCoastProfileCoastPoint + 1;
102 for (
int nCoastPoint = nUpCoastProfileCoastPoint; nCoastPoint <= nDownCoastProfileCoastPoint; nCoastPoint++)
103 nVCoastPoint.push_back(nCoastPoint);
108 nCoastSegLen = nDownCoastProfileCoastPoint - nUpCoastProfileCoastPoint;
109 for (
int nCoastPoint = nUpCoastProfileCoastPoint; nCoastPoint < nDownCoastProfileCoastPoint; nCoastPoint++)
110 nVCoastPoint.push_back(nCoastPoint);
114 double dAllTargetPerProfile = dErosionTargetOnPolygon / nCoastSegLen;
117 shuffle(nVCoastPoint.begin(), nVCoastPoint.begin() + nCoastSegLen,
m_Rand[1]);
120 for (
int n = 0; n < nCoastSegLen; n++)
123 int nCoastPoint = nVCoastPoint[n];
126 int nCoastX = PtiCoastPoint.
nGetX();
127 int nCoastY = PtiCoastPoint.
nGetY();
143 int nXOffset = nCoastX - PtiVUpCoastPartProfileCell.back().nGetX();
144 int nYOffset = nCoastY - PtiVUpCoastPartProfileCell.back().nGetY();
147 vector<CGeom2DIPoint> VPtiParProfile;
148 for (
int m = 0; m < nUpCoastPartProfileLen; m++)
151 CGeom2DIPoint PtiTmp(PtiVUpCoastPartProfileCell[m].nGetX() + nXOffset, PtiVUpCoastPartProfileCell[m].nGetY() + nYOffset);
152 VPtiParProfile.push_back(PtiTmp);
156 int nParProfEndX = VPtiParProfile[0].nGetX();
157 int nParProfEndY = VPtiParProfile[0].nGetY();
166 VPtiParProfile[0].SetX(nParProfEndX);
167 VPtiParProfile[0].SetY(nParProfEndY);
170 bool bHitEdge =
false;
171 bool bEndProfile =
false;
172 bool bZeroGradient =
false;
173 bool bEnoughEroded =
false;
176 int nInlandOffset = -1;
178 double dParProfCoastElev =
m_pRasterGrid->m_Cell[nCoastX][nCoastY].dGetSedimentTopElev();
179 double dParProfEndElev =
m_pRasterGrid->m_Cell[nParProfEndX][nParProfEndY].dGetSedimentTopElev();
181 vector<double> VdParProfileDeanElev;
184 vector<int> VnParProfLenEachOffset;
185 vector<double> VdAmountEachOffset;
186 vector<vector<CGeom2DIPoint>> VVPtiParProfileEachOffset;
187 vector<vector<double>> VVdParProfileDeanElevEachOffset;
195 if (nInlandOffset > 0)
200 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;
210 int nXUpCoastStartOffset = PtiUpCoastTmp.
nGetX() - nXUpCoastProfileExistingCoastPoint;
211 int nYUpCoastStartOffset = PtiUpCoastTmp.
nGetY() - nYUpCoastProfileExistingCoastPoint;
212 int nXUpCoastThisStart = nCoastX - nXUpCoastStartOffset;
213 int nYUpCoastThisStart = nCoastY - nYUpCoastStartOffset;
230 nXParNew = nXUpCoastThisStart + nXOffset,
231 nYParNew = nYUpCoastThisStart + nYOffset;
243 if ((VPtiParProfile.back().nGetX() != nXParNew) || (VPtiParProfile.back().nGetY() != nYParNew))
247 VPtiParProfile.push_back(PtiTmp);
254 VPtiParProfile.push_back(PtiTmp);
258 nParProfLen =
static_cast<int>(VPtiParProfile.size());
280 double dElevDiff = dParProfCoastElev - dParProfEndElev;
287 bZeroGradient =
true;
292 if (dParProfileLen <= 0)
296 double dParProfA = dElevDiff / pow(dParProfileLen,
DEAN_POWER);
297 VdParProfileDeanElev.resize(nParProfLen, 0);
298 double dInc = dParProfileLen / (nParProfLen - 1);
301 CalcDeanProfile(&VdParProfileDeanElev, dInc, dParProfCoastElev, dParProfA,
false, 0, 0);
303 vector<double> dVParProfileNow(nParProfLen, 0);
304 vector<bool> bVProfileValid(nParProfLen,
true);
305 for (
int m = 0; m < nParProfLen; m++)
307 int nX = VPtiParProfile[nParProfLen - m - 1].nGetX();
308 int nY = VPtiParProfile[nParProfLen - m - 1].nGetY();
316 bVProfileValid[m] =
false;
322 bVProfileValid[m] =
false;
324 dVParProfileNow[m] =
m_pRasterGrid->m_Cell[nX][nY].dGetSedimentTopElev();
328 double dParProfTotDiff =
dSubtractProfiles(&dVParProfileNow, &VdParProfileDeanElev, &bVProfileValid);
367 if (dParProfTotDiff > dAllTargetPerProfile)
371 bEnoughEroded =
true;
379 LogStream <<
m_ulIter <<
": leaving loop because nInlandOffset (" << nInlandOffset <<
") >= MIN_INLAND_OFFSET_FOR_BEACH_EROSION_ESTIMATION) and dParProfTotDiff = " << dParProfTotDiff << endl;
384 VdAmountEachOffset.push_back(dParProfTotDiff);
385 VnParProfLenEachOffset.push_back(nParProfLen);
386 VVPtiParProfileEachOffset.push_back(VPtiParProfile);
387 VVdParProfileDeanElevEachOffset.push_back(VdParProfileDeanElev);
392 if (bHitEdge || bEndProfile || bZeroGradient)
396 double dStillToErodeOnProfile = dAllTargetPerProfile;
401 int nOffsetForLargestPossible = -1;
402 double dLargestPossibleErosion = 0;
403 for (
unsigned int nn = 0; nn < VdAmountEachOffset.size(); nn++)
405 if (VdAmountEachOffset[nn] > dLargestPossibleErosion)
407 dLargestPossibleErosion = VdAmountEachOffset[nn];
408 nOffsetForLargestPossible = nn;
413 if (nOffsetForLargestPossible < 0)
417 nInlandOffset = nOffsetForLargestPossible;
418 dStillToErodeOnProfile = dLargestPossibleErosion;
419 nParProfLen = VnParProfLenEachOffset[nInlandOffset];
420 VPtiParProfile = VVPtiParProfileEachOffset[nInlandOffset];
421 VdParProfileDeanElev = VVdParProfileDeanElevEachOffset[nInlandOffset];
427 int nRet =
nDoParallelProfileUnconsErosion(pPolygon, nCoastPoint, nCoastX, nCoastY, nTexture, nInlandOffset, nParProfLen, &VPtiParProfile, &VdParProfileDeanElev, dStillToErodeOnProfile, dStillToErodeOnPolygon, dEroded);
441 if (dStillToErodeOnPolygon <= 0)
477int 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)
479 for (
int nDistSeawardFromNewCoast = 0; nDistSeawardFromNewCoast < nParProfLen; nDistSeawardFromNewCoast++)
482 if (dStillToErodeOnPolygon <= 0)
485 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;
491 if (dStillToErodeOnProfile <= 0)
494 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;
499 CGeom2DIPoint PtiTmp = pVPtiParProfile->at(nParProfLen - nDistSeawardFromNewCoast - 1);
519 if (!
m_pRasterGrid->m_Cell[nX][nY].bBeachErosionOrDepositionThisIter())
522 double dThisElevNow =
m_pRasterGrid->m_Cell[nX][nY].dGetSedimentTopElev();
527 double dElevDiff = dThisElevNow - pVdParProfileDeanElev->at(nDistSeawardFromNewCoast);
528 if ((dElevDiff > 0) && (
m_pRasterGrid->m_Cell[nX][nY].bIsInContiguousSea()))
534 int nThisLayer =
m_pRasterGrid->m_Cell[nX][nY].nGetTopNonZeroLayerAboveBasement();
543 double dToErode =
tMin(dElevDiff, dStillToErodeOnProfile, dStillToErodeOnPolygon);
554 dTotEroded += dRemoved;
555 dStillToErodeOnProfile -= dRemoved;
556 dStillToErodeOnPolygon -= dRemoved;
583 else if ((dElevDiff < 0) && (
m_pRasterGrid->m_Cell[nX][nY].bIsInContiguousSea()))
590 double dTotToDeposit =
tMin(-dElevDiff, dTotEroded);
592 int nTopLayer =
m_pRasterGrid->m_Cell[nX][nY].nGetTopLayerAboveBasement();
598 if (dTotToDeposit > 0)
600 dTotToDeposit =
tMin(dTotToDeposit, dTotEroded);
604 double dSandNow =
m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(nTopLayer)->pGetUnconsolidatedSediment()->dGetSandDepth();
605 m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(nTopLayer)->pGetUnconsolidatedSediment()->SetSandDepth(dSandNow + dTotToDeposit);
610 dTotEroded -= dTotToDeposit;
612 dStillToErodeOnProfile += dTotToDeposit;
613 dStillToErodeOnPolygon += dTotToDeposit;
622 double dCoarseNow =
m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(nTopLayer)->pGetUnconsolidatedSediment()->dGetCoarseDepth();
623 m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(nTopLayer)->pGetUnconsolidatedSediment()->SetCoarseDepth(dCoarseNow + dTotToDeposit);
628 dTotEroded -= dTotToDeposit;
630 dStillToErodeOnProfile += dTotToDeposit;
631 dStillToErodeOnPolygon += dTotToDeposit;
646 m_pRasterGrid->m_Cell[nX][nY].IncrBeachDeposition(dTotToDeposit);
752 strTexture =
"coarse";
771 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;
777 int nUpCoastDeanLen = nIndex + 1;
788 int nUpCoastProfileCoastPoint = pUpCoastProfile->
nGetCoastPoint();
789 int nDownCoastProfileCoastPoint = pDownCoastProfile->
nGetCoastPoint();
790 int nXUpCoastProfileExistingCoastPoint =
m_VCoast[nCoast].pPtiGetCellMarkedAsCoastline(nUpCoastProfileCoastPoint)->nGetX();
791 int nYUpCoastProfileExistingCoastPoint =
m_VCoast[nCoast].pPtiGetCellMarkedAsCoastline(nUpCoastProfileCoastPoint)->nGetY();
795 vector<int> nVCoastPoint;
796 if (nDownCoastProfileCoastPoint ==
m_VCoast[nCoast].nGetCoastlineSize() - 1)
799 nCoastSegLen = nDownCoastProfileCoastPoint - nUpCoastProfileCoastPoint + 1;
800 for (
int nCoastPoint = nUpCoastProfileCoastPoint; nCoastPoint <= nDownCoastProfileCoastPoint; nCoastPoint++)
801 nVCoastPoint.push_back(nCoastPoint);
806 nCoastSegLen = nDownCoastProfileCoastPoint - nUpCoastProfileCoastPoint;
807 for (
int nCoastPoint = nUpCoastProfileCoastPoint; nCoastPoint < nDownCoastProfileCoastPoint; nCoastPoint++)
808 nVCoastPoint.push_back(nCoastPoint);
811 double dStillToDepositOnPoly = dTargetToDepositOnPoly;
812 double dTargetToDepositOnProfile = dTargetToDepositOnPoly / nCoastSegLen;
813 double dStillToDepositOnProfile;
816 shuffle(nVCoastPoint.begin(), nVCoastPoint.begin() + nCoastSegLen,
m_Rand[1]);
857 for (
int n = 0; n < nCoastSegLen; n++)
860 int nCoastPoint = nVCoastPoint[n];
862 int nCoastX = PtiCoastPoint.
nGetX();
863 int nCoastY = PtiCoastPoint.
nGetY();
866 int nXOffset = nCoastX - nXUpCoastProfileExistingCoastPoint;
867 int nYOffset = nCoastY - nYUpCoastProfileExistingCoastPoint;
868 int nSeawardOffset = -1;
870 vector<CGeom2DIPoint> PtiVParProfile;
871 vector<double> VdParProfileDeanElev;
880 int nParProfLen = nUpCoastDeanLen + nSeawardOffset;
892 PtiVParProfile.resize(0);
893 for (
int m = 0; m < nParProfLen; m++)
897 PtiVParProfile.push_back(PtiTmp);
901 int nSeaEndX = PtiVParProfile.back().nGetX();
902 int nSeaEndY = PtiVParProfile.back().nGetY();
911 PtiVParProfile.back().SetX(nSeaEndX);
912 PtiVParProfile.back().SetY(nSeaEndY);
915 double dParProfEndElev =
m_pRasterGrid->m_Cell[nSeaEndX][nSeaEndY].dGetSedimentTopElev();
924 double dParProfDeanLen = dParProfLen - (nSeawardOffset *
m_dCellSide);
927 if (dParProfDeanLen <= 0)
931 double dParProfA = (dParProfStartElev - dParProfEndElev) / pow(dParProfDeanLen,
DEAN_POWER);
933 nParProfLen =
static_cast<int>(PtiVParProfile.size());
934 VdParProfileDeanElev.resize(nParProfLen, 0);
940 double dInc = dParProfDeanLen / (nParProfLen - nSeawardOffset - 2);
943 double dCoastElev =
m_pRasterGrid->m_Cell[nCoastX][nCoastY].dGetSedimentTopElev();
946 CalcDeanProfile(&VdParProfileDeanElev, dInc, dParProfStartElev, dParProfA,
true, nSeawardOffset, dCoastElev);
948 double dParProfTotDiff = 0;
949 for (
int m = 0; m < nParProfLen; m++)
952 int nX = PtiTmp.
nGetX();
953 int nY = PtiTmp.
nGetY();
970 if (!
m_pRasterGrid->m_Cell[nX][nY].bBeachErosionOrDepositionThisIter())
972 double dTmpElev =
m_pRasterGrid->m_Cell[nX][nY].dGetSedimentTopElev();
973 double dDiff = VdParProfileDeanElev[m] - dTmpElev;
975 dParProfTotDiff += dDiff;
1026 if (dParProfTotDiff >= dTargetToDepositOnProfile)
1037 double dDepositedOnProfile = 0;
1041 dStillToDepositOnProfile = dTargetToDepositOnProfile;
1042 for (
unsigned int nSeawardFromCoast = 0; nSeawardFromCoast < PtiVParProfile.size(); nSeawardFromCoast++)
1062 int nX = PtiTmp.
nGetX();
1063 int nY = PtiTmp.
nGetY();
1080 if (!
m_pRasterGrid->m_Cell[nX][nY].bBeachErosionOrDepositionThisIter())
1083 double dThisElevNow =
m_pRasterGrid->m_Cell[nX][nY].dGetSedimentTopElev();
1088 double dElevDiff = VdParProfileDeanElev[nSeawardFromCoast] - dThisElevNow;
1093 bool bDeposited =
false;
1094 double dToDepositHere = 0;
1099 dToDepositHere =
tMin(dElevDiff, dStillToDepositOnProfile, dStillToDepositOnPoly);
1103 int nTopLayer =
m_pRasterGrid->m_Cell[nX][nY].nGetTopLayerAboveBasement();
1115 double dSandNow =
m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(nTopLayer)->pGetUnconsolidatedSediment()->dGetSandDepth();
1117 m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(nTopLayer)->pGetUnconsolidatedSediment()->SetSandDepth(dSandNow + dToDepositHere);
1122 dDepositedOnProfile += dToDepositHere;
1123 dDepositedOnPoly += dToDepositHere;
1128 m_pRasterGrid->m_Cell[nX][nY].IncrBeachDeposition(dToDepositHere);
1130 dStillToDepositOnPoly -= dToDepositHere;
1131 dStillToDepositOnProfile -= dToDepositHere;
1142 double dCoarseNow =
m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(nTopLayer)->pGetUnconsolidatedSediment()->dGetCoarseDepth();
1144 m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(nTopLayer)->pGetUnconsolidatedSediment()->SetCoarseDepth(dCoarseNow + dToDepositHere);
1154 dDepositedOnProfile += dToDepositHere;
1155 dDepositedOnPoly += dToDepositHere;
1160 m_pRasterGrid->m_Cell[nX][nY].IncrBeachDeposition(dToDepositHere);
1162 dStillToDepositOnPoly -= dToDepositHere;
1163 dStillToDepositOnProfile -= dToDepositHere;
1202 m_pRasterGrid->m_Cell[nX][nY].SetPotentialBeachErosion(-dElevDiff);
1207 int nThisLayer =
m_pRasterGrid->m_Cell[nX][nY].nGetTopNonZeroLayerAboveBasement();
1218 double dSandRemoved = 0;
1222 dDepositedOnProfile -= dSandRemoved;
1223 dStillToDepositOnProfile += dSandRemoved;
1226 dDepositedOnPoly -= dSandRemoved;
1227 dStillToDepositOnPoly += dSandRemoved;
1244 double dCoarseRemoved = 0;
1248 dDepositedOnProfile -= dCoarseRemoved;
1249 dStillToDepositOnProfile += dCoarseRemoved;
1252 dDepositedOnPoly -= dCoarseRemoved;
1253 dStillToDepositOnPoly += dCoarseRemoved;
1281 if (dTargetToDepositOnPoly > 0)
1293 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;
1299 int nDownCoastDeanLen = nIndex1 + 1;
1310 int nXDownCoastProfileExistingCoastPoint =
m_VCoast[nCoast].pPtiGetCellMarkedAsCoastline(nDownCoastProfileCoastPoint)->nGetX();
1311 int nYDownCoastProfileExistingCoastPoint =
m_VCoast[nCoast].pPtiGetCellMarkedAsCoastline(nDownCoastProfileCoastPoint)->nGetY();
1316 nVCoastPoint.resize(0);
1317 if (nUpCoastProfileCoastPoint == 0)
1320 nCoastSegLen = nDownCoastProfileCoastPoint - nUpCoastProfileCoastPoint + 1;
1321 for (
int nCoastPoint = nUpCoastProfileCoastPoint; nCoastPoint <= nDownCoastProfileCoastPoint; nCoastPoint++)
1322 nVCoastPoint.push_back(nCoastPoint);
1327 nCoastSegLen = nDownCoastProfileCoastPoint - nUpCoastProfileCoastPoint;
1328 for (
int nCoastPoint = nUpCoastProfileCoastPoint; nCoastPoint < nDownCoastProfileCoastPoint; nCoastPoint++)
1329 nVCoastPoint.push_back(nCoastPoint);
1333 shuffle(nVCoastPoint.begin(), nVCoastPoint.begin() + nCoastSegLen,
m_Rand[1]);
1336 dTargetToDepositOnProfile = dStillToDepositOnPoly / nCoastSegLen;
1339 bool bEnoughDepositedOnPolygon =
false;
1342 for (
int n = 0; n < nCoastSegLen; n++)
1345 if (bEnoughDepositedOnPolygon)
1349 int nCoastPoint = nVCoastPoint[n];
1351 int nCoastX = PtiCoastPoint.
nGetX();
1352 int nCoastY = PtiCoastPoint.
nGetY();
1355 int nXOffset = nCoastX - nXDownCoastProfileExistingCoastPoint;
1356 int nYOffset = nCoastY - nYDownCoastProfileExistingCoastPoint;
1357 int nSeawardOffset = -1;
1359 vector<CGeom2DIPoint> PtiVParProfile;
1360 vector<double> VdParProfileDeanElev;
1369 int nParProfLen = nDownCoastDeanLen + nSeawardOffset;
1381 PtiVParProfile.resize(0);
1382 for (
int m = 0; m < nParProfLen; m++)
1386 PtiVParProfile.push_back(PtiTmp);
1390 int nSeaEndX = PtiVParProfile.back().nGetX();
1391 int nSeaEndY = PtiVParProfile.back().nGetY();
1399 PtiVParProfile.back().SetX(nSeaEndX);
1400 PtiVParProfile.back().SetY(nSeaEndY);
1403 double dParProfEndElev =
m_pRasterGrid->m_Cell[nSeaEndX][nSeaEndY].dGetSedimentTopElev();
1409 double dParProfLen =
dGetDistanceBetween(&PtiVParProfile.front(), &PtiVParProfile.back());
1412 double dParProfDeanLen = dParProfLen - (nSeawardOffset *
m_dCellSide);
1415 if (dParProfDeanLen <= 0)
1416 dParProfDeanLen = 1;
1419 double dParProfA = (dParProfStartElev - dParProfEndElev) / pow(dParProfDeanLen,
DEAN_POWER);
1421 nParProfLen =
static_cast<int>(PtiVParProfile.size());
1422 VdParProfileDeanElev.resize(nParProfLen, 0);
1424 double dInc = dParProfDeanLen / (nParProfLen - nSeawardOffset - 2);
1427 double dCoastElev =
m_pRasterGrid->m_Cell[nCoastX][nCoastY].dGetSedimentTopElev();
1430 CalcDeanProfile(&VdParProfileDeanElev, dInc, dParProfStartElev, dParProfA,
true, nSeawardOffset, dCoastElev);
1432 double dParProfTotDiff = 0;
1433 for (
int m = 0; m < nParProfLen; m++)
1436 int nX = PtiTmp.
nGetX();
1437 int nY = PtiTmp.
nGetY();
1454 if (!
m_pRasterGrid->m_Cell[nX][nY].bBeachErosionOrDepositionThisIter())
1456 double dTmpElev =
m_pRasterGrid->m_Cell[nX][nY].dGetSedimentTopElev();
1457 double dDiff = VdParProfileDeanElev[m] - dTmpElev;
1459 dParProfTotDiff += dDiff;
1510 if (dParProfTotDiff >= dTargetToDepositOnProfile)
1521 double dDepositedOnProfile = 0;
1523 dStillToDepositOnProfile = dTargetToDepositOnProfile;
1524 for (
unsigned int nSeawardFromCoast = 0; nSeawardFromCoast < PtiVParProfile.size(); nSeawardFromCoast++)
1531 bEnoughDepositedOnPolygon =
true;
1546 int nX = PtiTmp.
nGetX();
1547 int nY = PtiTmp.
nGetY();
1564 if (!
m_pRasterGrid->m_Cell[nX][nY].bBeachErosionOrDepositionThisIter())
1567 double dThisElevNow =
m_pRasterGrid->m_Cell[nX][nY].dGetSedimentTopElev();
1572 double dElevDiff = VdParProfileDeanElev[nSeawardFromCoast] - dThisElevNow;
1577 bool bDeposited =
false;
1578 double dToDepositHere = 0;
1583 dToDepositHere =
tMin(dElevDiff, dStillToDepositOnProfile, dStillToDepositOnPoly);
1587 int nTopLayer =
m_pRasterGrid->m_Cell[nX][nY].nGetTopLayerAboveBasement();
1599 double dSandNow =
m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(nTopLayer)->pGetUnconsolidatedSediment()->dGetSandDepth();
1601 m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(nTopLayer)->pGetUnconsolidatedSediment()->SetSandDepth(dSandNow + dToDepositHere);
1606 dDepositedOnProfile += dToDepositHere;
1607 dDepositedOnPoly += dToDepositHere;
1612 m_pRasterGrid->m_Cell[nX][nY].IncrBeachDeposition(dToDepositHere);
1614 dStillToDepositOnPoly -= dToDepositHere;
1615 dStillToDepositOnProfile -= dToDepositHere;
1626 double dCoarseNow =
m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(nTopLayer)->pGetUnconsolidatedSediment()->dGetCoarseDepth();
1628 m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(nTopLayer)->pGetUnconsolidatedSediment()->SetCoarseDepth(dCoarseNow + dToDepositHere);
1633 if (dDepositedOnPoly > dTargetToDepositOnPoly)
1638 dDepositedOnProfile += dToDepositHere;
1639 dDepositedOnPoly += dToDepositHere;
1644 m_pRasterGrid->m_Cell[nX][nY].IncrBeachDeposition(dToDepositHere);
1646 dStillToDepositOnPoly -= dToDepositHere;
1647 dStillToDepositOnProfile -= dToDepositHere;
1680 m_pRasterGrid->m_Cell[nX][nY].SetPotentialBeachErosion(-dElevDiff);
1685 int nThisLayer =
m_pRasterGrid->m_Cell[nX][nY].nGetTopNonZeroLayerAboveBasement();
1696 double dSandRemoved = 0;
1700 dDepositedOnProfile -= dSandRemoved;
1701 dStillToDepositOnProfile += dSandRemoved;
1704 dDepositedOnPoly -= dSandRemoved;
1705 dStillToDepositOnPoly += dSandRemoved;
1723 double dCoarseRemoved = 0;
1727 dDepositedOnProfile -= dCoarseRemoved;
1728 dStillToDepositOnProfile += dCoarseRemoved;
1731 dDepositedOnPoly -= dCoarseRemoved;
1732 dStillToDepositOnPoly += dCoarseRemoved;