Changeset 2269
- Timestamp:
- 12/07/21 12:00:23 (3 years ago)
- 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 35 35 } 36 36 37 void setCirclesAndLinks(Elt *elts, vector<Node >& nodes)37 void setCirclesAndLinks(Elt *elts, vector<NodePtr>& nodes) 38 38 { 39 39 for (int i = 0; i < nodes.size(); i++) 40 setCircleAndLink(elts[i], nodes[i]);40 setCircleAndLink(elts[i], *nodes[i]); 41 41 } 42 42 } -
XIOS/dev/dev_ym/XIOS_COUPLING/extern/remap/src/circle.hpp
r688 r2269 15 15 At this point the node is a leaf and contains only one element. 16 16 */ 17 void setCirclesAndLinks(Elt *elts, vector<Node >& leaf);17 void setCirclesAndLinks(Elt *elts, vector<NodePtr>& leaf); 18 18 19 19 } -
XIOS/dev/dev_ym/XIOS_COUPLING/extern/remap/src/intersection_ym.cpp
r1588 r2269 186 186 if (dx*dx+dy*dy>fusion_vertex*fusion_vertex) 187 187 { 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++ ; 195 193 } 196 197 198 194 } 199 195 … … 209 205 for(int i=0;i<indices.size()/3;++i) 210 206 { 211 212 213 214 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))) ; 215 211 } 216 212 -
XIOS/dev/dev_ym/XIOS_COUPLING/extern/remap/src/mapper.cpp
r1639 r2269 11 11 #include "gridRemap.hpp" 12 12 13 #include <fstream> 14 #include "client.hpp" 15 13 16 #include "mapper.hpp" 17 18 namespace MemTrack 19 { 20 void TrackDumpBlocks(std::ofstream& memReport, size_t memtrack_blocks, size_t memtrack_size); 21 } 14 22 15 23 namespace sphereRemap { … … 57 65 elt.src_id.globalId = sourceGlobalId[i]; 58 66 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())); 60 68 cptEltGeom(sourceElements[i], Coord(pole[0], pole[1], pole[2])); 61 69 if (area!=NULL) sourceElements[i].given_area=area[i] ; … … 92 100 Elt elt(boundsLon + offs, boundsLat + offs, nVertex); 93 101 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())); 95 103 cptEltGeom(targetElements[i], Coord(pole[0], pole[1], pole[2])); 96 104 if (area!=NULL) targetElements[i].given_area=area[i] ; … … 121 129 122 130 this->buildSSTree(sourceMesh, targetMesh); 131 123 132 124 133 if (mpiRank == 0 && verbose) cout << "Computing intersections ..." << endl; … … 460 469 delete[] recvElement; 461 470 delete[] sendValue; 471 delete[] sendArea ; 472 delete[] sendGivenArea ; 462 473 delete[] recvValue; 474 delete[] recvArea ; 475 delete[] recvGivenArea ; 463 476 delete[] sendGrad; 464 477 delete[] recvGrad; … … 490 503 MPI_Comm_rank(communicator, &mpiRank); 491 504 492 vector<Node > *routingList = new vector<Node>[mpiSize];505 vector<NodePtr> *routingList = new vector<NodePtr>[mpiSize]; 493 506 vector<vector<int> > routes(sstree.localTree.leafs.size()); 494 507 … … 517 530 for (size_t j = 0; j < routingList[rank].size(); j++) 518 531 { 519 Elt *elt = (Elt *) (routingList[rank][j] .data);532 Elt *elt = (Elt *) (routingList[rank][j]->data); 520 533 sendMessageSize[rank] += packedPolygonSize(*elt); 521 534 } … … 540 553 for (size_t j = 0; j < routingList[rank].size(); j++) 541 554 { 542 Elt *elt = (Elt *) (routingList[rank][j] .data);555 Elt *elt = (Elt *) (routingList[rank][j]->data); 543 556 packPolygon(*elt, sendBuffer[rank], pos[rank]); 544 557 } … … 590 603 Elt elt; 591 604 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); 594 607 } 595 608 nbSendNode[rank] = neighbourList.size(); … … 678 691 /* re-compute on received elements to avoid having to send this information */ 679 692 neighbourNodes.resize(nbNeighbourNodes); 693 for(int i=0;i<neighbourNodes.size();i++) neighbourNodes[i]=make_shared<Node>() ; 680 694 setCirclesAndLinks(neighbourElements, neighbourNodes); 681 695 cptAllEltsGeom(neighbourElements, nbNeighbourNodes, srcGrid.pole); … … 692 706 for (int j = 0; j < sstree.localTree.leafs.size(); j++) 693 707 { 694 Node &node = sstree.localTree.leafs[j];708 NodePtr node = sstree.localTree.leafs[j]; 695 709 696 710 /* 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); 700 714 701 715 for (int i = 0; i < elt->n; i++) elt->neighbour[i] = NOT_FOUND; … … 705 719 and check if they are neighbours in the sense that the two elements share an edge. 706 720 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) 708 722 { 709 723 Elt *elt2 = (Elt *)((*it)->data); … … 730 744 MPI_Barrier(communicator); 731 745 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); 735 749 for (int j = 0; j < nbElements; j++) 736 750 { 737 751 elements[j].id.ind = j; 738 752 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])); 740 754 } 741 755 … … 766 780 for (size_t j = 0; j < routingList[rank].size(); j++) 767 781 { 768 Elt *elt = (Elt *) (routingList[rank][j] .data);782 Elt *elt = (Elt *) (routingList[rank][j]->data); 769 783 sentMessageSize[rank] += packedPolygonSize(*elt); 770 784 } … … 797 811 for (size_t j = 0; j < routingList[rank].size(); j++) 798 812 { 799 Elt* elt = (Elt *) (routingList[rank][j] .data);813 Elt* elt = (Elt *) (routingList[rank][j]->data); 800 814 packPolygon(*elt, sendBuffer[rank], pos[rank]); 801 815 } … … 841 855 unpackPolygon(recvElt[j], recvBuffer[rank], pos[rank]); 842 856 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); 845 859 /* 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) 847 861 { 848 862 Elt *elt2 = (Elt *) ((*it)->data); … … 869 883 } 870 884 } 885 886 for (int j = 0; j < nbRecvNode[rank]; j++) recvElt[j].delete_intersections(); 887 871 888 delete [] recvElt; 872 889 … … 943 960 delete [] srcRank; 944 961 delete [] dstAddress; 962 delete [] sourceWeightId ; 963 delete [] targetWeightId ; 945 964 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 3 3 #include "parallel_tree.hpp" 4 4 #include "mpi.hpp" 5 #include "timerRemap.hpp" 5 6 6 7 namespace sphereRemap { … … 27 28 void getTargetValue(double* val) ; 28 29 29 void buildSSTree(vector<Node >& srcMsh, vector<Node>& trgMsh)30 void buildSSTree(vector<NodePtr>& srcMsh, vector<NodePtr>& trgMsh) 30 31 { 31 32 sstree.build(srcMsh, trgMsh); … … 61 62 /** Holds adaptional leaf nodes as ghost cells for gradient computations (hold neighbour elements from other ranks). 62 63 They will be inserted to the local trees but not saved in its leaf array */ 63 vector<Node > neighbourNodes;64 vector<NodePtr> neighbourNodes; 64 65 65 66 int nbNeighbourElements; … … 69 70 MPI_Comm communicator ; 70 71 std::vector<Elt> sourceElements ; 71 std::vector<Node > sourceMesh ;72 std::vector<NodePtr> sourceMesh ; 72 73 std::vector<Elt> targetElements ; 73 std::vector<Node > targetMesh ;74 std::vector<NodePtr> targetMesh ; 74 75 std::vector<long> sourceGlobalId ; 75 76 std::vector<long> targetGlobalId ; -
XIOS/dev/dev_ym/XIOS_COUPLING/extern/remap/src/meshutil.cpp
r1613 r2269 60 60 polyline.clear(); 61 61 indices_a_gno.clear(); 62 delete [] a_gno ; 62 63 return area_a_gno ; 63 64 } -
XIOS/dev/dev_ym/XIOS_COUPLING/extern/remap/src/mpi_routing.cpp
r1639 r2269 235 235 delete[] toSend; 236 236 delete[] recvCount; 237 delete[] targetRankToIndex; 237 238 delete[] request; 238 239 delete[] status; … … 598 599 template void CMPIRouting::transferFromSource(int *targetElements, int *sourceElements, void (*pack)(int&, char*, int&), void (* unpack)(int&, char *, int&)); 599 600 600 template void CMPIRouting::transferToTarget(Node * targetElements, Node* sourceElements, void (*pack)(Node&, char*, int&), void (* unpack)(Node&, char *, int&));601 template void CMPIRouting::transferToTarget(NodePtr* targetElements, NodePtr* sourceElements, void (*pack)(NodePtr, char*, int&), void (* unpack)(NodePtr, char *, int&)); 601 602 template void CMPIRouting::transferToTarget(Elt **targetElements, Elt **sourceElements, void (*pack)(Elt *, char*, int&), void (* unpack)(Elt *, char *, int&)); 602 603 template 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 79 79 /* On level `level` find the node in our subtree that is closest to `src` and return through argument `closest`. 80 80 The return value is just for recursive calling */ 81 void Node::findClosest(int level, NodePtr src, double& minDist2, NodePtr &closest)81 void Node::findClosest(int level, NodePtr src, double& minDist2, NodePtr& closest) 82 82 { 83 83 double r2; … … 89 89 { 90 90 minDist2 = r2; 91 closest = this;91 closest = shared_from_this(); 92 92 } 93 93 } … … 221 221 }*/ 222 222 223 bool find_in_tree1(Node *node)223 bool find_in_tree1(NodePtr node) 224 224 { 225 225 if (node == node->tree->root) return true; 226 if (node->parent == NULL)226 if (node->parent.lock() == NULL) 227 227 { 228 228 cerr << "Cannot find!" << endl; 229 229 return false; 230 230 } 231 return find_in_tree1(node->parent );231 return find_in_tree1(node->parent.lock()); 232 232 } 233 233 … … 264 264 { 265 265 node->child.push_back(thIs); 266 thIs->parent = node ;266 thIs->parent = node ; 267 267 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); 269 269 } 270 270 else // la < lb - 1 … … 299 299 300 300 /* 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>(); 302 302 q->tree = thIs->tree; 303 303 q->child.resize(out); … … 462 462 { 463 463 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>(); 466 466 p->level = q->level = thIs->level; 467 467 p->reinserted = q->reinserted = false; 468 p->parent = q->parent = thIs->parent; 468 p->parent = thIs->parent; 469 q->parent = thIs->parent; 469 470 p->tree = q->tree = thIs->tree; 470 471 … … 476 477 std::sort(thIs->child.begin(), thIs->child.end(), compareDist); 477 478 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); 479 480 for (int i = 0; i < MAX_NODE_SZ/2 + 1; i++) 480 481 q->child[i] = thIs->child[i]; … … 496 497 thIs->reinserted = p->reinserted; 497 498 thIs->update(); 498 delete p;499 p.reset(); 499 500 500 501 if (thIs == thIs->tree->root) // root split … … 593 594 594 595 for (int i = 0; i < childSize; i++) 595 assert(child[i]->parent == this);596 assert(child[i]->parent.lock() == shared_from_this()); 596 597 597 598 if (level>0) for (int i = 0; i < childSize; i++) child[i]->checkParent() ; … … 602 603 cout << "level " << this->level << ", centre "; 603 604 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; 605 606 int n = this->child.size(); 606 607 for (int i=0; i<n; i++) … … 656 657 double distMin2 = 0; // squared distance 657 658 closest = NULL; 658 if (tree->root == this)659 if (tree->root == shared_from_this()) 659 660 findClosest(level, node, distMin2, closest); 660 661 661 if (closest != NULL && tree->root == this)662 if (closest != NULL && tree->root == shared_from_this()) 662 663 /* When is this point reached? 663 664 if the preceeding findClosest was called and succesed to set closest … … 690 691 } 691 692 692 void Node::routingIntersecting(vector<Node > *routingList, NodePtr node)693 void Node::routingIntersecting(vector<NodePtr> *routingList, NodePtr node) 693 694 { 694 695 if (level==0) 695 696 { 696 697 int rank = route; 697 routingList[rank].push_back( *node);698 routingList[rank].push_back(node); 698 699 } 699 700 else … … 712 713 child[i]->free_descendants(); 713 714 if (child[i]->level) // do not attempt to delete leafs, they are delete through leafs vector 714 delete child[i];715 child[i].reset(); 715 716 } 716 717 } … … 718 719 void Node::getNodeLevel(int assignLevel, std::list<NodePtr>& NodeList) 719 720 { 720 if (level==assignLevel) NodeList.push_back( this) ;721 if (level==assignLevel) NodeList.push_back(shared_from_this()) ; 721 722 else if (level>0) for (int i = 0; i < child.size(); i++) child[i]->getNodeLevel(assignLevel,NodeList) ; 722 723 return ; … … 737 738 for (int j = 0; j < child[i]->child.size(); j++) tree->push_back(child[i]->child[j]) ; 738 739 tree->decreaseLevelSize(assignLevel) ; 739 delete child[i];740 child[i].reset() ; 740 741 } 741 742 else newChild.push_back(child[i]) ; -
XIOS/dev/dev_ym/XIOS_COUPLING/extern/remap/src/node.hpp
r923 r2269 10 10 11 11 #include "triple.hpp" 12 #include <memory> 12 13 13 14 namespace sphereRemap { … … 112 113 //#endif 113 114 114 typedef Node* NodePtr; 115 116 struct Node 115 //typedef Node* NodePtr; 116 typedef std::shared_ptr<Node> NodePtr; 117 118 struct Node : public std::enable_shared_from_this<Node> 117 119 { 118 120 int level; /* FIXME leafs are 0 and root is max level? */ … … 120 122 Coord centre; 121 123 double radius; 122 NodePtr parent, ref; 124 std::weak_ptr<Node> parent ; 125 NodePtr ref; 123 126 std::vector<NodePtr> child; 124 127 std::list<NodePtr> intersectors; … … 198 201 void printLevel(int level); 199 202 void routeNode(NodePtr node, int level); 200 void routingIntersecting(std::vector<Node >* routingList, NodePtr node);203 void routingIntersecting(std::vector<NodePtr>* routingList, NodePtr node); 201 204 void routeIntersection(std::vector<int>& routes, NodePtr node); 202 205 void getNodeLevel(int level,std::list<NodePtr>& NodeList) ; -
XIOS/dev/dev_ym/XIOS_COUPLING/extern/remap/src/parallel_tree.cpp
r1639 r2269 18 18 19 19 // only the circle is packed, rest of node will be initialized on unpacking 20 static void packNode(Node &node, char *buffer, int& index)20 static void packNode(NodePtr node, char *buffer, int& index) 21 21 { 22 22 if (buffer == NULL) // compute size only … … 24 24 else 25 25 { 26 *(Coord *)(&buffer[index]) = node .centre;26 *(Coord *)(&buffer[index]) = node->centre; 27 27 index += sizeof(Coord); 28 28 29 *(double *)(&buffer[index]) = node .radius;29 *(double *)(&buffer[index]) = node->radius; 30 30 index += sizeof(double); 31 31 } 32 32 } 33 33 34 static void unpackNode(Node &node, char *buffer, int& index)34 static void unpackNode(NodePtr node, char *buffer, int& index) 35 35 { 36 36 Coord centre; … … 43 43 index += sizeof(double); 44 44 45 node .centre = centre;46 node .radius = r;45 node->centre = centre; 46 node->radius = r; 47 47 } 48 48 … … 95 95 } 96 96 97 static void transferRoutedNodes(CMPIRouting& MPIRoute, /*const*/ vector<Node >& nodeSend, const vector<int>& route, vector<Node>& nodeRecv)97 static void transferRoutedNodes(CMPIRouting& MPIRoute, /*const*/ vector<NodePtr>& nodeSend, const vector<int>& route, vector<NodePtr>& nodeRecv) 98 98 { 99 99 /* `route` knows what goes where */ … … 104 104 } 105 105 106 static void transferRoutedIntersections(CMPIRouting& MPIRoute, const vector<Node >& nodeSend, const vector<vector<int> >& route, vector<Node>& nodeRecv)106 static void transferRoutedIntersections(CMPIRouting& MPIRoute, const vector<NodePtr>& nodeSend, const vector<vector<int> >& route, vector<NodePtr>& nodeRecv) 107 107 { 108 108 // `route` knows what goes where … … 110 110 int nRecv = MPIRoute.getTotalSourceElement(); 111 111 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); 113 113 //cout << MPIRoute.mpiRank << " ROUTE " << nRecv << ": " << nodeSend.size() << " " << nodeRecv.size() << " "; 114 114 } … … 122 122 } 123 123 124 void CParallelTree::buildSampleTreeCascade(vector<Node >& sampleNodes /*route field will be modified*/, int level)124 void CParallelTree::buildSampleTreeCascade(vector<NodePtr>& sampleNodes /*route field will be modified*/, int level) 125 125 { 126 126 buildSampleTree(treeCascade[level], sampleNodes, cascade.level[level]); … … 132 132 treeCascade[level].routeNodes(route, sampleNodes, assignLevel); 133 133 134 vector<Node > routedNodes;134 vector<NodePtr> routedNodes; 135 135 CMPIRouting mpiRoute(cascade.level[level].pg_comm); 136 136 transferRoutedNodes(mpiRoute, sampleNodes, route, routedNodes); … … 139 139 } 140 140 141 void buildSampleTree(CSampleTree& tree, const vector<Node >& node, const CCascadeLevel& comm)141 void buildSampleTree(CSampleTree& tree, const vector<NodePtr>& node, const CCascadeLevel& comm) 142 142 /* 143 143 In the beginning all the sample elements are distributed … … 175 175 for (int i = 0; i < nsend; i++) 176 176 { 177 const Node& no = node[randomArray[i]];177 const Node& no = *node[randomArray[i]]; 178 178 *((Coord *) (sendBuffer + index)) = no.centre; 179 179 index += sizeof(Coord)/sizeof(*sendBuffer); … … 210 210 randomizeArray(randomArray); 211 211 tree.leafs.resize(blocSize); 212 for(auto& it : tree.leafs) it=make_shared<Node>() ; 213 212 214 index = 0; 213 215 … … 220 222 double radius = recvBuffer[index%s]; 221 223 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; 224 226 225 227 } … … 233 235 CTimer::get("buildSampleTree(local)").suspend(); 234 236 CTimer::get("buildSampleTree(local)").print(); 235 236 237 /* End gracefully if sample tree could not be constructed with desired number of nodes on assignLevel */ 237 238 int allok, ok = (tree.levelSize[assignLevel] == comm.group_size); … … 262 263 263 264 264 void CParallelTree::buildLocalTree(const vector<Node >& node, const vector<int>& route)265 void CParallelTree::buildLocalTree(const vector<NodePtr>& node, const vector<int>& route) 265 266 { 266 267 CMPIRouting MPIRoute(communicator); … … 276 277 vector<Elt*> ptElement(node.size()); 277 278 for (int i = 0; i < node.size(); i++) 278 ptElement[i] = (Elt *) (node[i] .data);279 ptElement[i] = (Elt *) (node[i]->data); 279 280 280 281 vector<Elt*> ptLocalElement(nbLocalElements); … … 297 298 elt.id.ind = i; 298 299 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])); 300 301 } 301 302 localTree.build(localTree.leafs); … … 306 307 } 307 308 308 void CParallelTree::build(vector<Node >& node, vector<Node>& node2)309 void CParallelTree::build(vector<NodePtr>& node, vector<NodePtr>& node2) 309 310 { 310 311 … … 332 333 // assert(node2.size() > nbSampleNodes); 333 334 // assert(node.size() + node2.size() > nbSampleNodes); 334 vector<Node > sampleNodes; sampleNodes.reserve(nbSampleNodes1+nbSampleNodes2);335 vector<NodePtr> sampleNodes; sampleNodes.reserve(nbSampleNodes1+nbSampleNodes2); 335 336 336 337 vector<int> randomArray1(node.size()); … … 358 359 } 359 360 */ 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)); 362 363 363 364 /* … … 393 394 } 394 395 395 void CParallelTree::routeNodes(vector<int>& route, vector<Node >& nodes /*route field used*/, int level)396 void CParallelTree::routeNodes(vector<int>& route, vector<NodePtr>& nodes /*route field used*/, int level) 396 397 { 397 398 treeCascade[level].routeNodes(route /*assign*/, nodes, assignLevel); … … 399 400 if (level+1 < cascade.num_levels) 400 401 { 401 vector<Node > routedNodes;402 vector<NodePtr> routedNodes; 402 403 CMPIRouting MPIRoute(cascade.level[level].pg_comm); 403 404 transferRoutedNodes(MPIRoute, nodes, route /*use*/, routedNodes); … … 438 439 } 439 440 440 void CParallelTree::routeIntersections(vector<vector<int> >& routes, vector<Node >& nodes, int level)441 void CParallelTree::routeIntersections(vector<vector<int> >& routes, vector<NodePtr>& nodes, int level) 441 442 { 442 443 treeCascade[level].routeIntersections(routes /*assign*/, nodes); … … 444 445 if (level+1 < cascade.num_levels) 445 446 { 446 vector<Node > routedNodes;447 vector<NodePtr> routedNodes; 447 448 CMPIRouting MPIRoute(cascade.level[level].pg_comm); 448 449 449 450 vector<int> flattenedRoutes1; 450 451 linearize(routes, flattenedRoutes1); 451 vector<Node > double_nodes(flattenedRoutes1.size());452 vector<NodePtr> double_nodes(flattenedRoutes1.size()); 452 453 int j = 0; 453 454 for (int i = 0; i < routes.size(); ++i) 454 455 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 } 456 460 transferRoutedNodes(MPIRoute, double_nodes, flattenedRoutes1 /*use*/, routedNodes); 457 461 vector<vector<int> > globalRanks(routedNodes.size()); -
XIOS/dev/dev_ym/XIOS_COUPLING/extern/remap/src/parallel_tree.hpp
r1639 r2269 15 15 ~CParallelTree(); 16 16 17 void build(vector<Node >& node, vector<Node>& node2);17 void build(vector<NodePtr>& node, vector<NodePtr>& node2); 18 18 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); 21 21 22 22 int nbLocalElements; … … 27 27 private: 28 28 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); 31 31 void buildRouteTree(); 32 32 … … 38 38 }; 39 39 40 void buildSampleTree(CSampleTree& tree, const vector<Node >& node, const CCascadeLevel& comm);40 void buildSampleTree(CSampleTree& tree, const vector<NodePtr>& node, const CCascadeLevel& comm); 41 41 42 42 } -
XIOS/dev/dev_ym/XIOS_COUPLING/extern/remap/src/timerRemap.cpp
r694 r2269 60 60 return *(it->second); 61 61 } 62 63 void CTimer::release(void) 64 { 65 for(auto & it : allTimer) delete it.second ; 66 allTimer.clear() ; 62 67 } 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__ 3 3 4 4 #include "mpi.hpp" … … 29 29 static double getTime(void); 30 30 static CTimer& get(string name); 31 }; 32 33 31 static void release(void) ; 32 } ; 34 33 35 34 } -
XIOS/dev/dev_ym/XIOS_COUPLING/extern/remap/src/tree.cpp
r1158 r2269 27 27 */ 28 28 29 void CBasicTree::routeNodes(vector<int>& route, vector<Node >& nodes, int assignLevel)29 void CBasicTree::routeNodes(vector<int>& route, vector<NodePtr>& nodes, int assignLevel) 30 30 { 31 31 for (int i = 0; i < nodes.size(); i++) 32 32 { 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 38 void CBasicTree::routeIntersections(vector<vector<int> >& routes, vector<NodePtr>& nodes) 39 39 { 40 40 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 44 void CBasicTree::build(vector<NodePtr>& nodes) 45 45 { 46 46 newRoot(1); … … 80 80 push_back(node); 81 81 82 NodePtr q ;82 NodePtr q=make_shared<Node>(); 83 83 while (pool.size()) 84 84 { … … 88 88 if (ri) 89 89 { 90 delete q;90 q.reset(); 91 91 ri = 0; 92 92 } … … 103 103 if (ri) 104 104 { 105 delete q;105 q.reset(); 106 106 ri = 0; 107 107 } … … 137 137 void CBasicTree::newRoot(int level) // newroot <- root 138 138 { 139 root = new Node;139 root = make_shared<Node>(); 140 140 // if (level > 1) cout << " newRoot level " << level << endl; 141 141 root->level = level; 142 root->parent = 0;142 root->parent.reset() ; 143 143 root->leafCount = 0; 144 144 // initialize root node on the sphere … … 155 155 //FIXME uncomment the next line and figure out why it segfault sometimes 156 156 //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 160 void CTree::insertNodes(vector<NodePtr>& nodes) 161 161 { 162 162 int stepSlim = MAX_NODE_SZ*MAX_NODE_SZ*2; … … 164 164 for (int i = 0; i < nodes.size(); i++) 165 165 { 166 insertNode( &nodes[i]);166 insertNode(nodes[i]); 167 167 168 168 if (root->leafCount > stepSlim) // time for slim down … … 175 175 176 176 177 void CSampleTree::insertNodes(vector<Node >& nodes)177 void CSampleTree::insertNodes(vector<NodePtr>& nodes) 178 178 { 179 179 bool first1 = true; … … 184 184 int i ; 185 185 186 // cout<<"CSampleTree::insertNodes : nb node to be inserted : "<<nodes.size()<<endl ;187 186 for (i = 0; i < nodes.size(); i++) 188 187 { 189 insertNode( &nodes[i]);188 insertNode(nodes[i]); 190 189 191 190 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 20 20 int ri; /** this is set to one by a node in case of reinsertion */ 21 21 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 */ 23 23 24 24 CBasicTree() : ri(0), levelSize(MAX_LEVEL_SIZE), root(NULL), isAssignedLevel(false), okSplit(true), isActiveOkSplit(false) {} 25 25 ~CBasicTree(); 26 void build(vector<Node >& nodes);26 void build(vector<NodePtr>& nodes); 27 27 void slim(int nbIts = 1); 28 virtual void insertNodes(vector<Node >& node) = 0;28 virtual void insertNodes(vector<NodePtr>& node) = 0; 29 29 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); 32 32 33 33 void push_back(NodePtr node); … … 63 63 { 64 64 public: 65 void insertNodes(vector<Node >& nodes);65 void insertNodes(vector<NodePtr>& nodes); 66 66 }; 67 67 … … 73 73 void slimAssignedLevel() ; 74 74 void removeExtraNode(void) ; 75 void insertNodes(vector<Node >& nodes);75 void insertNodes(vector<NodePtr>& nodes); 76 76 }; 77 77
Note: See TracChangeset
for help on using the changeset viewer.