/Users/huttone/Devel/sedflux-new/sedflux/trunk/ew/sedflux/run_measuring_station.c

Go to the documentation of this file.
00001 //---
00002 //
00003 // This file is part of sedflux.
00004 //
00005 // sedflux is free software; you can redistribute it and/or modify
00006 // it under the terms of the GNU General Public License as published by
00007 // the Free Software Foundation; either version 2 of the License, or
00008 // (at your option) any later version.
00009 //
00010 // sedflux is distributed in the hope that it will be useful,
00011 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00012 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00013 // GNU General Public License for more details.
00014 //
00015 // You should have received a copy of the GNU General Public License
00016 // along with sedflux; if not, write to the Free Software
00017 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00018 //
00019 //---
00020 
00021 #include <stdio.h>
00022 #include <fcntl.h>
00023 #include <string.h>
00024 #include <limits.h>
00025 
00026 #ifndef NAME_MAX
00027 # define NAME_MAX 255
00028 #endif
00029 
00030 #include <utils/utils.h>
00031 #include <sed/sed_sedflux.h>
00032 #include "my_processes.h"
00033 
00034 /*
00035 int write_measurement_header( FILE *fp , 
00036                               Met_station_t *measuring_station_const );
00037 */
00038 
00039 gboolean init_met_station_data( Sed_process proc , Sed_cube prof , GError** error );
00040 
00041 Sed_process_info
00042 run_met_station( Sed_process proc , Sed_cube prof )
00043 {
00044    Met_station_t*   data = sed_process_user_data(proc);
00045    Sed_process_info info = SED_EMPTY_INFO;
00046 
00047    if ( sed_process_run_count(proc)==0 )
00048       init_met_station_data( proc , prof , NULL );
00049 
00050    sed_tripod_write( data->met_fp , prof );
00051 
00052    return info;
00053 }
00054 
00055 #define MET_KEY_PARAMETER  "parameter to measure"
00056 #define MET_KEY_WHENCE     "position wrt river mouth"
00057 #define MET_KEY_POSITION   "position of station"
00058 #define MET_KEY_FILENAME   "filename"
00059 
00060 static gchar* measuring_station_req_labels[] =
00061 {
00062    MET_KEY_PARAMETER ,
00063    MET_KEY_WHENCE    ,
00064    MET_KEY_POSITION  ,
00065    MET_KEY_FILENAME  ,
00066    NULL
00067 };
00068 
00069 gboolean
00070 init_met_station( Sed_process p , Eh_symbol_table tab , GError** error )
00071 {
00072    Met_station_t* data    = sed_process_new_user_data( p , Met_station_t );
00073    GError*        tmp_err = NULL;
00074    gboolean       is_ok   = TRUE;
00075    gchar*         pos_s   = NULL;
00076 
00077    eh_return_val_if_fail( error==NULL || *error==NULL , FALSE );
00078 
00079    data->met_fp           = NULL;
00080 
00081    if ( eh_symbol_table_require_labels( tab , measuring_station_req_labels , &tmp_err ) )
00082    {
00083       data->parameter_str    = eh_symbol_table_value     ( tab , MET_KEY_PARAMETER );
00084       data->from_river_mouth = eh_symbol_table_bool_value( tab , MET_KEY_WHENCE    );
00085       data->filename         = eh_symbol_table_value     ( tab , MET_KEY_FILENAME  );
00086       data->parameter        = sed_measurement_new( data->parameter_str );
00087 
00088       eh_require( data->parameter );
00089 
00090       pos_s                  = eh_symbol_table_lookup( tab , MET_KEY_POSITION );
00091 
00092       if ( g_ascii_strcasecmp( pos_s , "all" ) == 0 )
00093          data->pos = g_array_new( FALSE , FALSE , sizeof(double) );
00094       else
00095       {
00096          gint    i;
00097          double  d_val;
00098          gchar** position = g_strsplit ( pos_s , "," , -1 );
00099 
00100          data->pos = g_array_new( FALSE , FALSE , sizeof(double) );
00101          for ( i=0 ; !tmp_err && position[i] ; i++ )
00102          {
00103             d_val = eh_str_to_dbl( position[i] , &tmp_err );
00104 
00105             if ( !tmp_err ) g_array_append_val( data->pos , d_val );
00106          }
00107          g_strfreev(position);
00108       }
00109 
00110       eh_touch_file( data->filename , O_WRONLY|O_CREAT , &tmp_err );
00111    }
00112 
00113    if ( tmp_err )
00114    {
00115       g_propagate_error( error , tmp_err );
00116       is_ok = FALSE;
00117    }
00118 
00119    return is_ok;
00120 }
00121 
00122 gboolean
00123 init_met_station_data( Sed_process proc , Sed_cube prof , GError** error )
00124 {
00125    Met_station_t* data = sed_process_user_data( proc );
00126 
00127    if ( data )
00128    {
00129       data->met_fp = sed_tripod_new( data->filename  , data->parameter , NULL );
00130 
00131       if ( data->pos->len <= 0 )
00132          sed_tripod_set_len( data->met_fp , sed_cube_size(prof) );
00133       else
00134          sed_tripod_set_len( data->met_fp , data->pos->len      );
00135 
00136       sed_tripod_set_n_x( data->met_fp , sed_cube_n_x(prof) );
00137       sed_tripod_set_n_y( data->met_fp , sed_cube_n_y(prof) );
00138    }
00139 
00140    return TRUE;
00141 }
00142 
00143 gboolean
00144 destroy_met_station( Sed_process p )
00145 {
00146    if ( p )
00147    {
00148       Met_station_t* data = sed_process_user_data( p );
00149 
00150       if ( data )
00151       {
00152          sed_tripod_destroy( data->met_fp );
00153 
00154          if ( data->pos ) g_array_free( data->pos , FALSE );
00155 
00156          sed_measurement_destroy( data->parameter );
00157 
00158          eh_free( data->parameter_str );
00159          eh_free( data->filename      );
00160          eh_free( data                );
00161       }
00162    }
00163 
00164    return TRUE;
00165 }
00166 
00167 gboolean dump_measuring_station_data( gpointer ptr , FILE *fp )
00168 {
00169    Met_station_t *data = (Met_station_t*)ptr;
00170    gint64 len;
00171 
00172    fwrite( &(data->from_river_mouth) , sizeof(gboolean) , 1 , fp );
00173 
00174    len = strlen( data->filename )+1;
00175    fwrite( &len , sizeof(gint64) , 1 , fp );
00176    fwrite( data->filename , sizeof(char) , len , fp );
00177 
00178    len = strlen( data->parameter_str )+1;
00179    fwrite( &len , sizeof(gint64) , 1 , fp );
00180    fwrite( data->parameter_str , sizeof(char) , len , fp );
00181 
00182    len = data->pos->len;
00183    fwrite( &len , sizeof(gint64) , 1 , fp );
00184    fwrite( data->pos->data , sizeof(double) , len , fp );
00185 
00186    return TRUE;
00187 }
00188 
00189 gboolean load_measuring_station_data( gpointer ptr , FILE *fp )
00190 {
00191    Met_station_t *data = (Met_station_t*)ptr;
00192    guint len;
00193    double *pos_data;
00194 
00195    fread( &(data->from_river_mouth) , sizeof(gboolean) , 1 , fp );
00196 
00197    fread( &len , sizeof(guint) , 1 , fp );
00198    fread( data->filename , sizeof(char) , len , fp );
00199 
00200    fread( &len , sizeof(guint) , 1 , fp );
00201    fread( data->parameter_str , sizeof(char) , len , fp );
00202 
00203    fread( &len , sizeof(guint) , 1 , fp );
00204    pos_data = eh_new( double , len );
00205    fread( pos_data, sizeof(double) , len , fp );
00206 
00207    data->pos = g_array_new( FALSE , FALSE , sizeof(double) );
00208    g_array_append_vals( data->pos , pos_data , len );
00209 
00210    fread( &len , sizeof(guint) , 1 , fp );
00211    data->filename = eh_new( char , len );
00212    fread( data->filename , sizeof(char) , len , fp );
00213 
00214    eh_free( pos_data );
00215 
00216    return FALSE;
00217 }
00218 /*
00219 int write_measurement_header( FILE *fp , 
00220                               Met_station_t *measuring_station_const )
00221 {
00222    int i;
00223    GArray *pos=measuring_station_const->pos;
00224 
00225    fprintf( fp , "Measuring station output file.\n" );
00226    fprintf( fp , "Byte order : %d\n" , G_BYTE_ORDER );
00227    fprintf( fp , "Measuring parameter : %s\n" ,
00228                  measuring_station_const->parameter_str );
00229    fprintf( fp , "Measuring station location(s) relative to : " );
00230 
00231    if ( measuring_station_const->from_river_mouth )
00232       fprintf( fp , "river mouth\n" );
00233    else
00234       fprintf( fp , "origin\n" );
00235    fprintf( fp , "Measuring station location(s) : " );
00236    if ( pos->len == 0 )
00237       fprintf( fp , "all locations\n" );
00238    else
00239    {
00240       for (i=0;i<pos->len-1;i++)
00241          fprintf( fp , "%f," , g_array_index(pos,double,i) );
00242       fprintf( fp , "%f\n" , g_array_index(pos,double,pos->len-1) );
00243    }
00244    return 0;
00245 }
00246 */
00247 

Generated on Fri Jan 4 18:04:16 2008 for sedflux by  doxygen 1.5.2