Changeset 17844


Ignore:
Timestamp:
04/25/14 11:00:30 (11 years ago)
Author:
Mathieu Morlighem
Message:

NEW: use edgeonboundary to figure out whether an edge should be constrained or not

Location:
issm/trunk-jpl/src/c/modules
Files:
3 edited

Legend:

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

    r17842 r17844  
    4444        bool *my_edges = NULL;
    4545        bool *my_faces = NULL;
     46        bool *boundaryedge = NULL;
    4647
    4748        switch(finite_element){
     
    7475                                FacesPartitioning(&my_faces,iomodel);
    7576                        }
     77                        EdgeOnBoundaryFlags(&boundaryedge,iomodel);
    7678                        break;
    7779                case P2xP4Enum:
     
    106108                                }
    107109                                for(i=0;i<iomodel->numberofedges;i++){
    108                                         if(my_edges[i]){
     110                                        if(my_edges[i] && boundaryedge[i]){
    109111                                                v1 = iomodel->edges[3*i+0]-1;
    110112                                                v2 = iomodel->edges[3*i+1]-1;
     
    466468        xDelete<bool>(my_edges);
    467469        xDelete<bool>(my_faces);
     470        xDelete<bool>(boundaryedge);
    468471}
  • issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateEdges.cpp

    r17842 r17844  
    144144        iomodel->numberofedges             = nbe;
    145145}/*}}}*/
    146 void EdgeOnBoundaryFlags(IoModel* iomodel,bool** pflags){
    147 
    148         /*Get faces and edges*/
     146void EdgeOnBoundaryFlags(bool** pflags,IoModel* iomodel){/*{{{*/
     147
     148        /*Intermediaries*/
     149        bool isv1,isv2;
     150        int  facenbv,v1,v2;
     151        int  id_edge,id_element,id_face;
     152        int  elementnbe;
     153
     154        /*Mesh dependent variables*/
     155        switch(iomodel->meshelementtype){
     156                case TriaEnum:  elementnbe = 3; break;
     157                case TetraEnum: elementnbe = 6; break;
     158                case PentaEnum: elementnbe = 9; break;
     159                default:        _error_("mesh dimension not supported yet");
     160        }
     161
     162        /*Get edges and allocate output*/
    149163        if(!iomodel->edges) CreateEdges(iomodel);
    150         if(!iomodel->faces) CreateFaces(iomodel);
    151 
    152         /*Allocate output*/
    153         bool* flags = xNew<bool>(iomodel->numberofedges);
    154 
    155         /*Now, loop over the faces, whenever it is not connected to a second element, all edges are on boundary*/
    156         for(int i=0;i<iomodel->numberoffaces;i++){
    157 
    158                 if(iomodel->faces[i*iomodel->facescols+4]==-1){
    159 
    160                         /*Get all edges for this face*/
    161                 }
     164        bool* flags = xNewZeroInit<bool>(iomodel->numberofedges);
     165
     166        if(iomodel->domaindim==2){
     167
     168                /*Count how many times an edge is found in elementtoedgeconnectivity*/
     169                int* counter = xNewZeroInit<int>(iomodel->numberofedges);
     170                for(int i=0;i<iomodel->numberofelements;i++){
     171                        for(int j=0;j<elementnbe;j++){
     172                                counter[iomodel->elementtoedgeconnectivity[elementnbe*i+j]] += 1;
     173                        }
     174                }
     175
     176                /*Now, loop over the egdes, whenever it is not connected to a second element, the edge is on boundary*/
     177                for(int i=0;i<iomodel->numberofedges;i++){
     178                        if(counter[i]==1) flags[i]=true;
     179                }
     180
     181                /*Clean up*/
     182                xDelete<int>(counter);
     183        }
     184        else if(iomodel->domaindim==3){
     185
     186                /*Get faces*/
     187                if(!iomodel->faces) CreateFaces(iomodel);
     188
     189                /*Now, loop over the faces, whenever it is not connected to a second element, all edges are on boundary*/
     190                for(int id_face=0;id_face<iomodel->numberoffaces;id_face++){
     191
     192                        if(iomodel->faces[id_face*iomodel->facescols+1]==-1){
     193
     194                                /*The face is connected to the element e only*/
     195                                id_element = iomodel->faces[id_face*iomodel->facescols+0]-1;
     196                                facenbv    = iomodel->faces[id_face*iomodel->facescols+3];
     197
     198                                /*Get all edges for this element*/
     199                                for(int edge = 0; edge<elementnbe; edge++){
     200
     201                                        id_edge     = iomodel->elementtoedgeconnectivity[elementnbe*id_element+edge];
     202                                        v1          = iomodel->edges[id_edge*3+0];
     203                                        v2          = iomodel->edges[id_edge*3+1];
     204
     205                                        /*Test if v1 is in the face*/
     206                                        isv1=false;
     207                                        for(int i=0;i<facenbv;i++){
     208                                                if(iomodel->faces[id_face*iomodel->facescols+4+i] == v1){
     209                                                        isv1 = true; break;
     210                                                }
     211                                        }
     212                                        if(!isv1) continue;
     213
     214                                        /*test if v2 is in the face*/
     215                                        isv2=false;
     216                                        for(int i=0;i<facenbv;i++){
     217                                                if(iomodel->faces[id_face*iomodel->facescols+4+i] == v2){
     218                                                        isv2 = true; break;
     219                                                }
     220                                        }
     221
     222                                        /*If v1 and v2 are found, this edge is on boundary*/
     223                                        if(isv2) flags[id_edge] = true;
     224                                }
     225                        }
     226                }
     227        }
     228        else{
     229                _error_("dimension not supported");
    162230        }
    163231
    164232        /*Clean up and return*/
    165233        *pflags = flags;
    166 }
     234}/*}}}*/
  • issm/trunk-jpl/src/c/modules/ModelProcessorx/ModelProcessorx.h

    r17842 r17844  
    3333void CreateFaces(IoModel* iomodel);
    3434void CreateFaces3d(IoModel* iomodel);
    35 void EdgeOnBoundaryFlags(IoModel* iomodel,bool** pflags);
     35void EdgeOnBoundaryFlags(bool** pflags,IoModel* iomodel);
    3636
    3737/*Connectivity*/
Note: See TracChangeset for help on using the changeset viewer.