source: XIOS/trunk/src/node/axis.cpp @ 552

Last change on this file since 552 was 551, checked in by mhnguyen, 9 years ago

Redesigning grid structure

+) Add an intermediate class to calculate distribution on client and servers
+) Change all index of attributes to zero (0), instead of one(1)

Test
+) On Curie
+) Test new features passes but some data are still shifted

  • Property copyright set to
    Software name : XIOS (Xml I/O Server)
    http://forge.ipsl.jussieu.fr/ioserver
    Creation date : January 2009
    Licence : CeCCIL version2
    see license file in root directory : Licence_CeCILL_V2-en.txt
    or http://www.cecill.info/licences/Licence_CeCILL_V2-en.html
    Holder : CEA/LSCE (Laboratoire des Sciences du CLimat et de l'Environnement)
    CNRS/IPSL (Institut Pierre Simon Laplace)
    Project Manager : Yann Meurdesoif
    yann.meurdesoif@cea.fr
File size: 5.9 KB
Line 
1#include "axis.hpp"
2
3#include "attribute_template.hpp"
4#include "object_template.hpp"
5#include "group_template.hpp"
6#include "message.hpp"
7#include "type.hpp"
8#include "xmlioserver_spl.hpp"
9
10namespace xios {
11
12   /// ////////////////////// Définitions ////////////////////// ///
13
14   CAxis::CAxis(void)
15      : CObjectTemplate<CAxis>()
16      , CAxisAttributes(), isChecked(false), relFiles(), baseRefObject()
17   { /* Ne rien faire de plus */ }
18
19   CAxis::CAxis(const StdString & id)
20      : CObjectTemplate<CAxis>(id)
21      , CAxisAttributes(), isChecked(false), relFiles(), baseRefObject()
22   { /* Ne rien faire de plus */ }
23
24   CAxis::~CAxis(void)
25   { /* Ne rien faire de plus */ }
26
27   ///---------------------------------------------------------------
28
29   const std::set<StdString> & CAxis::getRelFiles(void) const
30   {
31      return (this->relFiles);
32   }
33
34   bool CAxis::IsWritten(const StdString & filename) const
35   {
36      return (this->relFiles.find(filename) != this->relFiles.end());
37   }
38
39   void CAxis::addRelFile(const StdString & filename)
40   {
41      this->relFiles.insert(filename);
42   }
43
44   //----------------------------------------------------------------
45
46   StdString CAxis::GetName(void)   { return (StdString("axis")); }
47   StdString CAxis::GetDefName(void){ return (CAxis::GetName()); }
48   ENodeType CAxis::GetType(void)   { return (eAxis); }
49
50   //----------------------------------------------------------------
51
52   void CAxis::checkAttributes(void)
53   {
54      if (this->isChecked) return;
55      if (this->size.isEmpty())
56         ERROR("CAxis::checkAttributes(void)",<< "Attribut <size> of the axis must be specified") ;
57      StdSize size = this->size.getValue();
58
59      if (!this->ibegin.isEmpty())
60      {
61        StdSize ibegin = this->ibegin.getValue();
62        if ((ibegin < 0) || (ibegin > size-1))
63          ERROR("CAxis::checkAttributes(void)",<< "Attribut <ibegin> of the axis must be non-negative and smaller than size-1") ;
64      }
65      else this->ibegin.setValue(0);
66
67      if (!this->ni.isEmpty())
68      {
69        StdSize ni = this->ni.getValue();
70        if ((ni < 0) || (ni > size))
71          ERROR("CAxis::checkAttributes(void)",<< "Attribut <ni> of the axis must be non-negative and smaller than size") ;
72      }
73      else this->ni.setValue(size);
74
75      StdSize zoom_begin,zoom_end, zoom_size ;
76
77//      zoom_begin = (this->zoom_begin.isEmpty()) ?  1 : this->zoom_begin.getValue() ;
78//      zoom_end = (this->zoom_end.isEmpty()) ?  size : this->zoom_end.getValue() ;
79//      zoom_size = (this->zoom_size.isEmpty()) ?  size : this->zoom_size.getValue() ;
80
81      // Maybe index begins at 0 (zero)
82      zoom_begin = (this->zoom_begin.isEmpty()) ?  0 : this->zoom_begin.getValue() ;
83      zoom_end = (this->zoom_end.isEmpty()) ?  size-1 : this->zoom_end.getValue() ;
84      zoom_size = (this->zoom_size.isEmpty()) ?  size : this->zoom_size.getValue() ;
85
86      if (this->zoom_begin.isEmpty()) zoom_begin=zoom_end-zoom_size+1 ;
87      if (this->zoom_end.isEmpty()) zoom_end=zoom_begin+zoom_size-1 ;
88      if (this->zoom_size.isEmpty()) zoom_size=zoom_end-zoom_begin+1 ;
89//
90//      if ( (zoom_begin < 1) || (zoom_begin > size) || (zoom_end<1) || (zoom_end>size) || (zoom_size<1) || (zoom_size>size) || (zoom_begin>zoom_end))
91//        ERROR("CAxis::checkAttributes(void)",<< "One or more attribut of <zoom_begin>, <zoom_end>, <zoom_size>, are not well specified") ;
92
93      if ( (zoom_begin < 0) || (zoom_begin > size-1) || (zoom_end<1) || (zoom_end>size-1) || (zoom_size<1) || (zoom_size>size) || (zoom_begin>zoom_end))
94        ERROR("CAxis::checkAttributes(void)",<< "One or more attribut of <zoom_begin>, <zoom_end>, <zoom_size>, are not well specified") ;
95
96      this->zoom_begin.setValue(zoom_begin) ;
97      this->zoom_end.setValue(zoom_end) ;
98      this->zoom_size.setValue(zoom_size) ;
99
100      StdSize true_size = value.numElements();
101      if (size != true_size)
102         ERROR("CAxis::checkAttributes(void)",
103               << "The array \'value\' has a different size that the one defined by the \'size\' attribut")
104
105      this->checkData();
106      this->checkMask();
107      this->isChecked = true;
108   }
109
110   void CAxis::checkData()
111   {
112      if (data_begin.isEmpty()) data_begin.setValue(0);
113      if (!data_n.isEmpty() && data_n.getValue() <= 0)
114      {
115        ERROR("CAxis::checkData(void)",
116              << "Data dimension is negative (data_n).") ;
117      }
118      else if (data_n.isEmpty())
119        data_n.setValue(zoom_size.getValue());
120
121      if (data_index.isEmpty())
122      {
123        int dn = data_n.getValue();
124        data_index.resize(dn);
125        for (int i = 0; i < dn; ++i) data_index(i) = (i+1);
126      }
127   }
128
129   void CAxis::checkMask()
130   {
131      int begin_mask = 0,
132          end_mask = ni.getValue()-1;
133
134      if (!zoom_begin.isEmpty())
135      {
136         int zoom_end = zoom_begin.getValue() + zoom_size.getValue() - 1;
137
138         begin_mask = std::max(ibegin.getValue(), zoom_begin.getValue());
139         end_mask   = std::min(ibegin.getValue() + ni.getValue()-1, zoom_end);
140
141         begin_mask -= ibegin.getValue();
142         end_mask   -= ibegin.getValue();
143      }
144
145
146      if (!mask.isEmpty())
147      {
148         if (mask.extent(0) != ni)
149            ERROR("CAxis::checkMask(void)",
150                  <<"the mask has not the same size than the local axis"<<endl
151                  <<"Local size is "<<ni<<"x"<<endl
152                  <<"Mask size is "<<mask.extent(0)<<"x");
153         for (int i = 0; i < ni; ++i)
154         {
155           if (i < begin_mask && i > end_mask)  mask(i) = false;
156         }
157      }
158      else // (!mask.hasValue())
159      { // Si aucun masque n'est défini,
160        // on en crée un nouveau qui valide l'intégralité du domaine.
161         mask.resize(ni) ;
162         for (int i = 0; i < ni.getValue(); ++i)
163         {
164               if (i >= begin_mask && i <= end_mask)
165                 mask(i) = true;
166               else  mask(i) = false;
167         }
168      }
169   }
170
171   DEFINE_REF_FUNC(Axis,axis)
172
173   ///---------------------------------------------------------------
174
175} // namespace xios
Note: See TracBrowser for help on using the repository browser.