Ignore:
Timestamp:
12/21/18 11:06:40 (6 years ago)
Author:
Mathieu Morlighem
Message:

CHG: working on edge partitioning for new nodes implementation

File:
1 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateEdges.cpp

    r17924 r23568  
    1717
    1818        /*Intermediaries*/
    19         bool exist;
    2019        int  i,j,v1,v2,v3;
    21         int  maxnbe,nbe,elementnbe,elementnbv;
     20        int  elementnbe,elementnbv;
    2221        int *elementedges         = NULL;
    2322        int *elementedges_markers = NULL;
     
    3029                        elementedges         = xNew<int>(elementnbe*2);
    3130                        elementedges_markers = xNew<int>(elementnbe);
    32                         elementedges[2*0+0] = 1; elementedges[2*0+1] = 2; elementedges_markers[0] = 1;
    33                         elementedges[2*1+0] = 2; elementedges[2*1+1] = 0; elementedges_markers[1] = 1;
    34                         elementedges[2*2+0] = 0; elementedges[2*2+1] = 1; elementedges_markers[2] = 1;
     31                        elementedges[2*0+0] = 1; elementedges[2*0+1] = 2; elementedges_markers[0] = -1;
     32                        elementedges[2*1+0] = 2; elementedges[2*1+1] = 0; elementedges_markers[1] = -1;
     33                        elementedges[2*2+0] = 0; elementedges[2*2+1] = 1; elementedges_markers[2] = -1;
    3534                        break;
    3635                case TetraEnum:
     
    3938                        elementedges         = xNew<int>(elementnbe*2);
    4039                        elementedges_markers = xNew<int>(elementnbe);
    41                         elementedges[2*0+0] = 1; elementedges[2*0+1] = 2; elementedges_markers[0] = 1;
    42                         elementedges[2*1+0] = 0; elementedges[2*1+1] = 2; elementedges_markers[1] = 1;
    43                         elementedges[2*2+0] = 0; elementedges[2*2+1] = 1; elementedges_markers[2] = 1;
    44                         elementedges[2*3+0] = 1; elementedges[2*3+1] = 3; elementedges_markers[3] = 1;
    45                         elementedges[2*4+0] = 2; elementedges[2*4+1] = 3; elementedges_markers[4] = 1;
    46                         elementedges[2*5+0] = 0; elementedges[2*5+1] = 3; elementedges_markers[5] = 1;
     40                        elementedges[2*0+0] = 1; elementedges[2*0+1] = 2; elementedges_markers[0] = -1;
     41                        elementedges[2*1+0] = 0; elementedges[2*1+1] = 2; elementedges_markers[1] = -1;
     42                        elementedges[2*2+0] = 0; elementedges[2*2+1] = 1; elementedges_markers[2] = -1;
     43                        elementedges[2*3+0] = 1; elementedges[2*3+1] = 3; elementedges_markers[3] = -1;
     44                        elementedges[2*4+0] = 2; elementedges[2*4+1] = 3; elementedges_markers[4] = -1;
     45                        elementedges[2*5+0] = 0; elementedges[2*5+1] = 3; elementedges_markers[5] = -1;
    4746                        break;
    4847                case PentaEnum:
     
    6665
    6766        /*Maximum number of edges*/
    68         maxnbe = elementnbe*iomodel->numberofelements;
     67        int maxnbe = elementnbe*iomodel->numberofelements;
    6968
    7069        /*Initialize intermediaries*/
    71         int *edgestemp                 = xNew<int>(maxnbe*3);                             /*format: [vertex1 vertex2 marker]       */
    72         int *element_edge_connectivity = xNew<int>(iomodel->numberofelements*elementnbe); /*format: [edge1 edge2 ... edgen] */
     70        int *edgestemp                  = xNew<int>(maxnbe*3);                             /*format: [vertex1 vertex2 marker]*/
     71        int *vedgestemp                 = xNew<int>(maxnbe*2);                             /*format: [vertex1 vertex2]       */
     72        int *hedgestemp                 = xNew<int>(maxnbe*2);                             /*format: [vertex1 vertex2]       */
     73        int *element_edge_connectivity  = xNew<int>(iomodel->numberofelements*elementnbe); /*format: [edge1 edge2 ... edgen] */
     74        int *element_vedge_connectivity = NULL;
     75        int *element_hedge_connectivity = NULL;
     76        if(iomodel->meshelementtype==PentaEnum){
     77                element_vedge_connectivity  = xNew<int>(iomodel->numberofelements*3); /*format: [edge1 edge2 ... edgen] */
     78                element_hedge_connectivity  = xNew<int>(iomodel->numberofelements*6); /*format: [edge1 edge2 ... edgen] */
     79        }
    7380
    7481        /*Initialize chain*/
     
    7885
    7986        /*Initialize number of edges*/
    80         nbe = 0;
     87        int nbe = 0;
    8188
    8289        for(i=0;i<iomodel->numberofelements;i++){
     
    93100
    94101                        /*This edge a priori has not been processed yet*/
    95                         exist = false;
     102                        bool exist = false;
    96103
    97104                        /*Go through all processed edges connected to v1 and check whether we have seen this edge yet*/
     
    125132                }
    126133        }
     134        int nbve = 0;
     135        int nbhe = 0;
     136        /*vertical/horizontal edges*/
     137        if(iomodel->meshelementtype==PentaEnum){
     138                for(i=0;i<iomodel->numberofvertices;i++) head_minv[i]=-1;
     139                for(i=0;i<iomodel->numberofelements;i++){
     140                        for(j=0;j<3;j++){
     141                                v1 = iomodel->elements[i*elementnbv+elementedges[2*j+0]]-1; _assert_(v1>=0 & v1<iomodel->numberofvertices);
     142                                v2 = iomodel->elements[i*elementnbv+elementedges[2*j+1]]-1; _assert_(v2>=0 & v2<iomodel->numberofvertices);
     143                                if(v2<v1){ v3=v2; v2=v1; v1=v3;}
     144                                bool exist = false;
     145                                for(int e=head_minv[v1]; e!=-1; e=next_edge[e]){
     146                                        if(vedgestemp[e*2+1]==v2+1){
     147                                                exist = true;
     148                                                element_vedge_connectivity[i*3+j]=e;
     149                                                break;
     150                                        }
     151                                }
     152                                if(!exist){
     153                                        vedgestemp[nbve*2+0] = v1+1;
     154                                        vedgestemp[nbve*2+1] = v2+1;
     155                                        element_vedge_connectivity[i*3+j]=nbve;
     156                                        head_minv[v1] = nbve;
     157                                        nbve++;
     158                                }
     159                        }
     160                }
     161                for(i=0;i<iomodel->numberofvertices;i++) head_minv[i]=-1;
     162                for(i=0;i<iomodel->numberofelements;i++){
     163                        for(j=3;j<9;j++){
     164                                v1 = iomodel->elements[i*elementnbv+elementedges[2*j+0]]-1; _assert_(v1>=0 & v1<iomodel->numberofvertices);
     165                                v2 = iomodel->elements[i*elementnbv+elementedges[2*j+1]]-1; _assert_(v2>=0 & v2<iomodel->numberofvertices);
     166                                if(v2<v1){ v3=v2; v2=v1; v1=v3;}
     167                                bool exist = false;
     168                                for(int e=head_minv[v1]; e!=-1; e=next_edge[e]){
     169                                        if(hedgestemp[e*2+1]==v2+1){
     170                                                exist = true;
     171                                                element_hedge_connectivity[i*6+(j-3)]=e;
     172                                                break;
     173                                        }
     174                                }
     175                                if(!exist){
     176                                        hedgestemp[nbhe*2+0] = v1+1;
     177                                        hedgestemp[nbhe*2+1] = v2+1;
     178                                        element_hedge_connectivity[i*6+(j-3)]=nbhe;
     179                                        head_minv[v1] = nbhe;
     180                                        nbhe++;
     181                                }
     182                        }
     183                }
     184        }
    127185
    128186        /*Clean up*/
    129187        xDelete<int>(head_minv);
    130188        xDelete<int>(next_edge);
     189        xDelete<int>(elementedges);
    131190        xDelete<int>(elementedges_markers);
    132191
    133192        /*Create final edges*/
    134         int* edges = xNew<int>(nbe*3); /*format: [vertex1 vertex2 marker]*/
     193        int* edges = xNew<int>(nbe*3);
    135194        for(int i=0;i<3*nbe;i++) edges[i] = edgestemp[i];
    136 
    137         /*Clean up*/
    138195        xDelete<int>(edgestemp);
    139         xDelete<int>(elementedges);
     196        int* vedges = xNew<int>(nbve*2);
     197        for(int i=0;i<2*nbve;i++) vedges[i] = vedgestemp[i];
     198        xDelete<int>(vedgestemp);
     199        int* hedges = xNew<int>(nbhe*2);
     200        for(int i=0;i<2*nbhe;i++) hedges[i] = hedgestemp[i];
     201        xDelete<int>(hedgestemp);
    140202
    141203        /*Assign output pointers*/
    142         iomodel->edges                     = edges;
     204        iomodel->edges           = edges;
     205        iomodel->verticaledges   = vedges;
     206        iomodel->horizontaledges = hedges;
    143207        iomodel->elementtoedgeconnectivity = element_edge_connectivity;
     208        iomodel->elementtoverticaledgeconnectivity = element_vedge_connectivity;
     209        iomodel->elementtohorizontaledgeconnectivity = element_hedge_connectivity;
    144210        iomodel->numberofedges             = nbe;
     211        iomodel->numberofverticaledges     = nbve;
     212        iomodel->numberofhorizontaledges   = nbhe;
    145213}/*}}}*/
    146214void EdgeOnBoundaryFlags(bool** pflags,IoModel* iomodel){/*{{{*/
Note: See TracChangeset for help on using the changeset viewer.