/[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.2 by marissa, Thu Jul 12 18:30:19 2007 UTC revision 1.3 by marissa, Fri Jul 13 18:47:12 2007 UTC
# Line 10  Line 10 
10  #define LEFT 100  #define LEFT 100
11  #define MAX 200  #define MAX 200
12    
13  int NX, NY, MAXNZ, setsx, setsy;  int NX, NY, NZ;
14    
15  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 );
16  void readnames( char[] ), readarray( float[], char[], int ), readjet();  void readnames( char[] ), readarray( float[], char[], int ), readjet();
# Line 18  void TimerFunction( int ), bitmap( char[ Line 18  void TimerFunction( int ), bitmap( char[
18    
19  float data[MAX][MAX*MAX], mxval, mnval, jet[MAX][MAX];  float data[MAX][MAX*MAX], mxval, mnval, jet[MAX][MAX];
20  float globalmx=0, globalmn=100;  float globalmx=0, globalmn=100;
21  int win[MAX], ilev=1, howmany, count=0, glo=0, usr=0, anim=0, logscale=0;  int win[MAX], ilev=1, howmany, sets, count=0, glo=0, usr=0, anim=0, logscale=0, nonegs=1, endian=0;
22  char initfns[MAX][MAX], fns[MAX][MAX][MAX];  char initfns[MAX][MAX], fns[MAX][MAX][MAX];
23    
24  void menu(int value){           // called when menu is opened on right click  void menu(int value){           // called when menu is opened on right click
# Line 42  void menu(int value){           // calle Line 42  void menu(int value){           // calle
42    case 4: logscale=(logscale+1)%2;  // switch log scale on/off    case 4: logscale=(logscale+1)%2;  // switch log scale on/off
43            glutPostRedisplay();            glutPostRedisplay();
44            break;            break;
45      case 5: nonegs=(nonegs+1)%2;      // switch allowance of negatives on/off
46              glutPostRedisplay();
47              break;
48      case 6: endian=(endian+1)%2;      // switch between big/little endian
49              glutPostRedisplay();
50              break;
51   }   }
52  }  }
   
53  void display(void){                 // called on glutPostRedisplay  void display(void){                 // called on glutPostRedisplay
54   int i, j, ioff, q;   int i, j, 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   for( q=0; q<setsx*setsy; q++ ){    // runs display func for each subwindow   for( q=0; q<sets; q++ ){    // runs display func for each subwindow
60    glutSetWindow( win[q] );          // sets which subwindow to display to    glutSetWindow( win[q] );          // sets which subwindow to display to
61    glClear( GL_COLOR_BUFFER_BIT );   // background to black    glClear( GL_COLOR_BUFFER_BIT );   // background to black
62    if( glo || usr )                  // if global or user-set max/min    if( glo || usr )                  // if global or user-set max/min
# Line 80  void display(void){                 // c Line 85  void display(void){                 // c
85        num=(double)data[q][ioff];        num=(double)data[q][ioff];
86        num=log10( num );        num=log10( num );
87        if( num<logmn ) num=0;        if( num<logmn ) num=0;
88        if( num>logmx ) num=63;        else{
89        else         if( num>logmx ) num=63;
90         num=63*( num-logmn )/( logmx-logmn );         else
91            num=63*( num-logmn )/( logmx-logmn );
92          }
93       }       }
94       else{       else{
95        if( data[q][ioff]<mnval )  num=0;   // if data is less than min, =min        if( data[q][ioff]<mnval )  num=0;   // if data is less than min, =min
96        else        else{
97         if( data[q][ioff]>mxval )  num=63; // if data is more than max, =max         if( data[q][ioff]>mxval )  num=63; // if data is more than max, =max
98         else         else
99          num=63*( data[q][ioff]-mnval )/( mxval-mnval );  // scale num from 0-63 (not defined for 64)          num=63*( data[q][ioff]-mnval )/( mxval-mnval );  // scale num from 0-63 (not defined for 64)
100          }
101       }       }
102       r=jet[(int)num][0];            // set red val       r=jet[(int)num][0];            // set red val
103       g=jet[(int)num][1];            // set green val       g=jet[(int)num][1];            // set green val
# Line 115  void display(void){                 // c Line 123  void display(void){                 // c
123    if( logscale )    if( logscale )
124     sprintf( str, "%.2f", logmx );     sprintf( str, "%.2f", logmx );
125    else    else
126     sprintf( str, "%.2e", mxval );    // labels color bar with max val     sprintf( str, "%.1e", mxval );    // labels color bar with max val
127    bitmap( str, NX+2, NY-1 );    bitmap( str, NX+2, NY-1 );
128        
129    if( logscale )    if( logscale )
130     sprintf( str, "%.2f", logmn );     sprintf( str, "%.2f", logmn );
131    else    else
132     sprintf( str, "%.2e", mnval );    // labels color bar with min val     sprintf( str, "%.1e", mnval );    // labels color bar with min val
133    bitmap( str, NX+2, 1 );    bitmap( str, NX+2, 1 );
134    
135    sprintf( str, "Level %d", ilev ); // labels current level    sprintf( str, "Level %d", ilev ); // labels current level
# Line 164  void bitmap( char str[], int x, int y ){ Line 172  void bitmap( char str[], int x, int y ){
172  }  }
173    
174  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
175   int i;   int i, tmp;
176    
177   switch(key){   switch(key){
178    case 'q':   exit(0);              // quits on 'q'    case 'q':   exit(0);              // quits on 'q'
# Line 183  void TimerFunction( int value ){    // c Line 191  void TimerFunction( int value ){    // c
191   int i;   int i;
192    
193   switch(value){                     // increments in the correct direction   switch(value){                     // increments in the correct direction
194    case DOWN : if( ilev<MAXNZ )    case DOWN : if( ilev<NZ )
195                 ilev++;              // if down arrow pressed, move down a level                       ilev++;              // if down arrow pressed, move down a level      
196                break;                break;
197    case UP   : if( ilev>1 )        case UP   : if( ilev>1 )    
# Line 201  void TimerFunction( int value ){    // c Line 209  void TimerFunction( int value ){    // c
209    
210   if (anim )   if (anim )
211    switch( value ){        switch( value ){    
212     case DOWN : if( ilev==MAXNZ ) ilev=1;                   // if end reached, restart     case DOWN : if( ilev==NZ ) ilev=1;                   // if end reached, restart
213                 glutTimerFunc( 100, TimerFunction, value ); // recalls itself                 glutTimerFunc( 100, TimerFunction, value ); // recalls itself
214                 break;                 break;
215     case UP   : if( ilev==1 ) ilev=MAXNZ;                   // if end reached, restart     case UP   : if( ilev==1 ) ilev=NZ;                   // if end reached, restart
216                 glutTimerFunc( 100, TimerFunction, value ); // recalls itself                 glutTimerFunc( 100, TimerFunction, value ); // recalls itself
217                 break;                 break;
218     case LEFT : if( count==0 ) count=howmany-1;             // if end reached, restart     case LEFT : if( count==0 ) count=howmany-1;             // if end reached, restart
# Line 223  void specialkey( int key, int x, int y ) Line 231  void specialkey( int key, int x, int y )
231    glutTimerFunc( 100, TimerFunction, key);             // to scroll automatically    glutTimerFunc( 100, TimerFunction, key);             // to scroll automatically
232    
233   switch(key){   switch(key){
234    case DOWN   :  if( ilev<MAXNZ )      // if you haven't reached the bottom    case DOWN   :  if( ilev<NZ )      // if you haven't reached the bottom
235                    ilev++;              // keep going down                    ilev++;              // keep going down
236                   break;                   break;
237    case UP     :  if( ilev>1 )          // if you haven't reached the top    case UP     :  if( ilev>1 )          // if you haven't reached the top
# Line 242  void specialkey( int key, int x, int y ) Line 250  void specialkey( int key, int x, int y )
250  void global(){                         // calculates the max/min for the total data set  void global(){                         // calculates the max/min for the total data set
251   FILE* fp;   FILE* fp;
252   int h, i, j;   int h, i, j;
253   for( h=0; h<setsx*setsy; h++)         // cycles through each window   for( h=0; h<sets; h++)                // cycles through each window
254    for( i=0; i<howmany; i++ )           // cycles through each time    for( i=0; i<howmany; i++ )           // cycles through each time
255     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
256      local( h, i, j );                  // calculates local max/min for specific data set      local( h, i, j );                  // calculates local max/min for specific data set
257      if( mxval > globalmx ) globalmx = mxval;   // sets highest value to globalmx      if( mxval > globalmx ) globalmx = mxval;   // sets highest value to globalmx
258      if( mnval < globalmn ) globalmn = mnval;   // sets lowest value to globalmn      if( mnval < globalmn ) globalmn = mnval;   // sets lowest value to globalmn
# Line 260  void local( int i, int time, int lev ){ Line 268  void local( int i, int time, int lev ){
268   for( j=0; j<NX*NY; j++ ){   for( j=0; j<NX*NY; j++ ){
269    if( data[i][j] > mxval )    if( data[i][j] > mxval )
270     mxval=data[i][j];                           // set largest val to mxval     mxval=data[i][j];                           // set largest val to mxval
271    if( data[i][j] < mnval && data[i][j] > 0 )    if( data[i][j] < mnval && data[i][j]!=0 )
272     mnval=data[i][j];                           // set smallest positive val to mnval     mnval=data[i][j];                           // set smallest positive val to mnval
273   }   }
274  }  }
# Line 275  void readnames( char filename[] ){ Line 283  void readnames( char filename[] ){
283    i++;                                         // counts how many filenames there are      i++;                                         // counts how many filenames there are  
284   }   }
285   fclose( fp );                                 // close file   fclose( fp );                                 // close file
286   howmany=i-1;                                  // saves number of initial filenames   sets=i-1;                                  // saves number of initial filenames
287    
288   for(i=0; i<howmany; i++){                     // goes through each read-in filename   for(i=0; i<sets; i++){                     // goes through each read-in filename
289    fp=fopen( initfns[i], "r" );                 // opens each filename      fp=fopen( initfns[i], "r" );                 // opens each filename  
290    j=0;    j=0;
291    while( !feof(fp) ){                          // reads in filenames from each filename    while( !feof(fp) ){                          // reads in filenames from each filename
# Line 290  void readnames( char filename[] ){ Line 298  void readnames( char filename[] ){
298  }  }
299    
300  void readjet(){               //reads in color scale values  void readjet(){               //reads in color scale values
   
301   FILE* fp;   FILE* fp;
302   int i, j;   int i, j;
303        
# Line 301  void readjet(){               //reads in Line 308  void readjet(){               //reads in
308   fclose( fp );                // closes file   fclose( fp );                // closes file
309  }  }
310    
   
311  void readarray( float arr[], char filename[], int il ){   // reads new data  void readarray( float arr[], char filename[], int il ){   // reads new data
312   FILE *fp;   FILE* fp;
313   int i;   int i;
314    
315   fp=fopen( filename, "r" );                  // opens the file containing data   fp=fopen( filename, "r" );                  // opens the file containing data
316   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
317   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
318   fclose( fp );                               // close file   fclose( fp );                               // close file
  for( i=0; i<NX*NY; i++ )                      
   if( arr[i] < 0 )  arr[i] = pow(10, -20);   // sets negative values to 10^-20  
319    
320   //do_byteswap_f32( arr, NX*NY );            // switches endian   if( nonegs )
321      for( i=0; i<NX*NY; i++ )                    
322       if( arr[i] < 0 )
323        arr[i] = pow(10, -20);   // sets negative values to 10^-20
324    
325     if( endian )
326      do_byteswap_f32( arr, NX*NY );            // switches endian
327  }  }
328    
329  void do_byteswap_f32( float arr[], int nel ) // switches endian  void do_byteswap_f32( float arr[], int nel ){ // switches endian
330  {  
331     int i;   int i;
332     char src[4];   char src[4], trg[4];
333     char trg[4];  
334     for( i=0; i<nel; i++ ){   for( i=0; i<nel; i++ ){
335      memcpy( src, &(arr[i]), 4);    memcpy( src, &(arr[i]), 4 );
336      trg[0]=src[3];    trg[0]=src[3];
337      trg[1]=src[2];    trg[1]=src[2];
338      trg[2]=src[1];    trg[2]=src[1];
339      trg[3]=src[0];    trg[3]=src[0];
340      memcpy( &(arr[i]), trg, 4);    memcpy( &(arr[i]), trg, 4 );
341     }   }
342    }
343    
344    void black(){
345     glClear( GL_COLOR_BUFFER_BIT );
346     glutSwapBuffers();
347     glFlush();
348  }  }
349    
350  int main( int argc, char *argv[] ){  int main( int argc, char *argv[] ){
351   int i, tmpx, tmpy, winx, winy, parent;   int i, setsx, setsy, tmpx, tmpy, winx, winy, parent;
352   char filename[MAX];   char filename[MAX];
353    
354   sscanf(argv[1], "%dx%d", &winx, &winy);  // reads screen resolution from command line   sscanf( argv[1], "%dx%d", &winx, &winy );  // reads screen resolution from command line
355   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            
356    
357   printf( "Please enter x, y and z dimensions.\n" );     printf( "Please enter x, y and z dimensions.\n" );  
358   scanf( "%d %d %d", &NX, &NY, &MAXNZ );           // prompts user for NX, NY, NZ   scanf( "%d %d %d", &NX, &NY, &NZ );           // prompts user for NX, NY, NZ
359   printf( "Please enter filename.\n" );   printf( "Please enter filename.\n" );
360   scanf( "%s", filename );                         // prompts user for initial filenames   scanf( "%s", filename );                         // prompts user for initial filenames
361   printf( "Please enter dimensions of data sets.\n" );   printf( "Please enter dimensions of data sets.\n" );
362   scanf( "%dx%d", &setsx, &setsy);                 // prompts user for dimensions of subwindows   scanf( "%dx%d", &setsx, &setsy );                 // prompts user for dimensions of subwindows
363    
364   readjet();                               // stores color values   readjet();                               // stores color values
365   readnames( filename );                   // gets list of filenames to read from   readnames( filename );                   // gets list of filenames to read from
# Line 360  int main( int argc, char *argv[] ){ Line 376  int main( int argc, char *argv[] ){
376   glutDisplayFunc( display );   glutDisplayFunc( display );
377   glutKeyboardFunc( key );                         // called on key press   glutKeyboardFunc( key );                         // called on key press
378   glutSpecialFunc( specialkey );                   // called on special key press (arrow keys)   glutSpecialFunc( specialkey );                   // called on special key press (arrow keys)
379    
380    
381   for( i=0; i<setsx*setsy; i++ ){   for( i=0; i<setsx*setsy; i++ ){
382    tmpx = (i%setsx)*(winx/setsx);                  // x coordinate of top left corner of subwindow    tmpx = (i%setsx)*(winx/setsx);                  // x coordinate of top left corner of subwindow
383    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
384    
   local( i, count, ilev );                        // reads curr data array, finds local max/min  
   
385    win[i]=glutCreateSubWindow( parent, tmpx, tmpy, winx/setsx, winy/setsy ); // creates subwindow    win[i]=glutCreateSubWindow( parent, tmpx, tmpy, winx/setsx, winy/setsy ); // creates subwindow
386    gluOrtho2D( 0, NX+35, 0, NY+15 );               // sets how data is mapped to subwindow    gluOrtho2D( 0, NX+35, 0, NY+15 );               // sets how data is mapped to subwindow
   glutDisplayFunc( display );                     // sets display func for subwindow  
387    glutKeyboardFunc( key );                        // called on key press    glutKeyboardFunc( key );                        // called on key press
388    glutSpecialFunc( specialkey );                  // called on special key press (arrow keys)    glutSpecialFunc( specialkey );                  // called on special key press (arrow keys)
389      if( i >= sets )                                 //
390       glutDisplayFunc( black );
391      else
392       glutDisplayFunc( display );                     // sets display func for subwindow
393      
394    
395    glutCreateMenu( menu );                         // adds a menu    glutCreateMenu( menu );                                // adds a menu
396     glutAddMenuEntry( "Local Color Scale", 1 );    // adds a menu entry     glutAddMenuEntry( "Local Color Scale", 1 );           // adds a menu entry
397     glutAddMenuEntry( "Global Color Scale", 2 );   // adds a menu entry     glutAddMenuEntry( "Global Color Scale", 2 );          // adds a menu entry
398     glutAddMenuEntry( "User-Set Color Scale", 3 ); // adds a menu entry     glutAddMenuEntry( "User-Set Color Scale", 3 );        // adds a menu entry
399     glutAddMenuEntry( "Log Scale (on/off)", 4 );   // adds a menu entry     glutAddMenuEntry( "Log Scale (on/off)", 4 );          // adds a menu entry
400    glutAttachMenu( GLUT_RIGHT_BUTTON );            // menu called on right click     glutAddMenuEntry( "Allow Negatives (on/off)", 5 );    // adds a menu entry
401       glutAddMenuEntry( "Switch Endian (big/little) ", 6);  // adds a menu entry
402      glutAttachMenu( GLUT_RIGHT_BUTTON );                   // menu called on right click
403   }   }
404    
405   glutMainLoop();                                  // begin processing events   glutMainLoop();                                  // begin processing events

Legend:
Removed from v.1.2  
changed lines
  Added in v.1.3

  ViewVC Help
Powered by ViewVC 1.1.22