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

Annotation of /trunk/finley/src/Mesh_resolveNodeIds.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1388 - (hide annotations)
Fri Jan 11 07:45:58 2008 UTC (11 years, 10 months ago) by trankine
File MIME type: text/plain
File size: 5219 byte(s)
And get the *(&(*&(* name right
1 jgs 150
2 ksteube 1312 /* $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 jgs 82 /**************************************************************/
17    
18     /* Finley: Mesh */
19    
20 ksteube 1312 /* at input the element nodes refers to the numbering defined the global Id assigned to the nodes in the */
21     /* NodeFile. It is also not ensured that all nodes refered by an element is actually available */
22     /* on the process. At the output, a local node labeling is used and all nodes are available */
23     /* In particular the numbering of the element nodes is between 0 and in->NodeFile->numNodes */
24     /* The function does not create a distribution of the degrees of freedom. */
25 jgs 82
26     /**************************************************************/
27    
28     #include "Mesh.h"
29 jgs 123 #include "Util.h"
30 jgs 82
31     /**************************************************************/
32    
33     void Finley_Mesh_resolveNodeIds(Finley_Mesh* in) {
34 ksteube 1312
35     index_t min_id, max_id, min_id2, max_id2, global_min_id, global_max_id,
36     *globalToNewLocalNodeLabels=NULL, *newLocalToGlobalNodeLabels=NULL;
37     dim_t len, n, newNumNodes, numDim;
38 jgs 82 Finley_NodeFile *newNodeFile=NULL;
39 ksteube 1312 #ifdef PASO_MPI
40     index_t id_range[2], global_id_range[2];
41     #endif
42 jgs 82 numDim=Finley_Mesh_getDim(in);
43 ksteube 1312 /* find the minimum and maximum id used by elements: */
44 jgs 123 min_id=INDEX_T_MAX;
45     max_id=-INDEX_T_MAX;
46 jgs 82 Finley_ElementFile_setNodeRange(&min_id2,&max_id2,in->Elements);
47     max_id=MAX(max_id,max_id2);
48     min_id=MIN(min_id,min_id2);
49     Finley_ElementFile_setNodeRange(&min_id2,&max_id2,in->FaceElements);
50     max_id=MAX(max_id,max_id2);
51     min_id=MIN(min_id,min_id2);
52     Finley_ElementFile_setNodeRange(&min_id2,&max_id2,in->ContactElements);
53     max_id=MAX(max_id,max_id2);
54     min_id=MIN(min_id,min_id2);
55     Finley_ElementFile_setNodeRange(&min_id2,&max_id2,in->Points);
56     max_id=MAX(max_id,max_id2);
57     min_id=MIN(min_id,min_id2);
58 ksteube 1312 #ifdef PASO_MPI
59     id_range[0]=-min_id;
60     id_range[1]=max_id;
61     MPI_Allreduce( id_range, global_id_range, 2, MPI_INT, MPI_MAX, in->MPIInfo->comm );
62     global_min_id=-global_id_range[0];
63     global_max_id=global_id_range[1];
64     #else
65     global_min_id=min_id;
66     global_max_id=max_id;
67     #endif
68 jgs 82 #ifdef Finley_TRACE
69 ksteube 1312 printf("Node id range used by elements is %d:%d\n",global_min_id,global_max_id);
70 jgs 82 #endif
71 bcumming 751
72 jgs 82
73    
74 ksteube 1312 /* allocate mappings for new local node labeling to global node labeling (newLocalToGlobalNodeLabels)
75     and global node labeling to the new local node labeling (globalToNewLocalNodeLabels[i-min_id] is the
76     new local id of global node i) */
77     len=max_id-min_id+1;
78     globalToNewLocalNodeLabels=TMPMEMALLOC(len,index_t); /* local mask for used nodes */
79     newLocalToGlobalNodeLabels=TMPMEMALLOC(len,index_t);
80     if (! ( (Finley_checkPtr(globalToNewLocalNodeLabels) && Finley_checkPtr(newLocalToGlobalNodeLabels) ) ) ) {
81 jgs 82
82 ksteube 1312 #pragma omp parallel
83     {
84     #pragma omp for private(n) schedule(static)
85     for (n=0;n<len;n++) newLocalToGlobalNodeLabels[n]=-1;
86     #pragma omp for private(n) schedule(static)
87     for (n=0;n<len;n++) globalToNewLocalNodeLabels[n]=-1;
88     }
89 jgs 82
90 ksteube 1312 /* mark the nodes referred by elements in globalToNewLocalNodeLabels which is currently used as a mask: */
91 jgs 82
92 ksteube 1312 Finley_Mesh_markNodes(globalToNewLocalNodeLabels,min_id,in,FALSE);
93 jgs 82
94 ksteube 1312 /* create a local labeling newLocalToGlobalNodeLabels of the local nodes by packing the mask globalToNewLocalNodeLabels*/
95 jgs 82
96 ksteube 1312 newNumNodes=Finley_Util_packMask(len,globalToNewLocalNodeLabels,newLocalToGlobalNodeLabels);
97 bcumming 730
98 ksteube 1312 /* invert the new labeling and shift the index newLocalToGlobalNodeLabels to global node ids */
99     #pragma omp parallel for private(n) schedule(static)
100     for (n=0;n<newNumNodes;n++) {
101 ksteube 1326 #ifdef BOUNDS_CHECK
102     if (n >= len || n < 0) { printf("BOUNDS_CHECK %s %d n=%d\n", __FILE__, __LINE__, n); exit(1); }
103     if (newLocalToGlobalNodeLabels[n] >= len || newLocalToGlobalNodeLabels[n] < 0) { printf("BOUNDS_CHECK %s %d n=%d\n", __FILE__, __LINE__, n); exit(1); }
104     #endif
105 ksteube 1312 globalToNewLocalNodeLabels[newLocalToGlobalNodeLabels[n]]=n;
106     newLocalToGlobalNodeLabels[n]+=min_id;
107     }
108     /* create a new table */
109     newNodeFile=Finley_NodeFile_alloc(numDim,in->MPIInfo);
110     if (Finley_noError()) {
111     Finley_NodeFile_allocTable(newNodeFile,newNumNodes);
112     }
113     if (Finley_noError())
114     Finley_NodeFile_gather_global(newLocalToGlobalNodeLabels,in->Nodes, newNodeFile);
115     if (Finley_noError()) {
116     Finley_NodeFile_free(in->Nodes);
117     in->Nodes=newNodeFile;
118     /* relable nodes of the elements: */
119     Finley_Mesh_relableElementNodes(globalToNewLocalNodeLabels,min_id,in);
120     }
121 jgs 82 }
122 ksteube 1312 TMPMEMFREE(globalToNewLocalNodeLabels);
123     TMPMEMFREE(newLocalToGlobalNodeLabels);
124     if (! Finley_noError()) {
125     Finley_NodeFile_free(newNodeFile);
126     }
127 jgs 82 }

Properties

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

  ViewVC Help
Powered by ViewVC 1.1.26