/Users/huttone/Devel/sedflux-new/sedflux/trunk/ew/sedflux/run_sea_level.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 #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 

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