Salome HOME
23288: [CEA 1626] Meshgems v2.3
[plugins/ghs3dprlplugin.git] / src / tepal2med / tetrahpc2med.cxx
index a24b3da70f451589b38101566611e534ed6eaea3..d3ba409c8b7202f1804cd59e2bb94b9abbeec546 100755 (executable)
@@ -45,7 +45,7 @@
 #include <QApplication>
 
 #include "ghs3dprl_msg_parser.h"
-#include "dlg_ghs3dmain.h"
+//#include "dlg_ghs3dmain.h"
 
 #ifdef WIN32
 #include <io.h>
@@ -90,7 +90,7 @@ med_idt ouvre_fichier_MED(char *fichier,int verbose)
   if (ret < 0) return fid;
 
   MEDfileNumVersionRd(fid, &majeur, &mineur, &release);
-  if (majeur < 2 || majeur == 2 && mineur < 2) {
+  if (( majeur < 2 ) || ( majeur == 2 && mineur < 2 )) {
     fprintf(stderr,"File %s from MED V%d.%d.%d not assumed\n",
                    fichier,majeur,mineur,release);
     //" version est ant�ieure �la version 2.2";
@@ -468,17 +468,99 @@ if (mymailw->verbose>3){
    return true;
 }
 
+/*
+mg-tetra_hpc_mpi.exe --help
+
+    =================================================
+    MG-Tetra_HPC -- MeshGems 2.1-11 (September, 2015)
+    =================================================
+
+        Distene SAS
+           Campus Teratec
+           2, rue de la Piquetterie
+           91680 Bruyeres le Chatel
+           FRANCE
+        Phone: +33(0)970-650-219   Fax: +33(0)169-269-033
+        EMail: <support@distene.com>
+
+        Running MG-Tetra_HPC (Copyright 2014 by Distene SAS)
+           date of run: 31-May-2016 AT 09:05:29
+           running on : Linux 2.6.32-431.11.2.el6.centos.plus.x86_64 x86_64
+           using modules: 
+                MeshGems-Core 2.1-11
+
+        MeshGems is a Registered Trademark of Distene SAS
+
+
+
+Usage: tetra_hpc_mpi.exe [options]
+
+Options: 
+
+     Short option (if it exists)
+    /    Long option
+   |    /   Description
+   |   |   /
+   v   v  v
+
+     --gradation <g>
+          Sets the size gradation value.
+          <gradation> is the desired maximum ratio between 2 adjacent
+          tetrahedron edges. The closer it is to 1.0, the more uniform the mesh
+          will be.
+          Default: 1.05
+
+     --help
+          Prints this help.
+          
+     --in <input mesh file name>
+          Sets the input file.
+          (MANDATORY)
+
+     --max_size <maximum size>
+          Sets the desired maximum cell size value.
+          Default: 0 (no maximum size).
+
+     --min_size <minimum size>
+          Default: 0 (no minimum size).
+          Sets the desired minimum cell size value.
+
+     --out <output mesh file name>
+          Sets the output file.
+          If unset, _tetra_hpc is appended to the input file basename.
+          Using an existing file is forbidden.
+          Using the same file as --in is forbidden.
+          
+     --verbose <verbose>
+          Set the verbosity level, increasing from 0 to 10.
+           <verbose> values are increasing from 0 to 10 :
+             0 : no details
+            10 : very detailed
+          Default: 3
+
+
+================================================================================
+               MG-Tetra_HPC -- MeshGems 2.1-11 (September, 2015)
+         END OF SESSION - MG-Tetra_HPC (Copyright 2014 by Distene SAS)
+                   compiled Sep  3 2015 12:50:47 on Linux_64
+               MeshGems is a Registered Trademark of Distene SAS
+================================================================================
+       ( Distene SAS
+        Phone: +33(0)970-650-219   Fax: +33(0)169-269-033
+        EMail: <support@distene.com> )
+*/
+
 
 //************************************
 int main(int argc, char *argv[])
 {
    bool ok;
    int i,nb,nbfiles,limit_swap,nbelem_limit_swap,limit_swap_defaut,verbose;
+   float gradation,min_size,max_size;
    QString path,pathini,casename,casenamemed,fileskinmed,
            tmp,cmd,format,format_tetra,
-           test,menu,launchtetra,background,deletegroups,
-           ToMergeSubdomains,ToTagSubdomains,ToOutputInterfaces,ToDiscardSubdomains,
-           version="V3.0 (MED3+tetra-hpc)";
+           test,launchtetra,background,multithread,deletegroups,
+           version="V4.0 (MED3 + tetra-hpc v2.3 Sept 2016)";
    
    char *chelp=NULL,
         *ccasename=NULL,
@@ -486,31 +568,27 @@ int main(int argc, char *argv[])
         *cmedname=NULL,
         *climitswap=NULL,
         *cverbose=NULL,
-        *ctest=NULL,
-        *cmenu=NULL,
         *claunchtetra=NULL,
-        *cToMergeSubdomains=NULL,
-        *cToTagSubdomains=NULL,
-        *cToOutputInterfaces=NULL,
-        *cToDiscardSubdomains=NULL,
+        *cgradation=NULL,
+        *cmin_size=NULL,
+        *cmax_size=NULL,
         *cbackground=NULL,
+        *cmultithread=NULL,
         *cdeletegroups=NULL;
 
    for (i = 0; i < argc; i++){
       if (!strncmp (argv[i], "--help", sizeof ("--help"))) chelp = &(argv[i][0]);
       else if (!strncmp (argv[i], "--casename=", sizeof ("--casename"))) ccasename = &(argv[i][sizeof ("--casename")]);
       else if (!strncmp (argv[i], "--number=", sizeof ("--number"))) cnumber = &(argv[i][sizeof ("--number")]);
-      else if (!strncmp (argv[i], "--medname=", sizeof ("--medname"))) cmedname = &(argv[i][sizeof ("--medname")]);
       else if (!strncmp (argv[i], "--limitswap=", sizeof ("--limitswap"))) climitswap = &(argv[i][sizeof ("--limitswap")]);
+      else if (!strncmp (argv[i], "--medname=", sizeof ("--medname"))) cmedname = &(argv[i][sizeof ("--medname")]);
       else if (!strncmp (argv[i], "--verbose=", sizeof ("--verbose"))) cverbose = &(argv[i][sizeof ("--verbose")]);
-      else if (!strncmp (argv[i], "--test=", sizeof ("--test"))) ctest = &(argv[i][sizeof ("--test")]);
-      else if (!strncmp (argv[i], "--menu=", sizeof ("--menu"))) cmenu = &(argv[i][sizeof ("--menu")]);
       else if (!strncmp (argv[i], "--launchtetra=", sizeof ("--launchtetra"))) claunchtetra = &(argv[i][sizeof ("--launchtetra")]);
-      else if (!strncmp (argv[i], "--merge_subdomains=", sizeof ("--merge_subdomains"))) cToMergeSubdomains = &(argv[i][sizeof ("--")]);
-      else if (!strncmp (argv[i], "--tag_subdomains=", sizeof ("--tag_subdomains"))) cToTagSubdomains = &(argv[i][sizeof ("--")]);
-      else if (!strncmp (argv[i], "--output_interfaces=", sizeof ("--output_interfaces"))) cToOutputInterfaces = &(argv[i][sizeof ("--")]);
-      else if (!strncmp (argv[i], "--discard_subdomains=", sizeof ("--discard_subdomains"))) cToDiscardSubdomains = &(argv[i][sizeof ("--")]);
+      else if (!strncmp (argv[i], "--gradation=", sizeof ("--gradation"))) cgradation = &(argv[i][sizeof ("--gradation")]);
+      else if (!strncmp (argv[i], "--min_size=", sizeof ("--min_size"))) cmin_size = &(argv[i][sizeof ("--min_size")]);
+      else if (!strncmp (argv[i], "--max_size=", sizeof ("--max_size"))) cmax_size = &(argv[i][sizeof ("--max_size")]);
       else if (!strncmp (argv[i], "--background=", sizeof ("--background"))) cbackground = &(argv[i][sizeof ("--background")]);
+      else if (!strncmp (argv[i], "--multithread=", sizeof ("--multithread"))) cmultithread = &(argv[i][sizeof ("--multithread")]);
       else if (!strncmp (argv[i], "--deletegroups=", sizeof ("--deletegroups"))) cdeletegroups = &(argv[i][sizeof ("--deletegroups")]);
       }
 
@@ -525,22 +603,19 @@ int main(int argc, char *argv[])
       "   --medname            : path and name of output MED files\n"<<
       "   --limitswap          : max size of working cpu memory (Mo) (before swapping on .temp files)\n"<<
       "   --verbose            : trace of execution (0->6)\n"<<
-      "   --test               : more tests about joints, before generation of output files\n"<<
-      "   --menu               : a GUI menu for option number\n"<<
-      "   --launchtetra        : also launch tetra-hpc on files casename.mesh and option number\n"<<
-      "   --merge_subdomains   : merge the subdomains into one mesh and write the output .mesh(b) file\n"<<
-      "   --tag_subdomains     : use the parallel subdomain index as tag into the merged output mesh\n"<<
-      "                            to identify the parallel subdomains (used in combination with the merge_subdomains option)\n"<<
-      "   --output_interfaces  : write the parallel subdomains interface triangles into the merged output mesh\n"<<
-      "                            (used in combination with the merge_subdomains option)\n"<<
-      "   --discard_subdomains : discard the parallel subdomains informations output (mesh, global numbering and interfaces)\n"<<
+      "   --launchtetra        : launch mg_tetra_hpc on files casename.mesh and option number,\n"<<
+      "                            else only use existing input/output files\n"<<
+      "   --gradation          : the desired maximum ratio between 2 adjacent tetrahedron edges (Default 1.05). The closer it is to 1.0\n"<<
+      "   --min_size           : the desired maximum cell size value (Default: 0 no maximum size)\n"<<
+      "   --max_size           : the desired minimum cell size value (Default: 0 no minimum size)\n"<<
       "   --background         : force background mode from launch tetra-hpc and generation of final MED files (big meshes)\n"<<
+      "   --multithread        : launch mg_tetra_hpc multithread version, else mpi version\n"<<
       "   --deletegroups       : regular expression (see QRegExp) which matches unwanted groups in final MED files\n"<<
       "                            (try --deletegroups=\"(\\bJOINT)\"\n"<<
       "                            (try --deletegroups=\"(\\bAll_Nodes|\\bAll_Faces)\"\n"<<
       "                            (try --deletegroups=\"((\\bAll_|\\bNew_)(N|F|T))\"\n";
-      std::cout<<"example:\n   tetrahpcl2med --casename=/tmp/GHS3DPRL --number=2 --medname=DOMAIN "<<
-                 "--limitswap=1000 --verbose=0 --test=yes --menu=no --launchtetra=no\n\n";
+      std::cout<<"example:\n   tetrahpc2med --casename=/tmp/GHS3DPRL --number=2 --medname=DOMAIN "<<
+                 "--verbose=0 --launchtetra=no\n\n";
       return 1;  //no output files
    }
    
@@ -563,12 +638,13 @@ int main(int argc, char *argv[])
       std::cerr<<"--number: a positive integer is expected\n\n";
       return 1;
    }
-   if (nbfiles>2048){ //delirium in 2014
+   if (nbfiles>2048){ //delirium in 2016
       std::cerr<<"--number: a positive integer <= 2048 is expected\n\n";
       return 1;
    }
    if (!cmedname) cmedname=ccasename;
    casenamemed=cmedname;
+
    limit_swap_defaut=1000; //1000Mo
    limit_swap=limit_swap_defaut;
    if (climitswap){
@@ -583,10 +659,7 @@ int main(int argc, char *argv[])
          return 1;
       }
    }
-   //default 1GOctet/8(for float)
-   nbelem_limit_swap=limit_swap*1000000; //100%
-   CVWtab::memorymax=nbelem_limit_swap;
-
+   
    verbose=1; //default
    if (cverbose){
       tmp=cverbose;
@@ -601,46 +674,54 @@ int main(int argc, char *argv[])
       }
    }
 
-   test="no"; //default
-   if (ctest){
-      tmp=ctest;
-      if (tmp=="yes") test="yes";
-   }
-
-   menu="no"; //default
-   if (cmenu){
-      tmp=cmenu;
-      if (tmp=="yes") menu="yes";
-   }
-
    launchtetra="no"; //default
    if (claunchtetra){
       tmp=claunchtetra;
       if (tmp=="yes") launchtetra="yes";
    }
 
-   ToMergeSubdomains="no"; //default
-   if (cToMergeSubdomains){
-      tmp=cToMergeSubdomains;
-      if (tmp=="yes") ToMergeSubdomains="yes";
-   }
-
-   ToTagSubdomains="no"; //default
-   if (cToTagSubdomains){
-      tmp=cToTagSubdomains;
-      if (tmp=="yes") ToTagSubdomains="yes";
+   gradation=1.05; //default
+   if (cgradation){
+      tmp=cgradation;
+      gradation=tmp.toFloat(&ok);
+      if (!ok){
+         std::cerr<<"--gradation: a float { 0; ]1,3] } is expected\n\n";
+         return 1;
+      }
+      if (gradation>3.){
+         std::cerr<<"--gradation: a float <= 3. is expected\n\n";
+         return 1;
+      }
+      if (gradation<0.){
+         std::cerr<<"--gradation: a float >= 0. is expected\n\n";
+         return 1;
+      }
    }
 
-   ToOutputInterfaces="no"; //default
-   if (cToOutputInterfaces){
-      tmp=cToOutputInterfaces;
-      if (tmp=="yes") ToOutputInterfaces="yes";
+   if (cmin_size){
+      tmp=cmin_size;
+      min_size=tmp.toFloat(&ok);
+      if (!ok){
+         std::cerr<<"--min_size: a float >= 0. is expected\n\n";
+         return 1;
+      }
+      if (gradation<0.){
+         std::cerr<<"--min_size: a float >= 0. is expected\n\n";
+         return 1;
+      }
    }
 
-   ToDiscardSubdomains="no"; //default
-   if (cToDiscardSubdomains){
-      tmp=cToDiscardSubdomains;
-      if (tmp=="yes") ToDiscardSubdomains="yes";
+   if (cmax_size){
+      tmp=cmax_size;
+      max_size=tmp.toFloat(&ok);
+      if (!ok){
+         std::cerr<<"--max_size: a float >= 0. is expected\n\n";
+         return 1;
+      }
+      if (gradation<0.){
+         std::cerr<<"--max_size: a float >= 0. is expected\n\n";
+         return 1;
+      }
    }
 
    background="no"; //default
@@ -649,24 +730,13 @@ int main(int argc, char *argv[])
       if (tmp=="yes") background="yes";
    }
 
-
-   // We must always have an application
-   if (menu=="yes") {
-    QApplication a(argc,argv);
-    dlg_ghs3dmain *m = new dlg_ghs3dmain();
-    m->setWindowTitle("tetrahpc2med 3.0");
-    m->show();
-    a.exec();
-    if ( m->result() == QDialog::Accepted ) {
-      std::cout<<"parameters "<<m->KeepFiles()<<" "<<m->NbPart()<<std::endl;
-      nbfiles=m->NbPart();
-    }
-    else {
-      return 1;
-    }
-    delete m;
+   multithread="no"; //default
+   if (cmultithread){
+      tmp=cmultithread;
+      if (tmp=="yes") multithread="yes";
    }
 
+
    int n=casenamemed.count('/');
    if (n>0)
       path=casenamemed.section('/',-n-1,-2)+"/";
@@ -689,8 +759,8 @@ int main(int argc, char *argv[])
       casename.truncate(20);
    }
 
-   /*std::cout<<"CaseNameMed="<<casenamemed<<std::endl;
-   std::cout<<"PathMed="<<path<<std::endl;*/
+   //std::cout<<"CaseNameMed="<<casenamemed.toLatin1().constData()<<std::endl;
+   //std::cout<<"PathMed="<<path.toLatin1().constData()<<std::endl;
 
    deletegroups="(\\bxyz)"; //default improbable name
    if (cdeletegroups){
@@ -699,23 +769,38 @@ int main(int argc, char *argv[])
    
    //verbose=5;
    if (verbose>0)
-   std::cout<<"tetrahpc2med "<<version.toLatin1().constData()<<" parameters:"<<
+   std::cout<<
+           "tetrahpc2med "<<version.toLatin1().constData()<<" parameters:"<<
          "\n   --casename="<<pathini.toLatin1().constData()<<casename.toLatin1().constData()<<
          "\n   --number="<<nbfiles<<
          "\n   --medname="<<path.toLatin1().constData()<<casenamemed.toLatin1().constData()<<
-         "\n   --limitswap="<<limit_swap<<
          "\n   --verbose="<<verbose<<
-         "\n   --test="<<test.toLatin1().constData()<<
-         "\n   --menu="<<menu.toLatin1().constData()<<
          "\n   --launchtetra="<<launchtetra.toLatin1().constData()<<
-         "\n   --merge_subdomains="<<ToMergeSubdomains.toLatin1().constData()<<
-         "\n   --tag_subdomains="<<ToTagSubdomains.toLatin1().constData()<<
-         "\n   --output_interfaces="<<ToOutputInterfaces.toLatin1().constData()<<
-         "\n   --discard_subdomains="<<ToDiscardSubdomains.toLatin1().constData()<<
+         "\n   --gradation="<<gradation<<
+         "\n   --min_size="<<min_size<<
+         "\n   --max_size="<<max_size<<
          "\n   --background="<<background.toLatin1().constData()<<
+         "\n   --multithread="<<multithread.toLatin1().constData()<<
          "\n   --deletegroups=\""<<deletegroups.toLatin1().constData()<<"\"\n";
+         
+   if (launchtetra=="yes"){
+     
+      //call tetra_hpc.py is pthon script which assumes mpirun or else if no multithread
+      //after compilation openmpi or else acrobatic DISTENE_LICENCE change...
+      
+      cmd="mg-tetra_hpc.py --number=" + QString::number(nbfiles)+
+          " --in=" + pathini+casename + ".mesh" +
+          " --out=" + pathini+casename + "_out.mesh" +
+          " --gradation=" + QString::number(gradation) +
+          " --min_size=" + QString::number(min_size) +
+          " --max_size=" + QString::number(max_size) +
+          " --multithread=" + multithread.toLatin1().constData() +
+          " > " + path + "tetrahpc.log";
+      std::cout<<"\nlaunch tetra_hpc command:"<<
+                 "\n   "<<cmd.toLatin1().constData()<<"\n"<<std::endl;
+   }
    
-   //utile si appel par plugin ghs3dprl sur big meshes et tetrahpc sur plusieurs jours
+   //utile si appel par plugin ghs3dprl sur big meshes et tetra_hpc sur plusieurs jours
 #ifndef WIN32
    if (background=="yes"){
       pid_t pid = fork();
@@ -733,41 +818,25 @@ int main(int argc, char *argv[])
    printf("background mode is not supported on win32 platform !\n");
 #endif
 
-   //"tetrahpc -f exemple1 -n 4"
    if (launchtetra=="yes"){
-      //tetra_hpc.exe --help
-      //mpirun -n 3 mg-tetra_hpc.exe --in GHS3DPRL.mesh --out TOTO.mesh
-      
-      //direct mpirun cause problem: invalid
-      //cmd="mpirun -n "+cmd.sprintf("%d",nbfiles)+" mg-tetra_hpc.exe --in "+
-      
-      //call tetra_hpc.bash is script which assumes mpirun after compilation openmpi etc...
-      cmd="mg-tetra_hpc.bash -n "+cmd.sprintf("%d",nbfiles)+" --in "+
-          pathini+casename+".mesh --out "+
-          pathini+casename+".mesh"+
-          " --merge_subdomains "+ToMergeSubdomains+
-          " --tag_subdomains "+ToTagSubdomains+
-          " --output_interfaces "+ToOutputInterfaces+
-          " --discard_subdomains "+ToDiscardSubdomains+
-          " > "+path+"tetrahpc.log";
-      std::cout<<"\nlaunchtetra command: background="<<cbackground<<
-                 "\n      "<<cmd.toLatin1().constData()<<std::endl;
-      system(cmd.toLatin1().constData()); // run
       //sometimes it is better to wait flushing files on slow filesystem...
       system("sleep 3");
+      system(cmd.toLatin1().constData()); // run
+      system("sleep 3");
    }
    ghs3dprl_mesh_wrap *mymailw=new ghs3dprl_mesh_wrap;
    //no constructor, later maybe
    mymailw->nbfiles=0;
    mymailw->nbfilestot=nbfiles;
    //for huge cases big array swap in huge binary files
-   mymailw->nbelem_limit_swap=nbelem_limit_swap;
    mymailw->verbose=verbose;
    mymailw->casename=casename;
    mymailw->medname=casenamemed;
    mymailw->path=path;
    mymailw->pathini=pathini;
    mymailw->deletegroups=QRegExp(deletegroups,Qt::CaseSensitive,QRegExp::RegExp);
+   mymailw->for_multithread=false;
+   if (multithread=="yes") mymailw->for_multithread=true;
    ghs3dprl_msg_parser handler;
    //constructor later maybe
    //handler.verbose=true;
@@ -778,13 +847,19 @@ int main(int argc, char *argv[])
    format=format.sprintf("%d",nbfiles);
    int nbf=format.length();
    format=format.sprintf(".%%0%dd.%%0%dd",nbf,nbf);
-   format_tetra=".%05d";
+   format_tetra=".%06d";
    if (verbose>10)std::cout<<"format "<<format.toLatin1().constData()<<std::endl;
    if (verbose>10)std::cout<<"format_tetra "<<format_tetra.toLatin1().constData()<<std::endl;
    mymailw->format=format;
    mymailw->format_tetra=format_tetra;
    mymailw->for_tetrahpc=true; //to know what files to read: .noboite or .mesh
    
+   //default 1GOctet/8(for float)
+   nbelem_limit_swap=limit_swap*1000000; //100%
+   CVWtab::memorymax=nbelem_limit_swap;
+   mymailw->nbelem_limit_swap=nbelem_limit_swap;
+
+   
    //something like "/home/wambeke/tmp/GHS3DPRL_skin.med"
    fileskinmed=pathini+casename+"_skin.med";
    //fileskinmed="/home/wambeke/tmp/GHS3DPRL_skin.med";