X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FParaMEDMEM%2FOverlapInterpolationMatrix.hxx;h=d652ad0244dcbc92cc48be7b542717b1ec0e3f22;hb=0b187729ac99d3e9e9bb9d2be8cb8600a783be6c;hp=f675d35cd36f1c1e8ced91571a3352a9fdd17154;hpb=fb512e2b77325290aaa2b4c9fd8f22d5949b6369;p=tools%2Fmedcoupling.git diff --git a/src/ParaMEDMEM/OverlapInterpolationMatrix.hxx b/src/ParaMEDMEM/OverlapInterpolationMatrix.hxx index f675d35cd..d652ad024 100644 --- a/src/ParaMEDMEM/OverlapInterpolationMatrix.hxx +++ b/src/ParaMEDMEM/OverlapInterpolationMatrix.hxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2014 CEA/DEN, EDF R&D +// Copyright (C) 2007-2015 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 @@ -31,6 +31,11 @@ namespace ParaMEDMEM class ParaFIELD; class MEDCouplingPointSet; + /*! + * Internal class, not part of the public API. + * + * Similar to InterpolationMatrix, but for the OverlapDEC instead of the InterpKernelDEC. + */ class OverlapInterpolationMatrix : public INTERP_KERNEL::InterpolationOptions, public DECOptions { @@ -40,86 +45,37 @@ namespace ParaMEDMEM ParaFIELD *target_field, const ProcessorGroup& group, const DECOptions& dec_opt, - const InterpolationOptions& i_opt); + const InterpolationOptions& i_opt, + const OverlapElementLocator & loc); void keepTracksOfSourceIds(int procId, DataArrayInt *ids); void keepTracksOfTargetIds(int procId, DataArrayInt *ids); - void addContribution(const MEDCouplingPointSet *src, const DataArrayInt *srcIds, const std::string& srcMeth, int srcProcId, + void computeLocalIntersection(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 prepare(const std::vector< std::vector >& procsInInteraction); + void prepare(const std::vector< int > & procsToSendField); - void computeDeno(); + void computeSurfacesAndDeno(); - void multiply(); + void multiply(double default_val); void transposeMultiply(); virtual ~OverlapInterpolationMatrix(); -#if 0 - void addContribution(MEDCouplingPointSet& distant_support, int iproc_distant, - const int* distant_elems, const std::string& srcMeth, const std::string& targetMeth); - void finishContributionW(ElementLocator& elementLocator); - void finishContributionL(ElementLocator& elementLocator); - void multiply(MEDCouplingFieldDouble& field) const; - void transposeMultiply(MEDCouplingFieldDouble& field)const; - void prepare(); - int getNbRows() const { return _row_offsets.size(); } - MPIAccessDEC* getAccessDEC() { return _mapping.getAccessDEC(); } private: - void computeConservVolDenoW(ElementLocator& elementLocator); - void computeIntegralDenoW(ElementLocator& elementLocator); - void computeRevIntegralDenoW(ElementLocator& elementLocator); - void computeGlobConstraintDenoW(ElementLocator& elementLocator); - void computeConservVolDenoL(ElementLocator& elementLocator); - void computeIntegralDenoL(ElementLocator& elementLocator); - void computeRevIntegralDenoL(ElementLocator& elementLocator); - - void computeLocalColSum(std::vector& res) const; - void computeLocalRowSum(const std::vector& distantProcs, std::vector >& resPerProcI, - std::vector >& resPerProcD) const; - void computeGlobalRowSum(ElementLocator& elementLocator, std::vector >& denoStrorage, std::vector >& denoStrorageInv); - void computeGlobalColSum(std::vector >& denoStrorage); - void resizeGlobalColSum(std::vector >& denoStrorage); - void fillDSFromVM(int iproc_distant, const int* distant_elems, const std::vector< std::map >& values, MEDCouplingFieldDouble *surf); - void serializeMe(std::vector< std::vector< std::map > >& data1, std::vector& data2) const; - void initialize(); - void findAdditionnalElements(ElementLocator& elementLocator, std::vector >& elementsToAdd, - const std::vector >& resPerProcI, const std::vector >& globalIdsPartial); - void addGhostElements(const std::vector& distantProcs, const std::vector >& elementsToAdd); - int mergePolicies(const std::vector& policyPartial); - void mergeRowSum(const std::vector< std::vector >& rowsPartialSumD, const std::vector< std::vector >& globalIdsPartial, - std::vector& globalIdsLazySideInteraction, std::vector& sumCorresponding); - void mergeRowSum2(const std::vector< std::vector >& globalIdsPartial, std::vector< std::vector >& rowsPartialSumD, - const std::vector& globalIdsLazySideInteraction, const std::vector& sumCorresponding); - void mergeRowSum3(const std::vector< std::vector >& globalIdsPartial, std::vector< std::vector >& rowsPartialSumD); - void mergeCoeffs(const std::vector& procsInInteraction, const std::vector< std::vector >& rowsPartialSumI, - const std::vector >& globalIdsPartial, std::vector >& denoStrorageInv); - void divideByGlobalRowSum(const std::vector& distantProcs, const std::vector >& resPerProcI, - const std::vector >& resPerProcD, std::vector >& deno); -#endif - private: - bool isSurfaceComputationNeeded(const std::string& method) const; - void fillDistributedMatrix(const std::vector< std::map >& res, - const DataArrayInt *srcIds, int srcProc, - const DataArrayInt *trgIds, int trgProc); - static void TransposeMatrix(const std::vector >& matIn, int nbColsMatIn, std::vector >& matOut); + + static void TransposeMatrix(const std::vector& matIn, int nbColsMatIn, + std::vector& matOut); private: - ParaMEDMEM::ParaFIELD *_source_field; - ParaMEDMEM::ParaFIELD *_target_field; - std::vector _row_offsets; - std::map, int > _col_offsets; + ParaFIELD *_source_field; + ParaFIELD *_target_field; MEDCouplingPointSet *_source_support; MEDCouplingPointSet *_target_support; - OverlapMapping _mapping; + OverlapMapping _mapping; const ProcessorGroup& _group; - std::vector< std::vector > _target_volume; - std::vector > > _coeffs; - std::vector > _deno_multiply; - std::vector > _deno_reverse_multiply; }; }