Salome HOME
Updated copyright comment
[tools/medcoupling.git] / src / ParaMEDMEM / OverlapInterpolationMatrix.cxx
index 52f89e47ebbaf68bd97c78eee080d2590e811104..00b64df0c7b5262ccae49e84d749516ef917e16f 100644 (file)
@@ -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
 #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<SparseDoubleVec > sparse_matrix_part;
-    int colSize=0;
+    mcIdType colSize=0;
     //computation of the intersection volumes between source and target elements
     const MEDCouplingUMesh *trgC=dynamic_cast<const MEDCouplingUMesh *>(trg);
     const MEDCouplingUMesh *srcC=dynamic_cast<const MEDCouplingUMesh *>(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<SparseDoubleVec > 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<SparseDoubleVec > 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<MEDCouplingFieldDouble> 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<SparseDoubleVec >& matIn,
-                                                   int nbColsMatIn, std::vector<SparseDoubleVec >& matOut)
+                                                   mcIdType nbColsMatIn, std::vector<SparseDoubleVec >& matOut)
   {
     matOut.resize(nbColsMatIn);
     int id=0;