designUHS() now derives the spectral parameters per ASCE 7-22
Sec. 21.4 (site-specific input): at MCER level,
SMS = 0.9 * max SaM(T) over T in [0.2, 5] s and
SM1 = max(0.9 * max[T * SaM(T)], SaM(1 s)) over [1, 2] s when
vs30 > 442 m/s, else [1, 5] s (new optional vs30 argument;
NULL uses the conservative wide window). The previous seeding
(Ss = Sa(0.2 s), S1 = Sa(1.0 s), Fa = Fv = 1) matched no
ASCE 7-22 pathway for site-specific spectra. ASCE-table products
shift on the order of 10 percent. The Sec. 21.2.3 floor and the
Sec. 21.2.2 deterministic cap remain out of scope (documented).designUHS(): the output grid beyond TL was degenerate whenever
TL >= 5 (including the default 8 s), so the long-period branch
(ASCE 7-22 Eq. 11.4-5) never appeared in the returned table; the
grid now samples one octave beyond TL. Documentation now states
precisely which parts of ASCE 7-22 the function implements (the
Sec. 21.4 derivation and Sec. 11.4.5.2 two-period shape) and which
it does not (the Sec. 21.2 floor and deterministic cap).Rrup argument has been REMOVED from rhoBJ(), fitSaF(),
fitDnCurve(), and fitDnModel(), and from the fitDnScenario()
records contract (a legacy Rrup column in records is tolerated
and ignored). The Baker & Jayaram (2008) inter-period correlation
model has no distance dependence, so the argument never influenced
any result: outputs are identical draw-for-draw under the same seed.
Callers passing Rrup by position or by name must drop it.Dn_BT07(): restored the published + 1.50 * Ts term of
Bray & Travasarou (2007) Eq. 5, previously missing (the function
received Ts but never used it), and the -0.22 intercept for
nearly rigid sliding masses (Ts < 0.05 s). The implementation now
reproduces the worked example published by Bray (2007). Median
displacements increase by exp(1.5 * Ts) (about x2.1 at
Ts = 0.5 s).
geSiteTable() / getSiteProperties(): the Shibata-Soelarno (1975)
row of the Ishihara (1996) shear-modulus table now uses its
published LINEAR void-ratio form F(e) = Ce - e/(1 + e); the
quadratic form of the other models had been applied to it,
under-predicting that model by a factor of about 65 and dragging the
Sands-group mean modulus down (about -20 percent in Go for typical
sand profiles).
fitModel.Ts(): rebuilt on the classical Rayleigh quotient with the
static-deflection trial shape. The previous trial shape violated the
base boundary condition under package usage and overestimated the
fundamental period of normal (stiffness-increasing) profiles by tens
of percent (e.g. +44 percent on a 200/400 m/s two-layer column,
+27 percent on the vignette profile). The rebuilt estimator is
within -0.4 to -2.8 percent of the exact layered solution across
test profiles and is invariant to the layer ordering of the input.
All Ts-dependent products (site properties, flexible-block
displacements) shift on regeneration.
Vs30toSID(): the class-B lower bound is now 910 m/s (3000 ft/s,
ASCE 7-22 Table 20.2-1), matching the packaged SiteClass table;
it was 900. The class-E row in SiteClass now prints the
correct inequality (<150 m/s).
Dn_BM19() (and fitDnCurve(), fitDnModel()): near-fault pulse
behaviour is now selected with the explicit pulse argument
(default FALSE = ordinary motion), matching the papers' definition
of pulse as a declared property of the record and the authors'
spreadsheet. The automatic PGV > 115 cm/s switch is retired; PGV
remains a required predictor inside the pulse equations, whose
published 150 cm/s sub-regime is unchanged.F_ST20() implements the final 2020 NGA-East ergodic site-amplification
generation (Stewart et al. 2020 linear model and F760 impedance/gradient
weighting; Hashash et al. 2020 nonlinear model with period-dependent
reference velocity and PGA-dependent nonlinear sigma). Coefficients are
regenerated from the USGS nshmp-lib machine-readable table
(data-raw/SiteAmp2020.R); the implementation is validated at machine
precision against the OpenQuake nga_east.py reference functions.
fitSaFMixture() computes site-amplified spectra from an analytic
scenario mixture (one lognormal component per rupture-variant x GMPE
branch, as produced by the DSHA scenario engine). The composition of the
rock mixture with the lognormal site dispersion is exact: Gauss-Hermite
quadrature over the PGA channel plus monotone mixture-CDF inversion. No
random numbers are drawn - outputs are byte-stable; Sa and SaF are
quantiles of the same conditional demand distribution and
AF = SaF / Sa is the amplification of the p-quantile.
fitSaF() gains a working models menu: "ST20" (new default) and
"ST17". Pass models = "ST17" to reproduce the 2017-generation
amplification.
F_ST17() sigma corrected: the nonlinear component now applies the
PGA-dependent multiplier of its source model
(sigma_Fnl = sigma_f2 * ln((PGA_3000 + f3)/f3), PEER 2017/05 Eq. 2.5
as implemented by USGS nshmp-lib and OpenQuake). Earlier versions used
bare sigma_f2, overstating dispersion at low PGA and understating it
at high PGA. muLnF is unchanged; sdLnF now varies with PGA.
F_ST17() family implements the PEER Report
2017/05 NGA-East recommendations (not Seyhan & Stewart 2014 as
previously documented). The inter-period correlation model is
Baker & Jayaram (2008); it has no distance dependence and the Rrup
arguments are retained for backward compatibility only.fitDnScenario() fits the Newmark displacement curve and Monte Carlo draws
for a single scenario row (one (TR, IDg) combination). Returns a list with
curve and draws data.tables matching the contract of fitDnCurve().
fitDnScenarios() applies fitDnScenario() over a records data.table of
scenario rows and row-binds the results. Accepts useParallel and workers
arguments for fork-based parallel execution on multi-core systems.
fitKmaxScenario() fits the seismic coefficient kmax for a single scenario
row given pre-computed displacement draws and model weights. Returns a
data.table with Da, p, kmax, PGA, Kh, TR, IDg, and IDn.
fitKmaxScenarios() applies fitKmaxScenario() over a records
data.table and row-binds the results. Supports the same useParallel /
workers interface as fitDnScenarios().
fitDnScenarios() now runs Dn scenario rows in parallel when
useParallel = TRUE and workers > 1L. On systems where fork-based
parallelism is available (Linux, macOS), wall time scales nearly linearly
with workers for large scenario grids. Sequential execution (the default)
is unchanged.inst/cran-release.R simplified to a two-phase source() from the
garage canonical scripts (cran-check.R then cran-submit.R). The
prior inline copy of those steps is removed; the garage copy is the
single source of truth.inst/CITATION: replace utils::packageVersion("newmark") with
meta$Version so the citation file evaluates correctly when the
package is not yet installed (CRAN pre-test failure).inst/WORDLIST: add 135 domain-specific terms (author surnames,
technical vocabulary, package-internal identifiers) so
spelling::spell_check_package() exits clean. Add Language: en-US
to DESCRIPTION.Vignettes rebuilt for fidelity to the implemented code and the
underlying paper (Verri Kozlowski 2026, working). Hallucinated
cross-references to deleted articles, oqt-pipeline terminology
leaking into newmark prose, and inconsistent function-name
references were removed.
New vignette dynamic-site-response documents the dsra-side
methodology merged into newmark 1.1.0: Ishihara (1996)
small-strain shear-modulus model, Gazetas & Dakoulas (1985)
inhomogeneous truncated shear-beam fundamental period,
synthetic-profile generation via getSiteProperties() /
geSiteTable(), and the ASCE 7-22 site-class utilities
Vs30toSID() / SIDtoVs30().
pipeline vignette rewritten as a function-level overview of
the four library workflows (dynamic site response, hazard import,
displacement curves, seismic coefficient), with a single
top-of-file note that orchestration on a hazard grid (looping
scenarios, persisting tables) is the consumer's responsibility.
ensemble-formulation vignette now states the inverse-problem
formulation explicitly, documents the BM19 near-fault PGV >
115 cm s⁻¹ correction and the NFC D100/D50 selector, and lists
the operational defaults (Monte Carlo size, k_y grid, reported
quantiles) that the package and downstream consumers share.
newmark-quickstart vignette: stale links to deleted articles
removed; Next steps rewritten as in-package vignette() and
?fnname references.
interpolateSaTable() and buildQSpline() now emit a descriptive
warning() when called on a UHS table with duplicate (Tn, p) rows,
pointing the user to the standard disaggregation key
(siteID, ID, Vs30, TR). R's cryptic regularize.values: collapsing to unique 'x' values warning is suppressed in favour of the new
message — it is replaced, not stacked on top. Numerical behaviour
is unchanged: duplicate rows are still silently collapsed via
stats::approx / stats::splinefun ties = "mean". SoT-validated
bit-identical on clean fixtures (5/5 direct + 36/36 pipeline) and
byte-equal output on duplicated input..summarizeDn(), .summarizeDnDraws(),
.aggregateWeighted() parameter p.vals renamed to pVals.
Producer .sampleDnScenario() returns the list element under the
new key pVals (was p.vals). Consumers fitDnCurve() and
fitDnModel() updated to read .sample$pVals. All references are
intra-package; no exported symbol changes signature. SoT-validated
(Stage B helpers direct identity 3/3; Stage C swap-in-place via
assignInNamespace over the 6 affected functions running the full
fitDnCurve grid 216/216, both bit-identical).getDnKy() parameters renamed for STYLE.md compliance: ky.n →
kyN, p.ref → pRef. Output is bit-identical for any call that
uses the defaults or passes the args by position. Callers that
passed by name must update the keyword. No live caller in the
ecosystem (oqt, research scripts, MCP server, skill templates)
was found to pass these by name; the rename is a clean keyword
change. SoT-validated (Stage A direct identity 27/27 across 3
fixtures × 3 Ts × 3 kyN values; Stage C swap-in-place via
assignInNamespace 216/216 across the full fitDnCurve pipeline).
fitDnCurve() no longer accepts NS.draws. The parameter was a
partial-retention knob (filter draws to the first NS.draws
realisations) that no caller used; every observed call site set
NS.draws = NS. The default NS.draws = 0L produced
draws = NULL, which silently broke invertDnDraws() for callers
who followed the README pattern. draws is now always returned
as a populated data.table (or an empty data.table with the
four canonical columns when no model produces output, replacing
the prior NULL corner-case return).
Migration: drop NS.draws = ... from any fitDnCurve() call.
Output for NS.draws = NS callers (the universal pattern) is
bit-identical (verified across vignette + 2 real UHSTable fixtures
× 3 seeds × 2 NS × 3 Ts × 2 NFC × 2 weight sets).