Changeset 23568


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

CHG: working on edge partitioning for new nodes implementation

Location:
issm/trunk-jpl/src/c
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/c/classes/IoModel.cpp

    r23532 r23568  
    137137        this->my_faces=NULL;
    138138        this->my_edges=NULL;
     139        this->my_vedges=NULL;
     140        this->my_hedges=NULL;
    139141        this->my_vertices=NULL;
    140142        this->epart=NULL;
     
    147149        this->numberoffaces=-1;
    148150        this->numberofedges=-1;
     151        this->numberofverticaledges=-1;
     152        this->numberofhorizontaledges=-1;       
    149153        this->facescols=-1;
    150154        this->elements=NULL;
    151155        this->faces=NULL;
    152156        this->edges=NULL;
    153         this->elementtofaceconnectivity      =NULL;
    154         this->elementtoedgeconnectivity      =NULL;
    155         this->singlenodetoelementconnectivity=NULL;
    156         this->numbernodetoelementconnectivity=NULL;
     157        this->verticaledges=NULL;
     158        this->horizontaledges=NULL;
     159        this->elementtofaceconnectivity           = NULL;
     160        this->elementtoedgeconnectivity           = NULL;
     161        this->elementtoverticaledgeconnectivity   = NULL;
     162        this->elementtohorizontaledgeconnectivity = NULL;
     163        this->singlenodetoelementconnectivity     = NULL;
     164        this->numbernodetoelementconnectivity     = NULL;
    157165}/*}}}*/
    158166IoModel::IoModel(FILE* iomodel_handle,int solution_enum_in,bool trace,IssmPDouble* X){/*{{{*/
     
    197205        this->my_faces = NULL;
    198206        this->my_edges = NULL;
     207        this->my_vedges = NULL;
     208        this->my_hedges = NULL;
    199209        this->my_vertices = NULL;
    200210        this->epart = NULL;
     
    207217        FetchData(&this->numberofelements,"md.mesh.numberofelements");
    208218        FetchData(&this->elements,NULL,NULL,"md.mesh.elements");
    209         this->facescols                       = -1;
    210         this->faces                           = NULL;
    211         this->edges                           = NULL;
    212         this->elementtofaceconnectivity       = NULL;
    213         this->elementtoedgeconnectivity       = NULL;
    214         this->singlenodetoelementconnectivity = NULL;
    215         this->numbernodetoelementconnectivity = NULL;
     219        this->facescols                           = -1;
     220        this->faces                               = NULL;
     221        this->edges                               = NULL;
     222        this->verticaledges                       = NULL;
     223        this->horizontaledges                     = NULL;
     224        this->elementtofaceconnectivity           = NULL;
     225        this->elementtoedgeconnectivity           = NULL;
     226        this->elementtoverticaledgeconnectivity   = NULL;
     227        this->elementtohorizontaledgeconnectivity = NULL;
     228        this->singlenodetoelementconnectivity     = NULL;
     229        this->numbernodetoelementconnectivity     = NULL;
    216230}/*}}}*/
    217231IoModel::~IoModel(){/*{{{*/
     
    239253        xDelete<bool>(this->my_faces);
    240254        xDelete<bool>(this->my_edges);
     255        xDelete<bool>(this->my_vedges);
     256        xDelete<bool>(this->my_hedges);
    241257        xDelete<bool>(this->my_vertices);
    242258        xDelete<int>(this->epart);
     
    245261        xDelete<int>(this->faces);
    246262        xDelete<int>(this->edges);
     263        xDelete<int>(this->verticaledges);
     264        xDelete<int>(this->horizontaledges);
    247265        xDelete<int>(this->elementtofaceconnectivity);
    248266        xDelete<int>(this->elementtoedgeconnectivity);
     267        xDelete<int>(this->elementtoverticaledgeconnectivity);
     268        xDelete<int>(this->elementtohorizontaledgeconnectivity);
    249269        xDelete<int>(this->singlenodetoelementconnectivity);
    250270        xDelete<int>(this->numbernodetoelementconnectivity);
  • issm/trunk-jpl/src/c/classes/IoModel.h

    r23532 r23568  
    6666                bool *my_faces;
    6767                bool *my_edges;
     68                bool *my_vedges;
     69                bool *my_hedges;
    6870                bool *my_vertices;
    6971                int  *epart;
     
    7476                int *elements;
    7577                int *edges;
     78                int *verticaledges;
     79                int *horizontaledges;
    7680                int *elementtoedgeconnectivity;
     81                int *elementtoverticaledgeconnectivity;
     82                int *elementtohorizontaledgeconnectivity;
    7783                int *elementtofaceconnectivity;
    7884                int *faces;
     
    8187                int *numbernodetoelementconnectivity;
    8288                int  numberofedges;
     89                int  numberofverticaledges;
     90                int  numberofhorizontaledges;
    8391                int  numberofelements;
    8492                int  numberoffaces;
  • 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){/*{{{*/
  • issm/trunk-jpl/src/c/modules/ModelProcessorx/EdgesPartitioning.cpp

    r23167 r23568  
    2727
    2828        /*output: */
    29         iomodel->my_edges=xNewZeroInit<bool>(iomodel->numberofedges);
     29        iomodel->my_edges  = xNewZeroInit<bool>(iomodel->numberofedges);
    3030
    3131        for(int i=0;i<iomodel->numberofelements;i++){
     
    3636                }
    3737        }
     38
     39        if(iomodel->meshelementtype==PentaEnum){
     40                iomodel->my_vedges = xNewZeroInit<bool>(iomodel->numberofverticaledges);
     41                iomodel->my_hedges = xNewZeroInit<bool>(iomodel->numberofhorizontaledges);
     42                for(int i=0;i<iomodel->numberofelements;i++){
     43                        if(iomodel->my_elements[i]){
     44                                for(int j=0;j<3;j++) iomodel->my_vedges[iomodel->elementtoverticaledgeconnectivity[i*3+j]]   = true;
     45                                for(int j=0;j<6;j++) iomodel->my_hedges[iomodel->elementtohorizontaledgeconnectivity[i*6+j]] = true;
     46                        }
     47                }
     48        }
    3849}
Note: See TracChangeset for help on using the changeset viewer.