"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