-// Copyright (C) 2007-2008 CEA/DEN, EDF R&D
+// Copyright (C) 2007-2019 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
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
-// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
+
#include <mpi.h>
#include "CommInterface.hxx"
#include "Topology.hxx"
using namespace std;
-namespace ParaMEDMEM
+namespace MEDCoupling
{
- ExplicitCoincidentDEC::ExplicitCoincidentDEC():_toposource(0),_topotarget(0)
+ /*!
+ \anchor ExplicitCoincidentDEC-det
+ \class ExplicitCoincidentDEC
+
+
+ This class aims at \ref interpolation "remapping fields" that have identical
+ supports (=the same underlying mesh) but different parallel topologies
+ (=different sub-domains in the mesh). It can be used to couple
+ together multi-physics codes that operate on the same domain
+ with different partitioning.
+
+ It is very similar to what the \ref StructuredCoincidentDEC-det "StructuredCoincidentDEC"
+ does, except that it works with an arbitrary user-defined topology.
+
+ The remapping between the two supports is based on identity of global
+ ids, instead of geometrical considerations (as it is the case for
+ \ref InterpKernelDEC-det "InterpKernelDEC").
+ Therefore, beware that this \ref para-dec "DEC" can not be used
+ for coincident meshes if they do *not* have the exact same numbering.
+
+ With this \ref para-dec "DEC" no projection, and no interpolation of the field data is done, contrary
+ to what happens in \ref InterpKernelDEC-det "InterpKernelDEC". It is just
+ a matter of allocating the values from one side to the other, using directly the cell
+ identifiers.
+
+ As all the other DECs, its usage requires two phases :
+ - a setup phase during which the topologies are exchanged so that
+ the target side knows from which processors it should expect
+ the data.
+ - a send/recv phase during which the field data is actually transferred.
+
+ This example illustrates the sending of a field with
+ the \c ExplicitCoincidentDEC :
+ \code
+ ...
+ ExplicitCoincidentDEC dec(groupA, groupB);
+ dec.attachLocalField(field);
+ dec.synchronize();
+ if (groupA.containsMyRank())
+ dec.recvData();
+ else if (groupB.containsMyRank())
+ dec.sendData();
+ ...
+ \endcode
+
+ Creating a ParaFIELD to be attached to the %DEC is done in exactly the same way as for
+ the other DECs, if only the partitioning of the support mesh differs.
+ In the case where the
+ fields have also different *component* topologies, creating the ParaFIELD
+ requires some more effort. See the \ref para-over "parallelism" section for more details.
+ */
+
+
+ /*! Constructor
+ */
+ ExplicitCoincidentDEC::ExplicitCoincidentDEC():
+ _toposource(0),_topotarget(0),
+ _targetgroup(0), _sourcegroup(0),
+ _sendcounts(0), _recvcounts(0),
+ _senddispls(0), _recvdispls(0),
+ _recvbuffer(0), _sendbuffer(0),
+ _distant_elems(), _explicit_mapping()
{
}
/*!
- * Synchronizing a topology so that all the
- * group possesses it.
+ * Synchronizing a topology so that all the groups get it.
*
* \param toposend Topology that is transmitted. It is read on processes where it already exists, and it is created and filled on others.
* \param toporecv Topology which is received.
}
else
{
- vector <int> size (group->size());
+ vector <int> size2(group->size());
int myworldrank=group->myRank();
for (int iproc=0; iproc<group->size();iproc++)
{
int sendlocal=topotemp->globalToLocal(global);
if (sendlocal!=-1)
{
- size[iproc]++;
+ size2[iproc]++;
_explicit_mapping.pushBackElem(make_pair(iproc,sendlocal));
}
}
}
int* recvcounts=new int[world_size];
int* recvdispls=new int[world_size];
- int *dummyrecv;
+ int *dummyrecv=0;
for (int i=0; i <world_size; i++)
{
recvcounts[i]=0;
recvdispls[i]=recvdispls[i-1]+recvcounts[i-1];
}
- int *dummysend;
+ int *dummysend=0;
for (int i=0; i <world_size; i++)
{
sendcounts[i]=0;
value[ielem*ncomp+icomp]=_recvbuffer[counters[iproc]*ncomp+icomp];
counters[iproc]++;
}
- _local_field->getField()->getArray()->useArray(value,true,CPP_DEALLOC,nb_local,_topotarget->getNbComponents());
+ _local_field->getField()->getArray()->useArray(value,true,DeallocType::CPP_DEALLOC,nb_local,_topotarget->getNbComponents());
}
void ExplicitCoincidentDEC::sendData()