Class VelocityModel

java.lang.Object
edu.sc.seis.TauP.VelocityModel
All Implemented Interfaces:
Serializable, Cloneable

public class VelocityModel extends Object implements Cloneable, Serializable
This class defines basic classes to store and manipulate a velocity model.
See Also:
  • Field Details

    • ND

      public static final String ND
      See Also:
    • TVEL

      public static final String TVEL
      See Also:
    • JSON

      public static final String JSON
      See Also:
    • modelName

      protected String modelName
      name of the velocity model.
    • radiusOfEarth

      protected double radiusOfEarth
      reference radius (km), usually radius of the earth, by default 6371 kilometers.
    • namedDiscon

      public List<NamedVelocityDiscon> namedDiscon
    • DEFAULT_MOHO

      public static final double DEFAULT_MOHO
      See Also:
    • DEFAULT_CMB

      public static final double DEFAULT_CMB
      See Also:
    • DEFAULT_IOCB

      public static final double DEFAULT_IOCB
      See Also:
    • mohoDepth

      protected double mohoDepth
      Depth (km) of the moho. It can be input from velocity model (*.nd) or should be explicitly set. By default it is 35 kilometers (from Iasp91). For phase naming, the tau model will choose the closest 1st order discontinuity. Thus for most simple earth models these values are satisfactory. Take proper care if your model has a thicker crust and a discontinuity near 35 km depth.
    • cmbDepth

      protected double cmbDepth
      Depth (km) of the cmb (core mantle boundary). It can be input from velocity model (*.nd) or should be explicitly set. By default it is 2889 kilometers (from Iasp91). For phase naming, the tau model will choose the closest 1st order discontinuity. Thus for most simple earth models these values are satisfactory.
    • iocbDepth

      protected double iocbDepth
      Depth (km) of the iocb (inner core outer core boundary). It can be input from velocity model (*.nd) or should be explicitly set. By default it is 5153.9 kilometers (from Iasp91). For phase naming, the tau model will choose the closest 1st order discontinuity. Thus for most simple earth models these values are satisfactory.
    • minRadius

      protected double minRadius
      minimum radius of the model (km), default 0.0
    • maxRadius

      protected double maxRadius
      maximum radius of the model (km), default 6371.0
    • spherical

      protected boolean spherical
      is this a spherical model? Default is true.
    • vectorLength

      protected static int vectorLength
      the initial length of the layer vector.
    • layer

      protected List<VelocityLayer> layer
      expandable array to hold the layers
  • Constructor Details

    • VelocityModel

      public VelocityModel(String modelName, double radiusOfEarth, double mohoDepth, double cmbDepth, double iocbDepth, double minRadius, double maxRadius, boolean spherical, List<VelocityLayer> layer)
    • VelocityModel

      public VelocityModel(String modelName, double radiusOfEarth, List<NamedVelocityDiscon> namedDiscons, double minRadius, double maxRadius, boolean spherical, List<VelocityLayer> layer)
  • Method Details

    • getModelName

      public String getModelName()
      get the model name.
    • setModelName

      public void setModelName(String modelName)
      set the model name.
    • setRadiusOfEarth

      public void setRadiusOfEarth(double radiusOfEarth)
      sets radius of the earth (km), by default 6371 kilometers.
    • getRadiusOfEarth

      public double getRadiusOfEarth()
      gets radius of the earth (km), by default 6371 kilometers.
    • getRadiusOfEarthMeters

      public double getRadiusOfEarthMeters()
      gets radius of the earth (m), by default 6371000 meters.
    • sphericalGeodesic

      public net.sf.geographiclib.Geodesic sphericalGeodesic()
      Create a spherical geodesic with radius of the model and zero flattenning.
      Returns:
      geodesic of correct radius.
    • getSphericalDistCalc

      public DistanceCalcSpherical getSphericalDistCalc()
    • isDisconDepth

      public boolean isDisconDepth(double depth)
    • getNamedDiscons

      public List<NamedVelocityDiscon> getNamedDiscons()
    • getNamedDisconForDepth

      public NamedVelocityDiscon getNamedDisconForDepth(double depth)
    • isNamedDisconDepth

      public boolean isNamedDisconDepth(double depth)
    • getDisconDepths

      public double[] getDisconDepths()
      Returns:
      the depths of discontinuities within the velocity model
    • getMohoDepth

      public double getMohoDepth()
      Returns:
      depth (km) of the moho. It can be input from velocity model (*.nd) or should be explicitly set. By default it is 35 kilometers (from Iasp91). For phase naming, the tau model will choose the closest 1st order discontinuity. Thus for most simple earth models these values are satisfactory. Take proper care if your model has a thicker crust and a discontinuity near 35 km depth.
    • setMohoDepth

      public void setMohoDepth(double mohoDepth)
    • getCmbDepth

      public double getCmbDepth()
      Returns:
      depth (km) of the cmb (core mantle boundary). It can be input from velocity model (*.nd) or should be explicitly set. By default it is 2889 kilometers (from Iasp91). For phase naming, the tau model will choose the closest 1st order discontinuity. Thus for most simple earth models these values are satisfactory.
    • setCmbDepth

      public void setCmbDepth(double cmbDepth)
    • getIocbDepth

      public double getIocbDepth()
      Returns:
      the depth (km) of the iocb (inner core outer core boundary). It can be input from velocity model (*.nd) or should be explicitly set. By default it is 5153.9 kilometers (from Iasp91). For phase naming, the tau model will choose the closest 1st order discontinuity. Thus for most simple earth models these values are satisfactory.
    • setIocbDepth

      public void setIocbDepth(double iocbDepth)
    • getMinRadius

      public double getMinRadius()
    • setMinRadius

      public void setMinRadius(double minRadius)
    • getMaxRadius

      public double getMaxRadius()
    • setMaxRadius

      public void setMaxRadius(double maxRadius)
    • getSpherical

      public boolean getSpherical()
    • setSpherical

      public void setSpherical(boolean spherical)
    • densityIsDefault

      public boolean densityIsDefault()
    • QIsDefault

      public boolean QIsDefault()
    • getVelocityLayerClone

      public VelocityLayer getVelocityLayerClone(int layerNum)
    • getVelocityLayer

      public VelocityLayer getVelocityLayer(int layerNum)
    • getNumLayers

      public int getNumLayers()
      Returns the number of layers in this velocity model.
    • getLayers

      public VelocityLayer[] getLayers()
    • layerNumberAbove

      public int layerNumberAbove(double depth) throws NoSuchLayerException
      Finds the layer containing the given depth. Note this returns the upper layer if the depth happens to be at a layer boundary.
      Returns:
      the layer number
      Throws:
      NoSuchLayerException - occurs if no layer contains the given depth.
    • layerNumberBelow

      public int layerNumberBelow(double depth) throws NoSuchLayerException
      Finds the layer containing the given depth. Note this returns the lower layer if the depth happens to be at a layer boundary.
      Returns:
      the layer number
      Throws:
      NoSuchLayerException - occurs if no layer contains the given depth.
    • evaluateAbove

      public double evaluateAbove(double depth, VelocityModelMaterial materialProperty) throws NoSuchLayerException
      returns the value of the given material property, usually P or S velocity, at the given depth. Note this returns the value at the bottom of the upper layer if the depth happens to be at a layer boundary.
      Returns:
      the value of the given material property
      Throws:
      NoSuchLayerException - occurs if no layer contains the given depth.
    • evaluateBelow

      public double evaluateBelow(double depth, VelocityModelMaterial materialProperty) throws NoSuchLayerException
      returns the value of the given material property, usually P or S velocity, at the given depth. Note this returns the value at the top of the lower layer if the depth happens to be at a layer boundary.
      Returns:
      the value of the given material property
      Throws:
      NoSuchLayerException - occurs if no layer contains the given depth.
    • evaluateAtTop

      public double evaluateAtTop(int layerNumber, VelocityModelMaterial materialProperty)
      returns the value of the given material property, usually P or S velocity, at the top of the given layer.
      Returns:
      the value of the given material property occurs if the material property is not recognized.
    • evaluateAtBottom

      public double evaluateAtBottom(int layerNumber, VelocityModelMaterial materialProperty)
      returns the value of the given material property, usually P or S velocity, at the bottom of the given layer.
      Returns:
      the value of the given material property
    • depthAtTop

      public double depthAtTop(int layerNumber)
      returns the depth at the top of the given layer.
      Returns:
      the depth.
    • depthAtBottom

      public double depthAtBottom(int layerNumber)
      returns the depth at the bottom of the given layer.
      Returns:
      the depth. occurs if the material property is not recognized.
    • replaceLayers

      public VelocityModel replaceLayers(VelocityLayer[] newLayers, String name, boolean smoothTop, boolean smoothBot) throws VelocityModelException
      Throws:
      VelocityModelException
    • elevationLayer

      public VelocityModel elevationLayer(float elevationMeters, String name) throws VelocityModelException
      Throws:
      VelocityModelException
    • printGMT

      public void printGMT(String filename) throws IOException
      prints out the velocity model into a file in a form suitable for plotting with GMT.
      Throws:
      IOException
    • printGMT

      public void printGMT(PrintWriter dos)
      prints out the velocity model into a file in a for suitable for plotting with GMT.
    • validate

      public boolean validate()
      Performs internal consistency checks on the velocity model.
    • toString

      public String toString()
      Overrides:
      toString in class Object
    • writeToND

      public void writeToND(Writer out) throws IOException
      Throws:
      IOException
    • print

      public void print()
    • getModelNameFromFileName

      public static String getModelNameFromFileName(String filename)
    • readVelocityFile

      public static VelocityModel readVelocityFile(String filename, String fileType) throws IOException, VelocityModelException
      Reads in a velocity file. The type of file is determined by the fileType var. Calls readTVelFile or readNDFile.
      Throws:
      VelocityModelException - if the type of file cannot be determined.
      IOException
    • readTVelFile

      public static VelocityModel readTVelFile(File file) throws IOException, VelocityModelException
      This method reads in a velocity model from a "tvel" ASCII text file. The name of the model file for model "modelname" should be "modelname.tvel". The format of the file is: comment line - generally info about the P velocity model comment line - generally info about the S velocity model depth pVel sVel Density depth pVel sVel Density . . . The velocities are assumed to be linear between sample points. Because this type of model file doesn't give complete information we make the following assumptions: modelname - from the filename, with ".tvel" dropped if present radiusOfEarth - the largest depth in the model meanDensity - 5517.0 G - 6.67e-11 Also, because this method makes use of the string tokenizer, comments are allowed. # as well as // signify that the rest of the line is a comment. C style slash-star comments are also allowed.
      Throws:
      VelocityModelException - occurs if an EOL should have been read but wasn't. This may indicate a poorly formatted tvel file.
      IOException
    • readTVelFile

      public static VelocityModel readTVelFile(Reader in, String modelName) throws IOException, VelocityModelException
      Throws:
      IOException
      VelocityModelException
    • readNDFile

      public static VelocityModel readNDFile(File file) throws IOException, VelocityModelException
      This method reads in a velocity model from a "nd" ASCII text file, the format used by Xgbm. The name of the model file for model "modelname" should be "modelname.nd". The format of the file is: depth pVel sVel Density Qp Qs depth pVel sVel Density Qp Qs . . . with each major boundary separated with a line with "mantle", "outer-core" or "inner-core". "moho", "cmb" and "icocb" are allowed as synonyms respectively. This feature makes phase interpretation much easier to code. Also, as they are not needed for travel time calculations, the density, Qp and Qs may be omitted.

      The velocities are assumed to be linear between sample points. Because this type of model file doesn't give complete information we make the following assumptions:

      modelname - from the filename, with ".nd" dropped, if present

      radiusOfEarth - the largest depth in the model

      Also, because this method makes use of the string tokenizer, comments are allowed. # as well as // signify that the rest of the line is a comment. C style slash-star comments are also allowed.

      Throws:
      VelocityModelException - occurs if an EOL should have been read but wasn't. This may indicate a poorly formatted model file.
      IOException
    • readNDFile

      public static VelocityModel readNDFile(Reader in, String modelName) throws IOException, VelocityModelException
      Throws:
      IOException
      VelocityModelException
    • fixDisconDepths

      public boolean fixDisconDepths() throws VelocityModelException
      resets depths of major discontinuities to match those existing in the input velocity model. The initial values are set such that if there is no discontinuity within the top 65 km then the moho is set to 0.0. Similarly, if there are no discontinuities at all then the cmb is set to the radius of the earth. Similarly for the iocb, except it must be a fluid to solid boundary and deeper than 100km to avoid problems with shallower fluid layers, eg oceans. Generally this is only needed for the .tvel model format as it does not have a means to name discontinuities.
      Throws:
      VelocityModelException
    • earthFlattenTransform

      public VelocityModel earthFlattenTransform()
      Returns a flat velocity model object equivalent to the spherical velocity model via the earth flattening transform.
      Returns:
      the flattened VelocityModel object.
    • calcReflTransCoefFreeSurface

      public ReflTrans calcReflTransCoefFreeSurface() throws VelocityModelException
      Throws:
      VelocityModelException
    • calcReflTransCoef

      public ReflTrans calcReflTransCoef(double depth, boolean downgoing) throws VelocityModelException
      Throws:
      VelocityModelException
    • calcReflTransCoef

      public static ReflTrans calcReflTransCoef(double abovePVel, double aboveSVel, double aboveRho, double belowPVel, double belowSVel, double belowRho) throws VelocityModelException
      Throws:
      VelocityModelException
    • calcReflTransCoef

      public static ReflTrans calcReflTransCoef(double abovePVel, double aboveSVel, double aboveRho, double belowPVel, double belowSVel, double belowRho, boolean downgoing) throws VelocityModelException
      Throws:
      VelocityModelException