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