All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines
Public Member Functions
QGpCompatibility::CompatDispersionData Class Reference

#include <CompatDispersionData.h>

Inheritance diagram for QGpCompatibility::CompatDispersionData:
QGpCompatibility::CompatDispersion QGpCompatibility::CompatMultiModalData QGpCompatibility::CompatMultiModalCurves QGpCompatibility::CompatMultiModalFrequency

List of all members.

Public Member Functions

double closestModeMisfit (bool strictModeJumping, FILE *flog)
 CompatDispersionData ()
 default constructor
 CompatDispersionData (int modesCount, int omegasCount)
 Allocates an empty structure.
 CompatDispersionData (const CompatDispersionData *o, int modesCount)
 Allocates an empty structure based on an existing one with another number of modes.
 CompatDispersionData (const CompatMultiModalCurves *o)
 Set the values o as the measurements.
void convertStddev ()
 Export in a file readable by Herrmann SURF.
ModalCurve curve (int iMode)
QVector< double > * groupSlowness (int iMode)
double maxDataFrequency ()
double minDataFrequency ()
double misfit (int iMin, int iMax, FILE *flog)
double misfit (FILE *flog)
 Calculate the Root Mean Square for the current calculated dispersion curve.
void valuesToData ()
void valuesToData (CompatMultiModalCurves *o)

Constructor & Destructor Documentation

default constructor

QGpCompatibility::CompatDispersionData::CompatDispersionData ( int  modesCount,
int  omegasCount 
) [inline]

Allocates an empty structure based on an existing one with another number of modes.

Set the values o as the measurements.


Member Function Documentation

double QGpCompatibility::CompatDispersionData::closestModeMisfit ( bool  strictModeJumping,
FILE *  flog 
)

Calculate the Root Mean Square for the current calculated dispersion curve using the mode that matches best the the data fundamental curve (taken as the effictive apparent velocity)

References QGpCompatibility::CompatMultiModalData::_measurements, QGpCompatibility::CompatMultiModalFrequency::_modesCount, QGpCompatibility::CompatMultiModalFrequency::_omegasCount, QGpCompatibility::CompatMultiModalData::_omegasCount, QGpCompatibility::CompatMultiModalData::_stddev, QGpCompatibility::CompatMultiModalCurves::_values, QGpCompatibility::CompatMultiModalData::measurements(), mode, QGpCoreTools::sqrt(), QGpCompatibility::CompatMultiModalData::stddev(), and TRACE.

{
  TRACE;
  //  RMS is the calculated with the closest mode
  double rms_val=0;
  int omegaCountReal=CompatMultiModalFrequency::_omegasCount;
  int omegaCountData=omegaCountReal;
  // Effective apparent velocity is always in mode 0 (fundamental)
  double * measurements=_measurements[0];
  double * stddev=_stddev[0];
  int maxMode=CompatMultiModalFrequency::_modesCount-1;
  for(int i=CompatMultiModalFrequency::_omegasCount-1;i>=0;i--) {
    if(measurements[i]!=0) {
      double diff,minDiff=1e99;
      int nextSampleMaxMode=maxMode;
      for(int mode=0;mode<=maxMode;mode++) {
        if(_values[mode][i]!=0) {
#ifdef SLOWNESS_MISFIT
          if(stddev[i]) diff=(measurements[i]-_values[mode][i]) /stddev[i];
          else diff=(measurements[i]-_values[mode][i]) /measurements[i];      
#else
          if(stddev[i]) diff=(1/measurements[i]-1/_values[mode][i])*stddev[i];
          else diff=(1/measurements[i]-1/_values[mode][i])*measurements[i];
#endif
          if(diff<0) diff=-diff;
          if(diff<minDiff) {
            minDiff=diff;
            nextSampleMaxMode=mode;
          }
        }
      }
      if(strictModeJumping) maxMode=nextSampleMaxMode;
      if(minDiff!=1e99) rms_val+=minDiff*minDiff; else omegaCountReal--;
    } 
    else {omegaCountData--;omegaCountReal--;}
  } 
  if(omegaCountReal>0)
    rms_val=sqrt(rms_val/omegaCountReal)*(1+omegaCountData-omegaCountReal);
  else {
    fprintf(flog," *** ERROR *** : no common value between calculated and data, this should never happen!\n");
    rms_val=10000; 
  }
  return rms_val;
}

Export in a file readable by Herrmann SURF.

the measurements are read from a file of the Herrmann disp.d format: 1st line : IUNIT (not used here) IFRPER (0 if period, 1 if frequency) Other lines: ILVRY (1=Love,2=Rayleigh) IPORG(unused) IMODE FRPER VAL DVAL(unused)

The way the stddev is stored has changed from the inverse of velocity stddev to the stddev of the slowness. new_stddev=old_stddev*slowness*slowness All reports with version 0 have the old format for stddev This routine is called be CompatInversionReport to change the stddev in case of version 0

References QGpCompatibility::CompatMultiModalData::_measurements, QGpCompatibility::CompatMultiModalData::_modesCount, QGpCompatibility::CompatMultiModalData::_omegasCount, QGpCompatibility::CompatMultiModalData::_stddev, QGpCompatibility::CompatMultiModalData::measurements(), mode, QGpCompatibility::CompatMultiModalData::stddev(), and TRACE.

Referenced by QGpCompatibility::CompatInversionReport::loadDispersionGoal().

{
  TRACE;
 for(int mode=0;mode<CompatMultiModalFrequency::_modesCount;mode++) {
  double * measurements=_measurements[mode];
  double * stddev=_stddev[mode];
  for(int i=0;i<CompatMultiModalFrequency::_omegasCount;i++)
     stddev[i]=measurements[i]*measurements[i]/stddev[i];
 }
}

References QGpCompatibility::CompatMultiModalData::_measurements, and QGpCompatibility::CompatMultiModalFrequency::_omegas.

{
  ASSERT(iMode<CompatMultiModalFrequency::_modesCount);
  QVector<double> * list=new QVector<double>;
  double * values=_measurements[iMode];
  int n=CompatMultiModalFrequency::_omegasCount-1;
  for(int i=1;i<n;i++) {
    double derslow=0.5*((values[i]-values[i-1])/(_omegas[i]-_omegas[i-1])+
                        (values[i+1]-values[i])/(_omegas[i+1]-_omegas[i]));
    derslow*=_omegas[i];
    list->push_back(values[i]+derslow);
  }
  return list;
}
double QGpCompatibility::CompatDispersionData::misfit ( int  iMin,
int  iMax,
FILE *  flog 
)

Calculate the Root Mean Square for the current calculated dispersion curve between indexes iMin and iMax

References QGpCompatibility::CompatMultiModalData::_measurements, QGpCompatibility::CompatMultiModalFrequency::_modesCount, QGpCompatibility::CompatMultiModalData::_modesCount, QGpCompatibility::CompatMultiModalData::_stddev, QGpCompatibility::CompatMultiModalCurves::_values, QGpCompatibility::CompatMultiModalData::measurements(), mode, QGpCoreTools::sqrt(), QGpCompatibility::CompatMultiModalData::stddev(), and TRACE.

{
  TRACE;
  // Global RMS is the sum of the RMS of all modes
  double rms_val=0;
  int omegaCountReal=(iMax-iMin+1)*CompatMultiModalFrequency::_modesCount;
  int omegaCountData=omegaCountReal;
  for(int mode=0;mode<CompatMultiModalFrequency::_modesCount;mode++) {
    double * measurements=_measurements[mode];
    double * stddev=_stddev[mode];
    double * calculated=_values[mode];
    for(int i=iMin;i<=iMax;i++) {
      if(measurements[i]!=0) {
        if(calculated[i]!=0) {
          double diff;
#ifdef SLOWNESS_MISFIT
          if(stddev[i]) diff=(measurements[i]-calculated[i]) /stddev[i];
          else diff=(measurements[i]-calculated[i]) /measurements[i];      
#else
          if(stddev[i]) diff=(1/measurements[i]-1/calculated[i])*stddev[i];
          else diff=(1/measurements[i]-1/calculated[i])*measurements[i];
#endif
          rms_val+=diff*diff;
        } else omegaCountReal--;
      } else {omegaCountData--;omegaCountReal--;}
    }
  }
  if(omegaCountReal>0)
    rms_val=sqrt(rms_val/omegaCountReal)*(1+omegaCountData-omegaCountReal);
  else if(omegaCountData==0) rms_val=0;
  else {
    fprintf(flog," *** ERROR *** : no common value between calculated and data, this should never happen!\n");
    rms_val=10000; 
  }
  return rms_val;
}
double QGpCompatibility::CompatDispersionData::misfit ( FILE *  flog) [inline]

Calculate the Root Mean Square for the current calculated dispersion curve.

References QGpCompatibility::CompatMultiModalFrequency::_omegasCount, and misfit().


The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines