//------------------------------------------------------------------------------------------------------- // The MIT License (MIT) // // Copyright (c) 2021 Yoshiya Usui // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. //------------------------------------------------------------------------------------------------------- #include #include #include #include #include #include #include "ObservedDataStationNMT2ApparentResistivityAndPhase.h" #include "OutputFiles.h" #include "CommonParameters.h" #include "ResistivityBlock.h" #include "Util.h" // Constructer ObservedDataStationNMT2ApparentResistivityAndPhase::ObservedDataStationNMT2ApparentResistivityAndPhase(): ObservedDataStationNMT2(), m_apparentResistivityXXObserved(NULL), m_apparentResistivityXYObserved(NULL), m_apparentResistivityYXObserved(NULL), m_apparentResistivityYYObserved(NULL), m_PhaseXXObserved(NULL), m_PhaseXYObserved(NULL), m_PhaseYXObserved(NULL), m_PhaseYYObserved(NULL), m_apparentResistivityXXSD(NULL), m_apparentResistivityXYSD(NULL), m_apparentResistivityYXSD(NULL), m_apparentResistivityYYSD(NULL), m_PhaseXXSD(NULL), m_PhaseXYSD(NULL), m_PhaseYXSD(NULL), m_PhaseYYSD(NULL), m_apparentResistivityXXCalculated(NULL), m_apparentResistivityXYCalculated(NULL), m_apparentResistivityYXCalculated(NULL), m_apparentResistivityYYCalculated(NULL), m_PhaseXXCalculated(NULL), m_PhaseXYCalculated(NULL), m_PhaseYXCalculated(NULL), m_PhaseYYCalculated(NULL), m_apparentResistivityXXResidual(NULL), m_apparentResistivityXYResidual(NULL), m_apparentResistivityYXResidual(NULL), m_apparentResistivityYYResidual(NULL), m_PhaseXXResidual(NULL), m_PhaseXYResidual(NULL), m_PhaseYXResidual(NULL), m_PhaseYYResidual(NULL), m_dataIDOfApparentResistivityXX(NULL), m_dataIDOfApparentResistivityXY(NULL), m_dataIDOfApparentResistivityYX(NULL), m_dataIDOfApparentResistivityYY(NULL), m_dataIDOfPhaseXX(NULL), m_dataIDOfPhaseXY(NULL), m_dataIDOfPhaseYX(NULL), m_dataIDOfPhaseYY(NULL) { } // Destructer ObservedDataStationNMT2ApparentResistivityAndPhase::~ObservedDataStationNMT2ApparentResistivityAndPhase(){ if( m_apparentResistivityXXObserved != NULL){ delete[] m_apparentResistivityXXObserved; m_apparentResistivityXXObserved = NULL; } if( m_apparentResistivityXYObserved != NULL){ delete[] m_apparentResistivityXYObserved; m_apparentResistivityXYObserved = NULL; } if( m_apparentResistivityYXObserved != NULL){ delete[] m_apparentResistivityYXObserved; m_apparentResistivityYXObserved = NULL; } if( m_apparentResistivityYYObserved != NULL){ delete[] m_apparentResistivityYYObserved; m_apparentResistivityYYObserved = NULL; } if( m_PhaseXXObserved != NULL){ delete[] m_PhaseXXObserved; m_PhaseXXObserved = NULL; } if( m_PhaseXYObserved != NULL){ delete[] m_PhaseXYObserved; m_PhaseXYObserved = NULL; } if( m_PhaseYXObserved != NULL){ delete[] m_PhaseYXObserved; m_PhaseYXObserved = NULL; } if( m_PhaseYYObserved != NULL){ delete[] m_PhaseYYObserved; m_PhaseYYObserved = NULL; } if( m_apparentResistivityXXSD != NULL){ delete[] m_apparentResistivityXXSD; m_apparentResistivityXXSD = NULL; } if( m_apparentResistivityXYSD != NULL){ delete[] m_apparentResistivityXYSD; m_apparentResistivityXYSD = NULL; } if( m_apparentResistivityYXSD != NULL){ delete[] m_apparentResistivityYXSD; m_apparentResistivityYXSD = NULL; } if( m_apparentResistivityYYSD != NULL){ delete[] m_apparentResistivityYYSD; m_apparentResistivityYYSD = NULL; } if( m_PhaseXXSD != NULL){ delete[] m_PhaseXXSD; m_PhaseXXSD = NULL; } if( m_PhaseXYSD != NULL){ delete[] m_PhaseXYSD; m_PhaseXYSD = NULL; } if( m_PhaseYXSD != NULL){ delete[] m_PhaseYXSD; m_PhaseYXSD = NULL; } if( m_PhaseYYSD != NULL){ delete[] m_PhaseYYSD; m_PhaseYYSD = NULL; } if( m_apparentResistivityXXCalculated != NULL){ delete[] m_apparentResistivityXXCalculated; m_apparentResistivityXXCalculated = NULL; } if( m_apparentResistivityXYCalculated != NULL){ delete[] m_apparentResistivityXYCalculated; m_apparentResistivityXYCalculated = NULL; } if( m_apparentResistivityYXCalculated != NULL){ delete[] m_apparentResistivityYXCalculated; m_apparentResistivityYXCalculated = NULL; } if( m_apparentResistivityYYCalculated != NULL){ delete[] m_apparentResistivityYYCalculated; m_apparentResistivityYYCalculated = NULL; } if( m_PhaseXXCalculated != NULL){ delete[] m_PhaseXXCalculated; m_PhaseXXCalculated = NULL; } if( m_PhaseXYCalculated != NULL){ delete[] m_PhaseXYCalculated; m_PhaseXYCalculated = NULL; } if( m_PhaseYXCalculated != NULL){ delete[] m_PhaseYXCalculated; m_PhaseYXCalculated = NULL; } if( m_PhaseYYCalculated != NULL){ delete[] m_PhaseYYCalculated; m_PhaseYYCalculated = NULL; } if( m_apparentResistivityXXResidual != NULL){ delete[] m_apparentResistivityXXResidual; m_apparentResistivityXXResidual = NULL; } if( m_apparentResistivityXYResidual != NULL){ delete[] m_apparentResistivityXYResidual; m_apparentResistivityXYResidual = NULL; } if( m_apparentResistivityYXResidual != NULL){ delete[] m_apparentResistivityYXResidual; m_apparentResistivityYXResidual = NULL; } if( m_apparentResistivityYYResidual != NULL){ delete[] m_apparentResistivityYYResidual; m_apparentResistivityYYResidual = NULL; } if( m_PhaseXXResidual != NULL){ delete[] m_PhaseXXResidual; m_PhaseXXResidual = NULL; } if( m_PhaseXYResidual != NULL){ delete[] m_PhaseXYResidual; m_PhaseXYResidual = NULL; } if( m_PhaseYXResidual != NULL){ delete[] m_PhaseYXResidual; m_PhaseYXResidual = NULL; } if( m_PhaseYYResidual != NULL){ delete[] m_PhaseYYResidual; m_PhaseYYResidual = NULL; } if( m_dataIDOfApparentResistivityXX != NULL){ delete[] m_dataIDOfApparentResistivityXX; m_dataIDOfApparentResistivityXX = NULL; } if( m_dataIDOfApparentResistivityXY != NULL){ delete[] m_dataIDOfApparentResistivityXY; m_dataIDOfApparentResistivityXY = NULL; } if( m_dataIDOfApparentResistivityYX != NULL){ delete[] m_dataIDOfApparentResistivityYX; m_dataIDOfApparentResistivityYX = NULL; } if( m_dataIDOfApparentResistivityYY != NULL){ delete[] m_dataIDOfApparentResistivityYY; m_dataIDOfApparentResistivityYY = NULL; } if( m_dataIDOfPhaseXX != NULL){ delete[] m_dataIDOfPhaseXX; m_dataIDOfPhaseXX = NULL; } if( m_dataIDOfPhaseXY != NULL){ delete[] m_dataIDOfPhaseXY; m_dataIDOfPhaseXY = NULL; } if( m_dataIDOfPhaseYX != NULL){ delete[] m_dataIDOfPhaseYX; m_dataIDOfPhaseYX = NULL; } if( m_dataIDOfPhaseYY != NULL){ delete[] m_dataIDOfPhaseYY; m_dataIDOfPhaseYY = NULL; } } // Read data from input file void ObservedDataStationNMT2ApparentResistivityAndPhase::inputObservedData( std::ifstream& inFile ){ inFile >> m_stationID; inFile >> m_IDOfMagneticFieldStation; OutputFiles::m_logFile << "# " << std::setw(15) << std::left << m_stationID << std::setw(15) << std::left << m_IDOfMagneticFieldStation << std::endl; double dbuf(0.0); inFile >> dbuf; m_location[0].startPoint.X = dbuf * CommonParameters::convKilometerToMeter; inFile >> dbuf; m_location[0].startPoint.Y = dbuf * CommonParameters::convKilometerToMeter; inFile >> dbuf; m_location[0].endPoint.X = dbuf * CommonParameters::convKilometerToMeter; inFile >> dbuf; m_location[0].endPoint.Y = dbuf * CommonParameters::convKilometerToMeter; inFile >> dbuf; m_location[1].startPoint.X = dbuf * CommonParameters::convKilometerToMeter; inFile >> dbuf; m_location[1].startPoint.Y = dbuf * CommonParameters::convKilometerToMeter; inFile >> dbuf; m_location[1].endPoint.X = dbuf * CommonParameters::convKilometerToMeter; inFile >> dbuf; m_location[1].endPoint.Y = dbuf * CommonParameters::convKilometerToMeter; inFile >> m_numOfFrequency; const int nFreq = m_numOfFrequency; if( nFreq > 0 ){ m_freq = new double[nFreq]; m_apparentResistivityXXObserved = new double[nFreq]; m_apparentResistivityXYObserved = new double[nFreq]; m_apparentResistivityYXObserved = new double[nFreq]; m_apparentResistivityYYObserved = new double[nFreq]; m_PhaseXXObserved = new double[nFreq]; m_PhaseXYObserved = new double[nFreq]; m_PhaseYXObserved = new double[nFreq]; m_PhaseYYObserved = new double[nFreq]; m_apparentResistivityXXSD = new double[nFreq]; m_apparentResistivityXYSD = new double[nFreq]; m_apparentResistivityYXSD = new double[nFreq]; m_apparentResistivityYYSD = new double[nFreq]; m_PhaseXXSD = new double[nFreq]; m_PhaseXYSD = new double[nFreq]; m_PhaseYXSD = new double[nFreq]; m_PhaseYYSD = new double[nFreq]; // Their arrays are used in some functions of the base class m_ZxxObserved = new std::complex[nFreq]; m_ZxyObserved = new std::complex[nFreq]; m_ZyxObserved = new std::complex[nFreq]; m_ZyyObserved = new std::complex[nFreq]; m_ZxxSD = new CommonParameters::DoubleComplexValues[nFreq]; m_ZxySD = new CommonParameters::DoubleComplexValues[nFreq]; m_ZyxSD = new CommonParameters::DoubleComplexValues[nFreq]; m_ZyySD = new CommonParameters::DoubleComplexValues[nFreq]; for( int i = 0; i < nFreq; ++i ){ inFile >> m_freq[i]; double dbuf1(0.0); double dbuf2(0.0); inFile >> dbuf1 >> dbuf2; m_apparentResistivityXXObserved[i] = dbuf1; m_PhaseXXObserved[i] = dbuf2; inFile >> dbuf1 >> dbuf2; m_apparentResistivityXYObserved[i] = dbuf1; m_PhaseXYObserved[i] = dbuf2; inFile >> dbuf1 >> dbuf2; m_apparentResistivityYXObserved[i] = dbuf1; m_PhaseYXObserved[i] = dbuf2; inFile >> dbuf1 >> dbuf2; m_apparentResistivityYYObserved[i] = dbuf1; m_PhaseYYObserved[i] = dbuf2; inFile >> dbuf1 >> dbuf2; m_apparentResistivityXXSD[i] = dbuf1; m_PhaseXXSD[i] = dbuf2; inFile >> dbuf1 >> dbuf2; m_apparentResistivityXYSD[i] = dbuf1; m_PhaseXYSD[i] = dbuf2; inFile >> dbuf1 >> dbuf2; m_apparentResistivityYXSD[i] = dbuf1; m_PhaseYXSD[i] = dbuf2; inFile >> dbuf1 >> dbuf2; m_apparentResistivityYYSD[i] = dbuf1; m_PhaseYYSD[i] = dbuf2; if( m_apparentResistivityXXSD[i] > 0.0 && m_PhaseXXSD[i] > 0.0 ){ calcImpedanceTensorComponentFromApparentResistivityAndPhase( m_freq[i], m_apparentResistivityXXObserved[i], m_apparentResistivityXXSD[i], m_PhaseXXObserved[i], m_PhaseXXSD[i], m_ZxxObserved[i], m_ZxxSD[i] ); }else{ m_ZxxObserved[i] = std::complex(0.0, 0.0); m_ZxxSD[i].realPart = 1.0e10; m_ZxxSD[i].imagPart = 1.0e10; } if( m_apparentResistivityXYSD[i] > 0.0 && m_PhaseXYSD[i] > 0.0 ){ calcImpedanceTensorComponentFromApparentResistivityAndPhase( m_freq[i], m_apparentResistivityXYObserved[i], m_apparentResistivityXYSD[i], m_PhaseXYObserved[i], m_PhaseXYSD[i], m_ZxyObserved[i], m_ZxySD[i] ); }else{ m_ZxyObserved[i] = std::complex(0.0, 0.0); m_ZxySD[i].realPart = 1.0e10; m_ZxySD[i].imagPart = 1.0e10; } if( m_apparentResistivityYXSD[i] > 0.0 && m_PhaseYXSD[i] > 0.0 ){ calcImpedanceTensorComponentFromApparentResistivityAndPhase( m_freq[i], m_apparentResistivityYXObserved[i], m_apparentResistivityYXSD[i], m_PhaseYXObserved[i], m_PhaseYXSD[i], m_ZyxObserved[i], m_ZyxSD[i] ); }else{ m_ZyxObserved[i] = std::complex(0.0, 0.0); m_ZyxSD[i].realPart = 1.0e10; m_ZyxSD[i].imagPart = 1.0e10; } if( m_apparentResistivityYYSD[i] > 0.0 && m_PhaseYYSD[i] > 0.0 ){ calcImpedanceTensorComponentFromApparentResistivityAndPhase( m_freq[i], m_apparentResistivityYYObserved[i], m_apparentResistivityYYSD[i], m_PhaseYYObserved[i], m_PhaseYYSD[i], m_ZyyObserved[i], m_ZyySD[i] ); }else{ m_ZyyObserved[i] = std::complex(0.0, 0.0); m_ZyySD[i].realPart = 1.0e10; m_ZyySD[i].imagPart = 1.0e10; } } } } // Calulate Impedance tensor void ObservedDataStationNMT2ApparentResistivityAndPhase::calculateApparentResistivityAndPhase( const double freq, const ObservedDataStationPoint* const ptrStationOfMagneticField, int& icount ){ const int freqIDThisPEInSta = getFreqIDsAmongThisPE( freq ); if( freqIDThisPEInSta < 0 ){// Specified frequency is not the ones calculated by this PE in this station return; } const int freqIDGlobalInSta = m_freqIDsAmongThisStationCalculatedByThisPE[ freqIDThisPEInSta ]; ObservedDataStationNMT2::calculateImpedanceTensor( freq, ptrStationOfMagneticField, icount ); const double omega = 2.0 * CommonParameters::PI * freq; const std::complex Zxx = m_ZxxCalculated[freqIDThisPEInSta]; const std::complex Zxy = m_ZxyCalculated[freqIDThisPEInSta]; const std::complex Zyx = m_ZyxCalculated[freqIDThisPEInSta]; const std::complex Zyy = m_ZyyCalculated[freqIDThisPEInSta]; m_apparentResistivityXXCalculated[freqIDThisPEInSta] = std::norm( Zxx ) / ( omega * CommonParameters::mu ); m_apparentResistivityXYCalculated[freqIDThisPEInSta] = std::norm( Zxy ) / ( omega * CommonParameters::mu ); m_apparentResistivityYXCalculated[freqIDThisPEInSta] = std::norm( Zyx ) / ( omega * CommonParameters::mu ); m_apparentResistivityYYCalculated[freqIDThisPEInSta] = std::norm( Zyy ) / ( omega * CommonParameters::mu ); m_PhaseXXCalculated[freqIDThisPEInSta] = CommonParameters::rad2deg * atan2( Zxx.imag(), Zxx.real() ); m_PhaseXYCalculated[freqIDThisPEInSta] = CommonParameters::rad2deg * atan2( Zxy.imag(), Zxy.real() ); m_PhaseYXCalculated[freqIDThisPEInSta] = CommonParameters::rad2deg * atan2( Zyx.imag(), Zyx.real() ); m_PhaseYYCalculated[freqIDThisPEInSta] = CommonParameters::rad2deg * atan2( Zyy.imag(), Zyy.real() ); // Zero clear m_apparentResistivityXXResidual[freqIDThisPEInSta] = 0.0; m_apparentResistivityXYResidual[freqIDThisPEInSta] = 0.0; m_apparentResistivityYXResidual[freqIDThisPEInSta] = 0.0; m_apparentResistivityYYResidual[freqIDThisPEInSta] = 0.0; m_PhaseXXResidual[freqIDThisPEInSta] = 0.0; m_PhaseXYResidual[freqIDThisPEInSta] = 0.0; m_PhaseYXResidual[freqIDThisPEInSta] = 0.0; m_PhaseYYResidual[freqIDThisPEInSta] = 0.0; if( m_apparentResistivityXXSD[freqIDGlobalInSta] > 0.0 ){ m_apparentResistivityXXResidual[freqIDThisPEInSta] = log10( m_apparentResistivityXXObserved[freqIDGlobalInSta] / m_apparentResistivityXXCalculated[freqIDThisPEInSta] ) / calcLog10ErrorOfApparentResistivity( freqIDGlobalInSta, ObservedDataStationNMT2::XX ); } if( m_apparentResistivityXYSD[freqIDGlobalInSta] > 0.0 ){ m_apparentResistivityXYResidual[freqIDThisPEInSta] = log10( m_apparentResistivityXYObserved[freqIDGlobalInSta] / m_apparentResistivityXYCalculated[freqIDThisPEInSta] ) / calcLog10ErrorOfApparentResistivity( freqIDGlobalInSta, ObservedDataStationNMT2::XY ); } if( m_apparentResistivityYXSD[freqIDGlobalInSta] > 0.0 ){ m_apparentResistivityYXResidual[freqIDThisPEInSta] = log10( m_apparentResistivityYXObserved[freqIDGlobalInSta] / m_apparentResistivityYXCalculated[freqIDThisPEInSta] ) / calcLog10ErrorOfApparentResistivity( freqIDGlobalInSta, ObservedDataStationNMT2::YX ); } if( m_apparentResistivityYYSD[freqIDGlobalInSta] > 0.0 ){ m_apparentResistivityYYResidual[freqIDThisPEInSta] = log10( m_apparentResistivityYYObserved[freqIDGlobalInSta] / m_apparentResistivityYYCalculated[freqIDThisPEInSta] ) / calcLog10ErrorOfApparentResistivity( freqIDGlobalInSta, ObservedDataStationNMT2::YY ); } if( m_PhaseXXSD[freqIDGlobalInSta] > 0.0 ){ double phaseObs = m_PhaseXXObserved[freqIDGlobalInSta]; if( Zxx.real() < 0.0 && m_ZxxObserved[freqIDGlobalInSta].real() < 0.0 && Zxx.imag() * m_ZxxObserved[freqIDGlobalInSta].imag() < 0.0 ){ if( Zxx.imag() > 0.0 ){ phaseObs += 360.0; }else{ phaseObs -= 360.0; } } m_PhaseXXResidual[freqIDThisPEInSta] = ( phaseObs - m_PhaseXXCalculated[freqIDThisPEInSta] ) / m_PhaseXXSD[freqIDGlobalInSta]; } if( m_PhaseXYSD[freqIDGlobalInSta] > 0.0 ){ double phaseObs = m_PhaseXYObserved[freqIDGlobalInSta]; if( Zxy.real() < 0.0 && m_ZxyObserved[freqIDGlobalInSta].real() < 0.0 && Zxy.imag() * m_ZxyObserved[freqIDGlobalInSta].imag() < 0.0 ){ if( Zxy.imag() > 0.0 ){ phaseObs += 360.0; }else{ phaseObs -= 360.0; } } m_PhaseXYResidual[freqIDThisPEInSta] = ( phaseObs - m_PhaseXYCalculated[freqIDThisPEInSta] ) / m_PhaseXYSD[freqIDGlobalInSta]; } if( m_PhaseYXSD[freqIDGlobalInSta] > 0.0 ){ double phaseObs = m_PhaseYXObserved[freqIDGlobalInSta]; if( Zyx.real() < 0.0 && m_ZyxObserved[freqIDGlobalInSta].real() < 0.0 && Zyx.imag() * m_ZyxObserved[freqIDGlobalInSta].imag() < 0.0 ){ if( Zyx.imag() > 0.0 ){ phaseObs += 360.0; }else{ phaseObs -= 360.0; } } m_PhaseYXResidual[freqIDThisPEInSta] = ( phaseObs - m_PhaseYXCalculated[freqIDThisPEInSta] ) / m_PhaseYXSD[freqIDGlobalInSta]; } if( m_PhaseYYSD[freqIDGlobalInSta] > 0.0 ){ double phaseObs = m_PhaseYYObserved[freqIDGlobalInSta]; if( Zyy.real() < 0.0 && m_ZyyObserved[freqIDGlobalInSta].real() < 0.0 && Zyy.imag() * m_ZyyObserved[freqIDGlobalInSta].imag() < 0.0 ){ if( Zyy.imag() > 0.0 ){ phaseObs += 360.0; }else{ phaseObs -= 360.0; } } m_PhaseYYResidual[freqIDThisPEInSta] = ( phaseObs - m_PhaseYYCalculated[freqIDThisPEInSta] ) / m_PhaseYYSD[freqIDGlobalInSta]; } // Share data ID with the ones for impedance tensors m_dataIDOfApparentResistivityXX[freqIDThisPEInSta] = m_dataIDOfZxx[freqIDThisPEInSta].realPart; m_dataIDOfApparentResistivityXY[freqIDThisPEInSta] = m_dataIDOfZxy[freqIDThisPEInSta].realPart; m_dataIDOfApparentResistivityYX[freqIDThisPEInSta] = m_dataIDOfZyx[freqIDThisPEInSta].realPart; m_dataIDOfApparentResistivityYY[freqIDThisPEInSta] = m_dataIDOfZyy[freqIDThisPEInSta].realPart; m_dataIDOfPhaseXX[freqIDThisPEInSta] = m_dataIDOfZxx[freqIDThisPEInSta].imagPart; m_dataIDOfPhaseXY[freqIDThisPEInSta] = m_dataIDOfZxy[freqIDThisPEInSta].imagPart; m_dataIDOfPhaseYX[freqIDThisPEInSta] = m_dataIDOfZyx[freqIDThisPEInSta].imagPart; m_dataIDOfPhaseYY[freqIDThisPEInSta] = m_dataIDOfZyy[freqIDThisPEInSta].imagPart; } // Initialize apparent resistivitu, phase and their errors void ObservedDataStationNMT2ApparentResistivityAndPhase::initializeApparentResistivityPhaseAndErrors(){ ObservedDataStationNMT2::initializeImpedanceTensorsAndErrors(); //for( int i = 0; i < m_numOfFrequency; ++i ){ for( int i = 0; i < m_numOfFreqCalculatedByThisStaAndPE; ++i ){ m_apparentResistivityXXCalculated[i] = 0.0; m_apparentResistivityXYCalculated[i] = 0.0; m_apparentResistivityYXCalculated[i] = 0.0; m_apparentResistivityYYCalculated[i] = 0.0; m_PhaseXXCalculated[i] = 0.0; m_PhaseXYCalculated[i] = 0.0; m_PhaseYXCalculated[i] = 0.0; m_PhaseYYCalculated[i] = 0.0; m_apparentResistivityXXResidual[i] = 0.0; m_apparentResistivityXYResidual[i] = 0.0; m_apparentResistivityYXResidual[i] = 0.0; m_apparentResistivityYYResidual[i] = 0.0; m_PhaseXXResidual[i] = 0.0; m_PhaseXYResidual[i] = 0.0; m_PhaseYXResidual[i] = 0.0; m_PhaseYYResidual[i] = 0.0; } } // Allocate memory for the calculated Impedance and errors void ObservedDataStationNMT2ApparentResistivityAndPhase::allocateMemoryForCalculatedValues(){ ObservedDataStationNMT2::allocateMemoryForCalculatedValues(); if( m_apparentResistivityXXCalculated != NULL){ delete[] m_apparentResistivityXXCalculated; m_apparentResistivityXXCalculated = NULL; } if( m_apparentResistivityXYCalculated != NULL){ delete[] m_apparentResistivityXYCalculated; m_apparentResistivityXYCalculated = NULL; } if( m_apparentResistivityYXCalculated != NULL){ delete[] m_apparentResistivityYXCalculated; m_apparentResistivityYXCalculated = NULL; } if( m_apparentResistivityYYCalculated != NULL){ delete[] m_apparentResistivityYYCalculated; m_apparentResistivityYYCalculated = NULL; } if( m_PhaseXXCalculated != NULL){ delete[] m_PhaseXXCalculated; m_PhaseXXCalculated = NULL; } if( m_PhaseXYCalculated != NULL){ delete[] m_PhaseXYCalculated; m_PhaseXYCalculated = NULL; } if( m_PhaseYXCalculated != NULL){ delete[] m_PhaseYXCalculated; m_PhaseYXCalculated = NULL; } if( m_PhaseYYCalculated != NULL){ delete[] m_PhaseYYCalculated; m_PhaseYYCalculated = NULL; } if( m_apparentResistivityXXResidual != NULL){ delete[] m_apparentResistivityXXResidual; m_apparentResistivityXXResidual = NULL; } if( m_apparentResistivityXYResidual != NULL){ delete[] m_apparentResistivityXYResidual; m_apparentResistivityXYResidual = NULL; } if( m_apparentResistivityYXResidual != NULL){ delete[] m_apparentResistivityYXResidual; m_apparentResistivityYXResidual = NULL; } if( m_apparentResistivityYYResidual != NULL){ delete[] m_apparentResistivityYYResidual; m_apparentResistivityYYResidual = NULL; } if( m_PhaseXXResidual != NULL){ delete[] m_PhaseXXResidual; m_PhaseXXResidual = NULL; } if( m_PhaseXYResidual != NULL){ delete[] m_PhaseXYResidual; m_PhaseXYResidual = NULL; } if( m_PhaseYXResidual != NULL){ delete[] m_PhaseYXResidual; m_PhaseYXResidual = NULL; } if( m_PhaseYYResidual != NULL){ delete[] m_PhaseYYResidual; m_PhaseYYResidual = NULL; } if( m_dataIDOfApparentResistivityXX != NULL){ delete[] m_dataIDOfApparentResistivityXX; m_dataIDOfApparentResistivityXX = NULL; } if( m_dataIDOfApparentResistivityXY != NULL){ delete[] m_dataIDOfApparentResistivityXY; m_dataIDOfApparentResistivityXY = NULL; } if( m_dataIDOfApparentResistivityYX != NULL){ delete[] m_dataIDOfApparentResistivityYX; m_dataIDOfApparentResistivityYX = NULL; } if( m_dataIDOfApparentResistivityYY != NULL){ delete[] m_dataIDOfApparentResistivityYY; m_dataIDOfApparentResistivityYY = NULL; } if( m_dataIDOfPhaseXX != NULL){ delete[] m_dataIDOfPhaseXX; m_dataIDOfPhaseXX = NULL; } if( m_dataIDOfPhaseXY != NULL){ delete[] m_dataIDOfPhaseXY; m_dataIDOfPhaseXY = NULL; } if( m_dataIDOfPhaseYX != NULL){ delete[] m_dataIDOfPhaseYX; m_dataIDOfPhaseYX = NULL; } if( m_dataIDOfPhaseYY != NULL){ delete[] m_dataIDOfPhaseYY; m_dataIDOfPhaseYY = NULL; } if( m_numOfFreqCalculatedByThisStaAndPE > 0 ){ // If total number of frequencies calculated by this PE is not more than zero, do not allocate memory m_apparentResistivityXXCalculated = new double[m_numOfFreqCalculatedByThisStaAndPE]; m_apparentResistivityXYCalculated = new double[m_numOfFreqCalculatedByThisStaAndPE]; m_apparentResistivityYXCalculated = new double[m_numOfFreqCalculatedByThisStaAndPE]; m_apparentResistivityYYCalculated = new double[m_numOfFreqCalculatedByThisStaAndPE]; m_PhaseXXCalculated = new double[m_numOfFreqCalculatedByThisStaAndPE]; m_PhaseXYCalculated = new double[m_numOfFreqCalculatedByThisStaAndPE]; m_PhaseYXCalculated = new double[m_numOfFreqCalculatedByThisStaAndPE]; m_PhaseYYCalculated = new double[m_numOfFreqCalculatedByThisStaAndPE]; m_apparentResistivityXXResidual = new double[m_numOfFreqCalculatedByThisStaAndPE]; m_apparentResistivityXYResidual = new double[m_numOfFreqCalculatedByThisStaAndPE]; m_apparentResistivityYXResidual = new double[m_numOfFreqCalculatedByThisStaAndPE]; m_apparentResistivityYYResidual = new double[m_numOfFreqCalculatedByThisStaAndPE]; m_PhaseXXResidual = new double[m_numOfFreqCalculatedByThisStaAndPE]; m_PhaseXYResidual = new double[m_numOfFreqCalculatedByThisStaAndPE]; m_PhaseYXResidual = new double[m_numOfFreqCalculatedByThisStaAndPE]; m_PhaseYYResidual = new double[m_numOfFreqCalculatedByThisStaAndPE]; m_dataIDOfApparentResistivityXX = new int[m_numOfFreqCalculatedByThisStaAndPE]; m_dataIDOfApparentResistivityXY = new int[m_numOfFreqCalculatedByThisStaAndPE]; m_dataIDOfApparentResistivityYX = new int[m_numOfFreqCalculatedByThisStaAndPE]; m_dataIDOfApparentResistivityYY = new int[m_numOfFreqCalculatedByThisStaAndPE]; m_dataIDOfPhaseXX = new int[m_numOfFreqCalculatedByThisStaAndPE]; m_dataIDOfPhaseXY = new int[m_numOfFreqCalculatedByThisStaAndPE]; m_dataIDOfPhaseYX = new int[m_numOfFreqCalculatedByThisStaAndPE]; m_dataIDOfPhaseYY = new int[m_numOfFreqCalculatedByThisStaAndPE]; // Initialize for( int i = 0; i < m_numOfFreqCalculatedByThisStaAndPE; ++i ){ m_apparentResistivityXXCalculated[i] = 0.0; m_apparentResistivityXYCalculated[i] = 0.0; m_apparentResistivityYXCalculated[i] = 0.0; m_apparentResistivityYYCalculated[i] = 0.0; m_PhaseXXCalculated[i] = 0.0; m_PhaseXYCalculated[i] = 0.0; m_PhaseYXCalculated[i] = 0.0; m_PhaseYYCalculated[i] = 0.0; m_apparentResistivityXXResidual[i] = 0.0; m_apparentResistivityXYResidual[i] = 0.0; m_apparentResistivityYXResidual[i] = 0.0; m_apparentResistivityYYResidual[i] = 0.0; m_PhaseXXResidual[i] = 0.0; m_PhaseXYResidual[i] = 0.0; m_PhaseYXResidual[i] = 0.0; m_PhaseYYResidual[i] = 0.0; m_dataIDOfApparentResistivityXX[i] = -1; m_dataIDOfApparentResistivityXY[i] = -1; m_dataIDOfApparentResistivityYX[i] = -1; m_dataIDOfApparentResistivityYY[i] = -1; m_dataIDOfPhaseXX[i] = -1; m_dataIDOfPhaseXY[i] = -1; m_dataIDOfPhaseYX[i] = -1; m_dataIDOfPhaseYY[i] = -1; } } } // Output calculated Impedance tensors void ObservedDataStationNMT2ApparentResistivityAndPhase::outputCalculatedValues() const{ //#ifdef _DEBUG_WRITE // ObservedDataStationNMT2::outputCalculatedValues(); //#endif const bool useImpedanceTensorInsteadOfPhase = ( AnalysisControl::getInstance()->getApparentResistivityAndPhaseTreatmentOption() == AnalysisControl::USE_Z_IF_SIGN_OF_RE_Z_DIFFER ); int icount(0); for( std::vector::const_iterator itr = m_freqIDsAmongThisStationCalculatedByThisPE.begin(); itr != m_freqIDsAmongThisStationCalculatedByThisPE.end(); ++itr ){ fprintf( OutputFiles::m_csvFile, "%10d, %15.6e, %15.6e, %15.6e, %15.6e, %15.6e, %15.6e, %15.6e, %15.6e, %15.6e,", m_stationID, m_freq[*itr], m_apparentResistivityXXCalculated[icount], m_PhaseXXCalculated[icount], m_apparentResistivityXYCalculated[icount], m_PhaseXYCalculated[icount], m_apparentResistivityYXCalculated[icount], m_PhaseYXCalculated[icount], m_apparentResistivityYYCalculated[icount], m_PhaseYYCalculated[icount] ); fprintf( OutputFiles::m_csvFile, " %15.6e, %15.6e, %15.6e, %15.6e, %15.6e, %15.6e, %15.6e, %15.6e,", m_apparentResistivityXXResidual[icount], m_PhaseXXResidual[icount], m_apparentResistivityXYResidual[icount], m_PhaseXYResidual[icount], m_apparentResistivityYXResidual[icount], m_PhaseYXResidual[icount], m_apparentResistivityYYResidual[icount], m_PhaseYYResidual[icount] ); fprintf( OutputFiles::m_csvFile, " %15.6e, %15.6e, %15.6e, %15.6e, %15.6e, %15.6e, %15.6e, %15.6e,", m_apparentResistivityXXObserved[*itr], m_PhaseXXObserved[*itr], m_apparentResistivityXYObserved[*itr], m_PhaseXYObserved[*itr], m_apparentResistivityYXObserved[*itr], m_PhaseYXObserved[*itr], m_apparentResistivityYYObserved[*itr], m_PhaseYYObserved[*itr] ); fprintf( OutputFiles::m_csvFile, " %15.6e, %15.6e, %15.6e, %15.6e, %15.6e, %15.6e, %15.6e, %15.6e,", m_apparentResistivityXXSD[*itr], m_PhaseXXSD[*itr], m_apparentResistivityXYSD[*itr], m_PhaseXYSD[*itr], m_apparentResistivityYXSD[*itr], m_PhaseYXSD[*itr], m_apparentResistivityYYSD[*itr], m_PhaseYYSD[*itr] ); if(useImpedanceTensorInsteadOfPhase){ fprintf( OutputFiles::m_csvFile, "%3s,%3s,%3s,%3s,\n", isUsedImpedanceTensorFromFreqIDs( icount, ObservedDataStationNMT2::XX ) ? "*" : "", isUsedImpedanceTensorFromFreqIDs( icount, ObservedDataStationNMT2::XY ) ? "*" : "", isUsedImpedanceTensorFromFreqIDs( icount, ObservedDataStationNMT2::YX ) ? "*" : "", isUsedImpedanceTensorFromFreqIDs( icount, ObservedDataStationNMT2::YY ) ? "*" : "" ); }else{ fprintf( OutputFiles::m_csvFile, "\n"); } ++icount; } } // Calulate sensitivity matrix of apparent resistivity and phase void ObservedDataStationNMT2ApparentResistivityAndPhase::calculateSensitivityMatrix( const double freq, const int nModel, const ObservedDataStationPoint* const ptrStationOfMagneticField, const std::complex* const derivativesOfEMFieldExPol, const std::complex* const derivativesOfEMFieldEyPol, double* const sensitivityMatrix ) const{ const int freqIDThisPEInSta = getFreqIDsAmongThisPE( freq ); if( freqIDThisPEInSta < 0 ){// Specified frequency is not the ones calculated by this PE in this station return; } const int freqIDGlobalInSta = m_freqIDsAmongThisStationCalculatedByThisPE[ freqIDThisPEInSta ]; ObservedDataStationNMT2::calculateSensitivityMatrix( freq, nModel, ptrStationOfMagneticField, derivativesOfEMFieldExPol, derivativesOfEMFieldEyPol, sensitivityMatrix, true ); const std::complex Zxx = m_ZxxCalculated[freqIDThisPEInSta]; const std::complex Zxy = m_ZxyCalculated[freqIDThisPEInSta]; const std::complex Zyx = m_ZyxCalculated[freqIDThisPEInSta]; const std::complex Zyy = m_ZyyCalculated[freqIDThisPEInSta]; const double eps = std::max(std::max(std::norm(Zxx), std::norm(Zxy)), std::max(std::norm(Zyx), std::norm(Zyy))) * 1.0e-20; const bool useImpedanceTensorInsteadOfPhase = ( AnalysisControl::getInstance()->getApparentResistivityAndPhaseTreatmentOption() == AnalysisControl::USE_Z_IF_SIGN_OF_RE_Z_DIFFER ); const double ln10 = log(10.0); const long long nBlkNotFixed = static_cast(( ResistivityBlock::getInstance() )->getNumResistivityBlockNotFixed()); for( long long imdl = 0; imdl < nBlkNotFixed; ++imdl ){ const double dZxxRe = sensitivityMatrix[ static_cast(nModel) * static_cast(m_dataIDOfZxx[freqIDThisPEInSta].realPart) + imdl ]; const double dZxyRe = sensitivityMatrix[ static_cast(nModel) * static_cast(m_dataIDOfZxy[freqIDThisPEInSta].realPart) + imdl ]; const double dZyxRe = sensitivityMatrix[ static_cast(nModel) * static_cast(m_dataIDOfZyx[freqIDThisPEInSta].realPart) + imdl ]; const double dZyyRe = sensitivityMatrix[ static_cast(nModel) * static_cast(m_dataIDOfZyy[freqIDThisPEInSta].realPart) + imdl ]; const double dZxxIm = sensitivityMatrix[ static_cast(nModel) * static_cast(m_dataIDOfZxx[freqIDThisPEInSta].imagPart) + imdl ]; const double dZxyIm = sensitivityMatrix[ static_cast(nModel) * static_cast(m_dataIDOfZxy[freqIDThisPEInSta].imagPart) + imdl ]; const double dZyxIm = sensitivityMatrix[ static_cast(nModel) * static_cast(m_dataIDOfZyx[freqIDThisPEInSta].imagPart) + imdl ]; const double dZyyIm = sensitivityMatrix[ static_cast(nModel) * static_cast(m_dataIDOfZyy[freqIDThisPEInSta].imagPart) + imdl ]; // Zero clear sensitivityMatrix[ static_cast(nModel) * static_cast(m_dataIDOfApparentResistivityXX[freqIDThisPEInSta]) + imdl ] = 0.0; sensitivityMatrix[ static_cast(nModel) * static_cast(m_dataIDOfApparentResistivityXY[freqIDThisPEInSta]) + imdl ] = 0.0; sensitivityMatrix[ static_cast(nModel) * static_cast(m_dataIDOfApparentResistivityYX[freqIDThisPEInSta]) + imdl ] = 0.0; sensitivityMatrix[ static_cast(nModel) * static_cast(m_dataIDOfApparentResistivityYY[freqIDThisPEInSta]) + imdl ] = 0.0; sensitivityMatrix[ static_cast(nModel) * static_cast(m_dataIDOfPhaseXX[freqIDThisPEInSta]) + imdl ] = 0.0; sensitivityMatrix[ static_cast(nModel) * static_cast(m_dataIDOfPhaseXY[freqIDThisPEInSta]) + imdl ] = 0.0; sensitivityMatrix[ static_cast(nModel) * static_cast(m_dataIDOfPhaseYX[freqIDThisPEInSta]) + imdl ] = 0.0; sensitivityMatrix[ static_cast(nModel) * static_cast(m_dataIDOfPhaseYY[freqIDThisPEInSta]) + imdl ] = 0.0; // Sensitivity is kept to be zero if corresponding error is negative if( m_apparentResistivityXXSD[freqIDGlobalInSta] > 0.0 ){ if( useImpedanceTensorInsteadOfPhase && isUsedImpedanceTensorFromFreqIDs( freqIDThisPEInSta, ObservedDataStationNMT2::XX ) ){ sensitivityMatrix[ static_cast(nModel) * static_cast(m_dataIDOfApparentResistivityXX[freqIDThisPEInSta]) + imdl ] = dZxxRe / m_ZxxSD[freqIDGlobalInSta].realPart; }else{ sensitivityMatrix[ static_cast(nModel) * static_cast(m_dataIDOfApparentResistivityXX[freqIDThisPEInSta]) + imdl ] = 2.0 / ln10 / std::max( std::norm(Zxx), eps ) * ( Zxx.real() * dZxxRe + Zxx.imag() * dZxxIm ) / calcLog10ErrorOfApparentResistivity( freqIDGlobalInSta, ObservedDataStationNMT2::XX ); } } if( m_apparentResistivityXYSD[freqIDGlobalInSta] > 0.0 ){ if( useImpedanceTensorInsteadOfPhase && isUsedImpedanceTensorFromFreqIDs( freqIDThisPEInSta, ObservedDataStationNMT2::XY ) ){ sensitivityMatrix[ static_cast(nModel) * static_cast(m_dataIDOfApparentResistivityXY[freqIDThisPEInSta]) + imdl ] = dZxyRe / m_ZxySD[freqIDGlobalInSta].realPart; }else{ sensitivityMatrix[ static_cast(nModel) * static_cast(m_dataIDOfApparentResistivityXY[freqIDThisPEInSta]) + imdl ] = 2.0 / ln10 / std::max( std::norm(Zxy), eps ) * ( Zxy.real() * dZxyRe + Zxy.imag() * dZxyIm ) / calcLog10ErrorOfApparentResistivity( freqIDGlobalInSta, ObservedDataStationNMT2::XY ); } } if( m_apparentResistivityYXSD[freqIDGlobalInSta] > 0.0 ){ if( useImpedanceTensorInsteadOfPhase && isUsedImpedanceTensorFromFreqIDs( freqIDThisPEInSta, ObservedDataStationNMT2::YX ) ){ sensitivityMatrix[ static_cast(nModel) * static_cast(m_dataIDOfApparentResistivityYX[freqIDThisPEInSta]) + imdl ] = dZyxRe / m_ZyxSD[freqIDGlobalInSta].realPart; }else{ sensitivityMatrix[ static_cast(nModel) * static_cast(m_dataIDOfApparentResistivityYX[freqIDThisPEInSta]) + imdl ] = 2.0 / ln10 / std::max( std::norm(Zyx), eps ) * ( Zyx.real() * dZyxRe + Zyx.imag() * dZyxIm ) / calcLog10ErrorOfApparentResistivity( freqIDGlobalInSta, ObservedDataStationNMT2::YX ); } } if( m_apparentResistivityYYSD[freqIDGlobalInSta] > 0.0 ){ if( useImpedanceTensorInsteadOfPhase && isUsedImpedanceTensorFromFreqIDs( freqIDThisPEInSta, ObservedDataStationNMT2::YY ) ){ sensitivityMatrix[ static_cast(nModel) * static_cast(m_dataIDOfApparentResistivityYY[freqIDThisPEInSta]) + imdl ] = dZyyRe / m_ZyySD[freqIDGlobalInSta].realPart; }else{ sensitivityMatrix[ static_cast(nModel) * static_cast(m_dataIDOfApparentResistivityYY[freqIDThisPEInSta]) + imdl ] = 2.0 / ln10 / std::max( std::norm(Zyy), eps ) * ( Zyy.real() * dZyyRe + Zyy.imag() * dZyyIm ) / calcLog10ErrorOfApparentResistivity( freqIDGlobalInSta, ObservedDataStationNMT2::YY ); } } if( m_PhaseXXSD[freqIDGlobalInSta] > 0.0 ){ if( useImpedanceTensorInsteadOfPhase && isUsedImpedanceTensorFromFreqIDs( freqIDThisPEInSta, ObservedDataStationNMT2::XX ) ){ sensitivityMatrix[ static_cast(nModel) * static_cast(m_dataIDOfPhaseXX[freqIDThisPEInSta]) + imdl ] = dZxxIm / m_ZxxSD[freqIDGlobalInSta].imagPart; }else{ sensitivityMatrix[ static_cast(nModel) * static_cast(m_dataIDOfPhaseXX[freqIDThisPEInSta]) + imdl ] = CommonParameters::rad2deg / std::max( std::norm(Zxx), eps ) * ( Zxx.real() * dZxxIm - Zxx.imag() * dZxxRe ) / m_PhaseXXSD[freqIDGlobalInSta]; } } if( m_PhaseXYSD[freqIDGlobalInSta] > 0.0 ){ if( useImpedanceTensorInsteadOfPhase && isUsedImpedanceTensorFromFreqIDs( freqIDThisPEInSta, ObservedDataStationNMT2::XY ) ){ sensitivityMatrix[ static_cast(nModel) * static_cast(m_dataIDOfPhaseXY[freqIDThisPEInSta]) + imdl ] = dZxyIm / m_ZxySD[freqIDGlobalInSta].imagPart; }else{ sensitivityMatrix[ static_cast(nModel) * static_cast(m_dataIDOfPhaseXY[freqIDThisPEInSta]) + imdl ] = CommonParameters::rad2deg / std::max( std::norm(Zxy), eps ) * ( Zxy.real() * dZxyIm - Zxy.imag() * dZxyRe ) / m_PhaseXYSD[freqIDGlobalInSta]; } } if( m_PhaseYXSD[freqIDGlobalInSta] > 0.0 ){ if( useImpedanceTensorInsteadOfPhase && isUsedImpedanceTensorFromFreqIDs( freqIDThisPEInSta, ObservedDataStationNMT2::YX ) ){ sensitivityMatrix[ static_cast(nModel) * static_cast(m_dataIDOfPhaseYX[freqIDThisPEInSta]) + imdl ] = dZyxIm / m_ZyxSD[freqIDGlobalInSta].imagPart; }else{ sensitivityMatrix[ static_cast(nModel) * static_cast(m_dataIDOfPhaseYX[freqIDThisPEInSta]) + imdl ] = CommonParameters::rad2deg / std::max( std::norm(Zyx), eps ) * ( Zyx.real() * dZyxIm - Zyx.imag() * dZyxRe ) / m_PhaseYXSD[freqIDGlobalInSta]; } } if( m_PhaseYYSD[freqIDGlobalInSta] > 0.0 ){ if( useImpedanceTensorInsteadOfPhase && isUsedImpedanceTensorFromFreqIDs( freqIDThisPEInSta, ObservedDataStationNMT2::YY ) ){ sensitivityMatrix[ static_cast(nModel) * static_cast(m_dataIDOfPhaseYY[freqIDThisPEInSta]) + imdl ] = dZyyIm / m_ZyySD[freqIDGlobalInSta].imagPart; }else{ sensitivityMatrix[ static_cast(nModel) * static_cast(m_dataIDOfPhaseYY[freqIDThisPEInSta]) + imdl ] = CommonParameters::rad2deg / std::max( std::norm(Zyy), eps ) * ( Zyy.real() * dZyyIm - Zyy.imag() * dZyyRe ) / m_PhaseYYSD[freqIDGlobalInSta]; } } } } // Calculate data vector of this PE void ObservedDataStationNMT2ApparentResistivityAndPhase::calculateResidualVectorOfDataThisPE( const double freq, const int offset, double* vector ) const{ const int freqIDThisPEInSta = getFreqIDsAmongThisPE( freq ); if( freqIDThisPEInSta < 0 ){// Specified frequency is not the ones calculated by this PE in this station return; } const int freqIDGlobalInSta = m_freqIDsAmongThisStationCalculatedByThisPE[ freqIDThisPEInSta ]; const bool useImpedanceTensorInsteadOfPhase = ( AnalysisControl::getInstance()->getApparentResistivityAndPhaseTreatmentOption() == AnalysisControl::USE_Z_IF_SIGN_OF_RE_Z_DIFFER ); if( useImpedanceTensorInsteadOfPhase && isUsedImpedanceTensorFromFreqIDs( freqIDThisPEInSta, ObservedDataStationNMT2::XX ) ){ OutputFiles::m_logFile << "Notice : Zxx is used instead of apparent resistivity and phase (Station ID : " << getStationID() << ", Frequency : " << freq << " [Hz])." << std::endl; vector[ offset + m_dataIDOfApparentResistivityXX[freqIDThisPEInSta] ] = m_ZxxResidual[freqIDThisPEInSta].realPart; vector[ offset + m_dataIDOfPhaseXX[freqIDThisPEInSta] ] = m_ZxxResidual[freqIDThisPEInSta].imagPart; }else{ vector[ offset + m_dataIDOfApparentResistivityXX[freqIDThisPEInSta] ] = m_apparentResistivityXXResidual[freqIDThisPEInSta]; vector[ offset + m_dataIDOfPhaseXX[freqIDThisPEInSta] ] = m_PhaseXXResidual[freqIDThisPEInSta]; } if( useImpedanceTensorInsteadOfPhase && isUsedImpedanceTensorFromFreqIDs( freqIDThisPEInSta, ObservedDataStationNMT2::XY ) ){ OutputFiles::m_logFile << "Notice : Zxy is used instead of apparent resistivity and phase (Station ID : " << getStationID() << ", Frequency : " << freq << " [Hz])." << std::endl; vector[ offset + m_dataIDOfApparentResistivityXY[freqIDThisPEInSta] ] = m_ZxyResidual[freqIDThisPEInSta].realPart; vector[ offset + m_dataIDOfPhaseXY[freqIDThisPEInSta] ] = m_ZxyResidual[freqIDThisPEInSta].imagPart; }else{ vector[ offset + m_dataIDOfApparentResistivityXY[freqIDThisPEInSta] ] = m_apparentResistivityXYResidual[freqIDThisPEInSta]; vector[ offset + m_dataIDOfPhaseXY[freqIDThisPEInSta] ] = m_PhaseXYResidual[freqIDThisPEInSta]; } if( useImpedanceTensorInsteadOfPhase && isUsedImpedanceTensorFromFreqIDs( freqIDThisPEInSta, ObservedDataStationNMT2::YX ) ){ OutputFiles::m_logFile << "Notice : Zyx is used instead of apparent resistivity and phase (Station ID : " << getStationID() << ", Frequency : " << freq << " [Hz])." << std::endl; vector[ offset + m_dataIDOfApparentResistivityYX[freqIDThisPEInSta] ] = m_ZyxResidual[freqIDThisPEInSta].realPart; vector[ offset + m_dataIDOfPhaseYX[freqIDThisPEInSta] ] = m_ZyxResidual[freqIDThisPEInSta].imagPart; }else{ vector[ offset + m_dataIDOfApparentResistivityYX[freqIDThisPEInSta] ] = m_apparentResistivityYXResidual[freqIDThisPEInSta]; vector[ offset + m_dataIDOfPhaseYX[freqIDThisPEInSta] ] = m_PhaseYXResidual[freqIDThisPEInSta]; } if( useImpedanceTensorInsteadOfPhase && isUsedImpedanceTensorFromFreqIDs( freqIDThisPEInSta, ObservedDataStationNMT2::YY ) ){ OutputFiles::m_logFile << "Notice : Zyy is used instead of apparent resistivity and phase (Station ID : " << getStationID() << ", Frequency : " << freq << " [Hz])." << std::endl; vector[ offset + m_dataIDOfApparentResistivityYY[freqIDThisPEInSta] ] = m_ZyyResidual[freqIDThisPEInSta].realPart; vector[ offset + m_dataIDOfPhaseYY[freqIDThisPEInSta] ] = m_ZyyResidual[freqIDThisPEInSta].imagPart; }else{ vector[ offset + m_dataIDOfApparentResistivityYY[freqIDThisPEInSta] ] = m_apparentResistivityYYResidual[freqIDThisPEInSta]; vector[ offset + m_dataIDOfPhaseYY[freqIDThisPEInSta] ] = m_PhaseYYResidual[freqIDThisPEInSta]; } } // Calulate L2 norm of misfit double ObservedDataStationNMT2ApparentResistivityAndPhase::calculateErrorSumOfSquaresThisPE() const{ double misfit(0.0); for( int ifreq = 0; ifreq < m_numOfFreqCalculatedByThisStaAndPE; ++ifreq ){ misfit += pow( m_apparentResistivityXXResidual[ifreq], 2 ); misfit += pow( m_apparentResistivityXYResidual[ifreq], 2 ); misfit += pow( m_apparentResistivityYXResidual[ifreq], 2 ); misfit += pow( m_apparentResistivityYYResidual[ifreq], 2 ); misfit += pow( m_PhaseXXResidual[ifreq], 2 ); misfit += pow( m_PhaseXYResidual[ifreq], 2 ); misfit += pow( m_PhaseYXResidual[ifreq], 2 ); misfit += pow( m_PhaseYYResidual[ifreq], 2 ); } return misfit; } // Calculate log 10 error of apparent resistivity double ObservedDataStationNMT2ApparentResistivityAndPhase::calcLog10ErrorOfApparentResistivity( const int freqIDGlobalInSta, const int iComp ) const{ switch (iComp) { case ObservedDataStationNMT2::XX: return m_apparentResistivityXXSD[freqIDGlobalInSta] / m_apparentResistivityXXObserved[freqIDGlobalInSta] / log(10); case ObservedDataStationNMT2::XY: return m_apparentResistivityXYSD[freqIDGlobalInSta] / m_apparentResistivityXYObserved[freqIDGlobalInSta] / log(10); case ObservedDataStationNMT2::YX: return m_apparentResistivityYXSD[freqIDGlobalInSta] / m_apparentResistivityYXObserved[freqIDGlobalInSta] / log(10); case ObservedDataStationNMT2::YY: return m_apparentResistivityYYSD[freqIDGlobalInSta] / m_apparentResistivityYYObserved[freqIDGlobalInSta] / log(10); default: OutputFiles::m_logFile << "Error : Type of index of apparent resistivity component is wrong. : " << iComp << std::endl; exit(1); break; } double dummy(-1); return dummy; } // Determine whether to use impedance tensor instead of phase by checking sign differece of real part of impedance tensor bool ObservedDataStationNMT2ApparentResistivityAndPhase::isUsedImpedanceTensor( const double phaseObs, const double phaseError, const double phaseCalc ) const{ const double phaseObsRad = phaseObs * CommonParameters::deg2rad; const double phaseCalcRad = phaseCalc * CommonParameters::deg2rad; if( cos(phaseObsRad) * cos(phaseCalcRad) < 0 ){ return true; }else{ return false; } } // Determine whether to use impedance tensor instead of phase by checking sign differece of real part of impedance tensor from frequeny IDs bool ObservedDataStationNMT2ApparentResistivityAndPhase::isUsedImpedanceTensorFromFreqIDs( const int freqIDThisPEInSta, const int iComp ) const{ assert( freqIDThisPEInSta >= 0 ); const int freqIDGlobalInSta = m_freqIDsAmongThisStationCalculatedByThisPE[freqIDThisPEInSta]; switch (iComp) { case ObservedDataStationNMT2::XX: return isUsedImpedanceTensor( m_PhaseXXObserved[freqIDGlobalInSta], m_PhaseXXSD[freqIDGlobalInSta], m_PhaseXXCalculated[freqIDThisPEInSta] ); case ObservedDataStationNMT2::XY: return isUsedImpedanceTensor( m_PhaseXYObserved[freqIDGlobalInSta], m_PhaseXYSD[freqIDGlobalInSta], m_PhaseXYCalculated[freqIDThisPEInSta] ); case ObservedDataStationNMT2::YX: return isUsedImpedanceTensor( m_PhaseYXObserved[freqIDGlobalInSta], m_PhaseYXSD[freqIDGlobalInSta], m_PhaseYXCalculated[freqIDThisPEInSta] ); case ObservedDataStationNMT2::YY: return isUsedImpedanceTensor( m_PhaseYYObserved[freqIDGlobalInSta], m_PhaseYYSD[freqIDGlobalInSta], m_PhaseYYCalculated[freqIDThisPEInSta] ); default: OutputFiles::m_logFile << "Error : Type of index of apparent resistivity component is wrong. : " << iComp << std::endl; exit(1); break; } return false; }