00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #define SED_SEA_LEVEL_PROC_NAME "sea level"
00022 #define EH_LOG_DOMAIN SED_SEA_LEVEL_PROC_NAME
00023
00024 #include <stdio.h>
00025 #include <string.h>
00026 #include <math.h>
00027
00028 #include <utils/utils.h>
00029 #include "my_processes.h"
00030
00031 double** read_sea_level_curve( char* , gint* );
00032 double get_sea_level ( double** , gint , double );
00033
00034 gboolean init_sea_level_data( Sed_process proc , Sed_cube prof , GError** error );
00035
00036 Sed_process_info
00037 run_sea_level( Sed_process proc , Sed_cube prof )
00038 {
00039 Sea_level_t* data = sed_process_user_data(proc);
00040 Sed_process_info info = SED_EMPTY_INFO;
00041 double new_sea_level;
00042 double year;
00043
00044 if ( sed_process_run_count(proc)==0 )
00045 init_sea_level_data( proc , prof , NULL );
00046
00047 year = sed_cube_age_in_years( prof )-data->start_year;
00048
00049 new_sea_level = get_sea_level( data->sea_level , data->len , year );
00050
00051 if ( eh_isnan( new_sea_level ) )
00052 {
00053 eh_warning( "The current time is out of range of the sea level curve." );
00054 eh_warning( "Sea level will be held constant constant." );
00055 }
00056 else
00057 sed_cube_set_sea_level(prof,new_sea_level);
00058
00059 if ( eh_isnan(sed_cube_sea_level(prof)) )
00060 return info;
00061
00062 sed_cube_find_all_river_mouths( prof );
00063
00064 eh_message( "time : %f" , sed_cube_age_in_years(prof) );
00065 eh_message( "sea level : %f" , sed_cube_sea_level(prof) );
00066
00067 return info;
00068 }
00069
00070 #include <sys/stat.h>
00071
00072 #define SEA_LEVEL_KEY_FILENAME "sea level file"
00073
00074 static gchar* sea_level_req_labels[] =
00075 {
00076 SEA_LEVEL_KEY_FILENAME ,
00077 NULL
00078 };
00079 gboolean
00080 init_sea_level( Sed_process p , Eh_symbol_table tab , GError** error )
00081 {
00082 Sea_level_t* data = sed_process_new_user_data( p , Sea_level_t );
00083 GError* tmp_err = NULL;
00084 gboolean is_ok = TRUE;
00085 gint len;
00086
00087 data->start_year = 0.;
00088
00089 eh_symbol_table_require_labels( tab , sea_level_req_labels , &tmp_err );
00090
00091 if ( !tmp_err )
00092 {
00093 data->filename = eh_symbol_table_value( tab , SEA_LEVEL_KEY_FILENAME );
00094 data->sea_level = sed_scan_sea_level_curve( data->filename , &len , &tmp_err );
00095 data->len = len;
00096 }
00097
00098 if ( tmp_err )
00099 {
00100 g_propagate_error( error , tmp_err );
00101 is_ok = FALSE;
00102 }
00103
00104 return is_ok;
00105 }
00106
00107 gboolean
00108 init_sea_level_data( Sed_process proc , Sed_cube prof , GError** error )
00109 {
00110 gboolean is_ok = TRUE;
00111 Sea_level_t* data = sed_process_user_data( proc );
00112
00113 if ( data )
00114 data->start_year = sed_cube_age_in_years(prof);
00115
00116 return is_ok;
00117 }
00118
00119 gboolean
00120 destroy_sea_level( Sed_process p )
00121 {
00122 if ( p )
00123 {
00124 Sea_level_t* data = sed_process_user_data( p );
00125
00126 if ( data )
00127 {
00128 eh_free_2( data->sea_level );
00129
00130 eh_free ( data->filename );
00131 eh_free ( data );
00132 }
00133 }
00134
00135 return TRUE;
00136 }
00137
00138 gboolean dump_sea_level_data( gpointer ptr , FILE *fp )
00139 {
00140 Sea_level_t *data = (Sea_level_t*)ptr;
00141 guint len;
00142
00143 len = strlen(data->filename);
00144 fwrite( &len , sizeof(guint) , 1 , fp );
00145 fwrite( data->filename , sizeof(char) , 1 , fp );
00146
00147 fwrite( &(data->start_year) , sizeof(double) , 1 , fp );
00148
00149 fwrite( &(data->len) , sizeof(gint) , 1 , fp );
00150 fwrite( data->sea_level[0] , sizeof(double) , data->len , fp );
00151 fwrite( data->sea_level[1] , sizeof(double) , data->len , fp );
00152
00153 return TRUE;
00154 }
00155
00156 gboolean load_sea_level_data( gpointer ptr , FILE *fp )
00157 {
00158 Sea_level_t *data = (Sea_level_t*)ptr;
00159 guint len;
00160
00161 fread( &len , sizeof(guint) , 1 , fp );
00162 fread( data->filename , sizeof(char) , len , fp );
00163 fread( &(data->start_year) , sizeof(double) , 1 , fp );
00164
00165 fread( &len , sizeof(gint) , 1 , fp );
00166
00167 data->len = len;
00168 data->sea_level = eh_new_2( double , 2 , len );
00169
00170 fread( data->sea_level[0] , sizeof(double) , len , fp );
00171 fread( data->sea_level[1] , sizeof(double) , len , fp );
00172
00173 return TRUE;
00174 }
00175
00176 double get_sea_level(double** sea_level, gint len , double year)
00177 {
00178 double new_sea_level;
00179
00180 eh_require( sea_level );
00181
00182 {
00183 double* t = sea_level[0];
00184 double* z = sea_level[1];
00185
00186 interpolate(t,z,len,&year,&new_sea_level,1);
00187 }
00188
00189 return new_sea_level;
00190 }
00191