*/
//================================================================================
-SauvUtilities::Group* SauvReader::getFieldSupport(const vector<SauvUtilities::Group*>& supports)
+void SauvReader::setFieldSupport(const vector<SauvUtilities::Group*>& supports,
+ SauvUtilities::DoubleField* field)
{
SauvUtilities::Group* group = NULL;
set<SauvUtilities::Group*> sup_set( supports.begin(), supports.end() );
}
else
{
- // try to find an existing composite group with the same sub-groups
- for ( size_t i = 0; i < _iMed->_groups.size() && !group; ++i )
+ // check if sub-components are on cells of different types
+ map<int,int> nbGaussByCellType;
+ for ( size_t i = 0; i < supports.size(); ++i )
{
- Group & grp = _iMed->_groups[i];
- if (sup_set.size() == grp._groups.size())
- {
- bool sameOrder = true;
- for ( size_t j = 0; j < supports.size() && sameOrder; ++j )
- sameOrder = ( supports[j] == grp._groups[ j % grp._groups.size() ]);
- if ( sameOrder )
- group = & _iMed->_groups[i];
- }
+ map<int,int>::iterator ct2ng = nbGaussByCellType.find( supports[i]->_cellType );
+ if ( ct2ng == nbGaussByCellType.end() )
+ nbGaussByCellType[ supports[i]->_cellType ] = field->_sub[i].nbGauss();
+ else if ( ct2ng->second != field->_sub[i].nbGauss() )
+ return;
}
+ bool isSameCellType = ( nbGaussByCellType.size() == 1 );
+ // try to find an existing composite group with the same sub-groups
+ if ( isSameCellType )
+ for ( size_t i = 0; i < _iMed->_groups.size() && !group; ++i )
+ {
+ Group & grp = _iMed->_groups[i];
+ if (sup_set.size() == grp._groups.size())
+ {
+ bool sameOrder = true;
+ for ( size_t j = 0; j < supports.size() && sameOrder; ++j )
+ sameOrder = ( supports[j] == grp._groups[ j % grp._groups.size() ]);
+ if ( sameOrder )
+ group = & _iMed->_groups[i];
+ }
+ }
if ( !group ) // no such a group, add a new one
{
vector<SauvUtilities::Group*> newGroups( supports.begin(),
group->_groups.swap( newGroups );
}
}
+ // sort field sub-components and supports by cell type
+ if ( group && !isSameCellType )
+ {
+ // sort groups
+ vector<SauvUtilities::Group*>& groups = group->_groups;
+ bool isModified = false, isSwapped = true;
+ while ( isSwapped )
+ {
+ isSwapped = false;
+ for ( size_t i = 1; i < groups.size(); ++i )
+ {
+ int nbN1 = groups[i-1]->empty() ? 0 : groups[i-1]->_cells[0]->_nodes.size();
+ int nbN2 = groups[i ]->empty() ? 0 : groups[i ]->_cells[0]->_nodes.size();
+ if ( nbN1 > nbN2 )
+ {
+ isSwapped = isModified = true;
+ std::swap( groups[i], groups[i-1] );
+ }
+ }
+ }
+ // relocate sub-components according to a new order of groups
+ if ( isModified )
+ {
+ vector< DoubleField::_Sub_data > newSub( field->_sub.size() );
+ vector< vector< double > > newValues( field->_comp_values.size() );
+ size_t iFromSub = 0, iNewSub = 0, iNewComp = 0;
+ for ( ; iFromSub < field->_sub.size(); iFromSub += groups.size() )
+ {
+ size_t iFromComp = iNewComp;
+ for ( size_t iG = 0; iG < groups.size(); ++iG )
+ {
+ size_t iComp = iFromComp;
+ for ( size_t iSub = iFromSub; iSub < field->_sub.size(); ++iSub )
+ if ( field->_sub[ iSub ]._support == groups[ iG ] )
+ {
+ newSub[ iNewSub++ ] = field->_sub[ iSub ];
+ int iC = 0, nbC = field->_sub[ iSub ].nbComponents();
+ for ( ; iC < nbC; ++iC )
+ newValues[ iNewComp++ ].swap( field->_comp_values[ iComp++ ]);
+ break;
+ }
+ else
+ {
+ iComp += field->_sub[ iSub ].nbComponents();
+ }
+ }
+ }
+ field->_sub.swap( newSub );
+ field->_comp_values.swap( newValues );
+ }
+ }
}
if ( group )
group->_isProfile = true;
- return group;
+
+ field->_group = group;
}
//================================================================================
/*!
- * \brief set field names
+ * \brief Set field names
*/
//================================================================================
// set a supporting group including all subs supports but only
// if all subs have the same components
if ( fdouble && fdouble->hasSameComponentsBySupport() )
- fdouble->_group = getFieldSupport( supports );
+ setFieldSupport( supports, fdouble );
else
for ( i_sub = 0; i_sub < nb_sub; ++i_sub )
fdouble->_sub[ i_sub ]._support->_isProfile = true;
// set id of a group including all sub supports but only
// if all subs have the same nb of components
if ( fdouble && fdouble->hasSameComponentsBySupport() )
- fdouble->_group = getFieldSupport( supports );
+ setFieldSupport( supports, fdouble );
else
for ( i_sub = 0; i_sub < nb_sub; ++i_sub )
fdouble->_sub[ i_sub ]._support->_isProfile = true;