Skip to content
Snippets Groups Projects
Select Git revision
  • master
  • hierarchical-basis
  • alphashapes
  • bl
  • relaying
  • new_export_boris
  • oras_vs_osm
  • reassign_partitions
  • distributed_fwi
  • rename-classes
  • fix/fortran-api-example-t4
  • robust_partitions
  • reducing_files
  • fix_overlaps
  • 3115-issue-fix
  • 3023-Fillet2D-Update
  • convert_fdivs
  • tmp_jcjc24
  • fixedMeshIF
  • save_edges
  • gmsh_4_14_0
  • gmsh_4_13_1
  • gmsh_4_13_0
  • gmsh_4_12_2
  • gmsh_4_12_1
  • gmsh_4_12_0
  • gmsh_4_11_1
  • gmsh_4_11_0
  • gmsh_4_10_5
  • gmsh_4_10_4
  • gmsh_4_10_3
  • gmsh_4_10_2
  • gmsh_4_10_1
  • gmsh_4_10_0
  • gmsh_4_9_5
  • gmsh_4_9_4
  • gmsh_4_9_3
  • gmsh_4_9_2
  • gmsh_4_9_1
  • gmsh_4_9_0
40 results

t9.geo

Blame
  • GModelIO_MATLAB.cpp 10.31 KiB
    // Gmsh - Copyright (C) 1997-2019 C. Geuzaine, J.-F. Remacle
    //
    // See the LICENSE.txt file for license information. Please report all
    // issues on https://gitlab.onelab.info/gmsh/gmsh/issues.
    
    #include <utility>
    
    #include "GModel.h"
    #include "OS.h"
    #include "MPoint.h"
    #include "MLine.h"
    #include "MTriangle.h"
    #include "MQuadrangle.h"
    #include "MTetrahedron.h"
    #include "MHexahedron.h"
    #include "MPrism.h"
    #include "MPyramid.h"
    #include "StringUtils.h"
    
    std::string getMATLABName(int type);
    
    void writeElementsMATLAB(FILE *fp, const GEntity *entity, int filetype,
                             bool binary, int physical)
    {
      if(filetype != 0) return;
      for(std::size_t j = 0; j < entity->getNumMeshElements(); j++) {
        if(entity->getMeshElement(j)->getTypeForMSH())
          entity->getMeshElement(j)->writeMATLAB(fp, filetype, entity->tag(),
                                                 physical, binary);
      }
      return;
    }
    
    void storePairMATLAB(
      const GEntity *entity, int physical,
      std::vector<std::vector<std::pair<MElement *, int> > > &elems)
    {
      for(std::size_t j = 0; j < entity->getNumMeshElements(); j++) {
        int elemtype = entity->getMeshElement(j)->getTypeForMSH();
        if(elemtype)
          elems[elemtype - 1].push_back(
            std::make_pair(entity->getMeshElement(j), physical));
      }
      return;
    }
    
    int GModel::writeMATLAB(const std::string &name, bool binary, bool saveAll,
                            double scalingFactor, int filetype)
    {
      // File type
      int SIMPLE = 0; // very simple with only triangles
      int LOAD_GMSH2 = 1; // structure same as utils/converters/matlab/load_gmsh2.m
    
      // Hardcoded...
      filetype = LOAD_GMSH2;
    
      if(binary) {
        // TODO
        Msg::Warning(
          "Binary format not available for Matlab, saving into ASCII format");
        binary = false;
      }
    
      FILE *fp = Fopen(name.c_str(), binary ? "wb" : "w");
      if(!fp) {
        Msg::Error("Unable to open file '%s'", name.c_str());
        return 0;
      }
    
      // if there are no physicals we save all the elements
      if(noPhysicalGroups()) saveAll = true;
    
      // get the number of vertices and index the vertices in a continuous
      // sequence
      int numVertices = indexMeshVertices(saveAll);
    
      fprintf(fp, "\%\%  Matlab mesh\n");
      fprintf(fp, "\%\% %s, Created by Gmsh\n", getName().c_str());
      if(binary)
        fprintf(fp, "\%\% BINARY\n");
      else
        fprintf(fp, "\%\% ASCII\n");
    
      // get all the entities in the model
      std::vector<GEntity *> entities;
      getEntities(entities);
    
      // Print mesh vertices
      if(filetype == SIMPLE) {
        fprintf(fp, "gVertices = %d;\n", numVertices);
        fprintf(fp, "gXYZ = [\n");
        for(std::size_t i = 0; i < entities.size(); i++)
          for(std::size_t j = 0; j < entities[i]->mesh_vertices.size(); j++)
            entities[i]->mesh_vertices[j]->writeMATLAB(fp, filetype, binary,
                                                       scalingFactor);
        fprintf(fp, "];\n");
        // triangles
        fprintf(fp, "\%\%\n");
        fprintf(fp, "gTri=[\n");
        for(std::size_t i = 0; i < entities.size(); i++) {
          if(saveAll)
            writeElementsMATLAB(fp, entities[i], filetype, binary, 0);
          else if(entities[i]->getPhysicalEntities().size()) {
            for(std::size_t k = 0; k < entities[i]->getPhysicalEntities().size();
                k++) {
              int physical = entities[i]->getPhysicalEntities()[k];
              writeElementsMATLAB(fp, entities[i], filetype, binary, physical);
            }
          }
        }
        fprintf(fp, "];\n");
        fprintf(fp, "nTri=size(gTri,1);\n");
      }
    
      //  int nelemtype = 0; //number of element type
      if(filetype == LOAD_GMSH2) {
        fprintf(fp, "clear msh;\n");
        fprintf(fp, "msh.nbNod = %d;\n", numVertices);
        fprintf(fp, "msh.POS = [\n");
        for(std::size_t i = 0; i < entities.size(); i++)
          for(std::size_t j = 0; j < entities[i]->mesh_vertices.size(); j++)
            entities[i]->mesh_vertices[j]->writeMATLAB(fp, filetype, binary,
                                                       scalingFactor);
        fprintf(fp, "];\n");
        fprintf(fp, "msh.MAX = max(msh.POS);\n");
        fprintf(fp, "msh.MIN = min(msh.POS);\n");
        // We have to store every element in an array and then store them in the
        // file.
        std::vector<std::vector<std::pair<MElement *, int> > > elems(MSH_MAX_NUM);
        // loop on each element and fill the vectors of connectivity
        for(std::size_t i = 0; i < entities.size(); i++) {
          if(saveAll)
            storePairMATLAB(entities[i], 0, elems);
          else {
            for(std::size_t iphys = 0;
                iphys < entities[i]->getPhysicalEntities().size(); iphys++) {
              int physical = entities[i]->getPhysicalEntities()[iphys];
              storePairMATLAB(entities[i], physical, elems);
            }
          }
        }
        // Store in Matlab structure
        for(int elemtype = 1; elemtype < MSH_MAX_NUM + 1; elemtype++) {
          if(elems[elemtype - 1].empty()) continue;
          fprintf(fp, "msh.%s =[\n", getMATLABName(elemtype).c_str());
          // writes
          for(std::size_t i = 0; i < elems[elemtype - 1].size(); i++) {
            elems[elemtype - 1][i].first->writeMATLAB(
              fp, filetype, elems[elemtype - 1][i].second, binary);
          }
          fprintf(fp, "];\n");
        }
      }
    
      fclose(fp);
      return 1;
    }
    
    // This should be updated whenever a new element is available in GMSH
    // See Common/GmshDefines.h
    std::string getMATLABName(int type)
    {
      switch(type) {
      case MSH_LIN_2: return "LINES";
      case MSH_TRI_3: return "TRIANGLES";
      case MSH_QUA_4: return "QUADS";
      case MSH_TET_4: return "TETS";
      case MSH_HEX_8: return "HEXAS";
      case MSH_PRI_6: return "PRISMS";
      case MSH_PYR_5: return "PYRAMIDS";
      case MSH_LIN_3: return "LINES3";
      case MSH_TRI_6: return "TRIANGLES6";
      case MSH_QUA_9: return "QUADS9";
      case MSH_TET_10: return "TETS10";
      case MSH_HEX_27: return "HEXAS27";
      case MSH_PRI_18: return "PRISMS18";
      case MSH_PYR_14: return "PYRAMIDS14";
      case MSH_PNT: return "PNT";
      case MSH_QUA_8: return "QUADS8";
      case MSH_HEX_20: return "HEXAS20";
      case MSH_PRI_15: return "PRISMS15";
      case MSH_PYR_13: return "PYRAMIDS13";
      case MSH_TRI_9: return "TRIANGLES9";
      case MSH_TRI_10: return "TRIANGLES10";
      case MSH_TRI_12: return "TRIANGLES12";
      case MSH_TRI_15: return "TRIANGLES15";
      case MSH_TRI_15I: return "TRIANGLES15I";
      case MSH_TRI_21: return "TRIANGLES21";
      case MSH_LIN_4: return "LINES4";
      case MSH_LIN_5: return "LINES5";
      case MSH_LIN_6: return "LINES6";
      case MSH_TET_20: return "TETS20";
      case MSH_TET_35: return "TETS35";
      case MSH_TET_56: return "TETS56";
      case MSH_TET_22: return "TETS22";
      case MSH_TET_28: return "TETS28";
      case MSH_POLYG_: return "POLYG_";
      case MSH_POLYH_: return "POLYH_";
      case MSH_QUA_16: return "QUADS16";
      case MSH_QUA_25: return "QUADS25";
      case MSH_QUA_36: return "QUADS36";
      case MSH_QUA_12: return "QUADS12";
      case MSH_QUA_16I: return "QUADS16I";
      case MSH_QUA_20: return "QUADS20";
      case MSH_TRI_28: return "TRIANGLES28";
      case MSH_TRI_36: return "TRIANGLES36";
      case MSH_TRI_45: return "TRIANGLES45";
      case MSH_TRI_55: return "TRIANGLES55";
      case MSH_TRI_66: return "TRIANGLES66";
      case MSH_QUA_49: return "QUADS49";
      case MSH_QUA_64: return "QUADS64";
      case MSH_QUA_81: return "QUADS81";
      case MSH_QUA_100: return "QUADS100";
      case MSH_QUA_121: return "QUADS121";
      case MSH_TRI_18: return "TRIANGLES18";
      case MSH_TRI_21I: return "TRIANGLES21I";
      case MSH_TRI_24: return "TRIANGLES24";
      case MSH_TRI_27: return "TRIANGLES27";
      case MSH_TRI_30: return "TRIANGLES30";
      case MSH_QUA_24: return "QUADS24";
      case MSH_QUA_28: return "QUADS28";
      case MSH_QUA_32: return "QUADS32";
      case MSH_QUA_36I: return "QUADS36I";
      case MSH_QUA_40: return "QUADS40";
      case MSH_LIN_7: return "LINES7";
      case MSH_LIN_8: return "LINES8";
      case MSH_LIN_9: return "LINES9";
      case MSH_LIN_10: return "LINES10";
      case MSH_LIN_11: return "LINES11";
      case MSH_LIN_B: return "LINESB";
      case MSH_TRI_B: return "TRIANGLESB";
      case MSH_POLYG_B: return "POLYG_B";
      case MSH_LIN_C: return "LINESC";
      case MSH_TET_84: return "TETS84";
      case MSH_TET_120: return "TETS120";
      case MSH_TET_165: return "TETS165";
      case MSH_TET_220: return "TETS220";
      case MSH_TET_286: return "TETS286";
      case MSH_TET_34: return "TETS34";
      case MSH_TET_40: return "TETS40";
      case MSH_TET_46: return "TETS46";
      case MSH_TET_52: return "TETS52";
      case MSH_TET_58: return "TETS58";
      case MSH_LIN_1: return "LINES1";
      case MSH_TRI_1: return "TRIANGLES1";
      case MSH_QUA_1: return "QUADS1";
      case MSH_TET_1: return "TETS1";
      case MSH_HEX_1: return "HEXAS1";
      case MSH_PRI_1: return "PRISMS1";
      case MSH_PRI_40: return "PRISMS40";
      case MSH_PRI_75: return "PRISMS75";
      case MSH_HEX_64: return "HEXAS64";
      case MSH_HEX_125: return "HEXAS125";
      case MSH_HEX_216: return "HEXAS216";
      case MSH_HEX_343: return "HEXAS343";
      case MSH_HEX_512: return "HEXAS512";
      case MSH_HEX_729: return "HEXAS729";
      case MSH_HEX_1000: return "HEXAS1000";
      case MSH_HEX_32: return "HEXAS32";
      case MSH_HEX_44: return "HEXAS44";
      case MSH_HEX_56: return "HEXAS56";
      case MSH_HEX_68: return "HEXAS68";
      case MSH_HEX_80: return "HEXAS80";
      case MSH_HEX_92: return "HEXAS92";
      case MSH_HEX_104: return "HEXAS104";
      case MSH_PRI_126: return "PRISMS126";
      case MSH_PRI_196: return "PRISMS196";
      case MSH_PRI_288: return "PRISMS288";
      case MSH_PRI_405: return "PRISMS405";
      case MSH_PRI_550: return "PRISMS550";
      case MSH_PRI_24: return "PRISMS24";
      case MSH_PRI_33: return "PRISMS33";
      case MSH_PRI_42: return "PRISMS42";
      case MSH_PRI_51: return "PRISMS51";
      case MSH_PRI_60: return "PRISMS60";
      case MSH_PRI_69: return "PRISMS69";
      case MSH_PRI_78: return "PRISMS78";
      case MSH_PYR_30: return "PYRAMIDS30";
      case MSH_PYR_55: return "PYRAMIDS55";
      case MSH_PYR_91: return "PYRAMIDS91";
      case MSH_PYR_140: return "PYRAMIDS140";
      case MSH_PYR_204: return "PYRAMIDS204";
      case MSH_PYR_285: return "PYRAMIDS285";
      case MSH_PYR_385: return "PYRAMIDS385";
      case MSH_PYR_21: return "PYRAMIDS21";
      case MSH_PYR_29: return "PYRAMIDS29";
      case MSH_PYR_37: return "PYRAMIDS37";
      case MSH_PYR_45: return "PYRAMIDS45";
      case MSH_PYR_53: return "PYRAMIDS53";
      case MSH_PYR_61: return "PYRAMIDS61";
      case MSH_PYR_69: return "PYRAMIDS69";
      case MSH_PYR_1: return "PYRAMIDS1";
      case MSH_PNT_SUB: return "PNT_SUB";
      case MSH_LIN_SUB: return "LINESSUB";
      case MSH_TRI_SUB: return "TRIANGLESSUB";
      case MSH_TET_SUB: return "TETSSUB";
      case MSH_TET_16: return "TETS16";
      case MSH_TRI_MINI: return "TRIANGLESMINI";
      case MSH_TET_MINI: return "TETSMINI";
      case MSH_TRIH_4: return "TRIH_4";
      }
      return "";
    }