Clean-room astronomy for the equilibrium (astronomical) body-force
tide. Computes the four mean longitudes (moon s, sun h, lunar
perigee p, ascending node N) from Schureman’s polynomials, the
per-constituent equilibrium argument V_c (with the load-bearing
±pi/2 diurnal signs), and the slowly-varying nodal amplitude/phase
corrections f_c(N), u_c(N). Host-side scalar generator — called
once at init (to bake the ref-date offset into phase0) and once per
outer step (to advance the running argument); NOT a device kernel.
References (the recipe is built from these, not from any model source):
* Doodson (1921), Proc. R. Soc. Lond. A 100.
* Schureman (1958), “Manual of harmonic analysis and prediction of
tides”, US C&GS Spec. Pub. 98 (mean-longitude polynomials; the
36525-day Julian century).
* Cartwright & Tayler (1971) / Cartwright & Edden (1973) (amplitudes).
* Kowalik & Luick (2019), “Modern Theory and Practice of Tide
Analysis and Prediction” (Tables I.4 argument, I.6 nodal).
module~~rdb_ocean_tide_astro~~UsesGraph
module~rdb_ocean_tide_astro
rdb_ocean_tide_astro
iso_fortran_env
iso_fortran_env
module~rdb_ocean_tide_astro->iso_fortran_env
module~rdb_constants
rdb_constants
module~rdb_ocean_tide_astro->module~rdb_constants
pic_types
pic_types
module~rdb_constants->pic_types
Nodes of different colours represent the following:
Graph Key
Module
Module
Submodule
Submodule
Subroutine
Subroutine
Function
Function
Program
Program
This Page's Entity
This Page's Entity
Solid arrows point from a submodule to the (sub)module which it is
descended from. Dashed arrows point from a module or program unit to
modules which it uses.
Where possible, edges connecting nodes are
given different colours to make them easier to distinguish in
large graphs.
module~~rdb_ocean_tide_astro~~UsedByGraph
module~rdb_ocean_tide_astro
rdb_ocean_tide_astro
module~rdb_ocean_boundary_types
rdb_ocean_boundary_types
module~rdb_ocean_boundary_types->module~rdb_ocean_tide_astro
module~rdb_ocean_setup
rdb_ocean_setup
module~rdb_ocean_setup->module~rdb_ocean_tide_astro
module~rdb_ocean_setup->module~rdb_ocean_boundary_types
module~rdb_ocean_tides
rdb_ocean_tides
module~rdb_ocean_setup->module~rdb_ocean_tides
module~rdb_ocean_dyn
rdb_ocean_dyn
module~rdb_ocean_setup->module~rdb_ocean_dyn
module~rdb_ocean_fold_apply
rdb_ocean_fold_apply
module~rdb_ocean_setup->module~rdb_ocean_fold_apply
module~rdb_ocean_halo_state
rdb_ocean_halo_state
module~rdb_ocean_setup->module~rdb_ocean_halo_state
module~rdb_ocean_sponge
rdb_ocean_sponge
module~rdb_ocean_setup->module~rdb_ocean_sponge
module~rdb_ocean_state
rdb_ocean_state
module~rdb_ocean_setup->module~rdb_ocean_state
module~rdb_ocean_halo
rdb_ocean_halo
module~rdb_ocean_setup->module~rdb_ocean_halo
module~rdb_ocean_tides->module~rdb_ocean_tide_astro
module~rdb_barotropic_coupling
rdb_barotropic_coupling
module~rdb_barotropic_coupling->module~rdb_ocean_boundary_types
module~rdb_barotropic_substep
rdb_barotropic_substep
module~rdb_barotropic_substep->module~rdb_ocean_boundary_types
module~rdb_barotropic_substep->module~rdb_ocean_halo
module~rdb_continuity
rdb_continuity
module~rdb_continuity->module~rdb_ocean_boundary_types
module~rdb_continuity->module~rdb_ocean_fold_apply
module~rdb_ocean_mle
rdb_ocean_mle
module~rdb_continuity->module~rdb_ocean_mle
module~rdb_ocean_periodic
rdb_ocean_periodic
module~rdb_continuity->module~rdb_ocean_periodic
module~rdb_continuity->module~rdb_ocean_halo
module~rdb_ice_evp
rdb_ice_evp
module~rdb_ice_evp->module~rdb_ocean_boundary_types
module~rdb_ice_evp->module~rdb_ocean_periodic
module~rdb_ice_evp->module~rdb_ocean_halo
module~rdb_ice_ocean_coupler
rdb_ice_ocean_coupler
module~rdb_ice_ocean_coupler->module~rdb_ocean_boundary_types
module~rdb_ice_ocean_coupler->module~rdb_ocean_halo_state
module~rdb_ice_transport
rdb_ice_transport
module~rdb_ice_transport->module~rdb_ocean_boundary_types
module~rdb_ice_transport->module~rdb_continuity
module~rdb_ice_transport->module~rdb_ocean_halo_state
module~rdb_ice_transport->module~rdb_ocean_halo
module~rdb_ocean_boundary_data
rdb_ocean_boundary_data
module~rdb_ocean_boundary_data->module~rdb_ocean_boundary_types
module~rdb_ocean_bt_wide
rdb_ocean_bt_wide
module~rdb_ocean_bt_wide->module~rdb_ocean_boundary_types
module~rdb_ocean_bt_wide->module~rdb_barotropic_substep
module~rdb_ocean_bt_wide->module~rdb_ocean_halo
module~rdb_ocean_data_forcing
rdb_ocean_data_forcing
module~rdb_ocean_data_forcing->module~rdb_ocean_boundary_types
module~rdb_ocean_data_forcing->module~rdb_ocean_halo_state
module~rdb_ocean_dyn->module~rdb_ocean_boundary_types
module~rdb_ocean_dyn->module~rdb_ocean_tides
module~rdb_ocean_dyn->module~rdb_barotropic_coupling
module~rdb_ocean_dyn->module~rdb_barotropic_substep
module~rdb_ocean_dyn->module~rdb_continuity
module~rdb_ocean_dyn->module~rdb_ocean_bt_wide
module~rdb_ocean_dyn->module~rdb_ocean_fold_apply
module~rdb_ocean_dyn->module~rdb_ocean_halo_state
module~rdb_ocean_hdiff_tracer
rdb_ocean_hdiff_tracer
module~rdb_ocean_dyn->module~rdb_ocean_hdiff_tracer
module~rdb_ocean_dyn->module~rdb_ocean_mle
module~rdb_ocean_obc_baroclinic
rdb_ocean_obc_baroclinic
module~rdb_ocean_dyn->module~rdb_ocean_obc_baroclinic
module~rdb_ocean_dyn->module~rdb_ocean_periodic
module~rdb_ocean_redi
rdb_ocean_redi
module~rdb_ocean_dyn->module~rdb_ocean_redi
module~rdb_ocean_dyn->module~rdb_ocean_sponge
module~rdb_ocean_dyn->module~rdb_ocean_halo
module~rdb_ocean_engine
rdb_ocean_engine
module~rdb_ocean_engine->module~rdb_ocean_boundary_types
module~rdb_ocean_engine->module~rdb_ocean_setup
module~rdb_ocean_engine->module~rdb_ice_evp
module~rdb_ocean_engine->module~rdb_ice_ocean_coupler
module~rdb_ocean_engine->module~rdb_ice_transport
module~rdb_ocean_engine->module~rdb_ocean_boundary_data
module~rdb_ocean_engine->module~rdb_ocean_data_forcing
module~rdb_ocean_engine->module~rdb_ocean_dyn
module~rdb_ocean_engine->module~rdb_ocean_fold_apply
module~rdb_ocean_engine->module~rdb_ocean_halo_state
module~rdb_ocean_engine->module~rdb_ocean_periodic
module~rdb_ocean_engine->module~rdb_ocean_sponge
module~rdb_ocean_engine->module~rdb_ocean_state
module~rdb_ocean_diag_derived
rdb_ocean_diag_derived
module~rdb_ocean_engine->module~rdb_ocean_diag_derived
module~rdb_ocean_diag_fills
rdb_ocean_diag_fills
module~rdb_ocean_engine->module~rdb_ocean_diag_fills
module~rdb_ocean_engine->module~rdb_ocean_halo
module~rdb_ocean_fold_apply->module~rdb_ocean_boundary_types
module~rdb_ocean_halo_state->module~rdb_ocean_boundary_types
module~rdb_ocean_halo_state->module~rdb_ocean_fold_apply
module~rdb_ocean_halo_state->module~rdb_ocean_periodic
module~rdb_ocean_halo_state->module~rdb_ocean_halo
module~rdb_ocean_hdiff_tracer->module~rdb_ocean_boundary_types
module~rdb_ocean_mle->module~rdb_ocean_boundary_types
module~rdb_ocean_obc_baroclinic->module~rdb_ocean_boundary_types
module~rdb_ocean_periodic->module~rdb_ocean_boundary_types
module~rdb_ocean_redi->module~rdb_ocean_boundary_types
module~rdb_ocean_sponge->module~rdb_ocean_boundary_types
module~rdb_ocean_state->module~rdb_ocean_boundary_types
module~rdb_ocean_state->module~rdb_ocean_tides
module~rdb_ocean_state->module~rdb_continuity
module~rdb_ocean_state->module~rdb_ocean_data_forcing
module~rdb_ocean_state->module~rdb_ocean_dyn
module~rdb_ocean_state->module~rdb_ocean_hdiff_tracer
module~rdb_ocean_state->module~rdb_ocean_mle
module~rdb_ocean_state->module~rdb_ocean_periodic
module~rdb_ocean_state->module~rdb_ocean_redi
module~rdb_ocean_state->module~rdb_ocean_sponge
proc~validate_config
validate_config
proc~validate_config->module~rdb_ocean_boundary_types
module~rdb_driver
rdb_driver
module~rdb_driver->module~rdb_ocean_dyn
module~rdb_driver->module~rdb_ocean_engine
module~rdb_driver->module~rdb_ocean_state
module~rdb_handle
rdb_handle
module~rdb_handle->module~rdb_ocean_engine
module~rdb_handle->module~rdb_ocean_state
module~rdb_ocean_api
rdb_ocean_api
module~rdb_ocean_api->module~rdb_ocean_dyn
module~rdb_ocean_api->module~rdb_ocean_engine
module~rdb_ocean_api->module~rdb_ocean_fold_apply
module~rdb_ocean_api->module~rdb_ocean_periodic
module~rdb_ocean_api->module~rdb_handle
module~rdb_ocean_api->module~rdb_ocean_diag_derived
module~rdb_ocean_api->module~rdb_ocean_diag_fills
module~rdb_ocean_diag_derived->module~rdb_ocean_state
module~rdb_ocean_diag_derived->module~rdb_ocean_diag_fills
module~rdb_ocean_diag_fills->module~rdb_ocean_state
module~rdb_ocean_halo->module~rdb_ocean_periodic
Nodes of different colours represent the following:
Graph Key
Module
Module
Submodule
Submodule
Subroutine
Subroutine
Function
Function
Program
Program
This Page's Entity
This Page's Entity
Solid arrows point from a submodule to the (sub)module which it is
descended from. Dashed arrows point from a module or program unit to
modules which it uses.
Where possible, edges connecting nodes are
given different colours to make them easier to distinguish in
large graphs.
Variables
Type
Visibility Attributes
Name
Initial
integer,
public,
parameter
::
TIDES_CATALOG_SIZE
=
10
Full catalog: 8 default (M2 S2 N2 K2 K1 O1 P1 Q1) + MF MM branch.
real(kind=wp),
public,
parameter
::
TIDE_AMP (TIDES_CATALOG_SIZE)
=
[0.242334_wp, 0.112743_wp, 0.046397_wp, 0.030684_wp, 0.141565_wp, 0.100661_wp, 0.046848_wp, 0.019273_wp, 0.042041_wp, 0.022191_wp]
Equilibrium amplitudes A (m).
real(kind=wp),
public,
parameter
::
TIDE_DEG2RAD
=
TIDE_PI/180.0_wp
Degrees -> radians.
real(kind=wp),
public,
parameter
::
TIDE_LOVE (TIDES_CATALOG_SIZE)
=
[0.693_wp, 0.693_wp, 0.693_wp, 0.693_wp, 0.736_wp, 0.695_wp, 0.706_wp, 0.695_wp, 0.693_wp, 0.693_wp]
Effective Love-number factors (1 + k - h).
character(len=2),
public,
parameter
::
TIDE_NAME (TIDES_CATALOG_SIZE)
=
["M2", "S2", "N2", "K2", "K1", "O1", "P1", "Q1", "MF", "MM"]
Constituent names (catalog order).
real(kind=wp),
public,
parameter
::
TIDE_OMEGA (TIDES_CATALOG_SIZE)
=
[1.4051890e-4_wp, 1.4544410e-4_wp, 1.3787970e-4_wp, 1.4584234e-4_wp, 0.7292117e-4_wp, 0.6759774e-4_wp, 0.7252295e-4_wp, 0.6495854e-4_wp, 0.053234e-4_wp, 0.026392e-4_wp]
Angular frequencies omega_c (rad/s).
real(kind=wp),
public,
parameter
::
TIDE_PI
=
4.0_wp*atan(1.0_wp)
Pi to working precision.
integer,
public,
parameter
::
TIDE_SPECIES (TIDES_CATALOG_SIZE)
=
[2, 2, 2, 2, 1, 1, 1, 1, 3, 3]
Species / structure-slice index: 1 diurnal, 2 semidiurnal,
3 long-period. Directly indexes the (nx,ny,3) struct slices.
Functions
Days since the astronomical origin 1900-01-01 00:00 UT.
Arguments
Type
Intent Optional Attributes
Name
integer,
intent(in)
::
y
integer,
intent(in)
::
m
integer,
intent(in)
::
d
Return Value
real(kind=wp)
Proleptic-Gregorian Julian Day Number (integer, at 00:00 UT).
Fliegel & Van Flandern algorithm.
Arguments
Type
Intent Optional Attributes
Name
integer,
intent(in)
::
y
integer,
intent(in)
::
m
integer,
intent(in)
::
d
Return Value
integer(kind=int64)
Catalog index (1..TIDES_CATALOG_SIZE) of a constituent name,
matched case-insensitively; -1 if unknown.
Arguments
Type
Intent Optional Attributes
Name
character(len=*),
intent(in)
::
name
Return Value
integer
Uppercase the first two characters of a token.
Arguments
Type
Intent Optional Attributes
Name
character(len=*),
intent(in)
::
s
Return Value
character(len=2)
Fold an angle in degrees to the canonical residue [0,360).
(Fortran mod returns the sign of the argument, so a negative
polynomial value needs the +360 canonicalisation.)
Arguments
Type
Intent Optional Attributes
Name
real(kind=wp),
intent(in)
::
x
Return Value
real(kind=wp)
Subroutines
Equilibrium argument V_c (radians) for every catalog
constituent at day number dnum. s,h,p,N are taken in radians
(deg-mod-360 -> rad); the result is left un-modded (cos/sin are
periodic). The ±pi/2 diurnal signs are load-bearing.
Arguments
Type
Intent Optional Attributes
Name
real(kind=wp),
intent(in)
::
dnum
real(kind=wp),
intent(out)
::
v_arg (TIDES_CATALOG_SIZE)
Mean longitudes at day number dnum (Schureman polynomials).
Returned in DEGREES, folded to [0,360). T = dnum/36525 (Julian
centuries, Schureman’s 36525-day century). Multiply by
TIDE_DEG2RAD to get radians for the equilibrium arguments.
Arguments
Type
Intent Optional Attributes
Name
real(kind=wp),
intent(in)
::
dnum
real(kind=wp),
intent(out)
::
s_deg
real(kind=wp),
intent(out)
::
h_deg
real(kind=wp),
intent(out)
::
p_deg
real(kind=wp),
intent(out)
::
n_deg
Nodal amplitude factor f_c(N) (nondim) and phase u_c(N)
(radians), fixed at the nodal reference date’s N.
add_nodal = .false. returns f=1, u=0 for every constituent.
Arguments
Type
Intent Optional Attributes
Name
real(kind=wp),
intent(in)
::
dnum
logical,
intent(in)
::
add_nodal
real(kind=wp),
intent(out)
::
f_nodal (TIDES_CATALOG_SIZE)
real(kind=wp),
intent(out)
::
u_nodal (TIDES_CATALOG_SIZE)
Parse a “YYYY-MM-DD” calendar date. ok = .false. on any
malformed field (caller decides fail-loud policy).
Arguments
Type
Intent Optional Attributes
Name
character(len=*),
intent(in)
::
str
integer,
intent(out)
::
y
integer,
intent(out)
::
m
integer,
intent(out)
::
d
logical,
intent(out)
::
ok