00001 #ifndef __EH_GRID_H__
00002 #define __EH_GRID_H__
00003
00004 #include <stdio.h>
00005 #include <glib.h>
00006 #include <utils/eh_types.h>
00007
00008 new_handle( Eh_grid );
00009 derived_handle( Eh_grid , Eh_dbl_grid );
00010 derived_handle( Eh_grid , Eh_int_grid );
00011
00012 typedef gboolean (*Populate_func)( double , double , gpointer );
00013
00016 typedef struct
00017 {
00018 int i;
00019 int j;
00020 }
00021 Eh_ind_2;
00022
00023 typedef gssize Eh_grid_id;
00024
00025 Eh_ind_2 eh_ind_2_create ( int i , int j );
00026 gboolean eh_ind_2_cmp ( Eh_ind_2 a , Eh_ind_2 b );
00027 Eh_ind_2* eh_ind_2_dup ( Eh_ind_2 *src , Eh_ind_2 *dest );
00028
00029 gssize eh_grid_n_x ( Eh_grid g );
00030 gssize eh_grid_n_y ( Eh_grid g );
00031 gssize eh_grid_n_el ( Eh_grid g );
00032 gssize eh_grid_el_size ( Eh_grid g );
00033 gssize eh_grid_low_x ( Eh_grid g );
00034 gssize eh_grid_low_y ( Eh_grid g );
00035 double* eh_grid_x ( Eh_grid g );
00036 double* eh_grid_y ( Eh_grid g );
00037 void* eh_grid_row ( Eh_grid g , gssize row );
00038 void** eh_grid_data ( Eh_grid g );
00039 double** eh_dbl_grid_data ( Eh_grid g );
00040 double** eh_dbl_grid_data_start ( Eh_grid g );
00041 void* eh_grid_data_start ( Eh_grid g );
00042
00043 Eh_grid eh_grid_set_data ( Eh_grid g , void** new_data );
00044 Eh_grid eh_grid_set_x_lin ( Eh_grid g , double x_0 , double dx );
00045 Eh_grid eh_grid_set_y_lin ( Eh_grid g , double y_0 , double dy );
00046
00047 Eh_grid eh_grid_malloc ( gssize n_x , gssize n_y , gssize size );
00048 Eh_grid eh_grid_resize ( Eh_grid g , gssize n_x , gssize n_y );
00049 Eh_grid eh_grid_add_row ( Eh_grid g , void* new_row );
00050 Eh_grid eh_grid_add_column ( Eh_grid g , void* new_column );
00051 void eh_grid_free_data ( Eh_grid g , gboolean free_data );
00052 Eh_grid eh_grid_destroy ( Eh_grid g , gboolean free_data );
00053
00054 void eh_grid_dump ( FILE *fp , Eh_grid g );
00055 Eh_grid eh_grid_load ( FILE *fp );
00056
00057 gboolean eh_grid_cmp_data ( Eh_grid g_1 , Eh_grid g_2 );
00058 gboolean eh_grid_cmp_x_data ( Eh_grid g_1 , Eh_grid g_2 );
00059 gboolean eh_grid_cmp_y_data ( Eh_grid g_1 , Eh_grid g_2 );
00060 gboolean eh_grid_cmp ( Eh_grid g_1 , Eh_grid g_2 );
00061 gboolean eh_dbl_grid_cmp ( Eh_dbl_grid g_1 , Eh_dbl_grid g_2 , double eps );
00062
00063 Eh_grid eh_grid_dup ( Eh_grid g );
00064 Eh_grid eh_grid_copy ( Eh_grid dest , Eh_grid src );
00065 Eh_grid eh_grid_copy_data ( Eh_grid dest , Eh_grid src );
00066
00067 Eh_grid eh_grid_reindex ( Eh_grid g , gssize low_x , gssize low_y );
00068 gboolean eh_grid_is_in_domain ( Eh_grid g , gssize i , gssize j );
00069 gboolean eh_grid_is_same_size ( Eh_grid g_1 , Eh_grid g_2 );
00070 Eh_grid_id eh_grid_sub_to_id ( gssize n_j , gssize i , gssize j );
00071 Eh_ind_2 eh_grid_id_to_sub ( gssize n_i , Eh_grid_id id );
00072
00073 void eh_dbl_grid_set_val ( Eh_grid g , gssize i , gssize j , double val );
00074 void eh_int_grid_set_val ( Eh_grid g , gssize i , gssize j , int val );
00075 double eh_dbl_grid_val ( Eh_dbl_grid g , gssize i , gssize j );
00076 int eh_int_grid_val ( Eh_int_grid g , gssize i , gssize j );
00077 void* eh_grid_loc ( Eh_grid g , gssize i , gssize j );
00078
00079 int eh_dbl_grid_write ( FILE* fp , Eh_dbl_grid g );
00080 gboolean eh_grid_is_compatible ( Eh_grid g_1 , Eh_grid g_2 );
00081 void eh_grid_foreach ( Eh_grid g , GFunc func , gpointer user_data );
00082
00083 Eh_dbl_grid eh_dbl_grid_add ( Eh_dbl_grid g_1 , Eh_dbl_grid g_2 );
00084 Eh_dbl_grid eh_dbl_grid_subtract ( Eh_dbl_grid g_1 , Eh_dbl_grid g_2 );
00085 double eh_dbl_grid_sum ( Eh_dbl_grid g );
00086 double eh_dbl_grid_sum_bad_val ( Eh_dbl_grid g , double bad_val );
00087 Eh_dbl_grid eh_dbl_grid_set ( Eh_dbl_grid g , double val );
00088 Eh_dbl_grid eh_dbl_grid_randomize ( Eh_dbl_grid g );
00089 void eh_dbl_grid_scalar_mult ( Eh_dbl_grid g , double val );
00090 Eh_dbl_grid eh_dbl_grid_rotate ( Eh_dbl_grid g , double angle ,
00091 gssize i_0 , gssize j_0 , double* err );
00092 Eh_dbl_grid eh_dbl_grid_reduce ( Eh_dbl_grid g , gssize new_nx , gssize new_ny );
00093 Eh_dbl_grid eh_dbl_grid_expand ( Eh_dbl_grid g , gssize new_nx , gssize new_ny );
00094 Eh_dbl_grid eh_dbl_grid_remesh ( Eh_dbl_grid g , gssize new_nx , gssize new_ny );
00095
00096 void interpolate_2 ( Eh_dbl_grid source , Eh_dbl_grid dest ) G_GNUC_DEPRECATED;
00097 void interpolate_2_bad_val ( Eh_dbl_grid source , Eh_dbl_grid dest , double bad_val ) G_GNUC_DEPRECATED;
00098
00099 Eh_grid_id* eh_dbl_grid_line_ids ( Eh_dbl_grid g , gssize i_0 , gssize j_0 ,
00100 gssize i_1 , gssize j_1 );
00101 gssize eh_grid_path_len ( gssize* p );
00102 gboolean eh_grid_path_is_same ( gssize* p_1 , gssize* p_2 );
00103 Eh_grid eh_grid_sub ( Eh_grid g , gssize i_0 , gssize j_0 ,
00104
00105 gssize n_x , gssize n_y );
00106 void eh_dbl_grid_rebin ( Eh_dbl_grid src , Eh_dbl_grid dest );
00107 void eh_dbl_grid_rebin_bad_val( Eh_dbl_grid src , Eh_dbl_grid dest , double val );
00108
00109 Eh_dbl_grid eh_dbl_grid_populate ( Eh_dbl_grid g , Populate_func f , gpointer user_data );
00110
00111 void eh_dbl_grid_fprintf ( FILE* fp , const gchar* format , Eh_dbl_grid g );
00112 Eh_grid eh_grid_transpose ( Eh_grid g );
00113 Eh_dbl_grid eh_dbl_grid_diff ( Eh_dbl_grid g , gssize n , gssize dim );
00114
00115 Eh_dbl_grid eh_dbl_grid_new_set ( gint n_x , gint n_y , double** d );
00116
00117 #define eh_grid_val( g , t , i , j ) ( *((t*)eh_grid_loc(g,i,j)) )
00118 #define eh_grid_new( t , n_x , n_y ) eh_grid_malloc( (n_x) , (n_y) , sizeof(t) )
00119 #define eh_grid_new_uniform( t , n_x , n_y , dx , dy ) eh_grid_malloc_uniform( (n_x) , (n_y) , sizeof(t) , dx , dy )
00120
00121 #endif