[cig-commits] r19079 - in seismo/2D/SPECFEM2D/trunk/UTILS: . Gmsh

dkomati1 at geodynamics.org dkomati1 at geodynamics.org
Sat Oct 15 15:52:16 PDT 2011


Author: dkomati1
Date: 2011-10-15 15:52:15 -0700 (Sat, 15 Oct 2011)
New Revision: 19079

Added:
   seismo/2D/SPECFEM2D/trunk/UTILS/Gmsh/
   seismo/2D/SPECFEM2D/trunk/UTILS/Gmsh/README_convert_Gmsh_to_Specfem2D_Nicolas_Massacret
   seismo/2D/SPECFEM2D/trunk/UTILS/Gmsh/convert_Gmsh_to_Specfem2D_Nicolas_Massacret.c
Log:
added a C code by Nicolas Massacret that converts a Gmsh mesh to the right input format for SPECFEM2D 
(note that Paul Cristini wrote something similar in Python)


Added: seismo/2D/SPECFEM2D/trunk/UTILS/Gmsh/README_convert_Gmsh_to_Specfem2D_Nicolas_Massacret
===================================================================
--- seismo/2D/SPECFEM2D/trunk/UTILS/Gmsh/README_convert_Gmsh_to_Specfem2D_Nicolas_Massacret	                        (rev 0)
+++ seismo/2D/SPECFEM2D/trunk/UTILS/Gmsh/README_convert_Gmsh_to_Specfem2D_Nicolas_Massacret	2011-10-15 22:52:15 UTC (rev 19079)
@@ -0,0 +1,8 @@
+
+Avant de lancer l'exécutable, il est nécessaire de spécifier le nom du fichier source créé par gmsh dans "convert_Gmsh_to_Specfem2D_Nicolas_Massacret.c" ligne 30 et de créer trois fichers (dans le même dossier que l'exécutable et le fichier source) nommés :
+
+element
+material
+nodes
+
+

Added: seismo/2D/SPECFEM2D/trunk/UTILS/Gmsh/convert_Gmsh_to_Specfem2D_Nicolas_Massacret.c
===================================================================
--- seismo/2D/SPECFEM2D/trunk/UTILS/Gmsh/convert_Gmsh_to_Specfem2D_Nicolas_Massacret.c	                        (rev 0)
+++ seismo/2D/SPECFEM2D/trunk/UTILS/Gmsh/convert_Gmsh_to_Specfem2D_Nicolas_Massacret.c	2011-10-15 22:52:15 UTC (rev 19079)
@@ -0,0 +1,136 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#define TAILLE_MAX 100 // Tableau de taille 100
+
+int main(int argc, char *argv[])
+{
+  FILE* fichier = NULL;
+      FILE* fichierNode = NULL;
+  FILE* fichierElem = NULL;
+  FILE* fichierMat = NULL;
+      char chaine[TAILLE_MAX] = "";
+  char nodes[TAILLE_MAX] = "$Nodes";
+      char endnodes[TAILLE_MAX] = "$EndNodes";
+  char elem[TAILLE_MAX] = "$Elements";
+  float coordNoeud[3] = {0};
+  int car = 0;
+  int x=0;
+  long infos[2] = {0};
+  long numNode[4] = {0};
+  long i;
+  char nomFichier[20] = "";
+
+
+// printf("-> Indiquez le nom du fichier source : ");
+// scanf("%s", &nomFichier[0]);
+// printf("\n - Ouvertur du fichier source du maillage : %s \n", nomFichier[0]);
+
+      fichier = fopen("jpz1.msh", "r");
+  if (fichier != NULL)
+  {
+    fscanf(fichier, "%s", &chaine[0]);
+    while ( strcmp(&chaine[0], &nodes[0]) != 0)
+    {
+      fscanf(fichier, "%s", &chaine[0]);
+    }             // Lorsque l'on sort de cette boucle, on a trouvé $Nodes
+
+  /* FDEBUT DE L'ECRITURE DE NODE */
+    fichierNode = fopen("nodes", "r+");
+    if (fichierNode != NULL)
+        {
+      fscanf(fichier, "%li", &infos[0]);
+      fprintf(fichierNode, "%li \n", infos[0]);     // on note le nombre de noeuds
+int nbrNode = infos[0];
+      car = fgetc(fichier);
+      while(  car != 36)        // Boucle permettant l'écriture du fichier contenant les coordonées des noeuds§.
+      {
+        fseek(fichier, -1, SEEK_CUR);
+        fscanf(fichier, "%f %f %f %f", &coordNoeud[0], &coordNoeud[1], &coordNoeud[2], &coordNoeud[3]);
+        fprintf(fichierNode, "%f %f \n", coordNoeud[1], coordNoeud[2]);
+
+      if(coordNoeud[2] == 0)    // Calcul du nombre d'éléments suivant x.
+      {
+        x++;
+      }
+
+int etat = ((coordNoeud[0]*100) / nbrNode);
+printf("\r- Ecriture des coordonées des noeuds : %d %%", etat);
+        car = fgetc(fichier);
+        car = fgetc(fichier);
+      }
+
+      fclose(fichierNode);
+    }
+    else {printf("!!! Erreur : Problème à l'ouverture du fichier nodes. \n"); return 0;}
+ /* FIN DE L'ECRITURE DE NODE */
+
+    printf("\n- Ecriture du fichier node terminée. \n");
+    x--;
+    printf("- Nombre d'éléments suivant x = %d \n", x);
+
+/* DEBUT DE L'ECRITURE DE ELEMENT ET METERIAL */
+    fichierElem = fopen("element", "r+");
+    if (fichierElem != NULL)
+          {
+// printf("début écriture element et material \n");
+      fichierMat = fopen("material", "r+");
+      if (fichierMat != NULL)
+        {
+        fscanf(fichier, "%s", &chaine[0]); // pour sauter une ligne
+        fscanf(fichier, "%s", &chaine[0]);
+        fscanf(fichier, "%li", &infos[0]);
+        fprintf(fichierElem, "%li \n", infos[0]); // on note le nombre d'éléments
+int nbrElem = infos[0];
+        car = fgetc(fichier);
+        while(  car != 36)      // Pour s'arrêter au prochain $.
+          {
+          fseek(fichier, -1, SEEK_CUR);
+          fscanf(fichier, "%li %li %li", &infos[0], &infos[1], &infos[2]);
+          if (infos[1] == 3 )   // Pour ne retenir que les maillage hexa.
+            {
+            int j = infos[2];
+            for(i=0; i<j; i++) //on saute les tags
+              {
+              fscanf(fichier, "%li", &numNode[i]);
+              }
+int etat = ((infos[0]*100) / nbrElem);
+printf("\r- Ecriture des éléments et materiaux : %d %%", etat);
+            fprintf(fichierMat, "%li \n", numNode[0]);    //on note le numero du matos
+            fscanf(fichier, "%li %li %li %li", &numNode[0], &numNode[1], &numNode[2], &numNode[3]);
+            fprintf(fichierElem, "%li %li %li %li\n", numNode[0], numNode[1], numNode[2], numNode[3]); // on note les ID des nodes
+            }
+
+          car = fgetc(fichier);
+          car = fgetc(fichier);
+          }
+
+        fclose(fichierMat);
+        }
+
+      else
+        {
+        printf("Erreur ouverture Material \n"); return 0;
+        }
+
+      fclose(fichierElem);
+      }
+
+    else
+      {
+      printf("Erreur ouverture Element \n"); return 0;
+      }
+
+/* FIN DE L'ECRITURE DE ELEMENT ET MATERIAL */
+
+        fclose(fichier);
+      }
+else
+  {
+  printf("Erreur ouverture fichier \n"); return 0;
+  }
+printf("\n- Ecriture des fichiers element et material terminée. \n");
+return 0;
+}
+



More information about the CIG-COMMITS mailing list