/[escript]/trunk/finley/src/Mesh_joinFaces.c
ViewVC logotype

Contents of /trunk/finley/src/Mesh_joinFaces.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1312 - (show annotations)
Mon Sep 24 06:18:44 2007 UTC (11 years, 11 months ago) by ksteube
File MIME type: text/plain
File size: 6002 byte(s)
The MPI branch is hereby closed. All future work should be in trunk.

Previously in revision 1295 I merged the latest changes to trunk into trunk-mpi-branch.
In this revision I copied all files from trunk-mpi-branch over the corresponding
trunk files. I did not use 'svn merge', it was a copy.

1
2 /* $Id$ */
3
4 /*******************************************************
5 *
6 * Copyright 2003-2007 by ACceSS MNRF
7 * Copyright 2007 by University of Queensland
8 *
9 * http://esscc.uq.edu.au
10 * Primary Business: Queensland, Australia
11 * Licensed under the Open Software License version 3.0
12 * http://www.opensource.org/licenses/osl-3.0.php
13 *
14 *******************************************************/
15
16 /**************************************************************/
17
18 /* Finley: Mesh */
19
20 /* detects faces in the mesh that match and replaces it by step elements */
21
22 /**************************************************************/
23
24 #include "Mesh.h"
25
26 /**************************************************************/
27
28 void Finley_Mesh_joinFaces(Finley_Mesh* self,double safety_factor,double tolerance, bool_t optimize) {
29
30 char error_msg[LenErrorMsg_MAX];
31 index_t e0,e1,*elem1=NULL,*elem0=NULL,*elem_mask=NULL,*matching_nodes_in_elem1=NULL;
32 Finley_ElementFile *newFaceElementsFile=NULL,*newContactElementsFile=NULL;
33 dim_t e,i,numPairs, NN, NN_Contact,c, new_numFaceElements;
34
35 if (self->MPIInfo->size>1) {
36 Finley_setError(TYPE_ERROR,"Finley_Mesh_joinFaces: MPI is not supported yet.");
37 return;
38 }
39 if (self->FaceElements==NULL) return;
40
41 if (self->FaceElements->ReferenceElement->Type->numNodesOnFace<=0) {
42 sprintf(error_msg,"Finley_Mesh_joinFaces:joining faces cannot be applied to face elements of type %s",self->FaceElements->ReferenceElement->Type->Name);
43 Finley_setError(TYPE_ERROR,error_msg);
44 return;
45 }
46 if (self->ContactElements==NULL) {
47 Finley_setError(TYPE_ERROR,"Finley_Mesh_joinFaces: no contact element file present.");
48 return;
49 }
50
51 NN=self->FaceElements->ReferenceElement->Type->numNodes;
52 NN_Contact=self->ContactElements->ReferenceElement->Type->numNodes;
53
54 if (2*NN!=NN_Contact) {
55 sprintf(error_msg,"Finley_Mesh_joinFaces:contact element file for %s cannot hold elements created from face elements %s",
56 self->ContactElements->ReferenceElement->Type->Name,self->FaceElements->ReferenceElement->Type->Name);
57 Finley_setError(TYPE_ERROR,error_msg);
58 return;
59 }
60
61 /* allocate work arrays */
62 elem1=TMPMEMALLOC(self->FaceElements->numElements,index_t);
63 elem0=TMPMEMALLOC(self->FaceElements->numElements,index_t);
64 elem_mask=TMPMEMALLOC(self->FaceElements->numElements,index_t);
65 matching_nodes_in_elem1=TMPMEMALLOC(self->FaceElements->numElements*NN,index_t);
66
67 if (!(Finley_checkPtr(elem1) || Finley_checkPtr(elem0) || Finley_checkPtr(elem_mask) || Finley_checkPtr(matching_nodes_in_elem1))) {
68 /* find the matching face elements */
69 Finley_Mesh_findMatchingFaces(self->Nodes,self->FaceElements,safety_factor,tolerance,&numPairs,elem0,elem1,matching_nodes_in_elem1);
70 if (Finley_noError()) {
71 /* get a list of the face elements to be kept */
72 #pragma omp parallel for private(e) schedule(static)
73 for(e=0;e<self->FaceElements->numElements;e++) elem_mask[e]=1;
74 for(e=0;e<numPairs;e++) {
75 elem_mask[elem0[e]]=0;
76 elem_mask[elem1[e]]=0;
77 }
78 new_numFaceElements=0;
79 /* OMP */
80 for(e=0;e<self->FaceElements->numElements;e++) {
81 if (elem_mask[e]>0) {
82 elem_mask[new_numFaceElements]=e;
83 new_numFaceElements++;
84 }
85 }
86 /* allocate new face element and Contact element files */
87 newContactElementsFile=Finley_ElementFile_alloc(self->ContactElements->ReferenceElement->Type->TypeId,self->ContactElements->order,self->ContactElements->reduced_order, self->MPIInfo);
88 newFaceElementsFile=Finley_ElementFile_alloc(self->FaceElements->ReferenceElement->Type->TypeId,self->FaceElements->order,self->FaceElements->reduced_order, self->MPIInfo);
89 if (Finley_noError()) {
90 Finley_ElementFile_allocTable(newContactElementsFile,numPairs+self->ContactElements->numElements);
91 Finley_ElementFile_allocTable(newFaceElementsFile,new_numFaceElements);
92 }
93 /* copy the old elements over */
94 if (Finley_noError()) {
95 /* get the face elements which are still in use:*/
96 Finley_ElementFile_gather(elem_mask,self->FaceElements,newFaceElementsFile);
97 /* get the Contact elements which are still in use:*/
98 Finley_ElementFile_copyTable(0,newContactElementsFile,0,0,self->ContactElements);
99 c=self->ContactElements->numElements;
100 /* OMP */
101 for (e=0;e<numPairs;e++) {
102 e0=elem0[e];
103 e1=elem1[e];
104 newContactElementsFile->Id[c]=MIN(self->FaceElements->Id[e0],self->FaceElements->Id[e1]);
105 newContactElementsFile->Tag[c]=MIN(self->FaceElements->Tag[e0],self->FaceElements->Tag[e1]);
106 newContactElementsFile->Color[c]=e;
107 for (i=0;i<NN;i++) newContactElementsFile->Nodes[INDEX2(i,c,NN_Contact)]=self->FaceElements->Nodes[INDEX2(i,e0,NN)];
108 for (i=0;i<NN;i++) newContactElementsFile->Nodes[INDEX2(i+NN,c,NN_Contact)]=matching_nodes_in_elem1[INDEX2(i,e,NN)];
109 c++;
110 }
111 newContactElementsFile->minColor=0;
112 newContactElementsFile->maxColor=numPairs-1;
113 }
114 /* set new face and Contact elements */
115 if (Finley_noError()) {
116
117 Finley_ElementFile_free(self->FaceElements);
118 self->FaceElements=newFaceElementsFile;
119 Finley_ElementFile_free(self->ContactElements);
120 self->ContactElements=newContactElementsFile;
121 Finley_Mesh_prepare(self, optimize);
122
123 } else {
124 Finley_ElementFile_free(newFaceElementsFile);
125 Finley_ElementFile_free(newContactElementsFile);
126 }
127 }
128 }
129 TMPMEMFREE(elem1);
130 TMPMEMFREE(elem0);
131 TMPMEMFREE(matching_nodes_in_elem1);
132 TMPMEMFREE(elem_mask);
133 }

Properties

Name Value
svn:eol-style native
svn:keywords Author Date Id Revision

  ViewVC Help
Powered by ViewVC 1.1.26