#include <DCReportBlock.h>
Public Member Functions | |
bool | autocorr () const |
DCReportBlock (QDataStream &s) | |
bool | dispersion () const |
bool | ellipticity () const |
bool | magnetoTelluric () const |
bool | modalStorage (int i) const |
bool | pitch () const |
bool | profile (int i) const |
Resistivity1DModel * | readElectricModel () |
void | readModalStorages (int nStorages) |
void | readProfiles (int version) |
Seismic1DModel * | readSeismicModel () |
bool | refractionVp () const |
bool | refractionVs () const |
bool | res () const |
bool | rho () const |
void | setStorageReader (ModalStorageReader *r) |
ModalStorageReader * | storageReader () const |
QDataStream & | stream () |
bool | vp () const |
bool | vs () const |
~DCReportBlock () | |
Static Public Member Functions | |
static Seismic1DModel * | surfaceWaveModel (const QVector< double > &zProf, QVector< double > &vpProf, const QVector< double > &vsProf, const QVector< double > &rhoProf, const QVector< double > *nuMinProf=0, const QVector< double > *nuMaxProf=0) |
static Seismic1DModel * | vpModel (const QVector< double > &zProf, const QVector< double > &vpProf) |
static Seismic1DModel * | vsModel (const QVector< double > &zProf, const QVector< double > &vsProf) |
static Seismic1DModel * | vspModel (const QVector< double > &zProf, const QVector< double > &vpProf, const QVector< double > &vsProf) |
static void | write (ReportWriter *report, const TargetList &tl, const Profile *vp=0, const Profile *vs=0, const Profile *rho=0, const Profile *pitch=0, const Profile *res=0) |
static void | write (ReportWriter *outReport, ReportReader *inReport) |
static void | writeBeta (ReportWriter *outReport, ReportReader *inReport) |
static void | writeNaViewer (ReportWriter *outReport, CompatInversionReport *inReport) |
DISP block containing the following sub-blocks:
4 Tag "DISP" 20*8 Offsets to sub-blocks (currently only 9 are in use) 0 if block not available
DinverDCCore::DCReportBlock::DCReportBlock | ( | QDataStream & | s | ) |
bool DinverDCCore::DCReportBlock::autocorr | ( | ) | const [inline] |
Referenced by DinverDCGui::AutocorrViewer::hasCurves(), and outputDCModel().
{return profile(6);}
bool DinverDCCore::DCReportBlock::dispersion | ( | ) | const [inline] |
Referenced by DinverDCGui::DispersionViewer::hasCurves(), and outputDCModel().
{return profile(5);}
bool DinverDCCore::DCReportBlock::ellipticity | ( | ) | const [inline] |
Referenced by DinverDCGui::EllipticityViewer::hasCurves(), and outputDCModel().
{return profile(7);}
bool DinverDCCore::DCReportBlock::magnetoTelluric | ( | ) | const [inline] |
Referenced by DinverDCGui::MagnetoTelluricViewer::hasCurves().
{return profile(10);}
bool DinverDCCore::DCReportBlock::modalStorage | ( | int | i | ) | const [inline] |
References TRACE.
Referenced by DinverDCGui::EllipticityViewer::hasCurves(), outputDCModel(), DinverDCGui::AutocorrViewer::report2plot(), DinverDCGui::DispersionViewer::seekMode(), and DinverDCGui::AutocorrViewer::setSampleCount().
{ TRACE; if(_modalStorageOffsets[ i ] > 0) { _s->device()->seek(_modalStorageOffsets[ i ] ); return true; } else return false; }
bool DinverDCCore::DCReportBlock::pitch | ( | ) | const [inline] |
Referenced by outputDCModel(), readSeismicModel(), and reportMode().
{return profile(3);}
bool DinverDCCore::DCReportBlock::profile | ( | int | i | ) | const [inline] |
References TRACE.
Referenced by DinverDCGui::GroundModelViewer::report2plot(), DinverDCGui::GroundModelViewer::setSampleCount(), and writeBeta().
{ TRACE; if(_profileOffsets[ i ] > 0) { _s->device()->seek(_profileOffsets[ i ] ); return true; } else return false; }
Reads profiles and build a resistivity layered model according to available profiles.
References QGpCoreWave::Profile::count(), QGpCoreWave::Profile::readReport(), res(), and TRACE.
Referenced by reportMode().
{ TRACE; Profile resProf; if(res()) resProf.readReport(*_s); QVector<double> depths; if(resProf.count()>0) { return new Resistivity1DModel(resProf); } else { return 0; } }
void DinverDCCore::DCReportBlock::readModalStorages | ( | int | nStorages | ) |
Read the modal storage offset table and cache it
References TRACE.
Referenced by DinverDCGui::EllipticityViewer::hasCurves(), DinverDCGui::DispersionViewer::hasCurves(), outputDCModel(), DinverDCGui::AutocorrViewer::report2plot(), and DinverDCGui::AutocorrViewer::setSampleCount().
{ TRACE; delete [] _modalStorageOffsets; _modalStorageOffsets=new qint64[nStorages]; for(int i=0;i<nStorages;i++) stream() >> _modalStorageOffsets[i]; }
void DinverDCCore::DCReportBlock::readProfiles | ( | int | version | ) |
Read the profile offset table and cache it
References DCREPORTBLOCK_CURRENT_VERSION, QGpCoreTools::endl(), stream(), QGpCoreTools::tr(), and TRACE.
Referenced by DinverDCGui::GroundModelViewer::exportModels(), DinverDCGui::DCModelViewer::loadModels(), DinverDCGui::GroundModelViewer::minMaxProfiles(), outputDCModel(), DinverDCGui::DCModelViewer::rejectModels(), reportMode(), DinverDCGui::DCModelViewer::selectModels(), write(), and writeBeta().
{ TRACE; switch (version) { case 0: case 1: for(int i=0;i<9;i++) stream() >> _profileOffsets[i]; for(int i=9;i<20;i++) _profileOffsets[i]=0; break; case 2: for(int i=0;i<20;i++) stream() >> _profileOffsets[i]; break; default: App::stream() << tr("Report has been produced by a more recent version of this library %1 (current=%2).") .arg(version).arg(DCREPORTBLOCK_CURRENT_VERSION) << endl; for(int i=0;i<20;i++) _profileOffsets[i]=0; break; } }
Reads profiles and build a layered model according to available profiles.
References QGpCoreWave::Profile::count(), QGpCoreWave::Profile::depths(), pitch(), QGpCoreWave::Profile::readReport(), QGpCoreWave::Profile::resample(), rho(), surfaceWaveModel(), QGpCoreTools::unique(), QGpCoreWave::Profile::values(), vp(), vpModel(), vs(), vsModel(), and vspModel().
Referenced by outputDCModel(), and reportMode().
{ // Read all profiles available to produce a full sampling of the depths Profile vpProf, vsProf, rhoProf, pitchProf; if(vp()) vpProf.readReport(*_s); if(vs()) vsProf.readReport(*_s); if(rho()) rhoProf.readReport(*_s); if(pitch()) pitchProf.readReport(*_s); // Used only to ensure complete sampling QVector<double> depths; if(vpProf.count()==0) { if(vsProf.count()==0) { return 0; } else { depths << vsProf.depths(); depths << pitchProf.depths(); // It matters only if pitch is not empty qSort(depths); unique(depths); vsProf.resample(depths); return vsModel(vsProf.depths() ,vsProf.values()); } } else { if(vsProf.count()==0) { depths << vpProf.depths(); depths << pitchProf.depths(); // It matters only if pitch is not empty qSort(depths); unique(depths); vpProf.resample(depths); return vpModel(vpProf.depths() ,vpProf.values()); } else if(rhoProf.count()==0) { depths << vpProf.depths(); depths << vsProf.depths(); depths << pitchProf.depths(); qSort(depths); unique(depths); vpProf.resample(depths); vsProf.resample(depths); return vspModel(depths ,vpProf.values() ,vsProf.values()); } else { depths << vpProf.depths(); depths << vsProf.depths(); depths << rhoProf.depths(); depths << pitchProf.depths(); qSort(depths); unique(depths); vpProf.resample(depths); vsProf.resample(depths); rhoProf.resample(depths); QVector<double> vp=vpProf.values(); return surfaceWaveModel(depths ,vp, vsProf.values(), rhoProf.values()); } } }
bool DinverDCCore::DCReportBlock::refractionVp | ( | ) | const [inline] |
Referenced by DinverDCGui::RefractionVpViewer::hasCurves(), and outputDCModel().
{return profile(8);}
bool DinverDCCore::DCReportBlock::refractionVs | ( | ) | const [inline] |
Referenced by DinverDCGui::RefractionVsViewer::hasCurves(), and outputDCModel().
{return profile(9);}
bool DinverDCCore::DCReportBlock::res | ( | ) | const [inline] |
Referenced by outputDCModel(), and readElectricModel().
{return profile(4);}
bool DinverDCCore::DCReportBlock::rho | ( | ) | const [inline] |
Referenced by outputDCModel(), and readSeismicModel().
{return profile(2);}
void DinverDCCore::DCReportBlock::setStorageReader | ( | ModalStorageReader * | r | ) | [inline] |
{delete _reader; _reader=r;};
ModalStorageReader* DinverDCCore::DCReportBlock::storageReader | ( | ) | const [inline] |
{return _reader;};
QDataStream& DinverDCCore::DCReportBlock::stream | ( | ) | [inline] |
Referenced by outputDCModel(), readProfiles(), DinverDCGui::RefractionViewer::report2plot(), DinverDCGui::EllipticityViewer::report2plot(), DinverDCGui::MagnetoTelluricViewer::report2plot(), DinverDCGui::DispersionViewer::report2plot(), DinverDCGui::AutocorrViewer::report2plot(), DinverDCGui::GroundModelViewer::report2plot(), DinverDCGui::RefractionViewer::setSampleCount(), DinverDCGui::EllipticityViewer::setSampleCount(), DinverDCGui::DispersionViewer::setSampleCount(), DinverDCGui::MagnetoTelluricViewer::setSampleCount(), DinverDCGui::AutocorrViewer::setSampleCount(), DinverDCGui::GroundModelViewer::setSampleCount(), and writeBeta().
{return *_s;}
Seismic1DModel * DinverDCCore::DCReportBlock::surfaceWaveModel | ( | const QVector< double > & | zProf, |
QVector< double > & | vpProf, | ||
const QVector< double > & | vsProf, | ||
const QVector< double > & | rhoProf, | ||
const QVector< double > * | nuMinProf = 0 , |
||
const QVector< double > * | nuMaxProf = 0 |
||
) | [static] |
References QGpCoreWave::Seismic1DModel::setH(), QGpCoreWave::Seismic1DModel::setQp(), QGpCoreWave::Seismic1DModel::setQs(), QGpCoreWave::Seismic1DModel::setRho(), QGpCoreWave::Seismic1DModel::setSlowP(), QGpCoreWave::Seismic1DModel::setSlowS(), QGpCoreTools::sqrt(), and TRACE.
Referenced by DinverDCCore::TargetList2D::misfit(), DinverDCCore::TargetList::misfit(), and readSeismicModel().
{ TRACE; ASSERT(!nuMinProf || (nuMinProf && nuMaxProf)); int nLayers=zProf.size(); Seismic1DModel * surfModel=new Seismic1DModel(nLayers); int i; int nLayers1=nLayers - 1; double z=0.0; for(i=0;i < nLayers1;i++ ) { surfModel->setH(i, zProf[i] - z); z=zProf[i]; surfModel->setSlowS(i, 1.0/vsProf[i] ); if(nuMinProf && nuMinProf->at(i)>=nuMaxProf->at(i)) { vpProf[i]=vsProf[i]*sqrt(2.0*(nuMinProf->at(i)-1.0)/(2.0*nuMinProf->at(i)-1.0)); surfModel->setSlowP(i, 1.0/vpProf[i] ); } surfModel->setSlowP(i, 1.0/vpProf[i] ); surfModel->setRho(i, rhoProf[i] ); surfModel->setQp(i, 0.0); surfModel->setQs(i, 0.0); } if(nuMinProf && nuMinProf->at(i)>=nuMaxProf->at(i)) { vpProf[i]=vsProf[i]*sqrt(2.0*(nuMinProf->at(i)-1.0)/(2.0*nuMinProf->at(i)-1.0)); } surfModel->setSlowP(i, 1.0/vpProf[i] ); surfModel->setSlowS(i, 1.0/vsProf[i] ); surfModel->setRho(i, rhoProf[i] ); surfModel->setQp(i, 0.0); surfModel->setQs(i, 0.0); return surfModel; }
bool DinverDCCore::DCReportBlock::vp | ( | ) | const [inline] |
Referenced by outputDCModel(), and readSeismicModel().
{return profile(0);}
Seismic1DModel * DinverDCCore::DCReportBlock::vpModel | ( | const QVector< double > & | zProf, |
const QVector< double > & | vpProf | ||
) | [static] |
References QGpCoreWave::Seismic1DModel::setH(), QGpCoreWave::Seismic1DModel::setQp(), QGpCoreWave::Seismic1DModel::setQs(), QGpCoreWave::Seismic1DModel::setRho(), QGpCoreWave::Seismic1DModel::setSlowP(), QGpCoreWave::Seismic1DModel::setSlowS(), and TRACE.
Referenced by DinverDCCore::TargetList::misfit(), and readSeismicModel().
{ TRACE; int nLayers=zProf.size(); Seismic1DModel * surfModel=new Seismic1DModel(nLayers); int i; int nLayers1=nLayers - 1; double z=0.0; for(i=0;i < nLayers1;i++ ) { surfModel->setH(i, zProf[i] - z); z=zProf[i]; surfModel->setSlowP(i, 1.0/vpProf[i] ); surfModel->setSlowS(i, 0.0); surfModel->setRho(i, 0.0); surfModel->setQp(i, 0.0); surfModel->setQs(i, 0.0); } surfModel->setSlowP(i, 1.0/vpProf[i] ); surfModel->setSlowS(i, 0.0); surfModel->setRho(i, 0.0); surfModel->setQp(i, 0.0); surfModel->setQs(i, 0.0); return surfModel; }
bool DinverDCCore::DCReportBlock::vs | ( | ) | const [inline] |
Referenced by outputDCModel(), and readSeismicModel().
{return profile(1);}
Seismic1DModel * DinverDCCore::DCReportBlock::vsModel | ( | const QVector< double > & | zProf, |
const QVector< double > & | vsProf | ||
) | [static] |
References QGpCoreWave::Seismic1DModel::setH(), QGpCoreWave::Seismic1DModel::setQp(), QGpCoreWave::Seismic1DModel::setQs(), QGpCoreWave::Seismic1DModel::setRho(), QGpCoreWave::Seismic1DModel::setSlowP(), QGpCoreWave::Seismic1DModel::setSlowS(), and TRACE.
Referenced by DinverDCCore::TargetList::misfit(), and readSeismicModel().
{ TRACE; int nLayers=zProf.size(); Seismic1DModel * surfModel=new Seismic1DModel(nLayers); int i; int nLayers1=nLayers - 1; double z=0.0; for(i=0;i < nLayers1;i++ ) { surfModel->setH(i, zProf[i] - z); z=zProf[i]; surfModel->setSlowP(i, 0.0); surfModel->setSlowS(i, 1.0/vsProf[i] ); surfModel->setRho(i, 0.0); surfModel->setQp(i, 0.0); surfModel->setQs(i, 0.0); } surfModel->setSlowP(i, 0.0); surfModel->setSlowS(i, 1.0/vsProf[i] ); surfModel->setRho(i, 0.0); surfModel->setQp(i, 0.0); surfModel->setQs(i, 0.0); return surfModel; }
Seismic1DModel * DinverDCCore::DCReportBlock::vspModel | ( | const QVector< double > & | zProf, |
const QVector< double > & | vpProf, | ||
const QVector< double > & | vsProf | ||
) | [static] |
References QGpCoreWave::Seismic1DModel::setH(), QGpCoreWave::Seismic1DModel::setQp(), QGpCoreWave::Seismic1DModel::setQs(), QGpCoreWave::Seismic1DModel::setRho(), QGpCoreWave::Seismic1DModel::setSlowP(), QGpCoreWave::Seismic1DModel::setSlowS(), and TRACE.
Referenced by DinverDCCore::TargetList::misfit(), and readSeismicModel().
{ TRACE; int nLayers=zProf.size(); Seismic1DModel * surfModel=new Seismic1DModel(nLayers); int i; int nLayers1=nLayers - 1; double z=0.0; for(i=0;i < nLayers1;i++ ) { surfModel->setH(i, zProf[i] - z); z=zProf[i]; surfModel->setSlowP(i, 1.0/vpProf[i] ); surfModel->setSlowS(i, 1.0/vsProf[i] ); surfModel->setRho(i, 0.0); surfModel->setQp(i, 0.0); surfModel->setQs(i, 0.0); } surfModel->setSlowP(i, 1.0/vpProf[i] ); surfModel->setSlowS(i, 1.0/vsProf[i] ); surfModel->setRho(i, 0.0); surfModel->setQp(i, 0.0); surfModel->setQs(i, 0.0); return surfModel; }
void DinverDCCore::DCReportBlock::write | ( | ReportWriter * | report, |
const TargetList & | tl, | ||
const Profile * | vp = 0 , |
||
const Profile * | vs = 0 , |
||
const Profile * | rho = 0 , |
||
const Profile * | pitch = 0 , |
||
const Profile * | res = 0 |
||
) | [static] |
References DCREPORTBLOCK_CURRENT_VERSION, DinverCore::ReportWriter::stream(), TRACE, DinverCore::ReportWriter::userBlockHeader(), QGpCoreWave::Profile::writeReport(), QGpCoreWave::MagnetoTelluricFactory::writeReport(), and QGpCoreWave::RefractionFactory::writeReport().
Referenced by DinverDCCore::TargetList2D::writeReport(), and DinverDCCore::TargetList::writeReport().
{ TRACE; // Tag and block version report->userBlockHeader("DISP", DCREPORTBLOCK_CURRENT_VERSION); QDataStream& s=report->stream(); qint64 tableOffset=s.device()->pos(); writeOffsetTable(s); // Save profiles if(vp) { ReportWriter::setCurrentOffset(s, tableOffset); vp->writeReport(s); } if(vs) { ReportWriter::setCurrentOffset(s, tableOffset+8); vs->writeReport(s); } if(rho) { ReportWriter::setCurrentOffset(s, tableOffset+16); rho->writeReport(s); } if(pitch) { ReportWriter::setCurrentOffset(s, tableOffset+24); pitch->writeReport(s); } if(res) { ReportWriter::setCurrentOffset(s, tableOffset+32); res->writeReport(s); } // Surface waves if(tl._dispersionFactory) { ReportWriter::setCurrentOffset(s, tableOffset+40); writeFactory(s, *tl._dispersionFactory); } if(tl._autocorrFactory) { ReportWriter::setCurrentOffset(s, tableOffset+48); writeFactory(s, *tl._autocorrFactory); } if(tl._ellipticityFactory) { ReportWriter::setCurrentOffset(s, tableOffset+56); writeFactory(s, *tl._ellipticityFactory); } // Refraction if(tl._refractionVpFactory) { ReportWriter::setCurrentOffset(s, tableOffset+64); tl._refractionVpFactory->writeReport(s); } if(tl._refractionVsFactory) { ReportWriter::setCurrentOffset(s, tableOffset+72); tl._refractionVsFactory->writeReport(s); } // Magneto-telluric if(tl._magnetoTelluricFactory) { ReportWriter::setCurrentOffset(s, tableOffset+80); tl._magnetoTelluricFactory->writeReport(s); } }
void DinverDCCore::DCReportBlock::write | ( | ReportWriter * | outReport, |
ReportReader * | inReport | ||
) | [static] |
Copy one model from inReport to outReport. inReport must point to the beginning of the user block ("DISP"), after tag and version. The model is appended to outReport.
References DCREPORTBLOCK_CURRENT_VERSION, readProfiles(), QGpCoreWave::Profile::readReport(), QGpCoreWave::MagnetoTelluricFactory::readReport(), QGpCoreWave::RefractionFactory::readReport(), sOut(), DinverCore::ReportReader::stream(), DinverCore::ReportWriter::stream(), TRACE, DinverCore::ReportWriter::userBlockHeader(), DinverCore::ReportReader::userBlockVersion(), QGpCoreWave::Profile::writeReport(), QGpCoreWave::MagnetoTelluricFactory::writeReport(), and QGpCoreWave::RefractionFactory::writeReport().
{ TRACE; int inVersion=inReport->userBlockVersion( "DISP" ); if(inVersion<0) { return; } DCReportBlock dcBlock(inReport->stream()); dcBlock.readProfiles(inVersion); // Tag and block version outReport->userBlockHeader("DISP", DCREPORTBLOCK_CURRENT_VERSION); QDataStream& sOut=outReport->stream(); qint64 tableOffset=sOut.device()->pos(); writeOffsetTable(sOut); // Save profiles for(int i=0;i<5;i++) { if(dcBlock.profile(i)) { Profile p; ReportWriter::setCurrentOffset(sOut, tableOffset + i*8); p.readReport(inReport->stream()); p.writeReport(sOut); } } if(dcBlock.profile(5)) { ReportWriter::setCurrentOffset(sOut, tableOffset+40); writeFactory(sOut, dcBlock, 4); } if(dcBlock.profile(6)) { ReportWriter::setCurrentOffset(sOut, tableOffset+48); int nRings; dcBlock.stream() >> nRings; writeFactory(sOut, dcBlock, 3*nRings); } if(dcBlock.profile(7)) { ReportWriter::setCurrentOffset(sOut, tableOffset+56); writeFactory(sOut, dcBlock, 1); } if(dcBlock.profile(8)) { // Refraction Vp ReportWriter::setCurrentOffset(sOut, tableOffset+64); RefractionFactory f; f.readReport(dcBlock.stream()); f.writeReport(sOut); } if(dcBlock.profile(9)) { // Refraction Vs ReportWriter::setCurrentOffset(sOut, tableOffset+72); RefractionFactory f; f.readReport(dcBlock.stream()); f.writeReport(sOut); } if(dcBlock.profile(10)) { // Magneto-telluric ReportWriter::setCurrentOffset(sOut, tableOffset+80); MagnetoTelluricFactory f; f.readReport(dcBlock.stream()); f.writeReport(sOut); } }
void DinverDCCore::DCReportBlock::writeBeta | ( | ReportWriter * | outReport, |
ReportReader * | inReport | ||
) | [static] |
Compatibility with reports generated by Beta release from June 2006
References DCREPORTBLOCK_CURRENT_VERSION, profile(), readProfiles(), QGpCoreWave::Profile::readReport(), sOut(), DinverCore::ReportReader::stream(), DinverCore::ReportWriter::stream(), stream(), TRACE, DinverCore::ReportWriter::userBlockHeader(), DinverCore::ReportReader::userBlockVersion(), and QGpCoreWave::Profile::writeReport().
{ TRACE; int inVersion=inReport->userBlockVersion( "DISP" ); if(inVersion<0) { return; } DCReportBlock dcBlock(inReport->stream()); dcBlock.readProfiles(inVersion); // Tag and block version outReport->userBlockHeader("DISP", DCREPORTBLOCK_CURRENT_VERSION); QDataStream& sOut=outReport->stream(); qint64 tableOffset=sOut.device()->pos(); writeOffsetTable(sOut); // Save profiles for(int i=0;i<5;i++) { if(dcBlock.profile(i)) { Profile p; ReportWriter::setCurrentOffset(sOut, tableOffset + i*8); p.readReport(inReport->stream()); p.writeReport(sOut); } } if(dcBlock.profile(5)) { ReportWriter::setCurrentOffset(sOut, tableOffset+40); writeFactoryBeta(sOut, dcBlock, 4); } if(dcBlock.profile(6)) { ReportWriter::setCurrentOffset(sOut, tableOffset+48); int nRings; dcBlock.stream() >> nRings; writeFactory(sOut, dcBlock, 3*nRings); } if(dcBlock.profile(7)) { ReportWriter::setCurrentOffset(sOut, tableOffset+56); writeFactory(sOut, dcBlock, 1); } }
void DinverDCCore::DCReportBlock::writeNaViewer | ( | ReportWriter * | outReport, |
CompatInversionReport * | inReport | ||
) | [static] |
Compatibility with reports generated by Na_viewer
References QGpCompatibility::CompatInversionReport::currentDispersion(), QGpCompatibility::CompatInversionReport::currentModel(), DCREPORTBLOCK_CURRENT_VERSION, QGpCoreWave::Seismic1DModel::rhoProfile(), sOut(), DinverCore::ReportWriter::stream(), TRACE, DinverCore::ReportWriter::userBlockHeader(), QGpCoreWave::Seismic1DModel::vpProfile(), QGpCoreWave::Seismic1DModel::vsProfile(), and QGpCoreWave::Profile::writeReport().
{ TRACE; // Tag and block version outReport->userBlockHeader("DISP", DCREPORTBLOCK_CURRENT_VERSION); QDataStream& sOut=outReport->stream(); qint64 tableOffset=sOut.device()->pos(); writeOffsetTable(sOut); // Save profiles Seismic1DModel * m=inReport->currentModel(); ReportWriter::setCurrentOffset(sOut, tableOffset); m->vpProfile().writeReport(sOut); ReportWriter::setCurrentOffset(sOut, tableOffset+8); m->vsProfile().writeReport(sOut); ReportWriter::setCurrentOffset(sOut, tableOffset+16); m->rhoProfile().writeReport(sOut); if(inReport->currentDispersion()) { ReportWriter::setCurrentOffset(sOut, tableOffset+40); writeFactoryNaViewer(sOut, inReport->currentDispersion(), 4); } // Autocorr and ellipticities not implemented }