"SfR Fresh" - the SfR Freeware/Shareware Archive 
Member "eas3pkg/eas3pkg/eas3llc/create.c" of archive eas3pkg_v1.6.3.tar.gz:
As a special service "SfR Fresh" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting with prefixed line numbers.
Alternatively you can here view or download the uninterpreted source code file.
That can be also achieved for any archive member file by clicking within an archive contents listing on the first character of the file(path) respectively on the according byte size field.
1 /*-------------------------------------------------------------------------------------------------------*/
2 /* EAS3 License */
3 /* */
4 /* Copyright (c) 2006 Institut fuer Aerodynamik und Gasdynamik, Universitaet Stuttgart */
5 /* */
6 /* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and */
7 /* associated documentation files (the "Software"), to deal in the Software without restriction, */
8 /* including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, */
9 /* and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, */
10 /* subject to the following conditions: */
11 /* */
12 /* The above copyright notice and this permission notice shall be included in all copies or substantial */
13 /* portions of the Software. */
14 /* */
15 /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT */
16 /* LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */
17 /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER */
18 /* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION */
19 /* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
20 /*-------------------------------------------------------------------------------------------------------*/
21
22 /* ------------------------------------------------------------------------
23 * project: eas3llc
24 * file: create.c
25 * author: David Eller <david.eller@studserv.uni-stuttgart.de>
26 * December 1999
27 * Daniel Meyer 01/2000-07/2000
28 * Kai Augustin 02/2000
29 * ------------------------------------------------------------------------
30 * Beispielprogramm fuer die Verwendung der eas3llc-Routinen:
31 * Erzeugt eine EAS2 und eine EAS3-Datei, logarithmiert dann alle Werte
32 * in der zweiten Datei.
33 * ------------------------------------------------------------------------ */
34
35 #include <stdlib.h>
36 #include <stdio.h>
37 #include <string.h>
38 #include <math.h>
39
40 #include "eas3llc.h"
41
42 /* Beispiele fuer die Erzeugung von EAS-Dateien */
43 eas3Hdr *createEas3Testfile(const Int32 filenr, const char *fn);
44 eas3Hdr *createEas2Testfile(const Int32 filenr, const char *fn);
45
46 /* Testfunktion */
47 DefaultFloat wave(Int32 z, Int32 p, Int32 i, Int32 j, Int32 k);
48
49 int main(void)
50 {
51 eas3Hdr *eas2ks, *eas3ks, *lks;
52 DefaultFloat val;
53
54 Int32 z, p, i, j, k;
55
56 eas3Par *prm, *prm2 ;
57
58 /* Testdatei EAS2 erzeugen */
59 eas2ks = createEas2Testfile(1,"test.eas2");
60 printf("Berechnete Dateilaenge: %ld Bytes\n",(long) eas3_getFileLen(1));
61
62
63 /* EAS2-Datei beschreiben */
64
65 eas3_printHdr(eas2ks,stdout);
66
67 /* Parameterbereich fuer File holen */
68 prm = eas3_getPar(1) ;
69 /* Parameter beschreiben */
70 for (z=1; z<=eas2ks->nzs; z++)
71 for (p=1; p<=eas2ks->npar; p++)
72 {
73 for (k=1; k<=eas2ks->ndim3; k++)
74 for (j=1; j<=eas2ks->ndim2; j++)
75 for (i=1; i<=eas2ks->ndim1; i++)
76 {
77 val = wave(z,p,i,j,k);
78 eas3_setValue(prm, val, i, j, k);
79 }
80 eas3_writePar(1,prm, z, p);
81 }
82
83 /* Speicher von eas3Hdr wieder freigeben */
84 eas3_freeHdr(&eas2ks);
85
86 /* Datei wieder schliessen und */
87 eas3_closeFile(1);
88
89 /* Testdatei EAS3 erzeugen und zum random-access-schreiben oeffnen */
90 eas3ks = createEas3Testfile(2,"test.eas3");
91 printf("Berechnete Dateilaenge: %ld Bytes\n",(long) eas3_getFileLen(2)) ;
92
93 eas3_printHdr(eas3ks,stdout);
94
95 /* pruefen, ob Parameter geschrieben werden duerfen */
96 if ( !(eas3_isWriteable(2)) )
97 eas3_printFErr("main: Datei nicht schreibbar", __FILE__, __LINE__);
98
99 prm = eas3_getPar(2) ;
100 puts("Schreibschleife ueber Parameter...");
101 puts("Letzter Zeitschritt zuerst");
102 for (z=eas3ks->nzs;z>0; z--)
103 for (p=1; p<=eas3ks->npar; p++)
104 {
105 /* Parameterschleife */
106 for (k=1; k<=eas3ks->ndim3; k++)
107 for (j=1; j<=eas3ks->ndim2; j++)
108 for (i=1; i<=eas3ks->ndim1; i++)
109 {
110 /* Wert im Parameter setzen */
111 val = wave(z,p,i,j,k);
112 eas3_setValue(prm,val, i, j, k);
113 /*eas3_setValue(prm,
114 10000*z+1000*p+100*i+10*j+k, i, j, k); */
115 }
116 eas3_writePar(2,prm, z, p);
117 }
118
119 /* Speicher von eas3Hdr und eas3FileStruct wieder freigeben */
120 eas3_freeHdr(&eas3ks);
121
122 eas3_closeFile(2);
123
124 /* Schreiboperationen abgeschlossen, Leseoperation ausprobieren.
125 * dazu im read-only-Modus oeffnen */
126 eas3ks = eas3_readHdr(3,"test.eas2",EAS3_RO) ;
127
128 eas3_printHdr(eas3ks,stdout);
129
130 /* Parameter holen und Zahlenwert extrahieren */
131 prm = eas3_readPar(3, 1, 3);
132 val = eas3_getValue(prm, 2, 4, 1);
133 printf("Datei: %s; Wert bei (1,3,2,4,1) = %f\n\n",
134 eas3_getFileName(3), val);
135
136 /* Speicher von eas3Hdr und eas3FileStruct wieder freigeben */
137 eas3_freeHdr(&eas3ks);
138
139 eas3_closeFile(3);
140
141 /* Ein weiteres Beispiel : Komplette Datei logarithmieren
142 * Zuerst wird der vorhandene Datenfile geklont */
143
144 puts("Logarithmiere Datenfile...");
145
146 /* Kennsatz holen */
147 eas3ks = eas3_readHdr(4,"test.eas3",EAS3_RO);
148
149 eas3_printHdr(eas3ks,stdout);
150
151 /* eas3_printHdr(eas3ks,stdout); */
152
153 /* Kennsatz kopieren */
154 lks = eas3_copyHdr(eas3ks);
155
156 /* Kennsatz modifizieren */
157 for (i=0; i<lks->nzs; i++)
158 sprintf(lks->zsattr[i], "log10(zs%d)", i+1);
159
160 for (i=0; i<lks->npar; i++)
161 sprintf(lks->parattr[i], "log10(p%d)", i+1);
162
163
164 /* Was passiert, wenn man hier die Daten des Kennsatzes modifiziert? */
165 /* for (i=0; i<5; i++)
166 * lks->gmode[i] = EAS3_NO_G; */
167
168 /* Ausgabedatei oeffnen und Kennsatz schreiben */
169 eas3_writeHdr(5,"test.logar.dat", lks, EAS3_RW) ;
170
171 prm = eas3_getPar(4) ;
172 prm2 = eas3_getPar(5) ;
173 for (z=1; z<=eas3ks->nzs; z++)
174 for (p=1; p<=eas3ks->npar; p++)
175 {
176 prm = eas3_readPar(4, z, p);
177 eas3_copyPar(prm, prm2,EAS3_CORD_XY);
178 eas3_applyFunction(prm2, log10);
179 eas3_writePar(5, prm2, z, p);
180 }
181
182 prm = eas3_readPar(4, 1, 3);
183 printf("Alter Wert bei (1,3,2,4,2) (%s) = %f\n",
184 eas3_getFileName(4), eas3_getValue(prm, 2, 4, 1));
185
186 eas3_closeFile(4);
187
188 prm2 = eas3_readPar(5, 1, 3);
189 printf("Neuer Wert bei (1,3,2,4,2) (%s) = %f\n",
190 eas3_getFileName(5), eas3_getValue(prm2, 2, 4, 1));
191
192 eas3_closeFile(5);
193
194 /* Speicher von eas3Hdr und lks wieder freigeben */
195 eas3_freeHdr(&eas3ks);
196 eas3_freeHdr(&lks);
197
198 return (0);
199 }
200
201 /************************************************************************/
202 /************************************************************************/
203 /************************************************************************/
204
205 eas3Hdr *createEas2Testfile(const Int32 filenr, const char *fn)
206 {
207 Int32 i;
208 eas3Hdr *ks;
209
210 printf("\n--- Erzeuge EAS2 testfile %s ---\n", fn);
211
212 /* Speicher fuer Kennsatz allokieren.
213 * Muss global sein, damit der Kennsatz auch nach der Rueckkehr
214 * aus der Routine noch vorhanden ist. Es soll ja auch im Hauptprogramm
215 * mit diesem Kennsatz bzw. dieser Datei gearbeitet werden.
216 * ACHTUNG: Es reicht nicht aus hier einfach nur eine Variable vom
217 * Typ eas3Hdr anzulegen, da sie nur lokale Gueltigkeit haette und
218 * nach Rueckkehr ins Hauptprogramm automatisch verschwinden wurde.
219 * Jedoch wird in new_eas3FileStruct ein Zeiger auf den Kennsatz gesetzt
220 * der nach Rueckkehr ins Hauptprogramm nur noch ins Nirwana zeigen
221 * wurde, wenn der Kennsatz nicht auf dem Heap liegt. */
222
223 ks = (eas3Hdr *) malloc(sizeof(eas3Hdr));
224
225 /* Kennsatz - notwendige Optionen setzen */
226 ks->dform = EAS2;
227 ks->bform = IEEES;
228 ks->nzs = 5;
229 ks->npar = 9;
230 ks->ndim1 = 9;
231 ks->ndim2 = 9;
232 ks->ndim3 = 1;
233
234 /* Benutzerdefiniertes int-Feld - "Infofeld" - aktivieren */
235 ks->umode = EAS3_INT_UDEF;
236 ks->nu[1] = ks->nzs;
237
238 eas3_newHdr(ks);
239
240 for (i=0; i<ks->nu[1]; i++)
241 ks->uif[i] = i*i;
242 eas3_writeHdr(filenr, fn, ks, EAS3_WO) ;
243
244 /* Kennsatz schreiben und Unterprogramm verlassen*/
245 return (ks);
246 }
247
248 eas3Hdr *createEas3Testfile(const Int32 filenr,const char *fn)
249 {
250 Int32 i, j;
251
252 eas3Hdr* ks;
253
254 printf("\n--- Erzeuge EAS3 testfile %s ---\n", fn);
255
256 /* Speicher fuer Kennsatz allokieren.
257 * Muss global sein, damit der Kennsatz auch nach der Rueckkehr
258 * aus der Routine noch vorhanden ist. Es soll ja auch im Hauptprogramm
259 * mit diesem Kennsatz bzw. dieser Datei gearbeitet werden.
260 * ACHTUNG: Es reicht nicht aus hier einfach nur eine Variable vom
261 * Typ eas3Hdr anzulegen, da sie nur lokale Gueltigkeit haette und
262 * nach Rueckkehr ins Hauptprogramm automatisch verschwinden wurde.
263 * Jedoch wird in new_eas3FileStruct ein Zeiger auf den Kennsatz gesetzt
264 * der nach Rueckkehr ins Hauptprogramm nur noch ins Nirwana zeigen
265 * wurde, wenn der Kennsatz nicht auf dem Heap liegt. */
266
267 ks = (eas3Hdr *) malloc(sizeof(eas3Hdr));
268
269 /* Kennsatz belegen */
270 ks->dform = EAS3;
271 ks->bform = IEEED;
272 ks->nzs = 5;
273 ks->npar = 9;
274 ks->ndim1 = 9;
275 ks->ndim2 = 9;
276 ks->ndim3 = 9;
277
278 ks->amode = EAS3_ALL_ATTR;
279
280 /* Fuer strings bitte in jedem Fall sprintf() benutzen,
281 * nicht (zB) ks->dim1attr = "hallo", weil das neuen Speicher allokiert und
282 * garamtiert zu Problemen fuehrt. */
283
284 sprintf(ks->dim1attr, "iks");
285 sprintf(ks->dim2attr, "uepsilon");
286 sprintf(ks->dim3attr, "zett");
287
288 ks->umode = EAS3_ALL_UDEF;
289 ks->nu[0] = 3;
290 ks->nu[1] = 5;
291 ks->nu[2] = 9;
292
293 for (i=0; i<5; i++)
294 {
295 ks->gmode[i] = EAS3_UDEF_G;
296 ks->ng[i] = 3+i;
297 }
298
299 /* Nachdem alle fix dimensionierten Groessen des Kennsatzes angegeben wurden
300 * muss der Speicher fuer die variablen Felder allokiert werden */
301
302 eas3_newHdr(ks);
303
304 /* Erst jetzt koennen die Zeitschritt-, Attribut-, Geometrie- und Benutzerfelder
305 * belegt werden. Fuer strings bitte in jedem Fall sprintf() benutzen,
306 * nicht (zB) ks->zs1attr = "hallo", weil das neuen Speicher allokiert und
307 * garamtiert zu Problemen fuehrt. */
308
309 for (i=0; i<ks->nzs; i++)
310 ks->zsf[i]=i+1;
311
312 for (i=0; i<ks->nzs; i++)
313 sprintf(ks->zsattr[i], "zs%d", i);
314
315 for (i=0; i<ks->npar; i++)
316 sprintf(ks->parattr[i], "par%d", i);
317
318 /* Geometriedaten setzen */
319
320 for (i=0; i<5; i++)
321 for (j=0; j<ks->ng[i]; j++)
322 ks->gf[i][j] = i*j;
323
324 /* udef Felder belegen */
325
326 for (i=0; i<ks->nu[0]; i++)
327 sprintf(ks->ucf[i], "uc(%d)", i);
328
329 for (i=0; i<ks->nu[1]; i++)
330 ks->uif[i] = i*i;
331
332 for (i=0; i<ks->nu[2]; i++)
333 ks->urf[i] = i*PI;
334
335 /* Kennsatz schreiben und Zeiger auf Dateistruktur zurueckgeben */
336 eas3_writeHdr(filenr,fn,ks,EAS3_WRA);
337
338 return (ks);
339 }
340
341 DefaultFloat wave(Int32 z, Int32 p, Int32 i, Int32 j, Int32 k)
342 {
343 return (DefaultFloat) (z*1000.+p*100+i*10+j*+k*10000) ;
344 }
345