~njansson/dolfin/hpc

« back to all changes in this revision

Viewing changes to site-packages/dolfin/meshconvert.py

merge

Show diffs side-by-side

added added

removed removed

Lines of Context:
9
9
# Modified by Bartosz Sawicki (diffpack function)
10
10
# Modified by Gideon Simpson (Exodus II function)
11
11
# Modified by Arve Knudsen (make into module, abaqus support)
 
12
# Modified by Kent-Andre Mardal (Star-CD function)
12
13
""" Module for converting various mesh formats.
13
14
"""
14
15
 
43
44
        return "ExodusII"
44
45
    elif suffix =="e":
45
46
        return "ExodusII"
 
47
    elif suffix == "vrt" or suffix == "cel": 
 
48
        return "StarCD"
46
49
    else:
47
50
        _error("Sorry, unknown suffix %s." % suffix)
48
51
 
1230
1233
    elif iformat =="ExodusII":
1231
1234
        # Convert from ExodusII format to xml format via NetCDF
1232
1235
        exodus2xml(ifilename, ofilename)
 
1236
    elif iformat == "StarCD": 
 
1237
        # Convert from Star-CD tetrahedral grid format to xml format
 
1238
        starcd2xml(ifilename, ofilename)
1233
1239
    else:
1234
1240
        _error("Sorry, cannot convert between %s and DOLFIN xml file formats." % iformat)
1235
1241
 
1237
1243
    if iformat == "abaqus":
1238
1244
        handler.close()
1239
1245
 
 
1246
def starcd2xml(ifilename, ofilename):
 
1247
    "Convert from Star-CD tetrahedral grid format to DOLFIN XML."
 
1248
 
 
1249
    print starcd2xml.__doc__
 
1250
 
 
1251
    if not path.isfile(ifilename[:-3] + "vrt") or not path.isfile(ifilename[:-3] + "cel"):
 
1252
        print "StarCD format requires one .vrt file and one .cel file"
 
1253
        sys.exit(2)
 
1254
      
 
1255
 
 
1256
    # open output file 
 
1257
    ofile = open(ofilename, "w")
 
1258
 
 
1259
    # Open file, the vertices are in a .vrt file
 
1260
    ifile = open(ifilename[:-3] + "vrt", "r")
 
1261
 
 
1262
    write_header_mesh(ofile, "tetrahedron", 3)
 
1263
 
 
1264
 
 
1265
    # Read & write vertices
 
1266
 
 
1267
    # first, read all lines (need to sweep to times through the file)
 
1268
    lines = ifile.readlines()
 
1269
 
 
1270
    # second, find the number of vertices
 
1271
    num_vertices = -1 
 
1272
    for line in lines: 
 
1273
        nodenr = int(line[0:15])
 
1274
        if nodenr > num_vertices: num_vertices = nodenr 
 
1275
    
 
1276
    
 
1277
    # third, run over all vertices
 
1278
    write_header_vertices(ofile, num_vertices)
 
1279
    for line in lines: 
 
1280
        nodenr = int(line[0:15])
 
1281
        vertex0 = float(line[15:31])
 
1282
        vertex1 = float(line[31:47])
 
1283
        vertex2 = float(line[47:63])
 
1284
        write_vertex(ofile, int(nodenr)-1, float(vertex0), float(vertex1), float(vertex2))  
 
1285
    write_footer_vertices(ofile)
 
1286
 
 
1287
 
 
1288
 
 
1289
 
 
1290
    # Open file, the cells are in a .cel file
 
1291
    ifile = open(ifilename[:-3] + "cel", "r")
 
1292
 
 
1293
    # Read & write cells 
 
1294
 
 
1295
    # first, read all lines (need to sweep to times through the file)
 
1296
    lines = ifile.readlines()
 
1297
 
 
1298
    # second, find the number of cells 
 
1299
    num_cells = -1 
 
1300
    counter = 0 
 
1301
    for line in lines: 
 
1302
        l = [int(a) for a in line.split()]
 
1303
        cellnr, node0, node1, node2, node3, node4, node5, node6, node7, tmp1, tmp2  = l 
 
1304
        if node4 > 0:
 
1305
                if node2 == node3 and node4 == node5 and node5 == node6 and node6 == node7: # these nodes should be equal  
 
1306
                        counter += 1
 
1307
                else:            
 
1308
                        print "The file does contain cells that are not tetraheders. The cell number is ", cellnr, " the line read was ", line                      
 
1309
        else:                              
 
1310
            print "The file does contain cells that are not tetraheders node4==0. The cell number is ", cellnr, " the line read was ", line 
 
1311
            #sys.exit(2)
 
1312
 
 
1313
    num_cells = counter
 
1314
 
 
1315
    # third, run over all cells 
 
1316
    write_header_cells(ofile, num_cells )
 
1317
    counter = 0 
 
1318
    for line in lines: 
 
1319
        l = [int(a) for a in line.split()]
 
1320
        cellnr, node0, node1, node2, node3, node4, node5, node6, node7, tmp1, tmp2  = l 
 
1321
        if (node4 > 0): 
 
1322
                if node2 == node3 and node4 == node5 and node5 == node6 and node6 == node7: # these nodes should be equal  
 
1323
        
 
1324
                        write_cell_tetrahedron(ofile, counter, node0-1, node1-1, node2-1, node4-1)
 
1325
                        counter += 1 
 
1326
 
 
1327
       
 
1328
    write_footer_cells(ofile)
 
1329
    write_footer_mesh(ofile)
 
1330
 
 
1331
 
 
1332
    # Close files
 
1333
    ifile.close()
 
1334
    ofile.close()
 
1335
 
 
1336
 
1240
1337