reflection_model | ( | wave_queue & | wave | ) | [inline, private] |
Hide default constructor to prohibit use by non-friends.
virtual ~reflection_model | ( | ) | [inline, private, virtual] |
bool bottom_reflection | ( | size_t | de, | |
size_t | 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:
where:
The direction of the reflected ray is given by the vector equation:
where:
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 when this becomes a problem.
For near-miss instances, please refer to the section on MIN_REFLECT.
de | D/E angle index number of reflected ray. | |
az | AZ angle index number of reflected ray. | |
depth | Depth that ray has penetrated into the bottom. |
void collision_location | ( | size_t | de, | |
size_t | az, | |||
double | dtime, | |||
wposition1 * | position, | |||
wvector1 * | ndirection, | |||
double * | speed | |||
) | const [private] |
Computes a refined location and direction at the point of collision.
Uses a second order Taylor series around the current location to estimate these values.
de | D/E angle index number. | |
az | AZ angle index number. | |
dtime | The distance (in time) from the "current" wavefront to the boundary collision. | |
position | Refined position of the reflection (output). | |
ndirection | Normalized direction at the point of reflection (output). | |
speed | Speed of sound at the point of reflection (output). |
void reflection_copy | ( | wave_front * | element, | |
size_t | de, | |||
size_t | az, | |||
wave_front & | results | |||
) | [static, private] |
Copy new wave element data into the destination wavefront.
Used by reflection_reinit() to change the direction of one ray in the wavefront.
element | Destination for new information. | |
de | D/E angle index number of reflected ray. | |
az | AZ angle index number of reflected ray. | |
results | Wave element data with new information. |
void reflection_reinit | ( | size_t | de, | |
size_t | 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.
de | D/E angle index number of reflected ray. | |
az | AZ angle index number of reflected ray. | |
dtime | The distance (in time) from the "current" wavefront to the boundary collision. | |
position | Position of the reflection. | |
direction | Direction (un-normalized) after reflection. | |
speed | Speed of sound at the point of reflection. |
bool surface_reflection | ( | size_t | de, | |
size_t | 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:
where:
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.
de | D/E angle index number of reflected ray. | |
az | AZ angle index number of reflected ray. |
friend class wave_queue [friend] |
wave_queue& _wave [private] |
Wavefront object associated with this model.
const double MIN_REFLECT = 6.0 [static, private] |
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).