[cig-commits] r20434 - seismo/2D/SPECFEM2D/trunk/UTILS/Gmsh
dkomati1 at geodynamics.org
dkomati1 at geodynamics.org
Thu Jun 28 17:56:40 PDT 2012
Author: dkomati1
Date: 2012-06-28 17:56:40 -0700 (Thu, 28 Jun 2012)
New Revision: 20434
Added:
seismo/2D/SPECFEM2D/trunk/UTILS/Gmsh/LibGmsh2Specfem_convert_Gmsh_to_Specfem2D_official.py
seismo/2D/SPECFEM2D/trunk/UTILS/Gmsh/unofficial_unsupported_README_convert_Gmsh_to_Specfem2D_Nicolas_Massacret
seismo/2D/SPECFEM2D/trunk/UTILS/Gmsh/unofficial_unsupported_convert_Gmsh_to_Specfem2D_Nicolas_Massacret.c
Removed:
seismo/2D/SPECFEM2D/trunk/UTILS/Gmsh/LibGmsh2Specfem.py
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:
renamed Nicolas Massacret's unofficial (unsupported) Gmsh conversion code for clarity
Deleted: seismo/2D/SPECFEM2D/trunk/UTILS/Gmsh/LibGmsh2Specfem.py
===================================================================
--- seismo/2D/SPECFEM2D/trunk/UTILS/Gmsh/LibGmsh2Specfem.py 2012-06-28 22:59:37 UTC (rev 20433)
+++ seismo/2D/SPECFEM2D/trunk/UTILS/Gmsh/LibGmsh2Specfem.py 2012-06-29 00:56:40 UTC (rev 20434)
@@ -1,426 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-#
-# Python code to link gmsh with specfem
-#
-#@author: Cristini Paul,
-# Laboratoire de Mecanique et d'Acoustique, CNRS, Marseille, France
-#
-# February 2012
-#
-import sys, string, time
-from os.path import splitext, isfile
-try:
- from numpy import *
-except ImportError:
- print "error: package python-numpy is not installed"
-#
-def SauvFicSpecfem(Ng, Ct, Var, Fv):
- # Sauvegarde au format ascii
- # Ng est le nom generique
- # Ct le nombre de lignes a lire
- # Var est le nom de la variable contenant les informations a ecrire
- # Fv est le format d'ecriture '%f' pour les noeuds, '%i' pour les autres fichiers
- savetxt(Ng,(Ct,), fmt='%i')
- fd = open(Ng,'a')
- savetxt(fd, Var, fmt=Fv)
- fd.close()
- return
-#
-def OuvreGmsh(Dir,Nom,Bords):
- # Lecture de fichiers .msh genere avec Gmsh
- if splitext(Nom)[-1]=='.msh':
- fic=Nom
- elif splitext(Nom)[-1]=='':
- fic=Nom+'.msh'
- else:
- print 'File extension is not correct'
- print 'script aborted'
- sys.exit()
- #
- # Open the file and get the lines
- #
- f = file(Dir+fic,'r')
- lignes= f.readlines()
- f.close()
- # Recherche des positions
- #MotsCles=['','']
- for ii in range(len(lignes)):
- if lignes[ii]=='$Nodes\n': PosNodes=ii
- if lignes[ii]=='$PhysicalNames\n': PosPhys=ii
- if lignes[ii]=='$Elements\n':
- PosElem=ii
- break
- # Type d'elements 4 noeuds ou 9 noeuds
- TypElem1D = int(string.split(lignes[PosElem+2])[1])
- if TypElem1D==1:
- Ngnod, LinElem, SurfElem = 4, 1, 3
- len1D, len2D = 2, 4
- elif TypElem1D==8:
- Ngnod, LinElem, SurfElem = 9, 8, 10
- len1D, len2D = 3, 9
- else:
- print 'Element type is not 4 nor 9 nodes'
- #-------------------------------------------------------------------------
- # Conditions aux bords du domaine
- # Possible choices: Abso, Free or Perio
- Bord_abso, Bord_free = [], [] # Initialisation
- print Bords
- #-------------------------------------------------------------------------
- # PHYSICAL NAMES
- NbPhysNames = int(string.split(lignes[PosPhys+1])[0])
- print 'PhysNames', NbPhysNames
- # Structure de la variable : 1 entier et une chaine de caractere de taille 16
- dt = dtype([('dimension',int), ('zone', int), ('name', str, 16)])
- PhysCar=zeros((NbPhysNames,), dtype=dt)
- for Ip in range(NbPhysNames):
- Dim = int(string.split(lignes[PosPhys+2+Ip])[0])
- Zon = int(string.split(lignes[PosPhys+2+Ip])[1])
- Nam = string.split(lignes[PosPhys+2+Ip])[2][1:-1]
- PhysCar[Ip] = (Dim, Zon, Nam)
- if Bords.has_key(Nam):
- if Bords[Nam] == 'Abso': Bord_abso.append(Zon)
- if Bords[Nam] == 'Free': Bord_free.append(Zon)
- if Nam == 'Right': Bord_right=Zon
- if Nam == 'Left': Bord_left=Zon
- if Nam == 'Top': Bord_top=Zon
- if Nam == 'Bottom': Bord_bottom=Zon
- #--------------------------------------
- print 'Physical Names', PhysCar
- print 'Absorbing boundaries', Bord_abso
- print 'Free boundaries', Bord_free
- print 'Right boundaries', Bord_right
- print 'Left boundaries', Bord_left
- print 'Top boundaries', Bord_top
- print 'Bottom boundaries', Bord_bottom
- #---------------------------------------------------------------------------
- # Infos sur le fichier Gmsh
- Ver=float(string.split(lignes[1])[0])
- File_Type=int(string.split(lignes[1])[1])
- Data_Size=int(string.split(lignes[1])[2])
- # Lecture de noeuds
- NbNodes=int(string.split(lignes[PosNodes+1])[0])
- print 'Number of nodes: ',NbNodes
- Nodes=zeros((NbNodes,2),dtype=float)
- for Ninc in range(NbNodes):
- Nodes[Ninc]= [float(val) for val in (string.split(lignes[PosNodes+2+Ninc])[1:3])]
- #
- # Sauvegarde au format SPECFEM
- SauvFicSpecfem('Nodes_'+Nom, NbNodes, Nodes, '%f')
- # Lecture des elements
- DecElem=12+NbNodes
- NbElements=int(string.split(lignes[PosElem+1])[0])
- print 'Number of elements: ', NbElements
- # depend de l'ordre
- Elements = empty((NbElements,len2D),dtype=int)
- Milieu = empty((NbElements,1),dtype=int)
- Elements2DBord = empty((NbElements),dtype=int)
- Elements1D = empty((NbElements,len1D),dtype=int)
- Elements1DBord = empty((NbElements,len1D),dtype=int)
- #---------------------------------------------------------------------------
- Elements1DBordAbso = empty((NbElements,len1D),dtype=int)
- Elements1DBordFree = empty((NbElements,len1D),dtype=int)
- Elements2DBordAbso = zeros((NbElements,4),dtype=int)
- Elements2DBordFree = zeros((NbElements,4),dtype=int)
- #---------------------------------------------------------------------------
- Elements1DBordTop = empty((NbElements,len1D),dtype=int)
- Elements1DBordBottom = empty((NbElements,len1D),dtype=int)
- Elements2DBordTop = zeros((NbElements,4),dtype=int)
- Elements2DBordBottom = zeros((NbElements,4),dtype=int)
- #---------------------------------------------------------------------------
- Elements1DBordRight = empty((NbElements,len1D),dtype=int)
- Elements1DBordLeft = empty((NbElements,len1D),dtype=int)
- Elements2DBordRight = zeros((NbElements,4),dtype=int)
- Elements2DBordLeft = zeros((NbElements,4),dtype=int)
- #---------------------------------------------------------------------------
- DecElem+=1
- Ninc1D, Ninc2D, Ninc1DBord, Ninc1DBordAbso, Ninc1DBordFree = 0, 0, 0, 0, 0
- Ninc1DBordLeft, Ninc1DBordRight, Ninc1DBordTop, Ninc1DBordBottom = 0, 0, 0, 0
- for Ninc in range(NbElements):
- Pos = PosElem+Ninc+2
- TypElem = int(string.split(lignes[Pos])[1])
- ZonP = int(string.split(lignes[Pos])[3])
- Milieu[Ninc2D]= 1
- if TypElem==LinElem:
- Elements1D[Ninc1D] = [int(val) for val in (string.split(lignes[Pos])[5:])]
- # Bord droit
- if ZonP==Bord_right:
- Elements1DBordRight[Ninc1DBordRight] = Elements1D[Ninc1D]
- Ninc1DBordRight+=1
- Elements1DBord[Ninc1DBord] = Elements1D[Ninc1D]
- Ninc1DBord+=1
- if Bords['Right']=='Abso':
- Elements1DBordAbso[Ninc1DBordAbso] = Elements1D[Ninc1D]
- Ninc1DBordAbso+=1
- else:
- Elements1DBordFree[Ninc1DBordFree] = Elements1D[Ninc1D]
- Ninc1DBordFree+=1
- # Bord gauche
- if ZonP==Bord_left:
- Elements1DBordLeft[Ninc1DBordLeft] = Elements1D[Ninc1D]
- Ninc1DBordLeft+=1
- Elements1DBord[Ninc1DBord] = Elements1D[Ninc1D]
- Ninc1DBord+=1
- if Bords['Left']=='Abso':
- Elements1DBordAbso[Ninc1DBordAbso] = Elements1D[Ninc1D]
- Ninc1DBordAbso+=1
- else:
- Elements1DBordFree[Ninc1DBordFree] = Elements1D[Ninc1D]
- Ninc1DBordFree+=1
- # Bord haut
- if ZonP==Bord_top:
- Elements1DBordTop[Ninc1DBordTop] = Elements1D[Ninc1D]
- Ninc1DBordTop+=1
- Elements1DBord[Ninc1DBord] = Elements1D[Ninc1D]
- Ninc1DBord+=1
- if Bords['Top']=='Abso':
- Elements1DBordAbso[Ninc1DBordAbso] = Elements1D[Ninc1D]
- Ninc1DBordAbso+=1
- else:
- Elements1DBordFree[Ninc1DBordFree] = Elements1D[Ninc1D]
- Ninc1DBordFree+=1
- # Bord bas
- if ZonP==Bord_bottom:
- Elements1DBordBottom[Ninc1DBordBottom] = Elements1D[Ninc1D]
- Ninc1DBordBottom+=1
- Elements1DBord[Ninc1DBord] = Elements1D[Ninc1D]
- Ninc1DBord+=1
- if Bords['Bottom']=='Abso':
- Elements1DBordAbso[Ninc1DBordAbso] = Elements1D[Ninc1D]
- Ninc1DBordAbso+=1
- else:
- Elements1DBordFree[Ninc1DBordFree] = Elements1D[Ninc1D]
- Ninc1DBordFree+=1
- Ninc1D+=1
- if TypElem==SurfElem:
- Elements[Ninc2D]= [int(val) for val in (string.split(lignes[Pos])[5:])]
- Milieu[Ninc2D]= ZonP-4
- Ninc2D+=1
- Elements = Elements[:Ninc2D,:]
- Milieu = Milieu[:Ninc2D,:]
- #
- Elements1D=Elements1D[:Ninc1D,:]
- Elements1DBord=Elements1DBord[:Ninc1DBord,:]
- Elements1DBordAbso=Elements1DBordAbso[:Ninc1DBordAbso,:]
- Elements1DBordFree=Elements1DBordFree[:Ninc1DBordFree,:]
- Elements1DBordRight=Elements1DBordRight[:Ninc1DBordRight,:]
- Elements1DBordLeft=Elements1DBordLeft[:Ninc1DBordLeft,:]
- Elements1DBordTop=Elements1DBordTop[:Ninc1DBordTop,:]
- Elements1DBordBottom=Elements1DBordBottom[:Ninc1DBordBottom,:]
- # Modification la matrice contenant les elements 1D pour travailler sur les noeuds
- Elements1DBordFlat=ravel(Elements1DBord)
- # Noeuds appartenant aux bords du domaine
- NodesBordC=set(Elements1DBordFlat) # permet d'enlever les elements dupliques
- NodesBord2n=set(Elements1DBordFlat[::3]) # Noeuds aux bords sans intermediaire
- #-------------------------------------------------------
- NodesBordRight = set(ravel(Elements1DBordRight))
- NodesBordLeft = set(ravel(Elements1DBordLeft))
- NodesBordTop = set(ravel(Elements1DBordTop))
- NodesBordBottom = set(ravel(Elements1DBordBottom))
- #-------------------------------------------------------
- Elt=ravel(Elements1DBordRight)
- NodesBordRight2n = set(hstack((Elt,Elt[-2]))[::3])
- Elt=ravel(Elements1DBordLeft)
- NodesBordLeft2n = set(hstack((Elt,Elt[-2]))[::3])
- Elt=ravel(Elements1DBordTop)
- NodesBordTop2n = set(hstack((Elt,Elt[-2]))[::3])
- Elt=ravel(Elements1DBordBottom)
- NodesBordBottom2n = set(hstack((Elt,Elt[-2]))[::3])
- #
- ctBord=0
- # Detection des elements qui sont aux bords droit gauche haut bas
- t0=time.clock()
- ctf, cta, ctr, ctl, ctt, ctb = 0, 0, 0, 0, 0, 0
- for Ct2D in xrange(Ninc2D):
- # Attention aux elements qui ont un point correspondant a un coin
- jj=set(Elements[Ct2D])
- if not set.isdisjoint(jj, NodesBordC):
- ctBord+=1
- # Bord Right
- if not set.isdisjoint(jj, NodesBordRight2n):
- rr = set.intersection(jj, NodesBordRight2n)
- if len(rr)==2:
- el = concatenate(([Ct2D+1], [len(rr)], list(rr)))
- Elements2DBordRight[ctr,:] = el
- ctr+=1
- if Bords['Right']=='Abso':
- Elements2DBordAbso[cta,:] = el
- cta+=1
- if Bords['Right']=='Free':
- Elements2DBordFree[ctf,:] = el
- ctf+=1
- # Cas du bord double
- if len(rr)==3:
- ctdb=0
- # Recherche des deux elements 1D
- for Nn in xrange(Ninc1DBordRight):
- kk = set(Elements1DBordRight[Nn])
- if not set.isdisjoint(rr, kk):
- if kk.issubset(jj):
- exec 'kk'+str(ctdb)+'=kk'
- ctdb+=1
- Elc = set.intersection(kk0, kk1)
- rrm=rr.difference(Elc)
- rr1=list(rrm)
- El1=concatenate(([rr1[0]],list(Elc)))
- El2=concatenate((list(Elc),[rr1[1]]))
- el1 = concatenate(([Ct2D+1], [2], El1))
- el2 = concatenate(([Ct2D+1], [2], El2))
- Elements2DBordRight[ctr,:] = el1
- ctr+=1
- Elements2DBordRight[ctr,:] = el2
- ctr+=1
- if Bords['Right']=='Abso':
- Elements2DBordAbso[cta,:] = el1
- cta+=1
- Elements2DBordAbso[cta,:] = el2
- cta+=1
- if Bords['Right']=='Free':
- Elements2DBordFree[ctf,:] = el1
- ctf+=1
- Elements2DBordFree[ctf,:] = el2
- ctf+=1
- # Bord Left
- if not set.isdisjoint(jj, NodesBordLeft2n):
- rr = set.intersection(jj, NodesBordLeft2n)
- if len(rr)==2:
- el = concatenate(([Ct2D+1], [len(rr)], list(rr)))
- Elements2DBordLeft[ctl,:] = el
- ctl+=1
- if Bords['Left']=='Abso':
- Elements2DBordAbso[cta,:] = el
- cta+=1
- if Bords['Left']=='Free':
- Elements2DBordFree[ctf,:] = el
- ctf+=1
- # Cas du bord double
- if len(rr)==3:
- ctdb=0
- # Recherche des deux elements 1D
- for Nn in xrange(Ninc1DBordLeft):
- kk = set(Elements1DBordLeft[Nn])
- if not set.isdisjoint(rr, kk):
- if kk.issubset(jj):
- exec 'kk'+str(ctdb)+'=kk'
- ctdb+=1
- Elc = set.intersection(kk0, kk1)
- rrm=rr.difference(Elc)
- rr1=list(rrm)
- El1=concatenate(([rr1[0]],list(Elc)))
- El2=concatenate((list(Elc),[rr1[1]]))
- el1 = concatenate(([Ct2D+1], [2], El1))
- el2 = concatenate(([Ct2D+1], [2], El2))
- Elements2DBordLeft[ctl,:] = el1
- ctl+=1
- Elements2DBordLeft[ctl,:] = el2
- ctl+=1
- if Bords['Left']=='Abso':
- Elements2DBordAbso[cta,:] = el1
- cta+=1
- Elements2DBordAbso[cta,:] = el2
- cta+=1
- if Bords['Left']=='Free':
- Elements2DBordFree[ctf,:] = el1
- ctf+=1
- Elements2DBordFree[ctf,:] = el2
- ctf+=1
- # Bord Top
- if not set.isdisjoint(jj, NodesBordTop2n):
- rr = set.intersection(jj, NodesBordTop2n)
- if len(rr)==2:
- el = concatenate(([Ct2D+1], [len(rr)], list(rr)))
- Elements2DBordTop[ctt,:len(el)] = el
- ctt+=1
- if Bords['Top']=='Abso':
- Elements2DBordAbso[cta,:] = el
- cta+=1
- if Bords['Top']=='Free':
- Elements2DBordFree[ctf,:] = el
- ctf+=1
- # Bord Bottom
- if not set.isdisjoint(jj, NodesBordBottom2n):
- rr = set.intersection(jj, NodesBordBottom2n)
- if len(rr)==2:
- el = concatenate(([Ct2D+1], [len(rr)], list(rr)))
- Elements2DBordBottom[ctb,:len(el)] = el
- ctb+=1
- if Bords['Bottom']=='Abso':
- Elements2DBordAbso[cta,:] = el
- cta+=1
- if Bords['Bottom']=='Free':
- Elements2DBordFree[ctf,:] = el
- ctf+=1
- Elements2DBord=Elements2DBord[:ctBord]
- #----------------------------------------------------------------------
- Elements2DBordAbso = Elements2DBordAbso[:cta,:]
- Elements2DBordFree = Elements2DBordFree[:ctf,:]
- Elements2DBordTop = Elements2DBordTop[:ctt,:]
- Elements2DBordBottom = Elements2DBordBottom[:ctb,:]
- Elements2DBordRight = Elements2DBordRight[:ctr,:]
- Elements2DBordLeft = Elements2DBordLeft[:ctl,:]
- #-----------------------------------------------------------------------
- # Sauvegarde au format SPECFEM
- SauvFicSpecfem('Mesh_'+Nom, Ninc2D, Elements, '%i')
- #
- SauvFicSpecfem('Surf_abs_'+Nom, cta, Elements2DBordAbso, '%i')
- #
- SauvFicSpecfem('Surf_free_'+Nom, ctf, Elements2DBordFree, '%i')
- #
- savetxt('Material_'+Nom,Milieu, fmt='%i')
- #
- SauvFicSpecfem('Surf_top_'+Nom, ctt, Elements2DBordTop, '%i')
- #
- SauvFicSpecfem('Surf_bottom_'+Nom, ctb, Elements2DBordBottom, '%i')
- #
- SauvFicSpecfem('Surf_right_'+Nom, ctr, Elements2DBordRight, '%i')
- #
- SauvFicSpecfem('Surf_left_'+Nom, ctl, Elements2DBordLeft, '%i')
- return
-if __name__=='__main__':
- set_printoptions(precision=6, threshold=None, edgeitems=None, linewidth=200, suppress=None, nanstr=None, infstr=None)
- #
- # Lecture des paramètres d'entree eventuels
- #
- Fic = sys.argv[1]; del sys.argv[1]
- #
- Bords={'Top':'Abso', 'Bottom':'Abso', 'Left':'Abso' , 'Right':'Abso' }
- while len(sys.argv) > 1:
- opt=sys.argv[1]; del sys.argv[1]
- if opt == '-t':
- if sys.argv[1]== 'F':
- Bords['Top']='Free'
- elif sys.argv[1]== 'A':
- Bords['Top']='Abso'
- else:
- print 'Wrong condition'
- del sys.argv[1]
- elif opt == '-b':
- if sys.argv[1]== 'F':
- Bords['Bottom']='Free'
- elif sys.argv[1]== 'A':
- Bords['Bottom']='Abso'
- else:
- print 'Wrong condition'
- del sys.argv[1]
- elif opt == '-l':
- if sys.argv[1]== 'F':
- Bords['Left']='Free'
- elif sys.argv[1]== 'A':
- Bords['Left']='Abso'
- else:
- print 'Wrong condition'
- del sys.argv[1]
- elif opt == '-r': # On affiche le resultat ou pas
- if sys.argv[1]== 'F':
- Bords['Right']='Free'
- elif sys.argv[1]== 'A':
- Bords['Right']='Abso'
- else:
- print 'Wrong condition'
- del sys.argv[1]
- else:
- print sys.argv[0], ': invalid option', option
- sys.exit(1)
- #
- OuvreGmsh('',Fic, Bords)
-
Copied: seismo/2D/SPECFEM2D/trunk/UTILS/Gmsh/LibGmsh2Specfem_convert_Gmsh_to_Specfem2D_official.py (from rev 20433, seismo/2D/SPECFEM2D/trunk/UTILS/Gmsh/LibGmsh2Specfem.py)
===================================================================
--- seismo/2D/SPECFEM2D/trunk/UTILS/Gmsh/LibGmsh2Specfem_convert_Gmsh_to_Specfem2D_official.py (rev 0)
+++ seismo/2D/SPECFEM2D/trunk/UTILS/Gmsh/LibGmsh2Specfem_convert_Gmsh_to_Specfem2D_official.py 2012-06-29 00:56:40 UTC (rev 20434)
@@ -0,0 +1,426 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# Python code to link gmsh with specfem
+#
+#@author: Cristini Paul,
+# Laboratoire de Mecanique et d'Acoustique, CNRS, Marseille, France
+#
+# February 2012
+#
+import sys, string, time
+from os.path import splitext, isfile
+try:
+ from numpy import *
+except ImportError:
+ print "error: package python-numpy is not installed"
+#
+def SauvFicSpecfem(Ng, Ct, Var, Fv):
+ # Sauvegarde au format ascii
+ # Ng est le nom generique
+ # Ct le nombre de lignes a lire
+ # Var est le nom de la variable contenant les informations a ecrire
+ # Fv est le format d'ecriture '%f' pour les noeuds, '%i' pour les autres fichiers
+ savetxt(Ng,(Ct,), fmt='%i')
+ fd = open(Ng,'a')
+ savetxt(fd, Var, fmt=Fv)
+ fd.close()
+ return
+#
+def OuvreGmsh(Dir,Nom,Bords):
+ # Lecture de fichiers .msh genere avec Gmsh
+ if splitext(Nom)[-1]=='.msh':
+ fic=Nom
+ elif splitext(Nom)[-1]=='':
+ fic=Nom+'.msh'
+ else:
+ print 'File extension is not correct'
+ print 'script aborted'
+ sys.exit()
+ #
+ # Open the file and get the lines
+ #
+ f = file(Dir+fic,'r')
+ lignes= f.readlines()
+ f.close()
+ # Recherche des positions
+ #MotsCles=['','']
+ for ii in range(len(lignes)):
+ if lignes[ii]=='$Nodes\n': PosNodes=ii
+ if lignes[ii]=='$PhysicalNames\n': PosPhys=ii
+ if lignes[ii]=='$Elements\n':
+ PosElem=ii
+ break
+ # Type d'elements 4 noeuds ou 9 noeuds
+ TypElem1D = int(string.split(lignes[PosElem+2])[1])
+ if TypElem1D==1:
+ Ngnod, LinElem, SurfElem = 4, 1, 3
+ len1D, len2D = 2, 4
+ elif TypElem1D==8:
+ Ngnod, LinElem, SurfElem = 9, 8, 10
+ len1D, len2D = 3, 9
+ else:
+ print 'Element type is not 4 nor 9 nodes'
+ #-------------------------------------------------------------------------
+ # Conditions aux bords du domaine
+ # Possible choices: Abso, Free or Perio
+ Bord_abso, Bord_free = [], [] # Initialisation
+ print Bords
+ #-------------------------------------------------------------------------
+ # PHYSICAL NAMES
+ NbPhysNames = int(string.split(lignes[PosPhys+1])[0])
+ print 'PhysNames', NbPhysNames
+ # Structure de la variable : 1 entier et une chaine de caractere de taille 16
+ dt = dtype([('dimension',int), ('zone', int), ('name', str, 16)])
+ PhysCar=zeros((NbPhysNames,), dtype=dt)
+ for Ip in range(NbPhysNames):
+ Dim = int(string.split(lignes[PosPhys+2+Ip])[0])
+ Zon = int(string.split(lignes[PosPhys+2+Ip])[1])
+ Nam = string.split(lignes[PosPhys+2+Ip])[2][1:-1]
+ PhysCar[Ip] = (Dim, Zon, Nam)
+ if Bords.has_key(Nam):
+ if Bords[Nam] == 'Abso': Bord_abso.append(Zon)
+ if Bords[Nam] == 'Free': Bord_free.append(Zon)
+ if Nam == 'Right': Bord_right=Zon
+ if Nam == 'Left': Bord_left=Zon
+ if Nam == 'Top': Bord_top=Zon
+ if Nam == 'Bottom': Bord_bottom=Zon
+ #--------------------------------------
+ print 'Physical Names', PhysCar
+ print 'Absorbing boundaries', Bord_abso
+ print 'Free boundaries', Bord_free
+ print 'Right boundaries', Bord_right
+ print 'Left boundaries', Bord_left
+ print 'Top boundaries', Bord_top
+ print 'Bottom boundaries', Bord_bottom
+ #---------------------------------------------------------------------------
+ # Infos sur le fichier Gmsh
+ Ver=float(string.split(lignes[1])[0])
+ File_Type=int(string.split(lignes[1])[1])
+ Data_Size=int(string.split(lignes[1])[2])
+ # Lecture de noeuds
+ NbNodes=int(string.split(lignes[PosNodes+1])[0])
+ print 'Number of nodes: ',NbNodes
+ Nodes=zeros((NbNodes,2),dtype=float)
+ for Ninc in range(NbNodes):
+ Nodes[Ninc]= [float(val) for val in (string.split(lignes[PosNodes+2+Ninc])[1:3])]
+ #
+ # Sauvegarde au format SPECFEM
+ SauvFicSpecfem('Nodes_'+Nom, NbNodes, Nodes, '%f')
+ # Lecture des elements
+ DecElem=12+NbNodes
+ NbElements=int(string.split(lignes[PosElem+1])[0])
+ print 'Number of elements: ', NbElements
+ # depend de l'ordre
+ Elements = empty((NbElements,len2D),dtype=int)
+ Milieu = empty((NbElements,1),dtype=int)
+ Elements2DBord = empty((NbElements),dtype=int)
+ Elements1D = empty((NbElements,len1D),dtype=int)
+ Elements1DBord = empty((NbElements,len1D),dtype=int)
+ #---------------------------------------------------------------------------
+ Elements1DBordAbso = empty((NbElements,len1D),dtype=int)
+ Elements1DBordFree = empty((NbElements,len1D),dtype=int)
+ Elements2DBordAbso = zeros((NbElements,4),dtype=int)
+ Elements2DBordFree = zeros((NbElements,4),dtype=int)
+ #---------------------------------------------------------------------------
+ Elements1DBordTop = empty((NbElements,len1D),dtype=int)
+ Elements1DBordBottom = empty((NbElements,len1D),dtype=int)
+ Elements2DBordTop = zeros((NbElements,4),dtype=int)
+ Elements2DBordBottom = zeros((NbElements,4),dtype=int)
+ #---------------------------------------------------------------------------
+ Elements1DBordRight = empty((NbElements,len1D),dtype=int)
+ Elements1DBordLeft = empty((NbElements,len1D),dtype=int)
+ Elements2DBordRight = zeros((NbElements,4),dtype=int)
+ Elements2DBordLeft = zeros((NbElements,4),dtype=int)
+ #---------------------------------------------------------------------------
+ DecElem+=1
+ Ninc1D, Ninc2D, Ninc1DBord, Ninc1DBordAbso, Ninc1DBordFree = 0, 0, 0, 0, 0
+ Ninc1DBordLeft, Ninc1DBordRight, Ninc1DBordTop, Ninc1DBordBottom = 0, 0, 0, 0
+ for Ninc in range(NbElements):
+ Pos = PosElem+Ninc+2
+ TypElem = int(string.split(lignes[Pos])[1])
+ ZonP = int(string.split(lignes[Pos])[3])
+ Milieu[Ninc2D]= 1
+ if TypElem==LinElem:
+ Elements1D[Ninc1D] = [int(val) for val in (string.split(lignes[Pos])[5:])]
+ # Bord droit
+ if ZonP==Bord_right:
+ Elements1DBordRight[Ninc1DBordRight] = Elements1D[Ninc1D]
+ Ninc1DBordRight+=1
+ Elements1DBord[Ninc1DBord] = Elements1D[Ninc1D]
+ Ninc1DBord+=1
+ if Bords['Right']=='Abso':
+ Elements1DBordAbso[Ninc1DBordAbso] = Elements1D[Ninc1D]
+ Ninc1DBordAbso+=1
+ else:
+ Elements1DBordFree[Ninc1DBordFree] = Elements1D[Ninc1D]
+ Ninc1DBordFree+=1
+ # Bord gauche
+ if ZonP==Bord_left:
+ Elements1DBordLeft[Ninc1DBordLeft] = Elements1D[Ninc1D]
+ Ninc1DBordLeft+=1
+ Elements1DBord[Ninc1DBord] = Elements1D[Ninc1D]
+ Ninc1DBord+=1
+ if Bords['Left']=='Abso':
+ Elements1DBordAbso[Ninc1DBordAbso] = Elements1D[Ninc1D]
+ Ninc1DBordAbso+=1
+ else:
+ Elements1DBordFree[Ninc1DBordFree] = Elements1D[Ninc1D]
+ Ninc1DBordFree+=1
+ # Bord haut
+ if ZonP==Bord_top:
+ Elements1DBordTop[Ninc1DBordTop] = Elements1D[Ninc1D]
+ Ninc1DBordTop+=1
+ Elements1DBord[Ninc1DBord] = Elements1D[Ninc1D]
+ Ninc1DBord+=1
+ if Bords['Top']=='Abso':
+ Elements1DBordAbso[Ninc1DBordAbso] = Elements1D[Ninc1D]
+ Ninc1DBordAbso+=1
+ else:
+ Elements1DBordFree[Ninc1DBordFree] = Elements1D[Ninc1D]
+ Ninc1DBordFree+=1
+ # Bord bas
+ if ZonP==Bord_bottom:
+ Elements1DBordBottom[Ninc1DBordBottom] = Elements1D[Ninc1D]
+ Ninc1DBordBottom+=1
+ Elements1DBord[Ninc1DBord] = Elements1D[Ninc1D]
+ Ninc1DBord+=1
+ if Bords['Bottom']=='Abso':
+ Elements1DBordAbso[Ninc1DBordAbso] = Elements1D[Ninc1D]
+ Ninc1DBordAbso+=1
+ else:
+ Elements1DBordFree[Ninc1DBordFree] = Elements1D[Ninc1D]
+ Ninc1DBordFree+=1
+ Ninc1D+=1
+ if TypElem==SurfElem:
+ Elements[Ninc2D]= [int(val) for val in (string.split(lignes[Pos])[5:])]
+ Milieu[Ninc2D]= ZonP-4
+ Ninc2D+=1
+ Elements = Elements[:Ninc2D,:]
+ Milieu = Milieu[:Ninc2D,:]
+ #
+ Elements1D=Elements1D[:Ninc1D,:]
+ Elements1DBord=Elements1DBord[:Ninc1DBord,:]
+ Elements1DBordAbso=Elements1DBordAbso[:Ninc1DBordAbso,:]
+ Elements1DBordFree=Elements1DBordFree[:Ninc1DBordFree,:]
+ Elements1DBordRight=Elements1DBordRight[:Ninc1DBordRight,:]
+ Elements1DBordLeft=Elements1DBordLeft[:Ninc1DBordLeft,:]
+ Elements1DBordTop=Elements1DBordTop[:Ninc1DBordTop,:]
+ Elements1DBordBottom=Elements1DBordBottom[:Ninc1DBordBottom,:]
+ # Modification la matrice contenant les elements 1D pour travailler sur les noeuds
+ Elements1DBordFlat=ravel(Elements1DBord)
+ # Noeuds appartenant aux bords du domaine
+ NodesBordC=set(Elements1DBordFlat) # permet d'enlever les elements dupliques
+ NodesBord2n=set(Elements1DBordFlat[::3]) # Noeuds aux bords sans intermediaire
+ #-------------------------------------------------------
+ NodesBordRight = set(ravel(Elements1DBordRight))
+ NodesBordLeft = set(ravel(Elements1DBordLeft))
+ NodesBordTop = set(ravel(Elements1DBordTop))
+ NodesBordBottom = set(ravel(Elements1DBordBottom))
+ #-------------------------------------------------------
+ Elt=ravel(Elements1DBordRight)
+ NodesBordRight2n = set(hstack((Elt,Elt[-2]))[::3])
+ Elt=ravel(Elements1DBordLeft)
+ NodesBordLeft2n = set(hstack((Elt,Elt[-2]))[::3])
+ Elt=ravel(Elements1DBordTop)
+ NodesBordTop2n = set(hstack((Elt,Elt[-2]))[::3])
+ Elt=ravel(Elements1DBordBottom)
+ NodesBordBottom2n = set(hstack((Elt,Elt[-2]))[::3])
+ #
+ ctBord=0
+ # Detection des elements qui sont aux bords droit gauche haut bas
+ t0=time.clock()
+ ctf, cta, ctr, ctl, ctt, ctb = 0, 0, 0, 0, 0, 0
+ for Ct2D in xrange(Ninc2D):
+ # Attention aux elements qui ont un point correspondant a un coin
+ jj=set(Elements[Ct2D])
+ if not set.isdisjoint(jj, NodesBordC):
+ ctBord+=1
+ # Bord Right
+ if not set.isdisjoint(jj, NodesBordRight2n):
+ rr = set.intersection(jj, NodesBordRight2n)
+ if len(rr)==2:
+ el = concatenate(([Ct2D+1], [len(rr)], list(rr)))
+ Elements2DBordRight[ctr,:] = el
+ ctr+=1
+ if Bords['Right']=='Abso':
+ Elements2DBordAbso[cta,:] = el
+ cta+=1
+ if Bords['Right']=='Free':
+ Elements2DBordFree[ctf,:] = el
+ ctf+=1
+ # Cas du bord double
+ if len(rr)==3:
+ ctdb=0
+ # Recherche des deux elements 1D
+ for Nn in xrange(Ninc1DBordRight):
+ kk = set(Elements1DBordRight[Nn])
+ if not set.isdisjoint(rr, kk):
+ if kk.issubset(jj):
+ exec 'kk'+str(ctdb)+'=kk'
+ ctdb+=1
+ Elc = set.intersection(kk0, kk1)
+ rrm=rr.difference(Elc)
+ rr1=list(rrm)
+ El1=concatenate(([rr1[0]],list(Elc)))
+ El2=concatenate((list(Elc),[rr1[1]]))
+ el1 = concatenate(([Ct2D+1], [2], El1))
+ el2 = concatenate(([Ct2D+1], [2], El2))
+ Elements2DBordRight[ctr,:] = el1
+ ctr+=1
+ Elements2DBordRight[ctr,:] = el2
+ ctr+=1
+ if Bords['Right']=='Abso':
+ Elements2DBordAbso[cta,:] = el1
+ cta+=1
+ Elements2DBordAbso[cta,:] = el2
+ cta+=1
+ if Bords['Right']=='Free':
+ Elements2DBordFree[ctf,:] = el1
+ ctf+=1
+ Elements2DBordFree[ctf,:] = el2
+ ctf+=1
+ # Bord Left
+ if not set.isdisjoint(jj, NodesBordLeft2n):
+ rr = set.intersection(jj, NodesBordLeft2n)
+ if len(rr)==2:
+ el = concatenate(([Ct2D+1], [len(rr)], list(rr)))
+ Elements2DBordLeft[ctl,:] = el
+ ctl+=1
+ if Bords['Left']=='Abso':
+ Elements2DBordAbso[cta,:] = el
+ cta+=1
+ if Bords['Left']=='Free':
+ Elements2DBordFree[ctf,:] = el
+ ctf+=1
+ # Cas du bord double
+ if len(rr)==3:
+ ctdb=0
+ # Recherche des deux elements 1D
+ for Nn in xrange(Ninc1DBordLeft):
+ kk = set(Elements1DBordLeft[Nn])
+ if not set.isdisjoint(rr, kk):
+ if kk.issubset(jj):
+ exec 'kk'+str(ctdb)+'=kk'
+ ctdb+=1
+ Elc = set.intersection(kk0, kk1)
+ rrm=rr.difference(Elc)
+ rr1=list(rrm)
+ El1=concatenate(([rr1[0]],list(Elc)))
+ El2=concatenate((list(Elc),[rr1[1]]))
+ el1 = concatenate(([Ct2D+1], [2], El1))
+ el2 = concatenate(([Ct2D+1], [2], El2))
+ Elements2DBordLeft[ctl,:] = el1
+ ctl+=1
+ Elements2DBordLeft[ctl,:] = el2
+ ctl+=1
+ if Bords['Left']=='Abso':
+ Elements2DBordAbso[cta,:] = el1
+ cta+=1
+ Elements2DBordAbso[cta,:] = el2
+ cta+=1
+ if Bords['Left']=='Free':
+ Elements2DBordFree[ctf,:] = el1
+ ctf+=1
+ Elements2DBordFree[ctf,:] = el2
+ ctf+=1
+ # Bord Top
+ if not set.isdisjoint(jj, NodesBordTop2n):
+ rr = set.intersection(jj, NodesBordTop2n)
+ if len(rr)==2:
+ el = concatenate(([Ct2D+1], [len(rr)], list(rr)))
+ Elements2DBordTop[ctt,:len(el)] = el
+ ctt+=1
+ if Bords['Top']=='Abso':
+ Elements2DBordAbso[cta,:] = el
+ cta+=1
+ if Bords['Top']=='Free':
+ Elements2DBordFree[ctf,:] = el
+ ctf+=1
+ # Bord Bottom
+ if not set.isdisjoint(jj, NodesBordBottom2n):
+ rr = set.intersection(jj, NodesBordBottom2n)
+ if len(rr)==2:
+ el = concatenate(([Ct2D+1], [len(rr)], list(rr)))
+ Elements2DBordBottom[ctb,:len(el)] = el
+ ctb+=1
+ if Bords['Bottom']=='Abso':
+ Elements2DBordAbso[cta,:] = el
+ cta+=1
+ if Bords['Bottom']=='Free':
+ Elements2DBordFree[ctf,:] = el
+ ctf+=1
+ Elements2DBord=Elements2DBord[:ctBord]
+ #----------------------------------------------------------------------
+ Elements2DBordAbso = Elements2DBordAbso[:cta,:]
+ Elements2DBordFree = Elements2DBordFree[:ctf,:]
+ Elements2DBordTop = Elements2DBordTop[:ctt,:]
+ Elements2DBordBottom = Elements2DBordBottom[:ctb,:]
+ Elements2DBordRight = Elements2DBordRight[:ctr,:]
+ Elements2DBordLeft = Elements2DBordLeft[:ctl,:]
+ #-----------------------------------------------------------------------
+ # Sauvegarde au format SPECFEM
+ SauvFicSpecfem('Mesh_'+Nom, Ninc2D, Elements, '%i')
+ #
+ SauvFicSpecfem('Surf_abs_'+Nom, cta, Elements2DBordAbso, '%i')
+ #
+ SauvFicSpecfem('Surf_free_'+Nom, ctf, Elements2DBordFree, '%i')
+ #
+ savetxt('Material_'+Nom,Milieu, fmt='%i')
+ #
+ SauvFicSpecfem('Surf_top_'+Nom, ctt, Elements2DBordTop, '%i')
+ #
+ SauvFicSpecfem('Surf_bottom_'+Nom, ctb, Elements2DBordBottom, '%i')
+ #
+ SauvFicSpecfem('Surf_right_'+Nom, ctr, Elements2DBordRight, '%i')
+ #
+ SauvFicSpecfem('Surf_left_'+Nom, ctl, Elements2DBordLeft, '%i')
+ return
+if __name__=='__main__':
+ set_printoptions(precision=6, threshold=None, edgeitems=None, linewidth=200, suppress=None, nanstr=None, infstr=None)
+ #
+ # Lecture des paramètres d'entree eventuels
+ #
+ Fic = sys.argv[1]; del sys.argv[1]
+ #
+ Bords={'Top':'Abso', 'Bottom':'Abso', 'Left':'Abso' , 'Right':'Abso' }
+ while len(sys.argv) > 1:
+ opt=sys.argv[1]; del sys.argv[1]
+ if opt == '-t':
+ if sys.argv[1]== 'F':
+ Bords['Top']='Free'
+ elif sys.argv[1]== 'A':
+ Bords['Top']='Abso'
+ else:
+ print 'Wrong condition'
+ del sys.argv[1]
+ elif opt == '-b':
+ if sys.argv[1]== 'F':
+ Bords['Bottom']='Free'
+ elif sys.argv[1]== 'A':
+ Bords['Bottom']='Abso'
+ else:
+ print 'Wrong condition'
+ del sys.argv[1]
+ elif opt == '-l':
+ if sys.argv[1]== 'F':
+ Bords['Left']='Free'
+ elif sys.argv[1]== 'A':
+ Bords['Left']='Abso'
+ else:
+ print 'Wrong condition'
+ del sys.argv[1]
+ elif opt == '-r': # On affiche le resultat ou pas
+ if sys.argv[1]== 'F':
+ Bords['Right']='Free'
+ elif sys.argv[1]== 'A':
+ Bords['Right']='Abso'
+ else:
+ print 'Wrong condition'
+ del sys.argv[1]
+ else:
+ print sys.argv[0], ': invalid option', option
+ sys.exit(1)
+ #
+ OuvreGmsh('',Fic, Bords)
+
Deleted: 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 2012-06-28 22:59:37 UTC (rev 20433)
+++ seismo/2D/SPECFEM2D/trunk/UTILS/Gmsh/README_convert_Gmsh_to_Specfem2D_Nicolas_Massacret 2012-06-29 00:56:40 UTC (rev 20434)
@@ -1,8 +0,0 @@
-
-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
-
-
Deleted: 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 2012-06-28 22:59:37 UTC (rev 20433)
+++ seismo/2D/SPECFEM2D/trunk/UTILS/Gmsh/convert_Gmsh_to_Specfem2D_Nicolas_Massacret.c 2012-06-29 00:56:40 UTC (rev 20434)
@@ -1,136 +0,0 @@
-#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;
-}
-
Copied: seismo/2D/SPECFEM2D/trunk/UTILS/Gmsh/unofficial_unsupported_README_convert_Gmsh_to_Specfem2D_Nicolas_Massacret (from rev 20433, seismo/2D/SPECFEM2D/trunk/UTILS/Gmsh/README_convert_Gmsh_to_Specfem2D_Nicolas_Massacret)
===================================================================
--- seismo/2D/SPECFEM2D/trunk/UTILS/Gmsh/unofficial_unsupported_README_convert_Gmsh_to_Specfem2D_Nicolas_Massacret (rev 0)
+++ seismo/2D/SPECFEM2D/trunk/UTILS/Gmsh/unofficial_unsupported_README_convert_Gmsh_to_Specfem2D_Nicolas_Massacret 2012-06-29 00:56:40 UTC (rev 20434)
@@ -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
+
+
Copied: seismo/2D/SPECFEM2D/trunk/UTILS/Gmsh/unofficial_unsupported_convert_Gmsh_to_Specfem2D_Nicolas_Massacret.c (from rev 20433, seismo/2D/SPECFEM2D/trunk/UTILS/Gmsh/convert_Gmsh_to_Specfem2D_Nicolas_Massacret.c)
===================================================================
--- seismo/2D/SPECFEM2D/trunk/UTILS/Gmsh/unofficial_unsupported_convert_Gmsh_to_Specfem2D_Nicolas_Massacret.c (rev 0)
+++ seismo/2D/SPECFEM2D/trunk/UTILS/Gmsh/unofficial_unsupported_convert_Gmsh_to_Specfem2D_Nicolas_Massacret.c 2012-06-29 00:56:40 UTC (rev 20434)
@@ -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