From e599fa10adc3bdb7d175b41d597e0acb2392cbc2 Mon Sep 17 00:00:00 2001 From: Pedro Gomes Date: Wed, 1 Jan 2025 13:56:44 -0800 Subject: [PATCH] index cache for compact --- SU2_CFD/include/output/COutput.hpp | 47 +++--- SU2_CFD/src/output/CElasticityOutput.cpp | 17 +- SU2_CFD/src/output/COutput.cpp | 155 +++++++----------- .../output/filewriter/CParallelDataSorter.cpp | 3 +- TestCases/parallel_regression.py | 2 +- TestCases/py_wrapper/wavy_wall/run_steady.py | 1 + config_template.cfg | 8 +- 7 files changed, 102 insertions(+), 131 deletions(-) diff --git a/SU2_CFD/include/output/COutput.hpp b/SU2_CFD/include/output/COutput.hpp index eea8188ed46..e39b047ce82 100644 --- a/SU2_CFD/include/output/COutput.hpp +++ b/SU2_CFD/include/output/COutput.hpp @@ -241,17 +241,16 @@ class COutput { /*----------------------------- Volume output ----------------------------*/ - CParallelDataSorter* volumeDataSorter; //!< Volume data sorter - CParallelDataSorter* volumeDataSorterCompact; //!< Volume data sorter - CParallelDataSorter* surfaceDataSorter; //!< Surface data sorter + CParallelDataSorter* volumeDataSorter; //!< Volume data sorter. + CParallelDataSorter* volumeDataSorterCompact; //!< Volume data sorter for compact files. + CParallelDataSorter* surfaceDataSorter; //!< Surface data sorter. - vector volumeFieldNames; //!< Vector containing the volume field names + vector volumeFieldNames; //!< Vector containing the volume field names. + vector requiredVolumeFieldNames; //!< Vector containing the minimum required volume field names. - vector requiredVolumeFieldNames; //!< Vector containing the minimum required volume field names. - - string volumeFilename, //!< Volume output filename - surfaceFilename, //!< Surface output filename - restartFilename; //!< Restart output filename + string volumeFilename, //!< Volume output filename. + surfaceFilename, //!< Surface output filename. + restartFilename; //!< Restart output filename. /** \brief Structure to store information for a volume output field. * @@ -269,28 +268,32 @@ class COutput { /*! \brief String containing the description of the field. */ string description; /*! \brief Default constructor. */ - VolumeOutputField () {} + VolumeOutputField() = default; /*! \brief Constructor to initialize all members. */ VolumeOutputField(string fieldName_, int offset_, string volumeOutputGroup_, string description_): - fieldName(std::move(fieldName_)), offset(std::move(offset_)), - outputGroup(std::move(volumeOutputGroup_)), description(std::move(description_)){} + fieldName(std::move(fieldName_)), + offset(offset_), + outputGroup(std::move(volumeOutputGroup_)), + description(std::move(description_)) {} }; /*! \brief Associative map to access data stored in the volume output fields by a string identifier. */ - std::map volumeOutput_Map; + std::map volumeOutput_Map; /*! \brief Vector that contains the keys of the ::volumeOutput_Map in the order of their insertion. */ - std::vector volumeOutput_List; + std::vector volumeOutput_List; + + /*! \brief Whether the field index caches should be build. */ + bool buildFieldIndexCache; + + /*! \brief Vectors to cache the positions of the fields in the data array. */ + std::vector fieldIndexCache, fieldIndexCacheCompact; + /*! \brief Current value of the cache indices. */ + unsigned short cachePosition; /*! \brief Vector to cache the positions of the field in the data array. */ - std::vector fieldIndexCache; - /*! \brief Current value of the cache index. */ - unsigned short cachePosition; - /*! \brief Boolean to store whether the field index cache should be build. */ - bool buildFieldIndexCache; - /*! \brief Vector to cache the positions of the field in the data array. */ - std::vector fieldGetIndexCache; + std::vector fieldGetIndexCache; /*! \brief Current value of the cache index. */ - unsigned short curGetFieldIndex; + unsigned short curGetFieldIndex; /*! \brief Requested volume field names in the config file. */ std::vector requestedVolumeFields; diff --git a/SU2_CFD/src/output/CElasticityOutput.cpp b/SU2_CFD/src/output/CElasticityOutput.cpp index a2abc4e6d12..1af62426cce 100644 --- a/SU2_CFD/src/output/CElasticityOutput.cpp +++ b/SU2_CFD/src/output/CElasticityOutput.cpp @@ -235,21 +235,20 @@ void CElasticityOutput::SetVolumeOutputFields(CConfig *config){ // Grid coordinates AddVolumeOutput("COORD-X", "x", "COORDINATES", "x-component of the coordinate vector"); AddVolumeOutput("COORD-Y", "y", "COORDINATES", "y-component of the coordinate vector"); - if (nDim == 3) - AddVolumeOutput("COORD-Z", "z", "COORDINATES", "z-component of the coordinate vector"); + if (nDim == 3) AddVolumeOutput("COORD-Z", "z", "COORDINATES", "z-component of the coordinate vector"); AddVolumeOutput("DISPLACEMENT-X", "Displacement_x", "SOLUTION", "x-component of the displacement vector"); AddVolumeOutput("DISPLACEMENT-Y", "Displacement_y", "SOLUTION", "y-component of the displacement vector"); if (nDim == 3) AddVolumeOutput("DISPLACEMENT-Z", "Displacement_z", "SOLUTION", "z-component of the displacement vector"); - if(dynamic){ - AddVolumeOutput("VELOCITY-X", "Velocity_x", "VELOCITY", "x-component of the velocity vector"); - AddVolumeOutput("VELOCITY-Y", "Velocity_y", "VELOCITY", "y-component of the velocity vector"); - if (nDim == 3) AddVolumeOutput("VELOCITY-Z", "Velocity_z", "VELOCITY", "z-component of the velocity vector"); + if (dynamic) { + AddVolumeOutput("VELOCITY-X", "Velocity_x", "SOLUTION", "x-component of the velocity vector"); + AddVolumeOutput("VELOCITY-Y", "Velocity_y", "SOLUTION", "y-component of the velocity vector"); + if (nDim == 3) AddVolumeOutput("VELOCITY-Z", "Velocity_z", "SOLUTION", "z-component of the velocity vector"); - AddVolumeOutput("ACCELERATION-X", "Acceleration_x", "ACCELERATION", "x-component of the acceleration vector"); - AddVolumeOutput("ACCELERATION-Y", "Acceleration_y", "ACCELERATION", "y-component of the acceleration vector"); - if (nDim == 3) AddVolumeOutput("ACCELERATION-Z", "Acceleration_z", "ACCELERATION", "z-component of the acceleration vector"); + AddVolumeOutput("ACCELERATION-X", "Acceleration_x", "SOLUTION", "x-component of the acceleration vector"); + AddVolumeOutput("ACCELERATION-Y", "Acceleration_y", "SOLUTION", "y-component of the acceleration vector"); + if (nDim == 3) AddVolumeOutput("ACCELERATION-Z", "Acceleration_z", "SOLUTION", "z-component of the acceleration vector"); } AddVolumeOutput("STRESS-XX", "Sxx", "STRESS", "x-component of the normal stress vector"); diff --git a/SU2_CFD/src/output/COutput.cpp b/SU2_CFD/src/output/COutput.cpp index 4c0ce5e096f..bfb0b6329c5 100644 --- a/SU2_CFD/src/output/COutput.cpp +++ b/SU2_CFD/src/output/COutput.cpp @@ -173,7 +173,6 @@ COutput::COutput(const CConfig *config, unsigned short ndim, bool fem_output): convergence = false; buildFieldIndexCache = false; - curInnerIter = 0; curOuterIter = 0; curTimeIter = 0; @@ -345,7 +344,7 @@ void COutput::AllocateDataSorters(CConfig *config, CGeometry *geometry){ if (volumeDataSorter == nullptr) volumeDataSorter = new CFEMDataSorter(config, geometry, volumeFieldNames); - if (volumeDataSorterCompact == nullptr) + if (config->GetWrt_Restart_Compact() && volumeDataSorterCompact == nullptr) volumeDataSorterCompact = new CFEMDataSorter(config, geometry, requiredVolumeFieldNames); if (surfaceDataSorter == nullptr) @@ -357,7 +356,7 @@ void COutput::AllocateDataSorters(CConfig *config, CGeometry *geometry){ if (volumeDataSorter == nullptr) volumeDataSorter = new CFVMDataSorter(config, geometry, volumeFieldNames); - if (volumeDataSorterCompact == nullptr) + if (config->GetWrt_Restart_Compact() && volumeDataSorterCompact == nullptr) volumeDataSorterCompact = new CFVMDataSorter(config, geometry, requiredVolumeFieldNames); if (surfaceDataSorter == nullptr) @@ -423,9 +422,6 @@ void COutput::WriteToFile(CConfig *config, CGeometry *geometry, OUTPUT_TYPE form /*--- If we have compact restarts, we use only the required fields. ---*/ if (config->GetWrt_Restart_Compact()) surfaceDataSorter->SetRequiredFieldNames(requiredVolumeFieldNames); - else - surfaceDataSorter->SetRequiredFieldNames(surfaceDataSorter->GetFieldNames()); - surfaceDataSorter->SortConnectivity(config, geometry); surfaceDataSorter->SortOutputData(); @@ -445,12 +441,9 @@ void COutput::WriteToFile(CConfig *config, CGeometry *geometry, OUTPUT_TYPE form if (!config->GetWrt_Restart_Overwrite()) filename_iter = config->GetFilename_Iter(fileName, curInnerIter, curOuterIter); - /*--- If we have compact restarts, we use only the required fields. ---*/ if (config->GetWrt_Restart_Compact()) volumeDataSorter->SetRequiredFieldNames(requiredVolumeFieldNames); - else - volumeDataSorter->SetRequiredFieldNames(volumeDataSorter->GetFieldNames()); LogOutputFiles("SU2 ASCII restart"); fileWriter = new CSU2FileWriter(volumeDataSorter); @@ -467,18 +460,14 @@ void COutput::WriteToFile(CConfig *config, CGeometry *geometry, OUTPUT_TYPE form if (!config->GetWrt_Restart_Overwrite()) filename_iter = config->GetFilename_Iter(fileName, curInnerIter, curOuterIter); - /*--- If we have compact restarts, we use only the required fields. ---*/ - if (config->GetWrt_Restart_Compact()) - volumeDataSorterCompact->SetRequiredFieldNames(requiredVolumeFieldNames); - else - volumeDataSorter->SetRequiredFieldNames(volumeDataSorter->GetFieldNames()); - LogOutputFiles("SU2 binary restart"); - if (config->GetWrt_Restart_Compact()) + if (config->GetWrt_Restart_Compact()) { + /*--- If we have compact restarts, we use only the required fields. ---*/ + volumeDataSorterCompact->SetRequiredFieldNames(requiredVolumeFieldNames); fileWriter = new CSU2BinaryFileWriter(volumeDataSorterCompact); - else + } else { fileWriter = new CSU2BinaryFileWriter(volumeDataSorter); - + } break; case OUTPUT_TYPE::MESH: @@ -857,7 +846,7 @@ bool COutput::SetResultFiles(CGeometry *geometry, CConfig *config, CSolver** sol /*--- Partition and sort the data --- */ volumeDataSorter->SortOutputData(); - volumeDataSorterCompact->SortOutputData(); + if (volumeDataSorterCompact != nullptr) volumeDataSorterCompact->SortOutputData(); if (rank == MASTER_NODE && !isFileWrite) { fileWritingTable->SetAlign(PrintingToolbox::CTablePrinter::CENTER); @@ -1536,21 +1525,17 @@ void COutput::PreprocessVolumeOutput(CConfig *config){ SetVolumeOutputFields(config); - /*--- Coordinates must be always in the output. - * If they are not requested, add them here. ---*/ - auto itCoord = std::find(requestedVolumeFields.begin(), - requestedVolumeFields.end(), "COORDINATES"); + /*--- Coordinates must be always in the output. If they are not requested, add them here. ---*/ + auto itCoord = std::find(requestedVolumeFields.begin(), requestedVolumeFields.end(), "COORDINATES"); if (itCoord == requestedVolumeFields.end()) { requestedVolumeFields.emplace_back("COORDINATES"); nRequestedVolumeFields++; } /*--- Add the solution if it was not requested for backwards compatibility, unless the COMPACT keyword was used to request exclusively the specified fields. ---*/ - auto itSol = std::find(requestedVolumeFields.begin(), - requestedVolumeFields.end(), "SOLUTION"); + auto itSol = std::find(requestedVolumeFields.begin(), requestedVolumeFields.end(), "SOLUTION"); if (itSol == requestedVolumeFields.end()) { - auto itCompact = std::find(requestedVolumeFields.begin(), - requestedVolumeFields.end(), "COMPACT"); + auto itCompact = std::find(requestedVolumeFields.begin(), requestedVolumeFields.end(), "COMPACT"); if (itCompact == requestedVolumeFields.end()) { requestedVolumeFields.emplace_back("SOLUTION"); nRequestedVolumeFields++; @@ -1661,10 +1646,11 @@ void COutput::LoadDataIntoSorter(CConfig* config, CGeometry* geometry, CSolver** /*--- Reset the offset cache and index --- */ cachePosition = 0; fieldIndexCache.clear(); + fieldIndexCacheCompact.clear(); curGetFieldIndex = 0; fieldGetIndexCache.clear(); - if (femOutput){ + if (femOutput) { /*--- Create an object of the class CMeshFEM_DG and retrieve the necessary geometrical information for the FEM DG solver. ---*/ @@ -1678,33 +1664,24 @@ void COutput::LoadDataIntoSorter(CConfig* config, CGeometry* geometry, CSolver** /*--- Access the solution by looping over the owned volume elements. ---*/ for(unsigned long l=0; lGetnPointDomain(); iPoint++) { - - /*--- Load the volume data into the data sorter. --- */ - buildFieldIndexCache = fieldIndexCache.empty(); - LoadVolumeData(config, geometry, solver, iPoint); - } /*--- Reset the offset cache and index --- */ cachePosition = 0; fieldIndexCache.clear(); + fieldIndexCacheCompact.clear(); curGetFieldIndex = 0; fieldGetIndexCache.clear(); @@ -1712,19 +1689,16 @@ void COutput::LoadDataIntoSorter(CConfig* config, CGeometry* geometry, CSolver** /*--- We only want to have surface values on solid walls ---*/ - if (config->GetSolid_Wall(iMarker)){ - for (iVertex = 0; iVertex < geometry->GetnVertex(iMarker); iVertex++){ + if (config->GetSolid_Wall(iMarker)) { + for (iVertex = 0; iVertex < geometry->GetnVertex(iMarker); iVertex++) { iPoint = geometry->vertex[iMarker][iVertex]->GetNode(); /*--- Load the surface data into the data sorter. --- */ - if(geometry->nodes->GetDomain(iPoint)){ - + if (geometry->nodes->GetDomain(iPoint)) { buildFieldIndexCache = fieldIndexCache.empty(); - LoadSurfaceData(config, geometry, solver, iPoint, iMarker, iVertex); - } } } @@ -1734,79 +1708,74 @@ void COutput::LoadDataIntoSorter(CConfig* config, CGeometry* geometry, CSolver** void COutput::SetVolumeOutputValue(const string& name, unsigned long iPoint, su2double value){ - const vector reqFieldNames = requiredVolumeFieldNames; - string fieldname = volumeOutput_Map.at(name).fieldName; - bool contains = std::any_of(requiredVolumeFieldNames.begin(), requiredVolumeFieldNames.end(), - [fieldname](string n) { return n == fieldname; }); if (buildFieldIndexCache) { - /*--- Build up the offset cache to speed up subsequent * calls of this routine since the order of calls is - * the same for every value of iPoint --- */ + * the same for every value of iPoint. ---*/ - if (volumeOutput_Map.count(name) > 0) { - const short Offset = volumeOutput_Map.at(name).offset; + const auto it = volumeOutput_Map.find(name); + if (it != volumeOutput_Map.end()) { + const short Offset = it->second.offset; fieldIndexCache.push_back(Offset); - if (Offset != -1){ - // note that the compact fields are a subset of the full fields - if (contains == true) { - const short OffsetCompact = volumeOutput_Map.at(name).offsetCompact; - volumeDataSorterCompact->SetUnsortedData(iPoint, OffsetCompact, value); - } + if (Offset != -1) { volumeDataSorter->SetUnsortedData(iPoint, Offset, value); } + /*--- Note that the compact fields are a subset of the full fields. ---*/ + const short OffsetCompact = it->second.offsetCompact; + fieldIndexCacheCompact.push_back(OffsetCompact); + if (volumeDataSorterCompact != nullptr && OffsetCompact != -1) { + volumeDataSorterCompact->SetUnsortedData(iPoint, OffsetCompact, value); + } } else { - SU2_MPI::Error(string("Cannot find output field with name ") + name, CURRENT_FUNCTION); + SU2_MPI::Error("Cannot find output field with name " + name, CURRENT_FUNCTION); } } else { - /*--- Use the offset cache for the access ---*/ - const short Offset = fieldIndexCache[cachePosition++]; + /*--- Use the offset caches for the access. ---*/ + const short Offset = fieldIndexCache[cachePosition]; + const short OffsetCompact = fieldIndexCacheCompact[cachePosition++]; + if (cachePosition == fieldIndexCache.size()) { + cachePosition = 0; + } if (Offset != -1) { - if (contains == true) { - const short OffsetCompact = volumeOutput_Map.at(name).offsetCompact; - volumeDataSorterCompact->SetUnsortedData(iPoint, OffsetCompact, value); - } volumeDataSorter->SetUnsortedData(iPoint, Offset, value); } - if (cachePosition == fieldIndexCache.size()){ - cachePosition = 0; + if (volumeDataSorterCompact != nullptr && OffsetCompact != -1) { + volumeDataSorterCompact->SetUnsortedData(iPoint, OffsetCompact, value); } } } -su2double COutput::GetVolumeOutputValue(const string& name, unsigned long iPoint){ - - if (buildFieldIndexCache){ +su2double COutput::GetVolumeOutputValue(const string& name, unsigned long iPoint) { + if (buildFieldIndexCache) { /*--- Build up the offset cache to speed up subsequent * calls of this routine since the order of calls is - * the same for every value of iPoint --- */ + * the same for every value of iPoint. ---*/ - if (volumeOutput_Map.count(name) > 0){ - const short Offset = volumeOutput_Map.at(name).offset; + const auto it = volumeOutput_Map.find(name); + if (it != volumeOutput_Map.end()) { + const short Offset = it->second.offset; fieldGetIndexCache.push_back(Offset); - if (Offset != -1){ + if (Offset != -1) { return volumeDataSorter->GetUnsortedData(iPoint, Offset); } } else { - SU2_MPI::Error(string("Cannot find output field with name ") + name, CURRENT_FUNCTION); + SU2_MPI::Error("Cannot find output field with name " + name, CURRENT_FUNCTION); } } else { - - /*--- Use the offset cache for the access ---*/ + /*--- Use the offset cache for the access, ---*/ const short Offset = fieldGetIndexCache[curGetFieldIndex++]; - if (curGetFieldIndex == fieldGetIndexCache.size()){ + if (curGetFieldIndex == fieldGetIndexCache.size()) { curGetFieldIndex = 0; } - if (Offset != -1){ + if (Offset != -1) { return volumeDataSorter->GetUnsortedData(iPoint, Offset); } } - return 0.0; } @@ -1814,38 +1783,36 @@ void COutput::SetAvgVolumeOutputValue(const string& name, unsigned long iPoint, const su2double scaling = 1.0 / su2double(curAbsTimeIter + 1); - if (buildFieldIndexCache){ - + if (buildFieldIndexCache) { /*--- Build up the offset cache to speed up subsequent * calls of this routine since the order of calls is - * the same for every value of iPoint --- */ + * the same for every value of iPoint. ---*/ - if (volumeOutput_Map.count(name) > 0){ - const short Offset = volumeOutput_Map.at(name).offset; + const auto it = volumeOutput_Map.find(name); + if (it != volumeOutput_Map.end()) { + const short Offset = it->second.offset; fieldIndexCache.push_back(Offset); - if (Offset != -1){ - + if (Offset != -1) { const su2double old_value = volumeDataSorter->GetUnsortedData(iPoint, Offset); - const su2double new_value = value * scaling + old_value *( 1.0 - scaling); + const su2double new_value = value * scaling + old_value * (1.0 - scaling); volumeDataSorter->SetUnsortedData(iPoint, Offset, new_value); } } else { - SU2_MPI::Error(string("Cannot find output field with name ") + name, CURRENT_FUNCTION); + SU2_MPI::Error("Cannot find output field with name " + name, CURRENT_FUNCTION); } } else { /*--- Use the offset cache for the access ---*/ const short Offset = fieldIndexCache[cachePosition++]; - if (Offset != -1){ - + if (Offset != -1) { const su2double old_value = volumeDataSorter->GetUnsortedData(iPoint, Offset); - const su2double new_value = value * scaling + old_value *( 1.0 - scaling); + const su2double new_value = value * scaling + old_value * (1.0 - scaling); volumeDataSorter->SetUnsortedData(iPoint, Offset, new_value); } - if (cachePosition == fieldIndexCache.size()){ + if (cachePosition == fieldIndexCache.size()) { cachePosition = 0; } } @@ -2485,7 +2452,7 @@ void COutput::PrintVolumeFields(){ } cout << "Available volume output fields for the current configuration in " << multiZoneHeaderString << ":" << endl; - cout << "Note: COORDINATES and SOLUTION groups are always in the volume output unless you add the keyword COMPACT." << endl; + cout << "Note: COORDINATES are always included, and so is SOLUTION unless you add the keyword COMPACT to the list of fields." << endl; VolumeFieldTable.AddColumn("Name", NameSize); VolumeFieldTable.AddColumn("Group Name", GroupSize); VolumeFieldTable.AddColumn("Description", DescrSize); diff --git a/SU2_CFD/src/output/filewriter/CParallelDataSorter.cpp b/SU2_CFD/src/output/filewriter/CParallelDataSorter.cpp index 0290c20b025..2bc2778ec24 100644 --- a/SU2_CFD/src/output/filewriter/CParallelDataSorter.cpp +++ b/SU2_CFD/src/output/filewriter/CParallelDataSorter.cpp @@ -32,7 +32,8 @@ CParallelDataSorter::CParallelDataSorter(CConfig *config, const vector &valFieldNames) : rank(SU2_MPI::GetRank()), size(SU2_MPI::GetSize()), - fieldNames(valFieldNames) { + fieldNames(valFieldNames), + requiredFieldNames(valFieldNames) { GlobalField_Counter = fieldNames.size(); diff --git a/TestCases/parallel_regression.py b/TestCases/parallel_regression.py index 9c6cdf65373..530328b52a6 100644 --- a/TestCases/parallel_regression.py +++ b/TestCases/parallel_regression.py @@ -1671,7 +1671,7 @@ def main(): stl_writer_test.cfg_dir = "rans/oneram6" stl_writer_test.cfg_file = "turb_ONERAM6.cfg" stl_writer_test.test_iter = 1 - stl_writer_test.command = TestCase.Command("mpirun -n 2", "SU2_CFD") + stl_writer_test.command = TestCase.Command("mpirun -n 2", "SU2_SOL") stl_writer_test.timeout = 1600 stl_writer_test.reference_file = "surface_flow.stl.ref" stl_writer_test.test_file = "surface_flow.stl" diff --git a/TestCases/py_wrapper/wavy_wall/run_steady.py b/TestCases/py_wrapper/wavy_wall/run_steady.py index 4a90995ace1..511aa585827 100644 --- a/TestCases/py_wrapper/wavy_wall/run_steady.py +++ b/TestCases/py_wrapper/wavy_wall/run_steady.py @@ -93,6 +93,7 @@ primal_settings = """ MATH_PROBLEM= DIRECT RESTART_SOL= YES + CFL_NUMBER= 1000 LINEAR_SOLVER= FGMRES LINEAR_SOLVER_PREC= ILU diff --git a/config_template.cfg b/config_template.cfg index 8b6b313246d..0acf538f856 100644 --- a/config_template.cfg +++ b/config_template.cfg @@ -60,10 +60,10 @@ GRAVITY_FORCE= NO % Restart solution (NO, YES) RESTART_SOL= NO % -% Only save minimum required variables to restart files (NO, YES). -% If this option is set to NO, then the SOLUTION fields will be written to all output -% files by default. If you would also like to have minimum output files -% (e.g. paraview, tecplot), then add the keyword COMPACT to VOLUME_OUTPUT. +% Only save the minimum required variables for restarting to restart files (NO, YES). +% If this option is set to NO, then all fields will be written to all output files. +% To minimize the size of other output files (e.g. paraview, tecplot) by not including +% default restart fields in them, add the keyword COMPACT to VOLUME_OUTPUT. WRT_RESTART_COMPACT= YES % % Discard the data storaged in the solution and geometry files