Changeset 1500
- Timestamp:
- Jun 6, 2005, 9:39:01 AM (19 years ago)
- Location:
- inundation/ga/storm_surge/parallel
- Files:
-
- 9 added
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
inundation/ga/storm_surge/parallel/demo.py
r1363 r1500 20 20 # mpirun -np 4 demo.py 21 21 22 23 22 import pypar # The Python-MPI interface 24 25 23 numproc = pypar.size() 26 24 myid = pypar.rank() -
inundation/ga/storm_surge/parallel/linda_dummy.py
r1409 r1500 1 #mpirun -np 4 /usr/bin/python linda_dummy.py 2 3 1 4 import sys 2 5 from os import sep 3 6 sys.path.append('..'+sep+'pyvolution') 4 7 from mg2ga import * 8 from build_submesh import * 9 from build_local import * 10 import pypar 11 5 12 # open file 6 f=open('test_3l_ 2cc.out', 'r')13 f=open('test_3l_1c.out', 'r') 7 14 print f 8 15 # read in nodes and triangles 9 [nodes, triangles, triangles_per_proc] = mg2ga(f)16 [nodes, triangles, boundary, triangles_per_proc] = mg2ga(f) 10 17 f.close 11 18 # find whole mesh on host 12 19 mesh = Mesh(nodes, triangles) 20 21 submesh_struc = submesh_full(nodes, triangles, boundary, triangles_per_proc) 22 submesh_struc2 = submesh_ghost(submesh_struc, mesh, triangles_per_proc) 23 24 # this will eventually be done on the processors 25 submesh_cell = {} 26 lower_t = 0 27 for p in range(len(triangles_per_proc)): 28 submesh_cell["full_nodes"] = []; 29 for n in submesh_struc2["full_nodes"][p]: 30 submesh_cell["full_nodes"].append(n) 31 submesh_cell["ghost_nodes"] = [] 32 for n in submesh_struc2["ghost_nodes"][p]: 33 submesh_cell["ghost_nodes"].append(n) 34 submesh_cell["full_triangles"] = [] 35 for t in submesh_struc2["full_triangles"][p]: 36 submesh_cell["full_triangles"].append(t) 37 submesh_cell["ghost_triangles"] = [] 38 for t in submesh_struc2["ghost_triangles"][p]: 39 submesh_cell["ghost_triangles"].append(t) 40 submesh_cell["full_commun"] = submesh_struc2["full_commun"][p] 41 submesh_cell["ghost_commun"] = submesh_struc2["ghost_commun"][p] 42 submesh_cell["full_boundary"] = submesh_struc2["full_boundary"][p] 43 upper_t = lower_t + triangles_per_proc[p] 44 [GAnodes, GAtriangle, boundary, ghost_rec, full_send] = build_local_mesh(submesh_cell, lower_t, upper_t, len(triangles_per_proc)) 45 lower_t = upper_t 46 47 13 48 # find sub domains (i.e. full triangles) 14 49 submesh = [] 15 tlower = 0 16 nproc = len(triangles_per_proc) 17 nnodes = len(nodes) 18 # loop over processors 19 for p in range(nproc): 20 # find triangles on processor p 21 tupper = triangles_per_proc[p]+tlower 22 subtriangles = triangles[tlower:tupper] 23 # find nodes in processor p 24 nodemap = map(lambda n: 0, nodes) 25 for t in subtriangles: 26 nodemap[t[0]]=1 27 nodemap[t[1]]=1 28 nodemap[t[2]]=1 29 subnodes = [] 30 for i in range(nnodes): 31 if nodemap[i] == 1: 32 subnodes.append([i,nodes[i][0],nodes[i][1]]) 33 # renumber nodes (have to change to store local/global map) 34 [GAnodes, GAtriangles] = restructure(subnodes, subtriangles) 35 # build GA data structure (maybe not needed, maybe can just remember 36 # GAnodes, GAtriangles and build mesh on processors) 37 submesh.append(Mesh(GAnodes, GAtriangles)) 38 tlower = tupper 50 for p in range(len(triangles_per_proc)): 51 print p 52 nodes = submesh_struc["full_nodes"][p] 53 triangles = submesh_struc["full_triangles"][p] 54 edges = [] 55 [GAnodes, GAtriangles, GAedges] = restructure(nodes, triangles, edges) 56 submesh.append(Mesh(GAnodes,GAtriangles)) 57 39 58 # check results 40 59 #write a data file for use by scilab script … … 59 78 string='Error: Triangle '+repr(t)+' on processor '+repr(p)+' is oriented clockwise or degenerate' 60 79 print(string) 61 fp.close ()80 fp.close 62 81 #END160505 VISUALISE MESH IN SCILAB 63 82 mesh -
inundation/ga/storm_surge/parallel/mg2ga.py
r1460 r1500 1 ######################################################### 2 # 3 # 4 # Read in a data file stored in the mg_cell data format. 5 # 6 # mg_cell is a code written by Linda Stals for parallel 7 # mulitgrid solver based on adaptive finite elements. The 8 # reason this code is used is because it gives a grid 9 # partition. 10 # 11 # This is only intended as a temporary file, once an 12 # automatic grid partitioner has been incorporated this 13 # file will become redundant. 14 # 15 # Authors: Linda Stals and Matthew Hardy, June 2005 16 # 17 # 18 ######################################################### 19 1 20 from string import atoi 2 3 21 from string import atof 4 5 22 from string import split 6 23 7 24 8 9 10 11 from general_mesh import General_mesh as Mesh 12 13 from Numeric import shape 14 15 16 17 ################################################################################## 18 19 # Read in a data file stored in the mg_cell data format 20 21 ################################################################################## 22 23 24 25 26 25 ######################################################### 26 # Read in a mg_cell file. It is assumed that the file 27 # has a very specific format. An example file is given in 28 # test_3l_2c.out. 29 # 30 # *) The mg_cell data-structure is a node-based 31 # data-structure, consequently the same triangle will 32 # appear three times (mg_cell outputs all of the triangles 33 # connected to a given node). 34 # 35 # *) The node labels are given in terms of the global ID, 36 # which may be thought of as a string (e.g. 12_2), this 37 # needs to be converted into an integer format for the GA 38 # data structure. 39 # 40 # *) It is necessary to specify the boundary conditions, 41 # which has been done in mg_cel by outputing the edges 42 # with a tag. If the tag is negative the edge is an 43 # interior edge, if the tag is positive it is a boundary 44 # edge. Different boundary conditions will be given 45 # different tags. 46 # 47 # ------------------------------------------------------- 48 # 49 # *) The information returned by this routine is the 50 # nodes, triangles, boundary edges and the number of 51 # triangles to be assigned to each processor. All of the 52 # node labels are still stored by the global ID. 53 # 54 ######################################################### 27 55 def readmg(f): 28 56 29 30 31 57 # read the nuber of processors 32 58 33 34 35 59 f.readline() 36 37 60 no_proc = atoi(f.readline().split()[0]) 38 61 39 print no_proc 40 41 42 62 # skip over additional information not needed 63 43 64 for i in range(5): 44 45 65 f.readline(); 46 66 47 48 49 67 # nodes list 50 68 51 52 53 69 nodes = [] 54 70 55 71 # boundary edge list 72 73 edges = [] 56 74 57 75 # triangle list 58 76 59 60 61 77 triangles = [] 62 78 63 64 65 79 # know first nodes_per_proc[0] belong to cell 0, next 66 67 80 # nodes_per_proc[1] belong to cell 1 etc. 68 81 69 70 71 82 nodes_per_proc = [] 72 73 83 triangles_per_proc = [] 74 84 75 76 77 85 # loop over the processors 78 86 79 80 81 87 for q in range(no_proc): 82 83 84 85 print q 86 87 88 88 89 89 # read the nodes 90 90 91 92 93 91 no_nodes = atoi(f.readline().split()[1]) 94 95 print no_nodes96 97 92 nodes_per_proc.append(no_nodes) 98 99 f.readline() 100 101 93 f.readline() 102 94 103 95 for i in range(no_nodes): 104 105 96 line = f.readline().split() 106 107 97 line[1:3] = map(atof, line[1:3]) 108 109 98 nodes.append(line[0:3]) 110 99 111 112 100 # read the edges 101 102 f.readline() 103 no_edges = atoi(f.readline().split()[1]) 104 f.readline() 105 106 for i in range(no_edges): 107 line = f.readline().split() 108 if (atoi(line[2]) >= 0): 109 edges.append(line) 110 113 111 # read the triangles 114 112 115 116 117 f.readline() 118 113 f.readline(), f.readline(), f.readline() 119 114 no_triangles = atoi(f.readline().split()[1]) 120 121 print no_triangles 122 123 f.readline() 124 125 126 127 128 115 f.readline() 116 117 # remove any triangles that have been repeated 118 129 119 for i in range(no_triangles): 130 131 120 line = f.readline().split() 132 133 # triangles.append(line) 134 135 136 137 line.sort() #for easy comparison with triangles listed so far 138 139 if (i==0):#always list the first triangle. This ensures that loop over t below is never empty 140 121 line.sort() 122 if (len(triangles)==0): 141 123 triangles.append(line) 142 143 124 continue 144 145 146 147 for t in range(len(triangles)): #for all the (non-duplicated) triangles we've seen so far 148 149 if (triangles[t]==line): #check to see if any of them match the triangle just read 150 125 126 for t in range(len(triangles)): 127 if (triangles[t]==line): 151 128 break 152 153 if (triangles[t]!=line): #need to add line to list 154 129 if (triangles[t]!=line): 155 130 triangles.append(line) 156 131 157 158 132 # keep a record of how many triangles belong to each processor 133 159 134 no_triangles=len(triangles)-sum(triangles_per_proc) 160 161 135 triangles_per_proc.append(no_triangles) 162 136 163 164 165 166 167 137 # skip extra space 168 169 170 171 f.readline() 172 173 f.readline() 174 175 f.readline() 176 177 a = f.readline() 178 179 print a 180 181 182 183 return nodes, triangles, triangles_per_proc 184 185 186 187 ################################################################################## 188 189 # Convert the format of the data to that used by pyvolution 190 191 ################################################################################## 192 193 194 195 #Now renumber the nodes as 0,1,2,... and make the corresponding changes to the triangle definitions, 196 197 #changing the orientation if necessary. 198 199 200 201 def restructure(nodes, triangles): 202 138 139 f.readline() 140 f.readline() 141 f.readline() 142 f.readline() 143 144 # return the nodes, triangles, boundary edges and the number of triangles 145 # to be assigned to each processor 146 147 return nodes, triangles, edges, triangles_per_proc 148 149 150 ######################################################### 151 # Convert the format of the data to that used by 152 # pyvolution 153 # 154 # 155 # *) Change the nodes global ID's to an integer value, 156 #starting from 0. 157 # 158 # *) The triangles and boundary edges must also be 159 # updated accordingly. 160 # 161 # ------------------------------------------------------- 162 # 163 # *) The nodes, triangles and boundary edges defined by 164 # the new numbering scheme are returned 165 # 166 ######################################################### 167 168 def restructure(nodes, triangles, edges): 203 169 Nnodes =len(nodes) 204 205 170 Ntriangles = len(triangles) 206 207 208 171 209 172 index={} #a dictionary mapping existing node ids to the new ids 0,1,2,... 210 173 211 212 213 174 GAnodes = [] 214 215 216 175 217 176 for node_idnew in range(Nnodes): #move through the list of nodes, renumbering to 0,1,2, ... 218 219 177 index[nodes[node_idnew][0]]=node_idnew #make the dictionary entry, for later use by triangles 220 221 178 GAnodes.append(nodes[node_idnew][1:3]) 222 223 179 # nodes[node_idnew][0]=node_idnew #renumber the node 224 180 225 226 227 228 229 230 181 GAedges = {} 182 for e in edges: 183 GAedges[index[e[0]]]=[] 184 for e in edges: 185 GAedges[index[e[0]]].append([index[e[1]],e[2]]) 186 231 187 #Now loop over the triangles, changing the node ids and orientation. 232 233 188 for t in range(Ntriangles): 234 235 189 for i in range(3): 236 237 190 n=index[triangles[t][i]] #use the dictionary to get the new node id 238 239 191 triangles[t][i]=n #relabel the node 240 192 241 242 243 244 193 245 194 del(index) #delete the dictionary 246 195 247 248 249 return GAnodes, triangles 250 251 252 253 254 255 #Now renumber the nodes as 0,1,2,... and make the corresponding changes to the triangle definitions, 256 257 #changing the orientation if necessary. 258 259 260 196 return GAnodes, triangles, GAedges 197 198 199 ######################################################### 200 # 201 # Reorientate the triangles 202 # 203 # 204 # *) The ordering of the nodes in the triangles may need 205 # be changed to ensure the correct orientation. 206 # 207 # ------------------------------------------------------- 208 # 209 # *) The modified list of triangles is returned 210 # 211 ######################################################### 261 212 def reorient(nodes, triangles): 262 263 264 265 213 266 214 267 215 Nnodes =len(nodes) 268 269 216 Ntriangles = len(triangles) 270 271 272 217 273 218 #Now loop over the triangles, changing the node ids and orientation. 274 275 219 for t in range(Ntriangles): 276 277 220 x=[] #x-coordinates of the three nodes (vertices) 278 279 221 y=[] #y-coordinates of the three nodes (vertices) 280 281 222 for i in range(3): 282 283 223 n=triangles[t][i] #use the dictionary to get the new node id 284 285 224 x.append(nodes[n][0]) 286 287 225 y.append(nodes[n][1]) 288 289 226 if ((x[1]-x[0])*(y[2]-y[0])-(x[2]-x[0])*(y[1]-y[0])<0): #need to change the orientation 290 291 227 triangles[t][2]=triangles[t][0]#swap the 0th and 2nd nodes 292 293 228 triangles[t][0]=n 294 295 296 229 297 230 del(x) 298 299 231 del(y) 300 301 302 232 303 233 return triangles 304 234 305 235 236 ######################################################### 237 # 238 # Put the boundary edge information into a form compatible 239 # with the GA datastructure 240 # 241 # *) The GA datastructure assumes that the boundary edge 242 # information is stored in a dictionary. The dictionary 243 # key is a list [ti, ei], where ti is the triangle number 244 # and ei (0 <= ei < 2) is the edge number for the triangle 245 # ti. The value assigned to the given key is the boundary 246 # tag. 247 # 248 # ------------------------------------------------------- 249 # 250 # *) The boundary edge information is returned. 251 ######################################################### 252 def mesh_boundary(triangles, edges): 253 254 # intialise the boundary dictionary 255 256 boundary = {} 257 258 # loop over all of the triangles 259 260 for i in range(len(triangles)): 261 262 # given a particular triangle 263 264 t = triangles[i] 265 266 # is the first vertex a boundary node? 267 268 if (edges.has_key(t[0])): 269 270 # check to see if the triangles has a boundary 271 # edge 272 273 for b in edges[t[0]]: 274 if (b[0] == t[1]): 275 boundary[i, 2] = b[1] 276 elif (b[0] == t[2]): 277 boundary[i, 1] = b[1] 278 279 # is the second vertex a boundary node? 280 281 if (edges.has_key(t[1])): 282 283 # check to see if the triangles has a boundary 284 # edge 285 286 for b in edges[t[1]]: 287 if (b[0] == t[0]): 288 boundary[i, 2] = b[1] 289 elif (b[0] == t[2]): 290 boundary[i, 0] = b[1] 291 292 # is the third vertex a boundary node? 293 294 if (edges.has_key(t[2])): 295 296 # check to see if the triangles has a boundary 297 # edge 298 299 for b in edges[t[2]]: 300 if (b[0] == t[0]): 301 boundary[i, 1] = b[1] 302 elif (b[0] == t[1]): 303 boundary[i, 0] = b[1] 304 305 # return the boundary information 306 307 return boundary 308 309 310 ######################################################### 311 # 312 # Read the nodes, triangles and boundary information from 313 # given file 314 # 315 # *) The information in the file is stored using the 316 # mg_cell format. 317 # 318 # *) See the documentation of the previous functions. 319 # 320 # ------------------------------------------------------- 321 # 322 # *The information returned by this routine includes the 323 # nodes, triangles, boundary edges and the number of 324 # triangles to be assigned to each processor. 325 # 326 ######################################################### 306 327 307 328 def mg2ga(f): 308 329 309 310 311 [nodes, triangles, triangles_per_proc] = readmg(f) 312 313 [nodes, triangles] = restructure(nodes, triangles) 314 330 # read in the information from the file 331 332 [nodes, triangles, edges, triangles_per_proc] = readmg(f) 333 334 # change the node numbering scheme to be compatible 335 # with the GA datastructure 336 337 [nodes, triangles, edges] = restructure(nodes, triangles, edges) 338 339 # makesure the triangles are orientated in the correct 340 # way 315 341 triangles = reorient(nodes, triangles) 316 342 317 318 319 return nodes, triangles, triangles_per_proc 320 343 # collect the boundary edge information 344 345 boundary = mesh_boundary(triangles, edges) 346 347 # return the information 348 349 return nodes, triangles, boundary, triangles_per_proc -
inundation/ga/storm_surge/parallel/parallel_advection.py
r1466 r1500 61 61 # Calculate local timestep 62 62 Advection_Domain.update_timestep(self, yieldstep, finaltime) 63 63 64 64 import time 65 65 t0 = time.time() … … 72 72 gtimestep = zeros( 1, Float) # Buffer for results 73 73 74 75 #LINDA 74 76 pypar.raw_reduce(ltimestep, gtimestep, pypar.MIN, 0) 75 77 pypar.broadcast(gtimestep,0) … … 79 81 80 82 self.communication_reduce_time += time.time()-t0 81 82 83 83 84 def update_ghosts(self): … … 98 99 import time 99 100 t0 = time.time() 100 101 101 102 102 stage_cv = self.quantities['stage'].centroid_values 103 103 104 104 # update of non-local ghost cells 105 105 for iproc in range(self.numproc): 106 107 106 if iproc == self.processor: 108 107 #Send data from iproc processor to other processors 109 108 for send_proc in self.full_send_dict: 110 109 if send_proc != iproc: 110 # LINDA: 111 # now store full as local id, global_id, value 112 111 113 Idf = self.full_send_dict[send_proc][0] 112 Xout = self.full_send_dict[send_proc][1] 114 Xout = self.full_send_dict[send_proc][2] 115 #Xout = self.full_send_dict[send_proc][1] 113 116 N = len(Xout) 114 117 115 """ 116 ============================== 118 # for i in range(N): 119 # Xout[i] = stage_cv[Idf[i]] 120 121 # pypar.send(Xout,send_proc) 122 123 # return 124 125 # """ 126 # ============================== 117 127 # Original python Code 118 128 for i in range(N): 119 129 Xout[i] = stage_cv[Idf[i]] 120 ============================== 121 """ 122 123 code1 = """ 124 for (int i=0; i<N ; i++){ 125 Xout(i) = stage_cv(Idf(i)); 126 } 127 """ 128 weave.inline(code1, ['stage_cv','Idf','Xout','N'], 129 type_converters = converters.blitz, compiler='gcc'); 130 # ============================== 131 # """ 132 133 #LINDA: 134 #could not get the code below to work, kept on complaining about error: no match for call to `(py::list) (int&)' 135 136 # code1 = """ 137 # for (int i=0; i<N ; i++){ 138 # Xout(i) = stage_cv(Idf(i)); 139 # } 140 # """ 141 # weave.inline(code1, ['stage_cv','Idf','Xout','N'], 142 # type_converters = converters.blitz, compiler='gcc'); 130 143 131 144 pypar.send(Xout,send_proc) 145 132 146 133 147 else: 134 148 #Receive data from the iproc processor 135 149 if self.ghost_recv_dict.has_key(iproc): 150 151 # LINDA: 152 # now store ghost as local id, global id, value 136 153 Idg = self.ghost_recv_dict[iproc][0] 137 X = self.ghost_recv_dict[iproc][1] 154 X = self.ghost_recv_dict[iproc][2] 155 #X = self.ghost_recv_dict[iproc][1] 138 156 139 157 X = pypar.receive(iproc,X) 140 158 N = len(X) 141 159 142 """ 143 =========================== 160 #LINDA: had problems getting C code to work 161 162 # """ 163 # =========================== 144 164 # Origin Python Code 145 165 for i in range(N): 146 166 stage_cv[Idg[i]] = X[i] 147 ===========================148 """149 150 code2 = """151 for (int i=0; i<N; i++){152 stage_cv(Idg(i)) = X(i);153 }154 """155 weave.inline(code2, ['stage_cv','Idg','X','N'],156 type_converters = converters.blitz, compiler='gcc');157 167 # =========================== 168 # """ 169 170 # code2 = """ 171 # for (int i=0; i<N; i++){ 172 # stage_cv(Idg(i)) = X(i); 173 # } 174 # """ 175 # weave.inline(code2, ['stage_cv','Idg','X','N'], 176 # type_converters = converters.blitz, compiler='gcc'); 177 158 178 #local update of ghost cells 159 179 iproc = self.processor 160 180 if self.full_send_dict.has_key(iproc): 181 182 # LINDA: 183 # now store full as local id, global id, value 161 184 Idf = self.full_send_dict[iproc][0] 162 #print Idf 163 Idg = self.ghost_recv_dict[iproc][0] 185 186 # LINDA: 187 # now store ghost as local id, global id, value 188 Idg = self.ghost_recv_dict[iproc][0] 189 164 190 N = len(Idg) 165 #print Idg166 191 167 192 """ … … 181 206 weave.inline(code3, ['stage_cv','Idg','Idf','N'], 182 207 type_converters = converters.blitz, compiler='gcc'); 183 184 208 185 209 self.communication_time += time.time()-t0 -
inundation/ga/storm_surge/parallel/test_3l_2c.out
r1460 r1500 46 46 34_2 1.0000000000 0.7500000000 0.0000000000 0.0000000000 0.0000000000 47 47 76_3 0.7500000000 0.8750000000 0.0132446401 0.0004640172 0.0000000000 48 49 0 292 50 51 14_2 37_3 -1 52 14_2 38_3 37 53 14_2 27_3 -1 54 87_3 11_0 37 55 87_3 43_2 37 56 87_3 77_3 -1 57 67_3 33_2 -1 58 67_3 34_2 -1 59 67_3 77_3 -1 60 67_3 57_3 -1 61 23_3 11_2 -1 62 23_3 12_2 -1 63 23_3 33_3 -1 64 78_3 11_0 37 65 78_3 34_2 37 66 78_3 77_3 -1 67 32_3 11_2 -1 68 32_3 21_2 -1 69 32_3 33_3 -1 70 12_2 33_3 -1 71 12_2 35_3 -1 72 12_2 34_3 -1 73 12_2 23_3 -1 74 12_2 25_3 -1 75 65_3 33_2 -1 76 65_3 32_2 -1 77 65_3 55_3 -1 78 65_3 75_3 -1 79 21_2 33_3 -1 80 21_2 53_3 -1 81 21_2 51_3 -1 82 21_2 43_3 -1 83 21_2 41_3 -1 84 21_2 32_3 -1 85 21_2 52_3 -1 86 30_2 71_3 -1 87 30_2 51_3 -1 88 30_2 70_3 37 89 30_2 50_3 37 90 30_2 61_3 -1 91 72_3 31_2 -1 92 72_3 41_2 -1 93 72_3 71_3 -1 94 72_3 73_3 -1 95 56_3 33_2 -1 96 56_3 23_2 -1 97 56_3 55_3 -1 98 56_3 57_3 -1 99 45_3 11_1 -1 100 45_3 23_2 -1 101 45_3 55_3 -1 102 45_3 35_3 -1 103 41_2 71_3 -1 104 41_2 73_3 -1 105 41_2 81_3 37 106 41_2 83_3 37 107 41_2 72_3 -1 108 77_3 11_0 -1 109 77_3 33_2 -1 110 77_3 43_2 -1 111 77_3 34_2 -1 112 77_3 87_3 -1 113 77_3 78_3 -1 114 77_3 76_3 -1 115 77_3 67_3 -1 116 70_3 10_0 37 117 70_3 30_2 37 118 70_3 71_3 -1 119 11_0 77_3 -1 120 11_0 87_3 37 121 11_0 78_3 37 122 81_3 10_0 37 123 81_3 41_2 37 124 81_3 71_3 -1 125 63_3 31_2 -1 126 63_3 32_2 -1 127 63_3 53_3 -1 128 63_3 73_3 -1 129 32_2 55_3 -1 130 32_2 53_3 -1 131 32_2 75_3 -1 132 32_2 73_3 -1 133 32_2 54_3 -1 134 32_2 74_3 -1 135 32_2 65_3 -1 136 32_2 63_3 -1 137 71_3 10_0 -1 138 71_3 31_2 -1 139 71_3 30_2 -1 140 71_3 41_2 -1 141 71_3 70_3 -1 142 71_3 81_3 -1 143 71_3 61_3 -1 144 71_3 72_3 -1 145 23_2 55_3 -1 146 23_2 35_3 -1 147 23_2 57_3 -1 148 23_2 37_3 -1 149 23_2 45_3 -1 150 23_2 47_3 -1 151 23_2 56_3 -1 152 23_2 36_3 -1 153 10_0 71_3 -1 154 10_0 70_3 37 155 10_0 81_3 37 156 61_3 31_2 -1 157 61_3 30_2 -1 158 61_3 71_3 -1 159 61_3 51_3 -1 160 55_3 11_1 -1 161 55_3 33_2 -1 162 55_3 32_2 -1 163 55_3 23_2 -1 164 55_3 54_3 -1 165 55_3 45_3 -1 166 55_3 65_3 -1 167 55_3 56_3 -1 168 54_3 11_1 -1 169 54_3 32_2 -1 170 54_3 55_3 -1 171 54_3 53_3 -1 172 11_1 33_3 -1 173 11_1 55_3 -1 174 11_1 35_3 -1 175 11_1 53_3 -1 176 11_1 34_3 -1 177 11_1 43_3 -1 178 11_1 54_3 -1 179 11_1 45_3 -1 180 34_3 11_1 -1 181 34_3 12_2 -1 182 34_3 33_3 -1 183 34_3 35_3 -1 184 53_3 11_1 -1 185 53_3 31_2 -1 186 53_3 21_2 -1 187 53_3 32_2 -1 188 53_3 43_3 -1 189 53_3 54_3 -1 190 53_3 52_3 -1 191 53_3 63_3 -1 192 27_3 13_2 -1 193 27_3 14_2 -1 194 27_3 37_3 -1 195 85_3 21_1 37 196 85_3 43_2 37 197 85_3 75_3 -1 198 43_3 11_1 -1 199 43_3 21_2 -1 200 43_3 33_3 -1 201 43_3 53_3 -1 202 21_1 75_3 -1 203 21_1 73_3 -1 204 21_1 85_3 37 205 21_1 83_3 37 206 21_1 74_3 -1 207 25_3 13_2 -1 208 25_3 12_2 -1 209 25_3 35_3 -1 210 83_3 21_1 37 211 83_3 41_2 37 212 83_3 73_3 -1 213 36_3 13_2 -1 214 36_3 23_2 -1 215 36_3 35_3 -1 216 36_3 37_3 -1 217 12_1 57_3 -1 218 12_1 37_3 -1 219 12_1 58_3 37 220 12_1 38_3 37 221 12_1 47_3 -1 222 74_3 21_1 -1 223 74_3 32_2 -1 224 74_3 75_3 -1 225 74_3 73_3 -1 226 33_3 11_1 -1 227 33_3 11_2 -1 228 33_3 12_2 -1 229 33_3 21_2 -1 230 33_3 34_3 -1 231 33_3 43_3 -1 232 33_3 23_3 -1 233 33_3 32_3 -1 234 58_3 12_1 37 235 58_3 34_2 37 236 58_3 57_3 -1 237 10_1 51_3 -1 238 10_1 50_3 37 239 10_1 41_3 -1 240 33_2 77_3 -1 241 33_2 55_3 -1 242 33_2 75_3 -1 243 33_2 57_3 -1 244 33_2 76_3 -1 245 33_2 67_3 -1 246 33_2 65_3 -1 247 33_2 56_3 -1 248 52_3 31_2 -1 249 52_3 21_2 -1 250 52_3 53_3 -1 251 52_3 51_3 -1 252 75_3 21_1 -1 253 75_3 33_2 -1 254 75_3 43_2 -1 255 75_3 32_2 -1 256 75_3 85_3 -1 257 75_3 74_3 -1 258 75_3 76_3 -1 259 75_3 65_3 -1 260 35_3 11_1 -1 261 35_3 13_2 -1 262 35_3 12_2 -1 263 35_3 23_2 -1 264 35_3 34_3 -1 265 35_3 45_3 -1 266 35_3 25_3 -1 267 35_3 36_3 -1 268 47_3 12_1 -1 269 47_3 23_2 -1 270 47_3 57_3 -1 271 47_3 37_3 -1 272 50_3 10_1 37 273 50_3 30_2 37 274 50_3 51_3 -1 275 73_3 21_1 -1 276 73_3 31_2 -1 277 73_3 41_2 -1 278 73_3 32_2 -1 279 73_3 83_3 -1 280 73_3 74_3 -1 281 73_3 72_3 -1 282 73_3 63_3 -1 283 11_2 33_3 -1 284 11_2 23_3 -1 285 11_2 32_3 -1 286 31_2 71_3 -1 287 31_2 53_3 -1 288 31_2 51_3 -1 289 31_2 73_3 -1 290 31_2 61_3 -1 291 31_2 72_3 -1 292 31_2 52_3 -1 293 31_2 63_3 -1 294 41_3 10_1 -1 295 41_3 21_2 -1 296 41_3 51_3 -1 297 57_3 12_1 -1 298 57_3 33_2 -1 299 57_3 34_2 -1 300 57_3 23_2 -1 301 57_3 58_3 -1 302 57_3 47_3 -1 303 57_3 67_3 -1 304 57_3 56_3 -1 305 13_2 35_3 -1 306 13_2 37_3 -1 307 13_2 27_3 -1 308 13_2 25_3 -1 309 13_2 36_3 -1 310 43_2 77_3 -1 311 43_2 75_3 -1 312 43_2 87_3 37 313 43_2 85_3 37 314 43_2 76_3 -1 315 51_3 10_1 -1 316 51_3 31_2 -1 317 51_3 30_2 -1 318 51_3 21_2 -1 319 51_3 50_3 -1 320 51_3 41_3 -1 321 51_3 61_3 -1 322 51_3 52_3 -1 323 34_2 77_3 -1 324 34_2 57_3 -1 325 34_2 78_3 37 326 34_2 58_3 37 327 34_2 67_3 -1 328 38_3 12_1 37 329 38_3 14_2 37 330 38_3 37_3 -1 331 76_3 33_2 -1 332 76_3 43_2 -1 333 76_3 77_3 -1 334 76_3 75_3 -1 335 37_3 12_1 -1 336 37_3 13_2 -1 337 37_3 14_2 -1 338 37_3 23_2 -1 339 37_3 38_3 -1 340 37_3 47_3 -1 341 37_3 27_3 -1 342 37_3 36_3 -1 343 344 48 345 49 346 0 182 … … 280 577 35_3 0.6250000000 0.3750000000 0.0428550839 0.0003864360 0.0000000000 281 578 10_2 0.0000000000 0.2500000000 0.0000000000 0.0000000000 0.0000000000 579 580 1 254 581 582 52_3 21_2 -1 583 52_3 31_2 -1 584 52_3 51_3 -1 585 52_3 53_3 -1 586 37_3 13_2 -1 587 37_3 12_1 -1 588 37_3 14_2 -1 589 37_3 23_2 -1 590 37_3 27_3 -1 591 37_3 36_3 -1 592 37_3 38_3 -1 593 37_3 47_3 -1 594 3_2 17_3 -1 595 3_2 15_3 -1 596 3_2 7_3 37 597 3_2 5_3 37 598 3_2 16_3 -1 599 14_2 17_3 -1 600 14_2 37_3 -1 601 14_2 18_3 37 602 14_2 27_3 -1 603 14_2 38_3 37 604 12_2 13_3 -1 605 12_2 15_3 -1 606 12_2 33_3 -1 607 12_2 35_3 -1 608 12_2 14_3 -1 609 12_2 23_3 -1 610 12_2 25_3 -1 611 12_2 34_3 -1 612 1_3 0_0 37 613 1_3 1_2 37 614 1_3 11_3 -1 615 32_3 11_2 -1 616 32_3 21_2 -1 617 32_3 31_3 -1 618 32_3 33_3 -1 619 21_2 31_3 -1 620 21_2 51_3 -1 621 21_2 33_3 -1 622 21_2 53_3 -1 623 21_2 41_3 -1 624 21_2 32_3 -1 625 21_2 43_3 -1 626 21_2 52_3 -1 627 11_3 0_0 -1 628 11_3 11_2 -1 629 11_3 1_2 -1 630 11_3 10_2 -1 631 11_3 1_3 -1 632 11_3 10_3 -1 633 11_3 12_3 -1 634 11_3 21_3 -1 635 10_3 0_0 37 636 10_3 10_2 37 637 10_3 11_3 -1 638 0_0 11_3 -1 639 0_0 1_3 37 640 0_0 10_3 37 641 7_3 1_0 37 642 7_3 3_2 37 643 7_3 17_3 -1 644 16_3 13_2 -1 645 16_3 3_2 -1 646 16_3 17_3 -1 647 16_3 15_3 -1 648 18_3 1_0 37 649 18_3 14_2 37 650 18_3 17_3 -1 651 17_3 1_0 -1 652 17_3 13_2 -1 653 17_3 3_2 -1 654 17_3 14_2 -1 655 17_3 7_3 -1 656 17_3 18_3 -1 657 17_3 16_3 -1 658 17_3 27_3 -1 659 3_3 1_1 37 660 3_3 1_2 37 661 3_3 13_3 -1 662 1_0 17_3 -1 663 1_0 7_3 37 664 1_0 18_3 37 665 5_3 1_1 37 666 5_3 3_2 37 667 5_3 15_3 -1 668 27_3 13_2 -1 669 27_3 14_2 -1 670 27_3 17_3 -1 671 27_3 37_3 -1 672 14_3 1_1 -1 673 14_3 12_2 -1 674 14_3 13_3 -1 675 14_3 15_3 -1 676 13_3 1_1 -1 677 13_3 11_2 -1 678 13_3 1_2 -1 679 13_3 12_2 -1 680 13_3 3_3 -1 681 13_3 14_3 -1 682 13_3 12_3 -1 683 13_3 23_3 -1 684 30_3 10_1 37 685 30_3 10_2 37 686 30_3 31_3 -1 687 1_1 13_3 -1 688 1_1 15_3 -1 689 1_1 3_3 37 690 1_1 5_3 37 691 1_1 14_3 -1 692 50_3 10_1 37 693 50_3 30_2 37 694 50_3 51_3 -1 695 25_3 13_2 -1 696 25_3 12_2 -1 697 25_3 15_3 -1 698 25_3 35_3 -1 699 41_3 10_1 -1 700 41_3 21_2 -1 701 41_3 31_3 -1 702 41_3 51_3 -1 703 15_3 1_1 -1 704 15_3 13_2 -1 705 15_3 3_2 -1 706 15_3 12_2 -1 707 15_3 5_3 -1 708 15_3 14_3 -1 709 15_3 16_3 -1 710 15_3 25_3 -1 711 12_3 11_2 -1 712 12_3 1_2 -1 713 12_3 11_3 -1 714 12_3 13_3 -1 715 10_1 31_3 -1 716 10_1 51_3 -1 717 10_1 30_3 37 718 10_1 50_3 37 719 10_1 41_3 -1 720 21_3 11_2 -1 721 21_3 10_2 -1 722 21_3 11_3 -1 723 21_3 31_3 -1 724 36_3 13_2 -1 725 36_3 23_2 -1 726 36_3 35_3 -1 727 36_3 37_3 -1 728 23_3 11_2 -1 729 23_3 12_2 -1 730 23_3 13_3 -1 731 23_3 33_3 -1 732 31_3 10_1 -1 733 31_3 11_2 -1 734 31_3 10_2 -1 735 31_3 21_2 -1 736 31_3 30_3 -1 737 31_3 41_3 -1 738 31_3 21_3 -1 739 31_3 32_3 -1 740 61_3 31_2 -1 741 61_3 30_2 -1 742 61_3 51_3 -1 743 11_2 11_3 -1 744 11_2 13_3 -1 745 11_2 31_3 -1 746 11_2 33_3 -1 747 11_2 12_3 -1 748 11_2 21_3 -1 749 11_2 23_3 -1 750 11_2 32_3 -1 751 11_1 33_3 -1 752 11_1 35_3 -1 753 11_1 53_3 -1 754 11_1 34_3 -1 755 11_1 43_3 -1 756 11_1 45_3 -1 757 38_3 14_2 37 758 38_3 12_1 37 759 38_3 37_3 -1 760 12_1 37_3 -1 761 12_1 38_3 37 762 12_1 47_3 -1 763 51_3 10_1 -1 764 51_3 31_2 -1 765 51_3 30_2 -1 766 51_3 21_2 -1 767 51_3 50_3 -1 768 51_3 41_3 -1 769 51_3 52_3 -1 770 51_3 61_3 -1 771 31_2 51_3 -1 772 31_2 53_3 -1 773 31_2 52_3 -1 774 31_2 61_3 -1 775 13_2 17_3 -1 776 13_2 15_3 -1 777 13_2 35_3 -1 778 13_2 37_3 -1 779 13_2 16_3 -1 780 13_2 27_3 -1 781 13_2 25_3 -1 782 13_2 36_3 -1 783 30_2 51_3 -1 784 30_2 50_3 37 785 30_2 61_3 -1 786 34_3 12_2 -1 787 34_3 11_1 -1 788 34_3 33_3 -1 789 34_3 35_3 -1 790 23_2 35_3 -1 791 23_2 37_3 -1 792 23_2 36_3 -1 793 23_2 45_3 -1 794 23_2 47_3 -1 795 33_3 11_2 -1 796 33_3 11_1 -1 797 33_3 12_2 -1 798 33_3 21_2 -1 799 33_3 23_3 -1 800 33_3 32_3 -1 801 33_3 34_3 -1 802 33_3 43_3 -1 803 45_3 11_1 -1 804 45_3 23_2 -1 805 45_3 35_3 -1 806 1_2 11_3 -1 807 1_2 13_3 -1 808 1_2 1_3 37 809 1_2 3_3 37 810 1_2 12_3 -1 811 53_3 11_1 -1 812 53_3 31_2 -1 813 53_3 21_2 -1 814 53_3 43_3 -1 815 53_3 52_3 -1 816 43_3 21_2 -1 817 43_3 11_1 -1 818 43_3 33_3 -1 819 43_3 53_3 -1 820 47_3 12_1 -1 821 47_3 23_2 -1 822 47_3 37_3 -1 823 35_3 13_2 -1 824 35_3 11_1 -1 825 35_3 12_2 -1 826 35_3 23_2 -1 827 35_3 25_3 -1 828 35_3 36_3 -1 829 35_3 34_3 -1 830 35_3 45_3 -1 831 10_2 11_3 -1 832 10_2 31_3 -1 833 10_2 10_3 37 834 10_2 30_3 37 835 10_2 21_3 -1 836 837 282 838 283 839 1 202
Note: See TracChangeset
for help on using the changeset viewer.