1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
//! `synth` — **believable synthetic subsurface data**: seeded, deterministic
//! generators for logs, facies, structural surfaces, trend maps, wells and
//! trajectories. The generators the fixture factories and user demos compose into
//! a whole synthetic asset — a full stand-in for a real (confidential) dataset.
//!
//! Synthetic data is *believable* only when it carries the structure real data
//! has: a log **remembers its depth** (autocorrelation, not white noise), a
//! fraction **stays in `[0, 1]`** while hitting a target mean/std, sand and shale
//! **alternate in beds** with a real proportion, a dome **closes four ways**, a
//! trend map **correlates** with the property it drives. This module is built on
//! two small, well-documented maths primitives —
//!
//! - [`correlated`] — a depth-autocorrelated Gaussian series (AR(1) ≙ exponential
//! correlation), the memory under every log; and
//! - [`transform`] — the moment-matched logit-normal map onto `[0, 1]`, hitting a
//! target `{mean, std}` while never leaving the bounds —
//!
//! and the crate's own [`geostat::sgs_unconditional`](crate::geostat::sgs_unconditional)
//! for the 2-D fields.
//!
//! ## The surface (public)
//!
//! - **Logs** — [`ZoneSpec`] + [`synth_log_series`]: a zone-conformant, bounded,
//! depth-autocorrelated property curve hitting each zone's `{mean, std}`.
//! - **Facies** — [`Facies`], [`synth_facies_series`] (truncated-Gaussian binary
//! sand/shale at a target NTG) + [`MomentSpec`], [`synth_por_with_facies`] (the
//! sand/shale porosity contrast composed onto the beds).
//! - **Coupled petrophysics** — [`PetroZoneSpec`] + [`synth_petro_curves`]: one
//! [`PetroCurves`] whose **net-to-gross is derived from porosity** by a net cutoff
//! (`net_flag = φ ≥ cutoff`), with the facies mixture *calibrated* so the realized
//! series still hits the quoted zone NTG and net-rock `{mean, std}` (accounting for
//! the across-cutoff leak). [`ntg_curve`] renders the derived flag as a continuous
//! display curve. The petrophysically-honest replacement for an independent
//! porosity/NTG pair.
//! - **Surfaces** — [`NoiseSpec`], [`synth_dome_surface`] (four-way closure, tilt
//! and correlated noise), [`synth_isochore`] (non-negative thickness), and
//! [`synth_trend_map`] (a `[0,1]` depositional trend, optionally correlated at a
//! known `ρ` with a supplied field).
//! - **Wells** — [`place_wells`] / [`place_wells_in_polygon`],
//! [`tops_from_surface`], and [`Station`] / [`Trajectory`] / [`synth_trajectory`]
//! (vertical) + [`synth_trajectory_profile`] with a [`WellProfile`]
//! ([`BuildHold`] / [`BuildHoldDrop`]) — believable deviated bores placed by the
//! minimum-curvature relation ([`max_dogleg_severity`] scores their plausibility).
//! - **Outlines** — [`closure_outline`] (a surface's closing contour, marching
//! squares) + [`study_area_outline`].
//! - **World frame** — [`Georef`]: the fictional world posture (431000/6521000-style
//! origin) that is the *default* for every spatial generator here (the georeference
//! is the lattice / extent / wellhead you pass); a convenience for the
//! build-local → place-in-world idiom.
//!
//! Every generator is **seeded and bit-reproducible**. Namespaced under `synth`
//! (like `stats` / `sampling` / `units`), not re-exported at the crate root.
//!
//! Derived independently from the cited primary literature on each submodule; no
//! third-party code was consulted.
pub use ;
pub use ;
pub use ;
pub use ;
pub use ;
pub use ;
pub use ;