void PolyhedronIntersectorP1P0<MyMeshType,MyMatrix>::intersectCells(ConnType targetCell, const std::vector<ConnType>& srcCells, MyMatrix& res)
{
typename MyMatrix::value_type& resRow=res[targetCell];
- if( _split.getSplittingPolicy() != GENERAL_24)
+ INTERP_KERNEL::SplittingPolicy sp( _split.getSplittingPolicy() );
+ if( sp == GENERAL_48 )
+ THROW_IK_EXCEPTION("GENERAL_28 spliting is not supported for P1P0 interpolation");
+ SplitterTetra<MyMeshType>* subTetras[24];
+ for(typename std::vector<ConnType>::const_iterator iterCellS=srcCells.begin();iterCellS!=srcCells.end();iterCellS++)
{
- SplitterTetra<MyMeshType>* subTetras[24];
- for(typename std::vector<ConnType>::const_iterator iterCellS=srcCells.begin();iterCellS!=srcCells.end();iterCellS++)
- {
- releaseArrays();
- ConnType nbOfNodesS=Intersector3D<MyMeshType,MyMatrix>::_src_mesh.getNumberOfNodesOfElement(OTT<ConnType,numPol>::indFC(*iterCellS));
- _split.splitTargetCell(*iterCellS,nbOfNodesS,_tetra);
- for(typename std::vector<SplitterTetra<MyMeshType>*>::const_iterator iter = _tetra.cbegin(); iter != _tetra.cend(); ++iter)
- {
- (*iter)->splitIntoDualCells(subTetras);
- double vol2 = 0.;
- for(int i=0;i<24;i++)
- {
- SplitterTetra<MyMeshType> *tmp=subTetras[i];
- double volume = tmp->intersectSourceCell(targetCell);
- vol2 += volume;
- ConnType sourceNode=tmp->getId(0);
- AddContributionInRow(resRow,OTT<ConnType,numPol>::indFC(sourceNode),volume);
- delete tmp;
- }
- }
- }
- }
- else
- {
- for(typename std::vector<ConnType>::const_iterator iterCellS=srcCells.begin();iterCellS!=srcCells.end();iterCellS++)
- {
- releaseArrays();
- ConnType nbOfNodesS=Intersector3D<MyMeshType,MyMatrix>::_src_mesh.getNumberOfNodesOfElement(OTT<ConnType,numPol>::indFC(*iterCellS));
- _split.splitTargetCell(*iterCellS,nbOfNodesS,_tetra);
- for(typename std::vector<SplitterTetra<MyMeshType>*>::const_iterator iter = _tetra.cbegin(); iter != _tetra.cend(); ++iter)
- {
- double volume = std::abs( (*iter)->intersectSourceCell(targetCell) );
- // node #0 is for internal node node #1 is for the node at the middle of the face
- ConnType sourceNode0( (*iter)->getId(2) ), sourceNode1( (*iter)->getId(3) );
- AddContributionInRow(resRow,OTT<ConnType,numPol>::indFC(sourceNode0),volume/2.);
- AddContributionInRow(resRow,OTT<ConnType,numPol>::indFC(sourceNode1),volume/2.);
- }
- }
+ releaseArrays();
+ ConnType nbOfNodesS=this->_src_mesh.getNumberOfNodesOfElement(OTT<ConnType,numPol>::indFC(*iterCellS));
+ _split.splitTargetCell(*iterCellS,nbOfNodesS,_tetra);
+ INTERP_KERNEL::NormalizedCellType srcType = this->_src_mesh.getTypeOfElement( OTT<ConnType,numPol>::indFC(*iterCellS) );
+ if( srcType == NORM_TETRA4 || (srcType == NORM_HEXA8 && sp != GENERAL_24 ))
+ {
+ for(typename std::vector<SplitterTetra<MyMeshType>*>::const_iterator iter = _tetra.cbegin(); iter != _tetra.cend(); ++iter)
+ {
+ (*iter)->splitIntoDualCells(subTetras);
+ double vol2 = 0.;
+ for(int i=0;i<24;i++)
+ {
+ SplitterTetra<MyMeshType> *tmp=subTetras[i];
+ double volume = tmp->intersectSourceCell(targetCell);
+ vol2 += volume;
+ ConnType sourceNode=tmp->getId(0);
+ AddContributionInRow(resRow,OTT<ConnType,numPol>::indFC(sourceNode),volume);
+ delete tmp;
+ }
+ }
+ }
+ else
+ {
+ for(typename std::vector<ConnType>::const_iterator iterCellS=srcCells.begin();iterCellS!=srcCells.end();iterCellS++)
+ {
+ releaseArrays();
+ ConnType nbOfNodesS=Intersector3D<MyMeshType,MyMatrix>::_src_mesh.getNumberOfNodesOfElement(OTT<ConnType,numPol>::indFC(*iterCellS));
+ _split.splitTargetCell(*iterCellS,nbOfNodesS,_tetra);
+ for(typename std::vector<SplitterTetra<MyMeshType>*>::const_iterator iter = _tetra.cbegin(); iter != _tetra.cend(); ++iter)
+ {
+ double volume = std::abs( (*iter)->intersectSourceCell(targetCell) );
+ // node #0 is for internal node node #1 is for the node at the middle of the face
+ ConnType sourceNode0( (*iter)->getId(2) ), sourceNode1( (*iter)->getId(3) );
+ AddContributionInRow(resRow,OTT<ConnType,numPol>::indFC(sourceNode0),volume/2.);
+ AddContributionInRow(resRow,OTT<ConnType,numPol>::indFC(sourceNode1),volume/2.);
+ }
+ }
+ }
}
}
}