00001 #include <utils/utils.h>
00002 #include <sed/sed_sedflux.h>
00003 #include <check.h>
00004
00005 #include "plume_types.h"
00006 #include "plumeinput.h"
00007 #include "plume_approx.h"
00008
00009 gboolean plume3d( Plume_inputs *plume_const , Plume_river river ,
00010 int n_grains , Plume_sediment *sedload ,
00011 Eh_dbl_grid *deposit , Plume_data *data );
00012
00013 START_TEST ( test_plume )
00014 {
00015 Plume_inputs plume_const;
00016 Plume_river river;
00017 Plume_sediment* sedload;
00018 Eh_dbl_grid* deposit;
00019 Plume_data plume_data;
00020 gssize n;
00021 double mass_in, mass_out;
00022
00023 plume_const.current_velocity = 0.;
00024 plume_const.ocean_concentration = 0.;
00025 plume_const.plume_width = 3000.;
00026 plume_const.ndx = 1;
00027 plume_const.ndy = 3;
00028
00029 river.Cs = eh_new( double , 4 );
00030 river.Cs[0] = .071;
00031 river.Cs[1] = .071;
00032 river.Cs[2] = .089;
00033 river.Cs[3] = .124;
00034 river.rdirection = G_PI_2;
00035 river.u0 = 1.06;
00036 river.b0 = 263.;
00037 river.d0 = 8.3;
00038 river.Q = river.u0*river.b0*river.d0;
00039 river.rma = 0;
00040
00041 sedload = eh_new( Plume_sediment , 4 );
00042 sedload[0].lambda = 16.8/S_SECONDS_PER_DAY;
00043 sedload[1].lambda = 9./S_SECONDS_PER_DAY;
00044 sedload[3].lambda = 3.2/S_SECONDS_PER_DAY;
00045 sedload[2].lambda = 2.4/S_SECONDS_PER_DAY;
00046 sedload[0].rho = 1800.;
00047 sedload[1].rho = 1750.;
00048 sedload[2].rho = 1650.;
00049 sedload[3].rho = 1600.;
00050
00051 plume_data_init( &plume_data );
00052
00053 deposit = eh_new( Eh_dbl_grid , 4 );
00054 for ( n=0 ; n<4 ; n++ )
00055 {
00056 deposit[n] = eh_grid_new( double , 2 , 800 );
00057
00058 eh_grid_set_x_lin( deposit[n] , -30000 , 30000 );
00059 eh_grid_set_y_lin( deposit[n] , 0 , 100 );
00060 }
00061
00062 for ( n=0,mass_in=0 ; n<4 ; n++ )
00063 mass_in += river.Q*river.Cs[n]*S_SECONDS_PER_DAY;
00064
00065 plume3d( &plume_const , river , 4 , sedload , deposit , &plume_data );
00066
00067 for ( n=0,mass_out=0 ; n<4 ; n++ )
00068 {
00069 mass_out += eh_dbl_grid_sum( deposit[n] )
00070 * sedload[n].rho
00071 * ( eh_grid_x(deposit[n])[1] - eh_grid_x(deposit[n])[0] )
00072 * ( eh_grid_y(deposit[n])[1] - eh_grid_y(deposit[n])[0] );
00073 }
00074
00075
00076
00077 fail_unless( eh_compare_dbl( mass_in , mass_out , 1e-3 ) , "Mass-balance error in plume" );
00078 }
00079 END_TEST
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129 START_TEST ( test_i_bar )
00130 {
00131 gssize n_x = 1000;
00132 double x_max = 40;
00133 double dy = x_max/n_x;
00134
00135 double l = .087;
00136 double** i_bar;
00137 double* x = eh_linspace( 0 , x_max , n_x );
00138 gssize n_y;
00139
00140 i_bar = plume_i_bar( x , n_x , l , &n_y , dy);
00141
00142 {
00143 gssize i, j;
00144
00145 for ( i=0 ; i<n_x ; i++ )
00146 {
00147 for ( j=0 ; j<n_y ; j++ )
00148 fprintf( stderr , "%g, " , i_bar[i][j] );
00149 fprintf( stderr , "\n" );
00150 }
00151 }
00152
00153 eh_free( x );
00154 eh_free( i_bar[0] );
00155 eh_free( i_bar );
00156 }
00157 END_TEST
00158
00159 START_TEST ( test_approx_nd )
00160 {
00161 double inv;
00162
00163 inv = plume_centerline_inv_at( 0 , 1 );
00164 fail_unless( eh_compare_dbl( inv , 1 , 1e-12 ) , "Inventory is unity at origin" );
00165
00166 inv = plume_centerline_inv_at( PLUME_XA , 1 );
00167 fail_unless( eh_compare_dbl( inv , exp(-PLUME_XA) , 1e-12 ) , "Inventory incorrect at x_a" );
00168
00169 inv = plume_centerline_inv_at( G_MAXDOUBLE , 1 );
00170 fail_unless( eh_compare_dbl( inv , 0 , 1e-12 ) , "Inventory should be zero at large distance" );
00171
00172 {
00173 double x;
00174
00175 for ( x=0 ; x<5000 ; x+=1 )
00176 {
00177 inv = plume_centerline_inv_at( x , 1. );
00178 fail_unless( ~eh_isnan(inv) , "Inventory must not be NaN" );
00179 fail_unless( inv>=0 , "Inventory is positive everywhere" );
00180 fail_unless( inv<=1 , "Inventory is less than 1 everywhere" );
00181 fail_unless( inv<=exp(-x) , "Inventory must be less than exponential falloff" );
00182 }
00183 }
00184 }
00185 END_TEST
00186
00187 START_TEST ( test_approx_deposit_nd )
00188 {
00189 gssize i;
00190 double* dep;
00191 gssize len = 1000;
00192 double* x = eh_new( double , len );
00193
00194 for ( i=0 ; i<len ; i++ )
00195 x[i] = i/10.;
00196
00197 dep = plume_centerline_deposit_nd( NULL , x , len , 1. );
00198
00199 fail_if( dep==NULL , "Deposit array should be created" );
00200
00201 for ( i=0 ; i<len ; i++ )
00202 {
00203 fail_unless( ~eh_isnan(dep[i]) , "Deposit thickness is non-NaN" );
00204 fail_unless( dep[i]>=0 , "Deposit thickness is positive" );
00205 }
00206
00207 eh_free( dep );
00208 eh_free( x );
00209 }
00210 END_TEST
00211
00212 START_TEST ( test_approx_from_file )
00213 {
00214 gssize len = 1000;
00215 double* x = eh_new( double , len );
00216 double* dep = eh_new( double , len );
00217
00218 {
00219 Sed_type this_type;
00220 gssize n, i;
00221 gssize n_grains = sed_sediment_env_n_types();
00222 Sed_hydro_file f = sed_hydro_file_new( SED_HYDRO_TEST_FILE , SED_HYDRO_HYDROTREND , FALSE , TRUE , NULL );
00223 Sed_hydro river;
00224 double dt;
00225 double l;
00226 double* total = eh_new0( double , len );
00227
00228 for ( n=1 ; n<n_grains ; n++ )
00229 {
00230 this_type = sed_sediment_type( NULL , n );
00231 for ( dt=0 ; dt<365 ; )
00232 {
00233 river = sed_hydro_file_read_record( f );
00234
00235 l = plume_non_dim_lambda( sed_type_lambda(this_type) , river );
00236 for ( i=0 ; i<len ; i++ )
00237 x[i] = plume_non_dim_distance( i*100 , river );
00238
00239 dt += sed_hydro_duration( river );
00240 if ( dt <= 365 )
00241 dep = plume_centerline_deposit_nd( dep , x , len , l );
00242
00243 eh_dbl_array_add_each( total , len , dep );
00244
00245 sed_hydro_destroy( river );
00246 }
00247 }
00248
00249 sed_hydro_file_destroy( f );
00250 eh_free( total );
00251 }
00252
00253 eh_free( x );
00254 eh_free( dep );
00255 }
00256 END_TEST
00257
00258 Suite *sed_plume_suite( void )
00259 {
00260 Suite *s = suite_create( "Plume" );
00261 TCase *test_case_core = tcase_create( "Core" );
00262 TCase *test_case_approx = tcase_create( "Approximation" );
00263 TCase *test_case_num = tcase_create( "Numerical" );
00264
00265 suite_add_tcase( s , test_case_core );
00266 suite_add_tcase( s , test_case_approx );
00267 suite_add_tcase( s , test_case_num );
00268
00269 tcase_set_timeout( test_case_num , 0 );
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279 tcase_add_test( test_case_num , test_i_bar );
00280
00281 return s;
00282 }
00283
00284 int main( void )
00285 {
00286 int n;
00287 GError* error = NULL;
00288 Sed_sediment this_sed = NULL;
00289
00290 eh_init_glib();
00291
00292 this_sed = sed_sediment_scan( SED_SEDIMENT_TEST_FILE , &error );
00293
00294 if ( !this_sed )
00295 eh_error( "%s: Unable to scan sediment file: %s" , SED_SEDIMENT_TEST_FILE , error->message );
00296
00297 sed_sediment_set_env( this_sed );
00298
00299 {
00300 Suite *s = sed_plume_suite();
00301 SRunner *sr = srunner_create( s );
00302
00303 srunner_run_all( sr , CK_NORMAL );
00304 n = srunner_ntests_failed( sr );
00305 srunner_free( sr );
00306 }
00307
00308 sed_sediment_unset_env();
00309
00310 return n;
00311 }
00312
00313