Changeset 985


Ignore:
Timestamp:
Mar 1, 2005, 6:51:23 PM (20 years ago)
Author:
duncan
Message:

first cut of a netcdf .msh file

Location:
inundation/ga/storm_surge/pmesh/load_mesh
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • inundation/ga/storm_surge/pmesh/load_mesh/loadASCII.py

    r978 r985  
    3232    segment_tags : [tag,tag,...] list of strings
    3333    triangles : [(v1,v2,v3), (v4,v5,v6),....] lists of points
    34     triangle tags: [s1,s2,...] A list of strings
     34    triangle tags: [[s1],[s2],...] A list of list of strings (probably not neccecary.  a list of string should be ok)
    3535    triangle neighbors: [[t1,t2,t3], [t4,t5,t6],..] lists of triangles
    3636       
     
    5353from string import  find, rfind
    5454
    55 from Numeric import array, Float, reshape, concatenate #, transpose
     55from Numeric import array, Float, Int16, Character,reshape, concatenate
    5656
    5757from os.path import splitext
     
    8585    Note: This might throw a can't load file error
    8686    """
    87     fd = open(ofile,'r')
    88     dict = read_triangulation(fd)
    89     dict_mesh = read_outline(fd)
    90     for element in dict_mesh.keys():
    91         dict[element] = dict_mesh[element]
    92        
    93     fd.close()
     87   
     88    if ofile[-4:]== ".tsh":
     89        fd = open(ofile,'r')
     90        dict = read_triangulation(fd)
     91        dict_mesh = read_outline(fd)
     92        for element in dict_mesh.keys():
     93            dict[element] = dict_mesh[element]
     94        fd.close()
     95    elif ofile[-4:]== ".msh":
     96        dict = read_tsh_file(ofile)
     97    else:     
     98        msg = 'Extension %s is unknown' %ofile[-4:]
     99        raise IOError, msg       
    94100    return dict
    95101
     
    570576
    571577
    572 def write_msh_file(filename, mesh_dict):
    573     """Write .pts NetCDF file   
    574     Return a Points dictionary.  see header for definition.
    575 
    576     WARNING: This function mangles the mesh_dict data structure
     578def write_msh_file(filename, mesh):
     579    """Write .msh NetCDF file   
     580
     581    WARNING: This function mangles the mesh data structure
    577582    """
    578583 
    579     from Scientific.IO.NetCDF import NetCDFFile 
    580    
    581     point_atts2array(point_atts)
     584    from Scientific.IO.NetCDF import NetCDFFile
     585
     586    IntType = Int16
     587   
     588    #
     589    #the triangulation
     590    mesh['vertices'] = array(mesh['vertices']).astype(Float)
     591    mesh['vertex_attributes'] = array(mesh['vertex_attributes']).astype(Float)
     592    mesh['vertex_attribute_titles'] = array(mesh['vertex_attribute_titles']).astype(Character)
     593    mesh['segments'] = array(mesh['segments']).astype(IntType)
     594    mesh['segment_tags'] = array(mesh['segment_tags']).astype(Character)
     595    mesh['triangles'] = array(mesh['triangles']).astype(IntType) 
     596    mesh['triangle_tags'] = array(mesh['triangle_tags']).astype(Character)
     597    mesh['triangle_neighbors'] = array(mesh['triangle_neighbors']).astype(IntType)
     598   
     599    #the outline
     600    mesh['points'] = array(mesh['points']).astype(Float)
     601    mesh['point_attributes'] = array(mesh['point_attributes']).astype(Float)
     602    mesh['outline_segments'] = array(mesh['outline_segments']).astype(IntType)
     603    mesh['outline_segment_tags'] = array(mesh['outline_segment_tags']).astype(Character)
     604    mesh['holes'] = array(mesh['holes']).astype(Float)
     605    mesh['regions'] = array(mesh['regions']).astype(Float)
     606    mesh['region_tags'] = array(mesh['region_tags']).astype(Character)
     607    mesh['region_max_areas'] = array(mesh['region_max_areas']).astype(Float)
     608   
     609    #mesh = mesh_dict2array(mesh)
     610    #print "new_mesh",new_mesh
     611    #print "mesh",mesh
     612   
    582613    # NetCDF file definition
    583614    outfile = NetCDFFile(filename, 'w')
     
    588619                      'of spatial point data'
    589620   
    590     # dimension definitions
    591     shape = point_atts['pointlist'].shape[0]
    592     outfile.createDimension('number_of_points', shape) 
    593     outfile.createDimension('number_of_dimensions', 2) #This is 2d data
    594    
    595     # variable definition
    596     outfile.createVariable('points', Float, ('number_of_points',
    597                                              'number_of_dimensions'))
    598 
    599     #create variables 
    600     outfile.variables['points'][:] = point_atts['pointlist'] #.astype(Float32)
    601     for key in point_atts['attributelist'].keys():
    602         outfile.createVariable(key, Float, ('number_of_points',))
    603         outfile.variables[key][:] = point_atts['attributelist'][key] #.astype(Float32)
    604     outfile.close()
    605 
     621    # dimension definitions - fixed
     622    outfile.createDimension('num_of_dimensions', 2) #This is 2d data
     623    outfile.createDimension('num_of_segment_ends', 2) #Segs have two points
     624    outfile.createDimension('num_of_triangle_vertices', 3)
     625    outfile.createDimension('num_of_triangle_faces', 3)
     626    outfile.createDimension('num_of_region_max_area', 1)
     627   
     628    # dimension definitions - variable
     629    #trianglulation
     630    outfile.createDimension('num_of_vertices', mesh['vertices'].shape[0])
     631    outfile.createDimension('num_of_vertex_attributes',
     632                            mesh['vertex_attributes'].shape[1])
     633    outfile.createDimension('num_of_vertex_attribute_title_chars',
     634                            mesh['vertex_attribute_titles'].shape[1])
     635   
     636    outfile.createDimension('num_of_segments',
     637                            mesh['segments'].shape[0])
     638    outfile.createDimension('num_of_segment_tag_chars',
     639                            mesh['segment_tags'].shape[1])
     640    outfile.createDimension('num_of_triangles',
     641                            mesh['triangles'].shape[0])
     642    outfile.createDimension('num_of_triangle_tag_chars',
     643                            mesh['triangle_tags'].shape[2])
     644    outfile.createDimension('num_of_triangle_tag_per_triangle',
     645                            mesh['triangle_tags'].shape[1])
     646
     647    #outline
     648    outfile.createDimension('num_of_points', mesh['points'].shape[0])
     649    outfile.createDimension('num_of_point_attributes',
     650                            mesh['point_attributes'].shape[1])
     651    outfile.createDimension('num_of_outline_segments',
     652                            mesh['outline_segments'].shape[0])
     653    outfile.createDimension('num_of_outline_segment_tag_chars',
     654                            mesh['outline_segment_tags'].shape[1])
     655    outfile.createDimension('num_of_holes', mesh['holes'].shape[0])
     656    outfile.createDimension('num_of_regions', mesh['regions'].shape[0])
     657    outfile.createDimension('num_of_region_tag_chars',
     658                            mesh['region_tags'].shape[1])
     659   
     660   
     661    # variable definitions
     662    # trianglulation
     663    outfile.createVariable('vertices', Float, ('num_of_vertices',
     664                                             'num_of_dimensions'))
     665    outfile.createVariable('vertex_attributes', Float, ('num_of_vertices',
     666                                             'num_of_vertex_attributes'))
     667    outfile.createVariable('vertex_attribute_titles',
     668                           Character,
     669                           ( 'num_of_vertex_attributes','num_of_vertex_attribute_title_chars' ))
     670    outfile.createVariable('segments',
     671                           IntType,
     672                           ('num_of_segments', 'num_of_segment_ends'))
     673    outfile.createVariable('segment_tags',
     674                           Character,
     675                           ('num_of_segments',
     676                            'num_of_segment_tag_chars'))
     677    outfile.createVariable('triangles',
     678                           IntType,
     679                           ('num_of_triangles', 'num_of_triangle_vertices'))
     680    outfile.createVariable('triangle_tags',
     681                           Character,
     682                           ('num_of_triangles',
     683                            'num_of_triangle_tag_per_triangle',
     684                            'num_of_triangle_tag_chars'))
     685    outfile.createVariable('triangle_neighbors',
     686                           IntType,
     687                           ('num_of_triangles', 'num_of_triangle_faces'))
     688   
     689   
     690    # outline
     691    outfile.createVariable('points', Float, ('num_of_points',
     692                                             'num_of_dimensions'))
     693    outfile.createVariable('point_attributes', Float, ('num_of_points',
     694                                             'num_of_point_attributes'))
     695   
     696    outfile.createVariable('outline_segments',
     697                           IntType,
     698                           ('num_of_outline_segments', 'num_of_segment_ends'))
     699    outfile.createVariable('outline_segment_tags',
     700                           Character,
     701                           ('num_of_outline_segments',
     702                            'num_of_outline_segment_tag_chars'))
     703    outfile.createVariable('holes', Float, ('num_of_holes',
     704                                             'num_of_dimensions'))
     705    outfile.createVariable('regions', Float, ('num_of_regions',
     706                                             'num_of_dimensions'))
     707    outfile.createVariable('region_tags',
     708                           Character,
     709                           ('num_of_regions',
     710                            'num_of_region_tag_chars'))
     711    outfile.createVariable('region_max_areas',
     712                           Float,
     713                           ('num_of_regions',)) #'num_of_region_max_area'))
     714
     715    # Setting the variables
     716    #triangulation
     717    outfile.variables['vertices'][:] = mesh['vertices']
     718    outfile.variables['vertex_attributes'][:] = mesh['vertex_attributes']
     719    outfile.variables['vertex_attribute_titles'][:] = mesh['vertex_attribute_titles']
     720    outfile.variables['segments'][:] = mesh['segments']
     721    outfile.variables['segment_tags'][:] = mesh['segment_tags']
     722    outfile.variables['triangles'][:] = mesh['triangles']
     723    outfile.variables['triangle_tags'][:] = mesh['triangle_tags']
     724    outfile.variables['triangle_neighbors'][:] = mesh['triangle_neighbors']
     725   
     726    # Outline
     727    outfile.variables['points'][:] = mesh['points']
     728    outfile.variables['point_attributes'][:] = mesh['point_attributes']
     729    outfile.variables['outline_segments'][:] = mesh['outline_segments']
     730    outfile.variables['outline_segment_tags'][:] = mesh['outline_segment_tags']
     731    outfile.variables['holes'][:] = mesh['holes']
     732    outfile.variables['regions'][:] = mesh['regions']
     733    outfile.variables['region_tags'][:] = mesh['region_tags']
     734    outfile.variables['region_max_areas'][:] = mesh['region_max_areas']
     735   
     736    outfile.close()
     737
     738
     739   
     740def read_msh_file(file_name):
     741    """
     742    Read in an msh file.
     743
     744    """
     745       
     746    from Scientific.IO.NetCDF import NetCDFFile         
     747           
     748    #Check contents
     749    #Get NetCDF
     750    fid = NetCDFFile(file_name, 'r')
     751
     752    mesh = {}
     753    # Get the variables
     754    # the triangulation
     755    mesh['vertices'] = fid.variables['vertices'][:]
     756    mesh['vertex_attributes'] = fid.variables['vertex_attributes'][:]
     757    titles = fid.variables['vertex_attribute_titles'][:]
     758    mesh['vertex_attribute_titles'] = []
     759    for i, title in enumerate(titles):
     760        mesh['vertex_attribute_titles'].append(titles[i].tostring().strip())
     761    mesh['segments'] = fid.variables['segments'][:]
     762    tags = fid.variables['segment_tags'][:]
     763    mesh['segment_tags'] =[]
     764    for i, tag in enumerate(tags):
     765        mesh['segment_tags'].append(tags[i].tostring().strip())
     766    mesh['triangles'] = fid.variables['triangles'][:]
     767    tags = fid.variables['triangle_tags'][:]
     768    mesh['triangle_tags'] =[]
     769    for i, tag in enumerate(tags):
     770        mesh['triangle_tags'].append(tags[i].tostring().strip())
     771    mesh['triangle_neighbors'] = fid.variables['triangle_neighbors'][:]
     772   
     773    #the outline
     774    mesh['points'] = fid.variables['points'][:]
     775    mesh['point_attributes'] = fid.variables['point_attributes'][:]
     776    mesh['outline_segments'] = fid.variables['outline_segments'][:]
     777    tags = fid.variables['outline_segment_tags'][:]
     778    mesh['outline_segment_tags'] =[]
     779    for i, tag in enumerate(tags):
     780        mesh['outline_segment_tags'].append(tags[i].tostring().strip())
     781   
     782    mesh['holes'] = fid.variables['holes'][:]
     783    mesh['regions'] = fid.variables['regions'][:]
     784    tags = fid.variables['region_tags'][:]
     785    mesh['region_tags'] =[]
     786    for i, tag in enumerate(tags):
     787        mesh['region_tags'].append(tags[i].tostring().strip())
     788    mesh['region_max_areas'] = fid.variables['region_max_areas'][:]
     789    #mesh[''] = fid.variables[''][:]
     790   
     791    fid.close()
     792   
     793    return mesh
     794           
    606795
    607796## used by alpha shapes
     
    779968        outfile.variables[key][:] = point_atts['attributelist'][key] #.astype(Float32)
    780969    outfile.close()
    781        
    782 # used to be load_xya_file           
     970                 
    783971def load_points_file(ofile,delimiter = ','):
    784972    """
    785     load a file, ofile, with the format 1st line header,
    786     x,y, [attributes]
     973    load an .xya or .pts file   
    787974    """
    788975   
     
    805992        msg = 'Extension %s is unknown' %ofile[-4:]
    806993        raise IOError, msg
    807        
    808    
    809        
    810994    return points_dict
    811995
  • inundation/ga/storm_surge/pmesh/load_mesh/test_loadASCII.py

    r975 r985  
    2626class loadASCIITestCase(unittest.TestCase):
    2727    def setUp(self):
    28         pass
    29    
     28        self.dict ={}
     29        self.dict['outline_segments'] = [(0, 1), (1, 2), (0, 2), (0, 3)]
     30        self.dict['outline_segment_tags'] = ['50', '40', '30', '20']
     31        self.dict['holes'] = [(0.2, 0.6)]
     32        self.dict['point_attributes'] = [[5, 2], [4, 2], [3, 2], [2,2]]
     33        self.dict['regions'] = [(0.3, 0.3),(0.3, 0.4)]
     34        self.dict['region_tags'] = ['1.3', 'yeah']
     35        self.dict['region_max_areas'] = [36.0,-7.1]
     36        self.dict['points'] = [(0.0, 0.0), (0.0, 4.0), (4.0, 0.0), (1.0, 1.0)]
     37
     38        self.dict['vertices'] = [(0.0, 0.0), (0.0, 4.0),
     39                                          (4.0, 0.0), (1.0, 1.0), (2.0, 2.0)]
     40        self.dict['triangles'] = [(3, 2, 4), (1, 0, 3),
     41                                             (3, 4,1), (2, 3, 0)]
     42        self.dict['segments'] = [(0, 1), (1, 4), (2, 0),
     43                                            (0, 3), (4, 2)]
     44        self.dict['triangle_tags'] = [['1.3'], ['1.3'],
     45                                                      ['1.3'], ['1.3']]
     46        self.dict['vertex_attributes'] = [[1.2,2.], [1.2,2.], [1.2,2.], [1.2,2.], [1.2,3.]]
     47        self.dict['triangle_neighbors'] = [[-1, 2, 3], [3, 2, -1],
     48                                                     [-1, 1, 0], [1, -1, 0]]
     49        self.dict['segment_tags'] = ['50', '40', '30', '20', '40']
     50        self.dict['vertex_attribute_titles'] = ['bed elevation', 'height']
    3051    def tearDown(self):
    3152        pass
     
    3354   
    3455    def test_import_mesh(self):
    35         dict ={}
    36         dict['outline_segments'] = [(0, 1), (1, 2), (0, 2), (0, 3)]
    37         dict['outline_segment_tags'] = ['50', '40', '30', '20']
    38         dict['holes'] = [(0.2, 0.6)]
    39         dict['point_attributes'] = [[5, 2], [4, 2], [3, 2], [2,2]]
    40         dict['regions'] = [(0.3, 0.3)]
    41         dict['region_tags'] = ['1.3']
    42         dict['region_max_areas'] = [36.0]
    43         dict['points'] = [(0.0, 0.0), (0.0, 4.0), (4.0, 0.0), (1.0, 1.0)]
    44 
     56       
     57        dict = self.dict
    4558        fileName = tempfile.mktemp(".txt")
    4659        fd = open(fileName,'w')
     
    7083                        array(dict['outline_segment_tags']),
    7184                         'test_import_mesh failed. Test 4')
    72         #print "loaded_dict['regions']",loaded_dict['regions']
    73         #print "dict['regions']",dict['regions']
    7485        self.failUnless(array(loaded_dict['regions'])  ==
    7586                        array(dict['regions']),
     
    89100        import os
    90101        import tempfile
    91 
    92         meshDict = {}
    93         meshDict['vertices'] = [(0.0, 0.0), (0.0, 4.0),
    94                                           (4.0, 0.0), (1.0, 1.0), (2.0, 2.0)]
    95         meshDict['triangles'] = [(3, 2, 4), (1, 0, 3),
    96                                              (3, 4,1), (2, 3, 0)]
    97         meshDict['segments'] = [(0, 1), (1, 4), (2, 0),
    98                                             (0, 3), (4, 2)]
    99         meshDict['triangle_tags'] = [['1.3'], ['1.3'],
    100                                                       ['1.3'], ['1.3']]
    101         meshDict['vertex_attributes'] = [[1.2,2.], [1.2,2.], [1.2,2.], [1.2,2.], [1.2,3.]]
    102         meshDict['triangle_neighbors'] = [[-1, 2, 3], [3, 2, -1],
    103                                                      [-1, 1, 0], [1, -1, 0]]
    104         meshDict['segment_tags'] = ['50', '40', '30', '20', '40']
    105         meshDict['vertex_attribute_titles'] = ['bed elevation', 'height']
    106        
     102       
     103        meshDict = self.dict
    107104        fileName = tempfile.mktemp(".tsh")
    108105        export_triangulation_file(fileName, meshDict)
     
    142139           
    143140        os.remove(fileName)
    144 
     141 
     142    def test_read_write_msh_file(self):
     143       
     144        dict = self.dict.copy()
     145        fileName = tempfile.mktemp(".txt")
     146        write_msh_file(fileName,dict)
     147        loaded_dict = read_msh_file(fileName)
     148        os.remove(fileName)
     149
     150       
     151        dict = self.dict
     152        #print "*********************"
     153        #print dict
     154        #print "**loaded_dict*******************"
     155        #print loaded_dict
     156        #print "*********************"
     157
     158       
     159        self.failUnless(array(loaded_dict['points'])  ==
     160                        array(dict['points']),
     161                         'test_import_mesh failed. Test 1')
     162        self.failUnless(array(loaded_dict['point_attributes'])  ==
     163                        array(dict['point_attributes']),
     164                         'test_import_mesh failed. Test 2')
     165        self.failUnless(array(loaded_dict['outline_segments'])  ==
     166                        array(dict['outline_segments']),
     167                         'test_import_mesh failed. Test 3')
     168        self.failUnless(array(loaded_dict['outline_segment_tags'])  ==
     169                        array(dict['outline_segment_tags']),
     170                         'test_import_mesh failed. Test 4')
     171        self.failUnless(array(loaded_dict['regions'])  ==
     172                        array(dict['regions']),
     173                         'test_import_mesh failed. Test 5')
     174        self.failUnless(array(loaded_dict['region_tags'])  ==
     175                        array(dict['region_tags']),
     176                         'test_import_mesh failed. Test 5')
     177        self.failUnless(array(loaded_dict['region_max_areas'])  ==
     178                        array(dict['region_max_areas']),
     179                         'test_import_mesh failed. Test 5')
     180
     181        self.failUnless(array(loaded_dict['holes'])  ==
     182                        array(dict['holes']),
     183                         'test_import_mesh failed. Test 6')
     184   
     185        self.failUnless(array(dict['vertices'])  ==
     186                        array(loaded_dict['vertices']),
     187                         'test_export_triangulation_file failed. Test 1')
     188        self.failUnless(array(dict['triangles'])  ==
     189                        array(loaded_dict['triangles']),
     190                         'test_export_triangulation_file failed. Test 2')
     191        self.failUnless(array(dict['segments'])  ==
     192                        array(loaded_dict['segments']),
     193                         'test_export_triangulation_file failed. Test 3')
     194        self.failUnless(array(dict['triangle_tags'])  ==
     195                        array(loaded_dict['triangle_tags']),
     196                         'test_export_triangulation_file failed. Test 4')
     197       
     198        self.failUnless(dict['vertex_attributes']  ==
     199                        loaded_dict['vertex_attributes'],
     200                         'test_export_triangulation_file failed. Test 5')
     201        self.failUnless(array(dict['triangle_neighbors'])  ==
     202                        array(loaded_dict['triangle_neighbors']),
     203                         'test_export_triangulation_file failed. Test 6')
     204        self.failUnless(array(dict['segment_tags'])  ==
     205                        array(loaded_dict['segment_tags']),
     206                         'test_export_triangulation_file failed. Test 7')
     207        self.failUnless(array(dict['vertex_attribute_titles'])  ==
     208                        array(loaded_dict['vertex_attribute_titles']),
     209                         'test_export_triangulation_file failed. Test 8')
     210       
    145211    def test_loadpts(self):
    146212       
Note: See TracChangeset for help on using the changeset viewer.