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