/Users/huttone/Devel/sedflux-new/sedflux/trunk/ew/plume/plume_unit_test.c

Go to the documentation of this file.
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 //   eh_dbl_grid_fprintf( stderr , "%g, " , deposit[3] );
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 START_TEST ( test_plume_from_file )
00083 {
00084    Plume_inputs plume_const;
00085    Plume_data plume_data;
00086    Eh_dbl_grid* deposit;
00087 
00088    plume_const.current_velocity    = 0.;
00089    plume_const.ocean_concentration = 0.;
00090    plume_const.plume_width         = 3000.;
00091    plume_const.ndx                 = 1;
00092    plume_const.ndy                 = 3;
00093 
00094    plume_data_init( &plume_data );
00095 
00096    {
00097       gssize n;
00098       deposit = eh_new( Eh_dbl_grid , 4 );
00099       for ( n=0 ; n<4 ; n++ )
00100       {
00101          deposit[n] = eh_grid_new( double , 2 , 800 );
00102 
00103          eh_grid_set_x_lin( deposit[n] , -30000 , 30000 );
00104          eh_grid_set_y_lin( deposit[n] , 0      , 100 );
00105       }
00106    }
00107 
00108    {
00109       Sed_hydro_file f = sed_hydro_file_new( SED_HYDRO_TEST_FILE , HYDRO_HYDROTREND , TRUE );
00110       Sed_hydro river;
00111       double dt;
00112 
00113       for ( dt=0 ; dt<365 ; )
00114       {
00115          river = sed_hydro_file_read_record( f );
00116          dt += sed_hydro_duration( river );
00117          if ( dt <= 365 )
00118             plume_3d( &plume_const , river , sed_sediment_env() , deposit , &plume_data );
00119          sed_hydro_destroy( river );
00120       }
00121 
00122       sed_hydro_file_destroy( f );
00123    }
00124 
00125 }
00126 END_TEST
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 //   double dy = .1;
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    tcase_add_test( test_case_core   , test_plume      );
00272 //   tcase_add_test( test_case_core   , test_plume_from_file );
00273 
00274 
00275    tcase_add_test( test_case_approx , test_approx_nd  );
00276    tcase_add_test( test_case_approx , test_approx_deposit_nd  );
00277    tcase_add_test( test_case_approx , test_approx_from_file  );
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 

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