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

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

Added prognostic2

File size: 5.0 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,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(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}
Note: See TracBrowser for help on using the repository browser.