-// Copyright (C) 2007-2016 CEA/DEN, EDF R&D
+// Copyright (C) 2007-2021 CEA/DEN, EDF R&D
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
*
*/
template<class MyMeshType, class MyMatrixType>
- int Interpolation2D3D::interpolateMeshes(const MyMeshType& srcMesh,
+ typename MyMeshType::MyConnType Interpolation2D3D::interpolateMeshes(const MyMeshType& srcMesh,
const MyMeshType& targetMesh,
MyMatrixType& matrix,
const std::string& method)
{
typedef typename MyMeshType::MyConnType ConnType;
// create MeshElement objects corresponding to each element of the two meshes
- const unsigned long numSrcElems = srcMesh.getNumberOfElements();
- const unsigned long numTargetElems = targetMesh.getNumberOfElements();
+ const ConnType numSrcElems = srcMesh.getNumberOfElements();
+ const ConnType numTargetElems = targetMesh.getNumberOfElements();
LOG(2, "Source mesh has " << numSrcElems << " elements and target mesh has " << numTargetElems << " elements ");
std::vector<MeshElement<ConnType>*> srcElems(numSrcElems);
std::vector<MeshElement<ConnType>*> targetElems(numTargetElems);
- std::map<MeshElement<ConnType>*, int> indices;
+ std::map<MeshElement<ConnType>*, ConnType> indices;
DuplicateFacesType intersectFaces;
- for(unsigned long i = 0 ; i < numSrcElems ; ++i)
+ for(ConnType i = 0 ; i < numSrcElems ; ++i)
srcElems[i] = new MeshElement<ConnType>(i, srcMesh);
- for(unsigned long i = 0 ; i < numTargetElems ; ++i)
+ for(ConnType i = 0 ; i < numTargetElems ; ++i)
targetElems[i] = new MeshElement<ConnType>(i, targetMesh);
Intersector3D<MyMeshType,MyMatrixType>* intersector=0;
intersectFaces,
getSplittingPolicy());
break;
- case PointLocator:// switch target and source
- intersector=new PointLocator3DIntersectorP0P0<MyMeshType,MyMatrixType>(srcMesh,targetMesh,getPrecision());
- break;
default:
- throw INTERP_KERNEL::Exception("Invalid 3D to 2D intersection type for P0P0 interp specified : must be Triangulation or PointLocator.");
+ throw INTERP_KERNEL::Exception("Invalid 2D to 3D intersection type for P0P0 interp specified : must be Triangulation.");
}
}
else
- throw Exception("Invalid method choosed must be in \"P0P0\".");
+ throw Exception("Invalid method chosen must be in \"P0P0\".");
// create empty maps for all source elements
matrix.resize(intersector->getNumberOfRowsOfResMatrix());
// create BBTree structure
// - get bounding boxes
- double* bboxes = new double[6 * numSrcElems];
- int* srcElemIdx = new int[numSrcElems];
- for(unsigned long i = 0; i < numSrcElems ; ++i)
+ std::vector<double> bboxes(6 * numSrcElems);
+ ConnType* srcElemIdx = new ConnType[numSrcElems];
+ for(ConnType i = 0; i < numSrcElems ; ++i)
{
// get source bboxes in right order
const BoundingBox* box = srcElems[i]->getBoundingBox();
srcElemIdx[i] = srcElems[i]->getIndex();
}
- BBTree<3,ConnType> tree(bboxes, srcElemIdx, 0, numSrcElems, 0.);
+ // [ABN] Adjust 2D bounding box (those might be flat in the cases where the 2D surf are perfectly aligned with the axis)
+ performAdjustmentOfBB(intersector, bboxes);
+
+ BBTree<3,ConnType> tree(bboxes.data(), srcElemIdx, 0, numSrcElems, 0.);
// for each target element, get source elements with which to calculate intersection
// - calculate intersection by calling intersectCells
- for(unsigned long i = 0; i < numTargetElems; ++i)
+ for(ConnType i = 0; i < numTargetElems; ++i)
{
const BoundingBox* box = targetElems[i]->getBoundingBox();
- const int targetIdx = targetElems[i]->getIndex();
+ const ConnType targetIdx = targetElems[i]->getIndex();
// get target bbox in right order
double targetBox[6];
}
- delete [] bboxes;
delete [] srcElemIdx;
DuplicateFacesType::iterator iter;
}
// free allocated memory
- int ret=intersector->getNumberOfColsOfResMatrix();
+ ConnType ret=intersector->getNumberOfColsOfResMatrix();
delete intersector;
- for(unsigned long i = 0 ; i < numSrcElems ; ++i)
+ for(ConnType i = 0 ; i < numSrcElems ; ++i)
{
delete srcElems[i];
}
- for(unsigned long i = 0 ; i < numTargetElems ; ++i)
+ for(ConnType i = 0 ; i < numTargetElems ; ++i)
{
delete targetElems[i];
}