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 |
|
---|
15 | void 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(exprintf("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 | }
|
---|