X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FParaMEDMEM%2FOverlapInterpolationMatrix.cxx;h=00b64df0c7b5262ccae49e84d749516ef917e16f;hb=b832b15337be013a56e0976170e5e235b89fcb03;hp=52f89e47ebbaf68bd97c78eee080d2590e811104;hpb=93aa2b4d6b1873e76a0226143dcc7f7a577489bf;p=tools%2Fmedcoupling.git diff --git a/src/ParaMEDMEM/OverlapInterpolationMatrix.cxx b/src/ParaMEDMEM/OverlapInterpolationMatrix.cxx index 52f89e47e..00b64df0c 100644 --- a/src/ParaMEDMEM/OverlapInterpolationMatrix.cxx +++ b/src/ParaMEDMEM/OverlapInterpolationMatrix.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// Copyright (C) 2007-2024 CEA, EDF // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -29,9 +29,10 @@ #include "Interpolation2D.txx" #include "Interpolation3DSurf.hxx" #include "Interpolation3D.txx" -#include "Interpolation3D2D.txx" +#include "Interpolation2D3D.txx" #include "Interpolation2D1D.txx" #include "MEDCouplingUMesh.hxx" +#include "MEDCouplingFieldDouble.hxx" #include "MEDCouplingNormalizedUnstructuredMesh.txx" #include "InterpolationOptions.hxx" #include "NormalizedUnstructuredMesh.hxx" @@ -42,7 +43,7 @@ using namespace std; -namespace ParaMEDMEM +namespace MEDCoupling { OverlapInterpolationMatrix::OverlapInterpolationMatrix(ParaFIELD *source_field, ParaFIELD *target_field, @@ -56,17 +57,16 @@ namespace ParaMEDMEM _target_field(target_field), _source_support(source_field->getSupport()->getCellMesh()), _target_support(target_field->getSupport()->getCellMesh()), - _mapping(group, locator), - _group(group) + _mapping(group, locator) { } - void OverlapInterpolationMatrix::keepTracksOfSourceIds(int procId, DataArrayInt *ids) + void OverlapInterpolationMatrix::keepTracksOfSourceIds(int procId, DataArrayIdType *ids) { _mapping.keepTracksOfSourceIds(procId,ids); } - void OverlapInterpolationMatrix::keepTracksOfTargetIds(int procId, DataArrayInt *ids) + void OverlapInterpolationMatrix::keepTracksOfTargetIds(int procId, DataArrayIdType *ids) { _mapping.keepTracksOfTargetIds(procId,ids); } @@ -77,19 +77,21 @@ namespace ParaMEDMEM // TODO? Merge with MEDCouplingRemapper::prepareInterpKernelOnlyUU() ? /**! + * Local run (on this proc) of the sequential interpolation algorithm. + * * @param srcIds is null if the source mesh is on the local proc * @param trgIds is null if the source mesh is on the local proc * * One of the 2 is necessarily null (the two can be null together) */ - void OverlapInterpolationMatrix::addContribution(const MEDCouplingPointSet *src, const DataArrayInt *srcIds, const std::string& srcMeth, int srcProcId, - const MEDCouplingPointSet *trg, const DataArrayInt *trgIds, const std::string& trgMeth, int trgProcId) + void OverlapInterpolationMatrix::computeLocalIntersection(const MEDCouplingPointSet *src, const DataArrayIdType *srcIds, const std::string& srcMeth, int srcProcId, + const MEDCouplingPointSet *trg, const DataArrayIdType *trgIds, const std::string& trgMeth, int trgProcId) { std::string interpMethod(srcMeth); interpMethod+=trgMeth; //creating the interpolator structure vector sparse_matrix_part; - int colSize=0; + mcIdType colSize=0; //computation of the intersection volumes between source and target elements const MEDCouplingUMesh *trgC=dynamic_cast(trg); const MEDCouplingUMesh *srcC=dynamic_cast(src); @@ -145,7 +147,7 @@ namespace ParaMEDMEM MEDCouplingNormalizedUnstructuredMesh<3,3> target_wrapper(trgC); MEDCouplingNormalizedUnstructuredMesh<3,3> source_wrapper(srcC); - INTERP_KERNEL::Interpolation3D2D interpolator (*this); + INTERP_KERNEL::Interpolation2D3D interpolator (*this); colSize=interpolator.interpolateMeshes(source_wrapper,target_wrapper,sparse_matrix_part,interpMethod); } else if ( src->getMeshDimension() == 3 && trg->getMeshDimension() == 2 @@ -154,11 +156,11 @@ namespace ParaMEDMEM MEDCouplingNormalizedUnstructuredMesh<3,3> target_wrapper(trgC); MEDCouplingNormalizedUnstructuredMesh<3,3> source_wrapper(srcC); - INTERP_KERNEL::Interpolation3D2D interpolator (*this); + INTERP_KERNEL::Interpolation2D3D interpolator (*this); vector matrixTranspose; colSize=interpolator.interpolateMeshes(target_wrapper,source_wrapper,sparse_matrix_part,interpMethod);//not a bug target in source. TransposeMatrix(matrixTranspose,colSize,sparse_matrix_part); - colSize=matrixTranspose.size(); + colSize=ToIdType(matrixTranspose.size()); } else if ( src->getMeshDimension() == 1 && trg->getMeshDimension() == 2 && trg->getSpaceDimension() == 2 && src->getSpaceDimension() == 2 ) @@ -179,7 +181,7 @@ namespace ParaMEDMEM vector matrixTranspose; colSize=interpolator.interpolateMeshes(target_wrapper,source_wrapper,matrixTranspose,interpMethod);//not a bug target in source. TransposeMatrix(matrixTranspose,colSize,sparse_matrix_part); - colSize=matrixTranspose.size(); + colSize=ToIdType(matrixTranspose.size()); } else if (trg->getMeshDimension() != _source_support->getMeshDimension()) { @@ -241,7 +243,6 @@ namespace ParaMEDMEM _mapping.addContributionST(sparse_matrix_part,srcIds,srcProcId,trgIds,trgProcId); } - /*! * 'procsToSendField' gives the list of procs field data has to be sent to. * See OverlapElementLocator::computeBoundingBoxesAndTodoList() @@ -254,12 +255,29 @@ namespace ParaMEDMEM _mapping.prepare(procsToSendField,0); } - void OverlapInterpolationMatrix::computeDeno() + void OverlapInterpolationMatrix::computeSurfacesAndDeno() { - if(_target_field->getField()->getNature()==ConservativeVolumic) + if(_target_field->getField()->getNature()==IntensiveMaximum) _mapping.computeDenoConservativeVolumic(_target_field->getField()->getNumberOfTuplesExpected()); else - throw INTERP_KERNEL::Exception("Policy Not implemented yet : only ConservativeVolumic defined !"); + throw INTERP_KERNEL::Exception("OverlapDEC: Policy not set (did you call setNature()?) or not implemented yet: only IntensiveMaximum!"); +// { +// if(_target_field->getField()->getNature()==IntensiveConservation) +// { +// MCAuto f; +// int orient = getOrientation(); // From InterpolationOptions inheritance +// if(orient == 2) // absolute areas +// f = _target_support->getMeasureField(true); +// else +// if(orient == 0) // relative areas +// f = _target_support->getMeasureField(false); +// else +// throw INTERP_KERNEL::Exception("OverlapDEC: orientation policy not impl. yet!"); +// _mapping.computeDenoRevIntegral(*f->getArray()); +// } +// else +// throw INTERP_KERNEL::Exception("OverlapDEC: Policy not implemented yet: only IntensiveMaximum and IntensiveConservation defined!"); +// } } void OverlapInterpolationMatrix::multiply(double default_val) @@ -272,13 +290,8 @@ namespace ParaMEDMEM _mapping.transposeMultiply(_target_field->getField(),_source_field->getField()); } -// bool OverlapInterpolationMatrix::isSurfaceComputationNeeded(const std::string& method) const -// { -// return method=="P0"; -// } - void OverlapInterpolationMatrix::TransposeMatrix(const std::vector& matIn, - int nbColsMatIn, std::vector& matOut) + mcIdType nbColsMatIn, std::vector& matOut) { matOut.resize(nbColsMatIn); int id=0;