Ignore:
Timestamp:
08/26/16 15:07:20 (8 years ago)
Author:
ymipsl
Message:

Improve remapper :

  • increase stability for smal grid remapping
  • increase stability for large number of processes

YM

File:
1 edited

Legend:

Unmodified
Added
Removed
  • XIOS/trunk/extern/remap/src/parallel_tree.cpp

    r898 r923  
    114114} 
    115115 
    116 CParallelTree::CParallelTree(MPI_Comm comm) : communicator(comm), cascade(MIN_NODE_SZ*MIN_NODE_SZ, comm) 
     116//CParallelTree::CParallelTree(MPI_Comm comm) : communicator(comm), cascade(MIN_NODE_SZ*MIN_NODE_SZ, comm) 
     117CParallelTree::CParallelTree(MPI_Comm comm) : communicator(comm), cascade(MAX_NODE_SZ*MAX_NODE_SZ*2, comm) 
    117118{ 
    118119        treeCascade.reserve(cascade.num_levels); 
     
    188189 
    189190        /* unpack */ 
     191/* 
    190192        randomArray.resize(nrecv); 
    191193        randomizeArray(randomArray); 
    192194        tree.leafs.resize(nrecv); 
    193195        index = 0; 
    194         for (int i = 0; i < nrecv; i++) 
     196 
     197 
     198  for (int i = 0; i < nrecv; i++) 
    195199        { 
    196200                Coord x = *(Coord *)(&recvBuffer[index]); 
     
    201205 
    202206        } 
     207*/ 
     208 
     209  randomArray.resize(blocSize); 
     210        randomizeArray(randomArray); 
     211        tree.leafs.resize(blocSize); 
     212        index = 0; 
     213   
     214  size_t s=(sizeof(Coord)/sizeof(*recvBuffer)+1)*nrecv ; 
     215   
     216  for (int i = 0; i < blocSize; i++) 
     217        { 
     218                Coord x = *(Coord *)(&recvBuffer[index%s]); 
     219                index += sizeof(Coord)/sizeof(*recvBuffer); 
     220                double radius = recvBuffer[index%s]; 
     221    index++ ; 
     222                tree.leafs[randomArray[i]].centre = x; 
     223                tree.leafs[randomArray[i]].radius = radius; 
     224 
     225        } 
     226 
    203227 
    204228        delete [] recvBuffer; 
     
    206230        CTimer::get("buildSampleTree(local)").resume(); 
    207231        tree.build(tree.leafs); 
    208         cout << "SampleTree build : assign Level " << assignLevel << " nb Nodes : " << tree.levelSize[assignLevel] << endl; 
     232//      cout << "SampleTree build : assign Level " << assignLevel << " nb Nodes : " << tree.levelSize[assignLevel] << endl; 
    209233        CTimer::get("buildSampleTree(local)").suspend(); 
    210234        CTimer::get("buildSampleTree(local)").print(); 
     
    214238        if (!ok) 
    215239  { 
    216     cerr << comm.rank << ": PROBLEM: (node assign)" << tree.levelSize[assignLevel] << " != " << comm.group_size << " (keepNodes)" << endl; 
     240    cerr << comm.rank << ": PROBLEM: (node assign)" << tree.levelSize[assignLevel] << " != " << comm.group_size << " (keepNodes)"  
     241         << "   node size : "<<node.size()<<"   bloc size : "<<blocSize<<"  total number of leaf : "<<tree.leafs.size()<<endl ; 
    217242/* 
    218243        MPI_Allreduce(&ok, &allok, 1, MPI_INT, MPI_PROD, communicator); 
     
    224249    MPI_Abort(MPI_COMM_WORLD,-1) ; 
    225250  } 
     251/* 
    226252  cout<<"*******************************************"<<endl ; 
    227253  cout<<"******* Sample Tree output        *********"<<endl ; 
     
    230256 
    231257  cout<<"*******************************************"<<endl ; 
    232  
     258*/ 
    233259 
    234260  assert(tree.root->incluCheck() == 0); 
Note: See TracChangeset for help on using the changeset viewer.