X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FMEDPartitioner%2FMEDPARTITIONER_PTScotchGraph.cxx;h=0ca472e815cc9797e3975d27a712c38b90a40059;hb=662a2a2393a25baef77e42f74204b11b70a9646c;hp=64d21b8989fe30e5b7de6a95971efc953fb9d784;hpb=ffb8188e28b2b60ee207a8644286821bc4e8fcdc;p=tools%2Fmedcoupling.git diff --git a/src/MEDPartitioner/MEDPARTITIONER_PTScotchGraph.cxx b/src/MEDPartitioner/MEDPARTITIONER_PTScotchGraph.cxx index 64d21b898..0ca472e81 100644 --- a/src/MEDPartitioner/MEDPARTITIONER_PTScotchGraph.cxx +++ b/src/MEDPartitioner/MEDPARTITIONER_PTScotchGraph.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2017-2020 CEA/DEN, EDF R&D +// Copyright (C) 2017-2023 CEA, EDF // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -25,6 +25,7 @@ #include "MCType.hxx" #include +#include #include #ifdef MED_ENABLE_PTSCOTCH @@ -54,15 +55,8 @@ void PTSCOTCHGraph::partGraph(int ndomain, const std::string& options_string, Pa //number of graph vertices int n = FromIdType(_graph->getNumberOf()); //graph -#ifdef MEDCOUPLING_USE_64BIT_IDS - std::vector indexVec( _graph->getIndex(), _graph->getIndexArray()->end() ); - std::vector valueVec( _graph->getValues(), _graph->getValuesArray()->end() ); - int * xadj=indexVec.data(); - int * adjncy=valueVec.data(); -#else - int * xadj=const_cast(_graph->getIndex()); - int * adjncy=const_cast(_graph->getValues()); -#endif + mcIdType * xadj=const_cast(_graph->getIndex()); + mcIdType * adjncy=const_cast(_graph->getValues()); //ndomain int nparts=ndomain; @@ -70,10 +64,29 @@ void PTSCOTCHGraph::partGraph(int ndomain, const std::string& options_string, Pa throw INTERP_KERNEL::Exception("PTSCOTCHGraph::partGraph : PTSCOTCH is not available. Check your products, please."); #else //output parameters - int* partition = new int[n+1]; - - int* vlbloctab = _vlbloctab?const_cast(_vlbloctab->begin()):0; + std::unique_ptr partition(new mcIdType[n+1]); +#ifdef MEDCOUPLING_USE_64BIT_IDS + mcIdType *cellWeightPtr(nullptr); + std::vector cellWeightVec; + if(_cell_weight) + { + cellWeightVec.insert(cellWeightVec.end(),_cell_weight,_cell_weight+_graph->getLength()); + cellWeightPtr = cellWeightVec.data(); + } + mcIdType *edgeWeightPtr(nullptr); + std::vector edgeWeightVec; + if(_edge_weight) + { + edgeWeightVec.insert(edgeWeightVec.end(),_edge_weight,_edge_weight+_graph->getLength()); + edgeWeightPtr = edgeWeightVec.data(); + } +#else + mcIdType *cellWeightPtr(_cell_weight); + mcIdType *edgeWeightPtr(_edge_weight); +#endif + mcIdType *vlbloctab = _vlbloctab?const_cast(_vlbloctab->begin()):nullptr; + SCOTCH_randomReset(); SCOTCH_Dgraph scotch_graph; SCOTCH_dgraphInit(&scotch_graph, MPI_COMM_WORLD); @@ -83,13 +96,13 @@ void PTSCOTCHGraph::partGraph(int ndomain, const std::string& options_string, Pa n, // vertlocmax , should be set to vertlocnbr for graphs without holes xadj, // vertloctab[vertnbr+1] , index vertex table 0, // vendloctab , index end vertex table if disjoint, set to zero - _cell_weight, // veloloctab , graph vertices loads, set to zero + cellWeightPtr, // veloloctab , graph vertices loads, set to zero vlbloctab, // vlblocltab , vertex label array : global vertex index xadj[n], // edgelocnbr , number of edges xadj[n], // edgelocsiz , same as edgelocnbr if edgeloctab is compact adjncy, // edgeloctab[edgelocnbr], global indexes of edges 0, // edgegsttab , optional, should be computed internally, set to zero - _edge_weight); // edloloctab , graph edges loads, set to zero + edgeWeightPtr); // edloloctab , graph edges loads, set to zero SCOTCH_Strat scotch_strategy; SCOTCH_stratInit(&scotch_strategy); @@ -101,7 +114,7 @@ void PTSCOTCHGraph::partGraph(int ndomain, const std::string& options_string, Pa if (nparts>1) { if (MyGlobals::_Verbose>10) std::cout << "SCOTCHGraph::graphPart SCOTCH_graphPart" << std::endl; - SCOTCH_dgraphPart(&scotch_graph,nparts,&scotch_strategy,partition); + SCOTCH_dgraphPart(&scotch_graph,nparts,&scotch_strategy,partition.get()); } else //partition for 1 subdomain { @@ -120,7 +133,6 @@ void PTSCOTCHGraph::partGraph(int ndomain, const std::string& options_string, Pa index[i+1]=index[i]+1; value[i]=ToIdType(partition[i]); } - delete [] partition; //creating a skylinearray with no copy of the index and partition array //the fifth argument true specifies that only the pointers are passed