Changeset 17122


Ignore:
Timestamp:
01/16/14 11:39:30 (11 years ago)
Author:
Mathieu Morlighem
Message:

NEW: added face creation and partitioning

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

Legend:

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

    r16770 r17122  
    4040                int *edges;
    4141                int *elementtoedgeconnectivity;
     42                int *elementtofaceconnectivity;
    4243                int *singlenodetoelementconnectivity;
    4344                int *numbernodetoelementconnectivity;
  • issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateFaces.cpp

    r16291 r17122  
    55#include "../../classes/classes.h"
    66#include "../../shared/shared.h"
    7 
    8 void CreateFaces(IoModel* iomodel){
     7#include "./ModelProcessorx.h"
     8
     9void CreateFaces(IoModel* iomodel){/*{{{*/
    910
    1011        /*If faces are already present, exit*/
    1112        if(iomodel->faces) return;
    1213
    13         /*Check Iomodel properties*/
    14         if(iomodel->meshtype!=Mesh2DhorizontalEnum)             _error_("only 2d model are supported");
     14        /*Some checks*/
    1515        if(iomodel->numberofvertices<3) _error_("not enough elements in mesh");
    1616        _assert_(iomodel->elements);
     17
     18        /*Check Iomodel properties*/
     19        if(iomodel->meshtype==Mesh2DhorizontalEnum){
     20                /*Keep going*/
     21        }
     22        else if(iomodel->meshtype==Mesh3DEnum){
     23                CreateFaces3d(iomodel);
     24                return;
     25        }
     26        else{
     27                _error_("mesh dimension not supported yet");
     28        }
    1729
    1830        /*Intermediaries*/
     
    3143        /*Initialize chain*/
    3244        int* head_minv = xNew<int>(iomodel->numberofvertices);
    33         int* next_edge = xNew<int>(maxnbf);
     45        int* next_face = xNew<int>(maxnbf);
    3446        for(i=0;i<iomodel->numberofvertices;i++) head_minv[i]=-1;
    3547
     
    5769                        /*Go through all processed faces connected to v1 and check whether we have seen this edge yet*/
    5870                        _assert_(v1>=0 && v1<iomodel->numberofvertices);
    59                         for(int e=head_minv[v1]; e!=-1; e=next_edge[e]){
     71                        for(int e=head_minv[v1]; e!=-1; e=next_face[e]){
    6072                                if(facestemp[e*4+1]==v2){
    6173                                        exist = true;
     
    7688
    7789                                /*Update chain*/
    78                                 next_edge[nbf] = head_minv[v1];
     90                                next_face[nbf] = head_minv[v1];
    7991                                head_minv[v1]  = nbf;
    8092
     
    8799        /*Clean up*/
    88100        xDelete<int>(head_minv);
    89         xDelete<int>(next_edge);
     101        xDelete<int>(next_face);
    90102
    91103        /*Create final faces*/
     
    109121        iomodel->faces         = faces;
    110122        iomodel->numberoffaces = nbf;
    111 }
     123}/*}}}*/
     124void CreateFaces3d(IoModel* iomodel){/*{{{*/
     125
     126        /*Intermediaries*/
     127        bool exist;
     128        int  i,j,k,v0,cols;
     129        int  maxnbf,nbf,elementnbf,elementnbv,facemaxnbv;
     130        int *elementfaces         = NULL;
     131        int *elementfaces_markers = NULL;
     132
     133        /*Maximum number of faces*/
     134        maxnbf = 6*iomodel->numberofelements;
     135
     136        /*Initialize intermediaries*/
     137        int*  facestemp = xNew<int>(maxnbf*6);         /*format: [vertex1 vertex2 vertex3 element1 element2 marker]    */
     138        for(i=0;i<maxnbf;i++) facestemp[i*6+4]=-1;     /*Initialize last column of faces as -1 (boundary face)         */
     139
     140        /*Initialize chain*/
     141        int* head_minv = xNew<int>(iomodel->numberofvertices);
     142        int* next_face = xNew<int>(maxnbf);
     143        for(i=0;i<iomodel->numberofvertices;i++) head_minv[i]=-1;
     144
     145        /*Mesh specific face indexing per element*/
     146        if(iomodel->meshtype==Mesh3DEnum){
     147                elementnbv = 6; /*Number of vertices per element*/
     148                elementnbf = 5; /*Number of faces per element*/
     149                facemaxnbv = 4; /*Maximum number of vertices per face*/
     150                cols       = facemaxnbv + 1;
     151                elementfaces         = xNew<int>(elementnbf*cols);
     152                elementfaces_markers = xNew<int>(elementnbf);
     153                /*2 triangles*/
     154                elementfaces_markers[0] = 1;
     155                elementfaces_markers[1] = 1;
     156                elementfaces[cols*0+0] = 3; elementfaces[cols*0+1] = 0;  elementfaces[cols*0+2] = 1; elementfaces[cols*0+3] = 2;
     157                elementfaces[cols*1+0] = 3; elementfaces[cols*1+1] = 3;  elementfaces[cols*1+2] = 4; elementfaces[cols*1+3] = 5;
     158                /*3 quads*/
     159                elementfaces_markers[2] = 2;
     160                elementfaces_markers[3] = 2;
     161                elementfaces_markers[4] = 2;
     162                elementfaces[cols*2+0] = 4; elementfaces[cols*2+1] = 0;  elementfaces[cols*2+2] = 1; elementfaces[cols*2+3] = 4;  elementfaces[cols*2+4] = 3;
     163                elementfaces[cols*3+0] = 4; elementfaces[cols*3+1] = 1;  elementfaces[cols*3+2] = 2; elementfaces[cols*3+3] = 5;  elementfaces[cols*3+4] = 4;
     164                elementfaces[cols*4+0] = 4; elementfaces[cols*4+1] = 2;  elementfaces[cols*4+2] = 0; elementfaces[cols*4+3] = 3;  elementfaces[cols*4+4] = 5;
     165        }
     166        else{
     167                _error_("mesh dimension not supported yet");
     168        }
     169        int *element_face_connectivity = xNewZeroInit<int>(iomodel->numberofelements*elementnbf); /*format: [face1 face2 ...] */
     170
     171        /*Initialize number of faces and list of vertex indices*/
     172        nbf = 0;
     173        int* v = xNew<int>(facemaxnbv);
     174
     175        for(i=0;i<iomodel->numberofelements;i++){
     176                for(j=0;j<elementnbf;j++){
     177
     178                        /*Get indices of current face*/
     179                        for(k=0;k<elementfaces[cols*j+0];k++){
     180                                v[k] = iomodel->elements[i*elementnbv + elementfaces[cols*j+k+1]] - 1;
     181                        }
     182
     183                        /*Sort list of vertices*/
     184                        HeapSort(v,elementfaces[cols*j+0]);
     185                        v0 = v[0];
     186
     187                        /*This face a priori has not been processed yet*/
     188                        exist = false;
     189
     190                        /*Go through all processed faces connected to v1 and check whether we have seen this edge yet*/
     191                        _assert_(v0>=0 && v0<iomodel->numberofvertices);
     192                        for(int e=head_minv[v0]; e!=-1; e=next_face[e]){
     193                                if(facestemp[e*6+1]==v[1]+1 && facestemp[e*6+2]==v[2]+1){
     194                                        exist = true;
     195                                        facestemp[e*6+4]=i+1;
     196                                        element_face_connectivity[i*elementnbf+j]=e;
     197                                        break;
     198                                }
     199                        }
     200
     201                        /*If this face is new, add it to the lists*/
     202                        if(!exist){
     203                                _assert_(nbf<maxnbf);
     204
     205                                /*Update faces*/
     206                                facestemp[nbf*6+0] = v[0]+1;
     207                                facestemp[nbf*6+1] = v[1]+1;
     208                                facestemp[nbf*6+2] = v[2]+1;
     209                                facestemp[nbf*6+3] = i+1;
     210                                facestemp[nbf*6+5] = elementfaces_markers[j];
     211
     212                                /*Update Connectivity*/
     213                                element_face_connectivity[i*elementnbf+j]=nbf;
     214
     215                                /*Update chain*/
     216                                next_face[nbf] = head_minv[v0];
     217                                head_minv[v0]  = nbf;
     218
     219                                /*Increase number of faces*/
     220                                nbf++;
     221                        }
     222                }
     223        }
     224
     225        /*Clean up*/
     226        xDelete<int>(head_minv);
     227        xDelete<int>(next_face);
     228
     229        /*Create final faces (now that we have the correct size)*/
     230        int* faces = xNew<int>(nbf*6); /*vertex1 vertex2 vertex3 element1 element2 marker*/
     231        xMemCpy<int>(faces,facestemp,nbf*6);
     232        xDelete<int>(facestemp);
     233
     234        /*Assign output pointers*/
     235        iomodel->faces                     = faces;
     236        iomodel->numberoffaces             = nbf;
     237        iomodel->elementtofaceconnectivity = element_face_connectivity;
     238}/*}}}*/
  • issm/trunk-jpl/src/c/modules/ModelProcessorx/FacesPartitioning.cpp

    r16291 r17122  
    1111
    1212        /*Intermediaries*/
    13         int  el1,el2;
    14         bool my_face;
    15 
    16         /*Check Iomodel properties*/
    17         if(iomodel->meshtype!=Mesh2DhorizontalEnum) _error_("only 2d model are supported");
     13        int elementnbf;
    1814
    1915        /*Get faces and elements*/
    2016        CreateFaces(iomodel);
     17        _assert_(iomodel->elementtofaceconnectivity);
    2118
     19        /*Mesh dependent variables*/
     20        if(iomodel->meshtype==Mesh2DhorizontalEnum){
     21                elementnbf = 3;
     22        }
     23        else if(iomodel->meshtype==Mesh2DverticalEnum){
     24                elementnbf = 3;
     25        }
     26        else if(iomodel->meshtype==Mesh3DEnum){
     27                elementnbf = 5;
     28        }
     29        else{
     30                _error_("mesh dimension not supported yet");
     31        }
    2232        /*output: */
    23         bool* my_faces=xNew<bool>(iomodel->numberoffaces);
     33        bool* my_faces=xNewZeroInit<bool>(iomodel->numberoffaces);
    2434
    25         for(int i=0;i<iomodel->numberoffaces;i++){
    26 
    27                 /*Get left and right elements*/
    28                 el1=iomodel->faces[4*i+2]-1; //faces are [node1 node2 elem1 elem2]
    29                 el2=iomodel->faces[4*i+3]-1; //faces are [node1 node2 elem1 elem2]
    30 
    31                 /*Check whether we should include this face (el2 is -2 for boundary faces)*/
    32                 my_face = iomodel->my_elements[el1];
    33                 if(!my_face && el2>=0){
    34                         my_face = iomodel->my_elements[el2];
     35        for(int i=0;i<iomodel->numberofelements;i++){
     36                if(iomodel->my_elements[i]){
     37                        for(int j=0;j<elementnbf;j++){
     38                                _assert_(iomodel->elementtofaceconnectivity[i*elementnbf+j] >= 0);
     39                                _assert_(iomodel->elementtofaceconnectivity[i*elementnbf+j] <  iomodel->numberoffaces);
     40                                my_faces[iomodel->elementtofaceconnectivity[i*elementnbf+j]] = true;
     41                        }
    3542                }
    36 
    37                 my_faces[i] = my_face;
    3843        }
    3944
  • issm/trunk-jpl/src/c/modules/ModelProcessorx/ModelProcessorx.h

    r16787 r17122  
    3030
    3131/*Mesh properties*/
     32void CreateEdges(IoModel* iomodel);
    3233void CreateFaces(IoModel* iomodel);
    33 void CreateEdges(IoModel* iomodel);
     34void CreateFaces3d(IoModel* iomodel);
    3435
    3536/*Connectivity*/
Note: See TracChangeset for help on using the changeset viewer.