#ifndef __GRID__ #define __GRID__ using XMLIOSERVER::XML::XMLNode; using XMLIOSERVER::XML::THashAttributes; namespace XMLIOSERVER { class CGrid : public ObjectTemplate, public GridAttribut { public: CGrid(void) : ObjectTemplate(), GridAttribut(), hasAxis(false), axis(NULL), domain(NULL) { /* Ne rien faire de plus */ } CGrid(const string& _id) : ObjectTemplate(_id), GridAttribut(), hasAxis(false), axis(NULL), domain(NULL) { /* Ne rien faire de plus */ } const CAxis* getRelAxis (void) const { return (axis); } const CDomain* getRelDomain(void) const { return (domain); } const Array& getStoreIndex(void) const { return (storeIndex); } const Array& getOutIIndex(void) const { return (out_i_index); } const Array& getOutJIndex(void) const { return (out_j_index); } const Array& getOutLIndex(void) const { return (out_l_index); } void solveReference(void) { this->solveDomainRef() ; this->solveAxisRef() ; this->computeIndex() ; } void solveDomainRef(void) { if (domain_ref.hasValue()) { if (CDomain::HasObject(domain_ref)) { domain = CDomain::GetObject(domain_ref) ; domain->check() ; } else ERROR("Référence au domaine incorrecte") ; } else ERROR("Domaine non défini") ; } void solveAxisRef(void) { if (axis_ref.hasValue()) { hasAxis = true ; if (CAxis::HasObject(axis_ref)) axis = CAxis::GetObject(axis_ref) ; else ERROR("Référence a l'axe incorrecte") ; } else hasAxis = false ; // hasAxis est normalement déjà à false(?). } inline void computeIndex(void); bool _hasAxis(void) const { return (hasAxis); } template void storeField(const T& field, Array& stored) const { this->storeField_arr(field.dataFirst(), stored) ; } template inline void outputField(const Array& stored, T&) const; public : /* virtual */ virtual ~CGrid(void) { /* Ne rien faire de plus */ } public : /* static */ static string GetName (void) { return ("grid"); } static string GetDefName(void) { return (CGrid::GetName()); } static CGrid* CreateObject(const CDomain* const a_domain, const CAxis* const a_axis) { string new_id = string("___") + a_domain->getId() + string("_") + a_axis->getId() + string("__") ; CGrid* const grid = ObjectTemplate::CreateObject(new_id) ; grid->domain_ref = a_domain->getId() ; grid->axis_ref = a_axis ->getId() ; return (grid); } static CGrid* CreateObject(const CDomain* const a_domain) { string new_id = string("___") + a_domain->getId() + string("__") ; CGrid* const grid = ObjectTemplate::CreateObject(new_id) ; grid->domain_ref = a_domain->getId() ; return (grid); } protected : void storeField_arr(const double* const data, Array& stored) const { const int size = storeIndex.size() ; stored.resize(shape(size)) ; for(int i = 0; i < size; i++) stored(i) = data[storeIndex(i)] ; } private: bool hasAxis ; CAxis * axis ; CDomain * domain ; Array storeIndex ; Array out_i_index ; Array out_j_index ; Array out_l_index ; }; // class CGrid void CGrid::computeIndex(void) { int ni = domain->ni ; int nj = domain->nj ; int size = (hasAxis) ? (int)axis->size : 1 ; int data_dim = domain->data_dim ; int data_n_index = domain->data_n_index ; int data_ibegin = domain->data_ibegin ; int data_jbegin = (data_dim == 2) ? (int)domain->data_jbegin : -1; Array& data_i_index =* domain->data_i_index ; Array& data_j_index =* domain->data_j_index ; Array& mask =* domain->mask ; int i, j, l, n ; int count, indexCount ; for(indexCount=0, l=0; l=0 && i=0 && j=0 && i=0 && j void CGrid::outputField(const Array& stored, Array& outField) const { for(int n = 0; n < storeIndex.size(); n++) outField(out_i_index(n), out_j_index(n)) = stored(n) ; } template<> void CGrid::outputField(const Array& stored, Array& outField) const { for(int n = 0; n < storeIndex.size(); n++) outField(out_i_index(n), out_j_index(n), out_l_index(n)) = stored(n) ; } } // namespace XMLIOSERVER DECLARE_GROUP(Grid) #endif // __GRID__