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

Last change on this file since 3697 was 3696, checked in by seroussi, 15 years ago

added pressure, temperature, accumulation_rate and melting_rate in CreateElementsNodes...

File size: 5.6 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 "../ModelProcessorx.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 IoModelFetchData(&iomodel->melting_rate,NULL,NULL,iomodel_handle,"melting_rate");
49 IoModelFetchData(&iomodel->accumulation_rate,NULL,NULL,iomodel_handle,"accumulation_rate");
50 IoModelFetchData(&iomodel->vx,NULL,NULL,iomodel_handle,"vx");
51 IoModelFetchData(&iomodel->vy,NULL,NULL,iomodel_handle,"vy");
52
53 for (i=0;i<iomodel->numberofelements;i++){
54
55 if(iomodel->my_elements[i]){
56
57 /*Create and add tria element to elements dataset: */
58 elements->AddObject(new Tria(i+1,i,iomodel));
59
60 /*Create and add material property to materials dataset: */
61 materials->AddObject(new Matice(i+1,i,iomodel,3));
62 }
63 }//for (i=0;i<numberofelements;i++)
64
65 /*Free data : */
66 xfree((void**)&iomodel->thickness);
67 xfree((void**)&iomodel->surface);
68 xfree((void**)&iomodel->bed);
69 xfree((void**)&iomodel->elementoniceshelf);
70 xfree((void**)&iomodel->elementonwater);
71 xfree((void**)&iomodel->melting_rate);
72 xfree((void**)&iomodel->accumulation_rate);
73 xfree((void**)&iomodel->vx);
74 xfree((void**)&iomodel->vy);
75
76 }
77 else{ // if (strcmp(meshtype,"2d")==0)
78 ISSMERROR("not implemented yet");
79 } //if (strcmp(meshtype,"2d")==0)
80
81 /*Add new constrant material property tgo materials, at the end: */
82 materials->AddObject(new Matpar(iomodel->numberofelements+1,iomodel));
83
84 /*Create nodes and vertices: */
85 IoModelFetchData(&iomodel->x,NULL,NULL,iomodel_handle,"x");
86 IoModelFetchData(&iomodel->y,NULL,NULL,iomodel_handle,"y");
87 IoModelFetchData(&iomodel->z,NULL,NULL,iomodel_handle,"z");
88 IoModelFetchData(&iomodel->thickness,NULL,NULL,iomodel_handle,"thickness");
89 IoModelFetchData(&iomodel->bed,NULL,NULL,iomodel_handle,"bed");
90 IoModelFetchData(&iomodel->gridonbed,NULL,NULL,iomodel_handle,"gridonbed");
91 IoModelFetchData(&iomodel->gridonsurface,NULL,NULL,iomodel_handle,"gridonsurface");
92 IoModelFetchData(&iomodel->gridonhutter,NULL,NULL,iomodel_handle,"gridonhutter");
93 IoModelFetchData(&iomodel->gridonicesheet,NULL,NULL,iomodel_handle,"gridonicesheet");
94 IoModelFetchData(&iomodel->gridoniceshelf,NULL,NULL,iomodel_handle,"gridoniceshelf");
95 if (strcmp(iomodel->meshtype,"3d")==0){
96 IoModelFetchData(&iomodel->deadgrids,NULL,NULL,iomodel_handle,"deadgrids");
97 IoModelFetchData(&iomodel->uppernodes,NULL,NULL,iomodel_handle,"uppergrids");
98 }
99
100 /*Build Vertices dataset*/
101 for (i=0;i<iomodel->numberofvertices;i++){
102
103 /*vertices and nodes (same number, as we are running continuous galerkin formulation: */
104 if(iomodel->my_vertices[i]){
105
106 /*Add vertex to vertices dataset: */
107 vertices->AddObject(new Vertex(i+1,i,iomodel));
108
109 }
110 }
111
112 /*Build Nodes dataset -> 3 for each element (Discontinuous Galerkin)*/
113 for (i=0;i<iomodel->numberofelements;i++){
114 for (j=0;j<3;j++){
115
116 if(iomodel->my_nodes[3*i+j]){
117
118 //Get index of the vertex on which the current node is located
119 vertex_index=(int)*(iomodel->elements+3*i+j)-1; //(Matlab to C indexing)
120 ISSMASSERT(vertex_index>=0 && vertex_index<iomodel->numberofvertices);
121
122 //Compute Node index (id-1)
123 node_index=3*i+j;
124
125 /*Add node to nodes dataset: */
126 nodes->AddObject(new Node(i+1,vertex_index,node_index,iomodel));
127
128 }
129 }
130 }
131
132 /*Clean fetched data: */
133 xfree((void**)&iomodel->deadgrids);
134 xfree((void**)&iomodel->x);
135 xfree((void**)&iomodel->y);
136 xfree((void**)&iomodel->z);
137 xfree((void**)&iomodel->thickness);
138 xfree((void**)&iomodel->bed);
139 xfree((void**)&iomodel->gridonbed);
140 xfree((void**)&iomodel->gridonsurface);
141 xfree((void**)&iomodel->gridonhutter);
142 xfree((void**)&iomodel->uppernodes);
143 xfree((void**)&iomodel->gridonicesheet);
144 xfree((void**)&iomodel->gridoniceshelf);
145
146 /*All our datasets are already order by ids. Set presort flag so that later on, when sorting is requested on these
147 * datasets, it will not be redone: */
148 elements->Presort();
149 nodes->Presort();
150 vertices->Presort();
151 materials->Presort();
152
153 cleanup_and_return:
154
155 /*Assign output pointer: */
156 *pelements=elements;
157 *pnodes=nodes;
158 *pvertices=vertices;
159 *pmaterials=materials;
160}
Note: See TracBrowser for help on using the repository browser.