Changeset 1500


Ignore:
Timestamp:
Jun 6, 2005, 9:39:01 AM (19 years ago)
Author:
linda
Message:
 
Location:
inundation/ga/storm_surge/parallel
Files:
9 added
5 edited

Legend:

Unmodified
Added
Removed
  • inundation/ga/storm_surge/parallel/demo.py

    r1363 r1500  
    2020#   mpirun -np 4 demo.py
    2121
    22 
    2322import pypar    # The Python-MPI interface
    24 
    2523numproc = pypar.size()
    2624myid =    pypar.rank()
  • inundation/ga/storm_surge/parallel/linda_dummy.py

    r1409 r1500  
     1#mpirun -np 4 /usr/bin/python linda_dummy.py
     2
     3
    14import sys
    25from os import sep
    36sys.path.append('..'+sep+'pyvolution')
    47from mg2ga import *
     8from build_submesh import *
     9from build_local import *
     10import pypar
     11
    512# open file
    6 f=open('test_3l_2cc.out', 'r')
     13f=open('test_3l_1c.out', 'r')
    714print f
    815# read in nodes and triangles
    9 [nodes, triangles, triangles_per_proc] = mg2ga(f)
     16[nodes, triangles, boundary, triangles_per_proc] = mg2ga(f)
    1017f.close
    1118# find whole mesh on host
    1219mesh = Mesh(nodes, triangles)
     20
     21submesh_struc = submesh_full(nodes, triangles, boundary, triangles_per_proc)
     22submesh_struc2 = submesh_ghost(submesh_struc, mesh, triangles_per_proc)
     23
     24# this will eventually be done on the processors
     25submesh_cell = {}
     26lower_t = 0
     27for 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           
    1348# find sub domains (i.e. full triangles)
    1449submesh = []
    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
     50for 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
    3958# check results
    4059#write a data file for use by scilab script
     
    5978            string='Error: Triangle '+repr(t)+' on processor '+repr(p)+' is oriented clockwise or degenerate'
    6079            print(string)
    61 fp.close()
     80fp.close
    6281#END160505 VISUALISE MESH IN SCILAB
    6382mesh
  • 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
    120from string import atoi
    2 
    321from string import atof
    4 
    522from string import split
    623
    724
    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#########################################################
    2755def readmg(f):
    2856
    29 
    30 
    3157    # read the nuber of processors
    3258
    33 
    34 
    3559    f.readline()
    36 
    3760    no_proc = atoi(f.readline().split()[0])
    3861
    39     print no_proc
    40 
    41    
    42 
     62    # skip over additional information not needed
     63   
    4364    for i in range(5):
    44 
    4565        f.readline();
    4666
    47 
    48 
    4967    # nodes list
    5068
    51 
    52 
    5369    nodes = []
    5470
    55 
     71    # boundary edge list
     72
     73    edges = []
    5674
    5775    # triangle list
    5876
    59 
    60 
    6177    triangles = []
    6278
    63 
    64 
    6579    # know first nodes_per_proc[0] belong to cell 0, next
    66 
    6780    # nodes_per_proc[1] belong to cell 1 etc.
    6881
    69 
    70 
    7182    nodes_per_proc = []
    72 
    7383    triangles_per_proc = []
    7484
    75 
    76 
    7785    # loop over the processors
    7886
    79 
    80 
    8187    for q in range(no_proc):
    82 
    83 
    84 
    85         print q
    86 
    87    
    88 
     88   
    8989        # read the nodes
    9090
    91 
    92 
    9391        no_nodes = atoi(f.readline().split()[1])
    94 
    95         print no_nodes
    96 
    9792        nodes_per_proc.append(no_nodes)
    98 
    99         f.readline()
    100 
    101 
     93        f.readline()
    10294
    10395        for i in range(no_nodes):
    104 
    10596            line = f.readline().split()
    106 
    10797            line[1:3] = map(atof, line[1:3])
    108 
    10998            nodes.append(line[0:3])
    11099
    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       
    113111        # read the triangles
    114112
    115 
    116 
    117         f.readline()
    118 
     113        f.readline(), f.readline(), f.readline()
    119114        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       
    129119        for i in range(no_triangles):
    130 
    131120            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):
    141123                triangles.append(line)
    142 
    143124                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):
    151128                    break
    152 
    153             if (triangles[t]!=line): #need to add line to list
    154 
     129            if (triangles[t]!=line):
    155130               triangles.append(line)
    156131
    157                
    158 
     132        # keep a record of how many triangles belong to each processor
     133       
    159134        no_triangles=len(triangles)-sum(triangles_per_proc)
    160 
    161135        triangles_per_proc.append(no_triangles)
    162136
    163 
    164 
    165 
    166 
    167137        # 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
     168def restructure(nodes, triangles, edges):
    203169    Nnodes =len(nodes)
    204 
    205170    Ntriangles = len(triangles)
    206 
    207    
    208 
     171   
    209172    index={} #a dictionary mapping existing node ids to the new ids 0,1,2,...
    210173
    211 
    212 
    213174    GAnodes = []
    214 
    215    
    216 
     175   
    217176    for node_idnew in range(Nnodes): #move through the list of nodes, renumbering to 0,1,2, ...
    218 
    219177        index[nodes[node_idnew][0]]=node_idnew #make the dictionary entry, for later use by triangles
    220 
    221178        GAnodes.append(nodes[node_idnew][1:3])
    222 
    223179#        nodes[node_idnew][0]=node_idnew #renumber the node
    224180
    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   
    231187    #Now loop over the triangles, changing the node ids and orientation.
    232 
    233188    for t in range(Ntriangles):
    234 
    235189        for i in range(3):
    236 
    237190            n=index[triangles[t][i]] #use the dictionary to get the new node id
    238 
    239191            triangles[t][i]=n #relabel the node
    240192
    241 
    242 
    243            
    244 
     193           
    245194    del(index) #delete the dictionary
    246195
    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#########################################################
    261212def reorient(nodes, triangles):
    262 
    263    
    264 
    265 
     213   
    266214
    267215    Nnodes =len(nodes)
    268 
    269216    Ntriangles = len(triangles)
    270 
    271    
    272 
     217   
    273218    #Now loop over the triangles, changing the node ids and orientation.
    274 
    275219    for t in range(Ntriangles):
    276 
    277220        x=[] #x-coordinates of the three nodes (vertices)
    278 
    279221        y=[] #y-coordinates of the three nodes (vertices)
    280 
    281222        for i in range(3):
    282 
    283223            n=triangles[t][i] #use the dictionary to get the new node id
    284 
    285224            x.append(nodes[n][0])
    286 
    287225            y.append(nodes[n][1])
    288 
    289226        if ((x[1]-x[0])*(y[2]-y[0])-(x[2]-x[0])*(y[1]-y[0])<0): #need to change the orientation
    290 
    291227            triangles[t][2]=triangles[t][0]#swap the 0th and 2nd nodes
    292 
    293228            triangles[t][0]=n
    294 
    295 
    296 
     229   
    297230    del(x)
    298 
    299231    del(y)
    300 
    301    
    302 
     232   
    303233    return triangles
    304234
    305235
     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#########################################################
     252def 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#########################################################
    306327
    307328def mg2ga(f):
    308329
    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
    315341    triangles = reorient(nodes, triangles)
    316342
    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  
    6161        # Calculate local timestep
    6262        Advection_Domain.update_timestep(self, yieldstep, finaltime)
    63 
     63       
    6464        import time
    6565        t0 = time.time()
     
    7272        gtimestep = zeros( 1, Float) # Buffer for results
    7373
     74       
     75        #LINDA
    7476        pypar.raw_reduce(ltimestep, gtimestep, pypar.MIN, 0)
    7577        pypar.broadcast(gtimestep,0)
     
    7981
    8082        self.communication_reduce_time += time.time()-t0
    81 
    8283
    8384    def update_ghosts(self):
     
    9899        import time
    99100        t0 = time.time()
    100 
    101 
     101   
    102102        stage_cv = self.quantities['stage'].centroid_values
    103 
     103       
    104104        # update of non-local ghost cells
    105105        for iproc in range(self.numproc):
    106 
    107106            if iproc == self.processor:
    108107                #Send data from iproc processor to other processors
    109108                for send_proc in self.full_send_dict:
    110109                    if send_proc != iproc:
     110                        # LINDA:
     111                        # now store full as local id, global_id, value
     112
    111113                        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]
    113116                        N = len(Xout)
    114117
    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#                        ==============================
    117127                        # Original python Code
    118128                        for i in range(N):
    119129                            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');
    130143
    131144                        pypar.send(Xout,send_proc)
     145
    132146
    133147            else:
    134148                #Receive data from the iproc processor
    135149                if  self.ghost_recv_dict.has_key(iproc):
     150                   
     151                    # LINDA:
     152                    # now store ghost as local id, global id, value           
    136153                    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]
    138156
    139157                    X = pypar.receive(iproc,X)
    140158                    N = len(X)
    141159
    142                     """
    143                     ===========================
     160                    #LINDA: had problems getting C code to work
     161                   
     162#                    """
     163#                    ===========================
    144164                    # Origin Python Code
    145165                    for i in range(N):
    146166                        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                   
    158178        #local update of ghost cells
    159179        iproc = self.processor
    160180        if self.full_send_dict.has_key(iproc):
     181
     182            # LINDA:
     183            # now store full as local id, global id, value
    161184            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           
    164190            N = len(Idg)
    165             #print Idg
    166191
    167192            """
     
    181206            weave.inline(code3, ['stage_cv','Idg','Idf','N'],
    182207                                 type_converters = converters.blitz, compiler='gcc');
    183 
    184208
    185209        self.communication_time += time.time()-t0
  • inundation/ga/storm_surge/parallel/test_3l_2c.out

    r1460 r1500  
    464634_2 1.0000000000 0.7500000000 0.0000000000 0.0000000000 0.0000000000
    474776_3 0.7500000000 0.8750000000 0.0132446401 0.0004640172 0.0000000000
     48
     490 292
     50
     5114_2 37_3 -1
     5214_2 38_3 37
     5314_2 27_3 -1
     5487_3 11_0 37
     5587_3 43_2 37
     5687_3 77_3 -1
     5767_3 33_2 -1
     5867_3 34_2 -1
     5967_3 77_3 -1
     6067_3 57_3 -1
     6123_3 11_2 -1
     6223_3 12_2 -1
     6323_3 33_3 -1
     6478_3 11_0 37
     6578_3 34_2 37
     6678_3 77_3 -1
     6732_3 11_2 -1
     6832_3 21_2 -1
     6932_3 33_3 -1
     7012_2 33_3 -1
     7112_2 35_3 -1
     7212_2 34_3 -1
     7312_2 23_3 -1
     7412_2 25_3 -1
     7565_3 33_2 -1
     7665_3 32_2 -1
     7765_3 55_3 -1
     7865_3 75_3 -1
     7921_2 33_3 -1
     8021_2 53_3 -1
     8121_2 51_3 -1
     8221_2 43_3 -1
     8321_2 41_3 -1
     8421_2 32_3 -1
     8521_2 52_3 -1
     8630_2 71_3 -1
     8730_2 51_3 -1
     8830_2 70_3 37
     8930_2 50_3 37
     9030_2 61_3 -1
     9172_3 31_2 -1
     9272_3 41_2 -1
     9372_3 71_3 -1
     9472_3 73_3 -1
     9556_3 33_2 -1
     9656_3 23_2 -1
     9756_3 55_3 -1
     9856_3 57_3 -1
     9945_3 11_1 -1
     10045_3 23_2 -1
     10145_3 55_3 -1
     10245_3 35_3 -1
     10341_2 71_3 -1
     10441_2 73_3 -1
     10541_2 81_3 37
     10641_2 83_3 37
     10741_2 72_3 -1
     10877_3 11_0 -1
     10977_3 33_2 -1
     11077_3 43_2 -1
     11177_3 34_2 -1
     11277_3 87_3 -1
     11377_3 78_3 -1
     11477_3 76_3 -1
     11577_3 67_3 -1
     11670_3 10_0 37
     11770_3 30_2 37
     11870_3 71_3 -1
     11911_0 77_3 -1
     12011_0 87_3 37
     12111_0 78_3 37
     12281_3 10_0 37
     12381_3 41_2 37
     12481_3 71_3 -1
     12563_3 31_2 -1
     12663_3 32_2 -1
     12763_3 53_3 -1
     12863_3 73_3 -1
     12932_2 55_3 -1
     13032_2 53_3 -1
     13132_2 75_3 -1
     13232_2 73_3 -1
     13332_2 54_3 -1
     13432_2 74_3 -1
     13532_2 65_3 -1
     13632_2 63_3 -1
     13771_3 10_0 -1
     13871_3 31_2 -1
     13971_3 30_2 -1
     14071_3 41_2 -1
     14171_3 70_3 -1
     14271_3 81_3 -1
     14371_3 61_3 -1
     14471_3 72_3 -1
     14523_2 55_3 -1
     14623_2 35_3 -1
     14723_2 57_3 -1
     14823_2 37_3 -1
     14923_2 45_3 -1
     15023_2 47_3 -1
     15123_2 56_3 -1
     15223_2 36_3 -1
     15310_0 71_3 -1
     15410_0 70_3 37
     15510_0 81_3 37
     15661_3 31_2 -1
     15761_3 30_2 -1
     15861_3 71_3 -1
     15961_3 51_3 -1
     16055_3 11_1 -1
     16155_3 33_2 -1
     16255_3 32_2 -1
     16355_3 23_2 -1
     16455_3 54_3 -1
     16555_3 45_3 -1
     16655_3 65_3 -1
     16755_3 56_3 -1
     16854_3 11_1 -1
     16954_3 32_2 -1
     17054_3 55_3 -1
     17154_3 53_3 -1
     17211_1 33_3 -1
     17311_1 55_3 -1
     17411_1 35_3 -1
     17511_1 53_3 -1
     17611_1 34_3 -1
     17711_1 43_3 -1
     17811_1 54_3 -1
     17911_1 45_3 -1
     18034_3 11_1 -1
     18134_3 12_2 -1
     18234_3 33_3 -1
     18334_3 35_3 -1
     18453_3 11_1 -1
     18553_3 31_2 -1
     18653_3 21_2 -1
     18753_3 32_2 -1
     18853_3 43_3 -1
     18953_3 54_3 -1
     19053_3 52_3 -1
     19153_3 63_3 -1
     19227_3 13_2 -1
     19327_3 14_2 -1
     19427_3 37_3 -1
     19585_3 21_1 37
     19685_3 43_2 37
     19785_3 75_3 -1
     19843_3 11_1 -1
     19943_3 21_2 -1
     20043_3 33_3 -1
     20143_3 53_3 -1
     20221_1 75_3 -1
     20321_1 73_3 -1
     20421_1 85_3 37
     20521_1 83_3 37
     20621_1 74_3 -1
     20725_3 13_2 -1
     20825_3 12_2 -1
     20925_3 35_3 -1
     21083_3 21_1 37
     21183_3 41_2 37
     21283_3 73_3 -1
     21336_3 13_2 -1
     21436_3 23_2 -1
     21536_3 35_3 -1
     21636_3 37_3 -1
     21712_1 57_3 -1
     21812_1 37_3 -1
     21912_1 58_3 37
     22012_1 38_3 37
     22112_1 47_3 -1
     22274_3 21_1 -1
     22374_3 32_2 -1
     22474_3 75_3 -1
     22574_3 73_3 -1
     22633_3 11_1 -1
     22733_3 11_2 -1
     22833_3 12_2 -1
     22933_3 21_2 -1
     23033_3 34_3 -1
     23133_3 43_3 -1
     23233_3 23_3 -1
     23333_3 32_3 -1
     23458_3 12_1 37
     23558_3 34_2 37
     23658_3 57_3 -1
     23710_1 51_3 -1
     23810_1 50_3 37
     23910_1 41_3 -1
     24033_2 77_3 -1
     24133_2 55_3 -1
     24233_2 75_3 -1
     24333_2 57_3 -1
     24433_2 76_3 -1
     24533_2 67_3 -1
     24633_2 65_3 -1
     24733_2 56_3 -1
     24852_3 31_2 -1
     24952_3 21_2 -1
     25052_3 53_3 -1
     25152_3 51_3 -1
     25275_3 21_1 -1
     25375_3 33_2 -1
     25475_3 43_2 -1
     25575_3 32_2 -1
     25675_3 85_3 -1
     25775_3 74_3 -1
     25875_3 76_3 -1
     25975_3 65_3 -1
     26035_3 11_1 -1
     26135_3 13_2 -1
     26235_3 12_2 -1
     26335_3 23_2 -1
     26435_3 34_3 -1
     26535_3 45_3 -1
     26635_3 25_3 -1
     26735_3 36_3 -1
     26847_3 12_1 -1
     26947_3 23_2 -1
     27047_3 57_3 -1
     27147_3 37_3 -1
     27250_3 10_1 37
     27350_3 30_2 37
     27450_3 51_3 -1
     27573_3 21_1 -1
     27673_3 31_2 -1
     27773_3 41_2 -1
     27873_3 32_2 -1
     27973_3 83_3 -1
     28073_3 74_3 -1
     28173_3 72_3 -1
     28273_3 63_3 -1
     28311_2 33_3 -1
     28411_2 23_3 -1
     28511_2 32_3 -1
     28631_2 71_3 -1
     28731_2 53_3 -1
     28831_2 51_3 -1
     28931_2 73_3 -1
     29031_2 61_3 -1
     29131_2 72_3 -1
     29231_2 52_3 -1
     29331_2 63_3 -1
     29441_3 10_1 -1
     29541_3 21_2 -1
     29641_3 51_3 -1
     29757_3 12_1 -1
     29857_3 33_2 -1
     29957_3 34_2 -1
     30057_3 23_2 -1
     30157_3 58_3 -1
     30257_3 47_3 -1
     30357_3 67_3 -1
     30457_3 56_3 -1
     30513_2 35_3 -1
     30613_2 37_3 -1
     30713_2 27_3 -1
     30813_2 25_3 -1
     30913_2 36_3 -1
     31043_2 77_3 -1
     31143_2 75_3 -1
     31243_2 87_3 37
     31343_2 85_3 37
     31443_2 76_3 -1
     31551_3 10_1 -1
     31651_3 31_2 -1
     31751_3 30_2 -1
     31851_3 21_2 -1
     31951_3 50_3 -1
     32051_3 41_3 -1
     32151_3 61_3 -1
     32251_3 52_3 -1
     32334_2 77_3 -1
     32434_2 57_3 -1
     32534_2 78_3 37
     32634_2 58_3 37
     32734_2 67_3 -1
     32838_3 12_1 37
     32938_3 14_2 37
     33038_3 37_3 -1
     33176_3 33_2 -1
     33276_3 43_2 -1
     33376_3 77_3 -1
     33476_3 75_3 -1
     33537_3 12_1 -1
     33637_3 13_2 -1
     33737_3 14_2 -1
     33837_3 23_2 -1
     33937_3 38_3 -1
     34037_3 47_3 -1
     34137_3 27_3 -1
     34237_3 36_3 -1
     343
     344
    48345
    493460 182
     
    28057735_3 0.6250000000 0.3750000000 0.0428550839 0.0003864360 0.0000000000
    28157810_2 0.0000000000 0.2500000000 0.0000000000 0.0000000000 0.0000000000
     579
     5801 254
     581
     58252_3 21_2 -1
     58352_3 31_2 -1
     58452_3 51_3 -1
     58552_3 53_3 -1
     58637_3 13_2 -1
     58737_3 12_1 -1
     58837_3 14_2 -1
     58937_3 23_2 -1
     59037_3 27_3 -1
     59137_3 36_3 -1
     59237_3 38_3 -1
     59337_3 47_3 -1
     5943_2 17_3 -1
     5953_2 15_3 -1
     5963_2 7_3 37
     5973_2 5_3 37
     5983_2 16_3 -1
     59914_2 17_3 -1
     60014_2 37_3 -1
     60114_2 18_3 37
     60214_2 27_3 -1
     60314_2 38_3 37
     60412_2 13_3 -1
     60512_2 15_3 -1
     60612_2 33_3 -1
     60712_2 35_3 -1
     60812_2 14_3 -1
     60912_2 23_3 -1
     61012_2 25_3 -1
     61112_2 34_3 -1
     6121_3 0_0 37
     6131_3 1_2 37
     6141_3 11_3 -1
     61532_3 11_2 -1
     61632_3 21_2 -1
     61732_3 31_3 -1
     61832_3 33_3 -1
     61921_2 31_3 -1
     62021_2 51_3 -1
     62121_2 33_3 -1
     62221_2 53_3 -1
     62321_2 41_3 -1
     62421_2 32_3 -1
     62521_2 43_3 -1
     62621_2 52_3 -1
     62711_3 0_0 -1
     62811_3 11_2 -1
     62911_3 1_2 -1
     63011_3 10_2 -1
     63111_3 1_3 -1
     63211_3 10_3 -1
     63311_3 12_3 -1
     63411_3 21_3 -1
     63510_3 0_0 37
     63610_3 10_2 37
     63710_3 11_3 -1
     6380_0 11_3 -1
     6390_0 1_3 37
     6400_0 10_3 37
     6417_3 1_0 37
     6427_3 3_2 37
     6437_3 17_3 -1
     64416_3 13_2 -1
     64516_3 3_2 -1
     64616_3 17_3 -1
     64716_3 15_3 -1
     64818_3 1_0 37
     64918_3 14_2 37
     65018_3 17_3 -1
     65117_3 1_0 -1
     65217_3 13_2 -1
     65317_3 3_2 -1
     65417_3 14_2 -1
     65517_3 7_3 -1
     65617_3 18_3 -1
     65717_3 16_3 -1
     65817_3 27_3 -1
     6593_3 1_1 37
     6603_3 1_2 37
     6613_3 13_3 -1
     6621_0 17_3 -1
     6631_0 7_3 37
     6641_0 18_3 37
     6655_3 1_1 37
     6665_3 3_2 37
     6675_3 15_3 -1
     66827_3 13_2 -1
     66927_3 14_2 -1
     67027_3 17_3 -1
     67127_3 37_3 -1
     67214_3 1_1 -1
     67314_3 12_2 -1
     67414_3 13_3 -1
     67514_3 15_3 -1
     67613_3 1_1 -1
     67713_3 11_2 -1
     67813_3 1_2 -1
     67913_3 12_2 -1
     68013_3 3_3 -1
     68113_3 14_3 -1
     68213_3 12_3 -1
     68313_3 23_3 -1
     68430_3 10_1 37
     68530_3 10_2 37
     68630_3 31_3 -1
     6871_1 13_3 -1
     6881_1 15_3 -1
     6891_1 3_3 37
     6901_1 5_3 37
     6911_1 14_3 -1
     69250_3 10_1 37
     69350_3 30_2 37
     69450_3 51_3 -1
     69525_3 13_2 -1
     69625_3 12_2 -1
     69725_3 15_3 -1
     69825_3 35_3 -1
     69941_3 10_1 -1
     70041_3 21_2 -1
     70141_3 31_3 -1
     70241_3 51_3 -1
     70315_3 1_1 -1
     70415_3 13_2 -1
     70515_3 3_2 -1
     70615_3 12_2 -1
     70715_3 5_3 -1
     70815_3 14_3 -1
     70915_3 16_3 -1
     71015_3 25_3 -1
     71112_3 11_2 -1
     71212_3 1_2 -1
     71312_3 11_3 -1
     71412_3 13_3 -1
     71510_1 31_3 -1
     71610_1 51_3 -1
     71710_1 30_3 37
     71810_1 50_3 37
     71910_1 41_3 -1
     72021_3 11_2 -1
     72121_3 10_2 -1
     72221_3 11_3 -1
     72321_3 31_3 -1
     72436_3 13_2 -1
     72536_3 23_2 -1
     72636_3 35_3 -1
     72736_3 37_3 -1
     72823_3 11_2 -1
     72923_3 12_2 -1
     73023_3 13_3 -1
     73123_3 33_3 -1
     73231_3 10_1 -1
     73331_3 11_2 -1
     73431_3 10_2 -1
     73531_3 21_2 -1
     73631_3 30_3 -1
     73731_3 41_3 -1
     73831_3 21_3 -1
     73931_3 32_3 -1
     74061_3 31_2 -1
     74161_3 30_2 -1
     74261_3 51_3 -1
     74311_2 11_3 -1
     74411_2 13_3 -1
     74511_2 31_3 -1
     74611_2 33_3 -1
     74711_2 12_3 -1
     74811_2 21_3 -1
     74911_2 23_3 -1
     75011_2 32_3 -1
     75111_1 33_3 -1
     75211_1 35_3 -1
     75311_1 53_3 -1
     75411_1 34_3 -1
     75511_1 43_3 -1
     75611_1 45_3 -1
     75738_3 14_2 37
     75838_3 12_1 37
     75938_3 37_3 -1
     76012_1 37_3 -1
     76112_1 38_3 37
     76212_1 47_3 -1
     76351_3 10_1 -1
     76451_3 31_2 -1
     76551_3 30_2 -1
     76651_3 21_2 -1
     76751_3 50_3 -1
     76851_3 41_3 -1
     76951_3 52_3 -1
     77051_3 61_3 -1
     77131_2 51_3 -1
     77231_2 53_3 -1
     77331_2 52_3 -1
     77431_2 61_3 -1
     77513_2 17_3 -1
     77613_2 15_3 -1
     77713_2 35_3 -1
     77813_2 37_3 -1
     77913_2 16_3 -1
     78013_2 27_3 -1
     78113_2 25_3 -1
     78213_2 36_3 -1
     78330_2 51_3 -1
     78430_2 50_3 37
     78530_2 61_3 -1
     78634_3 12_2 -1
     78734_3 11_1 -1
     78834_3 33_3 -1
     78934_3 35_3 -1
     79023_2 35_3 -1
     79123_2 37_3 -1
     79223_2 36_3 -1
     79323_2 45_3 -1
     79423_2 47_3 -1
     79533_3 11_2 -1
     79633_3 11_1 -1
     79733_3 12_2 -1
     79833_3 21_2 -1
     79933_3 23_3 -1
     80033_3 32_3 -1
     80133_3 34_3 -1
     80233_3 43_3 -1
     80345_3 11_1 -1
     80445_3 23_2 -1
     80545_3 35_3 -1
     8061_2 11_3 -1
     8071_2 13_3 -1
     8081_2 1_3 37
     8091_2 3_3 37
     8101_2 12_3 -1
     81153_3 11_1 -1
     81253_3 31_2 -1
     81353_3 21_2 -1
     81453_3 43_3 -1
     81553_3 52_3 -1
     81643_3 21_2 -1
     81743_3 11_1 -1
     81843_3 33_3 -1
     81943_3 53_3 -1
     82047_3 12_1 -1
     82147_3 23_2 -1
     82247_3 37_3 -1
     82335_3 13_2 -1
     82435_3 11_1 -1
     82535_3 12_2 -1
     82635_3 23_2 -1
     82735_3 25_3 -1
     82835_3 36_3 -1
     82935_3 34_3 -1
     83035_3 45_3 -1
     83110_2 11_3 -1
     83210_2 31_3 -1
     83310_2 10_3 37
     83410_2 30_3 37
     83510_2 21_3 -1
     836
     837
    282838
    2838391 202
Note: See TracChangeset for help on using the changeset viewer.