From ceb670fc597af746315ce3fe47a8f540420907fb Mon Sep 17 00:00:00 2001 From: yoshiya-usui Date: Mon, 25 Mar 2024 07:20:38 +0900 Subject: [PATCH] replaces some 32 bit integer with 64 bit interger for allowing the use of large data set --- src/CommonParameters.h | 2 +- src/InversionGaussNewtonDataSpace.cpp | 46 +++++++++++++-------------- 2 files changed, 23 insertions(+), 25 deletions(-) diff --git a/src/CommonParameters.h b/src/CommonParameters.h index ba91bcb..9cb68ed 100644 --- a/src/CommonParameters.h +++ b/src/CommonParameters.h @@ -162,7 +162,7 @@ static char programName[]="femtic"; // [MajorVersion#].[MinorVersion#].[Revision#] // x.x.xa -> alpha version // x.x.xb -> beta version -static char versionID[]="4.2"; +static char versionID[]="4.2.5"; } diff --git a/src/InversionGaussNewtonDataSpace.cpp b/src/InversionGaussNewtonDataSpace.cpp index de24221..077b76e 100644 --- a/src/InversionGaussNewtonDataSpace.cpp +++ b/src/InversionGaussNewtonDataSpace.cpp @@ -506,7 +506,8 @@ void InversionGaussNewtonDataSpace::inversionCalculationByNewMethod() const{ if( myProcessID == 0 ){//---- Processs ID = 0 Only ----->>>>> OutputFiles::m_logFile << "# Calculate coefficient matrix. " << ptrAnalysisControl->outputElapsedTime() << std::endl; - double* matrix = new double[ static_cast(numDataTotal) * static_cast(numDataTotal) ]; + const long long int numDataTotal_64 = static_cast(numDataTotal); + double* matrix = new double[numDataTotal_64 * numDataTotal_64]; #ifdef _DEBUG_WRITE for( long long i = 0; i < static_cast(numDataTotal) * static_cast(numDataTotal); ++i ){ matrix[i] = -9999.999; @@ -568,7 +569,7 @@ void InversionGaussNewtonDataSpace::inversionCalculationByNewMethod() const{ const long long row = irow + static_cast(offsetRows); for( long long icol = 0; icol < numDataThisFreqRight; ++icol ){ const long long col = icol + static_cast(offsetCols); - matrix[ row * static_cast(numDataTotal) + col ] = result[ irow * static_cast(numDataThisFreqRight) + icol ]; + matrix[ row * numDataTotal_64 + col ] = result[ irow * static_cast(numDataThisFreqRight) + icol ]; } } delete [] result; @@ -583,7 +584,6 @@ void InversionGaussNewtonDataSpace::inversionCalculationByNewMethod() const{ const long long numDataThisFreqLeft_64 = static_cast(numDataThisFreqLeft); const long long numDataThisFreqRight_64 = static_cast(numDataThisFreqRight); const long long numModel_64 = static_cast(numModel); - const long long numDataTotal_64 = static_cast(numDataTotal); const long long offsetRows_64 = static_cast(offsetRows); const long long offsetCols_64 = static_cast(offsetCols); #ifdef _USE_OMP @@ -614,22 +614,22 @@ void InversionGaussNewtonDataSpace::inversionCalculationByNewMethod() const{ //---------------------------------------------- // Add unit matrix //---------------------------------------------- - for( int row = 0; row < numDataTotal; ++row ){ - const int col = row; - matrix[ row * numDataTotal + col ] += 1.0; + for( long long int row = 0; row < numDataTotal_64; ++row ){ + const long long int col = row; + matrix[ row * numDataTotal_64 + col ] += 1.0; } - const long long numElemsOfCoefficientMatrixTotal = static_cast(numDataTotal) * ( static_cast(numDataTotal) + 1 ) / 2; + const long long int numElemsOfCoefficientMatrixTotal = numDataTotal_64 * ( numDataTotal_64 + 1 ) / 2; OutputFiles::m_logFile << "# Total number of elements in coefficient matrix : " << numElemsOfCoefficientMatrixTotal << std::endl; matrixToBeInverted = new double [numElemsOfCoefficientMatrixTotal]; //---------------------------------------------- // Copy only upper triangle components //---------------------------------------------- - int index(0); - for( int row = 0; row < numDataTotal; ++row ){ - for( int col = row; col < numDataTotal; ++col ){ - matrixToBeInverted[index] = matrix[ row * numDataTotal + col ]; + long long int index(0); + for(long long int row = 0; row < numDataTotal_64; ++row ){ + for(long long int col = row; col < numDataTotal_64; ++col ){ + matrixToBeInverted[index] = matrix[ row * numDataTotal_64 + col ]; ++index; } } @@ -646,7 +646,6 @@ void InversionGaussNewtonDataSpace::inversionCalculationByNewMethod() const{ OutputFiles::m_logFile << "# Start numerical factorization for normal equation. " << ptrAnalysisControl->outputElapsedTime() << std::endl; const long long int numModel_64 = static_cast(numModel); - const long long int numDataTotal_64 = static_cast(numDataTotal); const bool positiveDefinite = ptrAnalysisControl->getPositiveDefiniteNormalEqMatrix(); long long int* ipiv = NULL; if( !positiveDefinite ){ @@ -1316,7 +1315,8 @@ void InversionGaussNewtonDataSpace::inversionCalculationByNewMethodUsingInvRTRMa if( myProcessID == 0 ){//---- Processs ID = 0 Only ----->>>>> OutputFiles::m_logFile << "# Calculate coefficient matrix. " << ptrAnalysisControl->outputElapsedTime() << std::endl; - double* matrix = new double[ static_cast(numDataTotal) * static_cast(numDataTotal) ]; + const long long int numDataTotal_64 = static_cast(numDataTotal); + double* matrix = new double[numDataTotal_64 * numDataTotal_64]; #ifdef _DEBUG_WRITE for( long long i = 0; i < static_cast(numDataTotal) * static_cast(numDataTotal); ++i ){ matrix[i] = -9999.999; @@ -1378,7 +1378,7 @@ void InversionGaussNewtonDataSpace::inversionCalculationByNewMethodUsingInvRTRMa const long long row = irow + static_cast(offsetRows); for( long long icol = 0; icol < numDataThisFreqRight; ++icol ){ const long long col = icol + static_cast(offsetCols); - matrix[ row * static_cast(numDataTotal) + col ] = result[ irow * static_cast(numDataThisFreqRight) + icol ]; + matrix[ row * numDataTotal_64 + col ] = result[ irow * static_cast(numDataThisFreqRight) + icol ]; } } delete [] result; @@ -1393,7 +1393,6 @@ void InversionGaussNewtonDataSpace::inversionCalculationByNewMethodUsingInvRTRMa const long long numDataThisFreqLeft_64 = static_cast(numDataThisFreqLeft); const long long numDataThisFreqRight_64 = static_cast(numDataThisFreqRight); const long long numModel_64 = static_cast(numModel); - const long long numDataTotal_64 = static_cast(numDataTotal); const long long offsetRows_64 = static_cast(offsetRows); const long long offsetCols_64 = static_cast(offsetCols); #ifdef _USE_OMP @@ -1424,22 +1423,22 @@ void InversionGaussNewtonDataSpace::inversionCalculationByNewMethodUsingInvRTRMa //---------------------------------------------- // Add unit matrix //---------------------------------------------- - for( int row = 0; row < numDataTotal; ++row ){ - const int col = row; - matrix[ row * numDataTotal + col ] += 1.0; + for( long long int row = 0; row < numDataTotal_64; ++row ){ + const long long int col = row; + matrix[ row * numDataTotal_64 + col ] += 1.0; } - const long long numElemsOfCoefficientMatrixTotal = static_cast(numDataTotal) * ( static_cast(numDataTotal) + 1 ) / 2; + const long long numElemsOfCoefficientMatrixTotal = numDataTotal_64 * ( numDataTotal_64 + 1 ) / 2; OutputFiles::m_logFile << "# Total number of elements in coefficient matrix : " << numElemsOfCoefficientMatrixTotal << std::endl; matrixToBeInverted = new double [numElemsOfCoefficientMatrixTotal]; //---------------------------------------------- // Copy only upper triangle components //---------------------------------------------- - int index(0); - for( int row = 0; row < numDataTotal; ++row ){ - for( int col = row; col < numDataTotal; ++col ){ - matrixToBeInverted[index] = matrix[ row * numDataTotal + col ]; + long long int index(0); + for( long long int row = 0; row < numDataTotal_64; ++row ){ + for(long long int col = row; col < numDataTotal_64; ++col ){ + matrixToBeInverted[index] = matrix[ row * numDataTotal_64 + col ]; ++index; } } @@ -1456,7 +1455,6 @@ void InversionGaussNewtonDataSpace::inversionCalculationByNewMethodUsingInvRTRMa OutputFiles::m_logFile << "# Start numerical factorization for normal equation. " << ptrAnalysisControl->outputElapsedTime() << std::endl; const long long int numModel_64 = static_cast(numModel); - const long long int numDataTotal_64 = static_cast(numDataTotal); const bool positiveDefinite = ptrAnalysisControl->getPositiveDefiniteNormalEqMatrix(); long long int* ipiv = NULL; if( !positiveDefinite ){