--- MITgcm_contrib/darwinview/src/darwin.c 2007/07/12 18:30:19 1.2 +++ MITgcm_contrib/darwinview/src/darwin.c 2007/07/13 18:47:12 1.3 @@ -10,7 +10,7 @@ #define LEFT 100 #define MAX 200 -int NX, NY, MAXNZ, setsx, setsy; +int NX, NY, NZ; void do_byteswap_f32( float arr[], int nel ), global(), local( int, int, int ); void readnames( char[] ), readarray( float[], char[], int ), readjet(); @@ -18,7 +18,7 @@ float data[MAX][MAX*MAX], mxval, mnval, jet[MAX][MAX]; float globalmx=0, globalmn=100; -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; char initfns[MAX][MAX], fns[MAX][MAX][MAX]; void menu(int value){ // called when menu is opened on right click @@ -42,16 +42,21 @@ case 4: logscale=(logscale+1)%2; // switch log scale on/off glutPostRedisplay(); break; + case 5: nonegs=(nonegs+1)%2; // switch allowance of negatives on/off + glutPostRedisplay(); + break; + case 6: endian=(endian+1)%2; // switch between big/little endian + glutPostRedisplay(); + break; } } - void display(void){ // called on glutPostRedisplay int i, j, ioff, q; float r, g, b, k, y; double num, logmx, logmn; char str[MAX]; - for( q=0; qlogmx ) num=63; - else - num=63*( num-logmn )/( logmx-logmn ); + else{ + if( num>logmx ) num=63; + else + num=63*( num-logmn )/( logmx-logmn ); + } } else{ if( data[q][ioff]mxval ) num=63; // if data is more than max, =max else num=63*( data[q][ioff]-mnval )/( mxval-mnval ); // scale num from 0-63 (not defined for 64) + } } r=jet[(int)num][0]; // set red val g=jet[(int)num][1]; // set green val @@ -115,13 +123,13 @@ if( logscale ) sprintf( str, "%.2f", logmx ); else - sprintf( str, "%.2e", mxval ); // labels color bar with max val + sprintf( str, "%.1e", mxval ); // labels color bar with max val bitmap( str, NX+2, NY-1 ); if( logscale ) sprintf( str, "%.2f", logmn ); else - sprintf( str, "%.2e", mnval ); // labels color bar with min val + sprintf( str, "%.1e", mnval ); // labels color bar with min val bitmap( str, NX+2, 1 ); sprintf( str, "Level %d", ilev ); // labels current level @@ -164,7 +172,7 @@ } void key( unsigned char key, int x, int y ){ // called on key press - int i; + int i, tmp; switch(key){ case 'q': exit(0); // quits on 'q' @@ -183,7 +191,7 @@ int i; switch(value){ // increments in the correct direction - case DOWN : if( ilev1 ) @@ -201,10 +209,10 @@ if (anim ) switch( value ){ - case DOWN : if( ilev==MAXNZ ) ilev=1; // if end reached, restart + case DOWN : if( ilev==NZ ) ilev=1; // if end reached, restart glutTimerFunc( 100, TimerFunction, value ); // recalls itself break; - case UP : if( ilev==1 ) ilev=MAXNZ; // if end reached, restart + case UP : if( ilev==1 ) ilev=NZ; // if end reached, restart glutTimerFunc( 100, TimerFunction, value ); // recalls itself break; case LEFT : if( count==0 ) count=howmany-1; // if end reached, restart @@ -223,7 +231,7 @@ glutTimerFunc( 100, TimerFunction, key); // to scroll automatically switch(key){ - case DOWN : if( ilev1 ) // if you haven't reached the top @@ -242,9 +250,9 @@ void global(){ // calculates the max/min for the total data set FILE* fp; int h, i, j; - for( h=0; h globalmx ) globalmx = mxval; // sets highest value to globalmx if( mnval < globalmn ) globalmn = mnval; // sets lowest value to globalmn @@ -260,7 +268,7 @@ for( j=0; j mxval ) mxval=data[i][j]; // set largest val to mxval - if( data[i][j] < mnval && data[i][j] > 0 ) + if( data[i][j] < mnval && data[i][j]!=0 ) mnval=data[i][j]; // set smallest positive val to mnval } } @@ -275,9 +283,9 @@ i++; // counts how many filenames there are } fclose( fp ); // close file - howmany=i-1; // saves number of initial filenames + sets=i-1; // saves number of initial filenames - for(i=0; i= sets ) // + glutDisplayFunc( black ); + else + glutDisplayFunc( display ); // sets display func for subwindow + - glutCreateMenu( menu ); // adds a menu - glutAddMenuEntry( "Local Color Scale", 1 ); // adds a menu entry - glutAddMenuEntry( "Global Color Scale", 2 ); // adds a menu entry - glutAddMenuEntry( "User-Set Color Scale", 3 ); // adds a menu entry - glutAddMenuEntry( "Log Scale (on/off)", 4 ); // adds a menu entry - glutAttachMenu( GLUT_RIGHT_BUTTON ); // menu called on right click + glutCreateMenu( menu ); // adds a menu + glutAddMenuEntry( "Local Color Scale", 1 ); // adds a menu entry + glutAddMenuEntry( "Global Color Scale", 2 ); // adds a menu entry + glutAddMenuEntry( "User-Set Color Scale", 3 ); // adds a menu entry + glutAddMenuEntry( "Log Scale (on/off)", 4 ); // adds a menu entry + glutAddMenuEntry( "Allow Negatives (on/off)", 5 ); // adds a menu entry + glutAddMenuEntry( "Switch Endian (big/little) ", 6); // adds a menu entry + glutAttachMenu( GLUT_RIGHT_BUTTON ); // menu called on right click } glutMainLoop(); // begin processing events