Ejemplo n.º 1
0
int main(int argc,char *argv[]) {
  MMG5_pMesh      mmgMesh;
  MMG5_pSol       mmgSol,mmgDisp;
  int             k,ier;
  char            *pwd,*inname,*outname;

  fprintf(stdout,"  -- TEST MMG3DLIB \n");

  /* Name and path of the mesh files */
  pwd = getenv("PWD");
  inname = (char *) calloc(strlen(pwd) + 40, sizeof(char));
  if ( inname == NULL ) {
    perror("  ## Memory problem: calloc");
    exit(EXIT_FAILURE);
  }
  outname = (char *) calloc(strlen(pwd) + 49, sizeof(char));
  if ( outname == NULL ) {
    perror("  ## Memory problem: calloc");
    exit(EXIT_FAILURE);
  }
  sprintf(inname, "%s%s%s", pwd, "/../libexamples/mmg3d/example4/", "tinyBoxt");

  /** 1) Initialisation of mesh and sol structures */
  /* args of InitMesh: mesh=&mmgMesh, sol=&mmgSol */
  mmgMesh = NULL;
  mmgSol  = NULL;
  mmgDisp = NULL; //Useless here: just needed forthe lagrangian motion option
  MMG5_Init_mesh(&mmgMesh,&mmgSol,&mmgDisp);

  /** 2) Build mesh in MMG5 format */
  /** Two solutions: just use the MMG5_loadMesh function that will read a .mesh(b)
     file formatted or manually set your mesh using the MMG5_Set* functions */

  /** with MMG5_loadMesh function */
  /** a) (not mandatory): give the mesh name
     (by default, the "mesh.mesh" file is oppened)*/
  if ( !MMG5_Set_inputMeshName(mmgMesh,inname) )
    exit(EXIT_FAILURE);
  /** b) function calling */
  if ( !MMG5_loadMesh(mmgMesh) )  exit(EXIT_FAILURE);

  /** 3) Build displacement in MMG5 format */
  /** Two solutions: just use the MMG5_loadMet function that will read a .sol(b)
      file formatted or manually set your sol using the MMG5_Set* functions */

  /**------------------- Lagrangian motion option ----------------------------*/
  /* Ask for lagrangian motion (mode 1) */
  if ( !MMG5_Set_iparameter(mmgMesh,mmgDisp,MMG5_IPARAM_lag, 1) )
    exit(EXIT_FAILURE);

  /** With MMG5_loadMet function */
  /** a) (not mandatory): give the sol name
     (by default, the "mesh.sol" file is oppened)*/
  if ( !MMG5_Set_inputSolName(mmgMesh,mmgDisp,inname) )
    exit(EXIT_FAILURE);

  /** b) function calling */
  if ( !MMG5_loadMet(mmgMesh,mmgDisp) )
    exit(EXIT_FAILURE);

  /** 4) (not mandatory): check if the number of given entities match with mesh size */
  if ( !MMG5_Chk_meshData(mmgMesh,mmgDisp) ) exit(EXIT_FAILURE);

  /** 5) (not mandatory): set your global parameters using the
      MMG5_Set_iparameter and MMG5_Set_dparameter function
      (resp. for integer parameters and double param)*/


  /**------------------- Lagrangian motion computation ---------------------*/

  /* debug mode ON (default value = OFF) */
  if ( !MMG5_Set_iparameter(mmgMesh,mmgDisp,MMG5_IPARAM_debug, 1) )
    exit(EXIT_FAILURE);

  /** library call */
  ier = MMG5_mmg3dmov(mmgMesh,mmgSol,mmgDisp);
  if ( ier == MMG5_STRONGFAILURE ) {
    fprintf(stdout,"BAD ENDING OF MMG3DLIB: UNABLE TO SAVE MESH\n");
    return(ier);
  } else if ( ier == MMG5_LOWFAILURE )
    fprintf(stdout,"BAD ENDING OF MMG3DLIB\n");

  /* (Not mandatory) Automatically save the mesh */
  sprintf(outname, "%s%s%s", pwd, "/../libexamples/mmg3d/example4/", "tinyBoxt.o.mesh");
  if ( !MMG5_Set_outputMeshName(mmgMesh,outname) )
    exit(EXIT_FAILURE);

  MMG5_saveMesh(mmgMesh);

  /* (Not mandatory) Automatically save the solution */
  if ( !MMG5_Set_outputSolName(mmgMesh,mmgSol,outname) )
    exit(EXIT_FAILURE);

  MMG5_saveMet(mmgMesh,mmgSol);

  /* 9) free the MMG3D5 structures */
  MMG5_Free_all(mmgMesh,mmgSol,mmgDisp);

  free(inname);
  inname = NULL;
  free(outname);
  outname = NULL;

  return(ier);
}
Ejemplo n.º 2
0
Archivo: mmg3d.c Proyecto: XL64/mmg
int main(int argc,char *argv[]) {
  MMG5_pMesh      mesh;
  MMG5_pSol       met;
  int             ier;
  char            stim[32];

  atexit(endcod);

  tminit(ctim,TIMEMAX);
  chrono(ON,&ctim[0]);

  /* assign default values */
  mesh = NULL;
  met  = NULL;

  MMG5_Init_mesh(&mesh,&met);

  /* reset default values for file names */
  MMG5_Free_names(mesh,met);

  /* command line */
  if ( !MMG5_parsar(argc,argv,mesh,met) )  return(1);

  /* load data */
  fprintf(stdout,"\n  -- INPUT DATA\n");
  chrono(ON,&ctim[1]);
  /* read mesh file */
  if ( !MMG5_loadMesh(mesh) ) {
    MMG5_Free_all(mesh,met );
    return(MMG5_STRONGFAILURE);
  }
  if ( !MMG5_Set_solSize(mesh,met,MMG5_Vertex,0,MMG5_Scalar) ) {
    MMG5_Free_all(mesh,met);
    return(MMG5_STRONGFAILURE);
  }

  /* read metric if any */
  ier = MMG5_loadMet(mesh,met);
  if ( !ier ) {
    MMG5_Free_all(mesh,met);
    return(MMG5_STRONGFAILURE);
  }

  if ( !MMG5_parsop(mesh,met) )
    RETURN_AND_FREE(mesh,met,MMG5_LOWFAILURE);

  chrono(OFF,&ctim[1]);
  printim(ctim[1].gdif,stim);
  fprintf(stdout,"  -- DATA READING COMPLETED.     %s\n",stim);

  ier = MMG5_mmg3dlib(mesh,met );

  if ( ier != MMG5_STRONGFAILURE ) {
    chrono(ON,&ctim[1]);
    if ( mesh->info.imprim )
      fprintf(stdout,"\n  -- WRITING DATA FILE %s\n",mesh->nameout);
    if ( !MMG5_saveMesh(mesh) )         {
      MMG5_Free_all(mesh,met );
      return(EXIT_FAILURE);
    }
    if ( !MMG5_saveMet(mesh,met) )     {
      MMG5_Free_all(mesh,met);
      return(EXIT_FAILURE);
    }
    chrono(OFF,&ctim[1]);
    if ( mesh->info.imprim )
      fprintf(stdout,"  -- WRITING COMPLETED\n");
  }

  /* free mem */
  chrono(OFF,&ctim[0]);
  printim(ctim[0].gdif,stim);
  fprintf(stdout,"\n   MMG3D: ELAPSED TIME  %s\n",stim);
  MMG5_Free_all(mesh,met);
  return(ier);
}
Ejemplo n.º 3
0
int main(int argc,char *argv[]) {
  MMG5_pMesh      mmgMesh;
  MMG5_pSol       mmgSol;
  int             ier,k;

  fprintf(stdout,"  -- TEST MMG3DLIB \n");

  /** ------------------------------ STEP   I -------------------------- */
  /** 1) Initialisation of mesh and sol structures */
  /* args of InitMesh: mesh=&mmgMesh, sol=&mmgSol */
  mmgMesh = NULL;
  mmgSol  = NULL;
  MMG5_Init_mesh(&mmgMesh,&mmgSol,NULL);

  /** 2) Build mesh in MMG5 format */
  /** Two solutions: just use the MMG5_loadMesh function that will read a .mesh(b)
      file formatted or manually set your mesh using the MMG5_Set* functions */

  /** Manually set of the mesh */
  /** a) give the size of the mesh: 12 vertices, 12 tetra, 20 triangles, 0 edges */
  if ( !MMG5_Set_meshSize(mmgMesh,12,12,20,0) )  exit(EXIT_FAILURE);

  /** b) give the vertices: for each vertex, give the coordinates, the reference
      and the position in mesh of the vertex */
  mmgMesh->point[1].c[0]  = 0.;  mmgMesh->point[1].c[1]  = 0.; mmgMesh->point[1].c[2]  = 0.; mmgMesh->point[1].ref  = 0;
  /* or with the api function :
     if ( !MMG5_Set_vertex(mmgMesh,0  ,0  ,0  ,0,  1) )  exit(EXIT_FAILURE); */
  mmgMesh->point[2].c[0]  = 0.5; mmgMesh->point[2].c[1]  = 0;  mmgMesh->point[2].c[2]  = 0;  mmgMesh->point[2].ref  = 0;
  mmgMesh->point[3].c[0]  = 0.5; mmgMesh->point[3].c[1]  = 0;  mmgMesh->point[3].c[2]  = 1;  mmgMesh->point[3].ref  = 0;
  mmgMesh->point[4].c[0]  = 0;   mmgMesh->point[4].c[1]  = 0;  mmgMesh->point[4].c[2]  = 1;  mmgMesh->point[4].ref  = 0;
  mmgMesh->point[5].c[0]  = 0;   mmgMesh->point[5].c[1]  = 1;  mmgMesh->point[5].c[2]  = 0;  mmgMesh->point[5].ref  = 0;
  mmgMesh->point[6].c[0]  = 0.5; mmgMesh->point[6].c[1]  = 1;  mmgMesh->point[6].c[2]  = 0;  mmgMesh->point[6].ref  = 0;
  mmgMesh->point[7].c[0]  = 0.5; mmgMesh->point[7].c[1]  = 1;  mmgMesh->point[7].c[2]  = 1;  mmgMesh->point[7].ref  = 0;
  mmgMesh->point[8].c[0]  = 0;   mmgMesh->point[8].c[1]  = 1;  mmgMesh->point[8].c[2]  = 1;  mmgMesh->point[8].ref  = 0;
  mmgMesh->point[9].c[0]  = 1;   mmgMesh->point[9].c[1]  = 0;  mmgMesh->point[9].c[2]  = 0;  mmgMesh->point[9].ref  = 0;
  mmgMesh->point[10].c[0] = 1;   mmgMesh->point[10].c[1] = 1;  mmgMesh->point[10].c[2] = 0;  mmgMesh->point[10].ref = 0;
  mmgMesh->point[11].c[0] = 1;   mmgMesh->point[11].c[1] = 0;  mmgMesh->point[11].c[2] = 1;  mmgMesh->point[11].ref = 0;
  mmgMesh->point[12].c[0] = 1;   mmgMesh->point[12].c[1] = 1;  mmgMesh->point[12].c[2] = 1;  mmgMesh->point[12].ref = 0;

  /*tetra*/
  mmgMesh->tetra[1].v[0]  = 1;  mmgMesh->tetra[1].v[1]  = 2;  mmgMesh->tetra[1].v[2]  = 4;  mmgMesh->tetra[1].v[3]  = 8;  mmgMesh->tetra[1].ref  = 1;
  /* or with the api function :
     if ( !MMG5_Set_tetrahedra(mmgMesh,1 ,2 ,4 ,8, 1) )  exit(EXIT_FAILURE); */
  mmgMesh->tetra[2].v[0]  = 8;  mmgMesh->tetra[2].v[1]  = 3;  mmgMesh->tetra[2].v[2]  = 2;  mmgMesh->tetra[2].v[3]  = 7;  mmgMesh->tetra[2].ref  = 1;
  mmgMesh->tetra[3].v[0]  = 2;  mmgMesh->tetra[3].v[1]  = 5;  mmgMesh->tetra[3].v[2]  = 6;  mmgMesh->tetra[3].v[3]  = 8;  mmgMesh->tetra[3].ref  = 1;
  mmgMesh->tetra[4].v[0]  = 8;  mmgMesh->tetra[4].v[1]  = 5;  mmgMesh->tetra[4].v[2]  = 1;  mmgMesh->tetra[4].v[3]  = 2;  mmgMesh->tetra[4].ref  = 1;
  mmgMesh->tetra[5].v[0]  = 2;  mmgMesh->tetra[5].v[1]  = 7;  mmgMesh->tetra[5].v[2]  = 8;  mmgMesh->tetra[5].v[3]  = 6;  mmgMesh->tetra[5].ref  = 1;
  mmgMesh->tetra[6].v[0]  = 2;  mmgMesh->tetra[6].v[1]  = 4;  mmgMesh->tetra[6].v[2]  = 3;  mmgMesh->tetra[6].v[3]  = 8;  mmgMesh->tetra[6].ref  = 1;
  mmgMesh->tetra[7].v[0]  = 2;  mmgMesh->tetra[7].v[1]  = 9;  mmgMesh->tetra[7].v[2]  = 3;  mmgMesh->tetra[7].v[3]  = 7;  mmgMesh->tetra[7].ref  = 2;
  mmgMesh->tetra[8].v[0]  = 7;  mmgMesh->tetra[8].v[1]  = 11; mmgMesh->tetra[8].v[2]  = 9;  mmgMesh->tetra[8].v[3]  = 12; mmgMesh->tetra[8].ref  = 2;
  mmgMesh->tetra[9].v[0]  = 9;  mmgMesh->tetra[9].v[1]  = 6;  mmgMesh->tetra[9].v[2]  = 10; mmgMesh->tetra[9].v[3]  = 7;  mmgMesh->tetra[9].ref  = 2;
  mmgMesh->tetra[10].v[0] = 7;  mmgMesh->tetra[10].v[1] = 6;  mmgMesh->tetra[10].v[2] = 2;  mmgMesh->tetra[10].v[3] = 9;  mmgMesh->tetra[10].ref = 2;
  mmgMesh->tetra[11].v[0] = 9;  mmgMesh->tetra[11].v[1] = 12; mmgMesh->tetra[11].v[2] = 7;  mmgMesh->tetra[11].v[3] = 10; mmgMesh->tetra[11].ref = 2;
  mmgMesh->tetra[12].v[0] = 9;  mmgMesh->tetra[12].v[1] = 3;  mmgMesh->tetra[12].v[2] = 11; mmgMesh->tetra[12].v[3] = 7;  mmgMesh->tetra[12].ref = 2;

  /** 3) Build sol in MMG5 format */
  /** Two solutions: just use the MMG5_loadMet function that will read a .sol(b)
      file formatted or manually set your sol using the MMG5_Set* functions */

  /** Manually set of the sol */
  /** a) give info for the sol structure: sol applied on vertex entities,
      number of vertices=12, the sol is scalar*/
  if ( !MMG5_Set_solSize(mmgMesh,mmgSol,MMG5_Vertex,12,MMG5_Scalar) )
    exit(EXIT_FAILURE);

  /** b) give solutions values and positions */
  for(k=1 ; k<=12 ; k++) {
    mmgSol->m[k] = 0.5;
    /* or with the api function :
       if ( !MMG5_Set_scalarSol(mmgSol,0.5,k) ) exit(EXIT_FAILURE); */
  }
  /** 4) If you don't use the API functions, you MUST call
      the MMG5_Set_handGivenMesh() function. Don't call it if you use
      the API functions */
  MMG5_Set_handGivenMesh(mmgMesh);

  /** 5) (not mandatory): check if the number of given entities match with mesh size */
  if ( !MMG5_Chk_meshData(mmgMesh,mmgSol) ) exit(EXIT_FAILURE);

  /** ------------------------------ STEP  II -------------------------- */
  /** library call */
  ier = MMG5_mmg3dlib(mmgMesh,mmgSol);
  if ( ier == MMG5_STRONGFAILURE ) {
    fprintf(stdout,"BAD ENDING OF MMG3DLIB: UNABLE TO SAVE MESH\n");
    return(ier);
  } else if ( ier == MMG5_LOWFAILURE )
    fprintf(stdout,"BAD ENDING OF MMG3DLIB\n");


  /** ------------------------------ STEP III -------------------------- */
  /** get results */
  /** Two solutions: just use the MMG5_saveMesh/MMG5_saveMet functions
      that will write .mesh(b)/.sol formatted files or manually get your mesh/sol
      using the MMG5_getMesh/MMG5_getSol functions */

  /** 1) Automatically save the mesh */
  /** a)  (not mandatory): give the ouptut mesh name using MMG5_Set_outputMeshName
      (by default, the mesh is saved in the "mesh.o.mesh" file */
  MMG5_Set_outputMeshName(mmgMesh,"result0.mesh");
  /** b) function calling */
  MMG5_saveMesh(mmgMesh);

  /** 2) Automatically save the solution */
  /** a)  (not mandatory): give the ouptut sol name using MMG5_Set_outputSolName
      (by default, the mesh is saved in the "mesh.o.sol" file */
  MMG5_Set_outputSolName(mmgMesh,mmgSol,"result0.sol");
  /** b) function calling */
  MMG5_saveMet(mmgMesh,mmgSol);

  /** 3) Free the MMG3D5 structures */
  MMG5_Free_all(mmgMesh,mmgSol,NULL);

  return(ier);
}
Ejemplo n.º 4
0
Archivo: mmg3d.c Proyecto: XL64/mmg
/**
 * \param argc number of command line arguments.
 * \param argv command line arguments.
 * \return \ref MMG5_SUCCESS if success.
 * \return \ref MMG5_LOWFAILURE if failed but a conform mesh is saved.
 * \return \ref MMG5_STRONGFAILURE if failed and we can't save the mesh.
 *
 * Main program for MMG3D executable: perform mesh adaptation.
 *
 */
int main(int argc,char *argv[]) {
    MMG5_Mesh      mesh;
    MMG5_Sol       met;
    int       ier;
    char      stim[32];

    fprintf(stdout,"  -- MMG3d, Release %s (%s) \n",MG_VER,MG_REL);
    fprintf(stdout,"     %s\n",MG_CPY);
    fprintf(stdout,"     %s %s\n",__DATE__,__TIME__);

    signal(SIGABRT,_MMG5_excfun);
    signal(SIGFPE,_MMG5_excfun);
    signal(SIGILL,_MMG5_excfun);
    signal(SIGSEGV,_MMG5_excfun);
    signal(SIGTERM,_MMG5_excfun);
    signal(SIGINT,_MMG5_excfun);
    atexit(_MMG5_endcod);

    tminit(MMG5_ctim,TIMEMAX);
    chrono(ON,&MMG5_ctim[0]);

    /* assign default values */
    memset(&mesh,0,sizeof(MMG5_Mesh));
    memset(&met,0,sizeof(MMG5_Sol));

    MMG5_Init_parameters(&mesh);

    met.size      = 1;

    /* command line */
    if ( !MMG5_parsar(argc,argv,&mesh,&met) )  return(MMG5_STRONGFAILURE);
#ifdef USE_SCOTCH
    _MMG5_warnScotch(&mesh);
#endif

    /* load data */
    fprintf(stdout,"\n  -- INPUT DATA\n");
    chrono(ON,&MMG5_ctim[1]);
    _MMG5_warnOrientation(&mesh);
    /* read mesh file */
    if ( !MMG5_loadMesh(&mesh) ) _MMG5_RETURN_AND_FREE(&mesh,&met,MMG5_STRONGFAILURE);

    /* read metric if any */
    ier = MMG5_loadMet(&mesh,&met);
    if ( !ier )
        _MMG5_RETURN_AND_FREE(&mesh,&met,MMG5_STRONGFAILURE);
    else if ( ier > 0 && met.np != mesh.np ) {
        fprintf(stdout,"  ## WARNING: WRONG SOLUTION NUMBER. IGNORED\n");
        _MMG5_DEL_MEM(&mesh,met.m,(met.size*met.npmax+1)*sizeof(double));
        met.np = 0;
    } else if ( met.size!=1 ) {
        fprintf(stdout,"  ## ERROR: ANISOTROPIC METRIC NOT IMPLEMENTED.\n");
        _MMG5_RETURN_AND_FREE(&mesh,&met,MMG5_STRONGFAILURE);
    }
    if ( !MMG5_parsop(&mesh,&met) )
        _MMG5_RETURN_AND_FREE(&mesh,&met,MMG5_LOWFAILURE);

    chrono(OFF,&MMG5_ctim[1]);
    printim(MMG5_ctim[1].gdif,stim);
    fprintf(stdout,"  -- DATA READING COMPLETED.     %s\n",stim);

    /* analysis */
    chrono(ON,&MMG5_ctim[2]);
    _MMG5_setfunc(&mesh,&met);
    MMG5_Set_saveFunc(&mesh);

    if ( abs(mesh.info.imprim) > 0 )  _MMG5_outqua(&mesh,&met);
    fprintf(stdout,"\n  %s\n   MODULE MMG3D: IMB-LJLL : %s (%s)\n  %s\n",
            MG_STR,MG_VER,MG_REL,MG_STR);
    if ( mesh.info.imprim )  fprintf(stdout,"\n  -- PHASE 1 : ANALYSIS\n");

    if ( !_MMG5_scaleMesh(&mesh,&met) )
        _MMG5_RETURN_AND_FREE(&mesh,&met,MMG5_STRONGFAILURE);
    if ( mesh.info.iso ) {
        if ( !met.np ) {
            fprintf(stdout,"\n  ## ERROR: A VALID SOLUTION FILE IS NEEDED \n");
            _MMG5_RETURN_AND_FREE(&mesh,&met,MMG5_STRONGFAILURE);
        }
        if ( !_MMG5_mmg3d2(&mesh,&met) )
            _MMG5_RETURN_AND_FREE(&mesh,&met,MMG5_STRONGFAILURE);
    }

    if ( !mesh.info.iso && !met.np && !_MMG5_DoSol(&mesh,&met) )
        _MMG5_RETURN_AND_FREE(&mesh,&met,MMG5_LOWFAILURE);

    if ( !_MMG5_analys(&mesh) )
        _MMG5_RETURN_AND_FREE(&mesh,&met,MMG5_LOWFAILURE);

    if ( mesh.info.imprim > 3 && !mesh.info.iso && met.m ) _MMG5_prilen(&mesh,&met);

    chrono(OFF,&MMG5_ctim[2]);
    printim(MMG5_ctim[2].gdif,stim);
    if ( mesh.info.imprim )
        fprintf(stdout,"  -- PHASE 1 COMPLETED.     %s\n",stim);

    /* mesh adaptation */
    chrono(ON,&MMG5_ctim[3]);
    if ( mesh.info.imprim )
        fprintf(stdout,"\n  -- PHASE 2 : %s MESHING\n",met.size < 6 ? "ISOTROPIC" : "ANISOTROPIC");

    /* renumerotation if available */
    if ( !_MMG5_scotchCall(&mesh,&met) )
        _MMG5_RETURN_AND_FREE(&mesh,&met,MMG5_STRONGFAILURE);


#ifdef PATTERN
    if ( !_MMG5_mmg3d1_pattern(&mesh,&met) ) {
        if ( !(mesh.adja) && !_MMG5_hashTetra(&mesh,1) ) {
            fprintf(stdout,"  ## Hashing problem. Unable to save mesh.\n");
            _MMG5_RETURN_AND_FREE(&mesh,&met,MMG5_STRONGFAILURE);
        }
        if ( !_MMG5_unscaleMesh(&mesh,&met) )
            _MMG5_RETURN_AND_FREE(&mesh,&met,MMG5_STRONGFAILURE);
        if ( !MMG5_saveMesh(&mesh) )
            _MMG5_RETURN_AND_FREE(&mesh,&met,MMG5_STRONGFAILURE);
        if ( met.m && !MMG5_saveMet(&mesh,&met) )
            _MMG5_RETURN_AND_FREE(&mesh,&met,MMG5_STRONGFAILURE);
        _MMG5_RETURN_AND_FREE(&mesh,&met,MMG5_LOWFAILURE);
    }
#else
    /* Pattern in iso mode, delauney otherwise */
    if ( !mesh.info.iso ) {
        if( !_MMG5_mmg3d1_delone(&mesh,&met) ) {
            if ( !(mesh.adja) && !_MMG5_hashTetra(&mesh,1) ) {
                fprintf(stdout,"  ## Hashing problem. Unable to save mesh.\n");
                _MMG5_RETURN_AND_FREE(&mesh,&met,MMG5_STRONGFAILURE);
            }
            if ( !_MMG5_unscaleMesh(&mesh,&met) )
                _MMG5_RETURN_AND_FREE(&mesh,&met,MMG5_STRONGFAILURE);
            if ( !MMG5_saveMesh(&mesh) )
                _MMG5_RETURN_AND_FREE(&mesh,&met,MMG5_STRONGFAILURE);
            if ( met.m && !MMG5_saveMet(&mesh,&met) )
                _MMG5_RETURN_AND_FREE(&mesh,&met,MMG5_STRONGFAILURE);
            _MMG5_RETURN_AND_FREE(&mesh,&met,MMG5_LOWFAILURE);
        }
    }
    else {
        if( !_MMG5_mmg3d1_pattern(&mesh,&met) ) {
            if ( !(mesh.adja) && !_MMG5_hashTetra(&mesh,1) ) {
                fprintf(stdout,"  ## Hashing problem. Unable to save mesh.\n");
                _MMG5_RETURN_AND_FREE(&mesh,&met,MMG5_STRONGFAILURE);
            }
            if ( !_MMG5_unscaleMesh(&mesh,&met) )
                _MMG5_RETURN_AND_FREE(&mesh,&met,MMG5_STRONGFAILURE);
            if ( !MMG5_saveMesh(&mesh) )
                _MMG5_RETURN_AND_FREE(&mesh,&met,MMG5_STRONGFAILURE);
            if ( met.m && !MMG5_saveMet(&mesh,&met) )
                _MMG5_RETURN_AND_FREE(&mesh,&met,MMG5_STRONGFAILURE);
            _MMG5_RETURN_AND_FREE(&mesh,&met,MMG5_LOWFAILURE);
        }
    }
#endif

    chrono(OFF,&MMG5_ctim[3]);
    printim(MMG5_ctim[3].gdif,stim);
    if ( mesh.info.imprim )
        fprintf(stdout,"  -- PHASE 2 COMPLETED.     %s\n",stim);
    fprintf(stdout,"\n  %s\n   END OF MODULE MMG3d: IMB-LJLL \n  %s\n",MG_STR,MG_STR);

    /* save file */
    _MMG5_outqua(&mesh,&met);

    if ( mesh.info.imprim > 3 && !mesh.info.iso )
        _MMG5_prilen(&mesh,&met);

    chrono(ON,&MMG5_ctim[1]);
    if ( mesh.info.imprim )  fprintf(stdout,"\n  -- WRITING DATA FILE %s\n",mesh.nameout);
    if ( !_MMG5_unscaleMesh(&mesh,&met) )
        _MMG5_RETURN_AND_FREE(&mesh,&met,MMG5_STRONGFAILURE);

    if ( !MMG5_saveMesh(&mesh) )
        _MMG5_RETURN_AND_FREE(&mesh,&met,MMG5_STRONGFAILURE);

    if ( !MMG5_saveMet(&mesh,&met) )
        _MMG5_RETURN_AND_FREE(&mesh,&met,MMG5_STRONGFAILURE);
    chrono(OFF,&MMG5_ctim[1]);
    if ( mesh.info.imprim )  fprintf(stdout,"  -- WRITING COMPLETED\n");

    /* free mem */
    _MMG5_RETURN_AND_FREE(&mesh,&met,MMG5_SUCCESS);
}