openModeller
Version 1.4.0
|
00001 00028 #ifndef _AQUAMAPSHH_ 00029 #define _AQUAMAPSHH_ 00030 00031 #include <openmodeller/om.hh> 00032 00033 #include <string.h> 00034 #include <sqlite3.h> 00035 00036 /********************************************************/ 00037 /*********************** AquaMaps ***********************/ 00038 00080 /****************************************/ 00081 /*********** Expert's values ************/ 00082 00083 const Scalar DEPTH_LIMIT = 200.0; // used to choose between surface or bottom layers (temp/sal) 00084 00085 const Scalar MINIMUM_MAXDEPTH = 0.0; 00086 const Scalar MAXIMUM_MAXDEPTH = 9999.0; 00087 const Scalar MINIMUM_ENVELOPE_SIZE_FOR_MAXDEPTH = 0.0; // not used, just defined 00088 00089 const Scalar MINIMUM_MINDEPTH = 0.0; 00090 const Scalar MAXIMUM_MINDEPTH = 9999.0; 00091 const Scalar MINIMUM_ENVELOPE_SIZE_FOR_MINDEPTH = 0.0; // not used, just defined 00092 00093 const Scalar MINIMUM_ICE_CONCENTRATION = 0.0; 00094 const Scalar MAXIMUM_ICE_CONCENTRATION = 1.5; 00095 const Scalar MINIMUM_ENVELOPE_SIZE_FOR_ICE_CONCENTRATION = 0.0; // not used, just defined 00096 00097 const Scalar MINIMUM_DISTANCE_TO_LAND = 0.0; 00098 const Scalar MAXIMUM_DISTANCE_TO_LAND = 4200.0; 00099 const Scalar MINIMUM_ENVELOPE_SIZE_FOR_DISTANCE_TO_LAND = 2.0; 00100 00101 const Scalar MINIMUM_PRIMARY_PRODUCTION = 0.0; 00102 const Scalar MAXIMUM_PRIMARY_PRODUCTION = 6000.0; 00103 const Scalar MINIMUM_ENVELOPE_SIZE_FOR_PRIMARY_PRODUCTION = 2.0; 00104 00105 const Scalar MINIMUM_SURFACE_SALINITY = 3.56; 00106 const Scalar MAXIMUM_SURFACE_SALINITY = 40.2; 00107 00108 const Scalar MINIMUM_BOTTOM_SALINITY = 3.5; 00109 const Scalar MAXIMUM_BOTTOM_SALINITY = 40.9; 00110 00111 const Scalar MINIMUM_ENVELOPE_SIZE_FOR_SALINITY = 1.0; 00112 00113 const Scalar MINIMUM_SURFACE_TEMPERATURE = -2.0; 00114 const Scalar MAXIMUM_SURFACE_TEMPERATURE = 30.0; 00115 00116 const Scalar MINIMUM_BOTTOM_TEMPERATURE = -2.0; 00117 const Scalar MAXIMUM_BOTTOM_TEMPERATURE = 30.0; 00118 00119 const Scalar MINIMUM_ENVELOPE_SIZE_FOR_TEMPERATURE = 1.0; 00120 00121 const Scalar SURFACE_LOWER_LIMIT [7] = { MINIMUM_MAXDEPTH, 00122 MINIMUM_MINDEPTH, 00123 MINIMUM_ICE_CONCENTRATION, 00124 MINIMUM_DISTANCE_TO_LAND, 00125 MINIMUM_PRIMARY_PRODUCTION, 00126 MINIMUM_SURFACE_SALINITY, 00127 MINIMUM_SURFACE_TEMPERATURE }; 00128 00129 const Scalar BOTTOM_LOWER_LIMIT [7] = { MINIMUM_MAXDEPTH, 00130 MINIMUM_MINDEPTH, 00131 MINIMUM_ICE_CONCENTRATION, 00132 MINIMUM_DISTANCE_TO_LAND, 00133 MINIMUM_PRIMARY_PRODUCTION, 00134 MINIMUM_BOTTOM_SALINITY, 00135 MINIMUM_BOTTOM_TEMPERATURE }; 00136 00137 const Scalar SURFACE_UPPER_LIMIT [7] = { MAXIMUM_MAXDEPTH, 00138 MAXIMUM_MINDEPTH, 00139 MAXIMUM_ICE_CONCENTRATION, 00140 MAXIMUM_DISTANCE_TO_LAND, 00141 MAXIMUM_PRIMARY_PRODUCTION, 00142 MAXIMUM_SURFACE_SALINITY, 00143 MAXIMUM_SURFACE_TEMPERATURE }; 00144 00145 const Scalar BOTTOM_UPPER_LIMIT [7] = { MAXIMUM_MAXDEPTH, 00146 MAXIMUM_MINDEPTH, 00147 MAXIMUM_ICE_CONCENTRATION, 00148 MAXIMUM_DISTANCE_TO_LAND, 00149 MAXIMUM_PRIMARY_PRODUCTION, 00150 MAXIMUM_BOTTOM_SALINITY, 00151 MAXIMUM_BOTTOM_TEMPERATURE }; 00152 00153 const Scalar INNER_SIZE [7] = { MINIMUM_ENVELOPE_SIZE_FOR_MAXDEPTH, 00154 MINIMUM_ENVELOPE_SIZE_FOR_MINDEPTH, 00155 MINIMUM_ENVELOPE_SIZE_FOR_ICE_CONCENTRATION, 00156 MINIMUM_ENVELOPE_SIZE_FOR_DISTANCE_TO_LAND, 00157 MINIMUM_ENVELOPE_SIZE_FOR_PRIMARY_PRODUCTION, 00158 MINIMUM_ENVELOPE_SIZE_FOR_SALINITY, 00159 MINIMUM_ENVELOPE_SIZE_FOR_TEMPERATURE }; 00160 00161 const std::string NAME [7] = { "maximum depth", 00162 "minimum depth", 00163 "ice concentration", 00164 "distance to land", 00165 "primary production", 00166 "salinity", 00167 "temperature" }; 00168 00169 // Variable position in sample or arrays 00170 00171 const int MAXDEPTH = 0; 00172 const int MINDEPTH = 1; 00173 const int ICE_CONCENTRATION = 2; 00174 const int DISTANCE_TO_LAND = 3; 00175 const int PRIMARY_PRODUCTION = 4; 00176 const int SALINITY = 5; 00177 const int TEMPERATURE = 6; 00178 00183 class AquaMaps : public AlgorithmImpl 00184 { 00185 public: 00186 00187 AquaMaps(); 00188 ~AquaMaps(); 00189 00190 // Basic methods inherited from Algorithm class 00191 00192 int initialize(); 00193 int iterate(); 00194 int getConvergence( Scalar * const val ) const; 00195 float getProgress() const; 00196 int done() const; 00197 Scalar getValue( const Sample& x ) const; 00198 00199 protected: 00200 00201 // Model Serialization 00202 virtual void _getConfiguration( ConfigurationPtr& ) const; 00203 00204 // Model Deserialization 00205 virtual void _setConfiguration( const ConstConfigurationPtr & ); 00206 00207 private: 00208 00216 int _getAndCheckParameter( std::string const &name, int * value ); 00217 00219 void _calculateEnvelopes( const OccurrencesPtr& ); 00220 00222 void _percentile( Scalar *result, int n, double percent, std::vector<ScalarVector> *matrix, int layerIndex ); 00223 00225 void _readSpeciesData( const char *species ); 00226 00228 bool _hasExpertRange( sqlite3_stmt * stmt, int varIndex ); 00229 00231 void _adjustInterquartile( int layerIndex, Scalar adjmin, Scalar adjmax ); 00232 00234 void _ensureEnvelopeSize( int layerIndex ); 00235 00237 void _logEnvelope(); 00238 00240 int _getRelatedIndex( int index ); 00241 00243 int * _use_layer; 00244 00246 Sample _lower_limit; 00247 00249 Sample _upper_limit; 00250 00252 Sample _inner_size; 00253 00255 Sample _minimum; 00256 00258 Sample _maximum; 00259 00261 Sample _pref_minimum; 00262 00264 Sample _pref_maximum; 00265 00269 int _pelagic; 00270 00274 int _use_surface_layers; 00275 00277 bool * _has_expert_range; 00278 00280 float _progress; 00281 }; 00282 00283 00284 #endif 00285