source: issm/trunk/src/c/ModelProcessorx/Prognostic2/CreateElementsNodesAndMaterialsPrognostic2.cpp@ 3570

Last change on this file since 3570 was 3570, checked in by Mathieu Morlighem, 15 years ago

removed exprintf of all ISSMERROR (not needed anymore)
Fixed Discontinuous Galerkin (missing thickness in inflow BC)"

File size: 5.1 KB
Line 
1/*
2 * CreateElementsNodesAndMaterialsPrognostic2.c:
3 */
4
5#include "../../DataSet/DataSet.h"
6#include "../../toolkits/toolkits.h"
7#include "../../EnumDefinitions/EnumDefinitions.h"
8#include "../../objects/objects.h"
9#include "../../shared/shared.h"
10#include "../../include/macros.h"
11#include "../../include/typedefs.h"
12#include "../../MeshPartitionx/MeshPartitionx.h"
13#include "../IoModel.h"
14
15void CreateElementsNodesAndMaterialsPrognostic2(DataSet** pelements,DataSet** pnodes, DataSet** pvertices,DataSet** pmaterials, IoModel* iomodel,ConstDataHandle iomodel_handle){
16
17 /*Intermediary*/
18 int i,j;
19 int vertex_index;
20 int node_index;
21
22 /*DataSets: */
23 DataSet* elements = NULL;
24 DataSet* nodes = NULL;
25 DataSet* vertices = NULL;
26 DataSet* materials = NULL;
27
28 /*First create the elements, nodes and material properties: */
29 elements = new DataSet(ElementsEnum);
30 nodes = new DataSet(NodesEnum);
31 vertices = new DataSet(VerticesEnum);
32 materials = new DataSet(MaterialsEnum);
33
34 /*Partition elements and vertices and nodes: */
35 Partitioning(&iomodel->my_elements, &iomodel->my_vertices, &iomodel->my_nodes, &iomodel->my_bordervertices, iomodel, iomodel_handle);
36
37 /*elements created vary if we are dealing with a 2d mesh, or a 3d mesh: */
38 /*2d mesh: */
39 if (strcmp(iomodel->meshtype,"2d")==0){
40
41 /*Fetch data needed: */
42 IoModelFetchData(&iomodel->elements,NULL,NULL,iomodel_handle,"elements");
43 IoModelFetchData(&iomodel->thickness,NULL,NULL,iomodel_handle,"thickness");
44 IoModelFetchData(&iomodel->surface,NULL,NULL,iomodel_handle,"surface");
45 IoModelFetchData(&iomodel->bed,NULL,NULL,iomodel_handle,"bed");
46 IoModelFetchData(&iomodel->elementoniceshelf,NULL,NULL,iomodel_handle,"elementoniceshelf");
47 IoModelFetchData(&iomodel->elementonwater,NULL,NULL,iomodel_handle,"elementonwater");
48
49 for (i=0;i<iomodel->numberofelements;i++){
50
51 if(iomodel->my_elements[i]){
52
53 /*Create and add tria element to elements dataset: */
54 elements->AddObject(new Tria(i,iomodel));
55
56 /*Create and add material property to materials dataset: */
57 materials->AddObject(new Matice(i,iomodel,3));
58 }
59 }//for (i=0;i<numberofelements;i++)
60
61 /*Free data : */
62 xfree((void**)&iomodel->thickness);
63 xfree((void**)&iomodel->surface);
64 xfree((void**)&iomodel->bed);
65 xfree((void**)&iomodel->elementoniceshelf);
66 xfree((void**)&iomodel->elementonwater);
67
68 }
69 else{ // if (strcmp(meshtype,"2d")==0)
70 ISSMERROR("not implemented yet");
71 } //if (strcmp(meshtype,"2d")==0)
72
73 /*Add new constrant material property tgo materials, at the end: */
74 materials->AddObject(new Matpar(iomodel));
75
76 /*Create nodes and vertices: */
77 IoModelFetchData(&iomodel->x,NULL,NULL,iomodel_handle,"x");
78 IoModelFetchData(&iomodel->y,NULL,NULL,iomodel_handle,"y");
79 IoModelFetchData(&iomodel->z,NULL,NULL,iomodel_handle,"z");
80 IoModelFetchData(&iomodel->thickness,NULL,NULL,iomodel_handle,"thickness");
81 IoModelFetchData(&iomodel->bed,NULL,NULL,iomodel_handle,"bed");
82 IoModelFetchData(&iomodel->gridonbed,NULL,NULL,iomodel_handle,"gridonbed");
83 IoModelFetchData(&iomodel->gridonsurface,NULL,NULL,iomodel_handle,"gridonsurface");
84 IoModelFetchData(&iomodel->gridonhutter,NULL,NULL,iomodel_handle,"gridonhutter");
85 IoModelFetchData(&iomodel->gridonicesheet,NULL,NULL,iomodel_handle,"gridonicesheet");
86 IoModelFetchData(&iomodel->gridoniceshelf,NULL,NULL,iomodel_handle,"gridoniceshelf");
87 if (strcmp(iomodel->meshtype,"3d")==0){
88 IoModelFetchData(&iomodel->deadgrids,NULL,NULL,iomodel_handle,"deadgrids");
89 IoModelFetchData(&iomodel->uppernodes,NULL,NULL,iomodel_handle,"uppergrids");
90 }
91
92 /*Build Vertices dataset*/
93 for (i=0;i<iomodel->numberofvertices;i++){
94
95 /*vertices and nodes (same number, as we are running continuous galerkin formulation: */
96 if(iomodel->my_vertices[i]){
97
98 /*Add vertex to vertices dataset: */
99 vertices->AddObject(new Vertex(i,iomodel));
100
101 }
102 }
103
104 /*Build Nodes dataset -> 3 for each element (Discontinuous Galerkin)*/
105 for (i=0;i<iomodel->numberofelements;i++){
106 for (j=0;j<3;j++){
107
108 if(iomodel->my_nodes[3*i+j]){
109
110 //Get index of the vertex on which the current node is located
111 vertex_index=(int)*(iomodel->elements+3*i+j)-1; //(Matlab to C indexing)
112 ISSMASSERT(vertex_index>=0 && vertex_index<iomodel->numberofvertices);
113
114 //Compute Node index (id-1)
115 node_index=3*i+j;
116
117 /*Add node to nodes dataset: */
118 nodes->AddObject(new Node(vertex_index,node_index,iomodel));
119
120 }
121 }
122 }
123
124 /*Clean fetched data: */
125 xfree((void**)&iomodel->deadgrids);
126 xfree((void**)&iomodel->x);
127 xfree((void**)&iomodel->y);
128 xfree((void**)&iomodel->z);
129 xfree((void**)&iomodel->thickness);
130 xfree((void**)&iomodel->bed);
131 xfree((void**)&iomodel->gridonbed);
132 xfree((void**)&iomodel->gridonsurface);
133 xfree((void**)&iomodel->gridonhutter);
134 xfree((void**)&iomodel->uppernodes);
135 xfree((void**)&iomodel->gridonicesheet);
136 xfree((void**)&iomodel->gridoniceshelf);
137
138 /*All our datasets are already order by ids. Set presort flag so that later on, when sorting is requested on these
139 * datasets, it will not be redone: */
140 elements->Presort();
141 nodes->Presort();
142 vertices->Presort();
143 materials->Presort();
144
145 cleanup_and_return:
146
147 /*Assign output pointer: */
148 *pelements=elements;
149 *pnodes=nodes;
150 *pvertices=vertices;
151 *pmaterials=materials;
152}
Note: See TracBrowser for help on using the repository browser.