Ignore:
Timestamp:
12/07/21 12:00:23 (3 years ago)
Author:
ymipsl
Message:
  • Solve memory leak from remapper.
  • shared_ptr add add for manage nodes.

YM

File:
1 edited

Legend:

Unmodified
Added
Removed
  • XIOS/dev/dev_ym/XIOS_COUPLING/extern/remap/src/parallel_tree.cpp

    r1639 r2269  
    1818 
    1919// only the circle is packed, rest of node will be initialized on unpacking 
    20 static void packNode(Node& node, char *buffer, int& index) 
     20static void packNode(NodePtr node, char *buffer, int& index) 
    2121{ 
    2222        if (buffer == NULL) // compute size only 
     
    2424        else 
    2525        { 
    26                 *(Coord *)(&buffer[index]) = node.centre; 
     26                *(Coord *)(&buffer[index]) = node->centre; 
    2727                index += sizeof(Coord); 
    2828 
    29                 *(double *)(&buffer[index]) = node.radius; 
     29                *(double *)(&buffer[index]) = node->radius; 
    3030                index += sizeof(double); 
    3131        } 
    3232} 
    3333 
    34 static void unpackNode(Node& node, char *buffer, int& index) 
     34static void unpackNode(NodePtr node, char *buffer, int& index) 
    3535{ 
    3636        Coord centre; 
     
    4343        index += sizeof(double); 
    4444 
    45         node.centre = centre; 
    46         node.radius = r; 
     45        node->centre = centre; 
     46        node->radius = r; 
    4747} 
    4848 
     
    9595} 
    9696 
    97 static void transferRoutedNodes(CMPIRouting& MPIRoute, /*const*/ vector<Node>& nodeSend, const vector<int>& route, vector<Node>& nodeRecv) 
     97static void transferRoutedNodes(CMPIRouting& MPIRoute, /*const*/ vector<NodePtr>& nodeSend, const vector<int>& route, vector<NodePtr>& nodeRecv) 
    9898{ 
    9999        /* `route` knows what goes where */ 
     
    104104} 
    105105 
    106 static void transferRoutedIntersections(CMPIRouting& MPIRoute, const vector<Node>& nodeSend, const vector<vector<int> >& route, vector<Node>& nodeRecv) 
     106static void transferRoutedIntersections(CMPIRouting& MPIRoute, const vector<NodePtr>& nodeSend, const vector<vector<int> >& route, vector<NodePtr>& nodeRecv) 
    107107{ 
    108108        // `route` knows what goes where 
     
    110110        int nRecv = MPIRoute.getTotalSourceElement(); 
    111111        nodeRecv.resize(nRecv); 
    112         MPIRoute.transferToTarget((Node * /*mpi wants non-const*/) &nodeSend[0], &nodeRecv[0], packNode, unpackNode); 
     112        MPIRoute.transferToTarget((NodePtr*) &nodeSend[0], &nodeRecv[0], packNode, unpackNode); 
    113113//cout << MPIRoute.mpiRank << " ROUTE " << nRecv << ": " << nodeSend.size() << " " << nodeRecv.size() << "    "; 
    114114} 
     
    122122} 
    123123 
    124 void CParallelTree::buildSampleTreeCascade(vector<Node>& sampleNodes /*route field will be modified*/, int level) 
     124void CParallelTree::buildSampleTreeCascade(vector<NodePtr>& sampleNodes /*route field will be modified*/, int level) 
    125125{ 
    126126        buildSampleTree(treeCascade[level], sampleNodes, cascade.level[level]); 
     
    132132                treeCascade[level].routeNodes(route, sampleNodes, assignLevel); 
    133133 
    134                 vector<Node> routedNodes; 
     134                vector<NodePtr> routedNodes; 
    135135                CMPIRouting mpiRoute(cascade.level[level].pg_comm); 
    136136                transferRoutedNodes(mpiRoute, sampleNodes, route, routedNodes); 
     
    139139} 
    140140 
    141 void buildSampleTree(CSampleTree& tree, const vector<Node>& node, const CCascadeLevel& comm) 
     141void buildSampleTree(CSampleTree& tree, const vector<NodePtr>& node, const CCascadeLevel& comm) 
    142142/* 
    143143        In the beginning all the sample elements are distributed 
     
    175175        for (int i = 0; i < nsend; i++) 
    176176        { 
    177                 const Node& no = node[randomArray[i]]; 
     177                const Node& no = *node[randomArray[i]]; 
    178178                *((Coord *) (sendBuffer + index)) = no.centre; 
    179179                index += sizeof(Coord)/sizeof(*sendBuffer); 
     
    210210        randomizeArray(randomArray); 
    211211        tree.leafs.resize(blocSize); 
     212        for(auto& it : tree.leafs) it=make_shared<Node>() ; 
     213 
    212214        index = 0; 
    213215   
     
    220222                double radius = recvBuffer[index%s]; 
    221223    index++ ; 
    222                 tree.leafs[randomArray[i]].centre = x; 
    223                 tree.leafs[randomArray[i]].radius = radius; 
     224                tree.leafs[randomArray[i]]->centre = x; 
     225                tree.leafs[randomArray[i]]->radius = radius; 
    224226 
    225227        } 
     
    233235        CTimer::get("buildSampleTree(local)").suspend(); 
    234236        CTimer::get("buildSampleTree(local)").print(); 
    235  
    236237        /* End gracefully if sample tree could not be constructed with desired number of nodes on assignLevel */ 
    237238        int allok, ok = (tree.levelSize[assignLevel] == comm.group_size); 
     
    262263 
    263264 
    264 void CParallelTree::buildLocalTree(const vector<Node>& node, const vector<int>& route) 
     265void CParallelTree::buildLocalTree(const vector<NodePtr>& node, const vector<int>& route) 
    265266{ 
    266267        CMPIRouting MPIRoute(communicator); 
     
    276277        vector<Elt*> ptElement(node.size()); 
    277278        for (int i = 0; i < node.size(); i++) 
    278                 ptElement[i] = (Elt *) (node[i].data); 
     279                ptElement[i] = (Elt *) (node[i]->data); 
    279280 
    280281        vector<Elt*> ptLocalElement(nbLocalElements); 
     
    297298                elt.id.ind = i; 
    298299                elt.id.rank = mpiRank; 
    299                 localTree.leafs.push_back(Node(elt.x, cptRadius(elt), &localElements[i])); 
     300                localTree.leafs.push_back(make_shared<Node>(elt.x, cptRadius(elt), &localElements[i])); 
    300301        } 
    301302        localTree.build(localTree.leafs); 
     
    306307} 
    307308 
    308 void CParallelTree::build(vector<Node>& node, vector<Node>& node2) 
     309void CParallelTree::build(vector<NodePtr>& node, vector<NodePtr>& node2) 
    309310{ 
    310311 
     
    332333//      assert(node2.size() > nbSampleNodes); 
    333334//      assert(node.size() + node2.size() > nbSampleNodes); 
    334         vector<Node> sampleNodes; sampleNodes.reserve(nbSampleNodes1+nbSampleNodes2); 
     335        vector<NodePtr> sampleNodes; sampleNodes.reserve(nbSampleNodes1+nbSampleNodes2); 
    335336 
    336337        vector<int> randomArray1(node.size()); 
     
    358359        } 
    359360*/ 
    360         for (int i = 0; i <nbSampleNodes1; i++) sampleNodes.push_back(Node(node[randomArray1[i%nb1]].centre,  node[randomArray1[i%nb1]].radius, NULL)); 
    361         for (int i = 0; i <nbSampleNodes2; i++) sampleNodes.push_back(Node(node2[randomArray2[i%nb2]].centre, node2[randomArray2[i%nb2]].radius, NULL)); 
     361        for (int i = 0; i <nbSampleNodes1; i++) sampleNodes.push_back(make_shared<Node>(node[randomArray1[i%nb1]]->centre,  node[randomArray1[i%nb1]]->radius, nullptr)); 
     362        for (int i = 0; i <nbSampleNodes2; i++) sampleNodes.push_back(make_shared<Node>(node2[randomArray2[i%nb2]]->centre, node2[randomArray2[i%nb2]]->radius, nullptr)); 
    362363 
    363364/*           
     
    393394} 
    394395 
    395 void CParallelTree::routeNodes(vector<int>& route, vector<Node>& nodes /*route field used*/, int level) 
     396void CParallelTree::routeNodes(vector<int>& route, vector<NodePtr>& nodes /*route field used*/, int level) 
    396397{ 
    397398        treeCascade[level].routeNodes(route /*assign*/, nodes, assignLevel); 
     
    399400        if (level+1 < cascade.num_levels) 
    400401        { 
    401                 vector<Node> routedNodes; 
     402                vector<NodePtr> routedNodes; 
    402403                CMPIRouting MPIRoute(cascade.level[level].pg_comm); 
    403404                transferRoutedNodes(MPIRoute, nodes, route /*use*/, routedNodes); 
     
    438439} 
    439440 
    440 void CParallelTree::routeIntersections(vector<vector<int> >& routes, vector<Node>& nodes, int level) 
     441void CParallelTree::routeIntersections(vector<vector<int> >& routes, vector<NodePtr>& nodes, int level) 
    441442{ 
    442443        treeCascade[level].routeIntersections(routes /*assign*/, nodes); 
     
    444445        if (level+1 < cascade.num_levels) 
    445446        { 
    446                 vector<Node> routedNodes; 
     447                vector<NodePtr> routedNodes; 
    447448                CMPIRouting MPIRoute(cascade.level[level].pg_comm); 
    448449 
    449450                vector<int> flattenedRoutes1; 
    450451                linearize(routes, flattenedRoutes1); 
    451                 vector<Node> double_nodes(flattenedRoutes1.size()); 
     452                vector<NodePtr> double_nodes(flattenedRoutes1.size()); 
    452453                int j = 0; 
    453454                for (int i = 0; i < routes.size(); ++i) 
    454455                        for (int k = 0; k < routes[i].size(); ++k, ++j) 
    455                                 double_nodes[j] = nodes[i]; 
     456                        { 
     457                                double_nodes[j] = make_shared<Node>() ; 
     458                                *double_nodes[j] = *nodes[i]; 
     459                        } 
    456460                transferRoutedNodes(MPIRoute, double_nodes, flattenedRoutes1 /*use*/, routedNodes); 
    457461                vector<vector<int> > globalRanks(routedNodes.size()); 
Note: See TracChangeset for help on using the changeset viewer.