Changeset 1266


Ignore:
Timestamp:
May 2, 2005, 12:02:12 AM (20 years ago)
Author:
steve
Message:

Played with weave to convert update of new visualisation code.

Location:
inundation/ga/storm_surge
Files:
2 added
4 edited

Legend:

Unmodified
Added
Removed
  • inundation/ga/storm_surge/pyvolution/netherlands.py

    r991 r1266  
    77
    88######################
    9 # Module imports 
     9# Module imports
    1010#
    1111from shallow_water import Domain, Reflective_boundary, Dirichlet_boundary,\
     
    1414from mesh_factory import rectangular
    1515from Numeric import array
    16    
     16
    1717
    1818class Weir:
     
    2020    x,y are assumed to be in the unit square
    2121    """
    22    
     22
    2323    def __init__(self, stage):
    2424        self.inflow_stage = stage
    2525
    26     def __call__(self, x, y):   
    27         from Numeric import zeros, Float 
    28    
     26    def __call__(self, x, y):
     27        from Numeric import zeros, Float
     28
    2929        N = len(x)
    30         assert N == len(y)   
     30        assert N == len(y)
    3131
    3232        z = zeros(N, Float)
     
    3838                #z[i] = -x[i]/5
    3939                z[i] = -x[i]/20
    40                
    41            
     40
     41
    4242            #Weir
    4343            if x[i] > 0.3 and x[i] < 0.4:
     
    5353                #z[i] = -x[i]/5
    5454                z[i] = -x[i]/20
    55            
     55
    5656            #Poles
    5757            #if x[i] > 0.65 and x[i] < 0.8 and y[i] > 0.55 and y[i] < 0.65 or\
     
    6565            #Wall
    6666            if x[i] > 0.995:
    67                 z[i] = -x[i]/20+0.3               
     67                z[i] = -x[i]/20+0.3
    6868
    6969        return z/2
    70        
    71    
    72    
     70
     71
     72
    7373######################
    7474# Domain
     
    7979N = 130 #size = 33800
    8080N = 600 #Size = 720000
    81 N = 30
     81N = 50
    8282
    8383#N = 15
     
    8989#Create shallow water domain
    9090domain = Domain(points, vertices, boundary)
    91    
     91
    9292domain.check_integrity()
    9393domain.default_order = 2
     
    101101
    102102
    103 if N > 40:
     103if N > 150:
    104104    domain.visualise = False
    105105    domain.checkpoint = False
     
    113113    domain.visualise = True
    114114    domain.checkpoint = False
    115     domain.store = False   
     115    domain.store = False
    116116
    117    
     117
    118118#Set bed-slope and friction
    119 inflow_stage = 0.08
     119inflow_stage = 0.1
    120120manning = 0.02
    121121Z = Weir(inflow_stage)
     
    139139#Set boundary conditions
    140140domain.set_boundary({'left': Bd, 'right': Br, 'bottom': Br, 'top': Br})
    141                  
     141
    142142
    143143######################
     
    151151t0 = time.time()
    152152
    153 for t in domain.evolve(yieldstep = 0.1, finaltime = 7.0):
     153for t in domain.evolve(yieldstep = 0.005, finaltime = 10.0):
    154154    domain.write_time()
    155    
    156 print 'That took %.2f seconds' %(time.time()-t0)   
    157    
     155
     156
     157print 'That took %.2f seconds' %(time.time()-t0)
  • inundation/ga/storm_surge/pyvolution/realtime_visualisation_new.py

    r1265 r1266  
    22
    33class Surface:
    4     def __init__(self,domain,scale=1.0/1.0):
     4    def __init__(self,domain,scale_z=1.0):
    55        """Create visualisation of domain
    66        """
     
    1010        self.stage_model = faces(frame=self.frame)
    1111        self.domain = domain
    12         self.scale  = scale
     12        self.scale_z  = scale_z
    1313
    1414        self.vertices = domain.vertex_coordinates
     
    2929        self.range_bed = self.max_bed - self.min_bed
    3030
    31         print self.max_x, self.min_x, self.max_y, self.min_y, self.min_bed
    32         print self.max_bed, self.range_x, self.range_y, self.range_xy, self.range_bed
    33 
    34         print 'Calculating triangles'
     31        #print self.max_x, self.min_x, self.max_y, self.min_y,
     32        #self.min_bed print self.max_bed, self.range_x, self.range_y,
     33        #self.range_xy, self.range_bed
     34        #print 'Calculating triangles'
    3535
    3636        self.pos     = zeros( (6*len(domain),3), Float)
     
    3838        self.normals = zeros( (6*len(domain),3), Float)
    3939
    40         print 'keys',self.domain.quantities.keys()
    41         print 'shape of stage',shape(self.stage)
     40        #print 'keys',self.domain.quantities.keys()
     41        #print 'shape of stage',shape(self.stage)
    4242
    4343        self.update_all()
     
    5050    def update_bed(self):
    5151
    52         print 'update bed arrays'
     52        #print 'update bed arrays'
    5353        c0 = 0.3
    5454        c1 = 0.3
    5555        c2 = 0.3
    5656        self.update_arrays(self.bed,  (c0,c1,c2) )
    57         print 'update bed image'
     57
     58        #print 'update bed image'
    5859        self.bed_model.pos    = self.pos
    5960        self.bed_model.color  = self.colour
     
    6566        c1 = 0.4
    6667        c2 = 0.99
    67         print 'update stage arrays'
     68        #print 'update stage arrays'
    6869        self.update_arrays(self.stage, (c0,c1,c2) )
    69         print 'update stage image'
     70        #print 'update stage image'
    7071        self.stage_model.pos    = self.pos
    7172        self.stage_model.color  = self.colour
    7273        self.stage_model.normal = self.normals
    7374
    74     def calc_normal(self,v):
    75 
    76         from math import sqrt
    77 
    78         cross = zeros(3,Float)
    79         normal = zeros(3,Float)
     75
     76
     77    def update_arrays(self,quantity,qcolor):
     78
     79        col = asarray(qcolor)
     80
     81        N = len(self.domain)
     82
     83        scale_z = self.scale_z
     84        min_x = self.min_x
     85        min_y = self.min_y
     86        range_xy = self.range_xy
     87
     88        vertices = self.vertices
     89        pos      = self.pos
     90        normals  = self.normals
     91        colour   = self.colour
     92
     93        try:
     94            update_arrays_weave(vertices,quantity,col,pos,normals,colour,N,min_x,min_y,range_xy,scale_z)
     95        except:
     96            update_arrays_python(vertices,quantity,col,pos,normals,colour,N,min_x,min_y,range_xy,scale_z)
     97
     98
     99
     100def  update_arrays_python(vertices,quantity,col,pos,normals,colour,N,min_x,min_y,range_xy,scale_z):
     101
     102    from math import sqrt
     103    normal = zeros( 3, Float)
     104    v = zeros( (3,3), Float)
     105    s = 1.0
     106
     107    for i in range( N ):
     108
     109        for j in range(3):
     110            v[j,0] = (vertices[i,2*j  ]-min_x)/range_xy
     111            v[j,1] = (vertices[i,2*j+1]-min_y)/range_xy
     112            v[j,2] = quantity[i,j]*scale_z
    80113
    81114        v10 = v[1,:]-v[0,:]
     
    92125        normal[2] = normal[2]/norm
    93126
    94         return normal
    95 
    96 
    97 
    98     def update_arrays(self, quantity, qcolor):
    99 
    100         col = asarray(qcolor)
    101         v = zeros( (3,3), Float)
    102         normal = zeros( 3, Float)
    103         N = len(self.domain)
    104         scale = self.scale
    105 
    106 
    107 
    108         for i in range( N ):
    109 
    110             for j in range(3):
    111                 v[j,0] = 2.0*(self.vertices[i,2*j  ]-self.min_x)/self.range_xy-1.0
    112                 v[j,1] = 2.0*(self.vertices[i,2*j+1]-self.min_y)/self.range_xy-1.0
    113                 v[j,2] = quantity[i,j]*scale
    114 
    115 
    116 
    117             normal = self.calc_normal(v)
    118 
    119             self.pos[6*i  ,:] = v[0,:]
    120             self.pos[6*i+1,:] = v[1,:]
    121             self.pos[6*i+2,:] = v[2,:]
    122             self.pos[6*i+3,:] = v[0,:]
    123             self.pos[6*i+4,:] = v[2,:]
    124             self.pos[6*i+5,:] = v[1,:]
    125 
    126 
    127 
    128             self.colour[6*i  ,:] = col
    129             self.colour[6*i+1,:] = col
    130             self.colour[6*i+2,:] = col
    131             self.colour[6*i+3,:] = col
    132             self.colour[6*i+4,:] = col
    133             self.colour[6*i+5,:] = col
    134 
    135             self.normals[6*i  ,:] = normal
    136             self.normals[6*i+1,:] = normal
    137             self.normals[6*i+2,:] = normal
    138             self.normals[6*i+3,:] = -normal
    139             self.normals[6*i+4,:] = -normal
    140             self.normals[6*i+5,:] = -normal
    141 
    142 
    143 
    144 
    145 #scene.width = 1000
    146 #scene.height = 800
     127        pos[6*i  ,:] = v[0,:]
     128        pos[6*i+1,:] = v[1,:]
     129        pos[6*i+2,:] = v[2,:]
     130        pos[6*i+3,:] = v[0,:]
     131        pos[6*i+4,:] = v[2,:]
     132        pos[6*i+5,:] = v[1,:]
     133
     134
     135
     136        colour[6*i  ,:] = s*col
     137        colour[6*i+1,:] = s*col
     138        colour[6*i+2,:] = s*col
     139        colour[6*i+3,:] = s*col
     140        colour[6*i+4,:] = s*col
     141        colour[6*i+5,:] = s*col
     142
     143        s =  15.0/8.0 - s
     144
     145        normals[6*i  ,:] = normal
     146        normals[6*i+1,:] = normal
     147        normals[6*i+2,:] = normal
     148        normals[6*i+3,:] = -normal
     149        normals[6*i+4,:] = -normal
     150        normals[6*i+5,:] = -normal
     151
     152
     153
     154def  update_arrays_weave(vertices,quantity,col,pos,normals,colour,N,min_x,min_y,range_xy,scale_z):
     155
     156    import weave
     157    from weave import converters
     158
     159    from math import sqrt
     160    normal = zeros( 3, Float)
     161    v = zeros( (3,3), Float)
     162    v10 = zeros( 3, Float)
     163    v20 = zeros( 3, Float)
     164
     165    code1 = """
     166        double s = 1.0;
     167
     168        for (int i=0; i<N ; i++ ) {
     169            for (int j=0; j<3 ; j++) {
     170                v(j,0) = (vertices(i,2*j  )-min_x)/range_xy;
     171                v(j,1) = (vertices(i,2*j+1)-min_y)/range_xy;
     172                v(j,2) = quantity(i,j)*scale_z;
     173            }
     174
     175
     176            for (int j=0; j<3; j++) {
     177                v10(j) = v(1,j)-v(0,j);
     178                v20(j) = v(2,j)-v(0,j);
     179            }
     180
     181            normal(0) = v10(1)*v20(2) - v20(1)*v10(2);
     182            normal(1) = v10(2)*v20(0) - v20(2)*v10(0);
     183            normal(2) = v10(0)*v20(1) - v20(0)*v10(1);
     184
     185            double norm =  sqrt(normal(0)*normal(0) + normal(1)*normal(1) + normal(2)*normal(2));
     186
     187            normal(0) = normal(0)/norm;
     188            normal(1) = normal(1)/norm;
     189            normal(2) = normal(2)/norm;
     190
     191            for (int j=0; j<3; j++) {
     192                pos(6*i  ,j) = v(0,j);
     193                pos(6*i+1,j) = v(1,j);
     194                pos(6*i+2,j) = v(2,j);
     195                pos(6*i+3,j) = v(0,j);
     196                pos(6*i+4,j) = v(2,j);
     197                pos(6*i+5,j) = v(1,j);
     198
     199                colour(6*i  ,j) = s*col(j);
     200                colour(6*i+1,j) = s*col(j);
     201                colour(6*i+2,j) = s*col(j);
     202                colour(6*i+3,j) = s*col(j);
     203                colour(6*i+4,j) = s*col(j);
     204                colour(6*i+5,j) = s*col(j);
     205
     206                normals(6*i  ,j) = normal(j);
     207                normals(6*i+1,j) = normal(j);
     208                normals(6*i+2,j) = normal(j);
     209                normals(6*i+3,j) = -normal(j);
     210                normals(6*i+4,j) = -normal(j);
     211                normals(6*i+5,j) = -normal(j);
     212                }
     213
     214            s =  15.0/8.0 - s;
     215        }
     216        """
     217
     218    weave.inline(code1, ['vertices','quantity','col','pos','normals','colour','N',
     219                         'min_x','min_y','range_xy','scale_z','v','normal','v10','v20'],
     220                 type_converters = converters.blitz, compiler='gcc');
     221
     222
     223scene.width = 1000
     224scene.height = 800
    147225
    148226#Original
    149 #scene.center = (0.5,0.5,0)
    150 #scene.forward = vector(-0.1, 0.5, -0.5)
     227scene.center = (0.5,0.5,0)
     228scene.forward = vector(-0.1, 0.5, -0.5)
    151229
    152230#Temporary (for bedslope)
     
    161239
    162240
    163 #scene.ambient = 0.4
     241scene.ambient = 0.4
    164242#scene.lights = [(0.6, 0.3, 0.2), (0.1, -0.5, 0.4), (-0.1, 0.1, -0.4),
    165243#               (-0.2, 0.2, 0.1)]
    166244
     245scene.lights = [(0.6, 0.3, 0.2), (0.1, -0.5, 0.4)]
     246
     247
    167248
    168249def create_surface(domain):
     
    173254def update(domain):
    174255
     256    #print 'start visual update'
    175257    surface = domain.surface
    176258    surface.update_stage()
    177 
    178 
    179 
     259    #print 'end visual update'
     260
  • inundation/ga/storm_surge/zeus/anuga-workspace.zwi

    r1231 r1266  
    22<workspace name="anuga-workspace">
    33    <mode>Debug</mode>
    4     <active>steve</active>
     4    <active>pyvolution</active>
    55    <project name="pyvolution">pyvolution.zpi</project>
    66    <project name="steve">steve.zpi</project>
Note: See TracChangeset for help on using the changeset viewer.