00001 #include <stdio.h>
00002 #include <glib.h>
00003 #include <sed/sed_diag.h>
00004
00005 typedef enum
00006 {
00007 SED_DIAG_TARGET_CUBE = 0,
00008 SED_DIAG_TARGET_COLUMN ,
00009 SED_DIAG_TARGET_CELL ,
00010 SED_DIAG_TARGET_UNKNOWN ,
00011 } Sed_diag_type;
00012
00013 CLASS ( Sed_diag )
00014 {
00015 Sed_cube cube;
00016 Sed_column col;
00017 Sed_cell cell;
00018
00019 double start;
00020 double stop;
00021
00022 Sed_diag_type type;
00023 };
00024
00025 Sed_diag
00026 sed_diag_new( void )
00027 {
00028 Sed_diag d = NULL;
00029
00030 NEW_OBJECT( Sed_diag , d );
00031
00032 d->cube = NULL;
00033 d->col = NULL;
00034 d->cell = NULL;
00035
00036 d->start = 0;
00037 d->stop = 0;
00038
00039 d->type = SED_DIAG_TARGET_UNKNOWN;
00040
00041 return d;
00042 }
00043
00044 Sed_diag
00045 sed_diag_destroy( Sed_diag d )
00046 {
00047 if ( d )
00048 {
00049 eh_free( d );
00050 }
00051 return NULL;
00052 }
00053
00054 Sed_diag
00055 sed_diag_new_target_cube( Sed_cube c )
00056 {
00057 Sed_diag d = NULL;
00058 if ( c )
00059 {
00060 d = sed_diag_new();
00061 d->cube = c;
00062 d->type = SED_DIAG_TARGET_CUBE;
00063 }
00064 return d;
00065 }
00066
00067 Sed_diag
00068 sed_diag_new_target_column( Sed_column c )
00069 {
00070 Sed_diag d = NULL;
00071 if ( c )
00072 {
00073 d = sed_diag_new();
00074 d->col = c;
00075 d->type = SED_DIAG_TARGET_COLUMN;
00076 }
00077 return d;
00078 }
00079
00080 Sed_diag sed_diag_new_target_cell( Sed_cell c )
00081 {
00082 Sed_diag d = NULL;
00083 if ( c )
00084 {
00085 d = sed_diag_new();
00086 d->cell = c;
00087 d->type = SED_DIAG_TARGET_CELL;
00088 }
00089 return d;
00090 }
00091
00092 double
00093 _sed_diag_mass( Sed_diag d )
00094 {
00095 double m = 0;
00096 switch ( d->type )
00097 {
00098 case SED_DIAG_TARGET_CUBE : m = sed_cube_sediment_mass ( d->cube ); break;
00099 case SED_DIAG_TARGET_COLUMN: m = sed_column_sediment_mass( d->col ); break;
00100 case SED_DIAG_TARGET_CELL : m = sed_cell_sediment_mass ( d->cell ); break;
00101 default: eh_require_not_reached();
00102 }
00103 return m;
00104 }
00105
00106 double
00107 sed_diag_start( Sed_diag d )
00108 {
00109 double m = 0;
00110 if ( d )
00111 {
00112 d->start = _sed_diag_mass( d );
00113 }
00114 return m;
00115 }
00116
00117 double
00118 sed_diag_stop( Sed_diag d )
00119 {
00120 double m = 0;
00121 if ( d )
00122 {
00123 d->stop = _sed_diag_mass( d );
00124 }
00125 return m;
00126 }
00127
00128 double
00129 sed_diag_elapsed( Sed_diag d )
00130 {
00131 double m = 0;
00132 if ( d )
00133 {
00134 m = _sed_diag_mass( d ) - d->start;
00135 }
00136 return m;
00137 }
00138
00139 double
00140 sed_diag_continue( Sed_diag d )
00141 {
00142 double m = 0;
00143 if ( d )
00144 {
00145 d->stop = 0;
00146
00147 m = d->start;
00148 }
00149 return m;
00150 }
00151
00152 double
00153 sed_diag_reset( Sed_diag d )
00154 {
00155 double m = 0;
00156 if ( d )
00157 {
00158 d->start = _sed_diag_mass( d );
00159 d->stop = 0;
00160
00161 m = d->start;
00162 }
00163 return m;
00164 }
00165
00166 static gchar* target_s[] =
00167 {
00168 "Sed_cube" ,
00169 "Sed_column" ,
00170 "Sed_cell" ,
00171 "Unknown"
00172 };
00173
00174 gchar*
00175 _sed_diag_target_s( Sed_diag d )
00176 {
00177 return target_s[d->type];
00178 }
00179
00180 gint
00181 sed_diag_fprint( FILE* fp , Sed_diag d )
00182 {
00183 gint n = 0;
00184 if ( d )
00185 {
00186 fprintf( fp , "--- Start: sedflux diagnostics ---\n" );
00187 fprintf( fp , "Target type : %s\n" , _sed_diag_target_s( d ) );
00188 fprintf( fp , "Starting mass : %g\n" , d->start );
00189 fprintf( fp , "Stopping mass : %g\n" , d->stop );
00190 fprintf( fp , "--- End: sedflux diagnostics ---\n" );
00191 }
00192 return n;
00193 }
00194