source: XIOS/dev/dev_rv/src4/xmlio/array_util.hpp @ 2338

Last change on this file since 2338 was 258, checked in by hozdoba, 13 years ago
File size: 6.8 KB
Line 
1/* ************************************************************************** *
2 *      Copyright © IPSL/LSCE, XMLIOServer, Avril 2010 - Octobre 2011         *
3 * ************************************************************************** */
4
5#ifndef __ARRAY_UTIL_HPP__
6#define __ARRAY_UTIL_HPP__
7
8/**
9 * \file    array_util.hpp
10 * \brief   Définition de quelques méthodes pratiques pour travailler avec les tableaux (entête).
11 * \author  Hervé Ozdoba
12 * \version 0.4
13 * \date    12 Juillet 2011
14 */
15 
16 #ifndef __XIOS_NO_EXTERN
17 
18// boost Headers
19#include <boost/multi_array.hpp>
20
21#endif // __XIOS_NO_EXTERN
22
23// /////////////////////////////// Définitions ////////////////////////////// //
24
25namespace xmlioserver
26{
27   /**
28    * \class CArrayUtil
29    * \brief Classe regroupant quelques méthodes pratiques pour travailler avec les tableaux
30    * multi-dimensionnels de la bibliothÚque Boost (ie boost::multi_array).
31    */
32   class CArrayUtil
33   {
34      public : // Conversion de tableau typé
35     
36         /**
37          * \brief Convertit un tableau de données d'un certain type vers un autre.
38          * \tparam ODataType : type du tableau d'entrée.
39          * \tparam IDataType : type du tableau de sortie.
40          * \tparam Size      : dimension des tableaux.
41          * \param _array_in  : un tableau d'entrée de type ODataType.
42          * \param _array_out : un tableau de sortie de type IDataType.
43          * \remarks Les tableaux d'entrée et de sortie sont tous deux de dimension Size.
44          *
45          * <i> Exemple de conversion d'un tableau de rééls en double précision
46          * en tableau de rééls en simple précision: </i>
47          * \code
48          * // Conversion de tableau
49          * const boost::multi_array<double, 3> input(boost::extents[10][12][3]);
50          * boost::multi_array<float, 3> output;
51          * xios::CArrayUtil::SameShape(input, output);
52          * xios::CArrayUtil::Convert(input, output);
53          * \endcode
54          */
55         template <typename ODataType, typename IDataType, std::size_t Size>
56            static inline void Convert
57               (const boost::multi_array<IDataType, Size> & _array_in,
58                      boost::multi_array<ODataType, Size> & _array_out);
59                     
60      public : // Opérations sur les tableaux
61         
62         /**
63          * \brief Applique une opération binaire à des tableaux (tableau et tableau).
64          * \tparam DataType : type de données des tableaux.
65          * \tparam Size : dimension des tableaux.
66          * \param _input_array1  : premier tableau multidimensionnel d'entrée.
67          * \param _input_array2  : second tableau multidimensionnel d'entrée.
68          * \param _output_array  : tableau multidimensionnel de sortie.
69          * \param _function      : opération binaire à appliquer.
70          *
71          * <i> Exemple de somme des éléments de deux tableaux</i>
72          * \code
73          * boost::multi_array<double, 2>
74          *       input1(boost::extents[10][12]),
75          *       input2(boost::extents[10][12]),
76          *       output(boost::extents[10][12]);
77          * xios::CArrayUtil::Apply1(input1, input2, output, &xios::AUSum);
78          * \endcode
79          */
80         template <typename DataType, std::size_t Size>
81            static inline void Apply1(const boost::multi_array<DataType, Size> & _input_array1,
82                                      const boost::multi_array<DataType, Size> & _input_array2,
83                                            boost::multi_array<DataType, Size> & _output_array,
84                                      DataType (*_function) (DataType, DataType));
85         
86         /**
87          * \brief Applique une opération binaire à un tableau (tableau et scalaire).
88          * \tparam DataType      : type de données du tableau.
89          * \tparam ScalDataType  : type de données du scalaire.
90          * \tparam Size          : dimension des tableaux.
91          * \param _input_array   : tableau multidimensionnel d'entrée.
92          * \param _output_array  : tableau multidimensionnel de sortie.
93          * \param _scalar        : scalaire de type ScalDataType
94          * \param _function      : opération binaire à appliquer.
95          *
96          * <i> Exemple de somme des éléments de tableaux avec les scalaire 3.</i>
97          * \code
98          * boost::multi_array<double, 2>
99          *       input(boost::extents[10][12]),
100          *       output(boost::extents[10][12]);
101          * xios::CArrayUtil::Apply2(input, output, 3., &xios::AUSum<double, double>);
102          * \endcode
103          */                                                                                                         
104         template <typename DataType, typename ScalDataType, std::size_t Size>
105            static inline void Apply2(const boost::multi_array<DataType, Size> & _input_array,
106                                            boost::multi_array<DataType, Size> & _output_array,
107                                            ScalDataType _scalar,
108                                      DataType (*_function) (DataType, ScalDataType));
109                                                                                     
110      public : // Autres méthodes
111
112         /**
113          * \brief Associe au tableau de sortie le même profil que le tableau d'entrée.
114          * \tparam ODataType : type du tableau d'entrée.
115          * \tparam IDataType : type du tableau de sortie.
116          * \tparam Size      : dimension des tableaux.
117          * \param _array_in  : un tableau d'entrée de type ODataType.
118          * \param _array_out : un tableau de sortie de type IDataType.
119          * \remarks Les tableaux d'entrée et de sortie sont tous deux de dimension Size.
120          */
121         template <typename ODataType, typename IDataType, std::size_t Size>
122            static inline void SameShape
123               (const boost::multi_array<IDataType, Size> & _array_in,
124                      boost::multi_array<ODataType, Size> & _array_out);             
125
126   }; // CArrayUtil
127 
128// ////////////////////////// Définitions d'opérations ////////////////////// //
129   
130   /// \brief Somme de _value_1 et _value_2
131   template <typename DataType, typename ScalDataType>
132      inline DataType AUSum (DataType _value_1, ScalDataType _value_2);
133   
134   /// \brief Division de _value_1 et _value_2
135   template <typename DataType, typename ScalDataType>
136      inline DataType AUDiv (DataType _value_1, ScalDataType _value_2);
137   
138   /// \brief Maximum de _value_1 et _value_2
139   template <typename DataType, typename ScalDataType>
140      inline DataType AUMax (DataType _value_1, ScalDataType _value_2);
141   
142    /// \brief Minimum de _value_1 et _value_2
143   template <typename DataType, typename ScalDataType>
144      inline DataType AUMin (DataType _value_1, ScalDataType _value_2);
145
146} // namespace xmlioserver
147
148#endif // __ARRAY_UTIL_HPP__
Note: See TracBrowser for help on using the repository browser.