rdb_ocean_tide_astro Module

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).


Uses

  • 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

Used by

  • 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

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

public pure function days_since_1900(y, m, d) result(dnum)

Days since the astronomical origin 1900-01-01 00:00 UT.

Arguments

Type IntentOptional Attributes Name
integer, intent(in) :: y
integer, intent(in) :: m
integer, intent(in) :: d

Return Value real(kind=wp)

public pure function gregorian_day_number(y, m, d) result(jdn)

Proleptic-Gregorian Julian Day Number (integer, at 00:00 UT). Fliegel & Van Flandern algorithm.

Arguments

Type IntentOptional Attributes Name
integer, intent(in) :: y
integer, intent(in) :: m
integer, intent(in) :: d

Return Value integer(kind=int64)

public pure function tide_name_index(name) result(idx)

Catalog index (1..TIDES_CATALOG_SIZE) of a constituent name, matched case-insensitively; -1 if unknown.

Arguments

Type IntentOptional Attributes Name
character(len=*), intent(in) :: name

Return Value integer

private pure function upcase2(s) result(u)

Uppercase the first two characters of a token.

Arguments

Type IntentOptional Attributes Name
character(len=*), intent(in) :: s

Return Value character(len=2)

private pure function wrap360(x) result(y)

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 IntentOptional Attributes Name
real(kind=wp), intent(in) :: x

Return Value real(kind=wp)


Subroutines

public pure subroutine equilibrium_arguments(dnum, v_arg)

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 IntentOptional Attributes Name
real(kind=wp), intent(in) :: dnum
real(kind=wp), intent(out) :: v_arg(TIDES_CATALOG_SIZE)

public pure subroutine mean_longitudes(dnum, s_deg, h_deg, p_deg, n_deg)

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 IntentOptional 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

public pure subroutine nodal_fu(dnum, add_nodal, f_nodal, u_nodal)

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 IntentOptional 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)

public pure subroutine parse_date_string(str, y, m, d, ok)

Parse a “YYYY-MM-DD” calendar date. ok = .false. on any malformed field (caller decides fail-loud policy).

Arguments

Type IntentOptional Attributes Name
character(len=*), intent(in) :: str
integer, intent(out) :: y
integer, intent(out) :: m
integer, intent(out) :: d
logical, intent(out) :: ok