CoastalME (Coastal Modelling Environment)
Simulates the long-term behaviour of complex coastlines
Loading...
Searching...
No Matches
multiple_coastlines.cpp
Go to the documentation of this file.
1
12
13/* ===============================================================================================================================
14
15 This file is part of CoastalME, the Coastal Modelling Environment.
16
17 CoastalME is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version.
18
19 This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
20
21 You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22
23===============================================================================================================================*/
24#include <assert.h>
25
26#include <iostream>
27using std::endl;
28
29#include "simulation.h"
30#include "coast.h"
31
32class CRWCoast; // Forward declaration
33
34//===============================================================================================================================
36//===============================================================================================================================
38{
39 // Check all coastlines
40 for (int nCoast = 0; nCoast < static_cast<int>(m_VCoast.size()); nCoast++)
41 {
42 // Check all profiles
43 for (int n = 0; n < m_VCoast[nCoast].nGetNumProfiles(); n++)
44 {
45 CGeomProfile* pProfile = m_VCoast[nCoast].pGetProfileWithDownCoastSeq(n);
46 int nProfile = pProfile->nGetProfileID();
47 bool bCoastStart = pProfile->bStartOfCoast();
48 bool bCoastEnd = pProfile->bEndOfCoast();
49
50 // Check every cell that is 'under' this profile
51 for (int nCell = 0; nCell < pProfile->nGetNumCellsInProfile(); nCell++)
52 {
53 CGeom2DIPoint* pCell = pProfile->pPtiGetCellInProfile(nCell);
54 int nX = pCell->nGetX();
55 int nY = pCell->nGetY();
56
57 // Have we hit a cell which is 'under' a coast-normal profile belonging to another coast? NOTE Is a problem if get more than two coast normals passing through this cell
58 int nHitProfileCoast = m_pRasterGrid->m_Cell[nX][nY].nGetProfileCoastID();
59 if ((nHitProfileCoast != INT_NODATA) && (nHitProfileCoast != nCoast))
60 {
61 // Yes, we have hit a profile which belongs to a different coast
62 int nHitProfile = m_pRasterGrid->m_Cell[nX][nY].nGetProfileID();
63
64 // Truncate both profiles
65 int nRtn = nTruncateProfilesDifferentCoasts(nCoast, nProfile, nCell, nHitProfileCoast, nHitProfile, nX, nY, bCoastStart, bCoastEnd);
66 if (nRtn != RTN_OK)
67 return nRtn;
68 }
69 else
70 {
71 // Now try an adjacent point, does not matter wehich one NOTE Is a problem if get more than two coast normals passing through this cell
72 nHitProfileCoast = m_pRasterGrid->m_Cell[nX][nY+1].nGetProfileCoastID();
73 if ((nHitProfileCoast != INT_NODATA) && (nHitProfileCoast != nCoast))
74 {
75 // Yes, we have hit a profile which belongs to a different coast
76 int nHitProfile = m_pRasterGrid->m_Cell[nX][nY+1].nGetProfileID();
77
78 // Truncate both profiles
79 int nRtn = nTruncateProfilesDifferentCoasts(nCoast, nProfile, nCell, nHitProfileCoast, nHitProfile, nX, nY+1, bCoastStart, bCoastEnd);
80 if (nRtn != RTN_OK)
81 return nRtn;
82 }
83 }
84
85 // Have we hit a cell which is 'under' another coast?
86 if (m_pRasterGrid->m_Cell[nX][nY].bIsCoastline())
87 {
88 // Yes this is a coastline cell, as well as a coast-normal profile cell
89 int nHitCoast = m_pRasterGrid->m_Cell[nX][nY].nGetCoastline();
90 if (nHitCoast != nCoast)
91 {
92 // We have hit a different coastline, so truncate this profile
93 int nRtn = nTruncateProfileHitDifferentCoast(nCoast, nProfile, nCell, nX, nY, bCoastStart, bCoastEnd);
94 if (nRtn != RTN_OK)
95 return nRtn;
96 }
97 }
98 else
99 {
100 // We also need to check an adjacent cell, doesn't matter which one
101 if (m_pRasterGrid->m_Cell[nX][nY+1].bIsCoastline())
102 {
103 // Yes this is a coastline cell, as well as a coast-normal profile cell
104 int nHitCoast = m_pRasterGrid->m_Cell[nX][nY+1].nGetCoastline();
105 if (nHitCoast != nCoast)
106 {
107 // We have hit a different coastline, so truncate this profile
108 int nRtn = nTruncateProfileHitDifferentCoast(nCoast, nProfile, nCell, nX, nY, bCoastStart, bCoastEnd);
109 if (nRtn != RTN_OK)
110 return nRtn;
111 }
112 }
113 }
114 }
115 }
116 }
117
118 return RTN_OK;
119}
120
121//===============================================================================================================================
123//===============================================================================================================================
124int CSimulation::nTruncateProfilesDifferentCoasts(int const nCoast, int const nProfile, int nCell, int const nHitProfileCoast, int const nHitProfile, int nX, int nY, bool const bStartCoastEdgeProfile, bool const bEndCoastEdgeProfile)
125{
126 if ((nProfile == INT_NODATA) || (nHitProfile == INT_NODATA))
127 {
128 // Should never happen
130 }
131
132 // OK, get pointers to 'this' profile and to the hit profile
133 CGeomProfile* pProfile = m_VCoast[nCoast].pGetProfile(nProfile);
134 CGeomProfile* pHitProfile = m_VCoast[nHitProfileCoast].pGetProfile(nHitProfile);
135
136 // Get details of the cells in this profile
137 vector<CGeom2DIPoint>* pVProfileCells = pProfile->pPtiVGetCellsInProfile();
138 int nProfileLen = static_cast<int>(pVProfileCells->size());
139
140 // Are either of the profiles grid-edge profiles?
141 bool bProfileGridEdge = false;
142 bool bHitProfileGridEdge = false;
143 if (pProfile->bStartOfCoast() || pProfile->bEndOfCoast())
144 bProfileGridEdge = true;
145 if (pHitProfile->bStartOfCoast() || pHitProfile->bEndOfCoast())
146 bHitProfileGridEdge = true;
147
148 // Are both profiles grid-edge profiles?
149 if (bProfileGridEdge && bHitProfileGridEdge)
150 {
151 // Yes, so we need to treat these profiles differently. Get the start point of each profile
152 CGeom2DIPoint* pPtiProfileStart = pProfile->pPtiGetStartPoint();
153 CGeom2DIPoint* pPtiHitProfileStart = pHitProfile->pPtiGetStartPoint();
154
155 // And get the distance between these
156 double dDist = dGetDistanceBetween(pPtiProfileStart, pPtiHitProfileStart);
157 nCell = static_cast<int>(dDist - GAP_BETWEEN_DIFFERENT_COAST_PROFILES);
158
159 // Safety check
160 nCell = tMax(nCell, 0);
161
162 // Finally get the grid CRS location of the new profile endpoint
163 nX = pVProfileCells->at(nCell).nGetX();
164 nY = pVProfileCells->at(nCell).nGetY();
165 }
166
167 // Calculate the truncated length of the list of cells in 'this' profile
168 int nProfileNewLen = tMax(nCell - GAP_BETWEEN_DIFFERENT_COAST_PROFILES, MIN_PROFILE_SIZE);
169
170 // Next unmark the cells that will no longer be 'under' the profile
171 for (int nn = nProfileNewLen-1; nn < nProfileLen; nn++)
172 {
173 int nXThis = pVProfileCells->at(nn).nGetX();
174 int nYThis = pVProfileCells->at(nn).nGetY();
175
176 if ((m_pRasterGrid->m_Cell[nXThis][nYThis].nGetProfileID() == nProfile) && (m_pRasterGrid->m_Cell[nXThis][nYThis].nGetProfileCoastID() == nCoast))
177 m_pRasterGrid->m_Cell[nXThis][nYThis].SetCoastAndProfileID(INT_NODATA, INT_NODATA);
178 }
179
180 // And truncate the list of cells in the profile
181 pVProfileCells->resize(nProfileNewLen);
182 pProfile->SetCellsInProfile(pVProfileCells);
183
184 // Set the profile's end point (grid CRS)
185 CGeom2DIPoint PtiLast = pVProfileCells->back();
186 pProfile->SetEndPoint(&PtiLast);
187
188 // Now truncate the profile's CGeomMultiLine (external CRS)
189 int nRtn = nTruncateProfileMultiLineDifferentCoasts(pProfile, nX, nY);
190 if (nRtn != RTN_OK)
191 return nRtn;
192
193 // And flag as truncated
194 pProfile->SetTruncatedDifferentCoast(true);
195
197 {
198 string strTmp;
199 if (bStartCoastEdgeProfile || bEndCoastEdgeProfile)
200 {
201 strTmp += " grid-edge ";
202
203 if (bStartCoastEdgeProfile)
204 strTmp += "start";
205
206 if (bEndCoastEdgeProfile)
207 strTmp += "end";
208 }
209
210 LogStream << m_ulIter << ": coast " << nCoast << strTmp << " profile " << nProfile << " hit profile belonging to another coast at [" << nX << "][" << nY << "] = {" << dGridCentroidXToExtCRSX(nX) << ", " << dGridCentroidYToExtCRSY(nY) << "}. Profile truncated, length of profile " << nProfile << " was " << nProfileLen << " cells, is now " << nProfileNewLen << " cells." << endl;
211 }
212
213 // Get details of the cells in the hit profile
214 vector<CGeom2DIPoint>* pVHitProfileCells = pHitProfile->pPtiVGetCellsInProfile();
215 int nHitProfileLen = static_cast<int>(pVHitProfileCells->size());
216
217 int nHitCell = pHitProfile->nGetIndexOfCellInProfile(nX, nY);
218 if (nHitCell == INT_NODATA)
220
221 // Calculate the truncated length of the list of cells in the hit profile
222 int nHitProfileNewLen = tMax(nHitCell - GAP_BETWEEN_DIFFERENT_COAST_PROFILES, MIN_PROFILE_SIZE);
223
224 // Next unmark the cells that will no longer be 'under' the hit profile
225 for (int nn = nHitProfileNewLen-1; nn < nHitProfileLen; nn++)
226 {
227 int nXThis = pVHitProfileCells->at(nn).nGetX();
228 int nYThis = pVHitProfileCells->at(nn).nGetY();
229
230 if ((m_pRasterGrid->m_Cell[nXThis][nYThis].nGetProfileID() == nHitProfile) && (m_pRasterGrid->m_Cell[nXThis][nYThis].nGetProfileCoastID() == nHitProfileCoast))
231 m_pRasterGrid->m_Cell[nXThis][nYThis].SetCoastAndProfileID(INT_NODATA, INT_NODATA);
232 }
233
234 // And truncate the hit profile
235 pVHitProfileCells->resize(nHitProfileNewLen);
236 pHitProfile->SetCellsInProfile(pVHitProfileCells);
237
238 // Set the hit profile's end point (grid CRS)
239 PtiLast = pVHitProfileCells->back();
240 pHitProfile->SetEndPoint(&PtiLast);
241
242 // Now truncate the profile's CGeomMultiLine (external CRS)
243 nRtn = nTruncateProfileMultiLineDifferentCoasts(pProfile, nX, nY);
244 if (nRtn != RTN_OK)
245 return nRtn;
246
247 // And flag as truncated
248 pHitProfile->SetTruncatedDifferentCoast(true);
249
251 {
252 string strTmp;
253 if (bStartCoastEdgeProfile || bEndCoastEdgeProfile)
254 {
255 strTmp += " grid-edge ";
256
257 if (bStartCoastEdgeProfile)
258 strTmp += "start";
259
260 if (bEndCoastEdgeProfile)
261 strTmp += "end";
262 }
263
264 LogStream << m_ulIter << ": coast " << nHitProfileCoast << strTmp << " profile " << nHitProfile << " also truncated, length of profile " << nHitProfile << " was " << nHitProfileLen << " cells, is now " << nHitProfileNewLen << " cells." << endl;
265 }
266
267 // // DEBUG CODE ================
268 // m_nGISSave++;
269 // if (! bWriteVectorGISFile(VECTOR_PLOT_COAST, &VECTOR_PLOT_COAST_TITLE))
270 // return false;
271 // if (! bWriteVectorGISFile(VECTOR_PLOT_NORMALS, &VECTOR_PLOT_NORMALS_TITLE))
272 // return false;
273 // if (! bWriteVectorGISFile(VECTOR_PLOT_INVALID_NORMALS, &VECTOR_PLOT_INVALID_NORMALS_TITLE))
274 // return false;
275 // if (! bWriteRasterGISFile(RASTER_PLOT_NORMAL_PROFILE, &RASTER_PLOT_NORMAL_PROFILE_TITLE))
276 // return false;
277 // if (! bWriteRasterGISFile(RASTER_PLOT_POLYGON, &RASTER_PLOT_POLYGON_TITLE))
278 // return false;
279 // // DEBUG CODE ================
280
281 return RTN_OK;
282}
283
284//===============================================================================================================================
286//===============================================================================================================================
287int CSimulation::nTruncateProfileHitDifferentCoast(int const nCoast, int const nProfile, int const nCell, int const nX, int const nY, bool const bStartCoastEdgeProfile, bool const bEndCoastEdgeProfile)
288{
289 // OK, get a pointer to 'this' profile
290 CGeomProfile* pProfile = m_VCoast[nCoast].pGetProfile(nProfile);
291
292 // Now get details of the cells in this profile
293 vector<CGeom2DIPoint>* pVProfileCells = pProfile->pPtiVGetCellsInProfile();
294 int nProfileLen = static_cast<int>(pVProfileCells->size());
295
296 // Calculate the truncated length of the list of cells in 'this' profile
297 int nProfileNewLen = tMax(nCell - GAP_BETWEEN_DIFFERENT_COAST_PROFILES, MIN_PROFILE_SIZE);
298
299 // Get the lengths of the adjacent, this-coast, profiles
300 CGeomProfile* pUpCoastProfile = pProfile->pGetUpCoastAdjacentProfile();
301 CGeomProfile* pDownCoastProfile = pProfile->pGetDownCoastAdjacentProfile();
302 int nUpCoastProfileLen = INT_NODATA;
303 int nDownCoastProfileLen = INT_NODATA;
304 if (pUpCoastProfile != NULL)
305 nUpCoastProfileLen = pUpCoastProfile->nGetNumCellsInProfile();
306 if (pDownCoastProfile != NULL)
307 nDownCoastProfileLen = pDownCoastProfile->nGetNumCellsInProfile();
308
309 // And calculate the average length of adjacent profiles
310 int nAvgAdjacentProfileLen;
311 if (pUpCoastProfile == NULL)
312 nAvgAdjacentProfileLen = nDownCoastProfileLen;
313 else if (pDownCoastProfile == NULL)
314 nAvgAdjacentProfileLen = nUpCoastProfileLen;
315 else
316 nAvgAdjacentProfileLen = (nUpCoastProfileLen + nDownCoastProfileLen) / 2;
317
318 // Use the average length of adjacent profiles to further truncated this profile, if necessary
319 nProfileNewLen = tMin(nProfileNewLen, nAvgAdjacentProfileLen);
320
321 // We have the new profile length so next unmark the cells that will no longer be 'under' the profile
322 for (int nn = nProfileNewLen-1; nn < nProfileLen; nn++)
323 {
324 int nXThis = pVProfileCells->at(nn).nGetX();
325 int nYThis = pVProfileCells->at(nn).nGetY();
326
327 if ((m_pRasterGrid->m_Cell[nXThis][nYThis].nGetProfileID() == nProfile) && (m_pRasterGrid->m_Cell[nXThis][nYThis].nGetProfileCoastID() == nCoast))
328 m_pRasterGrid->m_Cell[nXThis][nYThis].SetCoastAndProfileID(INT_NODATA, INT_NODATA);
329 }
330
331 // And truncate the list of cells in the profile
332 pVProfileCells->resize(nProfileNewLen);
333 pProfile->SetCellsInProfile(pVProfileCells);
334
335 // Set the profile's end point (grid CRS)
336 CGeom2DIPoint PtiLast = pVProfileCells->back();
337 pProfile->SetEndPoint(&PtiLast);
338
339 // Now truncate the profile's CGeomMultiLine (external CRS)
340 int nRtn = nTruncateProfileMultiLineDifferentCoasts(pProfile, nX, nY);
341 if (nRtn != RTN_OK)
342 return nRtn;
343
344 // And flag as truncated
345 pProfile->SetTruncatedDifferentCoast(true);
346
348 {
349 string strTmp;
350 if (bStartCoastEdgeProfile || bEndCoastEdgeProfile)
351 {
352 strTmp += " grid-edge ";
353
354 if (bStartCoastEdgeProfile)
355 strTmp += "start";
356
357 if (bEndCoastEdgeProfile)
358 strTmp += "end";
359 }
360
361 LogStream << m_ulIter << ": coast " << nCoast << strTmp << " profile " << nProfile << " hit another coast at [" << nX << "][" << nY << "] = {" << dGridCentroidXToExtCRSX(nX) << ", " << dGridCentroidYToExtCRSY(nY) << "}. Profile truncated, length of profile " << nProfile << " was " << nProfileLen << " cells, is now " << nProfileNewLen << " cells." << endl;
362 }
363
364
365 // DEBUG CODE ================
366 m_nGISSave++;
368 return false;
370 return false;
372 return false;
374 return false;
376 return false;
377 // DEBUG CODE ================
378
379 return RTN_OK;
380}
381
382//===============================================================================================================================
384//===============================================================================================================================
386{
387 // Find which multiline line segment 'contains' this extCRS end point, then truncate at this point
388 bool bFound = false;
389
390 int const nProfileLineSegments = pProfile->CGeomMultiLine::nGetNumLineSegments();
391 for (int nSeg = 0; nSeg < nProfileLineSegments; nSeg++)
392 {
393 // Search each segment
394 int nNumCoinc = pProfile->CGeomMultiLine::nGetNumCoincidentProfilesInLineSegment(nSeg);
395 for (int nCoinc = 0; nCoinc < nNumCoinc; nCoinc++)
396 {
397 vector<CGeom2DPoint>& pVPt = pProfile->CGeomMultiLine::pGetPoints();
398
399 for (int nLin = 0; nLin < static_cast<int>(pVPt.size())-1; nLin++)
400 {
401 double dX1 = pVPt[nLin].dGetX();
402 double dY1 = pVPt[nLin].dGetY();
403 double dX2 = pVPt[nLin+1].dGetX();
404 double dY2 = pVPt[nLin+1].dGetY();
405
406 double dXMin = tMin(dX1, dX2);
407 double dXMax = tMax(dX1, dX2);
408 double dYMin = tMin(dY1, dY2);
409 double dYMax = tMax(dY1, dY2);
410
411 double dX = dGridXToExtCRSX(nX);
412 double dY = dGridYToExtCRSY(nY);
413
414 if ((dX >= dXMin) && (dX <= dXMax) && (dY >= dYMin) && (dY <= dYMax))
415 {
416 bFound = true;
417
418 pProfile->TruncateProfile(nSeg+1);
419 pVPt.push_back(CGeom2DPoint(dX, dY));
420 pProfile->CGeomMultiLine::SetPoints(pVPt);
421
422 break;
423 }
424 }
425 if (bFound)
426 break;
427 }
428 if (bFound)
429 break;
430 }
431
432 if (! bFound)
434
435 return RTN_OK;
436}
Geometry class used to represent 2D point objects with integer coordinates.
Definition 2di_point.h:29
int nGetY(void) const
Returns the CGeom2DIPoint object's integer Y coordinate.
Definition 2di_point.cpp:55
int nGetX(void) const
Returns the CGeom2DIPoint object's integer X coordinate.
Definition 2di_point.cpp:49
Geometry class used to represent 2D point objects with floating-point coordinates.
Definition 2d_point.h:27
Geometry class used to represent coast profile objects.
Definition profile.h:37
void TruncateProfile(int const)
Truncates the profile's CGeomLine (external CRS points)
Definition profile.cpp:341
int nGetProfileID(void) const
Returns the profile's this-coast ID.
Definition profile.cpp:80
CGeomProfile * pGetUpCoastAdjacentProfile(void) const
Returns the up-coast adjacent profile, returns NULL if there is no up-coast adjacent profile.
Definition profile.cpp:479
CGeomProfile * pGetDownCoastAdjacentProfile(void) const
Returns the down-coast adjacent profile, returns NULL if there is no down-coast adjacent profile.
Definition profile.cpp:491
CGeom2DIPoint * pPtiGetCellInProfile(int const)
Returns a single cell (grid CRS) in the profile.
Definition profile.cpp:521
int nGetNumCellsInProfile(void) const
Returns the number of cells in the profile.
Definition profile.cpp:535
CGeom2DIPoint * pPtiGetStartPoint(void)
Returns a pointer to the location of the cell (grid CRS) on which the profile starts.
Definition profile.cpp:92
bool bStartOfCoast(void) const
Returns the switch to indicate whether this is a start-of-coast profile.
Definition profile.cpp:116
void SetEndPoint(CGeom2DIPoint const *)
Sets the the location of the cell (grid CRS) on which the profile ends.
Definition profile.cpp:98
vector< CGeom2DIPoint > * pPtiVGetCellsInProfile(void)
Returns all cells (grid CRS) in the profile.
Definition profile.cpp:515
void SetCellsInProfile(vector< CGeom2DIPoint > *)
Sets the profile's vector of cells (grid CRS)
Definition profile.cpp:509
void SetTruncatedDifferentCoast(bool const)
Sets a switch which indicates whether this profile is truncated, due to hitting another profile from ...
Definition profile.cpp:206
int nGetIndexOfCellInProfile(int const, int const)
Returns the index of a given cell in the vector of profile cells; returns INT_NODATA if not found.
Definition profile.cpp:609
bool bEndOfCoast(void) const
Returns the switch to indicate whether this is an end-of-coast profile.
Definition profile.cpp:128
Real-world class used to represent coastline objects.
Definition coast.h:43
int m_nLogFileDetail
The level of detail in the log file output. Can be LOG_FILE_LOW_DETAIL, LOG_FILE_MIDDLE_DETAIL,...
Definition simulation.h:574
bool bWriteRasterGISFile(int const, string const *, int const =0, double const =0)
Writes GIS raster files using GDAL, using data from the RasterGrid array.
CGeomRasterGrid * m_pRasterGrid
Pointer to the raster grid object.
ofstream LogStream
vector< CRWCoast > m_VCoast
The coastline objects.
int nTruncateProfilesDifferentCoasts(int const, int const, int, int const, int const, int, int, bool const, bool const)
Truncates two intersecting coast-normal profile belonging to different coasts.
int nDoMultipleCoastlines(void)
Checks all profiles on all coasts for intersections between profiles belonging to different coasts.
bool bWriteVectorGISFile(int const, string const *)
Writes vector GIS files using GDAL/OGR.
static double dGetDistanceBetween(CGeom2DPoint const *, CGeom2DPoint const *)
Returns the distance (in external CRS) between two points.
int nTruncateProfileMultiLineDifferentCoasts(CGeomProfile *, int const, int const)
Truncates the CGeomMultiLine (external CRS) of a profile which has hit a different coast,...
double dGridCentroidYToExtCRSY(int const) const
Given the integer Y-axis ordinate of a cell in the raster grid CRS, returns the external CRS Y-axis o...
Definition gis_utils.cpp:78
double dGridYToExtCRSY(double const) const
int m_nGISSave
The save number for GIS files (can be sequential, or the iteration number)
Definition simulation.h:502
double dGridXToExtCRSX(double const) const
Given a real-valued X-axis ordinate in the raster grid CRS (i.e. not the centroid of a cell),...
unsigned long m_ulIter
The number of the current iteration (time step)
Definition simulation.h:598
double dGridCentroidXToExtCRSX(int const) const
Definition gis_utils.cpp:68
int nTruncateProfileHitDifferentCoast(int const, int const, int const, int const, int const, bool const, bool const)
Truncates a profile which has hit a different coast.
int const INT_NODATA
Definition cme.h:476
int const RASTER_PLOT_POLYGON
Definition cme.h:635
T tMin(T a, T b)
Definition cme.h:1265
int const RTN_ERR_POINT_NOT_FOUND_IN_MULTILINE_DIFFERENT_COASTS
Definition cme.h:772
string const VECTOR_PLOT_INVALID_NORMALS_TITLE
Definition cme.h:1191
string const VECTOR_PLOT_NORMALS_TITLE
Definition cme.h:1193
string const RASTER_PLOT_POLYGON_TITLE
Definition cme.h:1101
int const GAP_BETWEEN_DIFFERENT_COAST_PROFILES
Definition cme.h:800
int const VECTOR_PLOT_NORMALS
Definition cme.h:679
int const VECTOR_PLOT_INVALID_NORMALS
Definition cme.h:677
T tMax(T a, T b)
Definition cme.h:1252
int const VECTOR_PLOT_COAST
Definition cme.h:672
string const VECTOR_PLOT_COAST_TITLE
Definition cme.h:1187
int const LOG_FILE_ALL
Definition cme.h:493
int const RTN_OK
Definition cme.h:694
int const RTN_ERR_CELL_MARKED_PROFILE_COAST_BUT_NOT_PROFILE
Definition cme.h:762
string const RASTER_PLOT_NORMAL_PROFILE_TITLE
Definition cme.h:1098
int const MIN_PROFILE_SIZE
Definition cme.h:484
int const RASTER_PLOT_NORMAL_PROFILE
Definition cme.h:633
int const RTN_ERR_CELL_NOT_FOUND_IN_HIT_PROFILE_DIFFERENT_COASTS
Definition cme.h:771
Contains CRWCoast definitions.
Contains CSimulation definitions.