Interactive model · Summary · Full report
Contents
- Executive summary
- 1. The short version
- 2. The coast and the question
- 3. What we observed
- 4. The tools we used, and why
- 5. The waves at the beach (SWAN)
- 6. What pushes sand on and off the beach
- 7. What moves sand along the shore
- 8. Putting it together: the sand story
- 9. Encuentro and Coco Pipe (new model area)
- 10. What a surfer can learn
- 11. Limits and confidence
- 12. Next steps, and how to take sand samples
- 13. XBeach in 2D: the pilot, and whether to move to the GPU
- 14. How fast is this computer? Speed benchmarks
- 15. Where the water goes: the back-reef flow from Encuentro to Cabarete Bay
- Appendix: fixing SWASH's output
- Appendix: files
- Version history
Where does Kite Beach's sand go? A report on the Cabarete–Encuentro sand study
Version 0.11, 12 October 2026 (the version history is at the end). An independent study using free satellite data and open-source models. The models have not yet been checked against measurements in the water, so treat the numbers as first estimates. See also the short summary and the interactive model.
Version 0.11: north swells leave a mark at Kite Beach. A new satellite test asked whether the beaches change after north swells in particular (from about north-north-west to north-north-east), rather than after big swells of any direction. They do, in a small way. A typical north swell leaves the south-east half of Kite Beach about 2 m wider within a few days (90% range 1.2–3.4 m), and western Cabarete Bay about 1.7 m wider. The summer stretch tends to be about 1 m narrower, but less surely. That is the pattern of sand pushed south-east, from the summer stretch into Kite Beach and on past the point, and it fits the wave models. Each step is smaller than the scatter in a single satellite image, so it shows only on average over many swells. With about six north swells a winter, the steps could add up to much of Kite Beach's winter widening, but that is a rough estimate (Section 7.5).
Version 0.10: an error in reading XBeach's currents, found and fixed. XBeach writes its currents, wave forces and sand transport as east and north components. Our scripts treated them as components along XBeach's own grid and turned them a second time, which scrambled the direction of every 2D XBeach current in versions up to 0.9. The scripts are fixed and the existing XBeach runs re-analysed (no new runs were needed). What changed in the conclusions: - At the Kite point the models now agree. XBeach (both pilots) and the current model both run the water near the beach just south-east of the point towards Cabarete Bay. The "unresolved disagreement" of version 0.9 is gone. The waves agree too: SWAN, XBeach and 98% of 103 satellite images taken during swells have them crossing the reef at the point from north of the coast normal. A finer model grid (5 m, with the wave push at 5 m or 2.5 m) does not change the answer (Sections 7.4, 7.5 and 15.7). - Along the coast the two current models now broadly agree, including in the eastern half of Cabarete Bay, where both run the water towards the Kite point. The old "eastern bay disagreement" is gone (Section 7.5). - The Kite Beach channel is a weaker rip than published on typical winter days and in big north-east swells (average about 0.35 and 0.5 m/s, surges up to about 0.6 and 1.1 m/s) and strongest in big north swells (about 1.0 m/s, surges up to about 1.9 m/s). XBeach now confirms the current model's main exit through the lower reef at Kite Beach's north-west end (Section 15.3). - Which way the sand goes at the point is still unresolved. The water near the shore there flows towards Cabarete Bay, so some Kite Beach sand may leave south-east past the point, and some sand from the small beach by the point may carry on into the bay, with the current. But the waves' push along the beach face runs the other way, towards Kite Beach. Neither is measured sand movement (Section 7.4). - Local knowledge (9 October 2026): the bottom is sandy. A local reports that the whole bottom of Cabarete Bay and from Kite Beach to Encuentro is sandy, out past the reefs too, with "lots and lots of sand", visible in the murky water. Our picture of where sand lies came only from the Coral Atlas, a satellite map of reef shapes that does not measure sand, so we now take the local observation as the better evidence (it says nothing about the sand's thickness or grain size). It removes one of our explanations for the failed sand budgets (Section 15.6), makes a flow of sand passing through Encuentro more likely than a shortage of sand (Section 7.4), and makes some sand moving south-east past the Kite point more likely than we said (Section 15.7). No new model results.
Version 0.9: the quality review has been worked through. An independent line-by-line review of the code and of this report (7 October 2026) found problems. The code has been fixed, the analyses rerun, and every affected section rewritten from the new results. What changed in the conclusions: - One test, the 2D XBeach "seasonal reproduction" of Kite Beach, is withdrawn. Every wave condition built the beach in proportion to its wave energy: a start-up effect of the model, not the beach's real response (Section 13.2). This does not mean the models miss the seasons. The waves' push along the shore still reverses with the seasons at Kite Beach's north-west end (Section 7.4), and the summer stretch's width is still predicted from that push (Section 7.3). What no model yet gives is the size of Kite Beach's swing (Section 7.2). - The ten-year trends are weaker than stated. Kite Beach shows no clear trend. The small beach on the Cabarete side of the Kite point is narrowing by about 2 m a year, not widening, and the between stretch is widening. So the satellites do not show Kite Beach gaining sand; the "sand trap" now rests only on where the waves' push meets (Section 7.4). - The waves' potential sand volumes are about twice what was printed (a coefficient error), and the along-shore model now runs on the corrected depths. They are still only the waves' capacity to move sand, not measured movement, and the model still fails beach by beach (Section 7). - The changes after big swells cannot be told apart from chance. At most the summer stretch is about 2.6 m narrower in the ten days after a long-period swell, and even that could be chance (Section 6.3). - The satellite line sits about 10–17 m landward of the water's edge, and sun glint had made summer beaches look 4–5 m narrower (now removed). The timing of the seasons is firm, but the sizes of the swings are uncertain by several metres (Section 3.1). - The water crossing the reef has been recounted (Section 15). The flow pattern stands, but several amounts changed, and the model's edges matter much less than version 0.8 said. Version 0.9 also said that which way the water goes right at the Kite point was unresolved between the two models; that came from the XBeach reading error, fixed in 0.10 (above).
Each finding and what was done about it is in
docs/qa/QA_REGISTER.md; the version history at the end lists the fixes.
Executive summary
Where everything is

The places named in this report, from west of Encuentro to east of Cabarete Bay: - Beach stretches: coloured along the waterline. - Surf spots: red triangles. "Cabarete Main Reef" is the surf break about 800 m off western Cabarete Bay, not the reef at Cabarete's eastern point. - The Kite point: the star, where the coast turns from Kite Beach into Cabarete Bay. - Distances along the shore: the white dots, measured from the Encuentro end. The report uses these throughout; for example, Kite Beach is at about 4.8–5.5 km. - The reef and the back-reef: the reef is the line where waves break: about 180–200 m offshore at Encuentro, 450–550 m at Kite Beach, about 600 m at the Kite point and up to 750 m off western Cabarete Bay. The middle of Cabarete Bay has no reef across it. The back-reef is the shallow water between the reef and the beach. We don't call it a lagoon, because locally "the lagoon" means the true lagoon behind Cabarete town.
Two models are named throughout: SWAN, a standard wave model that follows the waves from offshore across the reef to the beach, and XBeach, a standard model of waves, currents and sand in the surf zone (Section 4).
The findings at a glance

A: where the waves push sand along the shore in winter (December–March, blue arrows) and summer (June–August, red arrows). The star marks where the year-average push meets, in the south-east part of Kite Beach. The arrows show the waves' capacity to move sand, not measured sand movement: Kite Beach is a "trap" in the pattern of the push, not in the satellite trends. B: the typical year at Kite Beach and the summer stretch, from ten years of satellite images. They swing in opposite seasons, by about 18–22 m; the timing is firm, the sizes are uncertain by several metres (Section 3.1). C: the coloured bars are the net change over ten years (the trend × 10), with bars of two standard errors either way. Only the small beach by the Kite point (narrowing) and the between stretch (widening) are clearly away from zero; the summer stretch only just. The grey bars are the change in the ten days after a big long-period swell, minus the change after random dates; none stands out from chance (Section 6.3).
The six questions
1. Where does Kite Beach's sand come from, and where does it go? - As far as the waves' capacity goes, Kite Beach is a sand trap. In the monthly averages, the waves inside the reef push sand along the shore into Kite Beach from both ends, and the two pushes meet in the south-east part of the beach, at about 5.2–5.35 km (Section 7.4): - from the south-east, the Cabarete Bay side, in every month's average. The push runs towards the Kite point along the whole of Cabarete Bay and is strongest in its west. The point is rock; sand passes it through the shallow water in front; - from the north-west, from about September to April, when the push from the between stretch also runs into Kite Beach. - This is what the waves could do, not measured sand movement. The satellites do not show Kite Beach gaining sand over the ten years, and the along-shore model that gives the push does not reproduce the sizes of the beaches' changes stretch by stretch (Section 7.2). Locals report that the bottom is sandy almost everywhere, so sand to move is probably not short; whether it actually collects depends on how much of it the waves really move, which depends on its grain size and has not been measured. - Where the sand would come from: mainly western Cabarete Bay. On true north-swell days (about one day in 30, mostly November to April), the push at the south-east end of Kite Beach turns south-east, towards the point; on the Cabarete side of the point it stays towards Kite Beach even then (Section 7.5). - The satellites show the small beach on the Cabarete side of the point trading sand with Kite Beach: it is widest in August and narrowest in April, opposite to Kite Beach. How the sand moves between them is not settled (question 5). - In summer, the north-west end of Kite Beach switches. In June and July most of all, the push there turns north-west, towards the between and summer stretches, and the summer stretch is widest in August–September. - Over most of the coast west of Kite Beach, the push is towards Encuentro, strongest in summer (outside the north-west end's switch above). Yet Encuentro is not filling up: its seasonal swing is small (about 4.5 m, and uncertain) and it shows no clear ten-year trend. Two explanations fit. Little loose sand reaches it, partly because Kite Beach holds sand that would otherwise travel on; or a steady flow passes through, towards Sosúa or offshore, leaving as fast as it arrives. The satellites cannot tell these apart. But locals report that the bottom is sandy from Cabarete Bay to Encuentro and out past the reefs, so the second, a flow passing through, now looks the more likely; the first may still apply close to the beach, if Kite Beach holds the sand moving along the beach face (Section 7.4). - Evidence: the SWAN waves and the along-shore model (Section 7), and the satellite record (Section 3).
2. What conditions build the beach, and what shrinks it? - Kite Beach widens from October to February and narrows from March to September in the typical year. It is widest in February and narrowest in September, about 18 m apart. The timing is firm; the size is uncertain by several metres (14–19 m depending on the method; Sections 3.1–3.2). - The models do show the seasonal switch that most likely causes this. The big seasonal change is in the swell, not the wind. The trade wind blows from about the east in every month's average, a little stronger in June–July. But from about September to April north-east swells dominate, while in summer (about June–August) the waves are mostly short easterly trade-wind waves. From about September to April the waves push sand into Kite Beach from both ends. In June–July the push at the beach's north-west end reverses and drains that end north-west, towards the between and summer stretches (Section 7.4). This is the waves' capacity to move sand, not measured sand movement. - What no model gives yet is the size of Kite Beach's swing. Run forward day by day, the along-shore model gets the timing at Kite Beach roughly right (widest in May, against April in the satellite record over the same test years), but it swings only about 0.5 m against about 17 m observed: one strength setting has to fit the whole coast (Section 7.2). And the beach's departures from its typical year are not predicted by the waves at the beach (Section 7.3). - The summer stretch does the opposite: narrowest in April, widest in August–September. Its width is reproduced from the waves' push along and onto the shore over the previous ~90 days, on years the model never saw. Its skill is +0.46 (90% range +0.30 to +0.57) against a smooth seasonal cycle with a trend, and +0.61 against the average year (Section 7.3; a skill of 0 is no better than the baseline, 1 is perfect). - The 2D XBeach "seasonal reproduction" of earlier versions is withdrawn. It was a start-up effect of the model, not the beach's real response (Section 13.2). That was one failed test, not proof that the models cannot show the seasons. - The wind itself also blows dry sand, mostly in June–August, along the beach towards Encuentro and partly inland. It may add a little to the summer loss, and the sand blown inland is a slow permanent loss, probably a few cubic metres per metre of beach a year (Section 7.6). - Big swells as a whole leave no clear mark on Kite Beach's waterline in the satellite record: no change after big swells stands out from ordinary weeks, although a change of 1–2 m could be missed (Section 6.3). In the XBeach runs they cut the dry upper beach a little and park the sand just offshore, where calmer waves can bring it back (Section 6.4). - North swells are the exception: they widen the south-east half of Kite Beach. A typical north swell leaves it about 2 m wider within a few days, and western Cabarete Bay about 1.7 m wider, while the summer stretch tends to narrow. There are about six north swells a winter, so these steps could account for much of Kite Beach's widening from October to February. That is a rough estimate, and each step is smaller than the scatter between single satellite images (Section 7.5).
3. Sandbars: can we see them? Does sand move left and right, or on and off the beach? - Sandbars can't be seen in 10 m satellite images. Drone time-exposure images or a kayak echo sounder would show them. - Both kinds of movement happen: - Left and right (along the shore) probably drives the seasons, and is where the waves' capacity is largest. The models show the push reversing with the seasons at Kite Beach's north-west end, but not yet the size of each beach's swing. - On and off the beach happens in each swell: the dry beach is cut and the sand is parked just offshore, then returned in calmer weather. - The whole coast is also a little wider in winter. Sand moving along the shore cannot do that, so it must come from the on-and-off exchange or from beyond the study area (Section 7.2).
4. Does surf beat build or erode the beach?
Surf beat is the slow surge of water up and down the beach every minute or two. When a set of bigger waves breaks on the reef, it pushes extra water in towards the beach, and that water drains back out in the lull before the next set.
- Behind the reef, surf beat is usually the bigger water motion at the beach: 2.5–3 times the ordinary waves at the middle of Kite Beach and about 2–4.5 times at the summer stretch, but only about 1.1–3 times at the west end of Kite Beach, where more of the ordinary waves get through (SWASH, a wave-by-wave model; Section 6.2).
- In swell events it helps erode the dry upper beach, most in long-period swell (XBeach, Section 6.4). On most of the lines modelled the sand only moves just offshore, within reach of calmer waves; at Encuentro beach in 4 m swells some is carried out past the reef.
- At the sheltered middle of Kite Beach the effect is tiny, possibly even a slight gain. The more exposed stretches lose more: the west end of Kite Beach, the summer stretch and Encuentro.
5. Does Kite Beach sand ever move south-east, towards Cabarete? - According to the waves' push along the beach, very little; but the current near the point runs the other way, so some sand may. - The push runs from western Cabarete Bay, past the Kite point, towards Kite Beach in every month's average, and on the Cabarete side of the point on practically every day (Section 7.5). - At the south-east end of Kite Beach it turns south-east, towards the point, on most true north-swell days. Those are only about 3% of days (north and north-north-east swells together are about one day in eight). - The water near the shore at the point flows towards Cabarete Bay, and both current models now agree on this. In the strip 20–150 m off the waterline just south-east of the point, the current model gives +0.15 to +0.23 m/s towards Cabarete Bay (summer and winter) and XBeach, both pilots on the corrected depths, +0.18 to +0.20 m/s. (Up to version 0.9 XBeach seemed to run it towards Kite Beach; that was an error in how we read XBeach's output, now fixed.) The waves agree too: SWAN, XBeach and the satellite images all have them crossing the reef at the point from north of the coast normal, which pushes the water towards the bay (Sections 7.4 and 15.7). - So the push along the beach and the current a little further out point different ways. The push is the small waves' capacity to move sand along the beach face; the current is driven by the bigger waves breaking on the reef further out. So some Kite Beach sand could leave south-east past the point, and some sand from the small beach could carry on into Cabarete Bay, with the current. Locals report a sandy bottom there, so the current has sand to carry, and some sand moving south-east past the point is more likely than earlier versions said. This is what the models allow, not measured sand movement. Which way wins at the point, and how much sand moves, is still unresolved: the grain size and how much of the sand is loose and stirred up are not known, and nothing has been measured (Section 7.4). - The satellites show sand moving south-east after north swells. After a typical north swell the south-east half of Kite Beach is about 2 m wider and western Cabarete Bay about 1.7 m wider, within a few days; the summer stretch tends to be narrower. So in north swells some sand does pass the point into Cabarete Bay. North swells are uncommon, so this is a few events a year, not the usual direction (Section 7.5). - The small beach on the Cabarete side of the point behaves like a seasonal store. It is widest in August and narrowest in April, opposite to Kite Beach, with a similar seasonal swing of beach area (11,600 against 13,700 m²), and its ups and downs run opposite to Kite Beach's. So the two trade sand, but the satellites do not say by which route. - Over the ten years it has narrowed by about 2 m a year. Where that sand went is not known: Kite Beach and western Cabarete Bay show no clear trend (Section 7.5). - The back-reef water splits along Kite Beach, like water off a ridge. On typical winter days and in big north-east swells the split is at about 5.2 km, so the south-east part of Kite Beach drains into Cabarete Bay; on summer and trade-wind days it moves to about 5.6–5.7 km, at the point, and the whole Kite Beach back-reef drains north-west (Section 15.2). - In the eastern half of the bay the wave push and both current models now all run towards the Kite point (Section 7.5).
6. Does sand move back and forth, or gradually walk one way? - The sand stored on the beaches mostly goes back and forth. Kite Beach swings about 18 m every year, and its ten-year trend (+0.3 ± 0.9 m a year) cannot be told apart from zero. - What the satellites cannot see is sand passing through. They measure how much sand is on each beach, not which grains. A steady flow of sand arriving from the east and leaving to the west, or out to sea, at the same rate would leave the widths unchanged. The waves push sand north-west on most days, and locals report plenty of sand on the bottom, so some through-flow is likely. But the models could not measure it reliably (Section 15.6), so how much sand leaves towards Sosúa or into deep water is still an open question. - Clear slow trends are few (Section 7.4). The small beach on the Cabarete side of the point is narrowing (about 2 m a year) and the between stretch is widening (+0.7 ± 0.4 m a year). The summer stretch may be narrowing slowly (−0.8 ± 0.7 m a year, only just outside zero). Kite Beach, Encuentro and western Cabarete Bay show no clear trend. So the satellites do not show Kite Beach steadily trapping sand. - The waves could move much more sand than the beaches show. Their potential drift from the summer stretch to Encuentro is about 150,000–200,000 m³ a year, yet Encuentro is not growing. Either the supply of loose sand limits the drift, or a large flow passes through; the satellites cannot tell which. Since locals report plenty of sand on the bottom, a flow passing through is the more likely (question 1). - Where sediment leaves offshore: after big winter swells, compared with quieter winter days, the water outside the reef is cloudier all along the coast, Encuentro included, and most of all off Cabarete Bay. There is no extra peak off the Kite Beach exits. That fits plenty of sand on the bottom being stirred up by the swell, as locals see in the murky water; but rain runoff, which often comes with the same swells, has not been separated (Section 15.4).
Also answered
- Where does the water go behind the reef, and is there a channel? (Section 15)
- The back-reef water splits along Kite Beach: at about 5.2 km on typical winter days and in big north-east swells, and at about 5.6–5.7 km on summer and trade-wind days. North-west of the split it runs north-west and leaves mainly through the lower, broken reef at Kite Beach's north-west end and along the between stretch (4.1–4.8 km): about 270–285 m³/s on typical and strong-trade-wind days and 340–420 m³/s in big swells. XBeach confirms this as the main net exit at Kite Beach, on a typical winter day and in both big swells (Section 15.3).
- The Kite Beach channel, located from local photos and the satellite breaking record at about 5.0 km, is a surging rip, strongest in big north swells: in XBeach about 0.35 m/s on average on a typical winter day and 0.5 m/s in a big north-east swell (surges up to about 0.6 and 1.1 m/s), and about 1.0 m/s in a big north swell, with surges up to about 1.9 m/s. Over the channel's whole stretch more water comes in over the reef on either side than goes out; the outflow is concentrated in the channel itself. Its depth has not been measured.
- South-east of the split, the water drains into Cabarete Bay. The biggest single outflow on the coast is across the bay's opening, where there is no reef: about 1,200 m³/s on a typical winter day and 1,700 m³/s in a big north-east swell.
- The breaking waves raise the water in the Kite Beach back-reef by about 10 cm on a typical winter day and about 25 cm in a big north-east swell.
- In north swell a strong current runs south-east along the outside of the reef.
-
Encuentro has no main exit in most conditions: its water leaks out through many small gaps.
-
Encuentro and Coco Pipe have a narrow reef close to the beach, with almost no back-reef.
- Sand: the beach's seasonal swing is small (about 4.5 m, and uncertain), and the waves push sand towards the west end in every month's average. Big swells cut the dry beach there more than at the middle of Kite Beach.
- Surf: the waves arrive almost at full size, work best in north swell, and come out hollow (Sections 9–10).
- Surf forecasts: a SWAN lookup table for all five spots is ready (
spot_downscale.py: about 10 ms per 7-day forecast, with the measured Puerto Plata tide, and a warning on every hour that falls outside the table or is poorly represented by it; seeSURF_LOOKUP_TABLES_PRIMER.md). All five spots' tables were rebuilt on the corrected depths on 2 October 2026 (Section 3.6). It tells the spots apart, which the wave model's single offshore point cannot. A GPU wave-by-wave model of the Encuentro reef could add peaks, peel, sets and rips, in an estimated 15–40 minutes a night (GPU_SURF_FORECAST_PLAN.md). - The tide: the measured Puerto Plata gauge replaces the San Juan prediction. Puerto Plata runs about 15 minutes ahead of San Juan with 1.25 × its amplitude, not 1.44, and it has a 14 cm seasonal sea-level cycle (Section 3.5).
Confidence at a glance
| Finding | Confidence |
|---|---|
| Kite Beach widest in February, narrowest in September; the summer stretch the opposite (narrowest in April, widest in August–September) | High for the timing; medium for the size (about 14–19 m at Kite Beach depending on the method; Section 3.1) |
| Ten-year trends: the small beach by the Kite point narrowing about 2 m a year, the between stretch widening | Medium; low elsewhere, and Kite Beach shows no clear trend |
| The reef shelters Kite Beach; the waves at the beach are a few tenths of a metre | Medium-high (no wave measurements inside the reef) |
| The waves' along-shore push: towards Encuentro west of Kite Beach, towards the Kite point in Cabarete Bay, meeting inside Kite Beach | Medium (the waves' capacity, not measured movement; the along-shore model fails beach by beach) |
| The summer stretch's width follows that push | Medium (beats both baselines on unseen years; a statistical fit) |
| The waves push sand onshore at the beach in normal conditions | Medium |
| Big swells cut the dry beach and park the sand just offshore | Medium-low (1D XBeach only; the satellites show no change after big swells that stands out from chance) |
| Which way the water goes right at the Kite point: towards Cabarete Bay | Medium (the current model and XBeach agree, and so do the wave directions in SWAN, XBeach and the satellite images; no current measurements). Which way the sand goes there: low (the push along the beach runs the other way; grain size and how much sand moves are unmeasured) |
| Back-reef flow pattern: north-west behind the north-west part of Kite Beach, out at its north-west end, into Cabarete Bay at the point | Medium (holds in every depth version and with both kinds of model edge; agrees with the photos, the satellite breaking and cloudiness, and broadly with XBeach) |
| Kite Beach channel: a surging rip, strongest in big north swells | Medium-low (the channel's depth is a guess) |
| North swells widen the south-east half of Kite Beach (about 2 m each) and western Cabarete Bay, within a few days | Medium (stands out from chance after allowing for the number of comparisons, and holds when the north sector is changed or the 2017 hurricanes are left out; small against the scatter of single images; Section 7.5) |
| All sand volumes | Low (locals report plenty of sand on the bottom, but its grain size, how deep it is stirred and the active beach height are assumed) |
| How much sand passes through the system to Sosúa or deep water | Not yet known (two model budgets failed the satellite test; Section 15.6) |
| Wind blows sand along the beach and inland, mostly in June–August; a few m³ per metre of beach per year lost inland | Low-medium (the ERA5 wind underestimates afternoon winds; the formula tends to overestimate) |
| Reef depths, and so the sheltering and the capped surf heights | Medium-low: the drone depths read deeper than the Atlas, most on the shallow reef. Local knowledge supports the Atlas there, but nothing has been measured directly (Section 3.6) |
| Surf heights at the spots | Medium for patterns, low for exact heights (not yet checked against observations) |
1. The short version
- Kite Beach breathes with the seasons. In the typical year it is widest in February and narrowest in September, about 18 m apart, and on average about 15 m wider in January–April than in August–September. A beach 1.2–1.7 km to the west (the "summer stretch") does the opposite: it is narrowest in April and widest in August. The timing of these swings is firm; their sizes are uncertain by several metres, because the satellite line sits in the wet sand, 10–17 m landward of the water's edge (Section 3.1).
- The waves at Kite Beach are small and heavily filtered by the reef. Whatever happens offshore, the waves near the Kite Beach shore stay at about 0.13–0.55 m (0.2–0.5 m in 98% of hours). What does reach the beach is mostly surf beat, a slow rise and fall of the water every minute or two, driven by sets breaking on the reef.
- The seasonal swing most likely comes from sand moving along the shore, not from waves stripping the beach. The big seasonal change is in the swell: north-east swells from about September to April, short easterly trade-wind waves in summer (the trade wind itself blows from about the east in every month's average, a little stronger in summer). The models give the waves' capacity to move sand (their "push"), not the sand that actually moves:
- On most of the coast, the waves push sand towards Encuentro (north-west), strongest in summer.
- Kite Beach is where the pushes meet. In the monthly averages, the push from the Cabarete side, past the rocky Kite point, meets the push from Kite Beach's north-west end in the south-east part of the beach, so this is where sand would collect.
- From about September to April, the north-west end also pushes into the beach.
- In summer (June–July most of all), the push at the north-west end reverses and drains that end north-west, towards the between and summer stretches, as Kite Beach narrows and the summer stretch widens. So the models do show the push reversing with the seasons.
- The satellites do not show Kite Beach gaining sand over ten years: its trend cannot be told apart from zero. The small beach on the Cabarete side of the point is narrowing by about 2 m a year, and it trades sand with Kite Beach through the seasons.
- Whether any Kite Beach sand goes south-east, past the point, is not settled. The wave push along the beach says very little. But the water near the shore at the point flows into Cabarete Bay, and the two current models (our back-reef current model and XBeach) now agree on that. Locals report a sandy bottom there, so the current has sand to carry, and some sand may well leave that way; which way wins, and how much sand moves, is not known (the grain size and how much of the sand is stirred up have not been measured).
- A simple statistical model built on the push predicts the summer stretch's width in years it never saw. For Kite Beach, the models get the timing of the swing but not its size: run forward, the along-shore model swings only about 0.5 m against about 17 m observed (Section 7.2).
- Across the beach, big swells cut the dry beach and park the sand just offshore; calmer waves push it back.
- XBeach shows swell events taking sand from the upper beach into the lower beach and inner back-reef, and long-period swells (through surf beat) do the most.
- The middle of Kite Beach is the exception: the reef shelters it so well that losses are tiny, or even small gains.
- The satellites show no change after big swells that stands out from ordinary weeks. At most, the more exposed summer stretch is about 2.6 m narrower in the ten days after a long-period swell, and even that could be chance.
- These swaps are small next to the seasonal swing.
- Encuentro and Coco Pipe are different. Their reef is narrow and close to shore, so the waves arrive almost at full size and break as hollow, plunging waves. The beaches there change relatively little with the seasons.
- A 2D XBeach model of Kite Beach and its back-reef runs well (Section 13). Its waves match SWAN's to within about 10%, at about 12 minutes per simulated hour on one processor core, and, read correctly, its currents broadly agree with the current model's. Its one test of a whole year turned out not to be valid (a start-up effect). That test failed; it does not show that the seasons cannot be modelled.
- For surfers, the model gives how big each spot gets for a given swell, which swell directions work, how much the tide matters, how hollow the waves are, and a 2017–2026 surf climate by month.
2. The coast and the question

The study covers about 10 km of the north coast of the Dominican Republic, from Encuentro (west) through Kite Beach and round the Kite point to the east end of Cabarete Bay. A coral reef runs along most of the coast: about 180–200 m offshore at Encuentro, 450–550 m at Kite Beach, about 600 m at the Kite point and up to 750 m off western Cabarete Bay. There is no reef across the middle of Cabarete Bay. Between the reef and the beach is a shallow back-reef.
The questions: 1. Where does Kite Beach's sand come from, and where does it go? 2. What conditions build the beach, and what conditions shrink it? 3. Are there sandbars, and does sand move along the beach or on and off it? 4. Does surf beat build or erode the beach? 5. Does Kite Beach sand ever move south-east, towards Cabarete? 6. Does sand move back and forth, or gradually walk one way?
Added later: what we can learn at Encuentro and Coco Pipe, about sand and about surfing; where the water goes behind the reef, and whether there is a channel (Section 15); and lookup tables for the surf forecast.
Distances in this report are measured along the shore from the Encuentro end (0 km). Encuentro beach is at about 0.4–2.2 km, the summer stretch at 3.1–3.6 km, the "between" stretch at 3.6–4.7 km, Kite Beach at about 4.8–5.5 km, the small beach on the Cabarete side of the Kite point at 5.5–6.0 km, and Cabarete Bay beyond that, to about 8.75 km.
3. What we observed
3.1 Ten years of satellite images
We traced the waterline on cloud-free Sentinel-2 images from 2017–2026, every 25 m along the coast. Sentinel-2 is a free European satellite that passes about every five days. Two sets of images are used: 343 images of the "wide" area (Encuentro to the Kite point, about 7 km of coast) and 325 images of the "coast" area (Encuentro to the east end of Cabarete Bay, 10.1 km).
How the line is found. On each image a computer compares green light with short-wave infrared light (a "water index", here the MNDWI, modified normalised difference water index). Water absorbs infrared light, so it looks dark in that band and sand looks bright. The line where the index changes from "water" to "land" is the traced waterline. Each line is then corrected for the tide at the time of the image (Section 3.5).
Two corrections and one finding in version 0.9 (7 October 2026):
- Sun glint is now removed. From April to September the sun is high when the satellite passes, and sunlight reflecting off the sea (glint) makes the water look brighter in the infrared. That made glinted images put the waterline further up the beach, so the beaches looked about 4–5 m narrower in summer than they were. The glint is now measured over open sea on each image and subtracted before the water index is computed. All the satellite widths in this report are from the corrected images.
- The traced line is not the water's edge. A close look at the images showed that it sits about 10–17 m landward of the water's edge, in the wet sand. The infrared band has 20 m pixels, which blur across a beach only 20–40 m wide. The line is still a consistent marker from image to image, so its changes measure changes in beach width, as long as the back of the beach stays put. Its absolute position should not be read as the water's edge.
- An independent cross-check (waterline_crosscheck.py, outputs/waterline_crosscheck.md) traces the water's edge itself from the sharper 10 m bands (green against near-infrared). It gives the same timing of the seasons: Kite Beach widest in February–March and narrow from May to September, and the summer stretch narrowest in April and widest in August–September. It gives different sizes of swing at some stretches: about 14 m against 19 m at Kite Beach, and 6 m against 16 m on the between stretch. So the timing of the seasons is robust, but the sizes of the swings are uncertain by several metres.

The time-lapse of Kite Beach. The red line marks Kite Beach; the graph below shows its width.
3.2 The two beaches breathe in opposite seasons

The numbers below are medians for each calendar month over 2017–2026 (outputs/beach_trends.md). They describe the typical year, not every year.
- Kite Beach is widest in February and narrowest in September, a swing of about 18 m from the widest to the narrowest month. On average it is about 15 m wider in January–April than in August–September. By May it is only slightly wider than average.
- The summer stretch is narrowest in April and widest in August, a swing of about 22 m in the opposite season (about 15 m narrower in January–April than in August–September).
- The rest of the wide area swings much less. The between stretch swings about 7 m (widest in December, narrowest in August). Encuentro swings only about 4.5 m (widest in November, narrowest in July); the water's-edge cross-check gives about 9 m there, so Encuentro's swing is small and uncertain. Along the wide area as a whole, about 60% of the waterline is widest between November and March.
- As Section 3.1 explains, the sizes of these swings are uncertain by several metres; the timing is not.

The coast coloured by the month each stretch is widest; thicker lines mean bigger swings. Since version 0.9 this map is made from tide-corrected waterlines, as the rest of the report is.
3.3 Things we checked, so they don't fool us
| Possible artefact | Check | Result |
|---|---|---|
| Sun glint on summer images | Glint measured over open sea on each image (Section 3.1) | Glint made summer beaches look about 4–5 m narrower. It is now removed. The opposite timing of Kite Beach and the summer stretch was there before and after the fix, so the cycles themselves are not a glint effect |
| Where the line sits | A second, independent line traced at the water's edge from the 10 m bands (Section 3.1) | Our line sits about 10–17 m landward of the water's edge. Both lines give the same seasons; the sizes of the swings differ by up to about 10 m at some stretches |
| Satellite lighting | A fixed feature (the vegetation line) should not move | In the first, uncorrected version of the images it moved about ±3 m with the seasons, so a few metres of any signal can be image noise. This check has not been repeated on the glint-corrected images |
| The tide | Water level at the time of each image, measured at the Puerto Plata tide gauge (Section 3.5) | The water is higher at image time in autumn and winter, so the tide slightly hides the winter width. Correcting for it makes Kite Beach's January–April lead over August–September slightly bigger (about 14.6 m before, 15.3 m after); the cycle is real |
| Wave set-up (bigger waves raise the average water level at the shore) | SWASH runs of September 2026 (SWASH is a wave-by-wave model, Section 6; outputs/swash_transects.md) |
Typical winter waves raise the water at the shore by only 0.04–0.06 m more than typical summer waves. On these beaches (13–15 m of width per metre of water level, from the tide correction) that moves the waterline by about 0.5–0.9 m, so the images show winter beaches very slightly narrower than they are. This is small next to the seasonal swings |
3.4 Sandbars
Sandbars could not be seen in these images. The 10 m pixels are too coarse, and the water colour changes after every swell. The reef shows clearly, but bars near the beach do not. Seeing them needs: - drone time-exposure images (a few minutes of video averaged together), or - a kayak with an echo sounder.
3.5 The tide: from a San Juan prediction to the Puerto Plata gauge
At first (September 2026) the study used the wave-model project's tide: NOAA's prediction for San Juan, Puerto Rico, scaled by 1.44. Since late September it has used the measured water level from the Puerto Plata tide gauge, about 30 km west of Cabarete, and every result in this report uses it. The gauge is UHSLC station 777 (IOC code ptpl), with hourly data from 2010 to 2026 and 93% of hours covered for 2017–2026. A harmonic tide model fitted to the gauge (the tide written as a sum of regular tidal cycles, each with its own size and timing) fills the gaps.
The zero level (datum). Water levels are given relative to the mean sea level of 2017–2026 at the gauge. Until version 0.9 the zero was set slightly differently, which put the whole series about 1.6 cm too high; that is now fixed, and the effect on the results is negligible.

| Result | |
|---|---|
| Puerto Plata vs San Juan | Puerto Plata's tide runs about 15 minutes ahead of San Juan, with 1.25 times its amplitude, not 1.44 |
| The tide at Puerto Plata | Mixed, mainly twice-daily. The main tidal cycles ("constituents"): the twice-daily lunar tide M2 22.5 cm; the daily tides K1 8.4 cm and O1 6.7 cm. Spring range about 0.8 m |
| Seasonal mean sea level | About 14 cm from lowest to highest: lowest in February–April (−5 to −6 cm), highest in September–October (+7 to +8 cm), relative to the 2017–2026 mean. A tide prediction doesn't include this |
| How well each matches the measured level (hourly; RMS = the typical size of the difference, the root-mean-square) | San Juan × 1.44: 10.7 cm. Best San Juan mapping: 9.9 cm. Harmonic fit to the gauge: 8.7 cm (the rest is weather) |
What changed in the results when the tide was switched:
- The seasonal cycles did not change. Kite Beach and the summer stretch kept their opposite seasons, and the before-and-after-swell results stayed the same.
- One earlier result did not survive: a link between Kite Beach's width and wave energy (Section 7.3). The old tide lacked the seasonal sea-level cycle, which runs in step with the seasonal wave energy, and the energy model had partly been fitting that.
- For the wave-model project: its fixed 1.44 factor overstates the Cabarete tide by about 15%. The gauge, or a harmonic fit to it (tide_gauge.py), would be more accurate.
3.6 The depths: drone surveys vs the Coral Atlas
The depth maps combine: - the drone surveys from the ubathy project: 24 hovers, about 42,500 points over the Kite Beach reef and Cabarete Main Reef (the surf break about 800 m off western Cabarete Bay, not the reef at Cabarete's eastern point); - the Allen Coral Atlas (depths estimated from satellite images, typically about 1–3 m accurate); - an assumed beach profile.
Two things came up when checking the drone depths against each other and against the Atlas.
1. The hovers disagree with each other. Where hovers overlap, their depths spread by about 1 m (the median, over the overlapping 10 m cells, of the standard deviation between hovers), while each hover reports ±0.1–0.5 m. At the Cabarete Main Reef peak, individual hovers give:
| Hover | Depth at the peak | Its own error estimate |
|---|---|---|
| 0416 | 6.2 m | ±0.36 m |
| 0489 | 4.1 m | ±0.15 m |
| 0476 | 4.0 m | ±0.47 m |
| 0417 | 2.9 m | ±0.11 m |
| 0438 | 2.7 m | ±0.10 m |
| 0477 | 2.0 m | ±0.26 m |
| 0475 | 1.7 m | ±0.10 m |
- Where drone depths are still used, the hovers are now combined robustly: the median across hovers in each cell, with an uncertainty that includes how much they disagree. Before 29 September 2026 each point's own error estimate was trusted, which favoured the hovers claiming the highest precision. The two ways differ little in practice: a median of 0.07 m over all drone cells (80% within ±0.6 m) and about 0.1 m at the surf spots after smoothing.
2. The drone depths read deeper than the Atlas, and by how much depends on the depth.
- On average the drone depths are about 1.3 m deeper than the Atlas where they overlap. The ubathy project's own final comparison (all stations, corrected for the drone's heading and the tide) agrees: −1.15 m (drone deeper), RMSE 2.7 m (the typical size of the difference), correlation r +0.59 (1 would be a perfect match).
- The gap depends on depth (6,900 cells where both exist; data/bathy_survey.npz):
| Where (Atlas depth) | Drone minus Atlas (median) |
|---|---|
| Shallow reef, 0–1 m | +2.5 m (drone deeper) |
| Reef, 1–2 m | +3.5 m |
| 2–4 m | +1.8 m |
| 4–8 m | +0.8 m |
| Deeper than 8 m | −0.3 m (drone slightly shallower) |
- Checked against the ubathy project: the depths were loaded consistently with ubathy's own final product, and its tide corrections check out against the gauge. So the offset is real in the drone data, and it varies from station to station (below).
- A possible reason, not tested: the drone method may read too deep where waves break. The method works out depth from how fast waves travel. Steep and breaking waves travel faster than the method assumes, which would make it read too deep exactly where the reef is shallow and waves break. This is an idea that fits the pattern above; it has not been tested. In 4–8 m of water the two sources agree to within about 1 m.
- Local knowledge supports the Atlas on the shallow reef, although it is anecdotal, not measured. The Kite Beach back-reef is knee deep in the shallows and over head high at its deepest; coral sticks out at low tide at Cabarete's eastern point; and waves break on the reef in quite small swells, which needs a crest under about 2 m. If the drone were right, the shallow reef flats would be 4–5 m deep.
- So the corrected depths of 1–2 October 2026 use the Atlas only on the reef (with the reef crest kept shallow and the Kite Beach channel added). Reef-crest depth sets how sheltered Kite Beach is and how big the surf gets at the spots, so this matters.
- What would settle it for certain: a few measured depths on the reef and in the back-reef (kayak sonar or a weighted line) at a known tide (Section 12.1).
Is it a single datum error? No. (A datum is the zero level that depths are measured from; a datum error would be a wrong zero.) Hover by hover, the drone depths differ from the Atlas by very different amounts, even within one survey day:
| Survey batch | Hovers | Drone − Atlas (median per hover) | Batch median |
|---|---|---|---|
| The original six stations (23 April) | 0395–0408 | −1.4 to +2.8 m | +1.5 m |
| 0416–0423 | −0.5 to +3.0 m | +1.2 m | |
| 0001, 0003 | +2.0 m, +7.7 m (0003 looks wrong) | – | |
| 0438–0441 | 0.0 to +2.4 m | +1.9 m | |
| 0475–0489 | −1.5 to +3.5 m | +1.1 m |
- A datum error would shift every hover by the same amount. This looks instead like errors specific to each hover, most likely its altitude (which scales its depths) or its tide timing.
-
So no single correction should be applied. Where the drone data are used (the older Kite Beach and Cabarete Bay maps), the robust median across hovers is the better use of them. The corrected depths leave them out on the shallow reef for the reasons above.
-
Without new measurements, the back-reef depths and hence the sand amounts carry a range. If the back-reef were 1.4 m deeper than the Atlas says, the sand push at the beach would be about 4 times larger; the local knowledge above makes that unlikely. The directions and seasons of the sand drift hold across that range.
What was and was not rebuilt on the corrected depths (as of version 0.9, 7 October 2026): - Rebuilt: the SWAN tables for the Kite Beach, Encuentro and Cabarete Bay areas and the surf lookup tables made from them (1–2 October); and, on 7 October, the hourly nearshore wave record (Section 5.3), the along-shore model (Section 7), the response model (Section 7.3) and the surf-spot products and figures of Section 10. - Not affected: the SWASH lines (Section 6). They cross no drone-survey cells, so their depths are the same on the old and corrected maps. - Also rerun on the corrected depths (7 October): the two 2D XBeach pilots (Sections 7.4, 7.5 and 13.1); their currents were re-read for version 0.10 (8 October) after the direction error was fixed. The XBeach runs of the Kite Beach channel (Section 15.3) used the corrected depths from the start. - Not rebuilt: the 1D XBeach lines (Section 6) and the 2D XBeach seasons runs (Section 13.2), which used the earlier depths. The depth test below also used the earlier map.
How much does it matter? A SWAN test (depth_sensitivity.py, outputs/depth_sensitivity.md). SWAN is the wave model of Sections 4 and 5. The same two wave conditions were run on three versions of the earlier (drone-blended) Kite Beach depths:
- as used (before the 1–2 October correction);
- "Atlas level": the drone cells replaced by the Atlas depths;
- "drone level": all Atlas cells made 1.36 m deeper.
| Condition | Quantity | As used | Atlas level | Drone level |
|---|---|---|---|---|
| Typical winter (1.5 m, 10 s) | Wave height where it breaks, Kite Beach / Main Reef | 1.83 / 1.93 m | 1.68 / 1.82 m | 1.72 / 1.94 m |
| Wave height at the Kite Beach shore | 0.32 m | 0.31 m | 0.79 m | |
| Along-shore wave power at Kite Beach (the sand push) | 0.06 kW/m | 0.07 | 0.26 | |
| Wave height at the summer-stretch shore | 0.60 m | 0.60 m | 0.98 m | |
| Big swell (3 m, 12 s) | Wave height where it breaks, Kite Beach / Main Reef | 2.88 / 3.03 m | 2.69 / 2.64 m | 3.15 / 3.15 m |
| Wave height at the Kite Beach shore | 0.33 m | 0.33 m | 0.82 m | |
| Along-shore wave power at Kite Beach | 0.08 kW/m | 0.09 | 0.37 | |
| Along-shore wave power at the summer stretch | 0.34 kW/m | 0.34 | 0.73 |
kW/m: kilowatts per metre of beach, the rate at which the waves carry energy along the shore. It measures the waves' capacity to push sand, not how much sand actually moves.
What it means: - Surf heights at the breaks: a modest effect, mostly 5–15% between the three versions, and up to about 20% (Main Reef in the big swell, Atlas level against drone level). The waves break on the reef edge, whose depth the two sources roughly agree on. - The beach and the back-reef: a large effect. If the Atlas is really 1.4 m too shallow everywhere, the back-reef is deeper and much less wave energy is lost crossing it. Waves at the Kite Beach shore would then be about 2.5 times bigger (0.8 m instead of 0.3 m), and the along-shore sand push about 4 times stronger. The evidence now favours the Atlas on the shallow reef, so this "drone level" case is unlikely. It was the biggest single uncertainty in the sand volumes and in "how sheltered is Kite Beach". - The directions and seasons of the sand drift are much less affected at Kite Beach. They depend on how the push changes with wave direction and season, not on its absolute size, and the push's sign at Kite Beach is the same in all three versions here. The satellite-based results (the seasonal cycles, trends and before-and-after-swell test) do not depend on the depths at all. - "As used" and "Atlas level" are almost identical near the Kite Beach shore, because the drone surveys cover the outer reef, not the inner back-reef. The corrected depths agree at Kite Beach too (from the corrected Kite Beach table: shore wave height 0.35 / 0.37 m and push 0.06 / 0.08 kW/m in the two conditions). But they change the summer stretch, which the "Atlas level" test did not reproduce. In the big swell, the wave height at the summer-stretch shore falls from 0.80 to 0.63 m and the push from 0.34 to 0.11 kW/m; in the typical winter condition the push turns from slightly towards Cabarete (+0.04) to about zero (−0.01, slightly towards Encuentro). Over ten years of hourly waves, the summer stretch's push towards Encuentro is about a third stronger on the corrected depths, mostly because in winter it now points towards Encuentro instead of about zero (Section 5.3). - Measured back-reef depths would be the most valuable single addition: a few kayak sonar lines at a known tide, with the Puerto Plata gauge now available for the tide.
3.7 The seabed from Encuentro to Cabarete Bay: where are the reef gaps and channels?
Waves breaking on the reef push water into the back-reef (the shallow water between the reef and the beach). That water has to get back out to sea. Where it leaves, it runs as a current and can carry sand away. So we looked for the gaps and channels in the reef along the whole coast (bathy_survey.py).
How we looked: - Pictures of the seabed. We took the median of the 25 clearest, calmest Sentinel-2 images from 2017–2026 and stretched the colours in the water. Pale areas are shallow sand or reef top. Dark areas are deeper water, but they can also be dense seagrass or coral. - Depths. We used the Coral Atlas depths everywhere, so the whole coast comes from one consistent source. We left the drone depths out of this map. They read deeper than the Atlas, by up to 2.5–3.5 m on the shallow reef (Section 3.6), so mixing them in would create false steps at the edges of each drone patch. - The deepest way out. For every spot in the back-reef, the computer finds the route out to the open sea (8 m deep) whose shallowest point is as deep as possible. It records that shallowest point on the route. Where many routes share the same shallowest point, the program groups them as one "outlet". These outlets are not necessarily gaps in the reef. Most of them (outlets 1, 3 and 7–11) lie only 48–110 m off the waterline, inside the back-reef: there the shallowest step on the way out is in the back-reef itself, close to the beach, not on the reef. Only outlets 2, 4 and 6 lie near the reef line (about 240–450 m out); outlet 5, in the between stretch, is in the back-reef about 160 m out. - A cross-check. We also made our own depth estimate from the clearest images, using the usual blue-to-green colour-ratio method. It follows the Atlas only loosely (correlation 0.74, typical difference 1.7 m). So we use it only to confirm that a deep patch is not a one-off in the Atlas.



What the depths show (Coral Atlas; 0 km is Encuentro's west end):
| Stretch | The reef | The back-reef (between reef and beach) | The shallowest point on the deepest route out (outlet number) |
|---|---|---|---|
| Encuentro beach (0–2.2 km) | Close in, about 180–200 m out, and very shallow (0.5–1 m) | Narrow and shallow, about 1 m | About 0.9 m deep, about 100 m off the beach, in the back-reef (1). No deeper route |
| Encuentro to the summer stretch (2.2–3.6 km) | Shallow, moving further out | 1–3 m | 1–2 m deep (2, 3, 4); outlets 2 and 4 are near the reef line |
| Between stretch (3.6–4.7 km) | Lower and broken, 1.5–3 m deep over the top, 400–500 m out | Wide and deep, 5–7 m in pockets | The deepest way out on this part of the coast: a lower section of reef at about 4.2–4.6 km, about 3 m deep, 450 m out (6). It takes the routes from about 3.95 to 5.1 km |
| Kite Beach (4.8–5.55 km) | The shallowest reef on the whole coast in the Atlas: 0.3–0.8 m over the top, 450–550 m out to its outer edge | Pockets 3–7 m deep | The north-west end (to about 5.1 km) leads north-west along the back-reef to outlet 6. Further south-east, the shallowest points are in the back-reef about 100 m off the beach, 2.3–2.6 m deep (7, 8). The Atlas shows no deep gap through the reef here, although there is a channel at about 5.0 km (below) |
| Kite point and the small beach (5.55–6.0 km) | About 600 m out | 2–4 m | About 3 m deep, about 70 m off the beach (9); the way out is into Cabarete Bay |
| Cabarete Bay west and middle (6.0–7.75 km) | Up to 750 m out off the west side; no reef across the middle (6.5–7.7 km) | Open water, 3–7 m | About 3 m deep, close to the beach (10); open to the sea |
| Cabarete Bay east (7.75–8.75 km) | The reef at Cabarete's eastern point, close in | Shallow | About 2.5 m deep, about 100 m off the beach (11) |
What it means: - The Atlas shows no channel through the reef off Kite Beach, but there is one. Local photos and the satellite breaking record show a channel at about 5.0 km, in the north-west half of Kite Beach, and XBeach (a model of waves, currents and sand in the surf zone, Section 4) shows it as a surging rip, strongest in big north swells (Section 15.3). Behind Kite Beach the back-reef is deep in places, and its water can also leave along the back-reef to the lower, broken reef off the between stretch. - The back-reef flow model (Section 15) agrees: behind the north-west part of Kite Beach the water runs north-west and leaves mainly through the lower reef at Kite Beach's north-west end, with the channel as a second route out. Further south-east it divides, and the rest flows round the Kite point into Cabarete Bay. Where it divides moves with the waves: at about 5.2 km on typical winter days and in big north-east swells, and at about 5.6–5.7 km, at the point, on summer and trade-wind days (Section 15.2). - The north-west end of Kite Beach is where much of that outflow turns out to sea. That is also where the "hinge" is (Section 7). - The Encuentro back-reef is shallow and has no deep way out. Water pushed over its reef leaves through shallow spots along its length, rather than in one strong outflow.
How much to trust it: - The Atlas depths are satellite estimates, typically about 1–3 m accurate. Dense seagrass and dark coral look "deep" to a satellite, so some of the 5–7 m pockets in the back-reef may really be dark seabed at 2–3 m. The whitewater on the reef crest can also make the crest look shallower than it is. - The "outlets" are a property of the depth map, not measured currents. They show where the shallowest step on the deepest way out lies; for most stretches that is in the back-reef near the beach, which says the back-reef, not the reef, limits the deepest route out. - The drone surveys read deeper than the Atlas, most on the shallow reef. Local knowledge and the photos in Section 15 support the Atlas and this map (Section 3.6), although they are not measurements. - A channel narrower than about 20–30 m would not show at the 10 m resolution of these images.
4. The tools we used, and why

| Tool | What it is | Why we used it | What it cannot do |
|---|---|---|---|
| Sentinel-2 waterlines | Automatic tracing of a waterline on satellite images (343 images over about 7 km, and 325 over 10.1 km). The traced line is a consistent marker in the wet sand, about 10–17 m landward of the water's edge (Section 3.1) | Ten years of free, regular observations: the "truth" every model is tested against | See sandbars, or anything faster than the 5-day revisit. It measures changes in width well, but the sizes of the seasonal swings are uncertain by several metres |
| ERA5 waves and wind | The European weather service's hourly reconstruction of past weather and waves | The only complete, free record of the offshore waves, 2017–2026 | Resolve the coast (its grid is about 50 km); it underestimates the local trade winds |
| Coral Atlas + drone depths | Satellite-estimated depths (typically about 1–3 m accurate), plus drone surveys over the Kite Beach reef and Cabarete Main Reef | The only depth data available. Since 1–2 October 2026 the wave models use the Atlas only on the reef (Section 3.6) | Measure the surf zone and beach; those are assumed |
| SWAN | The standard open-source coastal wave model (TU Delft). It follows the wave energy across the reef on a 20 m grid. | Turns offshore waves into waves over the reef, in the back-reef and at the beach. Each area has a lookup table of 720 runs (6 wave heights × 5 periods × 8 directions × 3 tide levels), so every hour since 2017 can be translated to the beach. Three areas (Encuentro, Kite Beach, Cabarete Bay) were run first, and again on the corrected depths on 1–2 October 2026: 4,320 runs in all. | Individual waves, sets or surf beat |
| SWASH | SWAN's sister model. It simulates every individual wave along a line from deep water up the beach, 1 m apart. | Gives what pushes sand on or off the beach: the undertow, the wave shape, surf beat and run-up. | Work in 2D over a large area (too slow). Our lines are 1D, which exaggerates surf beat. |
| Along-shore sand model | The classic "one-line" model. The waves' push along the shore (from SWAN) gives the sand the waves could move; where that flow changes, the beach would grow or shrink. | The standard way to test "is sand moving along the coast?" | Sand moving on and offshore; it only moves sand around. Tested against the satellites, it gives the pattern of the push but not the size of each beach's changes (Section 7.2) |
| Response model | A statistical model: beach width responds, with a memory, to the wave push at that beach | Tests which wave property explains the width, on years it never saw, against two baselines: the average year, and a smooth seasonal cycle with a trend | Explain how the sand moves |
| Flow and sand model | Our GPU current model with a standard sand formula | Currents through the reef gaps and the back-reef (Section 15) | The on-and-offshore processes at the beach. Its sand budget failed the satellite test (Section 15.6) |
Why this combination: each tool fills a gap in the others. The satellites give the answer to test against. SWAN gives the waves everywhere, all the time. SWASH gives the detail at the beach that SWAN leaves out. The sand models then test the two main ideas: sand moving along the shore, or on and off it.
Two more tools, added later:
| Tool | What it is | Why we used it | What it cannot do |
|---|---|---|---|
| XBeach (Deltares, v1.24) | The standard storm-and-beach model: wave groups, surf beat, undertow, sand stirred by breaking waves, and bed change | Settles whether a swell event builds or erodes the beach, the question SWASH could not answer | The slow rebuilding of a beach in calm weather. Most of our runs are 1D lines; the 2D runs are pilots (Section 13) |
| Before-and-after-swell test | Satellite widths just before and after the 76 biggest swells of 2017–2026, compared with randomly chosen dates | An independent, data-only check of what big swells do | See sand volume; it sees only the waterline |
A quick guide: how waves move sand
Waves move sand in two directions, and on a real beach both usually happen at once: - Along the beach (sideways): waves arriving at an angle push sand a little way along the shore with each wave. This is along-shore drift. It can carry a beach's sand to a neighbouring beach, and it reverses when the swell direction changes. Section 7 is about this. - On and off the beach (straight in and out): big, steep or stormy waves pull sand off the upper beach and leave it a little way offshore, often as a sandbar or, here, in the back-reef. Smaller, gentler waves, especially long-period swell, push it back up the beach over the following days and weeks. Section 6 is about this. - Usually a combination: sand moves diagonally, out and sideways in a storm, back in and sideways in calm weather. Over a season, what counts is the balance.
At Kite Beach, the evidence suggests the seasonal change is mainly the sideways kind (Section 8). The models show the sideways push switching with the seasons, but they cannot yet give the size of each beach's swing. Every big swell also does an on-and-off swap.
5. The waves at the beach (SWAN)
5.1 The offshore waves

Monthly averages of the ERA5 offshore waves, 2017–2026. The "period" is the time between wave crests. We use the peak period (the period of the waves carrying the most energy), taken as 1.2 times ERA5's mean period; ERA5's own peak period, available to July 2024, confirms that ratio in every month. Directions are where the waves come from, in degrees from north.
| Season | Height offshore | Peak period | Coming from |
|---|---|---|---|
| December–April | 1.4–1.6 m | about 8.5–9 s, with longer swells | North-east (about 50–65°) |
| June–August | 1.1–1.2 m | about 7 s (trade-wind chop) | East (about 75–85°) |
| September–October | about 1.3 m | about 9 s; the most long-period swell of the year (about 31% of hours with a peak period of 10 s or more) | North-east (about 50–65°) |
5.2 The reef shelters Kite Beach

The winter and summer cases on the earlier (drone-blended) depths, before the 1–2 October 2026 correction. At Kite Beach the corrected depths give almost the same shore waves (Section 3.6); at the summer stretch they give smaller waves in big swells.
The numbers below are from the SWAN lookup table on the corrected depths (data/swan_table_kite_v2.npz), averaged over the beach zone 20–120 m off the waterline.
- The reef breaks most of the waves. Behind it, waves at Kite Beach stay between about 0.13 and 0.55 m over the whole table, whatever happens offshore (0.2–0.5 m in 98% of the hours of 2017–2026). The summer stretch is less sheltered, reaching up to about 0.9 m.
- The tide matters a lot inside the reef. A 0.4 m higher tide lets about 40% more wave height through to the Kite Beach shore, and about a third more at the summer stretch.

Check: where SWAN breaks waves matches where the satellite images most often show white water (rank correlation 0.64 over the Kite Beach model area, on the earlier depths; a rank correlation compares the order of the values, not their sizes, and 1 would be a perfect match). That is a good sign, but not a measurement of wave height.
5.3 Ten years of waves at the beach

We translated every hour of 2017–2026 to the beach using the SWAN lookup table on the corrected depths (data/nearshore_hindcast.csv, rebuilt on 7 October 2026). The right-hand panel shows the key result: the push of the waves along the shore (the along-shore wave power, in kW per metre of beach). This is the waves' capacity to move sand along the beach, not the sand that actually moves (Section 7).
- On the summer stretch, the monthly average push is towards Encuentro in every month, strongest in July (about −0.13 kW/m) and weakest in January (about −0.04 kW/m). On the earlier depths it was about zero in winter; the corrected depths turn it towards Encuentro.
- On the between stretch, it is towards Encuentro from April to October, strongest in July (about −0.09 kW/m), and about zero from November to March.
- At Kite Beach, it is weak and towards Cabarete in the monthly average of every month: strongest in November–January (about +0.05 kW/m) and weakest in June–July (about +0.004 kW/m, close to zero). About 11% of individual hours push the other way, towards Encuentro.
6. What pushes sand on and off the beach
6.1 Across the reef

We ran SWASH along three lines: the middle and the west end of Kite Beach, and the summer stretch. All SWASH runs were redone on 7 October 2026 with two fixes from the quality review: the random waves sent in at the offshore end no longer repeat every 30 minutes, so the statistics now use the full analysed hour; and the beach no longer stops at +2 m, but carries on rising at 1 in 10 (to about +6.5 m at Kite Beach), so the run-up in big swells is no longer cut off. On typical days the results barely changed.
| Place | What the waves do | Effect on sand |
|---|---|---|
| Reef crest | Waves break; a strong seaward flow near the bed (the undertow), up to 0.22–0.37 m/s on typical winter and summer days | Pushes sand offshore, but there is little sand on the rock |
| Back-reef | Small waves, with a sharp shoreward surge and a weak seaward flow (on average 0.004–0.024 m/s) | Pushes sand gently onshore |
| Beach | Small waves (0.2–0.55 m high 10 m off the waterline) plus surf beat; the shoreward surges are sharper still | Onshore in every case we ran |

6.2 What about big swells?
We ran each line with offshore swells of 1, 2, 3 and 4 m, at 8 s and 12 s.

What the sweep shows (rows from top): 1. Surf beat is usually the bigger water motion at the beach, and it grows much faster with long-period swell (see the box below). How much bigger depends on the place. At the middle of Kite Beach it is 2.5–3 times the height of the ordinary waves in every run. At the summer stretch it is about 2–4.5 times, rising with swell height and period. At the west end of Kite Beach, where more ordinary wave height gets through, it is only 1.1–1.6 times on 1 m days, rising to about 1.5–3 times in 2–3 m swells. In a 2 m swell at the west end, for example, it is 0.45 m at 8 s but 1.02 m at 12 s. 2. The undertow at the beach grows with wave height and period, to about 0.16 m/s at the west end of Kite Beach for a 4 m, 12 s swell. 3. The sand push at the beach stays onshore at every height, by this measure. 4. Run-up (how high the water reaches up the beach, exceeded by 2% of waves):
| Place | Typical summer | Typical winter | 3 m, 12 s swell | 4 m, 12 s swell | Standard open-beach formula, 3 m / 4 m, 12 s swell |
|---|---|---|---|---|---|
| Kite Beach, middle | 0.41 m | 0.66 m | 1.30 m | 1.72 m | 1.9 m / 2.2 m |
| Kite Beach, west end | 0.55 m | 0.81 m | 2.91 m | 4.36 m | 1.9 m / 2.2 m |
| Summer stretch | 0.39 m | 0.52 m | 1.86 m | 3.69 m | 1.9 m / 2.2 m |
The reef cuts run-up a lot on small and medium days, and at the middle of Kite Beach even in big swells. At the west end of Kite Beach in 3–4 m long-period swells, and at the summer stretch in 4 m ones, the model gives more run-up than the open-beach formula, because of the surf beat. Read these big-swell numbers as an upper limit. A 1D line puts all the wave energy onto one profile, with no spreading along the shore, and so overstates surf beat and run-up. In version 0.8 the west end was given as "at least 2.0 m": that was the top of the modelled beach, where the old lines stopped. The line now carries on up the beach, so the run-up is no longer capped.
Surf beat, in brief. Waves arrive in sets. A big set breaking on the reef pushes extra water into the back-reef, and the water drains back out in the lull. The result is a slow rise and fall of the water level every 30 seconds to a few minutes. You see it as the water creeping further up the beach every minute or two, surges in the back-reef, and pulsing currents in the reef gaps. Behind a reef, surf beat passes almost unhindered while the ordinary waves are broken. So it becomes the main water motion at the beach, especially in long-period swell.
How sure are we? - Onshore push in typical conditions: medium confidence. The model's sand measure uses the near-bed flow only. It leaves out sand stirred up by breaking waves and carried off by surf beat's slow seaward flow, which is how big swells erode beaches behind reefs. - Big swells: the beach may well lose sand from the upper beach, with scarping and overwash, even though our measure says onshore. - The lines are 1D, which overstates surf beat and the big-swell run-up. - XBeach, which models that stirring-and-carrying process, is in Section 6.4. It shows that big swells do cut the upper beach.
Does surf beat build or erode the beach? - It can do either. In moderate conditions, its long, slow uprush carries sand up the beach face and builds the berm. In big swells, it lifts the water level so waves attack the upper beach, and its slow seaward flow carries off sand stirred up by the breaking waves. - The answer from XBeach (Section 6.4; the satellites cannot settle it, Section 6.3): in swell events, surf beat helps erode the upper beach, most in long-period swell. At the sheltered middle of Kite Beach the effect is small, possibly even a slight gain. On most lines the sand is only moved just offshore, where calmer waves can bring it back; Encuentro beach in 4 m swells is the exception.
6.3 Big swells in the satellite record: before and after
The test: - The events: the 76 biggest swell events of 2017–2026 (offshore height above 2.1 m, the top 5% of hours, at least 10 days apart). Half are long-period swells (11 s or more); half are short-period trade-wind seas. - The comparison: for each event, we compared the satellite beach width in the last image before the swell (within 12 days) with the width in the days and months after it. The waterlines are the sun-glint-corrected, tide-corrected series (Section 3.1). - Taking out the seasons: widths were measured relative to the usual width for that time of year, and the same calculation was done for 2,000 random dates in the same months (1,655 of them have usable images). - Checking for chance: for each stretch, type of swell and time window, we asked how often the same number of random dates gives a median change at least as far from the random-date median as the events' median is (the p value; small p = unlikely to be chance). We made 32 such comparisons, so about 3 would reach p < 0.1 by chance alone. The q value adjusts p for the number of comparisons.

| Stretch | Change 0–10 days after a long-period swell | After a short-period sea | Random dates |
|---|---|---|---|
| Kite Beach | −1.1 m (18 events; p = 0.78) | −2.1 m (20 events; p = 0.31) | −0.7 m |
| Summer stretch | −2.6 m (18 events; p = 0.06) | −1.2 m (20 events; p = 0.26) | +0.3 m |
| Between | −1.1 m (18 events; p = 0.39) | −2.0 m (20 events; p = 0.12) | +0.1 m |
| Encuentro | −0.9 m (18 events; p = 0.55) | −2.1 m (20 events; p = 0.04) | −0.2 m |
The n in the figure legend (25 long-period, 27 short-period) counts the events with a usable image before the swell.
Median change over events, counting only events with an image 0–10 days after the swell. p compares each change with the random dates. After allowing for the 32 comparisons, none stands out (q about 0.9 or more for every one). Later windows (10–120 days) are in outputs/swell_events.md.
What it shows: - No change after big swells stands out from ordinary weeks once the number of comparisons is allowed for. The satellites cannot pick out a clear effect of swell events on any stretch. The smallest p is at Encuentro after short-period seas (2.1 m narrower, against 0.2 m on random dates; p = 0.04); among 32 comparisons, one or two this low are expected by chance. - Kite Beach shows no clear mark. After short-period seas it is 2.1 m narrower in the first 10 days, against 0.7 m narrower on random dates (p = 0.31); after long-period swells, 1.1 m against 0.7 m (p = 0.78). Neither difference is distinguishable from chance. That does not prove the beach is unaffected: with this scatter (half of the random-date changes lie between about −4 and +4 m), a change of 1–2 m could be missed. - At most, the summer stretch is about 2.6 m narrower in the 10 days after a long-period swell (random dates: 0.3 m wider; p = 0.06 before allowing for the number of comparisons). This could be chance. If it is real, it fits the summer stretch being less sheltered than Kite Beach (Section 5.2). After 10 days, its changes are no different from the random dates. - The satellite limit: it sees the waterline, not the sand volume. A beach can lose sand from its dry upper part while the waterline stays put or even moves seaward (see 6.4). - Swell direction matters more than size or period. This test sorts swells by period, not direction. Sorted by direction, north swells do leave a mark: the south-east half of Kite Beach about 2 m wider within a few days (version 0.11; Section 7.5).
6.4 XBeach: what a swell event does to the beach
XBeach is the standard model for this question. Unlike our SWASH measure, it includes sand stirred up by breaking waves and carried off by the undertow and surf beat, and it updates the bed as sand moves.
How it was run:
- Lines: the same six as SWASH: the middle and west end of Kite Beach and the summer stretch, and three at Encuentro (Encuentro Right, Coco Pipe and Encuentro beach).
- Events: each case is a 12-hour swell event, at offshore heights of 1–4 m and periods of 8 s and 12 s, plus typical winter and summer waves at Kite Beach.
- Sand and rock: the reef is treated as rock with no loose sand (Coral Atlas reef zones); the back-reef floor and beach are sand. Locals report a sandy bottom almost everywhere, out past the reefs too, so the model may understate the sand available; the reef crest itself is rock, and whether the reef flats just inside it are sand or rock is not known.
- Sensitivity test: every case was run twice. The second run uses a larger value (0.25 instead of 0.1) of the setting that controls how much the waves' onshore push moves sand back (facua). The default is known to lean towards erosion, and published calibrations usually fall between the two.


Top: the bed change after a 12-hour swell. Middle: sand gained (+) or lost (−) on the dry beach. Bottom: sand gained in the back-reef. Strong colours = default setting, faded = the milder setting; circles = 8 s swells, squares = 12 s. All from 30°, at mid tide. Two bookkeeping limits of the figures: the "back-reef" total counts everything under water more than 600 m along the line from its offshore end, which at Encuentro, where the reef is close to the beach, also takes in the reef crest and the outer face of the reef; and the time-averaged values include the first hour (the start-up hour, before the bed is allowed to change) and miss the last hour. Neither affects the dry-beach numbers in the table below.
| Line | Typical winter (12 h) | 2 m, 12 s swell | 4 m, 12 s swell | 2 m and 4 m, 12 s, with the milder setting |
|---|---|---|---|---|
| Kite Beach, middle | −0.4 m³/m | −0.7 | −1.5 | +0.2 to +0.4 (gains) |
| Kite Beach, west end | −2.2 | −3.9 | −7.4 | −2.0 to −4.0 |
| Summer stretch | −0.6 | −0.8 | −2.8 | −0.3 to −1.3 |
| Encuentro Right | – | −2.0 | −5.4 | −0.6 to −2.2 |
| Coco Pipe | – | −2.3 | −7.0 | −0.8 to −2.6 |
| Encuentro beach | – | −1.7 | −4.1 | −0.5 to −2.6 |
Sand lost from the dry beach, above still water, in m³ per metre of beach per 12-hour event.
What it shows: 1. Swells cut the dry beach and park the sand just offshore. On every line except the middle of Kite Beach, the dry beach loses sand in every swell under both settings, more with bigger and longer-period swells. On the Kite Beach and summer stretch lines, the sand goes into the lower beach and inner back-reef, just seaward of the water's edge: what the dry beach loses, the back-reef gains. There it is not lost; it is moved within reach of the beach. Encuentro beach in 4 m swells is the exception: the back-reef part of the line loses sand too (1.8 m³/m at 8 s and 12.4 m³/m at 12 s, on top of the dry beach's 2.1 and 4.1), so in the model that sand is carried out past the reef, beyond easy reach of calmer waves. With the milder setting this happens only in the 4 m, 8 s swell, on a much smaller scale (about 1 m³/m at Encuentro beach and 0.3 m³/m at Encuentro Right). 2. The middle of Kite Beach is the most sheltered place on the coast. Its losses are small (0.1–1.5 m³/m per event), and with the milder setting it gains slightly in every swell. The model cannot tell us whether it gains or loses; either way the change is small. 3. The west end of Kite Beach, the summer stretch and Encuentro are more exposed, with losses of about 3–7 m³/m in a 4 m, 12 s swell. That fits the hint in the satellites (not strong enough to rule out chance) that the summer stretch narrows after long-period swells (Section 6.3). 4. The waterline often moves seaward while the dry beach loses sand. The sand settles just below the water's edge, so the still-water waterline advances: in a 4 m, 12 s swell by about 7 m at the middle of Kite Beach, 5 m at the summer stretch and 8–16 m on the Encuentro lines. (At the west end of Kite Beach it moves landward, by up to about 5 m, except in the 3–4 m, 12 s swells.) This may help explain why the satellites, which see the waterline, show no clear change after big swells. 5. Long-period swell does more than short-period swell of the same height, through its bigger surf beat. This answers the earlier question: in big swells, surf beat erodes the upper beach, and the reef reduces this a lot at the middle of Kite Beach.
How big is that compared with the seasons? Kite Beach's seasonal swing is about 18 m of width (outputs/beach_trends.md), which is roughly 55 m³ of sand per metre of beach, taking an active height of 3 m. A swell event in these runs moves up to about 7 m³/m across the beach, and mostly just offshore, where calmer waves can bring it back (Encuentro beach in 4 m swells is the exception). So swell events shuffle sand between the dry beach and the water's edge; they do not make the seasonal cycle. The seasonal cycle most likely comes from sand moving along the shore (Section 7).
Limits: - Recovery isn't modelled. XBeach is built for storms and is poor at the slow rebuilding of a beach in calm weather, so these runs show the cut, not the recovery. - The rest is assumed: the beach and back-reef floor sand, the sand grain size and the beach profile. - The lines are 1D: no currents along the shore or through reef gaps.
7. What moves sand along the shore
Version 0.9: the along-shore model, the nearshore wave record (hindcast) and the response model in this section now run on the SWAN wave tables built on the corrected reef depths of 1–2 October (Section 5). The along-shore formula's coefficient has also been corrected, so every potential volume is about twice what earlier versions printed. The changes this made are noted where they matter. The model numbers quoted below that are not in outputs/alongshore_swan.md (where the push flips, stretch potentials, gross volumes, the day-by-day table) come from alongshore_numbers.py (outputs/alongshore_numbers.md).
7.1 The seasonal sand circulation

This map shows the along-shore sand model's transport, driven by the SWAN waves at every stretch of beach and averaged over winter (December–March) and summer (May–August). It shows the waves' capacity to move sand along the shore (the "push"), not the sand that actually moves.
- On most of the coast, the waves push sand towards Encuentro (cyan). About three-quarters of the coast pushes that way in the average of every month.
- From Encuentro to the between stretch the push is stronger in summer, when the trade-wind waves come from the east.
- In western and middle Cabarete Bay it is stronger in winter.
- Kite Beach is the exception (orange). Here the push is weaker and changes with the seasons: towards the Kite point in winter; in summer the north-west end turns towards Encuentro, and the beach as a whole is close to balance.
- At the Kite point (south-east of Kite Beach), the push is towards Kite Beach on almost every day, and in the average of every month. It turns the other way on most true north-swell days, but only at the south-east end of Kite Beach, not on the Cabarete side of the point (Section 7.5).
- So, in the monthly averages, the pushes meet inside Kite Beach in every month, with a hinge at its north-west end (details in Section 7.4). This is the pattern of a sand trap, as far as the waves' capacity goes; whether sand actually collects also depends on how much sand the waves really move there, which has not been measured.
- In every month's average: the push from the point runs north-west into Kite Beach and meets the push from the beach's north-west part at about 5.2–5.35 km. This is where sand would collect.
- Winter: the north-west end of Kite Beach also pushes towards the middle, so the whole beach feeds the collecting point.
- Summer: the north-west end switches and pushes towards the between and summer stretches, which fits Kite Beach narrowing and the summer stretch widening.
- The summer stretch sits where the north-westward push weakens as the coast bends west, so more capacity arrives there than leaves. In the model this happens in every month, not only in summer; the link to the summer widening comes from the response model (Section 7.3).
Potential amounts: averaged over each stretch, the model gives potential drifts of about 150,000–450,000 m³ per year to the north-west: about 170,000 at Encuentro, 190,000–200,000 at the summer and between stretches, 150,000 at the small beach on the Cabarete side of the point and 450,000 in western Cabarete Bay (in the bay, north-west means towards the Kite point). At Kite Beach the net is much smaller, about 50,000 m³ per year towards the point. (outputs/alongshore_numbers.md.) These are capacities, not actual volumes: the formula's coefficient is not calibrated here, and how much of the sand the waves actually move depends on its grain size, which has not been measured. (Locals report plenty of sand on the bottom, so a shortage of sand is probably not what limits it.)

The top panel of this figure is on the model's calibrated scale (about 3% of the potential; Section 7.2), so its numbers are much smaller than the potential amounts above and should not be compared with them.
7.2 Does the along-shore model reproduce the satellite record? No, not beach by beach
We ran the full model day by day, 2017–2026, and compared it with the satellite waterline at every point. It does not reproduce the observed changes beach by beach. This is unchanged on the corrected depths. - The best fit was again the model with the least movement (the smallest scale tried, 3% of the potential). - Its seasonal swings are far too small: 0.5 m at Kite Beach against 16.8 m observed, 0.8 m at the summer stretch against 18.4 m. A single strength setting has to fit the whole coast, and the setting that fits best overall moves very little sand. - Over the coast as a whole, its seasonal timing does not match: the median correlation between the modelled and observed seasonal cycles, point by point, is 0.00. At Kite Beach the timing is roughly right (on the test years the model is widest in May, the satellite record in April; correlation 0.62), but the swing is far too small to count as reproducing the beach. - The between stretch scores well on the test years (skill +0.72), but its modelled swing is under 1 m and it is widest in July instead of January, so we do not count this as a success. - Adding sand traps at headlands and reef spurs did not help; any apparent fit changed sign with small changes in the settings.
Why: - The waves are computed at 20 m resolution in the back-reef, where the along-shore flow changes sharply at every reef gap. The model responds to those changes, which are mostly noise at this scale. - Much of the satellite signal is coast-wide: the whole coast is wider in winter. Along-shore transport can only move sand around, not add it everywhere at once. That part must come from on-and-offshore exchange (Section 6), or from beyond the study area.
What the model does give: the direction and rough pattern of the push, by season (the map above), including its seasonal reversal at Kite Beach's north-west end (Section 7.4). Even this is a pattern of capacity, not a measured flow.
7.3 A simpler model that works for one beach: which waves explain the beach width?

A statistical "response" model links each beach's width to the wave push at that beach, with a memory. It is driven by the hourly nearshore wave record on the corrected depths, fitted on 2017–2023 and tested on 2024–2026 (92 images). The kind of wave push used for each beach was chosen on the training years only, by the lowest error there.
"Skill" measures how much better the model is than a simple baseline: 0 means no better, 1 means perfect, below 0 means worse. We use two baselines: - the average year: each month's usual width; - the seasonal cycle plus a trend: a smooth seasonal cycle with a straight-line trend. This is the harder test, because the summer stretch has narrowed over the decade.
The ranges in brackets are 90% intervals.
| Beach | Best explanation (chosen on the training years) | Memory | Skill on the test years: vs average year | vs seasonal cycle + trend |
|---|---|---|---|---|
| Summer stretch | Push along the shore plus push onto it: wider when the push towards Encuentro has been strong | 90 days | +0.61 (correlation 0.90) | +0.46 (+0.30 to +0.57) |
| Kite Beach | Push along the shore | 120 days | +0.15 | −0.10 (−0.46 to +0.18) |
| Either beach | Wave energy alone, or two textbook beach models based on wave energy | – | Worse than the average year | – |
With the measured Puerto Plata tide (Section 3.5). An earlier version with the San Juan tide appeared to link Kite Beach to wave energy with a 1-year memory; that link came mostly from the tide correction.
What this means: - The summer stretch fills when sand is pushed towards it from the south-east, the Kite Beach side. It beats both baselines, though by less against the harder one. That matches the circulation map. - Kite Beach's year-to-year wiggles are not explained by any single wave measure. The along-shore push does a little better than the average year, but not better than a smooth seasonal cycle with a trend. Its average year is regular, but departures from it are not predictable from the waves at the beach. That fits a beach fed from both ends (Section 7.4), where the width depends on the balance of two flows and on how much sand is available, more than on the waves of the moment. Big waves do not clearly make it narrower either (Sections 6.3–6.4).
7.4 Two questions: does Kite Beach sand go south-east? Does sand swing back and forth, or walk one way?

Red = pushed south-east (towards Kite Beach from the west; away from the Kite point in Cabarete Bay); blue = north-west (towards Encuentro; in Cabarete Bay, towards the Kite point). ★ = where the push converges (sand would collect); ○ = where it diverges (sand would be pulled apart). All amounts are potential (capacity). The three SWAN model areas join at about 3.4 km (inside the summer stretch) and 5.6 km (at the small beach on the Cabarete side of the point); there is no clear jump in the transport at either join.
Where the push changes direction. The monthly along-shore transport around Kite Beach (smoothed over 250 m; positions by month in outputs/alongshore_numbers.md) shows two points where the push flips:
- Sand collects at about 5.2–5.35 km, in the south-east part of Kite Beach, in the average of every month. South-east of it, through the point to the Cabarete side, the push is towards Kite Beach (north-west) in every month's average.
- The split point to the north-west moves with the seasons.
- September to April: it sits at about 4.35 km, in the between stretch north-west of the beach, so sand from there is pushed into Kite Beach.
- June–July: it moves to about 4.9 km, just inside the north-west end of Kite Beach, so sand from that end is pushed away towards the between and summer stretches. May and August are in between.
- The north-west end of Kite Beach is therefore the hinge of the seasonal swing.
- What the corrected depths changed: the collecting point is now at about 5.2–5.35 km (about 5.2 km before), and the summer hinge moved from about 4.75 km to about 4.9 km. The pattern is otherwise the same.
Does Kite Beach sand go south-east, towards Cabarete? According to the wave-push model, very little, but this is not settled.
- At the south-east end of Kite Beach (about 5.4–5.5 km): the push runs south-east on most true north-swell days. Those are only about 3% of days, mostly November to April (Section 7.5).
- On the Cabarete side of the point: on the corrected depths the push runs towards the point on practically every day, whatever the swell direction. The earlier version's south-east push there on north-swell days has gone.
- The water currents near the point run the other way, towards Cabarete Bay, and the models now agree on this. In the strip 20–150 m off the waterline just south-east of the point (5.55–6.0 km), the mean current along the shore is (m/s, + = towards Cabarete Bay; winter / summer):
- the back-reef current model (Section 15): +0.23 / +0.15;
- the 2D XBeach Kite Beach pilot on the corrected depths: +0.18 / +0.18 (outputs/xbeach2d_v2_pilot.md);
- the 2D XBeach bay pilot on the corrected depths: +0.20 / +0.19 (outputs/xbeach2d_bay_v2_pilot.md).
On the older depths the Kite Beach pilot also runs it towards the bay (+0.24 / +0.28); the older bay pilot does in winter (+0.16) but has almost no current there in summer (outputs/xbeach2d_pilot.md, outputs/xbeach2d_bay_pilot.md).
- Why version 0.9 said the opposite. XBeach writes its currents as east and north components; our scripts treated them as components along XBeach's own grid and turned them a second time. That scrambled every 2D XBeach current direction up to version 0.9, and made XBeach appear to run the water at the point towards Kite Beach. Read correctly, the time-averaged XBeach flow balances far better (it must neither pile up nor drain water; the mismatch falls from about 85% to about 12% of the flow, in both pilots), and XBeach's wave force in the breaking zone points straight at the shore (outputs/kite_point_nest.md).
- The waves agree. On the reef at the point the waves come from about 31–33° in SWAN and 32–37° in XBeach, and from about 22° in the satellite images (the median of 103 images taken during swells, 900 m out; 98% of them from north of the coast normal; outputs/waves_from_space.md). The coast at the point faces 57°, so the waves cross the reef from north of straight-on and push the water along the shore towards Cabarete Bay. XBeach's push on the reef there (+2.6 to +3.2 N/m² along the shore in winter) is close to SWAN's (+2.2).
- Grid size does not change it. Rerun on a 5 m grid instead of 10 m, with the wave push from SWAN nested at 5 m or 2.5 m around the point, the current model gives +0.25 to +0.30 m/s in winter and +0.16 to +0.19 m/s in summer in the same strip, against +0.22 and +0.14 on the 10 m grid in the same test (outputs/kite_point_nest.md). With SWAN's full wave force instead of the breaking-only push it gives +0.22 in winter and +0.17 in summer.
- So the push along the beach and the current a little further out point different ways. The along-shore push (above) is the capacity of the small waves that reach the beach, after the reef and the point have bent them, to move sand along the beach face. The current is driven by the bigger waves breaking on the reef 400–700 m out, and flows past the point through the strip 20–150 m off the waterline. (The along-shore model reads its waves 20–120 m off the waterline, so the two bands overlap; that the push acts mainly at the beach face and the current mainly further out is our interpretation, not something the models show.) This makes it more likely that some Kite Beach sand leaves south-east past the point, and some small-beach sand goes on into Cabarete Bay, with the current.
- The current has sand to carry. A local reports (9 October 2026) that the whole bottom of Cabarete Bay and from Kite Beach to Encuentro is sandy, out past the reefs too, with plenty of sand to be seen in the murky water. Up to now our picture of where sand lies came only from the Coral Atlas, a satellite map of reef shapes that does not measure sand; the local observation is the better evidence for where sand lies, though it says nothing about thickness or grain size. With sand on the bed in the strip 20–150 m out, some sand moving south-east past the point is more likely than earlier versions said. The push along the beach face still runs towards Kite Beach. How much the current moves, and whether it outweighs that push, the models cannot say: that depends on the grain size and on how much of the sand is loose and stirred up, and it would take measurements (Section 12).
Back and forth, or walking one way? Mostly back and forth. Only two stretches show a clear trend.
| Stretch | Seasonal swing (satellite) | Widest / narrowest | Trend 2017–2026 |
|---|---|---|---|
| Encuentro | 4.5 m | Nov / Jul | −0.15 ± 0.25 m/yr (no clear trend) |
| Summer stretch | 22 m | Aug / Apr | −0.8 ± 0.7 m/yr (narrowing, only just outside zero) |
| Between | 7 m | Dec / Aug | +0.7 ± 0.4 m/yr (widening) |
| Kite Beach | 18 m | Feb / Sep | +0.3 ± 0.9 m/yr (no clear trend) |
| Small beach on the Cabarete side of the point | 26 m | Aug / Apr | −2.0 ± 0.6 m/yr (narrowing) |
| Cabarete Bay west | 22 m | Jan / Aug | +0.6 ± 0.6 m/yr (no clear trend) |
From beach_trends.md: tide-corrected satellite waterlines; trends from monthly means with the seasonal cycle removed; ± is two standard errors, allowing for the way one month's width carries over into the next. The seasonal swing is the range of the monthly medians. The timing of the seasons is robust, but the sizes of the swings are uncertain by several metres (Section 3.1).
- The seasonal swing is much bigger than ten years of net change. Kite Beach swings about 18 m within each year, and its ten-year trend cannot be told apart from zero. So most of the movement is sand going back and forth with the seasons.
- The clear trends are the narrowing small beach on the Cabarete side of the point (about 2 m a year) and the widening between stretch. The summer stretch may be narrowing slowly, but only just outside the uncertainty. The trends do not show Kite Beach gaining sand, so they do not by themselves support the sand-trap idea; that rests only on the pattern of the push (above), which is a capacity.
- The waves' capacity to move sand towards Encuentro is large (about 150,000–200,000 m³ a year of potential from the summer stretch to Encuentro), yet Encuentro is not growing. Two explanations fit: the actual drift is limited by how much loose sand reaches Encuentro; or a large flow passes through, with sand leaving Encuentro, towards Sosúa or offshore, as fast as it arrives, which would leave the widths unchanged. The satellites cannot tell these apart. But locals report that the bottom is sandy all the way from Cabarete Bay to Encuentro and out past the reefs, so a shortage of sand is unlikely and a flow passing through is the more likely of the two. A shortage may still apply close to the beach, if Kite Beach holds the sand that moves along the beach face.
- Ten years is short for trends like these, and they could shift with a few big swells or a change in the reef.
7.5 Around the Kite point: Cabarete Bay
The study was extended about 2.5 km past Kite Beach, round the Kite point and along the whole of Cabarete Bay, to its eastern headland. This added: - a new satellite waterline analysis of 325 images, 2017–2026, over 10.1 km of coast; - a third SWAN wave model area with its own 720-run table; - a wider 2D XBeach model, from Kite Beach through the point to the bay's east end.

Kite Beach (top left) round the point into Cabarete Bay, 2017–2026 (every second image).

What the satellites show (coast_budget.py):

| Stretch | Widest | Narrowest | Seasonal range | Seasonal swing of beach area | Trend 2017–2026 |
|---|---|---|---|---|---|
| Kite Beach | Feb | Aug | 18 m | 13,700 m² | +0.4 ± 0.8 m/yr (no clear trend) |
| Small beach on the Cabarete side of the Kite point | Aug | Apr | 26 m | 11,600 m² | −2.0 ± 0.6 m/yr |
| Cabarete Bay west | Jan | Aug | 22 m | 16,300 m² | +0.6 ± 0.6 m/yr (no clear trend) |
| Cabarete Bay middle (town beach) | Jul | Apr | 9 m | 9,100 m² | +0.2 ± 0.5 m/yr |
| Cabarete Bay east | Dec | Jun | 9 m | 8,700 m² | −0.5 ± 0.5 m/yr |
These figures come from the wider coast analysis, which draws the stretch boundaries a little differently, so Kite Beach's numbers differ slightly from Section 7.4 (here +0.4 ± 0.8 m/yr and narrowest in August, there +0.3 ± 0.9 m/yr and narrowest in September; August and September differ by only about 1 m in the typical year, and neither trend is distinguishable from zero).
What this means: - The small beach on the Cabarete side of the Kite point is the odd one out. It is widest in August, when Kite Beach and Cabarete Bay west are narrowest. - Its ups and downs, after removing the average year, run opposite to Kite Beach's. The correlation is negative at every delay from 4 months one way to 4 months the other (−0.22 to −0.51). It is clear (p between 0.001 and 0.04) at every delay except zero (−0.22, p = 0.14). This broad pattern says the two trade sand, but it does not tell which one leads, or by how long. - Its seasonal swing of beach area is close to Kite Beach's (11,600 against 13,700 m²). - That is the fingerprint of sand being traded, in one direction or the other. - It is also the one stretch here clearly losing sand over the decade (−2.0 ± 0.6 m/yr). None of the other four stretches shows a trend that can be told apart from zero. - Kite Beach and Cabarete Bay west move together (correlation +0.81 in the same month): both widest in winter.
What the models show: - The wave push (SWAN, along-shore model; the month-by-month chart in 7.4) runs north-west, towards the Kite point, along all of Cabarete Bay, in the average of every month. It is strongest in the bay's west, about 30,000–45,000 m³ per month of potential transport averaged over that stretch. - At the small beach on the Cabarete side of the point, the push is towards the point in every month, and changes little through the year. Whether the model has this beach gaining or losing sand depends on exactly where its ends are drawn, so the model does not show the summer filling and winter emptying that the satellites see. - The currents near the shore: 2D XBeach against the current model. Read correctly (version 0.10; Section 7.4 explains the error that scrambled XBeach's directions up to version 0.9), the two models broadly agree along the coast:
| Stretch | XBeach bay pilot (corrected depths) | XBeach Kite Beach pilot (corrected depths) | Current model (Section 15) |
|---|---|---|---|
| Between stretch (4.1–4.8 km) | +0.13 / +0.06 | +0.11 / +0.06 | +0.08 / −0.02 |
| Kite Beach (4.8–5.55 km) | −0.05 / −0.01 | −0.12 / −0.06 | −0.01 / −0.17 |
| Kite point, SE side (5.55–6.0 km) | +0.20 / +0.19 | +0.18 / +0.18 | +0.23 / +0.15 |
| Cabarete Bay west (6.0–6.75 km) | −0.05 / +0.21 | +0.12 / +0.12 (near the model's edge) | −0.10 / −0.04 |
| Cabarete Bay middle (6.75–7.75 km) | −0.07 / −0.02 | – | −0.13 / −0.18 |
| Cabarete Bay east (7.75–8.3 km) | −0.40 / −0.34 | – | −0.31 / −0.32 |
Mean current along the shore, 20–150 m off the waterline (m/s, winter / summer); + = south-east, towards the Kite point from the Kite Beach side and towards the bay's east end beyond it; − = north-west. From outputs/xbeach2d_bay_v2_pilot.md, outputs/xbeach2d_v2_pilot.md and outputs/kite_point_nest.md.
- At the point, all three run the water towards Cabarete Bay in both seasons (Section 7.4).
- Along Kite Beach, all three run it towards Encuentro (0.01–0.17 m/s); north-west of Kite Beach, in the between stretch, both XBeach pilots run it towards Kite Beach, as the current model does in winter (in summer the current model has almost none there).
- In the middle and east of the bay, both models run it north-west, towards the Kite point, strongest in the east (0.3–0.4 m/s).
- Only in the west of the bay do they differ: the currents there are weak and change direction between the models and seasons.
- On the older depths the bay pilot gives much the same pattern (towards the point in the bay's middle and east, −0.10 to −0.38 m/s in winter), except at the point in summer, where it has almost no current (
outputs/xbeach2d_bay_pilot.md).

Columns: wave height; difference from SWAN; mean current (arrows, read correctly since version 0.10); bed change over 2 hours. Top: winter. Bottom: summer. Corrected depths.
Does north swell reverse the push? Only at the south-east end of Kite Beach. The monthly averages hide what happens on individual days. Here is the day-by-day push (2017–2026) from the along-shore model on the corrected depths, by the day's average swell direction offshore:
| Swell comes from | Share of days | South-east end of Kite Beach (5.45 km) | Small beach on the Cabarete side of the point (5.75 km) | Cabarete Bay west (6.4 km) |
|---|---|---|---|---|
| North (0–15°) | 3% | south-east (towards the point) on about 70% of days | north-west on about 98% | north-west on about 94% |
| North-north-east (15–35°) | 9% | north-west on about 85% | north-west every day | north-west every day |
| North-east, east-north-east, east (35°+) | 88% | north-west every day | north-west every day | north-west every day |
North-west is towards Kite Beach (and, on the Cabarete side, towards the point); south-east is towards Cabarete. From alongshore_numbers.py (outputs/alongshore_numbers.md): the model's daily push, by the day's mean offshore (ERA5) swell direction. The wave model's table covers swell from 0° to 105°, so swell from north-north-west is treated as due north. About four in five north-swell days fall between November and April.
- On true north-swell days, the push at the south-east end of Kite Beach runs the other way, south-east towards the point, so the collecting point moves south-east to about 5.5 km, at the point, on those days.
- Those days are uncommon: about one day in 30. North and north-north-east swells together are about one day in eight.
- On the Cabarete side of the point, the push stays towards the point even on north-swell days. On the older depths it had turned towards Cabarete Bay on most of them; that result has gone with the corrected depths.
- So, in the model, the net push over a month, and a year, is towards Kite Beach.
What the satellites show after north swells (new in version 0.11): a small step at Kite Beach. If north swells really turn the sand south-east, the satellites should see it: the south-east end of Kite Beach wider after north swells, and stretches further north-west narrower.
The test: - The image pairs: every pair of clear satellite images taken no more than 30 days apart, about 320 pairs from 2017 to 2026. For each pair, the change in beach width on each stretch (tide-corrected, Section 3.1). Kite Beach is split into its north-west half (4.8–5.15 km) and south-east half (5.15–5.5 km). - The waves between the two images: the offshore wave energy (ERA5; height squared times period) that arrived between them. It is split into north swells (from 320° to 25°, north-west to north-north-east) and all other waves. - The fit: the width change against both kinds of energy at once. So a rough winter in general cannot pass for a north-swell effect. The result is given as metres per typical north swell (the median north-swell energy among the pairs that had any). - Allowing for delay: the wave window was also moved 3, 7 and 14 days earlier, so a swell counts only if it came at least that long before the image. This tests whether sand arrives some days after the swell. - Checking for chance: the p value comes from shuffling the north-swell energy among the pairs 5,000 times. q adjusts p for the 49 comparisons made (this test and the event-by-event check below). - North swells: about 75 in the ten years with offshore height at least 1.5 m (peaks at least 10 days apart), about six each November–April.

| Stretch (north-west to south-east) | Per north swell, waves up to the image | Per north swell, waves up to 3 days before | p (3 days) | q (3 days) |
|---|---|---|---|---|
| Encuentro | 0.0 m | +0.5 m | 0.12 | 0.48 |
| Summer stretch | −1.2 m (−2.8 to −0.4; p = 0.03) | −0.7 m | 0.24 | 0.59 |
| Between | +0.3 m | +0.9 m (0.0 to +1.6) | 0.03 | 0.27 |
| Kite Beach, north-west half | −0.5 m | +0.5 m | 0.35 | 0.59 |
| Kite Beach, south-east half | +1.5 m (+0.6 to +2.4; p = 0.01) | +2.3 m (+1.2 to +3.4) | < 0.001 | 0.02 |
| Small beach on the Cabarete side of the point | −1.0 m (p = 0.09) | −0.1 m | 0.84 | 0.87 |
| Cabarete Bay west | +1.0 m (p = 0.03) | +1.7 m (+0.6 to +2.7) | 0.002 | 0.06 |
From north_swell_events.py (outputs/north_swell_events.md). In brackets: 90% ranges from resampling the image pairs. With the window moved 7 or 14 days earlier, no stretch stands out.
What it shows: - After a north swell, the south-east half of Kite Beach is wider, by about 2 m for a typical swell. This stands out from chance even after allowing for the 49 comparisons. It holds when the north sector is narrowed (330°–15°, 340°–10°) or widened (300°–30°), and when the 2017 hurricanes (Irma and Maria) are left out. - Western Cabarete Bay is wider too, by about 1.7 m. So some of the sand carries on past the point into the bay. The along-shore model does not show this (its push on the Cabarete side of the point stays towards Kite Beach, above). But it fits the current near the point, which runs towards Cabarete Bay (Section 15). - The summer stretch tends to be narrower, by about 1 m, mostly in images taken during or just after the swell. This is less sure: it does not stand out once the number of comparisons is allowed for. - The north-west half of Kite Beach does not gain. The sand seems to pass along it and settle at the south-east end, in the shallows on the west side of the point. That is also where the along-shore push turns south-east on north-swell days (above). - The step comes within a few days. It is clearest when only swells at least 3 days before the image are counted, and gone at 7 days. So the sand arrives within about a week of the swell. - It fits the wave models. The along-shore model turns the push south-east at the south-east end of Kite Beach on north-swell days. A new whole-coast XBeach run (not yet written up in this report) turns the sand flow south-east along the whole coast in a north swell, from Encuentro to Cabarete Bay, and north-west in every other kind of wave.
Steps, or steady movement? Probably both, and the satellites cannot fully tell them apart. - Each step is small against the scatter. North swells explain only about 5% of the change from one image to the next at the south-east half of Kite Beach. Most of that change is scatter in where the satellite line falls, about 9 m between images there. So single swells cannot be seen; the effect shows only on average. - But the steps could add up. About six north swells a winter, at about 2 m each, is roughly 12–14 m. That is most of Kite Beach's seasonal swing of about 18 m. The beach is widest in February, at the end of the north-swell season. So north swells could account for much of the winter widening at the south-east half of Kite Beach, with steadier movement the rest of the year, such as the summer drain back towards the summer stretch (Section 7.4). This is a rough estimate, not a measured budget.
A check, event by event. The same question asked the way Section 6.3 asks it: the width after each north-swell peak against random dates in the same months, with the usual seasonal change taken out. It gives the same directions but weaker results. In the 10 days after a north swell, the south-east half of Kite Beach was wider after 63% of them and the summer stretch narrower after 71%; neither stands out once the number of comparisons is allowed for. Taking out the seasonal change also takes out part of the north-swell effect if north swells help make the seasons, so this check is expected to be weaker.
Caveats: - ERA5 gives one average direction for all the waves. Many of these "north" swells are near the edge of the sector (20–25°), where a north swell and the trade-wind waves are blended. - The satellite sees the waterline, not the sand volume (Section 6.3).
Putting it together: - The small beach on the Cabarete side of the Kite point behaves like a seasonal sand store. (The point itself is rock; the sand passes it through the shallow water in front.) It fills in summer and empties by April, opposite to Kite Beach, and the two trade sand according to the satellites. - How the sand moves between them is not settled. - The wave-push model pushes sand from western Cabarete Bay, past the small beach and the point, into Kite Beach in every month's average, with little seasonal change. It does not explain why the small beach fills in summer and empties in winter. - The current near the point runs towards Cabarete Bay in both models and both seasons, with little seasonal change (above), so it does not explain the small beach's seasons either. (An earlier idea, that the current past the point is weak in summer and strong towards Kite Beach in winter, came from the misread XBeach output and is withdrawn.) - Because the water near the point flows towards Cabarete Bay, some sand from Kite Beach and the small beach may go that way with the current, while the push along the beach face runs towards Kite Beach (Section 7.4). With a sandy bottom there (local observation), the current has sand to carry, so some sand going that way is likely; but the models cannot say which wins, or how much moves. That depends on the grain size and how much of the sand is stirred up, and is unmeasured. - Over the decade this small beach has narrowed about 2 m a year. Where that sand went is not known: Kite Beach and the bay west show no clear trend. - In the middle and east of the bay the models agree: the wave push and both current models all run north-west, towards the Kite point. (Up to version 0.9 the 2D XBeach currents seemed to run south-east there; that came from the same reading error.)
7.6 Does the wind itself move sand?
Besides making waves, a strong wind blows dry sand directly across the beach. You can see it on windy afternoons as a thin sheet of grains skipping along the dry upper beach. We estimated this for every hour of 2017–2026 (aeolian.py).
How the estimate works: - Wind strength. Dry beach sand of this size starts to move at about 6.7 m/s (13 knots) of wind. Above that, the amount moved rises very steeply with wind speed. - Dry sand only. Hours with rain in that hour or the six before were treated as wet (23% of hours), and the wet strip at the water's edge was left out. - Beach width. The wind needs a run of dry sand to pick up a full load. We measured each beach's dry width on the satellite images: about 10 m at Encuentro, 30 m at the summer and between stretches, 55 m at Kite Beach and western Cabarete Bay, and 75 m at the town beach. These are rough, to perhaps ±10 m. - The weak point is the wind record. The ERA5 wind data we have underestimate Cabarete's afternoon sea breeze: they show typical afternoon winds of 5–7 m/s, while kite-season afternoons are commonly 8–13 m/s. So we ran three versions, with daytime winds as recorded, 1.3 times stronger, and 1.6 times stronger.

| Beach | Dry beach width | Sand blown inland per metre of beach per year (daytime wind × 1.0 / × 1.3 / × 1.6) | Sand blown along the beach per year, towards Encuentro (wind × 1.3) |
|---|---|---|---|
| Encuentro beach | 10 m | 1 / 6 / 17 m³ | about 230 m³ |
| Summer stretch | 30 m | 3 / 16 / 43 m³ | about 520 m³ |
| Between stretch | 30 m | 3 / 18 / 47 m³ | about 470 m³ |
| Kite Beach | 55 m | 2 / 13 / 34 m³ | about 1,100 m³ |
| Small beach on the Cabarete side of the Kite point | 35 m | 3 / 20 / 52 m³ | about 460 m³ |
| Cabarete Bay west | 55 m | 3 / 19 / 50 m³ | about 790 m³ |
| Cabarete Bay middle (town beach) | 75 m | 1 / 8 / 20 m³ | about 1,700 m³ |
| Cabarete Bay east | 40 m | 1 / 8 / 20 m³ | about 900 m³ |
What it means: - The wind blows sand mostly along the beach towards Encuentro, and partly inland. The trade wind comes from the east, while the beaches face north to north-east, so it blows at an angle across them. - It happens mostly in summer. Wind-blown sand peaks in June–August, when the trades are strongest and the weather driest, and is lowest from September to December. That is the same season Kite Beach narrows, so the wind may add a little to the summer loss. - Along the beach, the wind moves far less sand than the waves could. It shifts hundreds to a few thousand cubic metres a year per stretch, against the waves' capacity of tens of thousands (net, at Kite Beach) to hundreds of thousands of cubic metres a year. - The sand blown inland matters for the long term. Sand blown into the vegetation, gardens, roads and buildings behind the beach usually does not come back, so it is a slow, permanent loss. - The likely size is small. - Middle estimate (wind × 1.3): about 13 m³ per metre of beach a year at Kite Beach. That would be equivalent to about 4 m of beach width a year if the sea didn't replace it. - Why it is probably less in reality: the satellites show no such loss at Kite Beach (its ten-year trend cannot be told apart from zero). Formulas like this one generally overstate the real amount, because of damp sand, shells and coarser grains, people, kite gear and buildings; we have not measured by how much here. - Best guess: the real inland loss is a few cubic metres per metre of beach per year. That is small compared with the seasonal swing (about 55 m³ per metre: an 18 m swing over a 3 m active height), but not negligible over decades. - To pin it down, a local wind record (the Cabarete Tempest station) would be the best improvement. Simple sand traps at the back of Kite Beach for a few weeks in summer would also measure it directly (Section 12).
8. Putting it together: the sand story
Revised for version 0.9 (7 October 2026); item 5 updated for version 0.10 (8 October 2026). What the satellites measured is stated as fact; what the models say the waves could do is stated as the waves' capacity, not as measured sand movement.
- Winter (December–March). North-east swells arrive. The reef breaks them, but the part that gets through pushes along the back-reef towards Kite Beach from both its ends: from its north-west end, and from the Cabarete side, past the rocky point. In the monthly averages the two pushes meet inside Kite Beach, at about 5.2–5.35 km. The satellites show Kite Beach at its widest in February. In the back-reef and at the beach, the waves also push sand gently onshore.
- Summer (May–August). The swell drops, and the trade winds bring short, steep waves from the east. At the north-west end of Kite Beach the push reverses, towards Encuentro (most of all in June–July), so that end drains north-west. The summer stretch fills: it is widest in August–September, and of all the wave measures, the along-shore push of the waves explains its width best (Section 7.3).
- Autumn (September–November). Swells return from the north-east, and September–October has the most long-period swell of the year (Section 5.1). Kite Beach is at its narrowest in September, then recovers.
- Big swells. In the 1D XBeach runs each big swell cuts the dry beach and parks the sand just offshore, and calmer waves then push it back onshore (SWASH). The satellites cannot pick out a clear effect: the changes in the days and weeks after big swells are not bigger than after ordinary days, once the number of comparisons is allowed for (Section 6.3). At most, the summer stretch is about 2.6 m narrower in the ten days after a long-period swell (random dates: +0.3 m), but this could be chance.
- Past the point: the small beach on the Cabarete side of the Kite point fills in summer and empties by April, opposite to Kite Beach, and the two trade sand according to the satellites (Section 7.5). How the sand moves between them is not settled: the wave push along the beach face runs towards Kite Beach in every month's average, while the water near the point drains into Cabarete Bay, on which the current model and XBeach now agree (Sections 7.4, 7.5 and 15.7). Locals report a sandy bottom there, so the current has sand to carry, and some sand leaving south-east past the point with it is likely. Which way wins there, and how much moves, is unresolved (grain size and how much sand is stirred up are unmeasured), and neither model explains why the small beach fills in summer and empties by April.
- Over the years: most of the change is the seasonal swing. Underneath it, the small beach by the point has narrowed by about 2 m a year and the between stretch has widened; Kite Beach, Encuentro and western Cabarete Bay show no clear trend over these ten years (Section 7.4). So the satellites do not show Kite Beach steadily trapping sand; the "trap" is where the waves' push converges, which is a capacity, not a measured gain.
- On top of that, most of the coast is a little wider in winter.
- Through-flow: some sand probably passes through the system, towards Sosúa or out to sea through the reef exits, but the models could not measure how much (Section 15.6). Locals report that the bottom is sandy from Cabarete Bay to Encuentro and out past the reefs, so there is plenty of sand to feed such a flow, and it is the more likely reason that Encuentro does not fill up despite the waves' large capacity (Section 7.4). After big winter swells the water outside the reef is cloudier all along the coast, most of all off Cabarete Bay, which fits plenty of sand on the bottom being stirred up, although rain runoff has not been separated (Section 15.4).
Confidence: - High for the timing of the seasonal swings at Kite Beach and the summer stretch; medium for their size. - Medium: the direction of the waves' along-shore push and its seasonal reversal at Kite Beach's north-west end, and that the summer stretch follows it. - Medium: the onshore push in normal conditions; the two clear ten-year trends (the small beach by the point narrowing, the between stretch widening). - Medium: the water near the shore at the Kite point flows into Cabarete Bay (both current models and the wave directions agree; not measured). - Medium-low: big swells cut the dry beach and park the sand just offshore (1D XBeach only). - Low: the trends at the other beaches, all the volumes, and which way the sand goes at the Kite point. - Not yet known: how much sand passes through the system.
9. Encuentro and Coco Pipe (new model area)
We built a second SWAN model area for Encuentro and Coco Pipe, with its own 720 runs. Unlike Kite Beach, it has no drone depths: it uses the Coral Atlas depths plus an assumed beach profile. Its lookup table was rebuilt with the rest on the corrected depths of 2 October (data/swan_table_encuentro_v2.npz), and the surf and along-shore numbers use that version.

9.1 What it tells us about sand
- The reef at Encuentro is narrow and close to shore, about 180–200 m out, compared with 450–550 m at Kite Beach. There is almost no back-reef to shelter the beach.
- The beaches change little with the seasons. The satellite waterline swings by about 4.5 m over the average year, widest in November and narrowest in July (
outputs/beach_trends.md). The independent water's-edge tracer gives about 9 m, widest in October and narrowest in May (outputs/waterline_crosscheck.md). So the swing is small, but its size and timing are uncertain. - The waves push sand towards the west end of Encuentro in every month's average, with similar strength in winter and summer. There is no seasonal reversal like Kite Beach's, which fits the small seasonal swing. This is the waves' capacity, not a measured flow. The potential drift averaged over the Encuentro stretch is about 165,000 m³ a year (
outputs/alongshore_numbers.md), but how much sand actually moves depends on its grain size and how much of it is stirred up, neither of which has been measured, and the same model does not reproduce the satellite changes beach by beach (Section 7.2). - Why Encuentro does not fill up. Two explanations fit: little loose sand reaches it, or a steady flow passes through, towards Sosúa or offshore, leaving as fast as it arrives. Locals report that the bottom is sandy from Cabarete Bay to Encuentro and out past the reefs, with plenty of sand, so a flow passing through is the more likely; little sand arriving may still play a part close to the beach, if Kite Beach holds the sand moving along the beach face (Section 7.4). XBeach also has some sand carried out past the reef at Encuentro beach in 4 m swells (Section 6.4).
- Across the beach (SWASH): see Section 9.3.
9.2 What it tells us about surfing
See Section 10 for all five spots.
9.3 Across the reef at Encuentro and Coco Pipe (SWASH)
SWASH lines through the Encuentro Right peak, the Coco Pipe peak and the middle of Encuentro beach, for offshore swells of 1–4 m at 8 s and 12 s (rerun on 7 October 2026 with the fixes described in Section 6.1):

- Surf beat is the bigger water motion at the shore here too: about 0.24–0.9 m in swells up to 3 m, compared with 0.12–0.37 m for the ordinary waves. It is biggest in long-period swell.
- The seaward flow over the narrow reef flat is stronger than in the Kite Beach back-reef: in 4 m swells it averages 0.12–0.16 m/s over the inner 300 m of the line (reef flat and back-reef), compared with 0.01–0.04 m/s in the Kite Beach back-reef (middle and west end). The Encuentro reef flats drain hard between sets. Surfers will know this as the current pulling off the reef.
- The sand push at the beach stays onshore in all cases by SWASH's measure. XBeach shows big swells cutting the upper beach at all three Encuentro lines (Section 6.4).
- Run-up (how high the water runs up the beach, above the still-water level): 0.45–0.75 m in 1 m swells, similar to Kite Beach. In a 4 m swell it is 1.5–1.6 m at 8 s and 2.0–2.4 m at 12 s (2.4 m at Encuentro Right). That is more than at the middle of Kite Beach (1.7 m) but less than at its west end (4.4 m) in the same swell (12 s). Version 0.8 gave 1.5–2.0 m; its 2.0 m at Encuentro Right in a 4 m, 12 s swell was in fact the top of the modelled beach. The beach now carries on rising, so the run-up is no longer capped. As at Kite Beach, the 1D lines overstate big-swell run-up, so these are an upper limit.
- The depths are a weak point. The Coral Atlas makes the Encuentro reef flat very shallow (0.1–0.4 m in places), which may be too shallow. Measured depths (kayak sonar or a weighted line at a known tide) would firm this up. The drone method would not settle it: it may read too deep where waves break (Section 3.6).
10. What a surfer can learn

Where the waves break in the three wave-model areas (top: Kite Beach; middle: Encuentro and Coco Pipe; bottom: Cabarete Bay with Cabarete Main Reef). Left: a typical winter swell (2 m offshore, 12 s, from 30°). Right: a big swell (4 m, 14 s, from 15°). Colour is the wave height; the white and red contours mark where 5% and 20% of waves are breaking. Redrawn on 7 October 2026 on the corrected depths.
All the numbers in this section come from the wave model SWAN (Section 5) run over the corrected depths of 1–2 October 2026 (Coral Atlas only, reef crest kept shallow, Kite Beach channel added), with Cabarete Main Reef taken from the Cabarete Bay model area. The heights and the tide effect are read from the surf lookup tables (data/spot_tables.npz, SURF_LOOKUP_TABLES_PRIMER.md); the wave shape and the monthly climate come from outputs/spots_summary.md (made by spots.py, rerun on 7 October 2026 on the same corrected tables). The two sources give the same heights. The figures in this section were also redrawn on 7 October; the versions before that still used the older depths.
10.1 How big does each spot get?

Breaking height at each spot against offshore height (left), swell direction (middle) and swell period (right).
Heights are the significant wave height (Hs) where the waves break at each spot. Hs is the average height of the highest third of the waves. The model takes the biggest height within 150 m of each spot's listed position among the places where at least 5% of the waves are breaking. As a rough guide, the face height of the bigger set waves is about 1.5–2 × Hs; that is a surfers' rule of thumb, not something the model works out.
The lookup tables were rebuilt on 2 October 2026 on the corrected depths. Compared with the first tables, which blended in the drone depths, Kite Beach's breaking heights are about 6% lower and Cabarete Main Reef's biggest days about 0.5 m smaller (2.7 m instead of 3.3 m for 4 m offshore); Encuentro and Coco Pipe are unchanged.
| Spot | Offshore 1 m | 2 m | 3 m | 4 m (all 12 s, from 30°, mid tide) | Tide effect (high against low tide, 2 m swell) | Best swell direction | Wave shape (breaker indicator, 2 m, 12 s) |
|---|---|---|---|---|---|---|---|
| Encuentro Left | 1.4 | 2.5 | 3.4 | 4.3 m | None | North (0°) | Plunging, hollow (0.71) |
| Encuentro Right | 1.4 | 2.5 | 3.4 | 4.1 m | None | North (0°) | Plunging, hollow (0.80, the most) |
| Coco Pipe | 1.4 | 2.5 | 3.4 | 4.2 m | None | North-north-east (15–30°) | Plunging (0.58) |
| Kite Beach (outer reef) | 1.3 | 2.2 | 2.7 | 2.9 m | +6% | North-north-east to north-east (30–45°) | Plunging (0.56) |
| Cabarete Main Reef | 1.5 | 2.4 | 2.6 | 2.7 m | +8% | North-north-east to north-east (30–45°, almost equal); the least sensitive to direction | Borderline between spilling and plunging (0.42): the least hollow of the five |
The breaker indicator (the Iribarren number) compares the steepness of the reef in front of the break with the steepness of the waves. Below about 0.4 the waves tend to spill (break gently from the top, softer); above it they plunge (throw forward, hollow). It uses the bed slope over the 60 m seaward of the break, and the depths there are satellite estimates (±1.5 m), so it is only a rough guide to wave shape.
What this means: - Encuentro and Coco Pipe take the swell almost at full size, with extra height as the waves slow down and steepen over the shallowing reef before they break (shoaling): 1 m offshore becomes about 1.4 m at the break. They work best in north swell, which fits their reputation, and the waves come out hollow. - Kite Beach and Cabarete Main Reef top out on big days, at about 2.7–2.9 m for 4 m offshore, much less than Encuentro's 4.1–4.3 m. They favour north-north-east to north-east swell. - On the corrected depths, all five spots plunge in a typical swell. Cabarete Main Reef is the softest, right on the border between spilling and plunging. Kite Beach, which the earlier depths showed as spilling, now comes out plunging (0.56), much like Coco Pipe. - Longer period means bigger surf everywhere: 14 s swell gives the most height at every spot, about 35–55% more than 6 s swell of the same offshore height. - The tide barely changes the breaking height at Encuentro and Coco Pipe. At Kite Beach and Cabarete Main Reef high tide gives 6–8% more height than low tide in 2 m swell, and 12–17% more in 3–4 m swell, because the extra water over the shallow reef crest lets bigger waves reach the break. Everywhere, the tide changes how much breaks: at low tide more of the waves break, and break harder; at high tide more roll over the reef unbroken. Inside the Kite Beach back-reef the tide matters a lot more (Section 5.2). - Behind the reefs, surf beat matters. Surf beat is the slow rise and fall of the water level with the sets. On big long-period days, expect strong surges and currents in the back-reefs and reef gaps, and water running far up the beach (Section 6).
10.2 Surf climate by month (2017–2026)

Top: share of days in each size class, from each day's largest daylight height at the spot (fun 0.6–1.2 m, solid 1.2–2 m, big over 2 m, in Hs). Bottom: share of early mornings (7–9 am) with light wind (under 4 m/s), offshore wind, or onshore wind of 4 m/s or more.
The offshore waves and winds are ERA5, a global reconstruction of past weather (European Centre for Medium-Range Weather Forecasts), hourly from January 2017 to September 2026. The swell's peak period is taken as 1.2 × ERA5's mean wave period; ERA5's own peak period, available to July 2024, confirms this (median ratio 1.22, about the same in every month).
| Month | Median daylight height at Encuentro Right (Hs at the break) | Share of hours with long-period swell (≥ 10 s) | Share of hours with swell from north to north-east |
|---|---|---|---|
| Jan | 1.5 m | 27% | 35% |
| Feb | 1.5 m | 19% | 25% |
| Mar | 1.6 m | 24% | 36% |
| Apr | 1.4 m | 15% | 28% |
| May | 1.0 m | 5% | 6% |
| Jun | 0.9 m | 0% | 1% |
| Jul | 0.9 m | 0% | 0% |
| Aug | 0.9 m | 2% | 6% |
| Sep | 1.2 m | 31% | 25% |
| Oct | 1.3 m | 31% | 30% |
| Nov | 1.5 m | 26% | 36% |
| Dec | 1.6 m | 23% | 33% |
Heights from outputs/spots_summary.md; the two shares are counted from the hourly ERA5 offshore record (north to north-east here means from about 326° to 45°).
- December–March has the most solid-to-big days. At Encuentro Right about a quarter of days (23–25%) reach over 2 m (Hs) at the break; at Kite Beach 16–19% do, and at Cabarete Main Reef 23–28%.
- September–October has the most long-period swell, and the most early mornings with light or offshore wind (61–66%, against 15–31% in May–August). That makes it potentially the best-quality season.
- June–August is mostly short-period trade-wind swell from the east. Surfers would call it small and messy, even when the model height is around 1 m.
- Early mornings with light or offshore winds are most common from September to January (43–66%). Early-morning offshore winds are rare in the ERA5 data (at most about 11% of mornings), but ERA5 misses land breezes, so real dawn conditions are probably better than this suggests.
Caveats for surfers: - The heights have not been checked against surf reports or a buoy. - The depths at all five spots are satellite estimates (±1.5 m), which affects how and where waves break, and especially the wave shape. - ERA5 blends wind chop and swell into one height and period, so it undercounts groundswell hidden under the trade-wind chop.
11. Limits and confidence
Revised for version 0.9 (7 October 2026), after the quality review and the reruns; the Kite point, back-reef flow and channel rows updated for version 0.10 (8 October 2026), the sand rows on 9 October after a local's report that the bottom is sandy, and the north-swell row added for version 0.11 (12 October 2026).
| Finding | Confidence | Main uncertainty |
|---|---|---|
| Kite Beach's seasonal cycle: widest in February, narrowest in September | High for the timing; medium for the size (about 14–19 m depending on the method) | The traced line sits 10–17 m landward of the water's edge; sun glint (now removed) made summer images read narrower (Section 3) |
| The summer stretch's opposite cycle: narrowest in April, widest in August–September | High for the timing; medium for the size (about 19–22 m depending on the method) | As above |
| The ten-year trends | Medium for the small beach on the Cabarete side of the Kite point (narrowing about 2 m a year) and the between stretch (widening); low elsewhere: Kite Beach shows no clear trend | Ten years is short; neighbouring months are not independent (Section 7.4) |
| The reef shelters Kite Beach; waves at the beach are small (a few tenths of a metre) | Medium-high | No wave measurements inside the reef |
| The summer stretch's width follows the along-shore push of the waves | Medium | It beats both baselines on test years it was not fitted to (Section 7.3); a statistical fit, not a physical proof |
| The waves' along-shore push: towards Encuentro west of Kite Beach, towards the Kite point in Cabarete Bay, meeting inside Kite Beach | Medium (was medium-high) | It is the waves' capacity, not measured sand movement; the along-shore model fails beach by beach (Section 7.2) |
| The waves push sand onshore at the beach in normal conditions | Medium | Our sand measure leaves out stirring by breaking waves |
| Big swells cut the dry beach and park the sand just offshore | Medium-low | XBeach 1D only; the satellites show no change after big swells that stands out from ordinary weeks (Section 6.3) |
| North swells widen the south-east half of Kite Beach (about 2 m each) and western Cabarete Bay (about 1.7 m), within a few days; the summer stretch tends to narrow | Medium (new in version 0.11) | Stands out from chance after allowing for 49 comparisons and holds for other north sectors and without the 2017 hurricanes; but each step is small against the scatter of single images, ERA5 gives one average wave direction, and the event-by-event check is weaker. How much of the seasons it explains is a rough estimate (Section 7.5) |
| Wind blows dry sand along the beach and inland, mostly in June–August; a few m³ per metre of beach a year lost inland | Low-medium | The ERA5 wind underestimates afternoon winds, and the sand-blowing formula tends to overestimate (Section 7.6) |
| Sand volumes | Low | Sand appears plentiful on the bottom (local observation, 9 October 2026), but the amounts are still unknown: the grain size and how deep the sand is stirred have not been measured, and the active beach height is assumed |
| Spot heights and surf climate | Medium for patterns, low for exact heights | Depths; ERA5; not yet checked against surf observations |
| Reef depths | Medium-low | The drone reads deeper than the Atlas on the shallow reef; local knowledge supports the Atlas; nothing measured directly (Section 3.6) |
| Back-reef flow pattern: north-west behind the north-west part of Kite Beach, out at its north-west end, into Cabarete Bay at the point (Section 15) | Medium | Holds in every depth version and with both kinds of model edge, and XBeach now broadly agrees, including on the main exit at Kite Beach's north-west end (Section 15.3). Uncertain: the depths of the gaps; the currents are averages over 1.5 hours; the edges matter somewhat for the amounts in the big north-east swell (Section 15.8); no current has been measured |
| Which way the water goes right at the Kite point: into Cabarete Bay | Medium (was low, unresolved, in 0.9) | The current model and XBeach agree, the result does not change with grid size, and the wave directions in SWAN, XBeach and the satellite images agree; but no current has been measured there (Sections 7.4 and 15.7) |
| Which way the sand goes at the Kite point | Low | The push along the beach face runs towards Kite Beach, the current a little further out towards Cabarete Bay. Locals report a sandy bottom there, so the current has sand to carry and some sand moving south-east past the point is more likely than earlier versions said. Which wins, and how much moves, depends on the grain size and on how much of the sand is loose and stirred up, and nothing has been measured (Sections 7.4 and 15.7); drifters and sand samples would help (Section 12) |
| Kite Beach channel: a surging rip, strongest in big north swells (about 1.0 m/s on average, surges to about 1.9 m/s) and weaker on typical winter days and in big north-east swells (about 0.35–0.5 m/s) | Medium-low | The channel's depth is a guess (a deeper channel takes more of the outflow, Section 15.5); the surges come from XBeach only, although the averaged current model gives similar average speeds (Section 15.3) |
| How much sand passes through the system | Not yet known | Two model budgets failed the satellite test (Section 15.6); the 2D XBeach seasonal test was not valid (Section 13.2) |
12. Next steps, and how to take sand samples
1 October 2026; updated 7 and 8 October 2026. The models have gone about as far as they can on the data we have. The questions still open need measurements, not more computing. The pass and fail tests for each measurement were set in advance, before any data exist (docs/VALIDATION_PLAN.md). Steps 1–6 are in order of value; step 7, the drifter test, is the quickest and cheapest.
| # | Step | What it settles | Effort |
|---|---|---|---|
| 1 | Measure the depth through the Kite Beach channel and the lower reef at Kite Beach's north-west end | How the outflow divides between the two exits, and how strong the rip is | One calm morning at low tide, kayak or SUP |
| 2 | Take sand samples (method below) | The grain size every sand calculation assumes (0.25 mm), and where the sand comes from and goes | A few hours on one day; ideally again six months later |
| 3 | Keep a simple surf log | Whether the surf-forecast tables give the right heights at each spot | A line per session |
| 4 | Straight-down drone photos at low tide in calm, clear water | The exact shape of the channels, and whether the reef flats just inside the breaking line are sand or rock | One flight per area |
| 5 | Repeat beach and back-reef surveys, twice a year | The only way to measure how much sand actually moves, and so the sand passing through to Sosúa or deep water | A morning, twice a year |
| 6 | A local wind record | The afternoon sea breeze that the global records miss, for the wind-blown sand and the forecasts | Download from a local station |
| 7 | Drifters (method in 12.4) | Which way the back-reef water goes behind Kite Beach and past the Kite point, and how fast | A morning on a typical winter day |
Already done in this study: - the surf-forecast tables, with warnings; - the back-reef flow over the whole reef, and the channel from photos; - the plume check (satellite cloudiness after big swells, Section 15.4); - two attempts at a model sand budget (they failed the satellite test, Section 15.6); - at the Kite point, a finer-grid test of the current model and the wave directions in the satellite images (Section 7.4).
The surf tables were rebuilt on the corrected depths on 2 October 2026; Cabarete Main Reef now comes from the Cabarete Bay table, with its position confirmed by a local's pin.
On 7 October 2026 an independent quality review of the code and this report led to the fixes and reruns of version 0.9, and on 8 October the correction of how we read XBeach's current directions led to version 0.10 (the version history at the end, and docs/qa/QA_REGISTER.md).
When the measurements arrive: - put the measured channel and gap depths into the depth map, and rerun the flow cases (about a minute each); - use the measured grain size in all the sand calculations; - check the surf tables against the surf log, and the current models against the drifter tracks; - with two or more repeat surveys, run XBeach through whole seasons and tune it until it reproduces the measured changes. Only then can it give the sand passing through.
12.1 Measuring the channel and gap depths
- When: a calm morning, as close to low tide as possible, with no swell running through the channel.
- Kit: a kayak or SUP, a phone with GPS (any app that logs your track or drops pins), and either a cheap fish finder or a weighted line marked every 25 cm (a dive weight on a cord works).
- How: paddle a line straight out through the middle of the channel, from the back-reef to open water, taking a depth every 10–20 m and a GPS pin each time. Then do the same across the channel, from one side of the reef to the other. Repeat for the lower reef at Kite Beach's north-west end.
- Note the time. The tide gauge then turns each depth into a depth below mean sea level.
- Safety: these are rip channels. Go only when it is flat, with a buddy, and stay off them in any swell.
12.2 How to take sand samples
Where (about 15 samples):
| Site | Samples |
|---|---|
| Kite Beach: north-west end, middle, south-east end | 3 at each (see "across the beach" below) |
| The small beach on the Cabarete side of the Kite point | 3 |
| Cabarete Bay west and the town beach | 3 each |
| The summer stretch | 3 |
| Encuentro | 3 |
| The back-reef behind Kite Beach, in a sand lane (knee to waist deep) | 1–2 |
| Optional, the most telling: sand just outside the lower reef at Kite Beach's north-west end, in 5–8 m, collected by a snorkeller or diver | 1–2 |
Across the beach, at each beach site: one from the dry upper beach, one from the middle of the beach, and one at the water's edge at low tide, where the backwash runs.
How to take each sample: 1. Use a clean jar or a zip-lock bag, one per sample. 2. Scrape up the top 2–3 cm only. That is the layer that moves. About a cupful (200–300 g) is plenty. 3. Avoid clumps of shell, weed or rubbish, but don't pick out individual shell grains: they are part of the sand. 4. Label each bag: site, position on the beach (dry, middle, water's edge), date and time. 5. Take a GPS pin and a photo of the spot, with a coin or ruler in the picture for scale. 6. Take all the samples on the same day. Ideally repeat in the other season, for example February and August, to see whether the sand changes with the seasons.
What to do with them:
- Rinse and dry. Rinse with fresh water to remove the salt, then dry in the sun or a low oven.
- Grain size (the most useful number). Choose one: - Sieves: a small set of sieves (2, 1, 0.5, 0.25 and 0.125 mm) and a kitchen scale. Weigh what stays on each sieve, and work out the median grain size, the size half the sand is finer than. - Photo: spread a teaspoon of grains thinly on white paper next to a ruler and take a sharp close-up photo. The grain sizes can be measured from the photo. - A laboratory: a university or soils lab measures grain size by laser for a modest fee.
- What the sand is made of. This tells us where it comes from. - Colour: white or cream grains are made by the reef (broken coral, shells, algae). Dark grains come from the land, through rivers such as the Yásica at La Boca, or from the lagoon behind Cabarete town. - The vinegar test: a few drops of vinegar make reef sand fizz. To get a number, weigh a dry sample, soak it in vinegar until it stops fizzing, rinse, dry and weigh again. The weight lost is the reef-made share.
What the samples tell us: - The grain size replaces the 0.25 mm we assumed in every sand calculation. Finer sand moves more easily and settles more slowly, so it is more likely to be carried out to sea. Coarser sand stays put. - Matching samples show where sand travels. If Kite Beach's sand matches western Cabarete Bay's more than Encuentro's, that supports the finding that its sand comes round the point. - Dark grains at Cabarete would show sand arriving from the rivers to the east. - Sand outside the lower reef that matches Kite Beach's sand would confirm that the north-west exit is a route by which beach sand is lost offshore. - At the Kite point, samples from the water's edge and the shallow strip in front of the small beach would give the grain size of the sand there. Locals report a sandy bottom in that strip, so the current has sand to carry; how easily the current and the waves move it depends on its grain size, and that is part of what decides which way sand moves past the point (Section 15.7).
12.3 A simple surf log
- What to record each session: date, time, spot, and your estimate of the set face height, plus a word on the conditions (clean, bumpy, closing out).
- What it shows: compared with what the tables gave for that hour, a season of entries will show whether the tables run high or low at each spot.
- Even 20–30 entries per spot is enough for a first check.
12.4 A drifter test
A drifter is a float that moves with the water, so its track shows where the back-reef water goes. The test checks validation plan V2 (direction) and V3 (speed). The current model and XBeach both say that the back-reef water behind the middle of Kite Beach runs north-west, and that near the beach just south-east of the Kite point it runs into Cabarete Bay at about 0.15–0.2 m/s (Sections 15.2 and 15.7).
- A simple drifter: a capped PVC pipe about 50 cm long, with a foam collar so that only 5–8 cm shows above the water (so the wind pushes it as little as possible). At the bottom, a small crossed-vane drogue (two plastic plates crossed at right angles, so it moves with the water rather than skating over it) and some ballast to keep it upright. On top, a phone or a cheap GPS logger in a waterproof pouch, logging its track.
- Cheapest option: oranges (they float low and are easy to see), tracked from the beach or by drone video.
- Where: two release spots: behind the middle of Kite Beach, and 20–150 m off the waterline just south-east of the point. On a typical winter day the back-reef water splits at about 5.2 km, close to the middle of Kite Beach, so release the first set a little north-west of the middle.
- When and how many: a typical winter day; 4–5 drifters at each spot, each followed for 20–40 minutes. At 0.15–0.2 m/s a drifter travels a few hundred metres in that time.
- Pass: at least 4 of the 5 drifters at each spot go the predicted way, and their median speed is within a factor of 2 of the model's (
docs/VALIDATION_PLAN.md). - Safety: calm days only, with a buddy. Never follow a drifter into the Kite Beach channel or out through the gaps in the reef; let it go and collect it later, or write it off.
Drifters show where the water goes, not the sand. Which way sand moves at the point also needs the sand samples (12.2) and, ideally, a sand tracer test (coloured sand placed at the water's edge and looked for again a few days later).
12.5 Model work for later
- Rerun the sand calculations with sand everywhere except the reef crest (planned). Locals report that the bottom is sandy almost everywhere, out past the reefs too (9 October 2026), but the model runs so far treated the Coral Atlas reef-flat zones as rock (about 21% of the cells in the 2D XBeach runs) and gave the back-reef flats only a thin 0.3 m sand layer in the XBeach sand budget (Sections 13.1 and 15.6). With plentiful sand, that set-up underestimates the sand available. The reef crest stays rock; whether the reef flats just inside it are sand or rock is not yet known, so both versions are worth running.
- XBeach through whole seasons (the multi-processor version, about 12–15 hours a year at Kite Beach; Section 13.2), once repeat surveys exist to tune it.
- SWAN tables with a wind axis (about 2,000 runs, a day or two of computing), for the afternoon chop in the surf forecast.
- A GPU wave-by-wave model of the Encuentro reef (Celeris or FUNWAVE-GPU;
GPU_SURF_FORECAST_PLAN.md), for peaks, peel, sets and rips. - Separate rain runoff from swell in the plume check (Section 15.4).
- A wider current model for big swells, so that its edges are far from Kite Beach (Section 15.8).
- A better satellite waterline: the traced line sits 10–17 m landward of the water's edge (Section 3.1); a method that finds the water's edge itself, tested against beach surveys, would firm up the sizes of the seasonal swings.
13. XBeach in 2D: the pilot, and whether to move to the GPU
XBeach is a coastal model that follows waves, currents, sand movement and the change of the seabed together. The plan is in XBEACH_2D_PLAN.md: try the standard XBeach on the computer's main processor (CPU) first, and only build a version for the graphics card (GPU) if the CPU results are worth having but too slow.
13.1 Stage 1: the pilot
The pilot: - Grid: Kite Beach and its back-reef, 1.45 km across the shore by 2.6 km along it, rotated to the coast. Cells are 10 m across the shore and 20 m along it, about 19,000 in all. - Depths: the smoothed depth map of late September 2026, which still blended in the drone depths. These are not the corrected depths of 1–2 October (Section 5). - Physics: XBeach's surf-beat mode (it follows the wave groups, and so the slow surges they drive, not every single wave), with waves from a spread of directions, wind, sand transport and bed change. Rock and sand: every area the Coral Atlas maps as reef, including the inner and shoreward reef flats that it maps over much of the back-reef floor, is treated as rock that cannot erode; about a fifth of the cells. Sand (3 m deep) is allowed only outside those areas and on the beach and the 40 m of seabed in front of it. (The current models of Section 15 treat the inner reef flats as sand instead; the two set-ups are not yet consistent.) Locals report that the bottom is sandy almost everywhere, out past the reefs too, so this set-up probably underestimates the sand available; a rerun with sand everywhere except the reef crest is planned (Section 12.5). - Cases: a typical winter day and a typical summer day, 3 hours each (1 hour to settle the waves and currents, then 2 hours with the bed changing).

Columns: wave height; difference from SWAN; mean current (arrows); bed change over 2 hours. Top: winter. Bottom: summer. On the earlier, drone-blended depths.
Stage-1 checks (outputs/xbeach2d_pilot.md, 28 September 2026):
| Check | Result |
|---|---|
| Stable? | Yes. Water levels −0.31 to +0.45 m. Mean currents up to about 1.0–1.15 m/s, on the reef crest and in the gaps. |
| Waves agree with SWAN? | Yes. Over the reef and back-reef, XBeach's typical wave height is 7–9% above SWAN's (2–5% offshore), and the pattern matches closely (correlation 0.96–0.98). |
| Currents agree with the current model? | Mostly, once XBeach's output is read correctly (version 0.10; up to 0.9 our scripts turned XBeach's east/north currents a second time, which scrambled their directions, Section 7.4). The six direction checks are the mean current along the shore 20–150 m off the waterline in three stretches and two seasons, against the whole-reef current model of Section 15. On the corrected depths (outputs/xbeach2d_v2_pilot.md) 5 of 6 agree: at the Kite point towards Cabarete Bay in both seasons (+0.18 m/s, against +0.23 / +0.15), at Kite Beach towards Encuentro in both (−0.12 / −0.06, against −0.01 / −0.17), and north-west of Kite Beach towards Kite Beach in winter (+0.11, against +0.08). The one difference is that stretch in summer, where both currents are weak (+0.06 against −0.02). On the earlier depths (outputs/xbeach2d_pilot.md, against the same current model) 4 of 6 agree: the point in both seasons (+0.24 / +0.28), and Kite Beach (−0.05) and north-west of Kite Beach (+0.06) in winter. In summer the currents at Kite Beach (+0.03) and north-west of it (+0.05) are weak and run the other way. |
| Bed change sensible? | Yes. Changes are concentrated on the sand patches at the reef edge and on the beach face, which loses a little in both seasons (on average 1–4 mm over the 2 hours), as in the 1D runs. |
| Speed | 12 minutes per simulated hour on one processor core. |
Getting there took four fixes: 1. Grid corners: the rotated grid's corners reached past the depth map. 2. Speckle: the raw Coral Atlas depths gave speckled bed changes, so the smoothed depths (as used by SWAN) are used instead. 3. Edge jets: the ends of the domain produced false currents, so the depths are blended to a uniform profile over the outer 250 m. 4. Wind direction: this XBeach version reads it as the direction the wind blows towards. We found this by testing.
The GPU question (gate 1 of the plan): the CPU is fast enough for the next stage. A season of representative conditions is about 10 conditions × 4 hours with morphological acceleration (the bed change multiplied so that a few hours of waves stand for a longer period), which is 40 simulated hours. That is about 8 hours of computing on one core. Running conditions side by side helps only up to the 8 physical cores: with 12 at once, each ran about 5 times slower, so the whole CPU manages about 5–6 minutes per simulated hour, or about 4 hours per season. Converting to the GPU was not needed for stage 2. It would only pay off for many long runs (several years, or scenarios).
13.2 Stage 2: a year of representative conditions (test not valid)
Method: - Conditions: for each calendar month, every hour of 2017–2026 was grouped into 3 representative wave-and-wind conditions (36 in all), weighted by the share of the month's hours each represents. This is a "reduced wave climate". - Runs: each condition was run in the 2D Kite Beach pilot model (same depths and rock as above) for 2 hours with the bed changing, all from the same starting beach. - Monthly change: the sum of each condition's rate of beach change × the hours it represents. - What it was meant to test: the pattern through the year, not the size. The beach does not evolve between conditions, and nothing limits how much sand is available.

Top: change in beach width by month. Grey = satellite (with its average removed); orange = model, on its own scale. Bottom: the average year. The model's line at each stretch only goes one way, up or down, all year.
What went wrong. Each rate is the bed change in the first 2 hours from the same starting bed. That bed has not settled to the waves: in the first hours the model reshapes it in the same direction whatever the conditions, and faster when the waves are bigger. This start-up effect swamps any real seasonal response. The test added on 7 October 2026 (outputs/xbeach2d_seasons.md, outputs/xbeach2d_seasons_stats.json) shows it:
| Stretch | Conditions (of 36) that build the stretch | Model's monthly change against the month's wave energy (correlation) | Model average (m per month) | Model against satellites (correlation, 12 months) | Months with the same sign as the satellites |
|---|---|---|---|---|---|
| North-west of Kite Beach (4.15–4.7 km) | 0 | −0.94 | −14.0 | −0.27 (p 0.40) | 7 of 12 |
| Kite Beach | 36 | +0.93 | +3.5 | +0.68 (p 0.02) | 6 of 12 |
| Kite point (5.5–6.1 km) | 0 | −0.98 | −108 | +0.46 (p 0.13) | 6 of 12 |
Wave energy here is the hours in each condition × the square of the wave height at the model's edge, summed over the month. p is the chance of a correlation this strong arising by luck. Same-sign months use the model with its average removed.
What it means:
1. Every condition builds Kite Beach, and no condition builds its neighbours. So the model's "season" at each stretch is just its fixed start-up direction, multiplied by how much wave energy the month has. At Kite Beach that makes the model's monthly change follow the wave energy almost exactly (correlation +0.93).
2. Kite Beach's seasons are therefore not reproduced from physics. The earlier version of this section said they were (+3.5 against +4.0 m per month, 9 of 12 months with the same sign). That claim is withdrawn. Kite Beach is wider in the more energetic months, so any series that follows wave energy correlates with it to some degree, which is all the +0.68 shows; the signs agree in only 6 of 12 months, no better than chance. The model's most-building month is January and its least-building June, against October and July in the satellite record.
3. The "sand trap" pattern is not evidence either. Sand moving into Kite Beach from its neighbours in every month is the same start-up direction, so this test neither supports nor rules out the trap found by other methods (Section 7).
4. The sizes are impossible. Added over a year, the model's Kite Beach gains about 42 m, while the satellites show no clear trend (+0.3 ± 0.9 m per year, outputs/beach_trends.md). The Kite point loses over 1 km of beach a year in the model; it is also close to the model's edge.
What the pilot does still show (13.1): XBeach runs stably over this reef at a usable speed, and its waves agree with SWAN's to within a few per cent. Read correctly (version 0.10), its currents on the corrected depths agree with the current model's in 5 of the 6 direction checks, including the flow at the point towards Cabarete Bay (13.1; outputs/xbeach2d_v2_pilot.md).
What would be needed for a real test of the seasons: - Runs that let the bed settle first, then measure the rate of change after that (or remove the start-up part from each run), on the corrected depths and with the rock and sand treated the same way as in the other models. - Or a whole year in sequence: the actual waves hour by hour, with the bed evolving and a limit on how much sand the back-reef floor holds, on a domain wide enough to keep the Kite point away from the edge. - Either way, tuned against measurements: the satellite widths and, ideally, beach-profile surveys (Section 12).
Gate 2 of the plan (is the GPU worth it?). Not yet answerable: stage 2 has not given a valid result. A year in sequence with morphological acceleration of about 20 needs about 440 simulated hours in a single run, which cannot be split into independent runs across cores. Rough times:
| How | Estimated time |
|---|---|
| One core | about 90 hours |
| XBeach's multi-processor version on 8 cores | about 12–15 hours |
| A GPU version | about 1–3 hours |
- Recommended order: 1. Rerun the settled-bed test on the corrected depths, with consistent rock and sand, on the CPU. 2. If that looks promising, the multi-processor XBeach (a free download plus Microsoft MPI, the standard tool for spreading one run over several cores) for a year in sequence, on a wider domain with a limit on the sand. 3. Revisit the GPU only if several years or scenarios are wanted.
14. How fast is this computer? Speed benchmarks
The computer: - CPU: Intel Core i9-9900K, 8 cores / 16 threads, 3.6 GHz. - Memory: 64 GB. - GPU: NVIDIA GeForce RTX 5070, 12 GB.
All times below were measured on this machine during this study.
| Model | One run is | Grid | Time | Per simulated hour |
|---|---|---|---|---|
| SWAN (waves, steady state: one settled sea state per run; 8 threads) | Kite Beach area, 3.2 × 2.1 km | 40 m (4,160 cells) | 5 s | – |
| 20 m (16,800 cells) | 21 s | – | ||
| 10 m (67,200 cells) | 79 s | – | ||
| 5 m (268,800 cells) | 393 s | – | ||
| SWAN lookup table | 720 runs, 2 at a time × 8 threads | 20 m | 3.8–5 h (median 37–48 s per run) | – |
| SWASH (every wave; 1 core per run) | 940 m line, 1 m, 2 layers, 70 min of waves | 940 points | 5.5–10 min | 5–9 min |
| XBeach 1D (1 core per run) | 940 m line, 2 m, 13 h swell event | 471 points | 13–36 min (8–16 runs at once) | 0.6 min alone; 1–2.8 min when 8–16 run together |
| XBeach 2D (1 core per run) | Kite Beach and back-reef, 1.45 × 2.6 km | 10 × 20 m (19,126 cells) | 36 min for 3 h | 12 min |
| Our GPU flow model (RTX 5070) | Kite Beach area, currents with wave forcing | 10 m (67,200 cells) | – | 4 s |
| 5 m (268,800 cells) | – | 8 s | ||
| 2.5 m (1.08 million cells) | – | 44 s | ||
| Hourly nearshore wave record | 85,000 hours × 3 stretches, from the SWAN table | – | 5 min | – |
| Surf-spot products; before-and-after-swell test | 2017–2026 | – | 11 s; 5 s | – |
What these numbers mean: - SWAN's cost goes up about 4–5 times each time the grid spacing halves. That's why the lookup tables (Sections 5 and 10) were built on a 20 m grid: each run takes well under a minute, so a 720-run table takes hours rather than days. 10 m would cost about 4 times as much, and 5 m is practical only for single cases. - The CPU's 16 threads are best used running many small models side by side, but only up to about 8. Most of our runs used one core each, 4–16 at a time. Beyond the 8 physical cores, runs just share the cores and memory: 12 2D XBeach runs at once each ran about 5 times slower than one alone, for no gain in total output. - The GPU is in a different league for plain currents. At 10 m it simulates an hour of back-reef currents in 4 seconds, about 900 times faster than real time, so a year takes about 10 hours. At 2.5 m it still handles over a million cells, at about 1.2 billion cell-updates per second. - Per cell per time step, XBeach does far more work than the GPU flow model: wave groups in 16 directions, the roller (the foam riding on each breaking wave), and sand. Both use similar time steps (about 0.27 s for XBeach, 0.3 s for the GPU model at 10 m), and XBeach on one core manages about 0.35 million cell-updates per second (a cell-update is one grid cell advanced by one time step). A GPU version of XBeach-style physics would probably land at 5–50 million: roughly 15–150 times one CPU core. Since the whole CPU, running 12 XBeach cases side by side, gives only about 2.4 times one core's output, that is roughly 6–60 times the whole CPU. These are estimates, not measurements.
Update, 7 October 2026. The GPU flow model was updated to the newer version of the same code built for the Kingston harbour model. It gives the same results to the last digit on the Kite Beach cases, and adds faster options (recording the time steps once and replaying them on the graphics card) and more kinds of model edge. The scripts here still step the model one time step at a time, so they run at the speeds above.
What might be possible on this machine:
| Task | Estimated time |
|---|---|
| A 10 m SWAN table with a wind axis (about 2,000 runs) | about 2 days (each 10 m run costs about 4 times a 20 m run) |
| A season of 2D XBeach at Kite Beach (reduced wave climate) | about 4 hours using the whole CPU (throughput about 5–6 min per simulated hour) |
| A full year of 2D XBeach, every real wave condition in sequence (bed change speeded up about 20 times) | about 90 hours on one core, 12–15 hours with the multi-processor version on 8 cores, 1–3 hours on a GPU version (Section 13.2) |
| A year of back-reef currents at 10 m on the GPU (without surf beat, the slow surges that come with the sets) | about 10 hours |
| The whole reef, 1.5 km west of Encuentro to past Cabarete (9.6 × 6.8 km at 10 m, 650,000 cells), on the GPU (done, Section 15) | about 1 minute per 4-hour run |
| The whole-reef XBeach budget, 32 runs of 2 hours (done, Section 15.6) | about 15 hours, 8 at a time |
15. Where the water goes: the back-reef flow from Encuentro to Cabarete Bay
Rewritten on 30 September 2026 after three corrections. The earlier version of this section had the model area stopping at Encuentro and the Kite point, drone depths blended into the reef, and a wave-force method that pushed the water too weakly on the reef and falsely in deep water. Revised again on 7 October 2026 (version 0.9) after the quality review: the water crossing the reef line is now counted along the reef line itself, following its bends (before, it was counted as if the line ran parallel to the beach); the wave push now comes from wave breaking alone; and the sand formula now uses the right measure of the wave motion at the seabed. All the tables are recomputed. The flow patterns hardly changed, but several amounts did, most of all at the north-west end of Kite Beach and at the opening of Cabarete Bay.
The idea. When waves break on the reef, they push water over it into the back-reef (the shallow water between the reef and the beach). That water has to get back out to sea. It does so as currents through the lower and deeper gaps in the reef. Where those currents speed up they can scour sand, and where they slow down they drop it. Adding up the water that comes in over the reef and the water that goes out through each gap gives a flow budget for the whole coast.
15.1 The model
- Cabarete Main Reef is the surf break about 800 m offshore of western Cabarete Bay (19.760 N, 70.409 W; 6.4 km along the coast). A line of shallow reef, about 1–2.5 m deep in the corrected depths, runs to it from the Kite point; the whole line is ridden.
- Area. It runs from 1.5 km west of Encuentro to past Cabarete's eastern point: 9.6 × 6.8 km at 10 m resolution, about 650,000 cells (
build_bathymetry.py reef,reef_flow.py). The Coral Atlas stops about 400 m west of Encuentro's west end, so the strip west of that has no reef. It is only a buffer that keeps the model's edge away from Encuentro, and it is not interpreted. - Depths: the Coral Atlas only. The drone surveys read 2–9 m deeper than the Atlas in places at the edge of the reef off the Kite point and in Cabarete Bay (the station-by-station offsets in Section 3.6). Blended in, they opened a false deep lane along the edge of the reef, and the model sent a strong current along it. Local knowledge agrees with the Atlas:
- the Kite Beach back-reef is knee deep where it is shallow, and over head high at its deepest;
- the Atlas has the same range (0.3–0.8 m in the shallowest quarter, 3 m or more in the deepest quarter);
- the Cabarete Bay reef is close to the Atlas, according to people who have surveyed it;
- the drone gap is largest on the shallow reef (2.5–3.5 m) and almost nil beyond 8 m, which fits the untested idea that the drone method reads too deep where waves break (Section 3.6).
- The reef crest is kept shallow. The depths are smoothed over about 30 m so that waves don't break on speckle. Before, that smoothing also filled in the shallowest reef tops (1.0 m became 2.2 m off the Kite point). Now, where the reef is shallower than 2.5 m, the smoothed depth may be at most 0.3 m deeper than the map.
- The Kite Beach channel was added by hand. The Atlas misses it and shows shallow reef there. A local photo with the channel marked, clear-water drone photos and the ten-year satellite record of breaking waves all put it in the same place: a 100 m gap in the breaking at about 5.0 km along the coast. It runs from the back-reef, about 180 m out, to open water about 650 m out. Its depth is our guess (3 m).
- The wave push comes from breaking only. The model takes the push from where the waves actually lose energy by breaking: force = energy lost ÷ wave speed, in the direction the waves travel (Dingemans and others, 1987).
- SWAN's own force output, used before 30 September, had false pushes of 0.5–0.9 N/m² in 8–40 m of water where no waves break. That is 10–20 times the push of the wind, caused by the speckle in the depths, and it drove large false swirls offshore.
- That method was also too weak on the reef. It raised the water behind the reef by only 1–3 cm, even in a 3 m swell.
- Until 7 October the new method still counted all of the energy the waves lose, including the small losses to whitecapping and to friction on the seabed. It now counts the losses to breaking alone. On the reef almost all of the loss is breaking, so the back-reef results barely changed, but the small false pushes in deep water are gone.
- The push now raises the water in the Kite Beach back-reef by about 10 cm on a typical winter day and about 25 cm in a big north-east swell. That is about 6–8% of the offshore wave height. (
reef_setup.py,outputs/reef_setup.md: 9.4 cm, 6.2%, and 24.9 cm, 8.3%.) - Seven cases (table below), each run for 4 hours and averaged over the last 1.5 hours. Each run takes one to one and a half minutes on the graphics card.
- The reef line used for counting the water in and out is traced from the model depths: along each line straight out from the beach, the outer edge of the reef (the outermost point shallower than 2.5 m, at least 150 m out). It runs about 180–200 m out at Encuentro, 450–550 m at Kite Beach, about 600 m at the Kite point and up to 750 m off western Cabarete Bay. Across the middle of Cabarete Bay (6.5–7.7 km) there is no reef shallower than 2.5 m: that is the bay's opening, marked as open water. The water crossing the line is now counted piece by piece along the line, with each piece's own direction and length.


15.2 What the currents do
| Case | Water pushed in over the reef, Encuentro to Cabarete (m³/s) | Out through the lower reef at Kite Beach's north-west end and the between stretch, 4.1–4.8 km (m³/s) | Flow along the Kite Beach back-reef at 5.15 km (m³/s; + towards Encuentro) | Flow at the Kite point, 5.75 km (m³/s; − = towards Cabarete Bay) |
|---|---|---|---|---|
| Typical winter day (1.5 m, 10 s, from the north-east) | 3,761 | 273 | +66 | −189 |
| Typical summer day (1.15 m, 7 s, east-north-east) | 1,740 | 284 | +117 | −59 |
| Strong trade winds (2 m, 8 s) | 2,577 | 272 | +170 | −65 |
| Big north-east swell (3 m, 12 s), mid tide | 4,712 | 395 | +58 | −331 |
| Same swell, low tide (−0.3 m) | 3,890 | 342 | +40 | −263 |
| Same swell, high tide (+0.3 m) | 5,582 | 416 | +78 | −360 |
| Big north swell (3 m, 13 s) | 4,441 | 417 | +9 | −499 |
- Where the back-reef water splits depends on the waves. Behind the north-west part of Kite Beach the water runs north-west in every case, towards the lower, broken reef at Kite Beach's north-west end and along the between stretch. Further south-east it turns and flows into Cabarete Bay. The turning point is:
- at about 5.2 km on a typical winter day and in all three big north-east swell runs. So in these conditions the south-east part of Kite Beach, roughly its last 350 m before the point, drains south-east into Cabarete Bay;
- at about 5.6–5.7 km, at the Kite point itself, on typical summer and strong-trade-wind days. Then the whole Kite Beach back-reef drains north-west;
- also at about 5.2 km in the big north swell, but there the flow behind Kite Beach is weak and uneven (it briefly turns round near the channel at about 4.9 km), and the water in the between stretch runs south-east to meet it at about 4.4–4.5 km.
- The biggest single outflow is across the opening of Cabarete Bay (about 6.4–7.9 km, where there is no shallow reef): about 1,200 m³/s on a typical winter day, 540 m³/s on a typical summer day, 1,700 m³/s in the big north-east swell at mid tide and 1,300 m³/s in the big north swell (outlet lists in
outputs/reef_flow_run.log). - Through the reef itself, the biggest exit is at Kite Beach's north-west end and along the between stretch (4.1–4.8 km). It carries about 270–285 m³/s out to sea on typical and strong-trade-wind days and 340–420 m³/s in the big swells, with the fastest average outflows about 0.6–0.75 m/s. Version 0.8 showed almost nothing leaving here on strong trade-wind days and up to 865 m³/s in the north swell; both came from the old way of counting.
- A second gap in the between stretch, at about 3.8–4.0 km, takes another 130–365 m³/s in most cases, at up to 0.7–1.1 m/s.
- At the Kite point, the water that comes over the shallow reef flows south-east into Cabarete Bay in every case, not north-west into Kite Beach. This changed with the 30 September corrections: the old model had the water at the point flowing into Kite Beach. That was driven by the false deep lane along the reef edge.
- Cabarete Bay takes the water from the point. In the big swells a jet of water leaves the bay's western side, and a large slow eddy turns offshore of the bay. The satellites see the cloudiest water in the same place (15.4).
- Encuentro has no main exit in most cases. Its water leaks out through many small gaps along its reef, at up to about 0.8–1.1 m/s on a typical winter day and in the big north-east swells. That matches the photos: the reef sits close to the beach and breaks in a fairly continuous line. The big north swell is the exception: one gap, at about 0.9–1.0 km, carries about 390 m³/s at up to 1.5 m/s.
- In a north swell, the big waves break at an angle on the outer face of the reef. That drives a strong current along the outside of the reef towards Cabarete Bay. It fits the north-swell reversal of the wave push at the south-east end of Kite Beach (Section 7.5).
- More water comes in at high tide than at low tide: 5,582 against 3,890 m³/s in the big north-east swell.
15.3 The Kite Beach channel: surges from sets (XBeach)
The current model averages over 1.5 hours. Real outflows come in surges, as each set of waves pushes a slug of water over the reef and it drains back out (surf beat). So we ran XBeach over the Kite Beach back-reef (4.0–5.9 km), with the corrected depths and the channel, and recorded the currents every 10 seconds (xbeach_reef.py). The analysis was rerun on 7 October with the same corrected counting along the reef line as the current model, and again on 8 October (version 0.10) with XBeach's currents read correctly: XBeach writes them as east and north components, and up to version 0.9 our script turned them a second time, which gave wrong speeds and directions through the reef (no new runs were needed).

| Current out through the reef (m/s) | Typical winter day | Big north-east swell | Big north swell |
|---|---|---|---|
| Kite Beach channel (4.9–5.35 km), average over the hour | 0.35 | 0.51 | 1.01 |
| … strongest 10-second surges | 0.59 | 1.13 | 1.93 |
| … net flow over the whole 450 m stretch (m³/s) | 275 in | 490 in | 204 in |
| Lower reef at Kite Beach's north-west end (4.3–4.8 km), average | 0.70 | 0.97 | 0.43 |
| … strongest surges | 0.93 | 1.45 | 1.08 |
| … net flow (m³/s) | 44 out | 288 out | 213 out |
From outputs/xbeach_reef.json. The speeds are the fastest outflow along each stretch of the reef line. Version 0.9 had, wrongly, the channel at about 1.0, 1.2 and 0.3 m/s on average and the north-west end with almost no net outflow in the big north-east swell and a net inflow in the big north swell.
- XBeach shows the channel as a surging rip, strongest in big north swells. There the water goes out at about 1.0 m/s on average, with surges up to about 1.9 m/s. On a typical winter day it is weaker, about 0.35 m/s on average (surges to about 0.6 m/s), and in a big north-east swell about 0.5 m/s (surges to about 1.1 m/s). The surges in the bigger swells are fast enough to carry sand, and people, out through the reef.
- The outflow is concentrated in the channel itself. Over the channel's whole 450 m stretch more water comes in over the reef on either side than goes out through it, in all three cases (a net 200–490 m³/s in). The averaged current model has the same: a net 140–330 m³/s in, in every case.
- The averaged current model's channel speeds are now close to XBeach's averages. Its fastest average outflow there (4.8–5.1 km) is about 0.1–0.6 m/s in most cases (0.42 m/s in the big north-east swell, against XBeach's 0.51) and about 1.1 m/s in the north swell (against XBeach's 1.01); 0.8 m/s in the north-east swell if the channel is 4 m deep (Section 15.5). Both put the strongest channel outflow in the big north swell. XBeach adds the surges on top, which the averaged model smooths out.
- XBeach confirms the main exit at Kite Beach's north-west end. The lower reef there is XBeach's main net exit in all three cases (net 44, 288 and 213 m³/s out). Over the same stretch the averaged model has 120 and 390 m³/s going out in the two big swells, but a small net inflow on the typical winter day; its outflow on that day is a little further north-west (273 m³/s over 4.1–4.8 km). The XBeach area ends at 4.0 km, close to this exit, which may affect it there.
- Old and corrected depths. Measured the same way along the reef line, XBeach gives nearly the same outflow speeds with the old (drone-blended) and the corrected depths in all three cases: the channel averages are 0.34, 0.62 and 0.89 m/s on the old depths against 0.35, 0.51 and 1.01 m/s on the corrected ones, and the north-west end within about 0.04 m/s (
outputs/xbeach_reef_olddepths.jsonagainstoutputs/xbeach_reef.json). The speeds do depend on exactly where they are measured: these are on the reef line at the outer edge of the reef.
15.4 Where the water turns cloudy after big swells (satellites)
If sand and fine sediment are stirred up behind the reef in big swells and carried out, the water outside the reef should turn cloudier. We compared Sentinel-2 images taken after big swells (waves over 2 m in the 24 hours before the image) with images from quieter days (waves no higher than 1.3 m), with white water, cloud and cloud shadow removed (plume_check.py). Both groups are from the same season, November to April (26 and 30 images), because most big swells come in winter and most calm days in summer, and the season alone changes how the water looks. The earlier all-year comparison (32 against 50 images) is kept in the figure for reference. Cloudiness is measured as the brightness of the water in green light above that of clear deep water (in reflectance × 10,000), 60–400 m outside the reef line.

- After big swells the water outside the reef is cloudier all along the coast. West of 6 km, including off Encuentro, the increase is fairly even, about +55 to +110.
- The most is off Cabarete Bay: about +150 to +210 off its western side and the Cabarete Main Reef break (6.1–6.9 km), and +140 to +240 off the reef at Cabarete's eastern point (7.9–9.1 km).
- On the map the cloudier water spreads as a broad patch 1–2 km offshore of Kite Beach and the bay. This fits the corrected current model: water from the point flows into the bay, much of it leaves across the bay's opening, and it turns in a large eddy offshore.
- There is no extra peak off the Kite Beach exits. Off the exit at its north-west end (4.1–4.8 km) the increase is about +90 to +110, much the same as along the rest of the coast west of 6 km; off the channel it is slightly less (+78). The channel is narrower than the satellite picks up well, and its outflow surges rather than flowing steadily.
- Off Encuentro the water is also cloudier after big swells (+55 to +90). The earlier statement that there was none came from comparing winter images with summer ones, and does not hold.
- This fits a sandy bottom. Locals report that the bottom of Cabarete Bay and from Kite Beach to Encuentro is sandy, out past the reefs too, and that the sand shows in the murky water. Plenty of sand on the bottom being stirred up by big swells would make the water cloudier along the whole coast, as seen here.
- Caveat: Cabarete Bay also receives runoff from the land and from the lagoon behind the town, and big winter swells often come with rain. We have not separated the two.
15.5 How much depends on the unmeasured depths?
We reran four cases with the channel 2 m and 4 m deep instead of 3 m, and with the back-reef's deepest pockets capped at 3 m, in case they are really dark seagrass rather than deep water.
| Big north-east swell | Channel 2 m | Channel 3 m (main runs) | Channel 4 m | Back-reef capped at 3 m |
|---|---|---|---|---|
| Out at Kite Beach's north-west end and the between stretch, 4.1–4.8 km (m³/s) | 396 | 395 | 265 | 341 |
| Fastest average outflow through the channel, 4.8–5.1 km (m/s) | 0.32 | 0.42 | 0.84 | 0.47 |
| Flow along the Kite Beach back-reef at 5.15 km (m³/s) | +55 | +58 | +62 | +60 |
| Flow at the Kite point, 5.75 km (m³/s) | −351 | −331 | −331 | −346 |
- The pattern holds in every version. Behind the north-west part of Kite Beach the water flows north-west, and the split stays at about 5.2 km in winter and the big swells and about 5.6 km in summer. At the point the water flows into Cabarete Bay. The main exit through the reef at Kite Beach is at its north-west end. XBeach agrees on both (Sections 7.4 and 15.3).
- A deeper channel takes more of the outflow away from the north-west end, and its outflow speeds rise. In the big north-east swell, the water going out through the channel stretch is about 50, 100 and 230 m³/s with the channel 2, 3 and 4 m deep, and the north-west-end exit drops from about 395 to 265 m³/s when the channel is 4 m deep. How the water divides between the two exits is what the unmeasured depths decide.
15.6 A sand budget from these currents: not reliable
We tried to turn the currents into a year-round sand budget (sand_budget.py, rerun on 7 October with the corrected currents and near-bed wave speed).
- Method. Every hour of 2017–2026 was matched to one of the seven cases by its waves and tide, and the sand the currents could carry was scaled by the cube of the wave height. We then counted the sand crossing lines along and across the coast, and compared each beach's gain or loss with the satellite trends.
- It failed. The currents could carry 14 to about 4,000 times more sand than the beaches actually gained or lost (150–1,000 times in most stretches). The sign of the gain or loss matched the satellites in only 4 of 9 stretches, no better than chance, and beach by beach the correlation was weak and the wrong way (−0.3).
- Why. The sand formula (Soulsby–van Rijn) is not calibrated here, and the grain size it assumes (0.25 mm) has not been measured, so the amounts it gives are only a capacity. A steady current model also leaves out what waves do at the beach itself: the swash, the undertow and the surges. (Earlier versions also said that much of the back-reef is really rock or seagrass with only a thin, patchy cover of sand, so that the model moved sand that isn't there. That idea came only from the Coral Atlas, a satellite map of reef shapes that does not measure sand, and locals report the opposite: the bottom is sandy from Cabarete Bay to Encuentro and out past the reefs, with plenty of sand. We have withdrawn it.)
- So we don't trust its numbers for sand lost to Sosúa or to deep water. It gives about 71,000 m³ a year carried west past Encuentro and about 2.8 million m³ a year carried out to sea, far more than the beaches' small changes could allow.
- The second try: XBeach over the whole reef (xbeach_budget.py). XBeach limits sand movement to the sand that is there, and includes what waves do at the beach.
- It ran on two model areas, one from Encuentro to past Kite Beach, the other from Kite Beach across Cabarete Bay, with the corrected depths.
- Sand was 3 m thick on the beach and near shore, a thin 0.3 m layer on the back-reef flats, and absent on the Coral Atlas reef zones, which were treated as rock (in the 2D XBeach runs about 21% of the cells). With the plentiful sand that locals report, this set-up underestimates the sand available; a rerun with sand everywhere except the reef crest is planned (Section 12.5).
- The year was represented by 16 typical conditions (from 1 m trade-wind days at 1,170 hours a year to a 4 m north swell at 16 hours a year), each run for 1 hour after a 1-hour start.
- All 32 runs took about 15 hours.
- It failed the test as well.
- The yearly totals are swamped by the start-up. In each run the beach and seabed first reshape themselves to suit the model's physics. That makes the beach in eight of the nine stretches "gain" sand, typically a few hundred times faster than the satellites record (from about 70 to 4,000 times); the ninth, the small beach by the Kite point, hardly changes. Counting the back-reef as well, five stretches lose sand (from Encuentro beach to Kite Beach) and the four from the small beach by the point to eastern Cabarete Bay gain, but not in a way that matches the satellites. (Re-analysed in version 0.10 with XBeach's sand transport read correctly: the beach changes are unchanged, but the sand moving along the shore and out to sea changed, and with it this back-reef count; version 0.9 had three stretches losing.) The sign matched in 5 of 9 stretches, with no correlation (−0.02).
- Its month-by-month pattern is not a test either. The 2D XBeach season runs (Section 13.2) showed that, in such short runs, a stretch's monthly "change" mostly follows that month's wave energy with a fixed sign. So a partial match with the satellites' average year would not show that the model gets the seasons right, and we do not use it.
- What this means. The beaches change by only up to about 6 m³ per metre a year (from the satellite trends), much less than their seasonal swings (Section 3). A budget that can see the yearly changes, and so the sand passing through towards Sosúa or out to sea, needs:
- long runs that follow the beach through whole seasons after it has settled, not 1-hour rates added up;
- sand allowed everywhere it really lies, which by local observation is almost everywhere except the reef crest;
- and measurements to tune them: grain size, how deep the sand is stirred, and repeated surveys.
So both budgets failed for the reasons above: XBeach's start-up effect, the uncalibrated sand formula, the unknown grain size, and a steady current model that leaves out what the waves do at the beach. A lack of sand on the bottom is no longer one of them. With what we have, the models give the directions and the mechanisms, and the satellites give the amounts stored on the beaches. How much sand passes through the system and is lost to the west or offshore stays an open question.
15.7 What it means, and how much to trust it
- The back-reef behind the north-west part of Kite Beach runs north-west (behind all of Kite Beach on summer and trade-wind days). In the current model, water, and the sand it can move, heads for the lower reef at Kite Beach's north-west end and the between stretch, and goes out to sea there. That is also where the "hinge" is (Section 7): the part of Kite Beach that drains towards the summer stretch in summer. So this exit is a possible route by which sand could leave the Kite Beach system. XBeach, read correctly, confirms it as the main net exit at Kite Beach on a typical winter day and in both big swells (15.3).
- In winter, and in big north-east swells, the south-east part of Kite Beach drains the other way, into Cabarete Bay, with the split at about 5.2 km.
- The Kite Beach channel is a surging rip, strongest in big north swells (XBeach about 1.0 m/s on average, surges up to about 1.9 m/s) and weaker on typical winter days and in big north-east swells (about 0.35–0.5 m/s). It is a second route out, with the outflow concentrated in the channel itself.
- The Kite point sends its back-reef water into Cabarete Bay, and both models now agree on this. In the strip 20–150 m from the waterline just south-east of the point, the current model runs the water towards Cabarete Bay at +0.15 to +0.23 m/s and XBeach (both pilots, corrected depths) at +0.18 to +0.20 m/s, in winter and summer. The waves that drive it come over the reef from north of the coast normal in SWAN, XBeach and the satellite images, and a finer grid (down to 2.5 m) gives the same answer (Section 7.4). Version 0.9 called this an unresolved disagreement; that came from an error in how we read XBeach's output.
- The sand at the point. The satellites show Kite Beach and the small beach on the Cabarete side of the point trading sand through the seasons, and the wave tables have the small waves that reach the beach pushing sand along the beach face from the Cabarete side towards Kite Beach (Section 7). The current a little further out runs the other way. Both can be true, because the push along the beach face and the reef-driven current act in different ways and, we think, mainly in different places (Section 7.4; that last point is our interpretation). So some Kite Beach sand may leave south-east past the point, and some small-beach sand go on into Cabarete Bay, with the current. Locals report that the bottom is sandy there, so the current has sand to carry, and this is more likely than earlier versions said. Which wins, and how much sand moves either way, is not known. It depends on the sand's grain size and on how much of it is loose and stirred up by the waves, none of which has been measured. Nor could the current model or XBeach put reliable numbers on the sand budget (15.6). Drifters and sand samples (Section 12) are the next step.
- The satellites show the water cloudier after big swells all along the coast, and most off Cabarete Bay, which points to the bay as the main place where sediment is stirred up and carried offshore in big swells. That fits the plentiful sand on the bottom that locals see in the murky water after swells (rain runoff not separated).
- What we trust most, and least:
- The patterns along the back-reef (which way the water goes, and where it splits) come out the same across all the depth versions and with both kinds of model edge (15.8). They agree with the photos and with the satellite pictures of breaking and cloudiness.
- They broadly agree with XBeach, read correctly: on the flow past the point into Cabarete Bay, on the currents along most of the coast (Section 7.5), on the main exit at Kite Beach's north-west end, and on the channel's outflow being strongest in the big north swell (15.3). In the west of Cabarete Bay the weak currents differ between the two.
- The amounts depend on unmeasured depths, especially the channel's.
- The currents are averages over 1.5 hours; surges add strong bursts on top.
- Next steps: Section 12.
15.8 Do the model's edges change the answers?
Added 7 October 2026 (version 0.8); redone for version 0.9 on the corrected model.
A current model has to stop somewhere, and what it assumes at its edges can leak into the answers. In this model the water level is held at sea level along the offshore edge and along both side edges. But the side edges cross the surf zone, where breaking waves raise the water level (wave setup), so holding them at sea level could drive false currents. A test in another model we built with the same computer code (for a harbour in Canada) showed that this kind of edge can matter. So we reran both current models with "free" side edges instead. A free edge lets the level and the current carry on unchanged across the edge, which is the usual choice where the coast continues beyond the model; XBeach uses it by default (boundary_sensitivity.py, reef_boundary_test.py).
The Kite Beach model (Sections 6 and 7; typical winter and summer days): - With free side edges, the average currents change by less than 2% at Kite Beach, along the summer stretch and between them. Fewer than 5% of the cells away from the edges change by more than 5 cm/s. - On version 0.8 of this model, we also checked that differences of this size are real and not the model's own natural eddies: a run with the wind changed by 0.1% changed almost nothing. That check has not been repeated on version 0.9. - A third set-up, a "radiation" edge that lets water out towards sea level, did change the answers (the currents along the summer stretch dropped by about a quarter): it drained the wave setup out sideways, which is wrong where the beach carries on beyond the edge. We did not use it. - So the edges do not affect this model's results.
The whole-reef model (this section), all seven cases:
| Case | Water in over the reef (m³/s): held edges (as in 15.2) / free side edges | Out at Kite Beach's north-west end and the between stretch, 4.1–4.8 km | Along the Kite Beach back-reef, 5.15 km | At the Kite point, 5.75 km |
|---|---|---|---|---|
| Typical winter day | 3,761 / 3,724 | 273 / 270 | +66 / +67 | −189 / −188 |
| Typical summer day | 1,740 / 1,753 | 284 / 284 | +117 / +117 | −59 / −60 |
| Strong trade winds | 2,577 / 2,595 | 272 / 274 | +170 / +169 | −65 / −69 |
| Big north-east swell, mid tide | 4,712 / 4,771 | 395 / 394 | +58 / +64 | −331 / −341 |
| Same swell, low tide | 3,890 / 4,031 | 342 / 292 | +40 / +35 | −263 / −284 |
| Same swell, high tide | 5,582 / 5,599 | 416 / 517 | +78 / +83 | −360 / −363 |
| Big north swell | 4,441 / 4,449 | 417 / 413 | +9 / +7 | −499 / −501 |
- On typical days and in the north swell the edges hardly matter. The flows change by a few percent at most, and no more than 9% of the cells away from the edges change by more than 5 cm/s.
- In the big north-east swell they matter somewhat, around Kite Beach.
- At mid tide the totals barely change (395 against 394 m³/s out at the north-west end). At low tide that outflow drops from 342 to 292 m³/s, and at high tide it rises from 416 to 517 m³/s.
- Averaged over Kite Beach, the flow along the back-reef is 21 against 22 m³/s at mid tide, but 13.5 against 0 at low tide. Over the between stretch at high tide, the south-eastward flow rises from 21 to 68 m³/s.
- 28–39% of the cells away from the edges change by more than 5 cm/s, against 9% or less in the other cases.
- The direction in which the currents could carry sand along the back-reef at the north-west end of Kite Beach still reverses at mid tide, and almost vanishes at high tide. Along the rest of Kite Beach it no longer reverses.
- The patterns hold in every case and with both edges: behind the north-west part of Kite Beach the water flows north-west, at the Kite point it flows into Cabarete Bay, and the main exit through the reef at Kite Beach is at its north-west end and along the between stretch.
What this means. With the corrected counting, the edges matter much less than version 0.8 reported (there, for example, 593 against 335 m³/s out at the north-west end at mid tide). The amounts given for the big north-east swell around Kite Beach (Sections 15.2 and 15.5) should be read as uncertain by about a quarter, and the local directions of sand movement in the back-reef at the north-west end of Kite Beach in that swell are not reliable. The typical days and the north swell are not affected. A firmer answer would need a wider model, so that its edges are far from Kite Beach, or measurements. Future big-swell runs should be made with both kinds of edge and reported only where they agree (docs/VALIDATION_PLAN.md).
Appendix: fixing SWASH's output
The first SWASH runs finished, but two of their outputs could not be read:
1. The near-bed velocity file came in SWASH's "STAB" format, with a long header, not a plain table. It is standard for velocities output per layer. We wrote a reader for it (read_stab in swash_transects.py). We also learned that dry points are not flagged, so they are detected by water depth instead.
2. The run-up output was meaningless (values of about 10⁻³⁸). The manual says run-up must be written with the special output set 'NOGRID', not at a point. We fixed that, and added output points every 1 m across the swash zone as an independent check. The two run-up estimates now agree to within about 0.06 m.
3. We added surf-beat analysis: the water level at each point is split into ordinary waves (under 25 s) and surf beat (over 25 s).
All 54 SWASH runs (3 Kite lines × 10 cases, 3 Encuentro lines × 8 cases) were rerun with the corrected output.
Appendix: files
Figures and scripts, all in G:\github\cabarete-sand:
| Topic | Scripts | Main outputs |
|---|---|---|
| Satellite waterlines | fetch_s2.py, timelapse.py (sun glint removed), segment_budget.py, map_seasonal.py (tide_correct.py is the older San Juan correction, superseded) |
outputs/kite_timelapse.mp4, outputs/kite_timelapse.gif, outputs/shoreline_positions.csv, outputs/wide/ |
| Tide | tide_gauge.py (Puerto Plata gauge, UHSLC 777; data/tide_gauge/h777.csv); fetch_tide.py (the older San Juan × 1.44, superseded) |
data/tide_cabarete.csv, outputs/tide_gauge.md, outputs/tide_gauge.png |
| Depths | build_bathymetry.py [kite\|encuentro] |
data/model_bathymetry_*.tif, outputs/model_bathymetry_*.png |
| Back-reef flow, whole reef | build_bathymetry.py reef (Atlas only, crest kept shallow, Kite Beach channel), reef_flow.py (breaking-based wave force); sensitivity build_bathymetry.py reef_ch2/reef_ch4/reef_cap3 with REEF_DOMAIN=...; surges xbeach_reef.py; cloudiness plume_check.py; budgets sand_budget.py, xbeach_budget.py |
data/model_bathymetry_reef*.tif, model/reef_flow/, outputs/reef_flow*.json, outputs/reef_flow_*.png, outputs/reef_flow_run.log (outlet lists); outputs/xbeach_reef.json/.png; outputs/plume_check.json/.png; outputs/sand_budget.json/.png; outputs/xbeach_budget.json/.png |
| Currents and sand, Kite Beach model (Sections 6, 7 and 15.8) | flow_sand_cases.py (GPU current model on the Kite Beach SWAN cases) |
model/flow/, outputs/flow_sand_*.png, outputs/flow_sand_summary.txt |
| Mapping drone photos onto the ground | photo_rectify.py (needs the drone's position and angles in the photo) |
outputs/photo_*.png |
| Reef gaps and channels, whole coast | bathy_survey.py |
outputs/bathy_survey*.png, outputs/bathy_survey.json, data/bathy_survey.npz |
| SWAN | swan_cases.py, swan_table.py (CABARETE_DOMAIN=encuentro for the new area), swan_hindcast.py, table_summary.py; offshore wave climate figure longshore_model.py |
data/swan_table*.npz, data/nearshore_hindcast.csv, outputs/swan_cases.png, outputs/swan_vs_whitewater.png, outputs/nearshore_waves.png, outputs/wave_climate.png |
| SWASH | swash_transects.py (--sweep, --encuentro, --analyse), swash_figure.py |
model/swash/, outputs/swash_*.png, outputs/swash_*.md |
| XBeach 2D pilot | xbeach_2d.py, xbeach_2d_figure.py (XB2D_DEPTH=reef for the corrected depths); plan in XBEACH_2D_PLAN.md |
model/xbeach2d/, model/xbeach2d_v2/, outputs/xbeach2d_pilot.png/.md, outputs/xbeach2d_v2_pilot.png/.md |
| XBeach 2D stage 2 (reduced climate) | xbeach_2d_seasons.py |
model/xbeach2d_seasons/, outputs/xbeach2d_seasons.png, outputs/xbeach2d_seasons.md, outputs/xbeach2d_seasons_stats.json |
| Kite point and Cabarete Bay | fetch_s2.py --coast, CABARETE_AREA=coast timelapse.py (water-frequency reference line for the curved coast), coast_budget.py, build_bathymetry.py cabarete, CABARETE_DOMAIN=cabarete swan_table.py, XB2D_SET=bay xbeach_2d.py |
outputs/coast/, outputs/coast_budget.png/.md, data/swan_table_cabarete*.npz, outputs/xbeach2d_bay_pilot.png/.md, outputs/xbeach2d_bay_v2_pilot.png/.md |
| Wind-blown sand | aeolian.py (ERA5 wind and rain, data/rain_era5.csv; dry beach widths from the satellite images) |
outputs/aeolian.png, outputs/aeolian.md, data/aeolian_monthly.csv |
| Depth sensitivity | depth_sensitivity.py |
outputs/depth_sensitivity.md |
| Summary figures | summary_figures.py |
outputs/report/exec_summary.png, outputs/report/transport_hinge.png |
| Spot lookup for the surf forecast | spot_downscale.py (with per-hour warnings), primer_figures.py; the primer SURF_LOOKUP_TABLES_PRIMER.md; the GPU surf-forecast plan GPU_SURF_FORECAST_PLAN.md |
data/spot_tables.npz, outputs/spot_downscale_demo.png, outputs/primer/ |
| Speed benchmark (GPU) | benchmark_gpu.py |
outputs/benchmark_gpu.json |
| XBeach | xbeach_lines.py (--encuentro; XB_FACUA, XB_SUBDIR for the sensitivity runs), xbeach_figure.py |
model/xbeach/, outputs/xbeach_*.png |
| Before and after big swells | swell_events.py |
outputs/swell_events.png, outputs/swell_events.md/.json |
| After north swells (version 0.11) | north_swell_events.py |
outputs/north_swell_events.png, outputs/north_swell_events.md/.json |
| Along-shore sand | alongshore_swan.py |
outputs/alongshore_swan.md, outputs/alongshore_swan*.png, data/alongshore_forcing.npz |
| Response models | response_model.py, equilibrium_model.py |
outputs/response_model.md/.png, outputs/equilibrium_model.md/.png |
| Surf spots | spots.py |
outputs/spots_*.png, outputs/spots_summary.md, data/spots_hindcast.csv |
| Report figures | report_figures.py |
outputs/report/ |
| SWAN data for other projects | – | SWAN_DATA_GUIDE.md |
| Checks added in version 0.9 | waterline_crosscheck.py (an independent waterline from the 10 m bands), beach_trends.py (trends and swings), alongshore_numbers.py (the along-shore model's numbers quoted in Section 7), boundary_sensitivity.py (the edges of the Kite Beach current model, flow_sand_cases.py) and reef_boundary_test.py (the edges of the whole-reef model), xbeach_reef.py --analyse-olddepths; ERA5 peak periods fetch_waves.py --peak |
outputs/waterline_crosscheck.md, outputs/beach_trends.md, outputs/alongshore_numbers.md, outputs/boundary_sensitivity.json, outputs/reef_boundary_*.json, outputs/xbeach_reef_olddepths.json, data/waves_era5_peak.csv |
| Checks added in version 0.10 | kite_point_nest.py (the current model at 5 m with SWAN nested at 5 m and 2.5 m around the Kite point), waves_from_space.py (wave-crest directions in the satellite images); the XBeach reading fix in xbeach_2d_figure.py, xbeach_reef.py, xbeach_budget.py |
outputs/kite_point_nest.md/.json, outputs/waves_from_space.md/.json/.csv, outputs/xbeach2d_*pilot.md/.png, outputs/xbeach_reef*.json/.png, outputs/xbeach_budget.json/.png; the 0.9 versions in outputs/archive/2026-10-08_v0.9/ |
| Quality review and validation | – | docs/qa/ (findings and register), docs/VALIDATION_PLAN.md |
| Earlier results | – | outputs/archive/<date>_<version>/, model/archive/, data/archive/ |
Version history
Version numbers were added on 7 October 2026 and given to the earlier states of the report from the project's change record (git). From now on, every change to the report's results, figures or web pages gets a new number here.
| Version | Date | What changed |
|---|---|---|
| 0.1 | 28 Sep 2026 | First report: ten years of satellite shorelines, the SWAN and SWASH wave models, the along-shore and across-reef sand models, and the surf-spot products. |
| 0.2 | 28 Sep 2026 | XBeach 1D swell events and their onshore-transport sensitivity; the before-and-after-swell satellite test (Sections 6.3–6.4); the 2D XBeach pilot and the speed benchmarks (Sections 13–14). |
| 0.3 | 29 Sep 2026 | The measured Puerto Plata tide replaced the scaled San Juan prediction, and the tide-dependent analyses were rerun (Sections 3.5, 7.4). Stage 2 of 2D XBeach (a reduced year of waves), which appeared to reproduce Kite Beach's seasons (withdrawn in 0.9 as a start-up effect). The executive summary answering the six questions. The surf-spot lookup module. |
| 0.4 | 30 Sep 2026 | The study area was extended to Cabarete Bay (satellite waterline, SWAN table, along-shore model, Section 7.5); depth sensitivity (Section 3.6); "lagoon" renamed "back-reef"; the summary (REPORT_SUMMARY.md); wind-blown sand (Section 7.6); the north-swell reversal near the Kite point; the whole-coast seabed survey (Section 3.7). |
| 0.5 | 30 Sep 2026 | The whole-reef back-reef flow model (Section 15), rewritten the same day after three corrections (wider area, Coral Atlas depths only with the reef crest kept shallow, wave push from breaking); XBeach surges in the Kite Beach channel; the plume check; channel and back-reef depth sensitivity. First publication of the web viewer, the report and the summary at kewlmermaid.com/kite-beach-sand/. |
| 0.6 | 1 Oct 2026 | Reef line traced from the model depths; the XBeach whole-reef sand budget (it failed the satellite test, Section 15.6); the back-reef water split near the south-east end of Kite Beach made explicit; a consistency pass; drone against Atlas depths by depth band; the surf lookup-table primer. |
| 0.7 | 2 Oct 2026 | The surf lookup tables rebuilt on the corrected depths; Cabarete Main Reef located from a local's pin and taken from the Cabarete Bay table. |
| 0.8 | 7 Oct 2026 | The current models' GPU solver updated to the version of the Kingston harbour model (same results to the last digit, faster options). A test of the current models' open edges (Section 15.8): the Kite Beach model and the typical days in the whole-reef model are not sensitive to them, but the big-swell results at Kite Beach are, and are now marked as such. Independent quality review of the code and the report (findings register in docs/qa/). Validation plan with pass/fail criteria set in advance (docs/VALIDATION_PLAN.md). Version numbers and this history. |
| 0.9 | 7 Oct 2026 | The quality review's findings worked through (docs/qa/QA_REGISTER.md). Fixes: sun glint removed from the satellite waterline, and a second, independent waterline as a check (the traced line sits 10–17 m landward of the water's edge; the timing of the seasons holds, their sizes are less certain); the tide measured from its 2017–2026 mean; trends from monthly means with honest error bars (Kite Beach shows no clear trend; the small beach by the Kite point narrows about 2 m a year); swell-event changes tested against the random dates and for the number of tests (none stands out); the response model tested against a stronger baseline (it still works for the summer stretch); the along-shore model, wave record and surf-spot products moved to the corrected depths, and the sand-transport coefficient corrected (the waves' potential volumes are about twice what was printed); the 2D XBeach seasonal test withdrawn (a start-up effect); the reef-flow model's count of water crossing the reef corrected and its wave push limited to breaking (the outflow at Kite Beach's north-west end is about 270–420 m³/s in every case; the edge test of 0.8 redone: the big-swell sensitivity is much smaller than 0.8 said); the plume check compared within the same season; SWASH rerun without a repeating wave train and with the beach no longer capped at +2 m (big-swell run-up was capped before); the XBeach pilots rerun on the corrected depths. Executive summary, summary and every affected section rewritten from the new outputs. |
| 0.10 | 8 Oct 2026 | XBeach direction fix. XBeach writes its currents, wave forces and sand transport as east/north components; our scripts (xbeach_2d_figure.py, xbeach_reef.py, xbeach_budget.py) turned them a second time, which scrambled every 2D XBeach current direction up to 0.9. Fixed, and the existing XBeach runs re-analysed (no new runs; the 0.9 outputs are in outputs/archive/2026-10-08_v0.9/). Grid-size test (kite_point_nest.py): the current model on a 5 m grid, with SWAN nested at 5 m and 2.5 m around the Kite point, gives the same answer as the 10 m model, so grid size was not the cause of the apparent disagreement. Satellite wave crests (waves_from_space.py): on the reef approach at the point the swell comes from about 22°, north of the coast normal (57°) in 98% of 103 images, as in SWAN and XBeach. Consequences: at the Kite point XBeach and the current model now agree that the water near the beach runs into Cabarete Bay (the 0.9 "unresolved disagreement" is gone; confidence medium); the two broadly agree along the coast, including the eastern bay; the Kite Beach channel is a weaker rip than published on typical winter days and in big north-east swells (about 0.35 and 0.5 m/s on average) and strongest in big north swells (about 1.0 m/s, surges about 1.9 m/s); 0.9 had it at about 1.0–1.2 m/s on typical winter days and in big north-east swells, with surges to 1.8 m/s; XBeach now confirms the main exit at Kite Beach's north-west end; the XBeach whole-reef budget's along-shore and offshore sand movement changed, but it still fails the satellite test. Which way the sand moves at the point is still not known: the push along the beach face runs towards Kite Beach, the current further out towards Cabarete Bay, so some Kite Beach sand may leave south-east past the point; drifters and sand samples are added to the next steps (Sections 7.4, 7.5, 12, 13.1, 15.3, 15.6, 15.7). Local knowledge (9 Oct 2026): a local reports that the bottom of Cabarete Bay and from Kite Beach to Encuentro is sandy, out past the reefs too, with plenty of sand; our sand cover had come only from the Coral Atlas. No new model results, but the reasoning changed: "the back-reef is mostly rock with a thin cover, so the model moves sand that isn't there" is withdrawn as a reason for the failed sand budgets; a flow passing through now looks the likelier reason Encuentro does not fill up; some sand moving south-east past the Kite point is more likely (sand direction there still low confidence; grain size and how much moves are the unknowns); the cloudy water after swells fits a sandy bottom; a rerun with sand everywhere except the reef crest is planned (Sections 7.4, 9, 11, 12.5, 15.4, 15.6, 15.7). |
| 0.11 | 12 Oct 2026 | North swells in the satellite record (north_swell_events.py). Image pairs no more than 30 days apart, with the width change fitted to the north-swell (320°–25°) and other wave energy between the images. After a typical north swell the south-east half of Kite Beach is about 2 m wider within a few days (q = 0.02 after 49 comparisons) and western Cabarete Bay about 1.7 m wider (q = 0.06); the summer stretch tends to be narrower (not significant after the comparisons). This is the first clear mark of a swell type in the satellite record, and the first satellite sign of sand moving south-east past the Kite point. Added to Section 7.5, with notes in the executive summary, Section 6.3 and the confidence tables. No other results changed. |