Changeset 2269


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

Location:
XIOS/dev/dev_ym/XIOS_COUPLING/extern/remap/src
Files:
15 edited

Legend:

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

    r688 r2269  
    3535  } 
    3636   
    37   void setCirclesAndLinks(Elt *elts, vector<Node>& nodes) 
     37  void setCirclesAndLinks(Elt *elts, vector<NodePtr>& nodes) 
    3838  { 
    3939        for (int i = 0; i < nodes.size(); i++) 
    40                 setCircleAndLink(elts[i], nodes[i]); 
     40                setCircleAndLink(elts[i], *nodes[i]); 
    4141  } 
    4242} 
  • XIOS/dev/dev_ym/XIOS_COUPLING/extern/remap/src/circle.hpp

    r688 r2269  
    1515   At this point the node is a leaf and contains only one element. 
    1616*/ 
    17 void setCirclesAndLinks(Elt *elts, vector<Node>& leaf); 
     17void setCirclesAndLinks(Elt *elts, vector<NodePtr>& leaf); 
    1818 
    1919} 
  • XIOS/dev/dev_ym/XIOS_COUPLING/extern/remap/src/intersection_ym.cpp

    r1588 r2269  
    186186       if (dx*dx+dy*dy>fusion_vertex*fusion_vertex) 
    187187       { 
    188           intersectPolygon[nv]=intersectPolygon[n] ; 
    189  
    190           vect_points.push_back( array<double, 2>() ); 
    191           vect_points[nv][0] = intersectPolygon[n].x; 
    192           vect_points[nv][1] = intersectPolygon[n].y; 
    193  
    194           nv++ ; 
     188         intersectPolygon[nv]=intersectPolygon[n] ; 
     189         vect_points.push_back( array<double, 2>() ); 
     190         vect_points[nv][0] = intersectPolygon[n].x; 
     191         vect_points[nv][1] = intersectPolygon[n].y; 
     192         nv++ ; 
    195193       } 
    196        
    197  
    198194    } 
    199195 
     
    209205      for(int i=0;i<indices.size()/3;++i) 
    210206      { 
    211           Coord x0 = Ox * polyline[0][indices[3*i]][0] + Oy* polyline[0][indices[3*i]][1] + Oz ; 
    212           Coord x1 = Ox * polyline[0][indices[3*i+1]][0] + Oy* polyline[0][indices[3*i+1]][1] + Oz ; 
    213           Coord x2 = Ox * polyline[0][indices[3*i+2]][0] + Oy* polyline[0][indices[3*i+2]][1] + Oz ; 
    214           area2+=triarea(x0 * (1./norm(x0)),x1* (1./norm(x1)), x2* (1./norm(x2))) ; 
     207        Coord x0 = Ox * polyline[0][indices[3*i]][0] + Oy* polyline[0][indices[3*i]][1] + Oz ; 
     208        Coord x1 = Ox * polyline[0][indices[3*i+1]][0] + Oy* polyline[0][indices[3*i+1]][1] + Oz ; 
     209        Coord x2 = Ox * polyline[0][indices[3*i+2]][0] + Oy* polyline[0][indices[3*i+2]][1] + Oz ; 
     210        area2+=triarea(x0 * (1./norm(x0)),x1* (1./norm(x1)), x2* (1./norm(x2))) ; 
    215211      } 
    216212 
  • 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} 
  • XIOS/dev/dev_ym/XIOS_COUPLING/extern/remap/src/mapper.hpp

    r2198 r2269  
    33#include "parallel_tree.hpp" 
    44#include "mpi.hpp" 
     5#include "timerRemap.hpp" 
    56 
    67namespace sphereRemap { 
     
    2728       void getTargetValue(double* val) ; 
    2829 
    29        void buildSSTree(vector<Node>& srcMsh, vector<Node>& trgMsh) 
     30       void buildSSTree(vector<NodePtr>& srcMsh, vector<NodePtr>& trgMsh) 
    3031       { 
    3132         sstree.build(srcMsh, trgMsh); 
     
    6162       /** Holds adaptional leaf nodes as ghost cells for gradient computations (hold neighbour elements from other ranks). 
    6263           They will be inserted to the local trees but not saved in its leaf array */ 
    63        vector<Node> neighbourNodes; 
     64       vector<NodePtr> neighbourNodes; 
    6465 
    6566       int nbNeighbourElements; 
     
    6970       MPI_Comm communicator ; 
    7071       std::vector<Elt>  sourceElements ; 
    71        std::vector<Node> sourceMesh ; 
     72       std::vector<NodePtr> sourceMesh ; 
    7273       std::vector<Elt>  targetElements ; 
    73        std::vector<Node> targetMesh ; 
     74       std::vector<NodePtr> targetMesh ; 
    7475       std::vector<long> sourceGlobalId ; 
    7576       std::vector<long> targetGlobalId ; 
  • XIOS/dev/dev_ym/XIOS_COUPLING/extern/remap/src/meshutil.cpp

    r1613 r2269  
    6060  polyline.clear(); 
    6161  indices_a_gno.clear(); 
     62  delete [] a_gno ; 
    6263  return area_a_gno ; 
    6364} 
  • XIOS/dev/dev_ym/XIOS_COUPLING/extern/remap/src/mpi_routing.cpp

    r1639 r2269  
    235235        delete[]  toSend; 
    236236        delete[]  recvCount; 
     237        delete[]  targetRankToIndex; 
    237238        delete[]  request; 
    238239        delete[]  status; 
     
    598599template void CMPIRouting::transferFromSource(int *targetElements, int *sourceElements, void (*pack)(int&, char*, int&), void (* unpack)(int&, char *, int&)); 
    599600 
    600 template void CMPIRouting::transferToTarget(Node* targetElements, Node* sourceElements, void (*pack)(Node&, char*, int&), void (* unpack)(Node&, char *, int&)); 
     601template void CMPIRouting::transferToTarget(NodePtr* targetElements, NodePtr* sourceElements, void (*pack)(NodePtr, char*, int&), void (* unpack)(NodePtr, char *, int&)); 
    601602template void CMPIRouting::transferToTarget(Elt **targetElements, Elt **sourceElements, void (*pack)(Elt *, char*, int&), void (* unpack)(Elt *, char *, int&)); 
    602603template void CMPIRouting::transferFromSource(std::vector<int> *targetElements, std::vector<int> *sourceElements, void (*pack)(const std::vector<int>&, char*, int&), void (* unpack)(std::vector<int>&, const char *, int&)); 
  • XIOS/dev/dev_ym/XIOS_COUPLING/extern/remap/src/node.cpp

    r2198 r2269  
    7979/* On level `level` find the node in our subtree that is closest to `src` and return through argument `closest`. 
    8080   The return value is just for recursive calling */ 
    81 void Node::findClosest(int level, NodePtr src, double& minDist2, NodePtr &closest) 
     81void Node::findClosest(int level, NodePtr src, double& minDist2, NodePtr& closest) 
    8282{ 
    8383        double r2; 
     
    8989                { 
    9090                        minDist2 = r2; 
    91                         closest = this; 
     91                        closest = shared_from_this(); 
    9292                } 
    9393        } 
     
    221221}*/ 
    222222 
    223 bool find_in_tree1(Node* node) 
     223bool find_in_tree1(NodePtr node) 
    224224{ 
    225225        if (node == node->tree->root) return true; 
    226         if (node->parent == NULL) 
     226        if (node->parent.lock() == NULL) 
    227227        { 
    228228                cerr << "Cannot find!" << endl; 
    229229                return false; 
    230230        } 
    231         return find_in_tree1(node->parent); 
     231        return find_in_tree1(node->parent.lock()); 
    232232} 
    233233 
     
    264264        { 
    265265    node->child.push_back(thIs); 
    266                 thIs->parent = node; 
     266                thIs->parent = node ; 
    267267                if (node->child.size() > MAX_NODE_SZ &&  node->tree->canSplit() ) // with us as additional child `node` is now too large :( 
    268                         return (node->reinserted || node->parent == NULL) ? split(node) : reinsert(node); 
     268                        return (node->reinserted || node->parent.lock() == NULL) ? split(node) : reinsert(node); 
    269269        } 
    270270        else // la < lb - 1 
     
    299299   
    300300        /* transfere out children from us to a new node q which will be returned */ 
    301         NodePtr q = new Node; 
     301        NodePtr q = make_shared<Node>(); 
    302302        q->tree = thIs->tree; 
    303303        q->child.resize(out); 
     
    462462{ 
    463463        thIs->tree->increaseLevelSize(thIs->level); 
    464         NodePtr p = new Node; 
    465         NodePtr q = new Node; 
     464        NodePtr p = make_shared<Node>(); 
     465        NodePtr q = make_shared<Node>(); 
    466466        p->level = q->level = thIs->level; 
    467467        p->reinserted = q->reinserted = false; 
    468         p->parent = q->parent = thIs->parent; 
     468        p->parent = thIs->parent; 
     469        q->parent = thIs->parent; 
    469470        p->tree = q->tree = thIs->tree; 
    470471 
     
    476477        std::sort(thIs->child.begin(), thIs->child.end(), compareDist); 
    477478        for (int i = 0; i < MAX_NODE_SZ+1; i++) 
    478                 assert(thIs->child[i]->parent == thIs); 
     479                assert(thIs->child[i]->parent.lock() == thIs); 
    479480        for (int i = 0; i < MAX_NODE_SZ/2 + 1; i++) 
    480481                q->child[i] = thIs->child[i]; 
     
    496497        thIs->reinserted = p->reinserted; 
    497498        thIs->update(); 
    498         delete p; 
     499        p.reset(); 
    499500 
    500501        if (thIs == thIs->tree->root) // root split 
     
    593594   
    594595  for (int i = 0; i < childSize; i++) 
    595                 assert(child[i]->parent == this); 
     596                assert(child[i]->parent.lock() == shared_from_this()); 
    596597 
    597598  if (level>0) for (int i = 0; i < childSize; i++) child[i]->checkParent() ; 
     
    602603        cout << "level " << this->level << ", centre "; 
    603604        cout << "level " << this->level << ", centre " << this->centre << "\t r = " << this->radius << endl; 
    604         cout << this << " p: " << this->parent << endl; 
     605        cout << this << " p: " << this->parent.lock() << endl; 
    605606        int n = this->child.size(); 
    606607        for (int i=0; i<n; i++) 
     
    656657        double distMin2 = 0; // squared distance 
    657658        closest = NULL; 
    658         if (tree->root == this) 
     659        if (tree->root == shared_from_this()) 
    659660                findClosest(level, node, distMin2, closest); 
    660661 
    661         if (closest != NULL && tree->root == this) 
     662        if (closest != NULL && tree->root == shared_from_this()) 
    662663                /* When is this point reached? 
    663664                   if the preceeding findClosest was called and succesed to set closest 
     
    690691} 
    691692 
    692 void Node::routingIntersecting(vector<Node> *routingList, NodePtr node) 
     693void Node::routingIntersecting(vector<NodePtr> *routingList, NodePtr node) 
    693694{ 
    694695        if (level==0) 
    695696        { 
    696697                int rank = route; 
    697                 routingList[rank].push_back(*node); 
     698                routingList[rank].push_back(node); 
    698699        } 
    699700        else 
     
    712713                child[i]->free_descendants(); 
    713714                if (child[i]->level) // do not attempt to delete leafs, they are delete through leafs vector 
    714                         delete child[i]; 
     715                        child[i].reset(); 
    715716        } 
    716717} 
     
    718719void Node::getNodeLevel(int assignLevel, std::list<NodePtr>& NodeList) 
    719720{ 
    720   if (level==assignLevel) NodeList.push_back(this) ; 
     721  if (level==assignLevel) NodeList.push_back(shared_from_this()) ; 
    721722  else if (level>0) for (int i = 0; i < child.size(); i++) child[i]->getNodeLevel(assignLevel,NodeList) ; 
    722723  return ; 
     
    737738        for (int j = 0; j < child[i]->child.size(); j++) tree->push_back(child[i]->child[j]) ; 
    738739        tree->decreaseLevelSize(assignLevel) ; 
    739         delete child[i] ; 
     740        child[i].reset() ; 
    740741      } 
    741742      else newChild.push_back(child[i]) ; 
  • XIOS/dev/dev_ym/XIOS_COUPLING/extern/remap/src/node.hpp

    r923 r2269  
    1010 
    1111#include "triple.hpp" 
     12#include <memory> 
    1213 
    1314namespace sphereRemap { 
     
    112113//#endif 
    113114 
    114 typedef Node* NodePtr; 
    115  
    116 struct Node 
     115//typedef Node* NodePtr; 
     116typedef std::shared_ptr<Node> NodePtr; 
     117 
     118struct Node : public std::enable_shared_from_this<Node> 
    117119{ 
    118120        int level; /* FIXME leafs are 0 and root is max level? */ 
     
    120122        Coord centre; 
    121123        double radius; 
    122         NodePtr parent, ref; 
     124        std::weak_ptr<Node> parent ; 
     125        NodePtr ref; 
    123126        std::vector<NodePtr> child; 
    124127        std::list<NodePtr> intersectors; 
     
    198201        void printLevel(int level); 
    199202        void routeNode(NodePtr node, int level); 
    200         void routingIntersecting(std::vector<Node>* routingList, NodePtr node); 
     203        void routingIntersecting(std::vector<NodePtr>* routingList, NodePtr node); 
    201204        void routeIntersection(std::vector<int>& routes, NodePtr node); 
    202205  void getNodeLevel(int level,std::list<NodePtr>& NodeList) ; 
  • 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()); 
  • XIOS/dev/dev_ym/XIOS_COUPLING/extern/remap/src/parallel_tree.hpp

    r1639 r2269  
    1515        ~CParallelTree(); 
    1616 
    17         void build(vector<Node>& node, vector<Node>& node2); 
     17        void build(vector<NodePtr>& node, vector<NodePtr>& node2); 
    1818 
    19         void routeNodes(vector<int>& route, vector<Node>& nodes, int level = 0); 
    20         void routeIntersections(vector<vector<int> >& route, vector<Node>& nodes, int level = 0); 
     19        void routeNodes(vector<int>& route, vector<NodePtr>& nodes, int level = 0); 
     20        void routeIntersections(vector<vector<int> >& route, vector<NodePtr>& nodes, int level = 0); 
    2121 
    2222        int nbLocalElements; 
     
    2727private: 
    2828        void updateCirclesForRouting(Coord rootCentre, double rootRadius, int level = 0); 
    29         void buildSampleTreeCascade(vector<Node>& sampleNodes, int level = 0); 
    30         void buildLocalTree(const vector<Node>& node, const vector<int>& route); 
     29        void buildSampleTreeCascade(vector<NodePtr>& sampleNodes, int level = 0); 
     30        void buildLocalTree(const vector<NodePtr>& node, const vector<int>& route); 
    3131        void buildRouteTree(); 
    3232 
     
    3838}; 
    3939 
    40 void buildSampleTree(CSampleTree& tree, const vector<Node>& node, const CCascadeLevel& comm); 
     40void buildSampleTree(CSampleTree& tree, const vector<NodePtr>& node, const CCascadeLevel& comm); 
    4141 
    4242} 
  • XIOS/dev/dev_ym/XIOS_COUPLING/extern/remap/src/timerRemap.cpp

    r694 r2269  
    6060        return *(it->second); 
    6161} 
     62 
     63void CTimer::release(void) 
     64{ 
     65  for(auto & it : allTimer) delete it.second ; 
     66  allTimer.clear() ;     
    6267} 
     68 
     69} 
  • XIOS/dev/dev_ym/XIOS_COUPLING/extern/remap/src/timerRemap.hpp

    r694 r2269  
    1 #ifndef __TIMER_HPP__ 
    2 #define __TIMER_HPP__ 
     1#ifndef __TIMER_REMAP_HPP__ 
     2#define __TIMER_REMAP_HPP__ 
    33 
    44#include "mpi.hpp" 
     
    2929    static double getTime(void); 
    3030    static CTimer& get(string name); 
    31   }; 
    32  
    33  
     31    static void release(void) ; 
     32  } ; 
    3433 
    3534} 
  • XIOS/dev/dev_ym/XIOS_COUPLING/extern/remap/src/tree.cpp

    r1158 r2269  
    2727*/ 
    2828 
    29 void CBasicTree::routeNodes(vector<int>& route, vector<Node>& nodes, int assignLevel) 
     29void CBasicTree::routeNodes(vector<int>& route, vector<NodePtr>& nodes, int assignLevel) 
    3030{ 
    3131        for (int i = 0; i < nodes.size(); i++) 
    3232        { 
    33                 root->routeNode(&nodes[i], assignLevel); 
    34                 route[i] = nodes[i].route; 
    35         } 
    36 } 
    37  
    38 void CBasicTree::routeIntersections(vector<vector<int> >& routes, vector<Node>& nodes) 
     33                root->routeNode(nodes[i], assignLevel); 
     34                route[i] = nodes[i]->route; 
     35        } 
     36} 
     37 
     38void CBasicTree::routeIntersections(vector<vector<int> >& routes, vector<NodePtr>& nodes) 
    3939{ 
    4040        for (int i = 0; i < nodes.size(); i++) 
    41                 root->routeIntersection(routes[i], &nodes[i]); 
    42 } 
    43  
    44 void CBasicTree::build(vector<Node>& nodes) 
     41                root->routeIntersection(routes[i], nodes[i]); 
     42} 
     43 
     44void CBasicTree::build(vector<NodePtr>& nodes) 
    4545{ 
    4646        newRoot(1); 
     
    8080        push_back(node); 
    8181 
    82         NodePtr q; 
     82        NodePtr q=make_shared<Node>(); 
    8383        while (pool.size()) 
    8484        { 
     
    8888                if (ri) 
    8989                { 
    90                         delete q; 
     90                        q.reset(); 
    9191                        ri = 0; 
    9292                } 
     
    103103                if (ri) 
    104104                { 
    105                         delete q; 
     105                        q.reset(); 
    106106                        ri = 0; 
    107107                } 
     
    137137void CBasicTree::newRoot(int level)  // newroot <- root 
    138138{ 
    139         root = new Node; 
     139        root = make_shared<Node>(); 
    140140        // if (level > 1) cout << " newRoot level " << level << endl; 
    141141        root->level = level; 
    142         root->parent = 0; 
     142        root->parent.reset() ; 
    143143        root->leafCount = 0; 
    144144// initialize root node on the sphere 
     
    155155        //FIXME uncomment the next line and figure out why it segfault sometimes 
    156156        //root->free_descendants(); // recursively deletes all nodes in the tree 
    157         if (root) delete root; 
    158 } 
    159  
    160 void CTree::insertNodes(vector<Node>& nodes) 
     157        if (root) root.reset(); 
     158} 
     159 
     160void CTree::insertNodes(vector<NodePtr>& nodes) 
    161161{ 
    162162        int stepSlim = MAX_NODE_SZ*MAX_NODE_SZ*2; 
     
    164164        for (int i = 0; i < nodes.size(); i++) 
    165165        { 
    166                 insertNode(&nodes[i]); 
     166                insertNode(nodes[i]); 
    167167 
    168168                if (root->leafCount > stepSlim) // time for slim down 
     
    175175 
    176176 
    177 void CSampleTree::insertNodes(vector<Node>& nodes) 
     177void CSampleTree::insertNodes(vector<NodePtr>& nodes) 
    178178{ 
    179179        bool first1 = true; 
     
    184184  int i ; 
    185185   
    186 //  cout<<"CSampleTree::insertNodes  : nb node to be inserted : "<<nodes.size()<<endl ; 
    187186  for (i = 0; i < nodes.size(); i++) 
    188187        { 
    189     insertNode(&nodes[i]); 
     188    insertNode(nodes[i]); 
    190189 
    191190                if (root->leafCount > stepSlim && levelSize[assignLevel] < keepNodes-2) // time for slim down 
  • XIOS/dev/dev_ym/XIOS_COUPLING/extern/remap/src/tree.hpp

    r923 r2269  
    2020        int ri; /** this is set to one by a node in case of reinsertion */ 
    2121        vector<int> levelSize; /** e.g. levelSize[0] == leafs.size() */ 
    22         vector<Node> leafs; /** leafs are stored in vector for easy access and rest of the tree nodes as separate allocations, only reachable through tree traversal */ 
     22        vector<NodePtr> leafs; /** leafs are stored in vector for easy access and rest of the tree nodes as separate allocations, only reachable through tree traversal */ 
    2323 
    2424        CBasicTree() : ri(0), levelSize(MAX_LEVEL_SIZE), root(NULL), isAssignedLevel(false), okSplit(true), isActiveOkSplit(false) {}  
    2525        ~CBasicTree();  
    26         void build(vector<Node>& nodes); 
     26        void build(vector<NodePtr>& nodes); 
    2727        void slim(int nbIts = 1); 
    28         virtual void insertNodes(vector<Node>& node) = 0; 
     28        virtual void insertNodes(vector<NodePtr>& node) = 0; 
    2929 
    30         void routeNodes(vector<int>& route, vector<Node>& nodes, int assignLevel); 
    31         void routeIntersections(vector<vector<int> >& route, vector<Node>& nodes); 
     30        void routeNodes(vector<int>& route, vector<NodePtr>& nodes, int assignLevel); 
     31        void routeIntersections(vector<vector<int> >& route, vector<NodePtr>& nodes); 
    3232 
    3333        void push_back(NodePtr node); 
     
    6363{ 
    6464public: 
    65         void insertNodes(vector<Node>& nodes); 
     65        void insertNodes(vector<NodePtr>& nodes); 
    6666}; 
    6767 
     
    7373  void slimAssignedLevel() ; 
    7474  void removeExtraNode(void) ; 
    75         void insertNodes(vector<Node>& nodes); 
     75        void insertNodes(vector<NodePtr>& nodes); 
    7676}; 
    7777 
Note: See TracChangeset for help on using the changeset viewer.