00001 #include <glib.h> 00002 #include <sed/sed_sedflux.h> 00003 00004 static gchar* out_file = NULL; 00005 static double val = 1.; 00006 static double time_key = 0.; 00007 static gint n_x = 100; 00008 static gint n_y = 100; 00009 static gboolean big_endian = FALSE; 00010 static gboolean little_endian = FALSE; 00011 static gboolean append = FALSE; 00012 static gboolean version = FALSE; 00013 static gint verbosity = 0; 00014 static gboolean debug = FALSE; 00015 00016 GOptionEntry entries[] = 00017 { 00018 { "out-file" , 'o' , 0 , G_OPTION_ARG_FILENAME , &out_file , "Output sequence file" , "<file>" } , 00019 { "val" , 's' , 0 , G_OPTION_ARG_DOUBLE , &val , "Sequence value" , "X" } , 00020 { "time" , 't' , 0 , G_OPTION_ARG_DOUBLE , &time_key , "Time value of the grid" , "TIME" } , 00021 { "nx" , 'x' , 0 , G_OPTION_ARG_INT , &n_x , "Number of cell in x-dimension" , "NX" } , 00022 { "ny" , 'y' , 0 , G_OPTION_ARG_INT , &n_y , "Number of cell in y-dimension" , "NY" } , 00023 { "big-endian" , 'b' , 0 , G_OPTION_ARG_NONE , &big_endian , "Byte order is big endian" , NULL } , 00024 { "little-endian" , 'l' , 0 , G_OPTION_ARG_NONE , &little_endian , "Byte order is little endian" , NULL } , 00025 { "append" , 'a' , 0 , G_OPTION_ARG_NONE , &append , "Append a grid to the sequence" , NULL } , 00026 { "verbose" , 'V' , 0 , G_OPTION_ARG_INT , &verbosity , "Verbosity level" , "n" } , 00027 { "version" , 'v' , 0 , G_OPTION_ARG_NONE , &version , "Version number" , NULL } , 00028 { "debug" , 'd' , 0 , G_OPTION_ARG_NONE , &debug , "Write debugging messages" , NULL } , 00029 { NULL } 00030 }; 00031 00032 int main( int argc , char* argv[] ) 00033 { 00034 GOptionContext* context = g_option_context_new( "Create a sequence grid file for sedflux-3d" ); 00035 GError* error = NULL; 00036 FILE* fp_out = stdout; 00037 gint byte_order = G_BYTE_ORDER; 00038 00039 g_option_context_add_main_entries( context , entries , NULL ); 00040 00041 if ( !g_option_context_parse( context , &argc , &argv , &error ) ) 00042 eh_error( "Error parsing command line arguments: %s" , error->message ); 00043 00044 if ( version ) 00045 eh_fprint_version_info( stdout , "sedflux-make-sequence" , 0 , 9 , 0 ), exit(0); 00046 00047 if ( debug ) 00048 g_setenv( "SEDFLUX_MAKE_SEQUENCE_DEBUG" , "TRUE" , TRUE ); 00049 00050 eh_set_verbosity_level( verbosity ); 00051 00052 if ( out_file ) 00053 { 00054 if ( append ) 00055 fp_out = eh_fopen_error( out_file , "a" , &error ); 00056 else 00057 fp_out = eh_fopen_error( out_file , "w" , &error ); 00058 } 00059 00060 if ( !fp_out ) 00061 eh_error( "Error opening file: %s" , error->message ); 00062 00063 if ( big_endian && little_endian ) 00064 eh_error( "Byte order must be big endian or little endian" ); 00065 else if ( !big_endian && !little_endian ) 00066 byte_order = G_BYTE_ORDER; 00067 else if ( big_endian ) 00068 byte_order = G_BIG_ENDIAN; 00069 else if ( little_endian ) 00070 byte_order = G_LITTLE_ENDIAN; 00071 00072 eh_message( "x-dimension : %d" , n_x ); 00073 eh_message( "y-dimension : %d" , n_y ); 00074 eh_message( "Grid value : %f" , val ); 00075 eh_message( "Time value : %f" , time_key ); 00076 eh_message( "Byte order : %s" , byte_order==G_BIG_ENDIAN?"Big-endian":"Little-endian" ); 00077 eh_message( "Format : %s" , "<32-bit-integer=NY> <32-bit-integer=NX> <<64-bit-double> <<64-bit-double*NX*NY>... EOF>>" ); 00078 00079 { 00080 Eh_dbl_grid g = eh_grid_new( double , n_x , n_y ); 00081 00082 eh_dbl_grid_set( g , val ); 00083 00084 if ( byte_order == G_BYTE_ORDER ) 00085 { 00086 if ( !append ) 00087 { 00088 fwrite( &n_y , sizeof(gint32) , 1 , fp_out ); 00089 fwrite( &n_x , sizeof(gint32) , 1 , fp_out ); 00090 } 00091 fwrite( &time_key , sizeof(double) , 1 , fp_out ); 00092 fwrite( eh_grid_data_start(g) , sizeof(double) , n_x*n_y , fp_out ); 00093 } 00094 else 00095 { 00096 if ( !append ) 00097 { 00098 eh_fwrite_int32_swap( &n_y , sizeof(gint32) , 1 , fp_out ); 00099 eh_fwrite_int32_swap( &n_x , sizeof(gint32) , 1 , fp_out ); 00100 } 00101 eh_fwrite_dbl_swap ( &time_key , sizeof(double) , 1 , fp_out ); 00102 eh_fwrite_dbl_swap ( eh_grid_data_start(g) , sizeof(double) , n_x*n_y , fp_out ); 00103 } 00104 00105 eh_grid_destroy( g , TRUE ); 00106 } 00107 00108 fclose( fp_out ); 00109 } 00110