// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
-// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+// See http://www.salome-platform.org/
// file : MG_ADAPT.cxx
#include "MG_ADAPT.hxx"
#include <unistd.h>
#include <TCollection_AsciiString.hxx>
#include <cstring>
+#include <cstdlib>
#include <boost/filesystem.hpp>
+static std::string removeFile(std::string fileName, int& notOk)
+{
+ std::string errStr;
+ notOk = std::remove(fileName.c_str());
+ if (notOk) errStr = ToComment(" \n error while removing file : ")
+ << fileName;
+ else errStr= ToComment("\n file : ")<< fileName << " succesfully deleted! \n ";
+
+ return errStr;
+}
namespace
{
struct GET_DEFAULT // struct used to get default value from GetOptionValue()
}
setSizeMapFile(mapfile);
- int rank;
- int tmst;
+ med_int rank;
+ med_int tmst;
if (data->myUseNoTimeStep)
{
rank = MED_NO_IT;
rank = data->myRank;
tmst = data->myTimeStep;
}
- setRankTimeStep(tmst, rank);
+ setRankTimeStep((int)tmst, (int)rank);
/* Advanced options */
setWorkingDir(data->myWorkingDir);
if (op_val->second != optionValue)
{
- const char* ptr = optionValue.c_str();
+
+ std::string lowerOptionValue = toLowerStr(optionValue);
+ const char* ptr = lowerOptionValue.c_str();
// strip white spaces
while (ptr[0] == ' ')
ptr++;
if (i == 0) {
// empty string
} else if (_charOptions.count(optionName)) {
- // do not check strings
+ // do not check strings
} else if (_doubleOptions.count(optionName)) {
// check if value is double
toDbl(ptr, &typeOk);
return val;
}
//================================================================================
+/*!
+ * \brief Converts a string to a lower
+ */
+//================================================================================
+std::string MgAdapt::toLowerStr(const std::string& str)
+{
+ std::string s = str;
+ for ( size_t i = 0; i <= s.size(); ++i )
+ s[i] = tolower( s[i] );
+ return s;
+}
+//================================================================================
/*!
* \brief Converts a string to a bool
*/
int MgAdapt::compute(std::string& errStr)
{
- std::string cmd= getCommandToRun();
+ std::string cmd = getCommandToRun();
int err = 0;
execCmd( cmd.c_str(), err ); // run
{
convertMeshFile(meshFormatOutputMesh, solFormatOutput);
}
+ //~if (!err) cleanUp();
return err;
}
{
err = 1;
std::array <char, 128> buffer;
- std:: ofstream logStream;
- logStream.open(logFile);
+ std::streambuf* buf;
+ outFileStream fileStream;
+ if (printLogInFile)
+ {
+ fileStream.open(logFile);
+ buf = fileStream.rdbuf();
+ }
+ else
+ {
+ buf = std::cout.rdbuf();
+ }
+ std::ostream logStream(buf);
+
std::unique_ptr <FILE, decltype(&pclose)> pipe(popen(cmd, "r"), pclose );
if(!pipe)
{
{
logStream<<buffer.data() ;
}
- logStream.close();
err = 0;
}
+
+void MgAdapt::cleanUp()
+{
+ int notOk;
+ std::string errStr;
+ if(removeOnSuccess) tmpFilesToBeDeleted.push_back(logFile);
+
+ std::vector< std::string>::iterator it = tmpFilesToBeDeleted.begin();
+ for (; it!=tmpFilesToBeDeleted.end(); ++it)
+ {
+ errStr=removeFile(*it, notOk);
+ if (notOk)
+ {
+ appendMsgToLogFile(errStr);
+ }
+
+ }
+}
+
+void MgAdapt::appendMsgToLogFile(std::string& msg)
+{
+ std::ofstream logStream;
+ logStream.open(logFile, std::ofstream::out | std::ofstream::app);
+ logStream<< msg;
+ logStream.close();
+}
//================================================================================
/*!
* \brief Return command to run MG-Tetra mesher excluding file prefix (-f)
errStr = ToComment(" failed to find .mesh or .sol file from converter ")<< strerror( errno );
return errStr;
}
+ tmpFilesToBeDeleted.push_back(meshIn);
+ tmpFilesToBeDeleted.push_back(solFileIn);
if(useBackgroundMap && !isFileExist(sizeMapIn))
{
return errStr;
}
- meshFormatOutputMesh = meshIn;
- solFormatOutput.push_back(solFileIn);
+
cmd+= " --in "+ meshIn;
meshFormatOutputMesh = getFileName()+".mesh";
cmd+= " --out "+ meshFormatOutputMesh;
- if (useLocalMap) cmd+= " --sizemap "+ solFileIn;
- else if (useBackgroundMap)
+ if (useLocalMap || useConstantValue) cmd+= " --sizemap "+ solFileIn;
+ else // (useBackgroundMap)
{
cmd+= " --background_mesh "+ sizeMapIn ;
cmd+= " --background_sizemap "+ solFileIn;
+ tmpFilesToBeDeleted.push_back(sizeMapIn);
}
- else
+ //~else
+ //~{
+ //~// constant value TODO
+ //~}
+ /* sizemap file is not adapted in case of only surface adaptation see MeshGems docs */
+ std::string adapOp = "adaptation";
+ std::string adpOpVal = getOptionValue(adapOp);
+ std::string surfaceAdapt = "surface";
+ if(surfaceAdapt != adpOpVal )
{
- // constant value TODO
- }
-
+ std::string solFileOut = getFileName()+".sol";
+ cmd+= " --write_sizemap "+ solFileOut;
+ solFormatOutput.push_back(solFileOut);
+ }
if (verbosityLevel != defaultVerboseLevel())
{
{
std::vector<std::string> fieldFileNames;
- MeshFormatWriter writer;
+ MEDCoupling::MeshFormatWriter writer;
MEDCoupling::MCAuto<MEDCoupling::MEDFileData> mfd = MEDCoupling::MEDFileData::New(medFileIn);
MEDCoupling::MEDFileMeshes* meshes = mfd->getMeshes();
MEDCoupling::MEDFileMesh* fileMesh = meshes->getMeshAtPos(0); // ok only one mesh in file!
meshFormatsizeMapFile = getFileName();
meshFormatsizeMapFile += ".mesh";
- MEDCoupling::MCAuto<MEDCoupling::MEDFileData> tmpMfd = MEDCoupling::MEDFileData::New(sizeMapFile);
- MEDCoupling::MEDFileFields* tmpFields = tmpMfd->getFields();
- MEDCoupling::MEDFileAnyTypeFieldMultiTS* fts = tmpFields->getFieldWithName(fieldName);
- MEDCoupling::MCAuto<MEDCoupling::MEDFileFieldMultiTS> fts1 = dynamic_cast<MEDCoupling::MEDFileFieldMultiTS *>(fts);
- MEDCoupling::MCAuto<MEDCoupling::MEDFileAnyTypeField1TS> f = fts1->getTimeStep(timeStep, rank);
- MEDCoupling::MCAuto<MEDCoupling::MEDFileFieldMultiTS> tmFts = MEDCoupling::MEDFileFieldMultiTS::New();
- tmFts->pushBackTimeStep(f);
-
- MEDCoupling::MCAuto<MEDCoupling::MEDFileFields> tmp_fields = MEDCoupling::MEDFileFields::New();
- tmp_fields->pushField(tmFts);
-
-
- tmpMfd->setFields( tmp_fields );
- MeshFormatWriter tmpWriter;
- tmpWriter.setMeshFileName(meshFormatsizeMapFile);
- tmpWriter.setFieldFileNames( fieldFileNames);
- tmpWriter.setMEDFileDS(tmpMfd);
- tmpWriter.write();
-
+ buildBackGroundMeshAndSolFiles(fieldFileNames, meshFormatsizeMapFile);
}
else if(useLocalMap)
else
{
- MEDCoupling::MEDCouplingMesh* mesh = fileMesh->getMeshAtLevel(1); // nodes mesh
- MEDCoupling::MEDCouplingFieldDouble* fieldOnNodes=MEDCoupling::MEDCouplingFieldDouble::New(MEDCoupling::ON_NODES,MEDCoupling::NO_TIME);
- fieldOnNodes->setName("MyScalarFieldOnNodeNoTime");
- fieldOnNodes->setMesh(mesh);
- mesh->decrRef(); // no more need of mesh because mesh has been attached to fieldOnNodes
- MEDCoupling::DataArrayDouble *array=MEDCoupling::DataArrayDouble::New();
- array->alloc(fieldOnNodes->getMesh()->getNumberOfNodes(),1);//Implicitly fieldOnNodes will be a 1 component field.
- array->fillWithValue(constantValue);
- fieldOnNodes->setArray(array);
- array->decrRef();
- // fieldOnNodes is now usable
- // ...
- // fieldOnNodes is no more useful h
+ MEDCoupling::MCAuto<MEDCoupling::MEDCouplingMesh> mesh = fileMesh->getMeshAtLevel(1); // nodes mesh
+ MEDCoupling::MCAuto<MEDCoupling::MEDCouplingUMesh> umesh = mesh->buildUnstructured(); // nodes mesh
+ int dim = umesh->getSpaceDimension();
+ int version = sizeof(double) < 8 ? 1 : 2;
+ mcIdType nbNodes = umesh->getNumberOfNodes();
+ buildConstantSizeMapSolFile(solFormatFieldFileName, dim, version, nbNodes);
}
void MgAdapt::convertMeshFile(std::string& meshFormatIn, std::vector< std::string>& solFieldFileNames) const
{
- MeshFormatReader reader(meshFormatIn, solFieldFileNames);
+ MEDCoupling::MeshFormatReader reader(meshFormatIn, solFieldFileNames);
MEDCoupling::MCAuto<MEDCoupling::MEDFileData> mfd = reader.loadInMedFileDS();
// write MED
std::vector<family>::const_iterator fIt = famVec.begin();
for (; fIt!=famVec.end(); ++fIt)
- {
- std::string givenFamNameFromMeshGemConverter = fileMesh->getFamilyNameGivenId( fIt->_famId );
- fileMesh->changeFamilyName(givenFamNameFromMeshGemConverter, fIt->_famName);
+ {
+ try // safety : FAMILY could be lost P2-->P1
+ {
+ std::string givenFamNameFromMeshGemConverter = fileMesh->getFamilyNameGivenId( std::abs(fIt->_famId) );
+ fileMesh->changeFamilyId(std::abs(fIt->_famId), fIt->_famId);
+ fileMesh->changeFamilyName(givenFamNameFromMeshGemConverter, fIt->_famName);
+ }
+ catch (const std::exception& e)
+ {
+ std::cerr<<e.what();
+ }
}
}
fileMesh->setGroupInfo(info);
}
+
+void MgAdapt::buildConstantSizeMapSolFile(const std::string& solFormatFieldFileName, const int dim, const int version, const mcIdType nbNodes) const
+{
+ MeshFormat::Localizer loc;
+ MeshFormat::MeshFormatParser writer;
+ int fileId = writer.GmfOpenMesh( solFormatFieldFileName.c_str(), GmfWrite, version, dim);
+ int typTab[] = {GmfSca};
+ writer.GmfSetKwd(fileId, MeshFormat::GmfSolAtVertices, (int)nbNodes, 1, typTab);
+ for (mcIdType i = 0; i<nbNodes; i++)
+ {
+ double valTab[1] = {constantValue};
+ writer.GmfSetLin( fileId, MeshFormat::GmfSolAtVertices, valTab);
+ }
+ writer.GmfCloseMesh(fileId);
+}
+
+void MgAdapt::buildBackGroundMeshAndSolFiles(const std::vector<std::string>& fieldFileNames, const std::string& meshFormatsizeMapFile) const
+{
+ MEDCoupling::MCAuto<MEDCoupling::MEDFileData> tmpMfd = MEDCoupling::MEDFileData::New(sizeMapFile);
+ MEDCoupling::MEDFileFields* tmpFields = tmpMfd->getFields();
+ MEDCoupling::MEDFileAnyTypeFieldMultiTS* fts = tmpFields->getFieldWithName(fieldName);
+ MEDCoupling::MCAuto<MEDCoupling::MEDFileFieldMultiTS> fts1 = dynamic_cast<MEDCoupling::MEDFileFieldMultiTS *>(fts);
+ MEDCoupling::MCAuto<MEDCoupling::MEDFileAnyTypeField1TS> f = fts1->getTimeStep(timeStep, rank);
+ MEDCoupling::MCAuto<MEDCoupling::MEDFileFieldMultiTS> tmFts = MEDCoupling::MEDFileFieldMultiTS::New();
+ tmFts->pushBackTimeStep(f);
+
+ MEDCoupling::MCAuto<MEDCoupling::MEDFileFields> tmp_fields = MEDCoupling::MEDFileFields::New();
+ tmp_fields->pushField(tmFts);
+
+
+ tmpMfd->setFields( tmp_fields );
+ MEDCoupling::MeshFormatWriter tmpWriter;
+ tmpWriter.setMeshFileName(meshFormatsizeMapFile);
+ tmpWriter.setFieldFileNames( fieldFileNames);
+ tmpWriter.setMEDFileDS(tmpMfd);
+ tmpWriter.write();
+}
// =======================================================================
med_idt MgAdapt::openMedFile(const std::string aFile)
// =======================================================================
// =======================================================================
-void MgAdapt::getTimeStepInfos(std::string aFile, int& numdt, int& numit)
+void MgAdapt::getTimeStepInfos(std::string aFile, med_int& numdt, med_int& numit)
// =======================================================================
{
// Il faut voir si plusieurs maillages
- med_err erreur = 0 ;
+ herr_t erreur = 0 ;
med_idt medIdt ;
}
med_float dt;
- int tmp_numdt, tmp_numit;
+ med_int tmp_numdt, tmp_numit;
med_int step = data->myUseLastTimeStep ? nbofcstp : data->myTimeStep+1;
//~myPrint("step ", step);
if ( erreur < 0 )
{
- //~addMessage( ToComment(" error: error while reading field last time step ") << nomcha << " in file " << aFile , /*fatal=*/true );
+ //~addMessage( ToComment(" error: error while reading field ") << nomcha << "step (numdt, numit) = " <<"("<< numdt<< ", " \
+ numit<< ")" <<" in file " << aFile , /*fatal=*/true );
return;
}