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/mapper.cpp

    r1639 r2269  
    1111#include "gridRemap.hpp" 
    1212 
     13#include <fstream> 
     14#include "client.hpp" 
     15 
    1316#include "mapper.hpp" 
     17 
     18namespace MemTrack 
     19{  
     20  void TrackDumpBlocks(std::ofstream& memReport, size_t memtrack_blocks, size_t memtrack_size); 
     21} 
    1422 
    1523namespace sphereRemap { 
     
    5765    elt.src_id.globalId = sourceGlobalId[i]; 
    5866    sourceElements.push_back(elt); 
    59     sourceMesh.push_back(Node(elt.x, cptRadius(elt), &sourceElements.back())); 
     67    sourceMesh.push_back(make_shared<Node>(elt.x, cptRadius(elt), &sourceElements.back())); 
    6068    cptEltGeom(sourceElements[i], Coord(pole[0], pole[1], pole[2])); 
    6169    if (area!=NULL) sourceElements[i].given_area=area[i] ; 
     
    92100    Elt elt(boundsLon + offs, boundsLat + offs, nVertex); 
    93101    targetElements.push_back(elt); 
    94     targetMesh.push_back(Node(elt.x, cptRadius(elt), &sourceElements.back())); 
     102    targetMesh.push_back(make_shared<Node>(elt.x, cptRadius(elt), &sourceElements.back())); 
    95103    cptEltGeom(targetElements[i], Coord(pole[0], pole[1], pole[2])); 
    96104    if (area!=NULL) targetElements[i].given_area=area[i] ; 
     
    121129 
    122130  this->buildSSTree(sourceMesh, targetMesh); 
     131   
    123132 
    124133  if (mpiRank == 0 && verbose) cout << "Computing intersections ..." << endl; 
     
    460469  delete[] recvElement; 
    461470  delete[] sendValue; 
     471  delete[] sendArea ; 
     472  delete[] sendGivenArea ; 
    462473  delete[] recvValue; 
     474  delete[] recvArea ; 
     475  delete[] recvGivenArea ; 
    463476  delete[] sendGrad; 
    464477  delete[] recvGrad; 
     
    490503  MPI_Comm_rank(communicator, &mpiRank); 
    491504 
    492   vector<Node> *routingList = new vector<Node>[mpiSize]; 
     505  vector<NodePtr> *routingList = new vector<NodePtr>[mpiSize]; 
    493506  vector<vector<int> > routes(sstree.localTree.leafs.size()); 
    494507 
     
    517530    for (size_t j = 0; j < routingList[rank].size(); j++) 
    518531    { 
    519       Elt *elt = (Elt *) (routingList[rank][j].data); 
     532      Elt *elt = (Elt *) (routingList[rank][j]->data); 
    520533      sendMessageSize[rank] += packedPolygonSize(*elt); 
    521534    } 
     
    540553    for (size_t j = 0; j < routingList[rank].size(); j++) 
    541554    { 
    542       Elt *elt = (Elt *) (routingList[rank][j].data); 
     555      Elt *elt = (Elt *) (routingList[rank][j]->data); 
    543556      packPolygon(*elt, sendBuffer[rank], pos[rank]); 
    544557    } 
     
    590603        Elt elt; 
    591604        unpackPolygon(elt, recvBuffer[rank], pos[rank]); 
    592         Node node(elt.x, cptRadius(elt), &elt); 
    593         findNeighbour(sstree.localTree.root, &node, neighbourList); 
     605        NodePtr node=make_shared<Node>(elt.x, cptRadius(elt), &elt); 
     606        findNeighbour(sstree.localTree.root, node, neighbourList); 
    594607      } 
    595608      nbSendNode[rank] = neighbourList.size(); 
     
    678691  /* re-compute on received elements to avoid having to send this information */ 
    679692  neighbourNodes.resize(nbNeighbourNodes); 
     693  for(int i=0;i<neighbourNodes.size();i++) neighbourNodes[i]=make_shared<Node>() ; 
    680694  setCirclesAndLinks(neighbourElements, neighbourNodes); 
    681695  cptAllEltsGeom(neighbourElements, nbNeighbourNodes, srcGrid.pole); 
     
    692706  for (int j = 0; j < sstree.localTree.leafs.size(); j++) 
    693707  { 
    694     Node& node = sstree.localTree.leafs[j]; 
     708    NodePtr node = sstree.localTree.leafs[j]; 
    695709 
    696710    /* find all leafs whoes circles that intersect node's circle and save into node->intersectors */ 
    697     node.search(sstree.localTree.root); 
    698  
    699     Elt *elt = (Elt *)(node.data); 
     711    node->search(sstree.localTree.root); 
     712 
     713    Elt *elt = (Elt *)(node->data); 
    700714 
    701715    for (int i = 0; i < elt->n; i++) elt->neighbour[i] = NOT_FOUND; 
     
    705719                   and check if they are neighbours in the sense that the two elements share an edge. 
    706720                   If they do, save this information for elt */ 
    707     for (list<NodePtr>::iterator it = (node.intersectors).begin(); it != (node.intersectors).end(); ++it) 
     721    for (list<NodePtr>::iterator it = (node->intersectors).begin(); it != (node->intersectors).end(); ++it) 
    708722    { 
    709723      Elt *elt2 = (Elt *)((*it)->data); 
     
    730744  MPI_Barrier(communicator); 
    731745 
    732   vector<Node> *routingList = new vector<Node>[mpiSize]; 
    733  
    734   vector<Node> routeNodes;  routeNodes.reserve(nbElements); 
     746  vector<NodePtr> *routingList = new vector<NodePtr>[mpiSize]; 
     747 
     748  vector<NodePtr> routeNodes;  routeNodes.reserve(nbElements); 
    735749  for (int j = 0; j < nbElements; j++) 
    736750  { 
    737751    elements[j].id.ind = j; 
    738752    elements[j].id.rank = mpiRank; 
    739     routeNodes.push_back(Node(elements[j].x, cptRadius(elements[j]), &elements[j])); 
     753    routeNodes.push_back(make_shared<Node>(elements[j].x, cptRadius(elements[j]), &elements[j])); 
    740754  } 
    741755 
     
    766780    for (size_t j = 0; j < routingList[rank].size(); j++) 
    767781    { 
    768       Elt *elt = (Elt *) (routingList[rank][j].data); 
     782      Elt *elt = (Elt *) (routingList[rank][j]->data); 
    769783      sentMessageSize[rank] += packedPolygonSize(*elt); 
    770784    } 
     
    797811    for (size_t j = 0; j < routingList[rank].size(); j++) 
    798812    { 
    799       Elt* elt = (Elt *) (routingList[rank][j].data); 
     813      Elt* elt = (Elt *) (routingList[rank][j]->data); 
    800814      packPolygon(*elt, sendBuffer[rank], pos[rank]); 
    801815    } 
     
    841855        unpackPolygon(recvElt[j], recvBuffer[rank], pos[rank]); 
    842856        cptEltGeom(recvElt[j], tgtGrid.pole); 
    843         Node recvNode(recvElt[j].x, cptRadius(recvElt[j]), &recvElt[j]); 
    844         recvNode.search(sstree.localTree.root); 
     857        NodePtr recvNode = make_shared<Node>(recvElt[j].x, cptRadius(recvElt[j]), &recvElt[j]); 
     858        recvNode->search(sstree.localTree.root); 
    845859        /* for a node holding an element of the target, loop throught candidates for intersecting source */ 
    846         for (list<NodePtr>::iterator it = (recvNode.intersectors).begin(); it != (recvNode.intersectors).end(); ++it) 
     860        for (list<NodePtr>::iterator it = (recvNode->intersectors).begin(); it != (recvNode->intersectors).end(); ++it) 
    847861        { 
    848862          Elt *elt2 = (Elt *) ((*it)->data); 
     
    869883        } 
    870884      } 
     885       
     886      for (int j = 0; j < nbRecvNode[rank]; j++) recvElt[j].delete_intersections(); 
     887             
    871888      delete [] recvElt; 
    872889 
     
    943960  delete [] srcRank; 
    944961  delete [] dstAddress; 
     962  delete [] sourceWeightId ; 
     963  delete [] targetWeightId ; 
    945964  if (neighbourElements) delete [] neighbourElements; 
    946 } 
    947  
    948 } 
     965  CTimer::release() ; 
     966 } 
     967 
     968} 
Note: See TracChangeset for help on using the changeset viewer.