195int CSimulation::nDoCliffCollapse(
int const nCoast,
CRWCliff* pCliff,
double& dFineCollapse,
double& dSandCollapse,
double& dCoarseCollapse,
double& dPreCollapseCliffElev,
double& dPostCollapseCliffElev)
217 int nNotchLayer =
m_pRasterGrid->m_Cell[nX][nY].nGetLayerAtElev(dNotchElev);
221 LogStream <<
m_ulIter <<
": " <<
ERR <<
" cell [" << nX <<
"][" << nY <<
"] has dNotchElev (" << dNotchElev <<
") above sediment top elevation (" <<
m_pRasterGrid->m_Cell[nX][nY].dGetSedimentTopElev() <<
")" << endl;
229 int nTopLayer =
m_pRasterGrid->m_Cell[nX][nY].nGetTopLayerAboveBasement();
243 dPreCollapseCliffElev =
m_pRasterGrid->m_Cell[nX][nY].dGetSedimentTopElev();
246 double dAvailable = 0;
247 double dFineConsLost = 0;
248 double dFineUnconsLost = 0;
249 double dSandConsLost = 0;
250 double dSandUnconsLost = 0;
251 double dCoarseConsLost = 0;
252 double dCoarseUnconsLost = 0;
255 for (
int n = nTopLayer; n > nNotchLayer; n--)
258 dAvailable =
m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(n)->pGetUnconsolidatedSediment()->dGetFineDepth() -
m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(n)->pGetUnconsolidatedSediment()->dGetNotchFineLost();
261 dFineCollapse += dAvailable;
262 dFineUnconsLost += dAvailable;
263 m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(n)->pGetUnconsolidatedSediment()->SetFineDepth(0);
264 m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(n)->pGetUnconsolidatedSediment()->SetNotchFineLost(0);
267 dAvailable =
m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(n)->pGetUnconsolidatedSediment()->dGetSandDepth() -
m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(n)->pGetUnconsolidatedSediment()->dGetNotchSandLost();
270 dSandCollapse += dAvailable;
271 dSandUnconsLost += dAvailable;
272 m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(n)->pGetUnconsolidatedSediment()->SetSandDepth(0);
273 m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(n)->pGetUnconsolidatedSediment()->SetNotchSandLost(0);
276 dAvailable =
m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(n)->pGetUnconsolidatedSediment()->dGetCoarseDepth() -
m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(n)->pGetUnconsolidatedSediment()->dGetNotchCoarseLost();
279 dCoarseCollapse += dAvailable;
280 dCoarseUnconsLost += dAvailable;
281 m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(n)->pGetUnconsolidatedSediment()->SetCoarseDepth(0);
282 m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(n)->pGetUnconsolidatedSediment()->SetNotchCoarseLost(0);
286 dAvailable =
m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(n)->pGetConsolidatedSediment()->dGetFineDepth() -
m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(n)->pGetConsolidatedSediment()->dGetNotchFineLost();
289 dFineCollapse += dAvailable;
290 dFineConsLost += dAvailable;
291 m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(n)->pGetConsolidatedSediment()->SetFineDepth(0);
292 m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(n)->pGetConsolidatedSediment()->SetNotchFineLost(0);
295 dAvailable =
m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(n)->pGetConsolidatedSediment()->dGetSandDepth() -
m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(n)->pGetConsolidatedSediment()->dGetNotchSandLost();
298 dSandCollapse += dAvailable;
299 dSandConsLost += dAvailable;
300 m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(n)->pGetConsolidatedSediment()->SetSandDepth(0);
301 m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(n)->pGetConsolidatedSediment()->SetNotchSandLost(0);
304 dAvailable =
m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(n)->pGetConsolidatedSediment()->dGetCoarseDepth() -
m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(n)->pGetConsolidatedSediment()->dGetNotchCoarseLost();
307 dCoarseCollapse += dAvailable;
308 dCoarseConsLost += dAvailable;
309 m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(n)->pGetConsolidatedSediment()->SetCoarseDepth(0);
310 m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(n)->pGetConsolidatedSediment()->SetNotchCoarseLost(0);
315 double dNotchLayerTop =
m_pRasterGrid->m_Cell[nX][nY].dCalcLayerElev(nNotchLayer);
316 double dNotchLayerThickness =
m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(nNotchLayer)->dGetTotalThickness();
317 double dNotchLayerFracRemoved = (dNotchLayerTop - dNotchElev) / dNotchLayerThickness;
320 double dFineDepth =
m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(nNotchLayer)->pGetUnconsolidatedSediment()->dGetFineDepth();
321 dAvailable = dFineDepth -
m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(nNotchLayer)->pGetUnconsolidatedSediment()->dGetNotchFineLost();
325 double dLost = dAvailable * dNotchLayerFracRemoved;
326 dFineCollapse += dLost;
327 dFineUnconsLost += dLost;
328 m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(nNotchLayer)->pGetUnconsolidatedSediment()->SetFineDepth(dFineDepth - dLost);
329 m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(nNotchLayer)->pGetUnconsolidatedSediment()->SetNotchFineLost(0);
332 double dSandDepth =
m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(nNotchLayer)->pGetUnconsolidatedSediment()->dGetSandDepth();
333 dAvailable = dSandDepth -
m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(nNotchLayer)->pGetUnconsolidatedSediment()->dGetNotchSandLost();
337 double dLost = dAvailable * dNotchLayerFracRemoved;
338 dSandCollapse += dLost;
339 dSandUnconsLost += dLost;
340 m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(nNotchLayer)->pGetUnconsolidatedSediment()->SetSandDepth(dSandDepth - dLost);
341 m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(nNotchLayer)->pGetUnconsolidatedSediment()->SetNotchSandLost(0);
344 double dCoarseDepth =
m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(nNotchLayer)->pGetUnconsolidatedSediment()->dGetCoarseDepth();
345 dAvailable = dCoarseDepth -
m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(nNotchLayer)->pGetUnconsolidatedSediment()->dGetNotchCoarseLost();
349 double dLost = dAvailable * dNotchLayerFracRemoved;
350 dCoarseCollapse += dLost;
351 dCoarseUnconsLost += dLost;
352 m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(nNotchLayer)->pGetUnconsolidatedSediment()->SetCoarseDepth(dCoarseDepth - dLost);
353 m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(nNotchLayer)->pGetUnconsolidatedSediment()->SetNotchCoarseLost(0);
357 dFineDepth =
m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(nNotchLayer)->pGetConsolidatedSediment()->dGetFineDepth();
358 dAvailable = dFineDepth -
m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(nNotchLayer)->pGetConsolidatedSediment()->dGetNotchFineLost();
362 double dLost = dAvailable * dNotchLayerFracRemoved;
363 dFineCollapse += dLost;
364 dFineConsLost += dLost;
365 m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(nNotchLayer)->pGetConsolidatedSediment()->SetFineDepth(dFineDepth - dLost);
366 m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(nNotchLayer)->pGetConsolidatedSediment()->SetNotchFineLost(0);
369 dSandDepth =
m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(nNotchLayer)->pGetConsolidatedSediment()->dGetSandDepth();
370 dAvailable = dSandDepth -
m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(nNotchLayer)->pGetConsolidatedSediment()->dGetNotchSandLost();
374 double dLost = dAvailable * dNotchLayerFracRemoved;
375 dSandCollapse += dLost;
376 dSandConsLost += dLost;
377 m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(nNotchLayer)->pGetConsolidatedSediment()->SetSandDepth(dSandDepth - dLost);
378 m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(nNotchLayer)->pGetConsolidatedSediment()->SetNotchSandLost(0);
381 dCoarseDepth =
m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(nNotchLayer)->pGetConsolidatedSediment()->dGetCoarseDepth();
382 dAvailable = dCoarseDepth -
m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(nNotchLayer)->pGetConsolidatedSediment()->dGetNotchCoarseLost();
386 double dLost = dAvailable * dNotchLayerFracRemoved;
387 dCoarseCollapse += dLost;
388 dCoarseConsLost += dLost;
389 m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(nNotchLayer)->pGetConsolidatedSediment()->SetCoarseDepth(dCoarseDepth - dLost);
390 m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(nNotchLayer)->pGetConsolidatedSediment()->SetNotchCoarseLost(0);
394 m_pRasterGrid->m_Cell[nX][nY].IncrCliffCollapseErosion(dFineCollapse, dSandCollapse, dCoarseCollapse);
400 dPostCollapseCliffElev =
m_pRasterGrid->m_Cell[nX][nY].dGetSedimentTopElev();
445 int nCoastSize =
m_VCoast[nCoast].nGetCoastlineSize();
452 int nPoly =
m_pRasterGrid->m_Cell[nXCliff][nYCliff].nGetPolygonID();
467 if ((nTalusWidthInCells % 2) == 0)
468 nTalusWidthInCells++;
471 vector<int> VnTalusProfileCoastStartPoint(nCoastSize);
474 VnTalusProfileCoastStartPoint[0] = nStartPoint;
483 if ((nCount % 2) != 0)
484 nTmpPoint = nStartPoint + nSigned;
487 nTmpPoint = nStartPoint - nSigned;
492 if ((nTmpPoint < 0) || (nTmpPoint > (nCoastSize - 1)))
501 VnTalusProfileCoastStartPoint[nn] = nTmpPoint;
506 while (nn < nCoastSize);
508 bool bHitFirstCoastPoint =
false;
509 bool bHitLastCoastPoint =
false;
511 double dTotSandToDepositAllProfiles = dSandFromCollapse;
512 double dTotCoarseToDepositAllProfiles = dCoarseFromCollapse;
513 double dTotSandDepositedAllProfiles = 0;
514 double dTotCoarseDepositedAllProfiles = 0;
517 for (
int nAcross = 0; nAcross < nCoastSize; nAcross++)
519 bool bDoSandDepositionOnThisProfile =
false;
520 bool bSandDepositionCompletedOnThisProfile =
false;
521 bool bDoCoarseDepositionOnThisProfile =
false;
522 bool bCoarseDepositionCompletedOnThisProfile =
false;
530 double dTargetSandToDepositOnThisProfile = dTotSandToDepositAllProfiles / nTalusWidthInCells;
531 double dTargetCoarseToDepositOnThisProfile = dTotCoarseToDepositAllProfiles / nTalusWidthInCells;
536 double dSandProp = 0.5;
537 double dCoarseProp = 1 - dSandProp;
538 if (dTargetSandToDepositOnThisProfile + dTargetCoarseToDepositOnThisProfile > 0)
540 dSandProp = dTargetSandToDepositOnThisProfile / (dTargetSandToDepositOnThisProfile + dTargetCoarseToDepositOnThisProfile);
541 dCoarseProp = 1 - dSandProp;
544 double dSandDepositedOnThisProfile = 0;
545 double dCoarseDepositedOnThisProfile = 0;
547 if (dTotSandToDepositAllProfiles > 0)
549 bDoSandDepositionOnThisProfile =
true;
552 bSandDepositionCompletedOnThisProfile =
true;
555 bSandDepositionCompletedOnThisProfile =
true;
557 if (dTotCoarseToDepositAllProfiles > 0)
559 bDoCoarseDepositionOnThisProfile =
true;
562 bCoarseDepositionCompletedOnThisProfile =
true;
565 bCoarseDepositionCompletedOnThisProfile =
true;
567 if (bSandDepositionCompletedOnThisProfile && bCoarseDepositionCompletedOnThisProfile)
569 LogStream <<
m_ulIter <<
": break 2 for cliff collapse at [" << nXCliff <<
"][" << nYCliff <<
"] nStartPoint = " << nStartPoint <<
" nAcross = " << nAcross << endl <<
"\tdTargetSandToDepositOnThisProfile = " << dTargetSandToDepositOnThisProfile <<
" dSandDepositedOnThisProfile = " << dSandDepositedOnThisProfile <<
" dTotSandToDepositAllProfiles = " << dTotSandToDepositAllProfiles <<
" dTotSandDepositedAllProfiles = " << dTotSandDepositedAllProfiles << endl <<
"\tdTargetCoarseToDepositOnThisProfile = " << dTargetCoarseToDepositOnThisProfile <<
" dCoarseDepositedOnThisProfile = " << dCoarseDepositedOnThisProfile <<
" dTotCoarseToDepositAllProfiles = " << dTotCoarseToDepositAllProfiles <<
" dTotCoarseDepositedAllProfiles = " << dTotCoarseDepositedAllProfiles << endl;
575 int nThisPoint = VnTalusProfileCoastStartPoint[nAcross];
579 bHitFirstCoastPoint =
true;
581 if (nThisPoint == nCoastSize-1)
582 bHitLastCoastPoint =
true;
594 bool bJustDepositWhatWeCan =
false;
597 int nSeawardOffset = 1;
602 if (bJustDepositWhatWeCan || (bSandDepositionCompletedOnThisProfile && bCoarseDepositionCompletedOnThisProfile))
604 LogStream <<
m_ulIter <<
": break 3 for cliff collapse at [" << nXCliff <<
"][" << nYCliff <<
"] nStartPoint = " << nStartPoint <<
" nThisPoint = " << nThisPoint << endl <<
"\tnSeawardOffset = " << nSeawardOffset <<
" dCliffHeightFrac = " << dCliffHeightFrac <<
" nAcross = " << nAcross << endl <<
"\tbJustDepositWhatWeCan = " << bJustDepositWhatWeCan <<
"\tdTargetSandToDepositOnThisProfile = " << dTargetSandToDepositOnThisProfile <<
" dSandDepositedOnThisProfile = " << dSandDepositedOnThisProfile <<
" dTotSandToDepositAllProfiles = " << dTotSandToDepositAllProfiles <<
" dTotSandDepositedAllProfiles = " << dTotSandDepositedAllProfiles << endl <<
"\tdTargetCoarseToDepositOnThisProfile = " << dTargetCoarseToDepositOnThisProfile <<
" dCoarseDepositedOnThisProfile = " << dCoarseDepositedOnThisProfile <<
" dTotCoarseToDepositAllProfiles = " << dTotCoarseToDepositAllProfiles <<
" dTotCoarseDepositedAllProfiles = " << dTotCoarseDepositedAllProfiles << endl;
616 if (dCliffHeightFrac < 1)
629 bJustDepositWhatWeCan =
true;
640 dCliffHeightFrac = 1;
645 if (bHitFirstCoastPoint && bHitLastCoastPoint)
648 LogStream <<
m_ulIter <<
": unable to deposit sufficient unconsolidated talus from cliff collapse at [" << nXCliff <<
"][" << nYCliff <<
"] nStartPoint = " << nStartPoint <<
" nThisPoint = " << nThisPoint << endl <<
"\tnSeawardOffset = " << nSeawardOffset <<
" dCliffHeightFrac = " << dCliffHeightFrac <<
" nAcross = " << nAcross << endl <<
"\tdTargetSandToDepositOnThisProfile = " << dTargetSandToDepositOnThisProfile <<
" dSandDepositedOnThisProfile = " << dSandDepositedOnThisProfile <<
" dTotSandToDepositAllProfiles = " << dTotSandToDepositAllProfiles <<
" dTotSandDepositedAllProfiles = " << dTotSandDepositedAllProfiles << endl <<
"\tdTargetCoarseToDepositOnThisProfile = " << dTargetCoarseToDepositOnThisProfile <<
" dCoarseDepositedOnThisProfile = " << dCoarseDepositedOnThisProfile <<
" dTotCoarseToDepositAllProfiles = " << dTotCoarseToDepositAllProfiles <<
" dTotCoarseDepositedAllProfiles = " << dTotCoarseDepositedAllProfiles << endl;
654 double dThisProfileLength = (nTalusProfileLenInCells + nSeawardOffset + 1) *
m_dCellSide;
658 int nRtn =
nGetCoastNormalEndPoint(nCoast, nThisPoint, nCoastSize, &PtStart, dThisProfileLength, &PtEnd, &PtiEnd,
false);
663 LogStream <<
m_ulIter <<
": unable to deposit sufficient unconsolidated talus from cliff collapse, could not find a solution for the end point of the Dean profile" << endl;
669 if (PtStart == PtEnd)
678 vector<CGeom2DPoint> VTmpProfile;
679 VTmpProfile.push_back(PtStart);
680 VTmpProfile.push_back(PtEnd);
681 vector<CGeom2DIPoint> VCellsUnderProfile;
686 int nRasterProfileLength =
static_cast<int>(VCellsUnderProfile.size());
689 if (nRasterProfileLength - nSeawardOffset < 3)
694 else if (nRasterProfileLength - nSeawardOffset == 3)
697 bJustDepositWhatWeCan =
true;
700 vector<double> dVProfileNow(nRasterProfileLength, 0);
701 vector<bool> bVProfileValid(nRasterProfileLength,
true);
703 LogStream <<
m_ulIter <<
": for cliff collapse at [" << nXCliff <<
"][" << nYCliff <<
"] nStartPoint = " << nStartPoint <<
" nAcross = " << nAcross << endl <<
"\tnRasterProfileLength = " << nRasterProfileLength <<
" nSeawardOffset = " << nSeawardOffset <<
" nRasterProfileLength - nSeawardOffset - 2 = " << nRasterProfileLength - nSeawardOffset - 2 << endl;
706 for (
int n = 0; n < nRasterProfileLength; n++)
708 int nX = VCellsUnderProfile[n].nGetX();
709 int nY = VCellsUnderProfile[n].nGetY();
711 dVProfileNow[n] =
m_pRasterGrid->m_Cell[nX][nY].dGetSedimentTopElev();
715 bVProfileValid[n] =
false;
719 double dCliffHeight = dPreCollapseCliffElev - dPostCollapseCliffElev;
720 double dTalusTopElev = dPostCollapseCliffElev + (dCliffHeight * dCliffHeightFrac);
722 LogStream <<
"Elevations: cliff top = " << dPreCollapseCliffElev <<
" cliff base = " << dPostCollapseCliffElev <<
" talus top = " << dTalusTopElev << endl;
728 double dTalusSlopeLength = dThisProfileLength - ((nSeawardOffset - 1) *
m_dCellSide);
735 dA = (dTalusTopElev - dVProfileNow[nRasterProfileLength - 1]) / pow(dTalusSlopeLength,
DEAN_POWER);
738 double dInc = dTalusSlopeLength / (nRasterProfileLength - nSeawardOffset - 2);
739 vector<double> dVDeanProfile(nRasterProfileLength);
742 CalcDeanProfile(&dVDeanProfile, dInc, dTalusTopElev, dA,
true, nSeawardOffset, dTalusTopElev);
745 double dTotElevDiff =
dSubtractProfiles(&dVDeanProfile, &dVProfileNow, &bVProfileValid);
776 if (! bJustDepositWhatWeCan && (dTotElevDiff < (dTargetSandToDepositOnThisProfile + dTargetCoarseToDepositOnThisProfile)))
785 for (
int n = 0; n < nRasterProfileLength; n++)
788 if (bDoSandDepositionOnThisProfile)
791 bSandDepositionCompletedOnThisProfile =
true;
793 bSandDepositionCompletedOnThisProfile =
false;
797 if (bDoCoarseDepositionOnThisProfile)
800 bCoarseDepositionCompletedOnThisProfile =
true;
802 bCoarseDepositionCompletedOnThisProfile =
false;
806 if (bSandDepositionCompletedOnThisProfile && bCoarseDepositionCompletedOnThisProfile)
808 LogStream <<
m_ulIter <<
": break 1 for cliff collapse at [" << nXCliff <<
"][" << nYCliff <<
"] nStartPoint = " << nStartPoint <<
" nThisPoint = " << nThisPoint << endl <<
"\tbJustDepositWhatWeCan = " << bJustDepositWhatWeCan <<
" nSeawardOffset = " << nSeawardOffset <<
" dCliffHeightFrac = " << dCliffHeightFrac <<
" nAcross = " << nAcross << endl <<
"\tdTargetSandToDepositOnThisProfile = " << dTargetSandToDepositOnThisProfile <<
" dSandDepositedOnThisProfile = " << dSandDepositedOnThisProfile <<
" dTotSandToDepositAllProfiles = " << dTotSandToDepositAllProfiles <<
" dTotSandDepositedAllProfiles = " << dTotSandDepositedAllProfiles << endl <<
"\tdTargetCoarseToDepositOnThisProfile = " << dTargetCoarseToDepositOnThisProfile <<
" dCoarseDepositedOnThisProfile = " << dCoarseDepositedOnThisProfile <<
" dTotCoarseToDepositAllProfiles = " << dTotCoarseToDepositAllProfiles <<
" dTotCoarseDepositedAllProfiles = " << dTotCoarseDepositedAllProfiles << endl;
814 int nX = VCellsUnderProfile[n].nGetX();
815 int nY = VCellsUnderProfile[n].nGetY();
821 int nTopLayer =
m_pRasterGrid->m_Cell[nX][nY].nGetTopNonZeroLayerAboveBasement();
830 cerr <<
"All layers have zero thickness" << endl;
835 if (dVDeanProfile[n] > dVProfileNow[n])
838 double dSandToDeposit = 0;
839 if (bDoSandDepositionOnThisProfile)
841 dSandToDeposit = (dVDeanProfile[n] - dVProfileNow[n]) * dSandProp;
842 dSandToDeposit =
tMin(dSandToDeposit, (dTargetSandToDepositOnThisProfile - dSandDepositedOnThisProfile), (dTotSandToDepositAllProfiles - dTotSandDepositedAllProfiles));
844 m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(nTopLayer)->pGetUnconsolidatedSediment()->AddSandDepth(dSandToDeposit);
849 dSandDepositedOnThisProfile += dSandToDeposit;
850 dTotSandDepositedAllProfiles += dSandToDeposit;
853 double dCoarseToDeposit = 0;
854 if (bDoCoarseDepositionOnThisProfile)
856 dCoarseToDeposit = (dVDeanProfile[n] - dVProfileNow[n]) * dCoarseProp;
857 dCoarseToDeposit =
tMin(dCoarseToDeposit, (dTargetCoarseToDepositOnThisProfile - dCoarseDepositedOnThisProfile), (dTotCoarseToDepositAllProfiles - dTotCoarseDepositedAllProfiles));
859 m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(nTopLayer)->pGetUnconsolidatedSediment()->AddCoarseDepth(dCoarseToDeposit);
864 dCoarseDepositedOnThisProfile += dCoarseToDeposit;
865 dTotCoarseDepositedAllProfiles += dCoarseToDeposit;
875 m_pRasterGrid->m_Cell[nX][nY].AddSandTalusDeposition(dSandToDeposit);
876 m_pRasterGrid->m_Cell[nX][nY].AddCoarseTalusDeposition(dCoarseToDeposit);
886 else if (dVDeanProfile[n] < dVProfileNow[n])
889 double dThisLowering = dVProfileNow[n] - dVDeanProfile[n];
892 double dExistingAvailableFine =
m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(nTopLayer)->pGetUnconsolidatedSediment()->dGetFineDepth();
893 double dExistingAvailableSand =
m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(nTopLayer)->pGetUnconsolidatedSediment()->dGetSandDepth();
894 double dExistingAvailableCoarse =
m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(nTopLayer)->pGetUnconsolidatedSediment()->dGetCoarseDepth();
897 int nFineWeight = (dExistingAvailableFine > 0 ? 1 : 0);
898 int nSandWeight = (dExistingAvailableSand > 0 ? 1 : 0);
899 int nCoarseWeight = (dExistingAvailableCoarse > 0 ? 1 : 0);
909 double dFine =
tMin(dExistingAvailableFine, dFineLowering);
910 double dRemaining = dExistingAvailableFine - dFine;
913 m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(nTopLayer)->pGetUnconsolidatedSediment()->SetFineDepth(dRemaining);
933 double dSandToErode =
tMin(dExistingAvailableSand, dSandLowering);
934 double dRemaining = dExistingAvailableSand - dSandToErode;
937 m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(nTopLayer)->pGetUnconsolidatedSediment()->SetSandDepth(dRemaining);
946 dTargetSandToDepositOnThisProfile += dSandToErode;
947 dTotSandToDepositAllProfiles += dSandToErode;
961 double dCoarseToErode =
tMin(dExistingAvailableCoarse, dCoarseLowering);
962 double dRemaining = dExistingAvailableCoarse - dCoarseToErode;
965 m_pRasterGrid->m_Cell[nX][nY].pGetLayerAboveBasement(nTopLayer)->pGetUnconsolidatedSediment()->SetCoarseDepth(dRemaining);
974 dTargetCoarseToDepositOnThisProfile += dCoarseToErode;
975 dTotCoarseToDepositAllProfiles += dCoarseToErode;
996 LogStream <<
m_ulIter <<
": left seaward offset loop for cliff collapse at [" << nXCliff <<
"][" << nYCliff <<
"] nStartPoint = " << nStartPoint <<
" nThisPoint = " << nThisPoint << endl <<
"\tnSeawardOffset = " << nSeawardOffset <<
" dCliffHeightFrac = " << dCliffHeightFrac <<
" nAcross = " << nAcross <<
" bJustDepositWhatWeCan = " << bJustDepositWhatWeCan << endl <<
"\tdTargetSandToDepositOnThisProfile = " << dTargetSandToDepositOnThisProfile <<
" dSandDepositedOnThisProfile = " << dSandDepositedOnThisProfile <<
" dTotSandToDepositAllProfiles = " << dTotSandToDepositAllProfiles <<
" dTotSandDepositedAllProfiles = " << dTotSandDepositedAllProfiles << endl <<
"\tdTargetCoarseToDepositOnThisProfile = " << dTargetCoarseToDepositOnThisProfile <<
" dCoarseDepositedOnThisProfile = " << dCoarseDepositedOnThisProfile <<
" dTotCoarseToDepositAllProfiles = " << dTotCoarseToDepositAllProfiles <<
" dTotCoarseDepositedAllProfiles = " << dTotCoarseDepositedAllProfiles << endl;
999 if (bDoSandDepositionOnThisProfile)
1002 bSandDepositionCompletedOnThisProfile =
true;
1005 if (bDoCoarseDepositionOnThisProfile)
1008 bCoarseDepositionCompletedOnThisProfile =
true;
1011 if (bSandDepositionCompletedOnThisProfile && bCoarseDepositionCompletedOnThisProfile)
1013 LogStream <<
m_ulIter <<
": bSandDepositionCompletedOnThisProfile && bCoarseDepositionCompletedOnThisProfile for cliff collapse at [" << nXCliff <<
"][" << nYCliff <<
"] nStartPoint = " << nStartPoint <<
" nThisPoint = " << nThisPoint << endl <<
"\tnbJustDepositWhatWeCan = " << bJustDepositWhatWeCan <<
" SeawardOffset = " << nSeawardOffset <<
" dCliffHeightFrac = " << dCliffHeightFrac <<
" nAcross = " << nAcross << endl <<
"\tdTargetSandToDepositOnThisProfile = " << dTargetSandToDepositOnThisProfile <<
" dSandDepositedOnThisProfile = " << dSandDepositedOnThisProfile <<
" dTotSandToDepositAllProfiles = " << dTotSandToDepositAllProfiles <<
" dTotSandDepositedAllProfiles = " << dTotSandDepositedAllProfiles << endl <<
"\tdTargetCoarseToDepositOnThisProfile = " << dTargetCoarseToDepositOnThisProfile <<
" dCoarseDepositedOnThisProfile = " << dCoarseDepositedOnThisProfile <<
" dTotCoarseToDepositAllProfiles = " << dTotCoarseToDepositAllProfiles <<
" dTotCoarseDepositedAllProfiles = " << dTotCoarseDepositedAllProfiles << endl;
1019 LogStream <<
ERR <<
m_ulIter <<
": non-zero dTotSandToDepositAllProfiles = " << dTotSandToDepositAllProfiles << endl;
1023 LogStream <<
ERR <<
m_ulIter <<
": non-zero dTotCoarseToDepositAllProfiles = " << dTotCoarseToDepositAllProfiles << endl;
1034 LogStream <<
"\tdTotSandToDepositAllProfiles = " << dTotSandToDepositAllProfiles <<
" dTotSandDepositedAllProfiles = " << dTotSandDepositedAllProfiles << endl;
1035 LogStream <<
"\tdTotCoarseToDepositAllProfiles = " << dTotCoarseToDepositAllProfiles <<
" dTotCoarseDepositedAllProfiles = " << dTotCoarseDepositedAllProfiles << endl;
1036 LogStream << endl <<
"****************************************" << endl << endl;