Ignore:
Timestamp:
Mar 28, 2009, 6:54:15 PM (15 years ago)
Author:
ole
Message:

Added volumetric balance report for boundary flows and total volume.
Flows due to forcing terms have not yet been added.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • anuga_core/source/anuga/shallow_water/shallow_water_domain.py

    r6653 r6654  
    781781       
    782782
    783     def compute_volumetric_balance(self):
    784         """Compute volumetric balance at current timestep.
     783    def compute_boundary_flows(self):
     784        """Compute boundary flows at current timestep.
    785785                       
    786786        Quantities computed are:
    787787           Total inflow across boundary
    788788           Total outflow across boundary
    789            Total inflow through forcing terms
    790            Total outflow through forcing terms
    791            Current total volume in domain
    792        
    793                        
     789           Flow across each tagged boundary segment
    794790        """
    795791               
     
    797793        # the normal momentum ((uh, vh) dot normal) times segment length.
    798794        # Based on sign accumulate this into boundary_inflow and boundary_outflow.
     795                       
     796        # Compute flows along boundary
     797       
     798        uh = self.get_quantity('xmomentum').get_values(location='edges')
     799        vh = self.get_quantity('ymomentum').get_values(location='edges')       
     800       
     801        # Loop through edges that lie on the boundary and calculate
     802        # flows
     803        boundary_flows = {}
     804        total_boundary_inflow = 0.0
     805        total_boundary_outflow = 0.0
     806        for vol_id, edge_id in self.boundary:
     807            # Compute normal flow across edge. Since normal vector points
     808            # away from triangle, a positive sign means that water
     809            # flows *out* from this triangle.
     810             
     811            momentum = [uh[vol_id, edge_id], vh[vol_id, edge_id]]
     812            normal = self.mesh.get_normal(vol_id, edge_id)
     813            length = self.mesh.get_edgelength(vol_id, edge_id)           
     814            normal_flow = num.dot(momentum, normal)*length
     815           
     816            # Reverse sign so that + is taken to mean inflow
     817            # and - means outflow. This is more intuitive.
     818            edge_flow = -normal_flow
     819           
     820            # Tally up inflows and outflows separately
     821            if edge_flow > 0:
     822                # Flow is inflow     
     823                total_boundary_inflow += edge_flow                                 
     824            else:
     825                # Flow is outflow
     826                total_boundary_outflow += edge_flow   
     827
     828            # Tally up flows by boundary tag
     829            tag = self.boundary[(vol_id, edge_id)]
     830           
     831            if tag not in boundary_flows:
     832                boundary_flows[tag] = 0.0
     833            boundary_flows[tag] += edge_flow
     834           
     835               
     836        return boundary_flows, total_boundary_inflow, total_boundary_outflow
     837       
     838
     839    def compute_forcing_flows(self):
     840        """Compute flows in and out of domain due to forcing terms.
     841                       
     842        Quantities computed are:
     843               
     844       
     845           Total inflow through forcing terms
     846           Total outflow through forcing terms
     847           Current total volume in domain       
     848
     849        """
     850
     851        #FIXME(Ole): We need to separate what part of explicit_update was
     852        # due to the normal flux calculations and what is due to forcing terms.
     853       
     854        pass
     855                       
     856       
     857    def compute_total_volume(self):
     858        """Compute total volume (m^3) of water in entire domain
     859        """
     860       
     861        area = self.mesh.get_areas()
     862        volume = 0.0
     863       
     864        stage = self.get_quantity('stage').get_values(location='centroids')
     865        elevation = self.get_quantity('elevation').get_values(location='centroids')       
     866        depth = stage-elevation
     867       
     868        #print 'z', elevation
     869        #print 'w', stage
     870        #print 'h', depth
     871        return num.sum(depth*area)
     872       
     873       
     874    def volumetric_balance_statistics(self):               
     875        """Create volumetric balance report suitable for printing or logging.
     876        """
     877       
     878        boundary_flows, total_boundary_inflow, total_boundary_outflow = self.compute_boundary_flows()
     879       
     880        s = '---------------------------\n'       
     881        s += 'Volumetric balance report:\n'
     882        s += '--------------------------\n'
     883        s += 'Total boundary inflow [m^3/s]: %.2f\n' % total_boundary_inflow
     884        s += 'Total boundary outflow [m^3/s]: %.2f\n' % total_boundary_outflow       
     885        s += 'Net boundary flow by tags [m^3/s]\n'
     886        for tag in boundary_flows:
     887            s += '    %s [m^3/s]: %.2f\n' % (tag, boundary_flows[tag])
     888       
     889        s += 'Total net boundary flow [m^3/s]: %.2f\n' % (total_boundary_inflow + total_boundary_outflow)
     890        s += 'Total volume in domain [m^3]: %.2f\n' % self.compute_total_volume()
     891       
    799892        # The go through explicit forcing update and record the rate of change for stage and
    800893        # record into forcing_inflow and forcing_outflow. Finally compute integral
    801894        # of depth to obtain total volume of domain.
    802                        
    803                        
    804         # Compute flows along boundary
    805        
    806         uh = self.get_quantity('xmomentum').get_values()
    807         vh = self.get_quantity('ymomentum').get_values()       
    808        
    809         # Loop through edges that lie on the boundary and calculate
    810         # flows
    811         inflow = 0.0
    812         outflow = 0.0
    813         for vol_id, edge_id in self.boundary:
    814             print vol_id, edge_id, self.boundary[(vol_id, edge_id)]
    815 
    816             # Pick edge and compute normal flow
    817             print uh[vol_id, :]
    818             print vh[vol_id, :]           
    819          
    820        
    821        
    822                
     895       
     896        # FIXME(Ole): This part is not yet done.               
     897       
     898        return s       
     899           
     900           
     901           
     902           
    823903               
    824904#=============== End of class Shallow Water Domain ===============================
Note: See TracChangeset for help on using the changeset viewer.