All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines
Public Types | Public Member Functions | Static Public Member Functions | Protected Member Functions | Protected Attributes | Friends
QGpCompatibility::CompatAutocorrCurves Class Reference

#include <CompatAutocorrCurves.h>

Inheritance diagram for QGpCompatibility::CompatAutocorrCurves:
QGpCompatibility::CompatMultiModalFrequency QGpCompatibility::CompatAutocorrData

List of all members.

Public Types

enum  FrequencyRange { Complete, NoInitialFlat, FirstSlope }

Public Member Functions

void calculate (CompatDispersion &disp)
 CompatAutocorrCurves ()
 CompatAutocorrCurves (int modesCount, int radiusCount, int omegasCount)
 CompatAutocorrCurves (const CompatAutocorrCurves *o)
 CompatAutocorrCurves (const CompatAutocorrCurves *o, int modesCount)
int omegasCount (int imode, int r) const
int omegasCount () const
 Returns the omega count.
double radiusAverage (int i) const
QVector< double > * radiusAverage () const
int radiusCount () const
double radiusMax (int i) const
double radiusMin (int i) const
void radiusToReport (QDataStream &s) const
uint rayleighModesCount ()
void reportToOmega (QDataStream &s)
 Loads the _omega from the binary stream (usually the inversion_report)
void reportToRadius (QDataStream &s)
void reportToValues (QDataStream &s)
void resetAutocorr ()
void resetValues ()
void setRadius (QVector< double > &rmin, QVector< double > &rmax)
void setRadius (CompatAutocorrCurves *o)
void setRadius (QString radiusFile)
void setRadius (int r, double rmin, double rmax)
void setRangeType (FrequencyRange fr)
void setRayleighModesCount (int rm)
void setValue (int i, int r, int m, double value)
int toDistancePointVector (int imode, int iomega, Point2D *pointList)
int toPointVector (int imode, int iRadius, Point2D *pointList)
void toStream (FILE *f)
double value (int i, int r, int m) const
void valuesToReport (QDataStream &s) const
virtual ~CompatAutocorrCurves ()

Static Public Member Functions

static int getRadiusCount (QString radiusFile)

Protected Member Functions

void allocatesRadius ()
void allocatesValues ()
void deleteValues ()

Protected Attributes

int _radiusCount
double * _radiusMax
double * _radiusMin
FrequencyRange _rangeType
uint _rayleighModesCount
double *** _values

Friends

class CompatAutocorrData

Member Enumeration Documentation

Enumerator:
Complete 
NoInitialFlat 
FirstSlope 

Constructor & Destructor Documentation

QGpCompatibility::CompatAutocorrCurves::CompatAutocorrCurves ( int  modesCount,
int  radiusCount,
int  omegasCount 
)

References _radiusCount, _radiusMax, _radiusMin, _rangeType, _rayleighModesCount, _values, allocatesRadius(), allocatesValues(), Complete, radiusMax(), radiusMin(), and TRACE.

                                                                         :
    CompatMultiModalFrequency(o)
{
  TRACE;
  _radiusCount=o->_radiusCount;
  _radiusMin=0;
  _radiusMax=0;
  allocatesRadius();
  // Copy the radius min and max
  for(int iRadius=0;iRadius<_radiusCount;iRadius++) {
    _radiusMin[iRadius]=o->radiusMin(iRadius);
    _radiusMax[iRadius]=o->radiusMax(iRadius);
  }  
  _values=0;
  allocatesValues();
  _rangeType=Complete;
  _rayleighModesCount=o->_rayleighModesCount;
}

References _radiusMax, _radiusMin, deleteValues(), and TRACE.

{
  TRACE;
  deleteValues();
  delete [] _radiusMin;
  delete [] _radiusMax;
}

Member Function Documentation

References _radiusCount, _radiusMax, _radiusMin, and TRACE.

Referenced by CompatAutocorrCurves(), and reportToRadius().

{
  TRACE;
  delete [] _radiusMin;
  delete [] _radiusMax;
  _radiusMin=new double[_radiusCount];
  _radiusMax=new double[_radiusCount];
}

References QGpCompatibility::CompatMultiModalFrequency::_modesCount, QGpCompatibility::CompatMultiModalFrequency::_omegasCount, _radiusCount, _values, deleteValues(), and TRACE.

Referenced by CompatAutocorrCurves(), and reportToOmega().

{
  TRACE;
  ASSERT (_radiusCount>0);
  deleteValues();
  _values=new double**[_modesCount];
  for(int imode=0;imode<_modesCount;imode++) {
    double ** autocorrMode=new double*[_radiusCount];
    _values[imode]=autocorrMode;
    for(int iradius=0; iradius<_radiusCount;iradius++)
      autocorrMode[iradius]=new double[_omegasCount];
  }
}

References QGpCompatibility::CompatMultiModalFrequency::_modesCount, QGpCompatibility::CompatMultiModalFrequency::_omegas, QGpCompatibility::CompatMultiModalFrequency::_omegasCount, _radiusCount, _radiusMax, _radiusMin, _rangeType, _values, CompatAUTOCORR_INVALID_VALUE, Complete, FirstSlope, QGpCompatibility::CompatMultiModalFrequency::modesCount(), NoInitialFlat, TRACE, and QGpCompatibility::CompatMultiModalCurves::value().

{
  TRACE;
  int maxMode=disp.modesCount();
  if(maxMode>_modesCount) maxMode=_modesCount;
  int imode;
  for(imode=0;imode<maxMode;imode++) {
    double ** autocorrMode=_values[imode];
    for(int iRadius=0;iRadius<_radiusCount;iRadius++) {
      double rmin=_radiusMin[iRadius];
      double rmax=_radiusMax[iRadius];
      double r0=0.5*(rmin+rmax);
      double dr=rmax-rmin;
      double arg0,arg1;
      double * autocorres =autocorrMode[iRadius];
      // To make as Bruno Bettig, switch from SPAC to MSPAC if the radius range
      // is too large. Threshold is 2%.
      if(fabs(dr) < 0.02*r0) {
        for(int j=0;j<_omegasCount;j++) {
          /********************************************************/
          /* nearly perfect ring - use original Aki's relation    */
          /* between averaged autocorrelation and Bessel function */
          /********************************************************/
          arg0=_omegas[j]*r0*disp.value(j,imode);
          
          switch (_rangeType) {
          case Complete:
            autocorres[j]=j0(arg0);
            break;
          case NoInitialFlat:
            if(arg0 < 0.4)
              autocorres[j]=CompatAUTOCORR_INVALID_VALUE;
            else
              autocorres[j]=j0(arg0);
            break;
          case FirstSlope:
            if(arg0 < 0.4 || arg0 > 3.2)
              autocorres[j]=CompatAUTOCORR_INVALID_VALUE;
            else
              autocorres[j]=j0(arg0);
            break;
          }
        }
      }
      else {
        double rFactor=r0*dr;
        double slow;
        for(int j=0;j<_omegasCount;j++) {
          slow=disp.value(j,imode);
          arg0= _omegas[j]*rmax*slow;
          arg1= _omegas[j]*rmin*slow;
          switch (_rangeType) {
          case Complete:
            autocorres[j]=(rmax*j1(arg0)-rmin*j1(arg1))
                           /(_omegas[j]*rFactor*slow);
            break;
          case NoInitialFlat:
            if(arg0 < 0.4 || arg1 < 0.4)
              autocorres[j]=CompatAUTOCORR_INVALID_VALUE;
            else
              autocorres[j]=(rmax*j1(arg0)-rmin*j1(arg1))
                             /(_omegas[j]*rFactor*slow);
            break;
          case FirstSlope:
            if(arg0 < 0.4 || arg0 > 3.2 || arg1 < 0.4 || arg1 > 3.2)
              autocorres[j]=CompatAUTOCORR_INVALID_VALUE;
            else
              autocorres[j]=(rmax*j1(arg0)-rmin*j1(arg1))
                             /(_omegas[j]*rFactor*slow);
            break;
          }
        }
      }
    }
  }
  // Dispersion contains less modes than this autocorr object, complete with invalid values
  for(imode=maxMode;imode<_modesCount;imode++) {
    double ** autocorrMode=_values[imode];
    for(int iRadius=0;iRadius<_radiusCount;iRadius++) {
      double * autocorres =autocorrMode[iRadius];     
      for(int j=0;j<_omegasCount;j++) autocorres[j]=CompatAUTOCORR_INVALID_VALUE;
    }
  }
}

References QGpCompatibility::CompatMultiModalFrequency::_modesCount, _radiusCount, _values, and TRACE.

Referenced by allocatesValues(), reportToOmega(), and ~CompatAutocorrCurves().

{
  TRACE;
  if(_values)  {
    for(int imode=0;imode<_modesCount;imode++)
    {
      double ** autocorrMode=_values[imode];
      for(int radius=0; radius<_radiusCount;radius++)
        delete [] autocorrMode[radius];
      delete [] _values[imode];
    }
    delete [] _values; 
    _values=0;
  }
}
int QGpCompatibility::CompatAutocorrCurves::getRadiusCount ( QString  radiusFile) [static]

References radiusCount(), str, and TRACE.

Referenced by setRadius().

{
  TRACE;
  QFile f(radiusFile);
  if(!f.open(QIODevice::ReadOnly)) {
    fprintf(stderr," **** Cannot open radius file\n");
    return 0;
  }
  QTextStream s(&f);
  QString str;
  // Count radius
  int radiusCount=0;
  while(!s.atEnd()) {
    str=s.readLine().trimmed();
    if(!str.isEmpty() && str.left(1)!="#") radiusCount++;
  }
  return radiusCount;
}
int QGpCompatibility::CompatAutocorrCurves::omegasCount ( int  imode,
int  r 
) const

References QGpCompatibility::CompatMultiModalFrequency::_omegasCount, _values, CompatAUTOCORR_INVALID_VALUE, and TRACE.

{
  TRACE;
  int n=0;
  double * autocorrValues=_values[imode][iradius];
  for(int i=0;i<_omegasCount;i++) {
    if(autocorrValues[i]!=CompatAUTOCORR_INVALID_VALUE) n++;
  }
  return n;
}

Returns the omega count.

Reimplemented from QGpCompatibility::CompatMultiModalFrequency.

{return _omegasCount;}
{return (_radiusMax[i]+_radiusMin[i])/2;}

References _radiusCount.

Referenced by toDistancePointVector().

{
  QVector<double> * list=new QVector<double>;
  list->reserve(_radiusCount);
  for(int i=0;i<_radiusCount;i++)
    list->push_back(radiusAverage(i));
  return list;
}
double QGpCompatibility::CompatAutocorrCurves::radiusMax ( int  i) const [inline]
double QGpCompatibility::CompatAutocorrCurves::radiusMin ( int  i) const [inline]

References _radiusCount, _radiusMax, _radiusMin, and TRACE.

Referenced by QGpCompatibility::CompatAutocorrData::dataToReport().

{
  TRACE;
  s << _radiusCount;
  for(int i=0;i<_radiusCount;i++) {
    s << _radiusMin[i];
    s << _radiusMax[i];
  }
}

References QGpCompatibility::CompatMultiModalFrequency::_modesCount, _radiusCount, _values, and TRACE.

Referenced by QGpCompatibility::CompatAutocorrReport::loadAutocorr(), and QGpCompatibility::CompatAutocorrReport::loadAutocorrOnly().

{
  TRACE;
  ASSERT(_values!=0);
  for(int imode=0; imode<_modesCount;imode++) {
    double ** autocorrMode=_values[imode];
    for(int iRadius=0; iRadius<_radiusCount;iRadius++) {
      //s.readRawData((char *)autocorrMode[iRadius],_omegasCount*sizeof(double));
      double * autocorrValues=autocorrMode[iRadius];
      for(int i=0;i<_omegasCount;i++) s >> autocorrValues[i];
    }
  }
}

References QGpCompatibility::CompatMultiModalFrequency::_modesCount, QGpCompatibility::CompatMultiModalFrequency::_omegasCount, _radiusCount, _values, CompatAUTOCORR_INVALID_VALUE, and TRACE.

{
  TRACE;
  for(int imode=0; imode<_modesCount;imode++) {
    double ** autocorrMode=_values[imode];
    for(int radius=0; radius<_radiusCount;radius++) {
      double * autocorrValues=autocorrMode[radius];
      for(int i=0;i<_omegasCount;i++)
        autocorrValues[i]=CompatAUTOCORR_INVALID_VALUE;
    }
  }
}

References QGpCompatibility::CompatMultiModalFrequency::_modesCount, QGpCompatibility::CompatMultiModalFrequency::_omegasCount, _radiusCount, _values, CompatAUTOCORR_INVALID_VALUE, mode, and TRACE.

{
  TRACE;
  for(int mode=0; mode<_modesCount;mode++) {
    double ** valuesMode=_values[mode];
    for(int iradius=0; iradius<_radiusCount;iradius++) {
      double * values=valuesMode[iradius];
      for(int i=0;i<_omegasCount;i++) values[i]=CompatAUTOCORR_INVALID_VALUE;
    }
  }
}
void QGpCompatibility::CompatAutocorrCurves::setRadius ( QVector< double > &  rmin,
QVector< double > &  rmax 
)

References _radiusCount, _radiusMax, _radiusMin, and TRACE.

{
  TRACE;
  ASSERT ((int)rmin.count()==_radiusCount && (int)rmax.count()==_radiusCount);
  for(int i=0;i<_radiusCount;i++) {
    _radiusMin[i]=rmin[i];
    _radiusMax[i]=rmax[i];
  }
}

References _radiusCount, _radiusMax, _radiusMin, and TRACE.

{
  TRACE;
  ASSERT(_radiusCount==o->_radiusCount);   
  for(int iradius=0; iradius<_radiusCount;iradius++) {
    _radiusMin[iradius] =o->_radiusMin[iradius];
    _radiusMax[iradius] =o->_radiusMax[iradius];
  }
}

References _radiusCount, _radiusMax, _radiusMin, getRadiusCount(), str, and TRACE.

{
  TRACE;
  ASSERT(getRadiusCount(radiusFile)==_radiusCount);
  QFile f(radiusFile);
  if(!f.open(QIODevice::ReadOnly)) {
    fprintf(stderr," **** Cannot open radius file\n");
    return;
  }
  QTextStream s(&f);
  QString str;
  int iRadius=0;
  while(!s.atEnd()) {
    str=s.readLine().trimmed();
    if(!str.isEmpty() && str.left(1)!="#") {
      _radiusMin[iRadius]=str.section(QRegExp("[ \t]"),0,0).toDouble();
      _radiusMax[iRadius]=str.section(QRegExp("[ \t]"),1,1).toDouble();
      iRadius++;
    }
  }
}
void QGpCompatibility::CompatAutocorrCurves::setRadius ( int  r,
double  rmin,
double  rmax 
) [inline]
  {_radiusMin[r]=rmin;_radiusMax[r]=rmax;}
{_rangeType=fr;}
void QGpCompatibility::CompatAutocorrCurves::setValue ( int  i,
int  r,
int  m,
double  value 
) [inline]
{_values[m][r][i]=value;}
int QGpCompatibility::CompatAutocorrCurves::toDistancePointVector ( int  imode,
int  iomega,
Point2D pointList 
)

References QGpCompatibility::CompatMultiModalFrequency::_modesCount, QGpCompatibility::CompatMultiModalFrequency::_omegasCount, _radiusCount, _values, CompatAUTOCORR_INVALID_VALUE, radiusAverage(), and TRACE.

{
  TRACE;
  if(imode>=_modesCount || iomega>=_omegasCount) return 0;
  double ** autocorrValues=_values[imode];
  int count=_radiusCount;
  for(int i=0;i<_radiusCount;i++) {
    double val=autocorrValues[i][iomega];
    if(val!=CompatAUTOCORR_INVALID_VALUE) *(pointList++)=Point2D(radiusAverage(i),val);
    else count--;
  }
  return count;
}
int QGpCompatibility::CompatAutocorrCurves::toPointVector ( int  imode,
int  iRadius,
Point2D pointList 
)

References QGpCompatibility::CompatMultiModalFrequency::_modesCount, QGpCompatibility::CompatMultiModalFrequency::_omegas, QGpCompatibility::CompatMultiModalFrequency::_omegasCount, _radiusCount, _values, CompatAUTOCORR_INVALID_VALUE, TRACE, and twopi.

{
  TRACE;
  if(imode>=_modesCount || iradius>=_radiusCount) return 0;
  double * autocorrValues=_values[imode][iradius];
  int count=_omegasCount;
  for(int i=0;i<_omegasCount;i++) {
    double val=autocorrValues[i];
    if(val!=CompatAUTOCORR_INVALID_VALUE) *(pointList++)=Point2D(_omegas[i]/twopi,val);
    else count--;
  }
  return count;
}

References QGpCompatibility::CompatMultiModalFrequency::_modesCount, QGpCompatibility::CompatMultiModalFrequency::_omegas, QGpCompatibility::CompatMultiModalFrequency::_omegasCount, _radiusCount, _values, CompatAUTOCORR_INVALID_VALUE, TRACE, and twopi.

{
  TRACE;
  for(int imode=0; imode<_modesCount;imode++) {
    double ** autocorrMode=_values[imode];
    for(int radius=0; radius<_radiusCount;radius++) {
      double * autocorrValues=autocorrMode[radius];
      for(int i=0;i<_omegasCount;i++) {
        if(autocorrValues[i]!=CompatAUTOCORR_INVALID_VALUE) {
          fprintf(f,"%lf %lf\n",twopi/_omegas[i],autocorrValues[i]);
        }
      }
      fprintf(f,">\n");
    }
  }
}
double QGpCompatibility::CompatAutocorrCurves::value ( int  i,
int  r,
int  m 
) const [inline]
{return _values[m][r][i];}

References QGpCompatibility::CompatMultiModalFrequency::_modesCount, QGpCompatibility::CompatMultiModalFrequency::_omegasCount, _radiusCount, _values, and TRACE.

Referenced by QGpCompatibility::CompatAutocorrReport::addModel().

{
  TRACE;
  for(int imode=0; imode<_modesCount;imode++) {
    double ** autocorrMode=_values[imode];
    for(int iRadius=0; iRadius<_radiusCount;iRadius++) {
      //s.writeRawData((char *)autocorrMode[iRadius],_omegasCount*sizeof(double));
      double * autocorrValues=autocorrMode[iRadius];
      for(int i=0;i<_omegasCount;i++) s << autocorrValues[i];
    }
  }
}

Friends And Related Function Documentation

friend class CompatAutocorrData [friend]

Member Data Documentation

Referenced by calculate(), and CompatAutocorrCurves().

Referenced by CompatAutocorrCurves().


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