/[MITgcm]/MITgcm_contrib/darwinview/src/darwin.c
ViewVC logotype

Diff of /MITgcm_contrib/darwinview/src/darwin.c

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph | View Patch Patch

revision 1.1 by marissa, Wed Jul 11 14:34:55 2007 UTC revision 1.8 by marissa, Fri Aug 3 14:37:15 2007 UTC
# Line 8  Line 8 
8  #define DOWN 103  #define DOWN 103
9  #define RIGHT 102  #define RIGHT 102
10  #define LEFT 100  #define LEFT 100
11  #define MAX 200  #define MAX 700
12    #define SCALE .06
13    
14  int NX, NY, MAXNZ, setsx, setsy;  int NX, NY, NZ;
15    
16  void do_byteswap_f32( float arr[], int nel ), global(), local( int, int, int );  void do_byteswap_f32( float arr[], int nel ), global(), local( int, int, int );
17  void readnames( char[] ), readarray( float[], char[], int ), readjet();  void readnames( char[] ), readarray( float[], char[], int ), readjet(), readxz( float[], char[] );
18  void TimerFunction( int ), bitmap( char[], int, int );  void readyz( float[], char[] ), readdepths( char[] );
19    void TimerFunction( int ), stroke( char[], int, int );
20    
21  float data[MAX][MAX*MAX], mxval, mnval, jet[MAX][MAX];  float data[MAX][MAX*MAX], mxval, mnval, jet[64][3];
22  float globalmx=0, globalmn=100;  float globalmx=0, globalmn=100;
23  int win[MAX], ilev=1, howmany, count=0, glo=0, usr=0, anim=0;  int win[MAX], ilev=1, howmany, sets, count=0, glo=0, usr=0, anim=0, endian=0;
24    int xmax, ymax, yoffset=0, xoffset=0, yz=0, logscale=0, xz=0, nonegs=1;
25    int depths[MAX], scaledepth=0, totaldepth=0, scalecount=0;
26  char initfns[MAX][MAX], fns[MAX][MAX][MAX];  char initfns[MAX][MAX], fns[MAX][MAX][MAX];
27    
28  void menu(int value){  void menu( int value ){           // called when menu is opened on right click
  int i;  
29    
30   switch( value ){   switch( value ){
31    case 1: usr=glo=0;         // unset glo & usr, sets local max/min    case 1: usr=glo=0;            // unset glo & usr, sets local max/min
32            glutPostRedisplay();            break;
33      case 2: glo=1;                // enables global max/min  
34              usr=0;                // unsets usr
35              mxval=globalmx;       // sets max to globalmx
36              mnval=globalmn;       // sets min to globalmn
37              break;
38      case 3: usr=1;                // switch to user-set max/min
39              glo=0;                // unset glo
40              printf( "Max=" );  scanf( "%f", &mxval );  // prompt user for new max
41              printf( "Min=" );  scanf( "%f", &mnval );  // prompt user for new min
42            break;            break;
43    case 2: glo=1;         // enables global max/min      case 4: logscale=( logscale+1 )%2;  // switch log scale on/off
           usr=0;         // unsets usr  
           mxval=globalmx;     // sets max to globalmx  
           mnval=globalmn;     // sets min to globalmn  
           glutPostRedisplay(); // display with new values  
44            break;            break;
45    case 3: usr=1;             // switch to user-set max/min    case 5: nonegs=( nonegs+1 )%2;      // switch allowance of negatives on/off
46            glo=0;             // unset glo            break;
47            printf( "Max=" );  scanf( "%f", &mxval );  // prompt for new max/min    case 6: endian=( endian+1 )%2;      // switch between big/little endian
           printf( "Min=" );  scanf( "%f", &mnval );  
           glutPostRedisplay(); // display with new values  
48            break;            break;
49   }   }
50     glutPostRedisplay();
51  }  }
52    
53  void display(void){  void display(){                 // called on glutPostRedisplay
54   int i, j, ioff, q;   int i, h, ioff, q;
55   float r, g, b, num, k, y;   float r, g, b, k, y, j, tmp;
56     double num, logmx, logmn;
57   char str[MAX];   char str[MAX];
58    
59   for( q=0; q<setsx*setsy; q++ ){    //runs display func for each window  
60    glutSetWindow( win[q] );   for( q=0; q<sets; q++ ){           // runs display func for each subwindow
61    glClear( GL_COLOR_BUFFER_BIT );  // background to black    glutSetWindow( win[q] );          // sets which subwindow to display to
62    if( glo || usr )    glClear( GL_COLOR_BUFFER_BIT );   // background to black
63     readarray( data[q], fns[q][count], ilev );  
64    else                              if( xz ) {  xmax=NX;  ymax=NZ;  }
65     local( q, count, ilev );            else{
66       if( yz ){  xmax=NY;  ymax=NZ;  }
67    ioff=0;                    // ioff will count thru both i&j b/c data is 1D     else    {  xmax=NX;  ymax=NY;  }
68    for( j=0; j<NY; j++ ){    }
69     for( i=0; i<NX; i++ ){  
70      r=g=b=0;                 // set color values to black    if( glo || usr ){                  // if global or user-set max/min
71      if( data[q][ioff]==0 );     // if data=0, values stay black     if( xz )
72        readxz( data[q], fns[q][count] );
73       else{
74        if( yz )
75         readyz( data[q], fns[q][count] );
76        else
77         readarray( data[q], fns[q][count], ilev );  // read new array w/o calculating local max/min
78       }
79      }
80      else                              // if local max/min is set
81       local( q, count, ilev );         // read new array and calculate local max/min
82    
83      if( logscale ){
84       if( usr ){
85        logmx=(double)mxval;
86        logmn=(double)mnval;
87       }
88       else{
89        logmx=log10( mxval );
90        logmn=log10( mnval );
91       }
92      }
93    
94      if( scaledepth && xz || scaledepth && yz ) ymax=NY;
95      tmp=(float)ymax/totaldepth;
96      j=0; ioff=0; h=0;                        // ioff will count both i&j b/c data is 1D
97    
98      while ( j<ymax ){            // cycles through y values
99       for( i=0; i<xmax; i++ ){           // cycles through x values
100        r=g=b=0;                          // set color values to black
101        if( data[q][ioff]==0 );           // if data=0, values stay black
102      else{      else{
103       if( data[q][ioff]<mnval )  num=0;  // if data is less than min, =min       if( logscale ){
104          num=(double)data[q][ioff];
105          num=log10( num );
106          if( num<logmn ) num=0;
107          else{
108           if( num>logmx ) num=63;
109           else
110            num=63*( num-logmn )/( logmx-logmn );
111          }
112         }
113       else{       else{
114        if( data[q][ioff]>mxval )  num=63; // if data is more than max, =max        if( data[q][ioff]<mnval )  num=0;   // if data is less than min, =min
115        else        else{
116         num=63*( data[q][ioff]-mnval )/( mxval-mnval );  //scale num from 0-63         if( data[q][ioff]>mxval )  num=63; // if data is more than max, =max
117           else
118            num=63*( data[q][ioff]-mnval )/( mxval-mnval );  // scale num from 0-63 (not defined for 64)
119          }
120       }       }
121       r=jet[(int)num][0];  // set red val       r=jet[(int)num][0];            // set red val
122       g=jet[(int)num][1];  // set green val       g=jet[(int)num][1];            // set green val
123       b=jet[(int)num][2];  // set blue val         b=jet[(int)num][2];            // set blue val  
124      }      }
125    
126      glColor3f( r, g, b );      // put r, g, b into effect      glColor3f( r, g, b );           // put r, g, b into effect
127      glRectf( i, j, i+1, j+1 ); // draws a square for data value      if( scaledepth && xz || scaledepth && yz )
128         glRectf( i, j, i+1, j+(depths[h]*tmp) );
129        else
130         glRectf( i, j, i+1, j+1 );      // draws a square for data value
131      ioff++;                          ioff++;                    
132     }     }
133       if( scaledepth && xz || scaledepth && yz ){
134        j+=(depths[h]*tmp);
135        h++;
136       }
137       else j++;
138    }    }
139    glColor3f( 1, 1, 1 );       // set color to white  
140    glRectf( NX, 0, NX+1, NY+1 );    // draws a border    glColor3f( 1, 1, 1 );             // set color to white
141    glRectf( 0, NY, NX, NY+1 );        // draws a border      glRectf( xmax, 0, xmax+1, ymax+1 );     // draws a border
142    for( i=0; i<64; i++ ){       //draws color bar        glRectf( 0, ymax, xmax, ymax+1 );       // draws a border  
143     glColor3f( jet[i][0], jet[i][1], jet[i][2]);         //sets color    for( i=0; i<64; i++ ){            // draws color bar    
144     k=(float)i;                // turns i into a float     glColor3f( jet[i][0], jet[i][1], jet[i][2]);         // sets color
145     y=(float)NY/64;            // sets height of rectangles     k=(float)i;                      // turns i into a float
146     glRectf( NX+10, y*k, NX+20, (k+1)*y );    // draws rectangle     y=(float)ymax/64;                  // sets height of rectangles
147       glRectf( xmax+10, y*k, xmax+20, (k+1)*y );               // draws rectangle
148    }    }
149    glColor3f( 1, 1, 1 );     // color to white    glColor3f( 1, 1, 1 );             // color to white
150    
151    sprintf( str, "%.2e", mxval );      // labels color bar with max val    if( logscale )
152    bitmap( str, NX+2, NY-1 );     sprintf( str, "%.2f", logmx );
153      else
154       sprintf( str, "%.1e", mxval );    // labels color bar with max val
155      stroke( str, xmax+2, ymax-1 );
156        
157    sprintf( str, "%.2e", mnval );      // labels color bar with min val    if( logscale )
158    bitmap( str, NX+2, 1 );     sprintf( str, "%.2f", logmn );
159      else
160       sprintf( str, "%.1e", mnval );    // labels color bar with min val
161      stroke( str, xmax+2, 1 );
162    
163      if( xz )
164       sprintf( str, "N-S slice %d", yoffset+1);
165      else{
166       if( yz )
167        sprintf( str, "E-W slice %d", xoffset+1);
168       else
169        sprintf( str, "Level %d", ilev ); // labels current level
170      }
171      stroke( str, 1, ymax+5 );
172    
173    sprintf( str, "Level %d", ilev );   // labels current level    sprintf( str, "Time %d", count+1 ); // labels current time
174    bitmap( str, 1, NY+3);    stroke( str, xmax/2, ymax+5 );
175    
176    if( glo )                   // labels how max/min have been set    if( glo )                         // labels how max/min have been set
177     sprintf( str, "Global" );  // if glo is set, display Global     sprintf( str, "Global" );        // if glo is set, display Global
178    if( usr )    if( usr )
179     sprintf( str, "User-set" );  // if usr is set, display User-set     sprintf( str, "User-set" );      // if usr is set, display User-set
180    if( !usr && !glo )    if( !usr && !glo )
181     sprintf( str, "Local" );    // else display Local     sprintf( str, "Local" );         // else display Local
182    bitmap( str, NX+12, NY+3);    stroke( str, xmax+8, ymax+8 );
183        
184    if( anim ){                  // tell user if autoplay is on    if( anim ){                       // tell user if autoplay is on
185     sprintf( str, "Autoplay" );     sprintf( str, "Autoplay" );
186     bitmap( str, NX-15, NY+3 );     stroke( str, xmax-35, ymax+8 );
187      }
188    
189      if( logscale ){
190       sprintf( str, "Log Scale" );     // tell user if log scale is on
191       stroke( str, xmax-25, ymax+15);
192    }    }
193    
194    bitmap( fns[q][count], 1, NY+6 );  // labels current file    stroke( fns[q][count], 1, ymax+15 ); // labels current file
195    
196    glutSwapBuffers();      glutSwapBuffers();                // double buffering set to animate smoothly
197    glFlush();    glFlush();
198   }   }
199  }  }
200    
201  void bitmap( char str[], int x, int y ){  void stroke( char str[], int x, int y ){  // called to display text onscreen
202   int i;   int i;
203    
204   glRasterPos2f( x, y );   glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
205   for( i=0; i<strlen( str ); i++)   glEnable( GL_BLEND );
206    glutBitmapCharacter( GLUT_BITMAP_HELVETICA_12, str[i] );   glEnable( GL_LINE_SMOOTH );
207     glMatrixMode( GL_MODELVIEW );
208    
209     glPushMatrix();
210    
211     glScalef( SCALE, SCALE, SCALE );
212     glTranslatef( (1/SCALE)*x, (1/SCALE)*y, 0 );
213    
214     for( i=0; i<strlen( str ); i++)    // display each character of str
215      glutStrokeCharacter( GLUT_STROKE_ROMAN, str[i] );
216    
217     glPopMatrix();
218  }  }
219    
220  void key( unsigned char key, int x, int y ){   //called on key press  void key( unsigned char key, int x, int y ){   // called on key press
221   int i;   int i, tmp;
222     char fn[MAX];
223    
224   switch(key){   switch(key){
225    case 'q':   exit(0);     //quits on 'q'    case 'q':   exit(0);              // quits on 'q'
226                  break;
227      case 'r':   count=0;              // resets back to first time    
228                  ilev=1;               // and first level
229                  xz=yz=0;
230                  break;
231      case 'a':   anim=(anim+1)%2;      // turns anim on/off
232                break;                break;
233    case 'r':   count=0;    case 'x':   xz=(xz+1)%2;
234                ilev=1;                yz=0;
               glutPostRedisplay();              
235                break;                break;
236    case 'a':   anim++;            // switches autoplay off/on      case 'y':   yz=(yz+1)%2;
237                anim=anim%2;       // when a is pressed repeatedly                xz=0;
               glutPostRedisplay();              
238                break;                break;
239      case 'z':   if( xz || yz ){
240                   scaledepth=( scaledepth+1 )%2;
241                   scalecount++;
242                   if( scalecount==1 ){
243                    printf( "Please enter filename containing depth data: " );
244                    scanf( "%s", fn );
245                    readdepths( fn );
246                   }
247                  }
248                  break;
249   }   }
250     glutPostRedisplay();
251  }  }
252    
253  void TimerFunction( int value ){  void TimerFunction( int value ){    // called when anim is set and arrow key is pressed
254   int i;   int i;
255    
256   switch(value){          // increments in the correct direction   switch(value){                     // increments in the correct direction
257    case DOWN : if( ilev<MAXNZ )    case DOWN : if( xz && yoffset>0 )
258                 ilev++;    // if down arrow pressed, moves down levels                       yoffset--;
259                  else{
260                   if( yz && xoffset<NX-1 )
261                    xoffset++;
262                   else
263                    if( ilev<NZ && !xz && !yz )
264                     ilev++;              // if down arrow pressed, move down a level      
265                  }
266                break;                break;
267    case UP   : if( ilev>1 )        case UP   : if( xz && yoffset<NY-1 )
268                 ilev--;    // if up arrow is pressed, moves up levels                 yoffset++;
269                  else{
270                   if( yz && xoffset>0 )
271                    xoffset--;
272                   else
273                    if( ilev>1 && !xz && !yz )    
274                     ilev--;              // if up arrow is pressed, move up a level
275                  }
276                break;                break;
277    case LEFT : if( count>0 )          case LEFT : if( count>0 )      
278                 count--;   // if left arrow is pressed, moves back in time                 count--;             // if left arrow is pressed, move back one time step
279                break;                break;
280    case RIGHT: if( count<howmany-1 )    case RIGHT: if( count<howmany-1 )
281                 count++;   // if right arrow is pressed, moves forward in time                 count++;             // if right arrow is pressed, moves forward one time step
282                break;                break;
283   }   }
284    
285   glutPostRedisplay();               glutPostRedisplay();            
286    
287   if (anim )   if ( anim )
288    switch( value ){        switch( value ){    
289     case DOWN : if( ilev==MAXNZ ) ilev=1;   // sets limit that you can go down     case DOWN : if( xz && yoffset==0 )
290                    yoffset=NY-1;
291                   else{
292                    if( yz && xoffset==NX-1 )
293                     xoffset=0;
294                    else
295                     if( ilev==NZ && !xz && !yz )
296                      ilev=1;                   // if end reached, restart
297                   }
298                 glutTimerFunc( 100, TimerFunction, value ); // recalls itself                 glutTimerFunc( 100, TimerFunction, value ); // recalls itself
299                 break;                 break;
300     case UP   : if( ilev==1 ) ilev=MAXNZ;   // sets limit that you can go up     case UP   : if( xz && yoffset==NY-1 )
301                    yoffset=0;
302                   else{
303                    if( yz && xoffset==0 )
304                     xoffset=NX-1;
305                    else
306                     if( ilev==1 )
307                      ilev=NZ;                   // if end reached, restart
308                   }
309                 glutTimerFunc( 100, TimerFunction, value ); // recalls itself                 glutTimerFunc( 100, TimerFunction, value ); // recalls itself
310                 break;                 break;
311     case LEFT : if( count==0 ) count=howmany-1;// sets limit that you can go left     case LEFT : if( count==0 ) count=howmany-1;             // if end reached, restart
312                 glutTimerFunc( 100, TimerFunction, value ); // recalls itself                 glutTimerFunc( 100, TimerFunction, value ); // recalls itself
313                 break;                 break;
314     case RIGHT: if( count==howmany-1 ) count=0; //sets limit that you can go right     case RIGHT: if( count==howmany-1 ) count=0;             // if end reached, restart                
315                 glutTimerFunc( 100, TimerFunction, value ); // recalls itself                 glutTimerFunc( 100, TimerFunction, value ); // recalls itself
316                 break;                 break;
317    }    }
# Line 183  void TimerFunction( int value ){ Line 320  void TimerFunction( int value ){
320  void specialkey( int key, int x, int y ){  void specialkey( int key, int x, int y ){
321   int i;   int i;
322    
323   if( anim )     // if animation is set, call the timer function   if( anim )                       // if animation is set, call the timer function
324    glutTimerFunc( 100, TimerFunction, key);    glutTimerFunc( 100, TimerFunction, key);             // to scroll automatically
325    
326   switch(key){   switch(key){
327    case DOWN   :  if( ilev<MAXNZ ) // if you haven't reached the bottom    case DOWN   :  if( xz && yoffset>0 )
328                    ilev++;         // keep going down                    yoffset--;
329                     else{
330                      if( yz && xoffset<NY-1 )
331                       xoffset++;
332                      else
333                       if( ilev<NZ && !xz && !yz )      // if you haven't reached the bottom
334                        ilev++;              // keep going down
335                     }
336                   break;                   break;
337    case UP     :  if( ilev>1 )     // if you haven't reached the top    case UP     :  if( xz && yoffset<NY-1 )
338                    ilev--;         // keep going up                    yoffset++;
339                     else{
340                      if( yz && xoffset>0 )
341                       xoffset--;
342                      else
343                       if( ilev>1 )          // if you haven't reached the top
344                        ilev--;              // keep going up
345                     }
346                   break;                   break;
347    case RIGHT  :  if( count<howmany-1 ) // if you haven't reached the last file    case RIGHT  :  if( count<howmany-1 ) // if you haven't reached the last file
348                    count++;             // keep going right                    count++;             // keep going right
# Line 203  void specialkey( int key, int x, int y ) Line 354  void specialkey( int key, int x, int y )
354   glutPostRedisplay();               glutPostRedisplay();            
355  }  }
356    
357  void global(){  // calculates the max/min for the total data set  void global(){                         // calculates the max/min for the total data set
358   FILE* fp;   FILE* fp;
359   int h, i, j;   int h, i, j;
360   for( h=0; h<setsx*setsy; h++) // cycles through each data set   for( h=0; h<sets; h++)                // cycles through each window
361    for( i=0; i<howmany; i++ )   // cycles through each time    for( i=0; i<howmany; i++ )           // cycles through each time
362     for( j=0; j<MAXNZ; j++ ){   // cycles through each level for each file     for( j=0; j<NZ; j++ ){              // cycles through each level for each file
363      local( h, i, j );         // calculates local/max/min for specific data set      local( h, i, j );                  // calculates local max/min for specific data set
364      if( mxval > globalmx ) globalmx = mxval;   // sets highest value to globalmx      if( mxval > globalmx ) globalmx = mxval;   // sets highest value to globalmx
365      if( mnval < globalmn ) globalmn = mnval;   // sets lowest value to globalmn      if( mnval < globalmn ) globalmn = mnval;   // sets lowest value to globalmn
366     }     }
367  }  }
368    
369  void local( int i, int time, int lev ){  // calculates local max/min  void local( int i, int time, int lev ){        // calculates local max/min
370   int j;   int j;
371    
372   mxval=0;     mxval=0;  
373   mnval=100;   mnval=100;
374   readarray( data[i], fns[i][time], lev ); // read new array of data   if( xz )
375   for( j=0; j<NX*NY; j++ ){    readxz( data[i], fns[i][time]);
376    if( data[i][j] > mxval )  mxval=data[i][j]; // set largest val to mxval   else{
377    if( data[i][j] < mnval )  mnval=data[i][j]; // set smallest val to mnval    if( yz )
378       readyz( data[i], fns[i][time]);
379      else
380       readarray( data[i], fns[i][time], lev );      // read new array of data
381     }
382     for( j=0; j<xmax*ymax; j++ ){
383      if( data[i][j] > mxval )
384       mxval=data[i][j];                           // set largest val to mxval
385      if( data[i][j] < mnval && data[i][j]!=0 )
386       mnval=data[i][j];                           // set smallest positive val to mnval
387   }   }
388  }  }
389    
390  void readnames( char filename[] ){  // reads in list of filenames  void readnames( char filename[] ){             // reads in list of filenames
391   FILE* fp;   FILE* fp;
392   int i=0, j=0;   int i=0, j=0;
393    
394   fp=fopen( filename, "r" );    // opens list   fp=fopen( filename, "r" );                    // opens list of filenames
395   while( !feof(fp) ){           // reads until the end of the file   while( !feof(fp) ){                           // reads until the end of the file
396    fscanf( fp, "%s", initfns[i] );   // places filename into an array of strings    fscanf( fp, "%s", initfns[i] );              // places filename into an array of strings
397    i++;                         // counts how many filenames there are      i++;                                         // counts how many filenames there are  
398   }   }
399   fclose( fp );                 // close file   fclose( fp );                                 // close file
400   howmany=i-1;                   sets=i-1;                                  // saves number of initial filenames
401    
402   for(i=0; i<howmany; i++){   for(i=0; i<sets; i++){                     // goes through each read-in filename
403    fp=fopen( initfns[i], "r" );    fp=fopen( initfns[i], "r" );                 // opens each filename  
404    j=0;    j=0;
405    while( !feof(fp) ){    while( !feof(fp) ){                          // reads in filenames from each filename
406     fscanf( fp, "%s", fns[i][j]);     fscanf( fp, "%s", fns[i][j]);              
407     j++;     j++;
408    }    }
409    fclose(fp);    fclose(fp);                                  // close file
410   }   }
411   howmany=j-1;   howmany=j-1;                                  // saves number of data filenames  
412  }  }
413    
414  void readjet(){  //reads in color scale values  void readdepths( char filename[] ){
415     int i;
416     FILE* fp;
417    
418     fp=fopen( filename, "r" );
419    
420     for( i=NZ-1; i>=0; i-- ){
421      fscanf( fp, "%d ", &depths[i] );
422      totaldepth+=depths[i];
423     }
424    
425     fclose( fp );
426    }
427    
428    void readjet(){               //reads in color scale values
429   FILE* fp;   FILE* fp;
430   int i, j;   int i, j;
431        
432   fp=fopen( "jet.dat", "r" );  // opens file containing values   fp=fopen( "jet.dat", "r" );  // opens file containing values
433   for( i=0; i<64; i++ )       // reads in 64 sets of r, g, b values   for( i=0; i<64; i++ )        // reads in 64 sets of r, g, b values
434    for( j=0; j<3; j++ )    for( j=0; j<3; j++ )
435     fscanf( fp, "%f", &jet[i][j] );     fscanf( fp, "%f", &jet[i][j] );
436   fclose( fp );              // closes file   fclose( fp );                // closes file
437  }  }
438    
439    void readxz( float arr[], char filename[] ){
440     int i, j;
441     float tmp[MAX][MAX], tmp2[MAX*MAX];
442     FILE* fp;
443    
444     fp=fopen( filename, "rb" );  
445     for( i=0; i<NZ; i++){
446      fseek( fp, (NX*yoffset*4)+(i*NX*NY*4), SEEK_SET );
447      fread( &arr[NX*i], sizeof( arr[0] ), NX, fp );  // reads in data to fill one level
448     }
449     fclose( fp );
450    
451     for( i=0; i<NZ; i++ )
452      for( j=0; j<NX; j++)
453       tmp[i][j]=arr[i*NX+j];
454    
455     for( i=0; i<NZ; i++ )
456      for( j=0; j<NX; j++)
457       tmp2[i*NX+j]=tmp[NZ-i-1][j];
458    
459     for( i=0; i<NX*NZ; i++)
460      arr[i]=tmp2[i];
461    }
462    
463    void readyz( float arr[], char filename[] ){
464     int i, j;
465     float tmp[MAX][MAX], tmp2[MAX*MAX];
466     FILE* fp;  
467    
468     fp=fopen( filename, "rb" );
469     for( i=0; i<NY*NZ; i++ ){
470      fseek( fp, (xoffset*4)+(i*NX*4), SEEK_SET );
471      fread( &arr[i], sizeof( arr[0] ), 1, fp );
472     }
473     fclose(fp);
474    
475     for( i=0; i<NZ; i++ )
476      for( j=0; j<NY; j++)
477       tmp[i][j]=arr[i*NY+j];
478    
479     for( i=0; i<NZ; i++ )
480      for( j=0; j<NY; j++)
481       tmp2[i*NY+j]=tmp[NZ-i-1][j];
482    
483     for( i=0; i<NY*NZ; i++)
484      arr[i]=tmp2[i];
485    }
486    
487  void readarray( float arr[], char filename[], int il ){   // reads new data  void readarray( float arr[], char filename[], int il ){   // reads new data
488   FILE *fp;   FILE* fp;
489   int i;   int i;
490    
491   fp=fopen( filename, "r" );  // opens the file containing data   fp=fopen( filename, "rb" );                 // opens the file containing data
492   fseek( fp, (il-1)*NX*NY*4, SEEK_SET ); // seeks to the correct level using ilev   fseek( fp, (il-1)*NX*NY*4, SEEK_SET );      // seeks to the correct place using ilev
493   fread( arr, sizeof( arr[0] ), NX*NY, fp );  // reads in data to fill one level   fread( arr, sizeof( arr[0] ), NX*NY, fp );  // reads in data to fill one level
494   fclose( fp );                         // close file   fclose( fp );                               // close file
495   //do_byteswap_f32( arr, NX*NY );          // swaps the binary data  
496     if( nonegs )
497      for( i=0; i<NX*NY; i++ )                    
498       if( arr[i] < 0 )
499        arr[i] = pow(10, -20);   // sets negative values to 10^-20
500    
501     if( endian )
502      do_byteswap_f32( arr, NX*NY );            // switches endian
503  }  }
504    
505  void do_byteswap_f32( float arr[], int nel ) // switches endian  void do_byteswap_f32( float arr[], int nel ){ // switches endian
506  {  
507     int i;   int i;
508     char src[4];   char src[4], trg[4];
509     char trg[4];  
510     for( i=0; i<nel; i++ ){   for( i=0; i<nel; i++ ){
511      memcpy( src, &(arr[i]), 4);    memcpy( src, &(arr[i]), 4 );
512      trg[0]=src[3];    trg[0]=src[3];
513      trg[1]=src[2];    trg[1]=src[2];
514      trg[2]=src[1];    trg[2]=src[1];
515      trg[3]=src[0];    trg[3]=src[0];
516      memcpy( &(arr[i]), trg, 4);    memcpy( &(arr[i]), trg, 4 );
517     }   }
518  }  }
519    
520  void parentfunc(){  void black( ){
521   glClear( GL_COLOR_BUFFER_BIT );  // background to black   glClear( GL_COLOR_BUFFER_BIT );
522   glutSwapBuffers();   glutSwapBuffers();
523   glFlush();   glFlush();
524  }  }
525    
526    
527  int main( int argc, char *argv[] ){  int main( int argc, char *argv[] ){
528   int i, tmpx, tmpy, winx, winy, parent;   int i, setsx, setsy, tmpx, tmpy, winx, winy, parent;
529   char filename[MAX];   char str[MAX], filename[MAX];
530     FILE* fp;
531    
532   sscanf(argv[1], "%dx%d", &winx, &winy);   if( strcmp(argv[1], "binary") == 0 )
533   winy-=20;    fp=fopen( ".darwinview/binconfig", "r" );
534     else
535   printf( "Please enter x, y and z dimensions.\n" );      if( strcmp(argv[1],"netcdf") == 0 )
536   scanf( "%d %d %d", &NX, &NY, &MAXNZ );   //user-set NX, NY, NZ     fp=fopen( ".darwinview/ncconfig", "r" );
537   printf( "Please enter filename.\n" );  
538   scanf( "%s", filename );   //filename contains names of data files   fscanf( fp, "%dx%d ", &winx, &winy );
539   printf( "Please enter dimensions of data sets.\n" );   winy-=60;  winx-=20;                     // adjusts resolution so edges won't get cut off            
540   scanf( "%dx%d", &setsx, &setsy);   fscanf( fp, "%d %d %d ", &NX, &NY, &NZ );
541     fscanf( fp, "%dx%d ", &setsx, &setsy );                // prompts user for dimensions of subwindows
542   readjet();                        // stores color values   fscanf( fp, "%s", filename );
543   readnames( filename );   // gets list of filenames to read from  
544   global();                         // calculates max and min for all data   fclose( fp );
545    
546   glutInit( &argc, argv );   xmax=NX; ymax=NY;
547   glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE );  
548   glutInitWindowSize( winx, winy );   readjet();                               // stores color values
549   glutInitWindowPosition( 10, 10 );   readnames( filename );                   // gets list of filenames to read from
550   parent=glutCreateWindow( WINDOW );   global();                                // calculates max and min for all data
551    
552     glutInit( &argc, argv );                
553     glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE );   // sets rgb mode and double buffering
554     glutInitWindowSize( winx, winy );                // parent window will cover screen
555     glutInitWindowPosition( 10, 10 );                // location of parent window
556     parent=glutCreateWindow( WINDOW );               // creates parent window
557    
558   glClearColor( 0, 0, 0, 0 );    // sets clear color to black   glClearColor( 0, 0, 0, 0 );                      // sets clear color to black
559   gluOrtho2D( 0, winx , winy, 0 );  // sets how data is mapped to window   gluOrtho2D( 0, winx , winy, 0 );                 // sets(0,0) as top left corner
560   glutDisplayFunc( display );   glutDisplayFunc( display );
561   glutKeyboardFunc( key );   // called on key press   glutKeyboardFunc( key );                         // called on key press
562   glutSpecialFunc( specialkey );  // called on special key press (arrow keys)   glutSpecialFunc( specialkey );                   // called on special key press (arrow keys)
563    
564    
565   for( i=0; i<setsx*setsy; i++ ){   for( i=0; i<setsx*setsy; i++ ){
566    tmpx = (i%setsx)*(winx/setsx);    tmpx = (i%setsx)*(winx/setsx);                  // x coordinate of top left corner of subwindow
567    tmpy = (i/setsx)*(winy/setsy);    tmpy = (i/setsx)*(winy/setsy);                  // y coordinate of top left corner of subwindow
568    
569    local( i, count, ilev );      // sets curr data array, finds local max/min    win[i]=glutCreateSubWindow( parent, tmpx, tmpy, winx/setsx, winy/setsy ); // creates subwindow
570      gluOrtho2D( 0, NX+35, 0, NY+25 );               // sets how data is mapped to subwindow
571    win[i]=glutCreateSubWindow( parent, tmpx, tmpy, winx/setsx, winy/setsy );    glutKeyboardFunc( key );                        // called on key press
572    gluOrtho2D( 0, NX+35, 0, NY+15 );  // sets how data is mapped to window    glutSpecialFunc( specialkey );                  // called on special key press (arrow keys)
573    glutDisplayFunc( display );    if( i >= sets )                                 //
574    glutKeyboardFunc( key );   // called on key press     glutDisplayFunc( black );
575    glutSpecialFunc( specialkey );  // called on special key press (arrow keys)    else
576       glutDisplayFunc( display );                     // sets display func for subwindow
577      
578    
579    glutCreateMenu( menu );   // adds a menu    glutCreateMenu( menu );                                // adds a menu
580     glutAddMenuEntry( "Local Color Scale", 1 );   // describes choices     glutAddMenuEntry( "Local Color Scale", 1 );           // adds a menu entry
581     glutAddMenuEntry( "Global Color Scale", 2 );     glutAddMenuEntry( "Global Color Scale", 2 );          // adds a menu entry
582     glutAddMenuEntry( "User-Set Color Scale", 3 );     glutAddMenuEntry( "User-Set Color Scale", 3 );        // adds a menu entry
583    glutAttachMenu( GLUT_RIGHT_BUTTON );  // menu called on right click     glutAddMenuEntry( "Log Scale (on/off)", 4 );          // adds a menu entry
584       glutAddMenuEntry( "Allow Negatives (on/off)", 5 );    // adds a menu entry
585       glutAddMenuEntry( "Switch Endian (big/little) ", 6);  // adds a menu entry
586      glutAttachMenu( GLUT_RIGHT_BUTTON );                   // menu called on right click
587   }   }
588    
589   glutMainLoop();   glutMainLoop();                                  // begin processing events
590   return 0;   return 0;
591  }  }
592    

Legend:
Removed from v.1.1  
changed lines
  Added in v.1.8

  ViewVC Help
Powered by ViewVC 1.1.22