Package edu.sc.seis.TauP
Class SlownessModel
java.lang.Object
edu.sc.seis.TauP.SlownessModel
- All Implemented Interfaces:
Serializable
- Direct Known Subclasses:
SphericalSModel
This class provides storage and methods for generating slowness-depth pairs.
- See Also:
-
Field Summary
FieldsModifier and TypeFieldDescriptionprotected booleanShould we allow J phases, S waves in the inner core? If true, then the slowness sampling for S will use the S velocity structure for the inner core.protected List<CriticalDepth>Stores the layer number for layers in the velocity model with a critical point at their top.static booleanTrue to enable debugging output.static final doubleprotected List<DepthRange>Stores depth ranges that are fluid, ie S velocity is zero.protected List<DepthRange>Stores depth ranges that contains a high slowness zone for P.protected List<DepthRange>Stores depth ranges that contains a high slowness zone for S.protected doubleMaximum difference between successive slowness samples.protected doubleMaximum difference between successive depth samples, default is 115 km.protected doubleprotected doubleMaximum difference between successive ranges, in radians.protected doubleMinimum difference between successive slowness samples.protected List<SlownessLayer>Stores the final slowness-depth layers for P waves.static final booleanJust useful for calling methods that need to know whether to use P or S waves.protected doubleRadius of the Earth in km, usually input from the velocity model.protected List<SlownessLayer>Stores the final slowness-depth layers for S waves.protected doubleTolerance for slownesses.static final booleanJust useful for calling methods that need to know whether to use P or S waves.protected static intInitial length of the slowness vectors.static booleanTrue to enable verbose output.protected VelocityModelVelocity Model used to get slowness model. -
Constructor Summary
ConstructorsConstructorDescriptionSlownessModel(double radiusOfEarth, VelocityModel vMod, List<CriticalDepth> criticalDepth, List<DepthRange> highSlownessLayerDepthsP, List<DepthRange> highSlownessLayerDepthsS, List<DepthRange> fluidLayerDepths, List<SlownessLayer> pLayers, List<SlownessLayer> sLayers, double minDeltaP, double maxDeltaP, double maxDepthInterval, double maxRangeInterval, double maxInterpError, boolean allowInnerCoreS, double slownessTolerance) SlownessModel(VelocityModel vMod, double minDeltaP, double maxDeltaP, double maxDepthInterval, double maxRangeInterval, double maxInterpError, boolean allowInnerCoreS, double slownessTolerance) -
Method Summary
Modifier and TypeMethodDescriptionprotected voidaddSlowness(double p, boolean isPWave) Adds the given ray parameter, p, to the slowness sampling for the given waveType.approxDistance(int slownessTurnLayer, double p, boolean isPWave) generate approximate distance, in radians, for a ray from a surface source that turns at the bottom of the given slowness layer.protected voidCreates a coarse slowness sampling of the velocity model (vMod).protected voidChecks to make sure no slowness layer spans more than maxDepthInterval.booleandepthInFluid(double depth) Determines if the given depth is contained within a fluid zone.booleandepthInFluid(double depth, DepthRange fluidZoneDepth) Determines if the given depth is contained within a fluid zone.booleandepthInHighSlowness(double depth, double rayParam, boolean isPWave) Determines if the given depth and corresponding slowness is contained within a high slowness zone.booleandepthInHighSlowness(double depth, double rayParam, DepthRange highSZoneDepth, boolean isPWave) Determines if the given depth and corresponding slowness is contained within a high slowness zone.protected voidChecks to make sure no slowness layer spans more than maxRangeInterval and that the (estimated) error due to linear interpolation is less than maxInterpError.protected voidFinds all critical points within a velocity model.doublefindDepth(double rayParam, boolean isPWave) Finds a depth corresponding to a slowness over the whole VelocityModel.doublefindDepth(double rayParam, double topDepth, double botDepth, boolean isPWave) Finds a depth corresponding to a slowness between two given depths in the Velocity Model.doublefindDepth(double p, int topCriticalLayer, int botCriticalLayer, boolean isPWave) Finds a depth corresponding to a slowness between two given velocity layers, including the top and the bottom.protected voidResets the slowness layers that correspond to critical points.getAllSlownessLayers(boolean isPWave) final CriticalDepthgetCriticalDepth(int i) getHighSlowness(boolean isPWave) final doublefinal doublefinal doublegets the maximum value of the estimated error due to linear interpolation.final doublefinal doubledoublegetMinRayParam(double depth, boolean isPWave) doublegetMinTurnRayParam(double depth, boolean isPWave) doublegetMinTurnRayParam(double topDepth, double depth, boolean isPWave) final intfinal intgetNumLayers(boolean isPWave) final doublegetSlownessLayer(int layerNum, boolean isPWave) Returns the SlownessLayer of the requested waveType.final doubleabstract doubleinterpolate(double p, double topVelocity, double topDepth, double slope) final booleanlayerAbove(double depth, boolean isPWave) Finds the slowness layer that contains the given depth Note that if the depth is a layer boundary, it returns the shallower of the two or possibly more (since total reflections are zero thickness layers) layers.layerBelow(double depth, boolean isPWave) Finds the slowness layer that contains the given depth Note that if the depth is a layer boundary, it returns the deeper of the two or possibly more (since total reflections are zero thickness layers) layers.intlayerNumberAbove(double depth, boolean isPWave) Finds the index of the slowness layer that contains the given depth Note that if the depth is a layer boundary, it returns the shallower of the two or possibly more (since total reflections are zero thickness layers) layers.intlayerNumberBelow(double depth, boolean isPWave) Finds the index of the slowness layer that contains the given depth Note that if the depth is a layer boundary, it returns the deeper of the two or possibly more (since total reflections are zero thickness layers) layers.intlayerNumForDepth(double depth, boolean isPWave) finds a layer that contains the depth.final TimeDistlayerTimeDist(double rayParam, int layerNum, boolean isPWave) abstract TimeDistlayerTimeDist(double rayParam, int layerNum, boolean isPWave, boolean downgoing) abstract TimeDistlayerTimeDistAllowTurn(double rayParam, int layerNum, boolean isPWave, boolean downgoing) voidprintGMT(PrintWriter dos) prints out the slowness model into a file in a for suitable for plotting with GMT.voidprints out the velocity model into a file in a form suitable for plotting with GMT.protected voidChecks to make sure that no slowness layer spans more than maxDeltaP.voidsetAllowInnerCoreS(boolean allowInnerCoreS) voidsetMaxDeltaP(double maxDeltaP) voidsetMaxDepthInterval(double maxDepthInterval) voidsetMaxInterpError(double maxInterpError) sets the maximum value of the estimated error due to linear interpolation.voidsetMaxRangeInterval(double maxRangeInterval) sets the maximum range interval for surface focus turning waves between slowness samples, input in degrees.voidsetMinDeltaP(double minDeltaP) voidsetRadiusOfEarth(double radiusOfEarth) voidsetSlownessTolerance(double slownessTolerance) splitLayer(double depth, boolean isPWave) protected SlownessLayer[]splitLayerForNewRayParam(double p, boolean isPWave, SlownessLayer sLayer) abstract doubletoSlowness(double velocity, double depth) abstract SlownessLayertoSlownessLayer(VelocityLayer vLayer, boolean isPWave) toString()abstract doubletoVelocity(double slowness, double depth) booleanvalidate()Performs consistency check on the slowness model.boolean
-
Field Details
-
DEBUG
public static boolean DEBUGTrue to enable debugging output. -
verbose
public static boolean verboseTrue to enable verbose output. -
radiusOfEarth
protected double radiusOfEarthRadius of the Earth in km, usually input from the velocity model. -
vMod
Velocity Model used to get slowness model. Usually set in createSlowness(). -
criticalDepths
Stores the layer number for layers in the velocity model with a critical point at their top. These form the "branches" of slowness sampling.- See Also:
-
highSlownessLayerDepthsP
Stores depth ranges that contains a high slowness zone for P. Stored as DepthRange objects, containing the top depth and bottom depth.- See Also:
-
highSlownessLayerDepthsS
Stores depth ranges that contains a high slowness zone for S. Stored as DepthRange objects, containing the top depth and bottom depth.- See Also:
-
fluidLayerDepths
Stores depth ranges that are fluid, ie S velocity is zero. Stored as DepthRange objects, containing the top depth and bottom depth.- See Also:
-
vectorLength
protected static int vectorLengthInitial length of the slowness vectors. -
PLayers
Stores the final slowness-depth layers for P waves. Stored as SlownessLayer objects.- See Also:
-
SLayers
Stores the final slowness-depth layers for S waves. Stored as SlownessLayer objects. Note that SLayers and PLayers share the same SlownessLayer object within fluid layers, so changes made to one will affect the other.- See Also:
-
minDeltaP
protected double minDeltaPMinimum difference between successive slowness samples. The default is 0.1 (km-sec/km or sec/rad for spherical, sec/km for flat models). This keeps the sampling from becoming too fine. For example, a strong negative S velocity gradient just above the CMB will cause the totally reflected ScS too have an extremely large range of distances, over a very small range of ray parameters. The distance check would otherwise force a very fine sampling of this region. However since in this case time and distance are likely to be very close to being linearly related, this sort of sampling is overkill. So we ignore the distance check if the ray parameter becomes smaller than minDeltaP. -
maxDeltaP
protected double maxDeltaPMaximum difference between successive slowness samples. The default is 11.0 (km-sec/km or sec/rad for spherical, sec/km for flat models). See Buland and Chapman p1292 -
maxDepthInterval
protected double maxDepthIntervalMaximum difference between successive depth samples, default is 115 km. See Buland and Chapman p1292 -
maxRangeInterval
protected double maxRangeIntervalMaximum difference between successive ranges, in radians. The default is 200 km / radiusOfEarth. See Buland and Chapman p1292. -
maxInterpError
protected double maxInterpError -
allowInnerCoreS
protected boolean allowInnerCoreSShould we allow J phases, S waves in the inner core? If true, then the slowness sampling for S will use the S velocity structure for the inner core. If false, then we will use the P velocity structure for both the inner and outer core for S waves as well as P waves. Disallowing inner core S phases reduces the number of slowness samples significantly due to the large geometrical spreading of S waves in the inner core. The default is false. -
DEFAULT_SLOWNESS_TOLERANCE
public static final double DEFAULT_SLOWNESS_TOLERANCE- See Also:
-
slownessTolerance
protected double slownessToleranceTolerance for slownesses. If two slownesses are closer that this value, then we consider them to be identical. Basically this just provides some protection against numerical "chatter". -
PWAVE
public static final boolean PWAVEJust useful for calling methods that need to know whether to use P or S waves.- See Also:
-
SWAVE
public static final boolean SWAVEJust useful for calling methods that need to know whether to use P or S waves.- See Also:
-
-
Constructor Details
-
SlownessModel
public SlownessModel(VelocityModel vMod, double minDeltaP, double maxDeltaP, double maxDepthInterval, double maxRangeInterval, double maxInterpError, boolean allowInnerCoreS, double slownessTolerance) throws NoSuchLayerException, SlownessModelException -
SlownessModel
public SlownessModel(double radiusOfEarth, VelocityModel vMod, List<CriticalDepth> criticalDepth, List<DepthRange> highSlownessLayerDepthsP, List<DepthRange> highSlownessLayerDepthsS, List<DepthRange> fluidLayerDepths, List<SlownessLayer> pLayers, List<SlownessLayer> sLayers, double minDeltaP, double maxDeltaP, double maxDepthInterval, double maxRangeInterval, double maxInterpError, boolean allowInnerCoreS, double slownessTolerance)
-
-
Method Details
-
setRadiusOfEarth
public void setRadiusOfEarth(double radiusOfEarth) -
setMinDeltaP
public void setMinDeltaP(double minDeltaP) -
setMaxDeltaP
public void setMaxDeltaP(double maxDeltaP) -
setMaxDepthInterval
public void setMaxDepthInterval(double maxDepthInterval) -
setMaxRangeInterval
public void setMaxRangeInterval(double maxRangeInterval) sets the maximum range interval for surface focus turning waves between slowness samples, input in degrees. -
setMaxInterpError
public void setMaxInterpError(double maxInterpError) sets the maximum value of the estimated error due to linear interpolation. Care should be taken not to set this too small as a very large number of samples may be required. Note also that this is only an estimate of the error, and thus the bound is by no means assured. -
setAllowInnerCoreS
public void setAllowInnerCoreS(boolean allowInnerCoreS) -
setSlownessTolerance
public void setSlownessTolerance(double slownessTolerance) -
getVelocityModel
-
getRadiusOfEarth
public final double getRadiusOfEarth() -
getMinDeltaP
public final double getMinDeltaP() -
getMaxDeltaP
public final double getMaxDeltaP() -
getMaxDepthInterval
public final double getMaxDepthInterval() -
getMaxRangeInterval
public final double getMaxRangeInterval()- Returns:
- the maximum range interval for surface focus turning waves between slowness samples output in degrees.
-
getMaxInterpError
public final double getMaxInterpError()gets the maximum value of the estimated error due to linear interpolation. Care should be taken not to set this too small as a very large number of samples may be required. Note also that this is only an estimate of the error, and thus the bound is by no means assured. -
isAllowInnerCoreS
public final boolean isAllowInnerCoreS() -
getSlownessTolerance
public final double getSlownessTolerance() -
getNumCriticalDepths
public final int getNumCriticalDepths() -
getCriticalDepth
-
getNumLayers
public final int getNumLayers(boolean isPWave) -
getMinTurnRayParam
public double getMinTurnRayParam(double depth, boolean isPWave) throws NoSuchLayerException, SlownessModelException - Returns:
- the minimum ray parameter that turns, but is not reflected, at or above the given depth. Normally this is the slowness sample at the given depth, but if the depth is within a high slowness zone, then it may be smaller.
- Throws:
NoSuchLayerExceptionSlownessModelException
-
getMinTurnRayParam
public double getMinTurnRayParam(double topDepth, double depth, boolean isPWave) throws NoSuchLayerException, SlownessModelException -
getMinRayParam
public double getMinRayParam(double depth, boolean isPWave) throws NoSuchLayerException, SlownessModelException - Returns:
- the minimum ray parameter that turns or is critically reflected at or above the given depth. Normally this is the slowness sample at the given depth, but if the depth is within a high slowness zone, then it may be smaller. Also, at first order discontinuities, there may be many slowness samples at the same depth.
- Throws:
NoSuchLayerExceptionSlownessModelException
-
getHighSlowness
- Returns:
- the DepthRange objects for all high slowness zones within the slowness model.
-
getSlownessLayer
Returns the SlownessLayer of the requested waveType. This is NOT a clone and any changes will possibly corrupt the SlownessModel. -
getAllSlownessLayers
-
toSlowness
- Throws:
SlownessModelException
-
toVelocity
- Throws:
SlownessModelException
-
layerTimeDist
public final TimeDist layerTimeDist(double rayParam, int layerNum, boolean isPWave) throws SlownessModelException - Throws:
SlownessModelException
-
layerTimeDist
public abstract TimeDist layerTimeDist(double rayParam, int layerNum, boolean isPWave, boolean downgoing) throws SlownessModelException - Throws:
SlownessModelException
-
layerTimeDistAllowTurn
public abstract TimeDist layerTimeDistAllowTurn(double rayParam, int layerNum, boolean isPWave, boolean downgoing) throws SlownessModelException - Throws:
SlownessModelException
-
toSlownessLayer
public abstract SlownessLayer toSlownessLayer(VelocityLayer vLayer, boolean isPWave) throws SlownessModelException - Throws:
SlownessModelException
-
interpolate
public abstract double interpolate(double p, double topVelocity, double topDepth, double slope) throws SlownessModelException - Throws:
SlownessModelException
-
approxDistance
public TimeDist approxDistance(int slownessTurnLayer, double p, boolean isPWave) throws SlownessModelException generate approximate distance, in radians, for a ray from a surface source that turns at the bottom of the given slowness layer.- Throws:
SlownessModelException- occurs if getNumLayers() == 0 as we cannot compute a distance without a layer.
-
depthInHighSlowness
public boolean depthInHighSlowness(double depth, double rayParam, boolean isPWave) Determines if the given depth and corresponding slowness is contained within a high slowness zone. Whether the high slowness zone includes its upper boundary and its lower boundaries depends upon the ray parameter. The slowness at the depth is needed because if depth happens to correspond to a discontinuity that marks the bottom of the high slowness zone but the ray is actually a total reflection then it is not part of the high slowness zone. Calls depthInHighSlowness(double, double, DepthRange). -
depthInHighSlowness
public boolean depthInHighSlowness(double depth, double rayParam, DepthRange highSZoneDepth, boolean isPWave) Determines if the given depth and corresponding slowness is contained within a high slowness zone. Whether the high slowness zone includes its upper boundary and its lower boundaries depends upon the ray parameter. The slowness at the depth is needed because if depth happens to correspond to a discontinuity that marks the bottom of the high slowness zone but the ray is actually a total reflection then it is not part of the high slowness zone. The ray parameter that delimits the zone, ie it can turn at the top and the bottom, is in the zone at the top, but out of the zone at the bottom. -
depthInFluid
public boolean depthInFluid(double depth) Determines if the given depth is contained within a fluid zone. The fluid zone includes its upper boundary but not its lower boundary. Calls depthInFluid(double, DepthRange).- See Also:
-
depthInFluid
Determines if the given depth is contained within a fluid zone. The fluid zone includes its upper boundary but not its lower boundary. The top and bottom of the fluid zone are returned in DepthRange. -
splitLayer
public SplitLayerInfo splitLayer(double depth, boolean isPWave) throws SlownessModelException, NoSuchLayerException -
findCriticalPoints
Finds all critical points within a velocity model. Critical points are first order discontinuities in velocity/slowness, local extrema in slowness. A high slowness zone is a low velocity zone, but it is possible to have a slight low velocity zone within a spherical earth that is not a high slowness zone and thus does not exhibit any of the pathological behavior of a low velocity zone.- Throws:
SlownessModelException- occurs if validate() returns false, this indicates a bug in the code.
-
findDepth
Finds a depth corresponding to a slowness over the whole VelocityModel. Calls findDepth(double, int, int, char).- Throws:
SlownessModelException
-
findDepth
public double findDepth(double rayParam, double topDepth, double botDepth, boolean isPWave) throws SlownessModelException Finds a depth corresponding to a slowness between two given depths in the Velocity Model. Calls findDepth(double, int, int, char).- Throws:
SlownessModelException
-
findDepth
public double findDepth(double p, int topCriticalLayer, int botCriticalLayer, boolean isPWave) throws SlownessModelException Finds a depth corresponding to a slowness between two given velocity layers, including the top and the bottom. We also check to see if the slowness is less than the bottom slowness of these layers but greater than the top slowness of the next deeper layer. This corresponds to a total reflection. In this case a check needs to be made to see if this is an S wave reflecting off of a fluid layer, use P velocity below in this case. We assume that slowness is monotonic within these layers and therefore there is only one depth with the given slowness. This means we return the first depth that we find.- Throws:
SlownessModelException- occurs if topCriticalLayer > botCriticalLayer because there are no layers to search, or if there is an increase in slowness, ie a negative velocity gradient, that just balances the decrease in slowness due to the spherical earth, or if the ray parameter p is not contained within the specified layer range.
-
coarseSample
Creates a coarse slowness sampling of the velocity model (vMod). The resultant slowness layers will satisfy the maximum depth increments as well as sampling each point specified within the VelocityModel. The P and S sampling will also be compatible. -
rayParamIncCheck
Checks to make sure that no slowness layer spans more than maxDeltaP. -
depthIncCheck
Checks to make sure no slowness layer spans more than maxDepthInterval. -
distanceCheck
Checks to make sure no slowness layer spans more than maxRangeInterval and that the (estimated) error due to linear interpolation is less than maxInterpError. -
addSlowness
protected void addSlowness(double p, boolean isPWave) throws SlownessModelException, NoSuchLayerException Adds the given ray parameter, p, to the slowness sampling for the given waveType. It splits slowness layers as needed and keeps P and S sampling consistant within fluid layers. Note, this makes use of the velocity model, so all interpolation is linear in velocity, not in slowness! -
splitLayerForNewRayParam
protected SlownessLayer[] splitLayerForNewRayParam(double p, boolean isPWave, SlownessLayer sLayer) throws SlownessModelException, NoSuchLayerException -
fixCriticalPoints
Resets the slowness layers that correspond to critical points.- Throws:
NoSuchLayerException
-
layerNumForDepth
finds a layer that contains the depth. This may not be unique in the case of a depth on a boundary in the velocity model due to zero thickness layers. If the uppermost or lowermost layer containing the depth is needed, use layerNumberAbove() or layerNumberBelow().- Throws:
NoSuchLayerException
-
layerNumberAbove
Finds the index of the slowness layer that contains the given depth Note that if the depth is a layer boundary, it returns the shallower of the two or possibly more (since total reflections are zero thickness layers) layers.- Returns:
- the layer number.
- Throws:
NoSuchLayerException- occurs if no layer in the slowness model contains the given depth.
-
layerAbove
Finds the slowness layer that contains the given depth Note that if the depth is a layer boundary, it returns the shallower of the two or possibly more (since total reflections are zero thickness layers) layers.- Returns:
- the layer
- Throws:
NoSuchLayerException- occurs if no layer in the slowness model contains the given depth.
-
layerNumberBelow
Finds the index of the slowness layer that contains the given depth Note that if the depth is a layer boundary, it returns the deeper of the two or possibly more (since total reflections are zero thickness layers) layers.- Returns:
- the layer number.
- Throws:
NoSuchLayerException- occurs if no layer in the slowness model contains the given depth.
-
layerBelow
Finds the slowness layer that contains the given depth Note that if the depth is a layer boundary, it returns the deeper of the two or possibly more (since total reflections are zero thickness layers) layers.- Returns:
- the layer
- Throws:
NoSuchLayerException- occurs if no layer in the slowness model contains the given depth.
-
printGMT
prints out the velocity model into a file in a form suitable for plotting with GMT.- Throws:
IOException
-
printGMT
prints out the slowness model into a file in a for suitable for plotting with GMT. -
validate
Performs consistency check on the slowness model.- Returns:
- true if successful, throws SlownessModelException otherwise.
- Throws:
SlownessModelException- if any check fails
-
toString
-
validateRPCompatibility
public boolean validateRPCompatibility()
-