From: Anthony Geay Date: Wed, 16 Aug 2023 09:45:38 +0000 (+0200) Subject: [EDF27375] : implementation of retrieveNonFetchedIds X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=49f2d7933eabc4b2f00ae5c3bf8183fed8f0cc02;p=tools%2Fmedcoupling.git [EDF27375] : implementation of retrieveNonFetchedIds --- diff --git a/src/ParaMEDMEM/InterpKernelDEC.cxx b/src/ParaMEDMEM/InterpKernelDEC.cxx index 8ed6b1301..18cf01e7c 100644 --- a/src/ParaMEDMEM/InterpKernelDEC.cxx +++ b/src/ParaMEDMEM/InterpKernelDEC.cxx @@ -190,6 +190,29 @@ namespace MEDCoupling } } + MCAuto InterpKernelDEC::retrieveNonFetchedIds() const + { + if( _source_group->containsMyRank() ) + { + return this->retrieveNonFetchedIdsSource(); + } + if( _target_group->containsMyRank() ) + { + return this->retrieveNonFetchedIdsTarget(); + } + THROW_IK_EXCEPTION("Not detected side of rank !"); + } + + MCAuto InterpKernelDEC::retrieveNonFetchedIdsSource() const + { + return _interpolation_matrix->retrieveNonFetchedIdsSource(); + } + + MCAuto InterpKernelDEC::retrieveNonFetchedIdsTarget() const + { + mcIdType nbTuples = _local_field->getField()->getNumberOfTuplesExpected(); + return _interpolation_matrix->retrieveNonFetchedIdsTarget(nbTuples); + } /*! Receives the data at time \a time in asynchronous mode. The value of the field diff --git a/src/ParaMEDMEM/InterpKernelDEC.hxx b/src/ParaMEDMEM/InterpKernelDEC.hxx index 52891b8b9..eaa87526e 100644 --- a/src/ParaMEDMEM/InterpKernelDEC.hxx +++ b/src/ParaMEDMEM/InterpKernelDEC.hxx @@ -136,12 +136,16 @@ namespace MEDCoupling void synchronize(); void synchronizeWithDefaultValue(double val); + MCAuto retrieveNonFetchedIds() const; void recvData(); void recvData(double time); void sendData(); void sendData(double time , double deltatime); void prepareSourceDE() { } void prepareTargetDE() { } + private: + MCAuto retrieveNonFetchedIdsSource() const; + MCAuto retrieveNonFetchedIdsTarget() const; private: InterpolationMatrix* _interpolation_matrix; }; diff --git a/src/ParaMEDMEM/InterpolationMatrix.cxx b/src/ParaMEDMEM/InterpolationMatrix.cxx index 7bf59e2ec..daee514fc 100644 --- a/src/ParaMEDMEM/InterpolationMatrix.cxx +++ b/src/ParaMEDMEM/InterpolationMatrix.cxx @@ -849,7 +849,10 @@ namespace MEDCoupling _mapping.prepareSendRecv(); } - + MCAuto InterpolationMatrix::retrieveNonFetchedIdsTarget(mcIdType nbTuples) const + { + return _mapping.retrieveNonFetchedIdsTarget(nbTuples); + } /*! \brief performs t=Ws, where t is the target field, s is the source field @@ -866,7 +869,6 @@ namespace MEDCoupling { mcIdType nbcomp = ToIdType(field.getArray()->getNumberOfComponents()); vector target_value(_col_offsets.size()* nbcomp,0.0); - //computing the matrix multiply on source side if (_source_group.containsMyRank()) { @@ -899,6 +901,36 @@ namespace MEDCoupling //on source side : sending T=VT^(-1).(W.S) //on target side :: receiving T and storing it in field _mapping.sendRecv(target_value.data(),field,this->_presence_dft_value,this->_dft_value); + + if( _target_group.containsMyRank() ) + { + if( this->_presence_dft_value ) + { + const MCAuto nonFetchedEntities = _mapping.retrieveNonFetchedIdsTarget(field.getArray()->getNumberOfTuples()); + double *fieldPtr( field.getArray()->getPointerSilent() ); + for( const mcIdType *eltId = nonFetchedEntities->begin() ; eltId != nonFetchedEntities->end() ; ++eltId) + std::fill( fieldPtr + (*eltId)*nbcomp, fieldPtr + ((*eltId)+1)*nbcomp, this->_dft_value ); + } + } + } + + MCAuto InterpolationMatrix::retrieveNonFetchedIdsSource() const + { + MCAuto ret(DataArrayIdType::New()); ret->alloc(0,1); + if (_source_group.containsMyRank()) + { + mcIdType nbrows = ToIdType( _coeffs.size() ); + for (mcIdType irow = 0; irow < nbrows; irow++) + { + if( _row_offsets[irow+1] == _row_offsets[irow] ) + { + ret->pushBackSilent( irow ); + } + } + } + else + THROW_IK_EXCEPTION("InterpolationMatrix::retrieveNonFetchedIdsSource : not supposed to be called target side !"); + return ret; } diff --git a/src/ParaMEDMEM/InterpolationMatrix.hxx b/src/ParaMEDMEM/InterpolationMatrix.hxx index 7e4f7a989..a25cbe7c9 100644 --- a/src/ParaMEDMEM/InterpolationMatrix.hxx +++ b/src/ParaMEDMEM/InterpolationMatrix.hxx @@ -54,7 +54,9 @@ namespace MEDCoupling const mcIdType* distant_elems, const std::string& srcMeth, const std::string& targetMeth); void finishContributionW(ElementLocator& elementLocator); void finishContributionL(ElementLocator& elementLocator); + MCAuto retrieveNonFetchedIdsTarget(mcIdType nbTuples) const; void multiply(MEDCouplingFieldDouble& field) const; + MCAuto retrieveNonFetchedIdsSource() const; void transposeMultiply(MEDCouplingFieldDouble& field)const; void prepare(); mcIdType getNbRows() const { return ToIdType(_row_offsets.size()); } diff --git a/src/ParaMEDMEM/MxN_Mapping.cxx b/src/ParaMEDMEM/MxN_Mapping.cxx index fca6395a9..c0e922234 100644 --- a/src/ParaMEDMEM/MxN_Mapping.cxx +++ b/src/ParaMEDMEM/MxN_Mapping.cxx @@ -134,6 +134,23 @@ namespace MEDCoupling delete[] recvdispls; } + MCAuto MxN_Mapping::retrieveNonFetchedIdsTarget(mcIdType nbTuples) const + { + MCAuto ret(DataArrayIdType::New()); ret->alloc(0,1); + std::vector hitMachine(nbTuples,false); + for (int i=0; i< _recv_proc_offsets[_union_group->size()]; i++) + { + mcIdType recvId(_recv_ids[i]); + hitMachine[recvId] = true; + } + for( mcIdType ituple = 0 ; ituple < nbTuples ; ++ituple ) + { + if( ! hitMachine[ituple] ) + ret->pushBackSilent( ituple ); + } + return ret; + } + /*! Exchanging field data between two groups of processes * * \param field MEDCoupling field containing the values to be sent @@ -209,15 +226,6 @@ namespace MEDCoupling recvptr++; } } - if( isDftValue ) - { - double *fieldPtr( fieldArr->getPointerSilent() ); - for( mcIdType ituple = 0 ; ituple < nbTuples ; ++ituple ) - { - if( ! hitMachine[ituple] ) - std::fill( fieldPtr + ituple*nbcomp, fieldPtr + (ituple+1)*nbcomp, dftValue); - } - } if (sendbuf!=0 && getAllToAllMethod()== Native) delete[] sendbuf; if (recvbuf !=0) diff --git a/src/ParaMEDMEM/MxN_Mapping.hxx b/src/ParaMEDMEM/MxN_Mapping.hxx index 2c958e709..8b44b7d75 100644 --- a/src/ParaMEDMEM/MxN_Mapping.hxx +++ b/src/ParaMEDMEM/MxN_Mapping.hxx @@ -45,6 +45,7 @@ namespace MEDCoupling void addElementFromSource(int distant_proc, mcIdType distant_elem); void prepareSendRecv(); void sendRecv(MEDCouplingFieldDouble& field); + MCAuto retrieveNonFetchedIdsTarget(mcIdType nbTuples) const; void sendRecv(double* sendfield, MEDCouplingFieldDouble& field, bool isDftValue, double dftValue) const ; void reverseSendRecv(double* recvfield, MEDCouplingFieldDouble& field) const ; diff --git a/src/ParaMEDMEM_Swig/ParaMEDMEMCommon.i b/src/ParaMEDMEM_Swig/ParaMEDMEMCommon.i index 5c65a95f4..624ffadd8 100644 --- a/src/ParaMEDMEM_Swig/ParaMEDMEMCommon.i +++ b/src/ParaMEDMEM_Swig/ParaMEDMEMCommon.i @@ -75,6 +75,7 @@ using namespace ICoCo; %newobject MEDCoupling::InterpKernelDEC::_NewWithPG_internal; %newobject MEDCoupling::InterpKernelDEC::_NewWithComm_internal; +%newobject MEDCoupling::InterpKernelDEC::retrieveNonFetchedIds; %newobject MEDCoupling::OverlapDEC::_NewWithComm_internal; %feature("unref") ParaSkyLineArray "$this->decrRef();" @@ -323,6 +324,12 @@ namespace MEDCoupling { return new InterpKernelDEC(src_ids,trg_ids, *(MPI_Comm*)another_comm); // I know, ugly cast ... } + + DataArrayIdType *retrieveNonFetchedIds() const + { + MCAuto ret = self->retrieveNonFetchedIds(); + return ret.retn(); + } } }; diff --git a/src/ParaMEDMEM_Swig/test_InterpKernelDEC.py b/src/ParaMEDMEM_Swig/test_InterpKernelDEC.py index 7be4f19da..4b5b289d7 100755 --- a/src/ParaMEDMEM_Swig/test_InterpKernelDEC.py +++ b/src/ParaMEDMEM_Swig/test_InterpKernelDEC.py @@ -289,8 +289,10 @@ class ParaMEDMEM_IK_DEC_Tests(unittest.TestCase): dec.recvData() if rank == 0: self.assertTrue(field.getArray().isEqual(DataArrayDouble([0.6,0.6,-2000]),1e-12)) + self.assertTrue( dec.retrieveNonFetchedIds().isEqual(DataArrayInt([2])) ) if rank == 1: self.assertTrue(field.getArray().isEqual(DataArrayDouble([1.0,-2000]),1e-12)) + self.assertTrue( dec.retrieveNonFetchedIds().isEqual(DataArrayInt([1])) ) else: mesh = eval("Target_Proc_{}".format(rank))() nb_local=mesh.getNumberOfCells() @@ -307,10 +309,12 @@ class ParaMEDMEM_IK_DEC_Tests(unittest.TestCase): # IntensiveMaximum => [[(0,S0,1/2.5),(1,S0,1.5/2.5)] # self.assertTrue(field.getArray().isEqual(DataArrayDouble([0.6]),1e-12)) + self.assertTrue( dec.retrieveNonFetchedIds().isEqual(DataArrayInt([])) ) if rank == 3: # matrix S1 / T3 = [[],[(0,S1,1.0)],[(0,S1,2.0)],[]] # IntensiveMaximum => [[],[(0,S1,1.0/1.0)],[(0,S1,2.0/2.0)],[]] self.assertTrue(field.getArray().isEqual(DataArrayDouble([-1000.0, 1.0, 1.0, -1000.0]),1e-8)) + self.assertTrue( dec.retrieveNonFetchedIds().isEqual(DataArrayInt([0,3])) ) # target -> source dec.sendData()