Skip to content
Snippets Groups Projects
Generator.cpp 37.2 KiB
Newer Older
Christophe Geuzaine's avatar
Christophe Geuzaine committed
  int old = m->getMeshStatus(false);
Christophe Geuzaine's avatar
 
Christophe Geuzaine committed
  // Initialize pseudo random mesh generator with the same seed
  srand(1);

Christophe Geuzaine's avatar
 
Christophe Geuzaine committed
  // Change any high order elements back into first order ones
Christophe Geuzaine's avatar
Christophe Geuzaine committed
  SetOrder1(m);
Christophe Geuzaine's avatar
 
Christophe Geuzaine committed

Christophe Geuzaine's avatar
Christophe Geuzaine committed
  // 1D mesh
Christophe Geuzaine's avatar
 
Christophe Geuzaine committed
  if(ask == 1 || (ask > 1 && old < 1)) {
Christophe Geuzaine's avatar
Christophe Geuzaine committed
    std::for_each(m->firstRegion(), m->lastRegion(), deMeshGRegion());
    std::for_each(m->firstFace(), m->lastFace(), deMeshGFace());
Christophe Geuzaine's avatar
 
Christophe Geuzaine committed
    Mesh0D(m);
Christophe Geuzaine's avatar
 
Christophe Geuzaine committed
    Mesh1D(m);
Christophe Geuzaine's avatar
 
Christophe Geuzaine committed

Christophe Geuzaine's avatar
Christophe Geuzaine committed
  // 2D mesh
Christophe Geuzaine's avatar
 
Christophe Geuzaine committed
  if(ask == 2 || (ask > 2 && old < 2)) {
Christophe Geuzaine's avatar
Christophe Geuzaine committed
    std::for_each(m->firstRegion(), m->lastRegion(), deMeshGRegion());
Christophe Geuzaine's avatar
 
Christophe Geuzaine committed
    Mesh2D(m);
Christophe Geuzaine's avatar
Christophe Geuzaine committed
  // 3D mesh
Christophe Geuzaine's avatar
 
Christophe Geuzaine committed
  if(ask == 3) {
Christophe Geuzaine's avatar
 
Christophe Geuzaine committed
    Mesh3D(m);
Christophe Geuzaine's avatar
 
Christophe Geuzaine committed

Christophe Geuzaine's avatar
Christophe Geuzaine committed
  // Orient the line and surface meshes so that they match the orientation of
  // the geometrical entities and/or the user orientation constraints
  if(m->getMeshStatus() >= 1)
    std::for_each(m->firstEdge(), m->lastEdge(), orientMeshGEdge());
  if(m->getMeshStatus() >= 2)
    std::for_each(m->firstFace(), m->lastFace(), orientMeshGFace());

  // Optimize quality of 3D tet mesh
  if(m->getMeshStatus() == 3){
    for(int i = 0; i < std::max(CTX::instance()->mesh.optimize,
                                CTX::instance()->mesh.optimizeNetgen); i++){
      if(CTX::instance()->mesh.optimize > i) OptimizeMesh(m);
      if(CTX::instance()->mesh.optimizeNetgen > i) OptimizeMeshNetgen(m);
Christophe Geuzaine's avatar
 
Christophe Geuzaine committed
  }

  // Subdivide into quads or hexas
  if(m->getMeshStatus() == 2 && CTX::instance()->mesh.algoSubdivide == 1)
    RefineMesh(m, CTX::instance()->mesh.secondOrderLinear, true);
  else if(m->getMeshStatus() == 3 && CTX::instance()->mesh.algoSubdivide == 2)
    RefineMesh(m, CTX::instance()->mesh.secondOrderLinear, false, true);

  // Compute homology if necessary
  if(!Msg::GetErrorCount()) m->computeHomology();

  // Create high order elements
  if(m->getMeshStatus() && CTX::instance()->mesh.order > 1)
    SetOrderN(m, CTX::instance()->mesh.order, CTX::instance()->mesh.secondOrderLinear,
              CTX::instance()->mesh.secondOrderIncomplete);
  // Optimize high order elements
  if(CTX::instance()->mesh.hoOptimize){
#if defined(HAVE_OPTHOM)
    if(CTX::instance()->mesh.hoOptimize < 0){
      ElasticAnalogy(GModel::current(), false);
      OptHomParameters p;
      p.nbLayers = CTX::instance()->mesh.hoNLayers;
      p.BARRIER_MIN = CTX::instance()->mesh.hoThresholdMin;
      p.BARRIER_MAX = CTX::instance()->mesh.hoThresholdMax;
      p.dim = GModel::current()->getDim();
      p.optPrimSurfMesh = CTX::instance()->mesh.hoOptPrimSurfMesh;
      HighOrderMeshOptimizer(GModel::current(), p);
    }
#else
    Msg::Error("High-order mesh optimization requires the OPTHOM module");
#endif
  }

            m->getNumMeshVertices(), m->getNumMeshElements());

  Msg::PrintErrorCounter("Mesh generation error summary");
Christophe Geuzaine's avatar
 
Christophe Geuzaine committed

  CTX::instance()->mesh.changed = ENT_ALL;
  // ProfilerStop();