/Users/huttone/Devel/sedflux-new/sedflux/trunk/ew/sed/sed_cube.h

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 #if !defined( SED_CUBE_H )
00022 #define SED_CUBE_H
00023 
00024 #include <glib.h>
00025 #include "utils/utils.h"
00026 
00027 #include "sed_sediment.h"
00028 #include "sed_cell.h"
00029 #include "sed_column.h"
00030 #include "sed_const.h"
00031 #include "sed_hydro.h"
00032 #include "sed_wave.h"
00033 #include "sed_river.h"
00034 
00035 typedef enum
00036 {
00037    SED_CUBE_ERROR_NO_TIME_LABEL , 
00038    SED_CUBE_ERROR_TIME_NOT_MONOTONIC ,
00039    SED_CUBE_ERROR_NOT_TWO_COLUMNS ,
00040    SED_CUBE_ERROR_INSUFFICIENT_DATA ,
00041    SED_CUBE_ERROR_DATA_NOT_MONOTONIC ,
00042    SED_CUBE_ERROR_DATA_BAD_RANGE ,
00043 
00044    SED_CUBE_ERROR_TOO_FEW_ROWS ,
00045    SED_CUBE_ERROR_TOO_FEW_COLUMNS ,
00046    SED_CUBE_ERROR_BAD_GRID_DIMENSION ,
00047    SED_CUBE_ERROR_TRUNCATED_FILE
00048 }
00049 Sed_cube_error;
00050 
00051 #define SED_CUBE_SUSP_GRID sed_cube_susp_grid_quark()
00052 #define SED_CUBE_ERROR     sed_cube_error_quark()
00053 
00054 GQuark sed_cube_error_quark    ( void );
00055 GQuark sed_cube_susp_grid_quark( void );
00056 
00057 typedef enum
00058 {
00059    SEDFLUX_MODE_3D ,
00060    SEDFLUX_MODE_2D ,
00061    SEDFLUX_MODE_NOT_SET
00062 }
00063 Sedflux_mode;
00064 
00065 void        sed_mode_set  ( Sedflux_mode mode );
00066 gboolean    sed_mode_is   ( Sedflux_mode mode );
00067 gboolean    sed_mode_is_2d( void );
00068 gboolean    sed_mode_is_3d( void );
00069 
00073 typedef struct
00074 {
00075    double angle;      
00076    int x;             
00077    int y;             
00078    double min_angle;  
00079    double max_angle;  
00080    double std_dev;    
00081 }
00082 Sed_hinge_pt;
00083 
00087 /*
00088 typedef struct
00089 {
00090    Sed_hydro data;      ///< The hydrological characteristics of the river
00091    Sed_hinge_pt *hinge; ///< The hinge point of the river
00092    int x_ind;           ///< The x-index of the river mouth
00093    int y_ind;           ///< The y-index of the river mouth
00094    char *river_name;    ///< The name of the river
00095 }
00096 Sed_river;
00097 */
00098 
00099 new_handle( Sed_cube );
00100 
00101 typedef double   (*Sed_grid_func) ( const Sed_cube , gssize , gssize );
00102 typedef gboolean (*Sed_cube_func) ( const Sed_cube , gssize , gssize , gpointer );
00103 
00104 #define S_X_FUNC            (&sed_cube_col_x_ij)
00105 #define S_Y_FUNC            (&sed_cube_col_y_ij)
00106 #define S_X_SLOPE_FUNC      (&sed_cube_x_slope)
00107 #define S_Y_SLOPE_FUNC      (&sed_cube_y_slope)
00108 #define S_SLOPE_DIR_FUNC    (&sed_cube_slope_dir)
00109 #define S_THICKNESS_FUNC    (&sed_cube_thickness)
00110 #define S_ELEVATION_FUNC    (&sed_cube_elevation)
00111 #define S_WATER_DEPTH_FUNC  (&sed_cube_water_depth)
00112 #define S_LOAD_FUNC         (&sed_cube_load)
00113 
00114 Sed_cube sed_cube_new( gssize n_x , gssize n_y );
00115 Sed_cube sed_cube_new_from_file( const gchar* file , GError** error );
00116 Sed_cube sed_cube_new_empty( gssize n_x , gssize n_y );
00117 Sed_cube sed_cube_free( Sed_cube c , gboolean free_data );
00118 Sed_cube sed_cube_free_river( Sed_cube p );
00119 Sed_cube sed_cube_destroy( Sed_cube s );
00120 Sed_cube sed_cube_copy_pointer_data( Sed_cube dest , const Sed_cube src );
00121 Sed_cube sed_cube_copy_scalar_data( Sed_cube dest , const Sed_cube src );
00122 Sed_cell_grid sed_cube_create_in_suspension( Sed_cube s );
00123 Sed_cell_grid sed_cube_destroy_in_suspension( Sed_cell_grid g );
00124 gchar* sed_cube_name( const Sed_cube s );
00125 GSList* sed_cube_storm_list( Sed_cube c );
00126 Sed_cube sed_cube_set_storm_list( Sed_cube c , GSList *storms );
00127 Sed_cube sed_cube_adjust_sea_level( Sed_cube s , double dz );
00128 Sed_cube sed_cube_destroy_storm_list( Sed_cube c );
00129 Sed_cube sed_cube_set_bathy( Sed_cube c , Eh_dbl_grid g );
00130 Sed_cube sed_cube_set_dz( Sed_cube p , double new_dz );
00131 gssize sed_cube_size( const Sed_cube s );
00132 gssize sed_cube_n_x( const Sed_cube s );
00133 gssize sed_cube_n_y( const Sed_cube s );
00134 
00135 Sed_column sed_cube_col    ( const Sed_cube s , gssize ind );
00136 Sed_column sed_cube_col_ij ( const Sed_cube s , gssize i , gssize j );
00137 Sed_column sed_cube_col_pos( const Sed_cube s , double x , double y );
00138 
00139 double sed_cube_sea_level( const Sed_cube s );
00140 double *sed_cube_x( const Sed_cube s , gssize *id );
00141 double *sed_cube_y( const Sed_cube s , gssize *id );
00142 double sed_cube_col_x( const Sed_cube s , gssize id );
00143 double sed_cube_col_y( const Sed_cube s , gssize id );
00144 double sed_cube_col_x_ij( const Sed_cube s , gssize i , gssize j );
00145 double sed_cube_col_y_ij( const Sed_cube s , gssize i , gssize j );
00146 double sed_cube_x_slope( const Sed_cube s , gssize i , gssize j );
00147 double sed_cube_y_slope( const Sed_cube s , gssize i , gssize j );
00148 double sed_cube_slope( const Sed_cube s , gssize i , gssize j );
00149 double sed_cube_slope_dir( const Sed_cube s , gssize i , gssize j );
00150 double sed_cube_top_height(const Sed_cube p , gssize i , gssize j );
00151 Eh_ind_2 ind2sub( gssize ind , gssize n_x , gssize n_y );
00152 Eh_dbl_grid sed_cube_grid( const Sed_cube s ,
00153                                 Sed_grid_func f   ,
00154                                 gssize *index );
00155 Eh_dbl_grid sed_cube_slope_dir_grid( const Sed_cube s , gssize *index );
00156 Eh_dbl_grid sed_cube_x_slope_grid( const Sed_cube s , gssize *index );
00157 Eh_dbl_grid sed_cube_y_slope_grid( const Sed_cube s , gssize *index );
00158 double sed_cube_time_step( const Sed_cube s );
00159 double sed_cube_time_step_in_years( const Sed_cube s );
00160 double sed_cube_time_step_in_seconds( const Sed_cube s );
00161 double sed_cube_time_step_in_days( const Sed_cube s );
00162 Sed_constants sed_cube_constants( const Sed_cube s );
00163 double sed_cube_x_res( const Sed_cube s );
00164 double sed_cube_y_res( const Sed_cube s );
00165 double sed_cube_z_res( const Sed_cube s );
00166 Sed_cell sed_cube_to_remove( const Sed_cube s );
00167 Sed_cell sed_cube_to_add( const Sed_cube s );
00168 gssize sed_get_column_x_index( const Sed_cube c , double x );
00169 gssize sed_get_column_y_index( const Sed_cube c , double y );
00170 double sed_cube_wave_height( const Sed_cube s );
00171 double sed_cube_wave_period( const Sed_cube s );
00172 double sed_cube_wave_length( const Sed_cube s );
00173 double sed_cube_storm( const Sed_cube s );
00174 double sed_cube_quake( const Sed_cube s );
00175 double sed_cube_age( const Sed_cube s );
00176 double sed_cube_age_in_years( const Sed_cube s );
00177 double sed_cube_tidal_period( const Sed_cube s );
00178 Sed_cube sed_cube_set_tidal_period( Sed_cube s , double new_val );
00179 double sed_cube_tidal_range( const Sed_cube s );
00180 Sed_cube sed_cube_set_tidal_range( Sed_cube s , double new_val );
00181 double sed_cube_water_depth(const Sed_cube p , gssize i , gssize j );
00182 double sed_cube_load(const Sed_cube p , gssize i , gssize j );
00183 double sed_cube_water_pressure( const Sed_cube p , gssize i , gssize j );
00184 double sed_cube_thickness( const Sed_cube p , gssize i , gssize j );
00185 gboolean sed_cube_col_is_empty( const Sed_cube p , gssize i , gssize j );
00186 double sed_cube_base_height( const Sed_cube p , gssize i , gssize j );
00187 
00188 Sed_cube sed_cube_dup( Sed_cube c );
00189 Sed_cube sed_cube_copy( Sed_cube dest , const Sed_cube src );
00190 Sed_cube sed_cube_copy_cols( const Sed_cube src , gssize* x , gssize* y , double* z , gssize len );
00191 Sed_cube sed_cube_copy_line( const Sed_cube src , double *x , double *y , double *z , gssize len );
00192 Sed_cube sed_cube_cols( Sed_cube src , gssize *path );
00193 gssize sed_cube_river_mouth_1d( Sed_cube c );
00194 Sed_cube sed_cube_remove( Sed_cube dest , Sed_cube src );
00195 Sed_cube sed_cube_add( Sed_cube dest , const Sed_cube src );
00196 
00197 //Sed_profile *sed_get_profile_from_cube( Sed_cube c , GList *path );
00198 double sed_cube_mass            ( const Sed_cube p );
00199 double sed_cube_sediment_mass   ( const Sed_cube p );
00200 double sed_cube_mass_in_suspension( const Sed_cube p );
00201 Sed_cube sed_cube_set_sea_level( Sed_cube s , double new_sea_level );
00202 Sed_cube sed_cube_set_base_height( Sed_cube s , gssize i , gssize j , double height );
00203 Sed_cube sed_cube_adjust_base_height( Sed_cube s , gssize i , gssize j , double dz );
00204 Sed_cube    sed_cube_set_nth_river             ( Sed_cube s , gssize n , Sed_riv river );
00205 Eh_pt_2*    sed_cube_river_mouth_position      ( Sed_cube s , Sed_riv this_river );
00206 Sed_hydro   sed_cube_river_data( Sed_cube s , GList *this_river );
00207 /*
00208 Sed_cube    sed_cube_set_river_data( Sed_cube s       ,
00209                               GList *this_river ,
00210                               Sed_hydro new_data );
00211 */
00212 Sed_cube sed_cube_set_river_list( Sed_cube s , GList* river_list ) G_GNUC_DEPRECATED;
00213 
00214 
00215 Sed_cube      sed_cube_split_river( Sed_cube s , const gchar* name );
00216 void          sed_river_attach_susp_grid( Sed_riv r , Sed_cell_grid g );
00217 Sed_cell_grid sed_river_get_susp_grid( Sed_riv r );
00218 void          sed_river_detach_susp_grid( Sed_riv r );
00219 Sed_cube      sed_cube_add_trunk( Sed_cube s , Sed_riv new_trunk );
00220 Sed_cube      sed_cube_remove_river( Sed_cube s , Sed_riv r );
00221 Sed_cube      sed_cube_remove_all_trunks( Sed_cube s );
00222 
00223 Sed_cube sed_cube_set_name( Sed_cube s , char *name );
00224 Sed_cube sed_cube_set_time_step( Sed_cube s , double time_step_in_years );
00225 Sed_cube set_cube_set_constants( Sed_cube s , Sed_constants new_c );
00226 Sed_cube sed_cube_set_x_res( Sed_cube s , double new_x_res );
00227 Sed_cube sed_cube_set_y_res( Sed_cube s , double new_x_res );
00228 Sed_cube sed_cube_set_z_res( Sed_cube s , double new_x_res );
00229 Sed_cube sed_cube_set_wave_height( Sed_cube s , double new_wave_height );
00230 Sed_cube sed_cube_set_wave_period( Sed_cube s , double new_wave_period );
00231 Sed_cube sed_cube_set_wave_length( Sed_cube s , double new_wave_length );
00232 Sed_cube sed_cube_set_storm( Sed_cube s , double new_storm_value );
00233 Sed_cube sed_cube_set_quake( Sed_cube s , double new_quake_value );
00234 Sed_cube sed_cube_set_age( Sed_cube s , double new_age );
00235 Sed_cube sed_cube_adjust_age( Sed_cube s , double dt );
00236 Sed_cube sed_cube_increment_age( Sed_cube s );
00237 
00238 Eh_dbl_grid sed_cube_water_depth_grid( const Sed_cube s , gssize *index );
00239 Eh_dbl_grid sed_cube_thickness_grid( const Sed_cube s , gssize *index );
00240 Eh_dbl_grid sed_cube_load_grid( const Sed_cube s , gssize *index );
00241 
00242 Sed_riv       sed_cube_river_by_name   ( Sed_cube s , const char *name );
00243 Sed_riv       sed_cube_nth_river       ( Sed_cube s , gint n );
00244 gssize        sed_cube_river_id        ( Sed_cube s , Sed_riv river );
00245 
00246 //Sed_cell_grid sed_cube_in_suspension( Sed_cube s , gssize river_no );
00247 Sed_cell_grid sed_cube_in_suspension( Sed_cube s , Sed_riv r );
00248 
00249 GList*   sed_cube_river_list  ( Sed_cube s );
00250 Sed_riv* sed_cube_all_trunks  ( Sed_cube s );
00251 Sed_riv* sed_cube_all_branches( Sed_cube s );
00252 Sed_riv* sed_cube_all_leaves  ( Sed_cube s );
00253 Sed_riv* sed_cube_all_rivers  ( Sed_cube s );
00254 
00255 gssize     sed_cube_number_of_rivers( Sed_cube s ) G_GNUC_DEPRECATED;
00256 gint       sed_cube_n_branches      ( Sed_cube s );
00257 gint       sed_cube_n_rivers        ( Sed_cube s );
00258 
00259 Sed_cube      sed_cube_add_trunk    ( Sed_cube s , Sed_riv river );
00260 
00261 Sed_cube sed_load_cube( FILE *fp );
00262 gssize sed_cube_column_id( const Sed_cube c , double x , double y );
00263 void sed_set_shore( Sed_cube s );
00264 GList *sed_cube_find_shore_line( Sed_cube s , Eh_ind_2 *pos );
00265 
00266 Sed_riv       sed_cube_find_river_mouth( Sed_cube c , Sed_riv this_river );
00267 
00268 GList *sed_find_next_shore( GList *shore_list ,
00269                             Sed_cube s       ,
00270                             Eh_ind_2 *pos     ,
00271                             GList *ignore_list );
00272 gboolean is_shore_cell( Sed_cube s , gssize x , gssize y );
00273 GList *sed_find_columns_custom( Sed_cube s             ,
00274                                 gssize i                ,
00275                                 gssize j                ,
00276                                 gpointer data           ,
00277                                 Sed_cube_func stop_func ,
00278                                 Sed_cube_func angle_func );
00279 GList *sed_cube_find_cross_shore_columns( Sed_cube s , gssize i , gssize j );
00280 Eh_ind_2 *sed_cube_find_shore( Sed_cube s , int n , int vary_dim );
00281 
00282 
00283 
00284 Eh_ind_2 *sed_find_adjacent_shore_edge( Sed_cube s ,
00285                                         gssize i    ,
00286                                         gssize j    ,
00287                                         int edge );
00288 int sed_rotate_direction( int dir , int angle );
00289 gboolean sed_cube_is_shore_edge( Sed_cube s , gssize i , gssize j , int edge );
00290 Eh_ind_2 sed_shift_index_over_edge( gssize i , gssize j , int edge );
00291 
00292 
00293 
00294 GTree *sed_create_shore_tree( GList *shore );
00295 gssize* sed_cube_river_path_id( Sed_cube c , Sed_riv river , gboolean down_stream );
00296 GList*  sed_cube_river_path   ( Sed_cube c , Sed_riv river );
00297 GList *sed_find_river_path( Sed_cube c         ,
00298                             Eh_ind_2 *hinge_pos ,
00299                             double angle );
00300 Eh_ind_2 *sed_find_river_mouth( Sed_cube c         ,
00301                                 Eh_ind_2 *hinge_pos ,
00302                                 double angle );
00303 Eh_ind_2 get_offset_from_angle( double angle , double aspect );
00304 
00305 int get_path_exit_side( Eh_pt_2 pos_in_box , double angle , double dx , double dy );
00306 
00307 
00308 int is_river_mouth( Eh_ind_2 *shore_pos , Sed_hinge_pt* dir );
00309 Eh_ind_2 get_offset_from_angle( double angle , double aspect );
00310 Eh_pt_2 get_path_exit_pos( Eh_pt_2 pos_in_box , double angle , double dx , double dy );
00311 Eh_pt_2 get_path_entrance_pos( Eh_pt_2 exit_pos , double dx , double dy );
00312 Eh_ind_2 get_shift_from_exit_pos( Eh_pt_2 exit_pos , double dx , double dy );
00313 GList *sed_get_river_path( Sed_cube c , GList *river );
00314 GList *sed_cube_find_line_path( Sed_cube c         ,
00315                                 Eh_ind_2 *hinge_pos ,
00316                                 double angle );
00317 
00318 double sed_cube_river_angle( Sed_cube c , GList *river );
00319 
00320 Eh_dbl_grid sed_get_floor_3_default( int floor_type , int n_x , int n_y );
00321 double**    sed_scan_sea_level_curve( const char* file , gint* len , GError** err );
00322 
00323 typedef enum
00324 {
00325    SED_BATHY_FILE_TYPE_2D_ASCII  ,
00326    SED_BATHY_FILE_TYPE_2D_BINARY ,
00327    SED_BATHY_FILE_TYPE_1D_ASCII
00328 }
00329 Sed_bathy_type;
00330 
00331 
00332 Eh_dbl_grid sed_bathy_grid_scan          ( const char* file         ,
00333                                            double dx                ,
00334                                            double dy                ,
00335                                            GError** error );
00336 Eh_dbl_grid sed_bathy_grid_scan_2d_binary( const char* file         ,
00337                                            double dx                ,
00338                                            double dy                ,
00339                                            GError** error );
00340 Eh_dbl_grid sed_bathy_grid_scan_2d_ascii ( const char* file         ,
00341                                            double dx                ,
00342                                            double dy                ,
00343                                            GError** error );
00344 Eh_dbl_grid sed_bathy_grid_scan_1d_ascii ( const char* file         ,
00345                                            double dx                ,
00346                                            double dy                ,
00347                                            GError** error );
00348 
00349 Eh_sequence *sed_get_floor_sequence_2( const char *file ,
00350                                        double *y        ,
00351                                        gssize n_y       ,
00352                                        GError** err );
00353 Eh_sequence *sed_get_floor_sequence_3( const char *file ,
00354                                        double dx        ,
00355                                        double dy        ,
00356                                        GError** error );
00357 
00358 Sed_cube sed_cube_foreach_river( Sed_cube c , GFunc func , gpointer user_data );
00359 
00360 Sed_cube sed_cube_find_all_river_mouths( Sed_cube c );
00361 
00362 gssize sed_cube_write(FILE *fp,const Sed_cube p);
00363 Sed_cube sed_cube_read( FILE *fp );
00364 
00365 gssize *sed_cube_find_column_below( Sed_cube c , double z );
00366 gssize *sed_cube_find_column_above( Sed_cube c , double z );
00367 
00368 int         sed_get_floor_vec ( char *filename , double *x , int len , double *y , GError** error ) G_GNUC_DEPRECATED;
00369 GArray*     sed_get_floor     ( char *filename , GArray *x , GError** error ) G_GNUC_DEPRECATED;
00370 
00371 gssize   sed_cube_id ( Sed_cube p , gssize i , gssize j );
00372 Eh_ind_2 sed_cube_sub( Sed_cube p , gssize id );
00373 gboolean sed_cube_is_in_domain    ( Sed_cube p , gssize i , gssize j );
00374 gboolean sed_cube_is_in_domain_id ( Sed_cube p , gssize id );
00375 gboolean sed_cube_is_in_domain_pos( Sed_cube p , double x , double y );
00376 gboolean sed_cube_is_1d( Sed_cube p );
00377 
00378 gssize   sed_cube_fprint( FILE* fp , Sed_cube c );
00379 
00380 Sed_cell sed_cube_to_cell( Sed_cube c , Sed_cell d );
00381 
00382 gint     sed_cube_count_above( Sed_cube c , double h );
00383 double   sed_cube_area_above ( Sed_cube c , double h );
00384 
00385 #endif
00386 

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