/[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.4 by marissa, Mon Jul 16 15:40:16 2007 UTC revision 1.7 by marissa, Wed Aug 1 18:04:15 2007 UTC
# Line 9  Line 9 
9  #define RIGHT 102  #define RIGHT 102
10  #define LEFT 100  #define LEFT 100
11  #define MAX 700  #define MAX 700
12    #define SCALE .06
13    
14  int NX, NY, NZ;  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(), readxz( float[], char[] );  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[64][3];  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, sets, count=0, glo=0, usr=0, anim=0, logscale=0, xz=0, nonegs=1, endian=0;  int win[MAX], ilev=1, howmany, sets, count=0, glo=0, usr=0, anim=0, endian=0;
24  int xmax, ymax, offset=0;  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){           // called when menu is opened on right click  void menu( int value ){           // called when menu is opened on right click
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
           glutPostRedisplay();  // recall display func with new values  
32            break;            break;
33    case 2: glo=1;                // enables global max/min      case 2: glo=1;                // enables global max/min  
34            usr=0;                // unsets usr            usr=0;                // unsets usr
35            mxval=globalmx;       // sets max to globalmx            mxval=globalmx;       // sets max to globalmx
36            mnval=globalmn;       // sets min to globalmn            mnval=globalmn;       // sets min to globalmn
           glutPostRedisplay();  // recall display func with new values  
37            break;            break;
38    case 3: usr=1;                // switch to user-set max/min    case 3: usr=1;                // switch to user-set max/min
39            glo=0;                // unset glo            glo=0;                // unset glo
40            printf( "Max=" );  scanf( "%f", &mxval );  // prompt user for new max            printf( "Max=" );  scanf( "%f", &mxval );  // prompt user for new max
41            printf( "Min=" );  scanf( "%f", &mnval );  // prompt user for new min            printf( "Min=" );  scanf( "%f", &mnval );  // prompt user for new min
           glutPostRedisplay();                       // recall display func with new values  
42            break;            break;
43    case 4: logscale=(logscale+1)%2;  // switch log scale on/off    case 4: logscale=( logscale+1 )%2;  // switch log scale on/off
           glutPostRedisplay();  
44            break;            break;
45    case 5: nonegs=(nonegs+1)%2;      // switch allowance of negatives on/off    case 5: nonegs=( nonegs+1 )%2;      // switch allowance of negatives on/off
           glutPostRedisplay();  
46            break;            break;
47    case 6: endian=(endian+1)%2;      // switch between big/little endian    case 6: endian=( endian+1 )%2;      // switch between big/little endian
           glutPostRedisplay();  
48            break;            break;
49   }   }
50     glutPostRedisplay();
51  }  }
52    
53  void display(){                 // called on glutPostRedisplay  void display(){                 // called on glutPostRedisplay
54   int i, j, ioff, q;   int i, j, h, ioff, q;
55   float r, g, b, k, y;   float r, g, b, k, y;
56   double num, logmx, logmn;   double num, logmx, logmn;
57   char str[MAX];   char str[MAX];
58    
59    
60   for( q=0; q<sets; q++ ){           // runs display func for each subwindow   for( q=0; q<sets; q++ ){           // runs display func for each subwindow
61    glutSetWindow( win[q] );          // sets which subwindow to display to    glutSetWindow( win[q] );          // sets which subwindow to display to
62    glClear( GL_COLOR_BUFFER_BIT );   // background to black    glClear( GL_COLOR_BUFFER_BIT );   // background to black
63    if( xz )   ymax=NZ;  
64    else       ymax=NY;    if( xz ) {  xmax=NX;  ymax=NZ;  }
65      else{
66       if( yz ){  xmax=NY;  ymax=NZ;  }
67       else    {  xmax=NX;  ymax=NY;  }
68      }
69    
70    if( glo || usr ){                  // if global or user-set max/min    if( glo || usr ){                  // if global or user-set max/min
71     if( xz )     if( xz )
72      readxz( data[q], fns[q][count] );      readxz( data[q], fns[q][count] );
73     else     else{
74      readarray( data[q], fns[q][count], ilev );  // read new array w/o calculating local max/min      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    else                              // if local max/min is set
81     local( q, count, ilev );         // read new array and calculate local max/min     local( q, count, ilev );         // read new array and calculate local max/min
# Line 83  void display(){                 // calle Line 91  void display(){                 // calle
91     }     }
92    }    }
93    
94    ioff=0;                           // ioff will count both i&j b/c data is 1D    if( scaledepth && xz || scaledepth && yz )  ymax=totaldepth;
95      ioff=0; h=0;                        // ioff will count both i&j b/c data is 1D
96    for( j=0; j<ymax; j++ ){            // cycles through y values    for( j=0; j<ymax; j++ ){            // cycles through y values
97     for( i=0; i<xmax; i++ ){           // cycles through x values     for( i=0; i<xmax; i++ ){           // cycles through x values
98      r=g=b=0;                        // set color values to black      r=g=b=0;                          // set color values to black
99      if( data[q][ioff]==0 );           // if data=0, values stay black      if( data[q][ioff]==0 );           // if data=0, values stay black
100      else{      else{
101       if( logscale ){       if( logscale ){
# Line 113  void display(){                 // calle Line 122  void display(){                 // calle
122      }      }
123    
124      glColor3f( r, g, b );           // put r, g, b into effect      glColor3f( r, g, b );           // put r, g, b into effect
125      glRectf( i, j, i+1, j+1 );      // draws a square for data value      if( scaledepth && xz || scaledepth && yz )
126         glRectf( i, j, i+1, j+depths[h] );
127        else
128         glRectf( i, j, i+1, j+1 );      // draws a square for data value
129      ioff++;                          ioff++;                    
130     }     }
131       if( scaledepth && xz || scaledepth && yz ){
132        j+=depths[h]-1;
133        h++;
134       }
135    }    }
136    
137    glColor3f( 1, 1, 1 );             // set color to white    glColor3f( 1, 1, 1 );             // set color to white
138    glRectf( xmax, 0, xmax+1, ymax+1 );     // draws a border    glRectf( xmax, 0, xmax+1, ymax+1 );     // draws a border
139    glRectf( 0, ymax, xmax, ymax+1 );       // draws a border      glRectf( 0, ymax, xmax, ymax+1 );       // draws a border  
# Line 132  void display(){                 // calle Line 149  void display(){                 // calle
149     sprintf( str, "%.2f", logmx );     sprintf( str, "%.2f", logmx );
150    else    else
151     sprintf( str, "%.1e", mxval );    // labels color bar with max val     sprintf( str, "%.1e", mxval );    // labels color bar with max val
152    bitmap( str, xmax+2, ymax-1 );    stroke( str, xmax+2, ymax-1 );
153        
154    if( logscale )    if( logscale )
155     sprintf( str, "%.2f", logmn );     sprintf( str, "%.2f", logmn );
156    else    else
157     sprintf( str, "%.1e", mnval );    // labels color bar with min val     sprintf( str, "%.1e", mnval );    // labels color bar with min val
158    bitmap( str, xmax+2, 1 );    stroke( str, xmax+2, 1 );
159    
160    if( xz )    if( xz )
161     sprintf( str, "Y-coordinate=%d", offset+1);     sprintf( str, "N-S slice %d", yoffset+1);
162    else    else{
163     sprintf( str, "Level %d", ilev ); // labels current level     if( yz )
164    bitmap( str, 1, ymax+3 );      sprintf( str, "E-W slice %d", xoffset+1);
165       else
166        sprintf( str, "Level %d", ilev ); // labels current level
167      }
168      stroke( str, 1, ymax+5 );
169    
170    sprintf( str, "Time %d", count+1 ); // labels current time    sprintf( str, "Time %d", count+1 ); // labels current time
171    bitmap( str, 80, ymax+3 );    stroke( str, xmax/2, ymax+5 );
172    
173    if( glo )                         // labels how max/min have been set    if( glo )                         // labels how max/min have been set
174     sprintf( str, "Global" );        // if glo is set, display Global     sprintf( str, "Global" );        // if glo is set, display Global
# Line 155  void display(){                 // calle Line 176  void display(){                 // calle
176     sprintf( str, "User-set" );      // if usr is set, display User-set     sprintf( str, "User-set" );      // if usr is set, display User-set
177    if( !usr && !glo )    if( !usr && !glo )
178     sprintf( str, "Local" );         // else display Local     sprintf( str, "Local" );         // else display Local
179    bitmap( str, xmax+12, ymax+3 );    stroke( str, xmax+8, ymax+8 );
180        
181    if( anim ){                       // tell user if autoplay is on    if( anim ){                       // tell user if autoplay is on
182     sprintf( str, "Autoplay" );     sprintf( str, "Autoplay" );
183     bitmap( str, xmax-25, ymax+3 );     stroke( str, xmax-35, ymax+8 );
184    }    }
185    
186    if( logscale ){    if( logscale ){
187     sprintf( str, "Log Scale" );     // tell user if log scale is on     sprintf( str, "Log Scale" );     // tell user if log scale is on
188     bitmap( str, xmax-25, ymax+10 );     stroke( str, xmax-25, ymax+15);
189    }    }
190    
191    bitmap( fns[q][count], 1, ymax+10 ); // labels current file    stroke( fns[q][count], 1, ymax+15 ); // labels current file
192    
193    glutSwapBuffers();                // double buffering set to animate smoothly    glutSwapBuffers();                // double buffering set to animate smoothly
194    glFlush();    glFlush();
195   }   }
196  }  }
197    
198  void bitmap( char str[], int x, int y ){  // called to display text onscreen  void stroke( char str[], int x, int y ){  // called to display text onscreen
199   int i;   int i;
200    
201   glRasterPos2f( x, y );             // set position of text   glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
202     glEnable( GL_BLEND );
203     glEnable( GL_LINE_SMOOTH );
204     glMatrixMode( GL_MODELVIEW );
205    
206     glPushMatrix();
207    
208     glScalef( SCALE, SCALE, SCALE );
209     glTranslatef( (1/SCALE)*x, (1/SCALE)*y, 0 );
210    
211   for( i=0; i<strlen( str ); i++)    // display each character of str   for( i=0; i<strlen( str ); i++)    // display each character of str
212    glutBitmapCharacter( GLUT_BITMAP_HELVETICA_12, str[i] );    glutStrokeCharacter( GLUT_STROKE_ROMAN, str[i] );
213    
214     glPopMatrix();
215  }  }
216    
217  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
# Line 190  void key( unsigned char key, int x, int Line 222  void key( unsigned char key, int x, int
222                break;                break;
223    case 'r':   count=0;              // resets back to first time        case 'r':   count=0;              // resets back to first time    
224                ilev=1;               // and first level                ilev=1;               // and first level
               glutPostRedisplay();              
225                break;                break;
226    case 'a':   anim=(anim+1)%2;      // turns anim on/off    case 'a':   anim=(anim+1)%2;      // turns anim on/off
               glutPostRedisplay();              
227                break;                break;
228    case 'x':   xz=(xz+1)%2;    case 'x':   xz=(xz+1)%2;
229                glutPostRedisplay();                yz=0;
230                break;                break;
231      case 'y':   yz=(yz+1)%2;
232                  xz=0;
233                  break;
234      case 'z':   if( xz || yz ){
235                   scaledepth=( scaledepth+1 )%2;
236                   scalecount++;
237                   if( scalecount==1 )
238                    readdepths( ".darwinview/depths" );
239                  }
240                  break;
241   }   }
242     glutPostRedisplay();
243  }  }
244    
245  void TimerFunction( int value ){    // called when anim is set and arrow key is pressed  void TimerFunction( int value ){    // called when anim is set and arrow key is pressed
246   int i;   int i;
247    
248   switch(value){                     // increments in the correct direction   switch(value){                     // increments in the correct direction
249    case DOWN : if( xz ){    case DOWN : if( xz && yoffset>0 )
250                 if( offset>0 )                 yoffset--;
                 offset--;  
               }  
251                else{                else{
252                 if( ilev<NZ )                 if( yz && xoffset<NX-1 )
253                  ilev++;              // if down arrow pressed, move down a level                        xoffset++;
254                   else
255                    if( ilev<NZ && !xz && !yz )
256                     ilev++;              // if down arrow pressed, move down a level      
257                }                }
258                break;                break;
259    case UP   : if( xz ){    case UP   : if( xz && yoffset<NY-1 )
260                 if( offset<NY-1 )                 yoffset++;
                 offset++;  
               }  
261                else{                else{
262                 if( ilev>1 )                     if( yz && xoffset>0 )
263                  ilev--;              // if up arrow is pressed, move up a level                  xoffset--;
264                   else
265                    if( ilev>1 && !xz && !yz )    
266                     ilev--;              // if up arrow is pressed, move up a level
267                }                }
268                break;                break;
269    case LEFT : if( count>0 )          case LEFT : if( count>0 )      
# Line 233  void TimerFunction( int value ){    // c Line 276  void TimerFunction( int value ){    // c
276    
277   glutPostRedisplay();               glutPostRedisplay();            
278    
279   if (anim )   if ( anim )
280    switch( value ){        switch( value ){    
281     case DOWN : if( xz ){     case DOWN : if( xz && yoffset==0 )
282                  if( offset==0 ) offset=NY-1;                  yoffset=NY-1;
                }  
283                 else{                 else{
284                  if( ilev==NZ ) ilev=1;                   // if end reached, restart                  if( yz && xoffset==NX-1 )
285                     xoffset=0;
286                    else
287                     if( ilev==NZ && !xz && !yz )
288                      ilev=1;                   // if end reached, restart
289                 }                 }
290                 glutTimerFunc( 100, TimerFunction, value ); // recalls itself                 glutTimerFunc( 100, TimerFunction, value ); // recalls itself
291                 break;                 break;
292     case UP   : if( xz ){     case UP   : if( xz && yoffset==NY-1 )
293                  if( offset==NY-1) offset=0;                  yoffset=0;
                }  
294                 else{                 else{
295                  if( ilev==1 ) ilev=NZ;                   // if end reached, restart                  if( yz && xoffset==0 )
296                     xoffset=NX-1;
297                    else
298                     if( ilev==1 )
299                      ilev=NZ;                   // if end reached, restart
300                 }                 }
301                 glutTimerFunc( 100, TimerFunction, value ); // recalls itself                 glutTimerFunc( 100, TimerFunction, value ); // recalls itself
302                 break;                 break;
# Line 267  void specialkey( int key, int x, int y ) Line 316  void specialkey( int key, int x, int y )
316    glutTimerFunc( 100, TimerFunction, key);             // to scroll automatically    glutTimerFunc( 100, TimerFunction, key);             // to scroll automatically
317    
318   switch(key){   switch(key){
319    case DOWN   :  if( xz ){    case DOWN   :  if( xz && yoffset>0 )
320                    if( offset>0 )                    yoffset--;
                    offset--;  
                  }  
321                   else{                   else{
322                    if( ilev<NZ )      // if you haven't reached the bottom                    if( yz && xoffset<NY-1 )
323                     ilev++;              // keep going down                     xoffset++;
324                      else
325                       if( ilev<NZ && !xz && !yz )      // if you haven't reached the bottom
326                        ilev++;              // keep going down
327                   }                   }
328                   break;                   break;
329    case UP     :  if( xz ){    case UP     :  if( xz && yoffset<NY-1 )
330                    if( offset<NY-1 )                    yoffset++;
                    offset++;  
                  }  
331                   else{                   else{
332                    if( ilev>1 )          // if you haven't reached the top                    if( yz && xoffset>0 )
333                     ilev--;              // keep going up                     xoffset--;
334                      else
335                       if( ilev>1 )          // if you haven't reached the top
336                        ilev--;              // keep going up
337                   }                   }
338                   break;                   break;
339    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
# Line 314  void local( int i, int time, int lev ){ Line 365  void local( int i, int time, int lev ){
365   mnval=100;   mnval=100;
366   if( xz )   if( xz )
367    readxz( data[i], fns[i][time]);    readxz( data[i], fns[i][time]);
368   else   else{
369    readarray( data[i], fns[i][time], lev );      // read new array of data    if( yz )
370       readyz( data[i], fns[i][time]);
371      else
372       readarray( data[i], fns[i][time], lev );      // read new array of data
373     }
374   for( j=0; j<xmax*ymax; j++ ){   for( j=0; j<xmax*ymax; j++ ){
375    if( data[i][j] > mxval )    if( data[i][j] > mxval )
376     mxval=data[i][j];                           // set largest val to mxval     mxval=data[i][j];                           // set largest val to mxval
# Line 348  void readnames( char filename[] ){ Line 403  void readnames( char filename[] ){
403   howmany=j-1;                                  // saves number of data filenames     howmany=j-1;                                  // saves number of data filenames  
404  }  }
405    
406    void readdepths( char filename[] ){
407     int i;
408     FILE* fp;
409    
410     fp=fopen( filename, "r" );
411    
412     for( i=NZ-1; i>=0; i-- ){
413      fscanf( fp, "%d ", &depths[i] );
414      totaldepth+=depths[i];
415     }
416    
417     fclose( fp );
418    }
419    
420  void readjet(){               //reads in color scale values  void readjet(){               //reads in color scale values
421   FILE* fp;   FILE* fp;
422   int i, j;   int i, j;
423        
424   fp=fopen( "jet.dat", "r" );  // opens file containing values   fp=fopen( ".darwinview/jet.h", "r" );  // opens file containing values
425   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
426    for( j=0; j<3; j++ )    for( j=0; j<3; j++ )
427     fscanf( fp, "%f", &jet[i][j] );     fscanf( fp, "%f", &jet[i][j] );
# Line 360  void readjet(){               //reads in Line 429  void readjet(){               //reads in
429  }  }
430    
431  void readxz( float arr[], char filename[] ){  void readxz( float arr[], char filename[] ){
432   int i;   int i, j;
433   float tmp[MAX*MAX];   float tmp[MAX][MAX], tmp2[MAX*MAX];
434   FILE* fp;   FILE* fp;
435    
436   fp=fopen( filename, "rb" );     fp=fopen( filename, "rb" );  
437   for( i=0; i<NZ; i++){   for( i=0; i<NZ; i++){
438    fseek( fp, (NX*offset*4)+(i*NX*NY*4), SEEK_SET );    fseek( fp, (NX*yoffset*4)+(i*NX*NY*4), SEEK_SET );
439    fread( &arr[NX*i], sizeof( arr[0] ), NX, fp );  // reads in data to fill one level    fread( &arr[NX*i], sizeof( arr[0] ), NX, fp );  // reads in data to fill one level
440   }   }
441   fclose( fp );   fclose( fp );
442   for( i=1; i<NX*NZ+1; i++ )  
443    tmp[NX*NZ-i]=arr[i-1];   for( i=0; i<NZ; i++ )
444   for( i=0; i<NX*NZ; i++ )    for( j=0; j<NX; j++)
445    arr[i]=tmp[i];     tmp[i][j]=arr[i*NX+j];
446    
447     for( i=0; i<NZ; i++ )
448      for( j=0; j<NX; j++)
449       tmp2[i*NX+j]=tmp[NZ-i-1][j];
450    
451     for( i=0; i<NX*NZ; i++)
452      arr[i]=tmp2[i];
453    }
454    
455    void readyz( float arr[], char filename[] ){
456     int i, j;
457     float tmp[MAX][MAX], tmp2[MAX*MAX];
458     FILE* fp;  
459    
460     fp=fopen( filename, "rb" );
461     for( i=0; i<NY*NZ; i++ ){
462      fseek( fp, (xoffset*4)+(i*NX*4), SEEK_SET );
463      fread( &arr[i], sizeof( arr[0] ), 1, fp );
464     }
465     fclose(fp);
466    
467     for( i=0; i<NZ; i++ )
468      for( j=0; j<NY; j++)
469       tmp[i][j]=arr[i*NY+j];
470    
471     for( i=0; i<NZ; i++ )
472      for( j=0; j<NY; j++)
473       tmp2[i*NY+j]=tmp[NZ-i-1][j];
474    
475     for( i=0; i<NY*NZ; i++)
476      arr[i]=tmp2[i];
477  }  }
478    
479  void readarray( float arr[], char filename[], int il ){   // reads new data  void readarray( float arr[], char filename[], int il ){   // reads new data
480   FILE* fp;   FILE* fp;
481   int i;   int i;
482    
483   fp=fopen( filename, "rb" );                  // opens the file containing data   fp=fopen( filename, "rb" );                 // opens the file containing data
484   fseek( fp, (il-1)*NX*NY*4, SEEK_SET );      // seeks to the correct place using ilev   fseek( fp, (il-1)*NX*NY*4, SEEK_SET );      // seeks to the correct place using ilev
485   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
486   fclose( fp );                               // close file   fclose( fp );                               // close file
# Line 409  void do_byteswap_f32( float arr[], int n Line 509  void do_byteswap_f32( float arr[], int n
509   }   }
510  }  }
511    
512  void black(){  void black( ){
513   glClear( GL_COLOR_BUFFER_BIT );   glClear( GL_COLOR_BUFFER_BIT );
514   glutSwapBuffers();   glutSwapBuffers();
515   glFlush();   glFlush();
516  }  }
517    
518    
519  int main( int argc, char *argv[] ){  int main( int argc, char *argv[] ){
520   int i, setsx, setsy, tmpx, tmpy, winx, winy, parent;   int i, setsx, setsy, tmpx, tmpy, winx, winy, parent;
521   char filename[MAX];   char str[MAX], filename[MAX];
522     FILE* fp;
523    
524     if( strcmp(argv[1], "binary") == 0 )
525      fp=fopen( ".darwinview/binconfig", "r" );
526     else
527      if( strcmp(argv[1],"netcdf") == 0 )
528       fp=fopen( ".darwinview/ncconfig", "r" );
529    
530   sscanf( argv[1], "%dx%d", &winx, &winy );  // reads screen resolution from command line   fscanf( fp, "%dx%d ", &winx, &winy );
531   winy-=60;  winx-=20;                     // adjusts resolution so edges won't get cut off               winy-=60;  winx-=20;                     // adjusts resolution so edges won't get cut off            
532     fscanf( fp, "%d %d %d ", &NX, &NY, &NZ );
533   printf( "Please enter x, y and z dimensions.\n" );     fscanf( fp, "%dx%d ", &setsx, &setsy );                // prompts user for dimensions of subwindows
534   scanf( "%d %d %d", &NX, &NY, &NZ );           // prompts user for NX, NY, NZ   fscanf( fp, "%s", filename );
  printf( "Please enter filename.\n" );  
  scanf( "%s", filename );                         // prompts user for initial filenames  
  printf( "Please enter dimensions of data sets.\n" );  
  scanf( "%dx%d", &setsx, &setsy );                 // prompts user for dimensions of subwindows  
535    
536   xmax=NX; ymax=NY;   fclose( fp );
537    
538     xmax=NX; ymax=NY;
539    
540   readjet();                               // stores color values   readjet();                               // stores color values
541   readnames( filename );                   // gets list of filenames to read from   readnames( filename );                   // gets list of filenames to read from
542   global();                                // calculates max and min for all data   global();                                // calculates max and min for all data
# Line 453  int main( int argc, char *argv[] ){ Line 559  int main( int argc, char *argv[] ){
559    tmpy = (i/setsx)*(winy/setsy);                  // y coordinate of top left corner of subwindow    tmpy = (i/setsx)*(winy/setsy);                  // y coordinate of top left corner of subwindow
560    
561    win[i]=glutCreateSubWindow( parent, tmpx, tmpy, winx/setsx, winy/setsy ); // creates subwindow    win[i]=glutCreateSubWindow( parent, tmpx, tmpy, winx/setsx, winy/setsy ); // creates subwindow
562    gluOrtho2D( 0, NX+35, 0, NY+15 );               // sets how data is mapped to subwindow    gluOrtho2D( 0, NX+35, 0, NY+25 );               // sets how data is mapped to subwindow
563    glutKeyboardFunc( key );                        // called on key press    glutKeyboardFunc( key );                        // called on key press
564    glutSpecialFunc( specialkey );                  // called on special key press (arrow keys)    glutSpecialFunc( specialkey );                  // called on special key press (arrow keys)
565    if( i >= sets )                                 //    if( i >= sets )                                 //

Legend:
Removed from v.1.4  
changed lines
  Added in v.1.7

  ViewVC Help
Powered by ViewVC 1.1.22