USML
reflection_model Class Reference
Collaboration diagram for reflection_model:

Constructor & Destructor Documentation

reflection_model ( wave_queue wave)
inlineprivate

Hide default constructor to prohibit use by non-friends.

Member Function Documentation

bool bottom_reflection ( unsigned  de,
unsigned  az,
double  depth 
)
private

Reflect a single acoustic ray from the ocean bottom.

Computes boundary reflection loss and re-initializes the direction of the ray. Adds reflection attenuation and phase to existing values.

The distance (in time) from the "current" wavefront to the boundary collision is given by:

\[ \Delta\tau_{collision} = h \frac{ \hat{r} \bullet \hat{n} } { \frac{d\vec{r}}{d\tau} \bullet \hat{n} } \]

where:

  • h = height above bottom at "current" wavefront
  • $ \vec{r} $ = position in spherical earth coords
  • $ \hat{r} $ = position normal in spherical earth coords
  • $ \hat{n} $ = surface normal
  • $ \Delta\tau_{collision} $ = time step needed for collision

The direction of the reflected ray is given by the vector equation:

\[ \hat{R} = \hat{I} - 2 (\hat{I} \bullet \hat{n}) \hat{n} \]

where:

  • $ \hat{n} $ = surface normal
  • $ \hat{I} $ = incident direction in spherical earth coords
  • $ \hat{R} $ = reflected direction in spherical earth coords

Note that small errors in the surface normal have a large effect when the ray path is nearly parallel to the ocean floor. If the reflection does not point the ray back-into the water column, the next time step will include an erroneous reflection in which both the current and next location are below the bottom. This implement uses the height differential between the current and next rays to refine the dot product $ \frac{d\vec{r}}{d\tau} \bullet \hat{n} $ when this becomes a problem.

For near-miss instances, please refer to the section on MIN_REFLECT.

Parameters
deD/E angle index number of reflected ray.
azAZ angle index number of reflected ray.
depthDepth that ray has penetrated into the bottom.
Returns
True for an actual reflection, False for a near-miss.
void collision_location ( unsigned  de,
unsigned  az,
double  dtime,
wposition1 position,
wvector1 ndirection,
double *  speed 
) const
private

Computes a refined location and direction at the point of collision.

Compute the precise location and direction at the point of collision.

Uses a second order Taylor series around the current location to estimate these values.

Parameters
deD/E angle index number.
azAZ angle index number.
dtimeThe distance (in time) from the "current" wavefront to the boundary collision.
positionRefined position of the reflection (output).
ndirectionNormalized direction at the point of reflection (output).
speedSpeed of sound at the point of reflection (output).
void reflection_copy ( wave_front element,
unsigned  de,
unsigned  az,
wave_front results 
)
staticprivate

Copy new wave element data into the destination wavefront.

Used by reflection_reinit() to change the direction of one ray in the wavefront.

Parameters
elementDestination for new information.
deD/E angle index number of reflected ray.
azAZ angle index number of reflected ray.
resultsWave element data with new information.
void reflection_reinit ( unsigned  de,
unsigned  az,
double  dtime,
const wposition1 position,
const wvector1 direction,
double  speed 
)
private

Re-initialize an individual ray after reflection.

Uses the position and reflected direction to initialize a temporary 1x1 wavefront. Then, the position and direction of the 1x1 wavefront are copied into the reflected ray.

Parameters
deD/E angle index number of reflected ray.
azAZ angle index number of reflected ray.
dtimeThe distance (in time) from the "current" wavefront to the boundary collision.
positionPosition of the reflection.
directionDirection (un-normalized) after reflection.
speedSpeed of sound at the point of reflection.
bool surface_reflection ( unsigned  de,
unsigned  az 
)
private

Reflect a single acoustic ray from the ocean surface.

Computes boundary reflection loss and re-initializes the direction of the ray. Adds reflection attenuation and phase to existing values.

Because the ocean surface has fixed normal, the generic collision equations (used by the bottom_reflection() method) can be simplified into the form:

\[ \Delta\tau_{collision} = \frac{ h }{ \frac{dr}{d\tau} } \]

\[ R_{\rho} = - I_{\rho}, R_{\theta} = I_{\theta}, R_{\phi} = I_{\phi} \]

where:

  • h = distance from current ray to ocean surface
  • r = radial component of position in spherical earth coords
  • $ \Delta\tau_{collision} $ = time step needed for collision
  • $ \hat{I} $ = incident direction in spherical earth coords
  • $ \hat{R} $ = reflected direction in spherical earth coords

The direction of the reflected ray is computed by taking the negative of the radial component.

This routine exits without producing a reflection if this calculation indicates that a near-miss has occurred. A near-miss is defined as the case where the grazing angle is zero or negative. In a near-miss, the ray is already heading back into the water column without the help of a reflection.

Parameters
deD/E angle index number of reflected ray.
azAZ angle index number of reflected ray.
Returns
True for an actual reflection, False for a near-miss.

Friends And Related Function Documentation

friend class wave_queue
friend

Member Data Documentation

reverb_model* _bottom_reverb
private

Callback model for bottom reverberation.

reverb_model* _surface_reverb
private

Callback model for surface reverberation.

wave_queue& _wave
private

Wavefront object associated with this model.

const double MIN_REFLECT = 6.0
staticprivate

The assumption that the surface normal is constant across the time step breaks down when the incident ray is nearly parallel to the bottom.

Establishing a minimize grazing angle prevents the model from becoming unstable under these conditions.

The minimum grazing angle is asin( MIN_REFLECT / c ) where c is the speed of sound. A value where MIN_REFLECT=6.0 results in a minimum grazing angle of about 0.23 degrees. We assume that this value is much lower than the uncertainty in the gridded bathymetry slope.

const double TOO_SHALLOW
private

If the water is too shallow, bottom_reflection() uses a horizontal normal to simulate reflection from "dry land".

Without this, the propagation could wander into a region where the ocean bottom was above the surface and all propagation elements evaluated to NaN. This approximation has very little practical effect because the rays should already be very weak, due to multiple bottom interactions, by the time they reach the beach.

It is automatically set to a value that is 300 times the time step of the wavefront. This value 1/5 the length of a typical time step (1500*dt).

Todo:
Are we happy with this definition of "too shallow"?