/[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.5 by marissa, Mon Jul 16 19:16:26 2007 UTC
# Line 14  int NX, NY, NZ; Line 14  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(), readxz( float[], char[] );  void readnames( char[] ), readarray( float[], char[], int ), readjet(), readxz( float[], char[] );
17    void readyz( float[], char[] );
18  void TimerFunction( int ), bitmap( char[], int, int );  void TimerFunction( int ), bitmap( char[], int, int );
19    
20  float data[MAX][MAX*MAX], mxval, mnval, jet[64][3];  float data[MAX][MAX*MAX], mxval, mnval, jet[64][3];
21  float globalmx=0, globalmn=100;  float globalmx=0, globalmn=100;
22  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, logscale=0, xz=0, nonegs=1, endian=0;
23  int xmax, ymax, offset=0;  int xmax, ymax, yoffset=0, xoffset=0, yz=0;
24  char initfns[MAX][MAX], fns[MAX][MAX][MAX];  char initfns[MAX][MAX], fns[MAX][MAX][MAX];
25    
26  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 60  void display(){                 // calle Line 61  void display(){                 // calle
61   for( q=0; q<sets; q++ ){           // runs display func for each subwindow   for( q=0; q<sets; q++ ){           // runs display func for each subwindow
62    glutSetWindow( win[q] );          // sets which subwindow to display to    glutSetWindow( win[q] );          // sets which subwindow to display to
63    glClear( GL_COLOR_BUFFER_BIT );   // background to black    glClear( GL_COLOR_BUFFER_BIT );   // background to black
64    if( xz )   ymax=NZ;    if( xz ) {  xmax=NX;  ymax=NZ;  }
65    else       ymax=NY;    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 141  void display(){                 // calle Line 149  void display(){                 // calle
149    bitmap( str, xmax+2, 1 );    bitmap( str, xmax+2, 1 );
150    
151    if( xz )    if( xz )
152     sprintf( str, "Y-coordinate=%d", offset+1);     sprintf( str, "Y-coordinate=%d", yoffset+1);
153    else    else{
154     sprintf( str, "Level %d", ilev ); // labels current level     if( yz )
155        sprintf( str, "X-coordinate=%d", xoffset+1);
156       else
157        sprintf( str, "Level %d", ilev ); // labels current level
158      }
159    bitmap( str, 1, ymax+3 );    bitmap( str, 1, ymax+3 );
160    
161    sprintf( str, "Time %d", count+1 ); // labels current time    sprintf( str, "Time %d", count+1 ); // labels current time
# Line 196  void key( unsigned char key, int x, int Line 208  void key( unsigned char key, int x, int
208                glutPostRedisplay();                            glutPostRedisplay();            
209                break;                break;
210    case 'x':   xz=(xz+1)%2;    case 'x':   xz=(xz+1)%2;
211                  yz=0;
212                glutPostRedisplay();                glutPostRedisplay();
213                break;                break;
214      case 'y':   yz=(yz+1)%2;
215                  xz=0;
216                  glutPostRedisplay();
217   }   }
218  }  }
219    
# Line 205  void TimerFunction( int value ){    // c Line 221  void TimerFunction( int value ){    // c
221   int i;   int i;
222    
223   switch(value){                     // increments in the correct direction   switch(value){                     // increments in the correct direction
224    case DOWN : if( xz ){    case DOWN : if( xz && yoffset>0 )
225                 if( offset>0 )                 yoffset--;
                 offset--;  
               }  
226                else{                else{
227                 if( ilev<NZ )                 if( yz && xoffset<NX-1 )
228                  ilev++;              // if down arrow pressed, move down a level                        xoffset++;
229                   else
230                    if( ilev<NZ && !xz && !yz )
231                     ilev++;              // if down arrow pressed, move down a level      
232                }                }
233                break;                break;
234    case UP   : if( xz ){    case UP   : if( xz && yoffset<NY-1 )
235                 if( offset<NY-1 )                 yoffset++;
                 offset++;  
               }  
236                else{                else{
237                 if( ilev>1 )                     if( yz && xoffset>0 )
238                  ilev--;              // if up arrow is pressed, move up a level                  xoffset--;
239                   else
240                    if( ilev>1 && !xz && !yz )    
241                     ilev--;              // if up arrow is pressed, move up a level
242                }                }
243                break;                break;
244    case LEFT : if( count>0 )          case LEFT : if( count>0 )      
# Line 233  void TimerFunction( int value ){    // c Line 251  void TimerFunction( int value ){    // c
251    
252   glutPostRedisplay();               glutPostRedisplay();            
253    
254   if (anim )   if ( anim )
255    switch( value ){        switch( value ){    
256     case DOWN : if( xz ){     case DOWN : if( xz && yoffset==0 )
257                  if( offset==0 ) offset=NY-1;                  yoffset=NY-1;
                }  
258                 else{                 else{
259                  if( ilev==NZ ) ilev=1;                   // if end reached, restart                  if( yz && xoffset==NX-1 )
260                     xoffset=0;
261                    else
262                     if( ilev==NZ && !xz && !yz )
263                      ilev=1;                   // if end reached, restart
264                 }                 }
265                 glutTimerFunc( 100, TimerFunction, value ); // recalls itself                 glutTimerFunc( 100, TimerFunction, value ); // recalls itself
266                 break;                 break;
267     case UP   : if( xz ){     case UP   : if( xz && yoffset==NY-1 )
268                  if( offset==NY-1) offset=0;                  yoffset=0;
                }  
269                 else{                 else{
270                  if( ilev==1 ) ilev=NZ;                   // if end reached, restart                  if( yz && xoffset==0 )
271                     xoffset=NX-1;
272                    else
273                     if( ilev==1 )
274                      ilev=NZ;                   // if end reached, restart
275                 }                 }
276                 glutTimerFunc( 100, TimerFunction, value ); // recalls itself                 glutTimerFunc( 100, TimerFunction, value ); // recalls itself
277                 break;                 break;
# Line 267  void specialkey( int key, int x, int y ) Line 291  void specialkey( int key, int x, int y )
291    glutTimerFunc( 100, TimerFunction, key);             // to scroll automatically    glutTimerFunc( 100, TimerFunction, key);             // to scroll automatically
292    
293   switch(key){   switch(key){
294    case DOWN   :  if( xz ){    case DOWN   :  if( xz && yoffset>0 )
295                    if( offset>0 )                    yoffset--;
                    offset--;  
                  }  
296                   else{                   else{
297                    if( ilev<NZ )      // if you haven't reached the bottom                    if( yz && xoffset<NY-1 )
298                     ilev++;              // keep going down                     xoffset++;
299                      else
300                       if( ilev<NZ && !xz && !yz )      // if you haven't reached the bottom
301                        ilev++;              // keep going down
302                   }                   }
303                   break;                   break;
304    case UP     :  if( xz ){    case UP     :  if( xz && yoffset<NY-1 )
305                    if( offset<NY-1 )                    yoffset++;
                    offset++;  
                  }  
306                   else{                   else{
307                    if( ilev>1 )          // if you haven't reached the top                    if( yz && xoffset>0 )
308                     ilev--;              // keep going up                     xoffset--;
309                      else
310                       if( ilev>1 )          // if you haven't reached the top
311                        ilev--;              // keep going up
312                   }                   }
313                   break;                   break;
314    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 340  void local( int i, int time, int lev ){
340   mnval=100;   mnval=100;
341   if( xz )   if( xz )
342    readxz( data[i], fns[i][time]);    readxz( data[i], fns[i][time]);
343   else   else{
344    readarray( data[i], fns[i][time], lev );      // read new array of data    if( yz )
345       readyz( data[i], fns[i][time]);
346      else
347       readarray( data[i], fns[i][time], lev );      // read new array of data
348     }
349   for( j=0; j<xmax*ymax; j++ ){   for( j=0; j<xmax*ymax; j++ ){
350    if( data[i][j] > mxval )    if( data[i][j] > mxval )
351     mxval=data[i][j];                           // set largest val to mxval     mxval=data[i][j];                           // set largest val to mxval
# Line 360  void readjet(){               //reads in Line 390  void readjet(){               //reads in
390  }  }
391    
392  void readxz( float arr[], char filename[] ){  void readxz( float arr[], char filename[] ){
393   int i;   int i, j;
394   float tmp[MAX*MAX];   float tmp[MAX][MAX], tmp2[MAX*MAX];
395   FILE* fp;   FILE* fp;
396    
397   fp=fopen( filename, "rb" );     fp=fopen( filename, "rb" );  
398   for( i=0; i<NZ; i++){   for( i=0; i<NZ; i++){
399    fseek( fp, (NX*offset*4)+(i*NX*NY*4), SEEK_SET );    fseek( fp, (NX*yoffset*4)+(i*NX*NY*4), SEEK_SET );
400    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
401   }   }
402   fclose( fp );   fclose( fp );
403   for( i=1; i<NX*NZ+1; i++ )  
404    tmp[NX*NZ-i]=arr[i-1];   for( i=0; i<NZ; i++ )
405   for( i=0; i<NX*NZ; i++ )    for( j=0; j<NX; j++)
406    arr[i]=tmp[i];     tmp[i][j]=arr[i*NX+j];
407    
408     for( i=0; i<NZ; i++ )
409      for( j=0; j<NX; j++)
410       tmp2[i*NX+j]=tmp[NZ-i-1][j];
411    
412     for( i=0; i<NX*NZ; i++)
413      arr[i]=tmp2[i];
414    }
415    
416    void readyz( float arr[], char filename[] ){
417     int i, j;
418     float tmp[MAX][MAX], tmp2[MAX*MAX];
419     FILE* fp;  
420    
421     fp=fopen( filename, "rb" );
422     for( i=0; i<NY*NZ; i++ ){
423      fseek( fp, (xoffset*4)+(i*NX*4), SEEK_SET );
424      fread( &arr[i], sizeof( arr[0] ), 1, fp );
425     }
426     fclose(fp);
427    
428     for( i=0; i<NZ; i++ )
429      for( j=0; j<NY; j++)
430       tmp[i][j]=arr[i*NY+j];
431    
432     for( i=0; i<NZ; i++ )
433      for( j=0; j<NY; j++)
434       tmp2[i*NY+j]=tmp[NZ-i-1][j];
435    
436     for( i=0; i<NY*NZ; i++)
437      arr[i]=tmp2[i];
438  }  }
439    
440  void readarray( float arr[], char filename[], int il ){   // reads new data  void readarray( float arr[], char filename[], int il ){   // reads new data
441   FILE* fp;   FILE* fp;
442   int i;   int i;
443    
444   fp=fopen( filename, "rb" );                  // opens the file containing data   fp=fopen( filename, "rb" );                 // opens the file containing data
445   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
446   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
447   fclose( fp );                               // close file   fclose( fp );                               // close file

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

  ViewVC Help
Powered by ViewVC 1.1.22