+ // 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 );
+ }
+ }