Salome HOME
Compilation under Windows
[tools/medcoupling.git] / src / RENUMBER / renumbering.cxx
index c9670f191c2c6e1279edae12f9f112e7357f538a..51ef7fa4d55144388b6337990713bf0d470a4487 100644 (file)
@@ -1,9 +1,9 @@
-// Copyright (C) 2007-2013  CEA/DEN, EDF R&D
+// Copyright (C) 2007-2020  CEA/DEN, EDF R&D
 //
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Lesser General Public
 // License as published by the Free Software Foundation; either
-// version 2.1 of the License.
+// version 2.1 of the License, or (at your option) any later version.
 //
 // This library is distributed in the hope that it will be useful,
 // but WITHOUT ANY WARRANTY; without even the implied warranty of
 #include <iostream>
 
 using namespace std;
-using namespace ParaMEDMEM;
+using namespace MEDCoupling;
 using namespace MED_RENUMBER;
 
 int main(int argc, char** argv)
 {
   double t_begin,t_read_st,t_compute_graph,t_family,t_field;
-  t_begin=clock();
+  t_begin=(double)clock();
   if (argc <5)
     {
       cerr << "Usage : " << argv[0] 
@@ -57,55 +57,72 @@ int main(int argc, char** argv)
     }
   // Reading file structure
   cout << "Reading : " << flush;
-  MEDCouplingAutoRefCountObjectPtr<MEDFileData> fd=MEDFileData::New(filename_in.c_str());
-  MEDFileMesh *m=fd->getMeshes()->getMeshWithName(meshname.c_str());
+  MCAuto<MEDFileData> fd(MEDFileData::New(filename_in));
+  MEDFileMesh *m=fd->getMeshes()->getMeshWithName(meshname);
   MEDFileUMesh *mc=dynamic_cast<MEDFileUMesh *>(m);
   if(!mc)
     {
       std::ostringstream oss; oss << "In file \"" << filename_in << "\" the mesh name \"" << meshname<< "\" exists but is not unstructured !";
       throw INTERP_KERNEL::Exception(oss.str().c_str());
     }
-  t_read_st=clock();
+  t_read_st=(double)clock();
   cout << (t_read_st-t_begin)/(double) CLOCKS_PER_SEC << "s" << endl << flush;
   // Reading mesh
-  MEDCouplingAutoRefCountObjectPtr<MEDCouplingUMesh> workMesh=mc->getMeshAtLevel(0);
-  std::vector<int> code=workMesh->getDistributionOfTypes();
+  MCAuto<MEDCouplingUMesh> workMesh=mc->getMeshAtLevel(0);
+  //std::vector<mcIdType> code=workMesh->getDistributionOfTypes();
   cout << "Building the graph : " << flush;
-  DataArrayInt *neighb=0,*neighbI=0;
+  DataArrayIdType *neighb=0,*neighbI=0;
   workMesh->computeNeighborsOfCells(neighb,neighbI);
-  MEDCouplingAutoRefCountObjectPtr<DataArrayInt> neighbSafe(neighb),neighbISafe(neighbI);
-  const int *graph=neighbSafe->begin();
-  const int *graph_index=neighbISafe->begin();
+  MCAuto<DataArrayIdType> neighbSafe(neighb),neighbISafe(neighbI),ipermSafe,permSafe;
+  const mcIdType *graph=neighbSafe->begin();
+  const mcIdType *graph_index=neighbISafe->begin();
   // Compute permutation iperm->new2old perm->old2new
-  vector<int> iperm,perm;
+  DataArrayIdType *iperm(0),*perm(0);
   Renumbering *renumb=RenumberingFactory(type_renum);
   renumb->renumber(graph,graph_index,workMesh->getNumberOfCells(),iperm,perm);
+  ipermSafe=iperm; permSafe=perm;
   delete renumb;
-  iperm.clear();//erase new2old, we are using only old 2 new
-  t_compute_graph=clock();
+  ipermSafe=0;//erase new2old, we are using only old 2 new
+  t_compute_graph=(double)clock();
   cout << " : " << (t_compute_graph-t_read_st)/(double) CLOCKS_PER_SEC << "s" << endl;
   cout.flush();
   // Connectivity
   cout << "Reordering connectivity & families and writing : " << flush;
-  workMesh->renumberCells(&perm[0],false);
+  workMesh->renumberCells(perm->begin(),false);
   mc->setMeshAtLevel(0,workMesh);
-  const DataArrayInt *famField=mc->getFamilyFieldAtLevel(0);
+  const DataArrayIdType *famField=mc->getFamilyFieldAtLevel(0);
   if(famField)
     {
-      MEDCouplingAutoRefCountObjectPtr<DataArrayInt> famField2=famField->renumber(&perm[0]);
+      MCAuto<DataArrayIdType> famField2=famField->renumber(perm->begin());
       mc->setFamilyFieldArr(0,famField2);
     }
-  mc->write(filename_out.c_str(),2);
-  t_family=clock();
+  mc->write(filename_out,2);
+  t_family=(double)clock();
   cout << " : " << (t_family-t_compute_graph)/(double) CLOCKS_PER_SEC << "s" << endl << flush;
   // Fields
   cout << "Reordering fields and writing : " << flush;
   MEDFileFields *fs=fd->getFields();
-  MEDCouplingAutoRefCountObjectPtr<DataArrayInt> o2n=DataArrayInt::New();
-  o2n->useArray(&perm[0],false,CPP_DEALLOC,perm.size(),1);
-  fs->renumberEntitiesLyingOnMesh(meshname.c_str(),code,code,o2n);
-  fs->write(filename_out.c_str(),0);
-  t_field=clock();
+  if(fs)
+    {
+      for(int i=0;i<fs->getNumberOfFields();i++)
+        {
+          MEDFileFieldMultiTS *fmts=dynamic_cast<MEDFileFieldMultiTS *>(fs->getFieldAtPos(i));
+          if(!fmts) continue;
+          if(fmts->getMeshName()==meshname)
+            {
+              for(int j=0;j<fmts->getNumberOfTS();j++)
+                {
+                  MEDFileField1TS *f1ts=dynamic_cast<MEDFileField1TS*>(fmts->getTimeStepAtPos(j));
+                  if(!f1ts) continue;
+                  DataArrayDouble *arr=f1ts->getUndergroundDataArray();
+                  arr->renumberInPlace(perm->begin());
+                }
+            }
+        }
+      fs->write(filename_out,0);
+      //fs->renumberEntitiesLyingOnMesh(meshname,code,code,o2n); bugged
+    }
+  t_field=(double)clock();
   cout << " : " << (t_field-t_family)/(double) CLOCKS_PER_SEC << "s" << endl << flush;
   return 0;
 }