source: trunk/anuga_core/anuga/parallel/parallel_inlet_enquiry.py @ 9679

Last change on this file since 9679 was 8875, checked in by steve, 12 years ago

Setting up parallel_structure to allow enquiry of data

File size: 7.4 KB
Line 
1from anuga.geometry.polygon import inside_polygon, is_inside_polygon, line_intersect
2from anuga.config import velocity_protection, g
3import math
4
5import numpy as num
6
7import parallel_inlet
8
9class Parallel_Inlet_enquiry(parallel_inlet.Parallel_Inlet):
10    """Contains information associated with each inlet plus an enquiry point
11    """
12
13    """
14    master_proc - index of the processor which coordinates all processors
15    associated with this inlet operator.
16    procs - list of all processors associated with this inlet operator
17    enquiry_proc - processor containing inlet enquiry point
18    """
19
20    def __init__(self, domain, polyline, enquiry_pt,
21                 invert_elevation = None,
22                 outward_culvert_vector=None,
23                 master_proc = 0,
24                 procs = None,
25                 enquiry_proc = -1,
26                 verbose=False):
27
28   
29        parallel_inlet.Parallel_Inlet.__init__(self, domain, polyline,
30                                                master_proc = master_proc, procs = procs, verbose=verbose)
31
32        import pypar
33
34        self.enquiry_pt = enquiry_pt
35        self.invert_elevation = invert_elevation
36        self.outward_culvert_vector = outward_culvert_vector
37        self.master_proc = master_proc
38
39        if procs is None:
40            self.procs = [self.master_proc]
41        else:
42            self.procs = procs
43
44        self.enquiry_proc = enquiry_proc # Processor of domain containing enquiry point
45        self.compute_enquiry_index()
46
47
48    def compute_enquiry_index(self):
49
50        # Get boundary (in absolute coordinates)
51        vertex_coordinates = self.domain.get_full_vertex_coordinates(absolute=True)
52
53        point = self.enquiry_pt
54        has_enq_point = False
55
56        try:
57            k = self.domain.get_triangle_containing_point(point)
58               
59            if self.domain.tri_full_flag[k] == 1:
60                has_enq_point = True
61            else:
62                has_enq_point = False
63        except:
64            has_enq_point = False
65
66        if has_enq_point:
67            self.enquiry_index = self.domain.get_triangle_containing_point(self.enquiry_pt)
68   
69            if self.enquiry_index in self.triangle_indices:
70                msg = 'Enquiry point %s' % (self.enquiry_pt)
71                msg += 'is in an inlet triangle'
72                import warnings
73                warnings.warn(msg)
74
75
76            if self.enquiry_proc >= 0: 
77                assert self.enquiry_proc == self.myid, "Specified enquiry proc does not match actual enquiry proc"
78            self.enquiry_proc = self.myid
79            assert self.enquiry_index >= 0, "Enquiry point inside polygon, but no triangle index found"
80        else:
81            self.enquiry_index = -1
82
83
84    def get_enquiry_position(self):
85        # WARNING: Must be called by processor containing inlet enquiry point to have effect
86
87        if self.enquiry_index >= 0:
88            return self.domain.get_centroid_coordinates(absolute=True)[self.enquiry_index]
89        else:
90            return None
91
92    def get_enquiry_stage(self):
93        # WARNING: Must be called by processor containing inlet enquiry point to have effect
94
95        if self.enquiry_index >= 0:
96            return self.domain.quantities['stage'].centroid_values[self.enquiry_index]
97        else:
98            return None
99
100        return None
101
102    def get_enquiry_xmom(self):
103        # WARNING: Must be called by processor containing inlet enquiry point to have effect
104
105        if self.enquiry_index >= 0:
106            return self.domain.quantities['xmomentum'].centroid_values[self.enquiry_index]
107        else:
108            return None
109
110    def get_enquiry_ymom(self):
111        # WARNING: Must be called by processor containing inlet enquiry point to have effect
112
113        if self.enquiry_index >= 0:
114            return self.domain.quantities['ymomentum'].centroid_values[self.enquiry_index]
115        else:
116            return None
117
118    def get_enquiry_elevation(self):
119        # WARNING: Must be called by processor containing inlet enquiry point to have effect
120
121        if self.enquiry_index >= 0:
122            return self.domain.quantities['elevation'].centroid_values[self.enquiry_index]
123        else:
124            return None
125
126
127    def get_enquiry_depth(self):
128        # WARNING: Must be called by processor containing inlet enquiry point to have effect
129
130        if self.enquiry_index >= 0:
131            return max(self.get_enquiry_stage() - self.get_enquiry_invert_elevation(), 0.0)
132        else:
133            return None
134
135    def get_enquiry_water_depth(self):
136        # WARNING: Must be called by processor containing inlet enquiry point to have effect
137
138        if self.enquiry_index >= 0:
139            return self.get_enquiry_stage() - self.get_enquiry_elevation()
140        else:
141            return None
142
143    def get_enquiry_invert_elevation(self):
144        # WARNING: Must be called by processor containing inlet enquiry point to have effect
145
146        if self.enquiry_index >= 0:
147            if  self.invert_elevation is None:
148                return self.get_enquiry_elevation()
149            else:
150                return self.invert_elevation
151        else:
152            return None
153
154    def get_enquiry_velocity(self):
155        # WARNING: Must be called by processor containing inlet enquiry point to have effect
156
157        if self.enquiry_index >= 0:
158            depth = self.get_enquiry_water_depth()
159            u = depth*self.get_enquiry_xmom()/(depth**2 + velocity_protection)
160            v = depth*self.get_enquiry_ymom()/(depth**2 + velocity_protection)
161
162            return u, v
163        else:
164            return None
165
166
167    def get_enquiry_xvelocity(self):
168        # WARNING: Must be called by processor containing inlet enquiry point to have effect
169
170        if self.enquiry_index >= 0:
171            depth = self.get_enquiry_water_depth()
172            return depth*self.get_enquiry_xmom()/(depth**2 + velocity_protection)
173        else:
174            return None
175
176    def get_enquiry_yvelocity(self):
177        # WARNING: Must be called by processor containing inlet enquiry point to have effect
178
179        if self.enquiry_index >= 0:
180            depth = self.get_enquiry_water_depth()
181            return depth*self.get_enquiry_ymom()/(depth**2 + velocity_protection)
182        else:
183            return None
184
185    def get_enquiry_speed(self):
186        # WARNING: Must be called by processor containing inlet enquiry point to have effect
187
188        if self.enquiry_index >= 0:
189            u, v = self.get_enquiry_velocity()
190
191            return math.sqrt(u**2 + v**2)
192        else:
193            return None
194
195
196    def get_enquiry_velocity_head(self):
197        # WARNING: Must be called by processor containing inlet enquiry point to have effect
198
199        if self.enquiry_index >= 0:
200            return 0.5*self.get_enquiry_speed()**2/g
201        else:
202            return None
203
204
205    def get_enquiry_total_energy(self):
206        # WARNING: Must be called by processor containing inlet enquiry point to have effect
207
208        if self.enquiry_index >= 0:
209            return self.get_enquiry_velocity_head() + self.get_enquiry_stage()
210        else:
211            return None
212
213
214    def get_enquiry_specific_energy(self):
215        # WARNING: Must be called by processor containing inlet enquiry point to have effect
216
217        if self.enquiry_index >= 0:
218            return self.get_enquiry_velocity_head() + self.get_enquiry_depth()
219        else:
220            return None
221
222
223    def get_master_proc(self):
224        return self.master_proc
225
226
227    def get_enquiry_proc(self):
228        return self.enquiry_proc
Note: See TracBrowser for help on using the repository browser.