2
/*******************************************************
4
* Copyright (c) 2003-2010 by University of Queensland
5
* Earth Systems Science Computational Center (ESSCC)
6
* http://www.uq.edu.au/esscc
8
* Primary Business: Queensland, Australia
9
* Licensed under the Open Software License version 3.0
10
* http://www.opensource.org/licenses/osl-3.0.php
12
*******************************************************/
14
/**************************************************************/
16
/* writes data and mesh in an opendx file */
17
/* the input data needs to be cell centered or on reducedNodes */
19
/**************************************************************/
24
/**************************************************************/
26
void Dudley_Mesh_saveDX(const char *filename_p, Dudley_Mesh * mesh_p, const dim_t num_data, char **names_p,
27
escriptDataC * *data_pp)
29
char error_msg[LenErrorMsg_MAX], elemTypeStr[32];
30
/* some tables needed for reordering */
33
{0, 1, 2}, /* triagle */
34
{0, 1, 2, 3}, /* tetrahedron */
35
{0, 3, 1, 2}, /* quadrilateral */
36
{3, 0, 7, 4, 2, 1, 6, 5}, /* hexahedron */
38
FILE *fileHandle_p = NULL;
39
int i, j, k, i_data, elementtype, numPoints = 0, nDim, *resortIndex = NULL, p,
40
numDXNodesPerElement = 0, numCells, NN, object_count, rank, nComp, numPointsPerSample;
41
__const double *values;
43
bool_t *isCellCentered = NULL;
44
Dudley_ElementFile *elements = NULL;
45
Dudley_ElementTypeId TypeId;
46
/* open the file and check handel */
48
/* if there is no mesh we just return */
51
isCellCentered = MEMALLOC(num_data, bool_t);
52
if (Dudley_checkPtr(isCellCentered))
55
fileHandle_p = fopen(filename_p, "w");
56
if (fileHandle_p == NULL)
58
sprintf(error_msg, "File %s could not be opened for writing.", filename_p);
59
MEMFREE(isCellCentered);
61
Dudley_setError(IO_ERROR, error_msg);
64
/* find the mesh type to be written */
65
elementtype = DUDLEY_UNKNOWN;
66
for (i_data = 0; i_data < num_data; ++i_data)
68
if (!isEmpty(data_pp[i_data]))
70
switch (getFunctionSpaceType(data_pp[i_data]))
72
case DUDLEY_REDUCED_NODES:
73
if (elementtype == DUDLEY_UNKNOWN || elementtype == DUDLEY_ELEMENTS)
75
elementtype = DUDLEY_ELEMENTS;
79
Dudley_setError(TYPE_ERROR, "saveDX: cannot write given data into single file.");
80
MEMFREE(isCellCentered);
84
isCellCentered[i_data] = FALSE;
87
case DUDLEY_REDUCED_ELEMENTS:
88
if (elementtype == DUDLEY_UNKNOWN || elementtype == DUDLEY_ELEMENTS)
90
elementtype = DUDLEY_ELEMENTS;
94
Dudley_setError(TYPE_ERROR, "saveDX: cannot write given data into single file.");
95
MEMFREE(isCellCentered);
99
isCellCentered[i_data] = TRUE;
101
case DUDLEY_FACE_ELEMENTS:
102
case DUDLEY_REDUCED_FACE_ELEMENTS:
103
if (elementtype == DUDLEY_UNKNOWN || elementtype == DUDLEY_FACE_ELEMENTS)
105
elementtype = DUDLEY_FACE_ELEMENTS;
109
Dudley_setError(TYPE_ERROR, "saveDX: cannot write given data into single file.");
110
MEMFREE(isCellCentered);
111
fclose(fileHandle_p);
114
isCellCentered[i_data] = TRUE;
117
if (elementtype == DUDLEY_UNKNOWN || elementtype == DUDLEY_POINTS)
119
elementtype = DUDLEY_POINTS;
123
Dudley_setError(TYPE_ERROR, "saveDX: cannot write given data into single file.");
124
MEMFREE(isCellCentered);
125
fclose(fileHandle_p);
128
isCellCentered[i_data] = TRUE;
131
sprintf(error_msg, "saveDX: I don't know how to handle function space type %d",
132
getFunctionSpaceType(data_pp[i_data]));
133
Dudley_setError(TYPE_ERROR, error_msg);
134
MEMFREE(isCellCentered);
135
fclose(fileHandle_p);
140
/* select number of points and the mesh component */
141
numPoints = mesh_p->Nodes->reducedNodesMapping->numTargets;
142
nDim = mesh_p->Nodes->numDim;
143
if (elementtype == DUDLEY_UNKNOWN)
144
elementtype = DUDLEY_ELEMENTS;
147
case DUDLEY_ELEMENTS:
148
elements = mesh_p->Elements;
150
case DUDLEY_FACE_ELEMENTS:
151
elements = mesh_p->FaceElements;
154
elements = mesh_p->Points;
157
if (elements == NULL)
159
Dudley_setError(SYSTEM_ERROR, "saveDX: undefined element file");
160
MEMFREE(isCellCentered);
161
fclose(fileHandle_p);
165
/* map dudley element type to DX element type */
166
TypeId = elements->etype;
167
numDXNodesPerElement = 0;
168
numCells = elements->numElements;
169
if (TypeId == Dudley_Line2)
171
numDXNodesPerElement = 2;
172
resortIndex = resort[0];
173
strcpy(elemTypeStr, "lines");
175
else if (TypeId == Dudley_Tri3)
177
numDXNodesPerElement = 3;
178
resortIndex = resort[1];
179
strcpy(elemTypeStr, "triangles");
180
/* } else if (TypeId==Rec4 || TypeId==Rec8 || TypeId==Rec9 || TypeId==Rec12 || TypeId==Rec16 || TypeId==Rec9Macro ) {
181
numDXNodesPerElement = 4;
182
resortIndex=resort[3];
183
strcpy(elemTypeStr, "quads");*/
185
else if (TypeId == Dudley_Tet4)
187
numDXNodesPerElement = 4;
188
resortIndex = resort[2];
189
strcpy(elemTypeStr, "tetrahedra");
190
/* } else if (TypeId==Hex8 || TypeId==Hex20 || TypeId==Hex32 ) {
191
numDXNodesPerElement = 8;
192
resortIndex=resort[4];
193
strcpy(elemTypeStr, "cubes");*/
197
sprintf(error_msg, "saveDX: Element type %s is not supported by DX", elements->ename);
198
Dudley_setError(VALUE_ERROR, error_msg);
199
MEMFREE(isCellCentered);
200
fclose(fileHandle_p);
205
fprintf(fileHandle_p, "object 1 class array type float rank 1 shape %d items %d data follows\n", nDim, numPoints);
206
for (i = 0; i < numPoints; i++)
208
p = mesh_p->Nodes->reducedNodesMapping->map[i];
209
for (j = 0; j < nDim; j++)
210
fprintf(fileHandle_p, " %g", mesh_p->Nodes->Coordinates[INDEX2(j, p, nDim)]);
211
fprintf(fileHandle_p, "\n");
213
/* connection table */
214
NN = elements->numNodes;
215
fprintf(fileHandle_p, "object 2 class array type int rank 1 shape %d items %d data follows\n", numDXNodesPerElement,
217
for (i = 0; i < numCells; i++)
219
for (j = 0; j < numDXNodesPerElement; j++)
220
fprintf(fileHandle_p, " %d",
221
mesh_p->Nodes->reducedNodesMapping->target[elements->Nodes[INDEX2(resortIndex[j], i, NN)]]);
222
fprintf(fileHandle_p, "\n");
224
fprintf(fileHandle_p, "attribute \"element type\" string \"%s\"\n", elemTypeStr);
225
fprintf(fileHandle_p, "attribute \"ref\" string \"positions\"\n");
229
for (i_data = 0; i_data < num_data; ++i_data)
231
if (!isEmpty(data_pp[i_data]))
234
rank = getDataPointRank(data_pp[i_data]);
235
nComp = getDataPointSize(data_pp[i_data]);
236
fprintf(fileHandle_p, "object %d class array type float rank %d ", object_count, rank);
239
fprintf(fileHandle_p, "shape ");
240
for (i = 0; i < rank; i++)
241
fprintf(fileHandle_p, "%d ", getDataPointShape(data_pp[i_data], i));
243
if (isCellCentered[i_data])
245
if (Dudley_Assemble_reducedIntegrationOrder(data_pp[i_data]))
247
numPointsPerSample = (elements->numLocalDim == 0) ? 0 : 1;
251
numPointsPerSample = (elements->numLocalDim == 0) ? 0 : (elements->numLocalDim + 1);
253
if (numPointsPerSample > 0)
255
fprintf(fileHandle_p, "items %d data follows\n", numCells);
256
for (i = 0; i < elements->numElements; i++)
258
values = getSampleDataRO(data_pp[i_data], i);
259
for (k = 0; k < nComp; k++)
261
if (isExpanded(data_pp[i_data]))
264
for (j = 0; j < numPointsPerSample; j++)
265
rtmp += values[INDEX2(k, j, nComp)];
266
fprintf(fileHandle_p, " %g", rtmp / numPointsPerSample);
270
fprintf(fileHandle_p, " %g", values[k]);
273
fprintf(fileHandle_p, "\n");
275
fprintf(fileHandle_p, "attribute \"dep\" string \"connections\"\n");
280
fprintf(fileHandle_p, "items %d data follows\n", numPoints);
281
for (i = 0; i < numPoints; i++)
283
values = getSampleDataRO(data_pp[i_data], i);
284
for (k = 0; k < nComp; k++)
285
fprintf(fileHandle_p, " %g", values[k]);
286
fprintf(fileHandle_p, "\n");
288
fprintf(fileHandle_p, "attribute \"dep\" string \"positions\"\n");
293
/* and finish it up */
296
fprintf(fileHandle_p, "object %d class field\n", object_count + 1);
297
fprintf(fileHandle_p, "component \"positions\" value 1\n");
298
fprintf(fileHandle_p, "component \"connections\" value 2\n");
303
for (i_data = 0; i_data < num_data; ++i_data)
305
if (!isEmpty(data_pp[i_data]))
308
fprintf(fileHandle_p, "object \"%s\" class field\n", names_p[i_data]);
309
fprintf(fileHandle_p, "component \"positions\" value 1\n");
310
fprintf(fileHandle_p, "component \"connections\" value 2\n");
311
fprintf(fileHandle_p, "component \"data\" value %d\n", object_count);
315
fprintf(fileHandle_p, "end\n");
317
fclose(fileHandle_p);
318
MEMFREE(isCellCentered);