Mesh* pMesh,
int pPosition)
{
- // debug
- //cout << "INSERT PARTS BEFORE: " << endl;
- //cout << (*this) << endl;
-
MeshDisPart* part = new MeshDisPart();
part->create(
{
mParts[i]->mId++;
}
-
- // debug
- //cout << "INSERT PARTS AFTER: " << endl;
- //cout << (*this) << endl;
}
void MeshDis::removeParts(const char* pPrefixPartName)
{
- // debug
- //cout << "REMOVE PARTS BEFORE: " << endl;
- //cout << (*this) << endl;
-
if (pPrefixPartName == NULL) throw NullArgumentException("", __FILE__, __LINE__);
char strPrefix[256];
// remove part which have the same name and all sub_parts
// e.g. if pPrefixPartName="PART_4" => remove "PART_4" and "PART_4_*", but not "PART41"
if ((strcmp(currentPart->getPartName(), pPrefixPartName) == 0) ||
- startWith(currentPart->getPartName(), strPrefix))
+ startsWith(currentPart->getPartName(), strPrefix))
{
mParts.erase(itPart);
delete currentPart;
}
}
-
- // debug
- //cout << "REMOVE PARTS AFTER: " << endl;
- //cout << (*this) << endl;
}
void MeshDis::splitPart(const char* pPartName, int pNbParts, int pPartitionner)
{
+ cout << "MULTIPR: MeshDis::splitPart()" << endl;
if (pPartName == NULL) throw NullArgumentException("", __FILE__, __LINE__);
if (pNbParts < 2) throw IllegalArgumentException("", __FILE__, __LINE__);
if ((pPartitionner != MULTIPR_METIS) && (pPartitionner != MULTIPR_SCOTCH)) throw IllegalArgumentException("should be 0=METIS or 1=SCOTCH", __FILE__, __LINE__);
+ cout << "MULTIPR: MeshDis::splitPart(): args OK" << endl;
//---------------------------------------------------------------------
// Find the MED file corresponding to the given part
//---------------------------------------------------------------------
{
throw IllegalArgumentException("part not found in this distributed MED file", __FILE__, __LINE__);
}
+
+ cout << "MULTIPR: MeshDis::splitPart(): find part OK" << endl;
//---------------------------------------------------------------------
// Load the sequential MED file
MEDSPLITTER::MESHCollection* collection;
collection = new MEDSPLITTER::MESHCollection(part->getMEDFileName(), part->getMeshName());
+ cout << "MULTIPR: MeshDis::splitPart(): MEDSPLITTER collection OK" << endl;
//---------------------------------------------------------------------
// Partition the group
//---------------------------------------------------------------------
{
try
{
+ cout << "MULTIPR: try to create partition using SCOTCH: #parts=" << pNbParts << endl;
topology = collection->createPartition(pNbParts, MEDSPLITTER::Graph::SCOTCH);
+ cout << "MULTIPR: assigned SCOTCH" << endl;
}
catch (...)
{
}
catch (...)
{
+ cout << "MEDSPLITTER error: new MESHCollection()" << endl;
throw RuntimeException("MEDSPLITTER error: new MESHCollection()", __FILE__, __LINE__);
}
}
const char* originalFilename = part->getMEDFileName();
string strPrefix = removeExtension(originalFilename, ".med");
-cout << (*this) << endl;
+ // debug
+ //cout << (*this) << endl;
+
//---------------------------------------------------------------------
// Decimates the given mesh
//---------------------------------------------------------------------
const char* pFilterParams)
{
MeshDisPart* part = findPart(pPartName);
- if (part == NULL) return "";
+ if (part == NULL)
+ {
+ return "";
+ }
try
{
}
multipr::DecimationFilter* filter = multipr::DecimationFilter::create(pFilterName);
- if (filter == NULL) return "";
+ if (filter == NULL)
+ {
+ return "";
+ }
multipr::DecimationFilterGradAvg* filterGrad = dynamic_cast<multipr::DecimationFilterGradAvg*>(filter);
}
catch(...)
{
- return "";
}
+
+ return "";
}
// read number of parts
int nbParts = atoi(charbuffer);
- //cout << "DBG: readDistributedMED: #parts=" << nbParts << endl;
+ //cout << "readDistributedMED: #parts=" << nbParts << endl;
//---------------------------------------------------------------------
// Read infos about sub-parts
//---------------------------------------------------------------------
fileMaster.close();
if (fileMaster.fail()) throw IOException("i/o error while closing MED master file", __FILE__, __LINE__);
- //cout << "DBG: readDistributedMED: close" << endl;
}
/**
* Retrieves the output of MEDSPLITTER and convert it for MULTIPR.
*/
-int convertMedsplitterToMultipr(ofstream& pFileMaster, const char* pTmpFilename, int pId, MeshDisPart* pPart)
+int convertMedsplitterToMultipr(ofstream& pFileMaster, const char* pTmpFilename, int pId, MeshDisPart* pPart, string pDestPath)
{
MULTIPR_LOG("convert" << endl);
// read number of parts
int nbParts = atoi(charbuffer);
- cout << "nb parts=" << nbParts << endl;
+ //cout << "nb parts=" << nbParts << endl;
char lMeshName[MED_TAILLE_NOM + 1];
int lId;
//cout << lMeshName << " " << (pId + i) << " " << pPart->getPartName() << "_" << (i + 1) << " " << lPath << " " << lMEDFileName << endl;
+ string strDestFilename = pDestPath + multipr::getFilenameWithoutPath(lMEDFileName);
+ if (strcmp(lMEDFileName, strDestFilename.c_str()) != 0)
+ {
+ multipr::copyFile(lMEDFileName, pDestPath.c_str());
+ strcpy(lMEDFileName, strDestFilename.c_str());
+ }
+
pFileMaster << lMeshName << " " << (pId + i) << " " << pPart->getPartName() << "_" << (i + 1) << " " << lPath << " " << lMEDFileName << endl;
}
strMasterFilename = strPrefix + strExtension;
}
+ string strDestPath = multipr::getPath(strMasterFilename.c_str());
+
MULTIPR_LOG("Create master: " << strMasterFilename << endl);
strcpy(mMEDfilename, strMasterFilename.c_str());
{
mParts[itPart]->mId = id;
id++;
+
+ // copy file in another directory?
+ string strSrcPath = multipr::getPath(mParts[itPart]->getMEDFileName());
+ if (strSrcPath != strDestPath)
+ {
+ cout << "Write: KEEP_AS_IT: copy file" << endl;
+ string strDestFilename = strDestPath + multipr::getFilenameWithoutPath(mParts[itPart]->getMEDFileName());
+ multipr::copyFile(mParts[itPart]->getMEDFileName(), strDestPath.c_str());
+ strcpy(mParts[itPart]->mMEDFileName, strDestFilename.c_str());
+ }
+
fileMaster << (*mParts[itPart]) << endl;
cout << (*mParts[itPart]) << endl;
break;
{
if (strlen(mParts[itPart]->getMEDFileName()) == 0) throw IOException("MED filename is empty", __FILE__, __LINE__);
if (mParts[itPart]->mMesh == NULL) throw IllegalStateException("invalid mesh (shoult not be NULL)", __FILE__, __LINE__);
+
+ string strDestFilename = strDestPath + multipr::getFilenameWithoutPath(mParts[itPart]->getMEDFileName());
+ strcpy(mParts[itPart]->mMEDFileName, strDestFilename.c_str());
+
mParts[itPart]->mMesh->writeMED(mParts[itPart]->getMEDFileName());
mParts[itPart]->mId = id;
id++;
sprintf(tmpFilename, "%s_part", strPrefix.c_str());
mParts[itPart]->mCollection->write(tmpFilename);
mParts[itPart]->mCollection->castAllFields(*(mParts[itPart]->mOldCollection));
- int ret = convertMedsplitterToMultipr(fileMaster, tmpFilename, id, mParts[itPart]);
+ int ret = convertMedsplitterToMultipr(fileMaster, tmpFilename, id, mParts[itPart], strDestPath);
id += ret;
remove(mParts[itPart]->getMEDFileName());
break;