openModeller  Version 1.4.0
aquamaps.hh
Go to the documentation of this file.
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