Ignore:
Timestamp:
01/23/19 10:31:44 (5 years ago)
Author:
yushan
Message:

dev on ADA. add flag switch _usingEP/_usingMPI

Location:
XIOS/dev/branch_openmp/src/transformation
Files:
42 edited

Legend:

Unmodified
Added
Removed
  • XIOS/dev/branch_openmp/src/transformation/Functions/reduction.cpp

    r1339 r1642  
    99 
    1010CReductionAlgorithm::CallBackMap* CReductionAlgorithm::reductionCreationCallBacks_ = 0; 
    11 std::map<StdString,EReductionType> *CReductionAlgorithm::ReductionOperations_ptr = 0; 
    12  
     11std::map<StdString,EReductionType> CReductionAlgorithm::ReductionOperations = std::map<StdString,EReductionType>(); 
    1312bool CReductionAlgorithm::initReductionOperation(std::map<StdString,EReductionType>& m) 
    1413{ 
     
    3029} 
    3130 
    32 bool CReductionAlgorithm::initReductionOperation() 
    33 { 
    34   CReductionAlgorithm::ReductionOperations_ptr = new std::map<StdString,EReductionType>(); 
    35   // So so stupid way to intialize operation but it works ... 
    36   (*CReductionAlgorithm::ReductionOperations_ptr)["sum"] = TRANS_REDUCE_SUM; 
    37   CSumReductionAlgorithm::registerTrans(); 
    38  
    39   (*CReductionAlgorithm::ReductionOperations_ptr)["min"] = TRANS_REDUCE_MIN; 
    40   CMinReductionAlgorithm::registerTrans(); 
    41  
    42   (*CReductionAlgorithm::ReductionOperations_ptr)["max"] = TRANS_REDUCE_MAX; 
    43   CMaxReductionAlgorithm::registerTrans(); 
    44  
    45   (*CReductionAlgorithm::ReductionOperations_ptr)["extract"] = TRANS_REDUCE_EXTRACT; 
    46   CExtractReductionAlgorithm::registerTrans(); 
    47  
    48   (*CReductionAlgorithm::ReductionOperations_ptr)["average"] = TRANS_REDUCE_AVERAGE; 
    49   CAverageReductionAlgorithm::registerTrans(); 
    50 } 
    51  
    52 //bool CReductionAlgorithm::_dummyInit = CReductionAlgorithm::initReductionOperation(CReductionAlgorithm::ReductionOperations); 
    53 //bool CReductionAlgorithm::_dummyInit = CReductionAlgorithm::initReductionOperation(); 
     31bool CReductionAlgorithm::_dummyInit = CReductionAlgorithm::initReductionOperation(CReductionAlgorithm::ReductionOperations); 
    5432 
    5533CReductionAlgorithm* CReductionAlgorithm::createOperation(EReductionType reduceType) 
  • XIOS/dev/branch_openmp/src/transformation/Functions/reduction.hpp

    r1545 r1642  
    2323{ 
    2424public: 
    25   static std::map<StdString,EReductionType> *ReductionOperations_ptr; 
    26   #pragma omp threadprivate(ReductionOperations_ptr) 
     25  static std::map<StdString,EReductionType> ReductionOperations; 
     26 
    2727public: 
    2828  CReductionAlgorithm() {} 
     
    6161  typedef std::map<EReductionType, CreateOperationCallBack> CallBackMap; 
    6262  static CallBackMap* reductionCreationCallBacks_; 
    63   #pragma omp threadprivate(reductionCreationCallBacks_) 
    6463 
    6564  static bool registerOperation(EReductionType reduceType, CreateOperationCallBack createFn); 
     
    6867protected: 
    6968  static bool initReductionOperation(std::map<StdString,EReductionType>& m); 
    70   static bool initReductionOperation(); 
    7169  static bool _dummyInit; 
    72   #pragma omp threadprivate(_dummyInit) 
    7370}; 
    7471 
  • XIOS/dev/branch_openmp/src/transformation/algo_types.hpp

    r1460 r1642  
    1717#include "axis_algorithm_zoom.hpp" 
    1818#include "axis_algorithm_interpolate.hpp" 
     19#include "axis_algorithm_extract.hpp" 
    1920#include "axis_algorithm_reduce_domain.hpp" 
    2021#include "axis_algorithm_reduce_axis.hpp" 
     
    3031#include "scalar_algorithm_reduce_scalar.hpp" 
    3132#include "domain_algorithm_reorder.hpp" 
     33#include "domain_algorithm_extract.hpp" 
    3234 
    3335 
  • XIOS/dev/branch_openmp/src/transformation/axis_algorithm_duplicate_scalar.cpp

    r1460 r1642  
    2121                                                                     std::map<int, int>& elementPositionInGridDst2AxisPosition, 
    2222                                                                     std::map<int, int>& elementPositionInGridDst2DomainPosition) 
     23TRY 
    2324{ 
    2425  std::vector<CAxis*> axisListDestP = gridDst->getAxis(); 
     
    3132  return (new CAxisAlgorithmDuplicateScalar(axisListDestP[axisDstIndex], scalarListSrcP[scalarSrcIndex], duplicateScalar)); 
    3233} 
     34CATCH 
    3335 
    3436bool CAxisAlgorithmDuplicateScalar::registerTrans() 
     37TRY 
    3538{ 
    3639  CGridTransformationFactory<CAxis>::registerTransformation(TRANS_DUPLICATE_SCALAR_TO_AXIS, create); 
    3740} 
     41CATCH 
    3842 
    3943 
     
    5054 
    5155void CAxisAlgorithmDuplicateScalar::computeIndexSourceMapping_(const std::vector<CArray<double,1>* >& dataAuxInputs) 
     56TRY 
    5257{ 
    5358  this->transformationMapping_.resize(1); 
     
    6974  } 
    7075} 
    71  
     76CATCH 
    7277} 
  • XIOS/dev/branch_openmp/src/transformation/axis_algorithm_extract_domain.cpp

    r1545 r1642  
    1313#include "grid.hpp" 
    1414#include "grid_transformation_factory_impl.hpp" 
     15#include "reduction.hpp" 
    1516 
    1617namespace xios { 
     
    2425                                                                     std::map<int, int>& elementPositionInGridDst2AxisPosition, 
    2526                                                                     std::map<int, int>& elementPositionInGridDst2DomainPosition) 
     27TRY 
    2628{ 
    2729  std::vector<CAxis*> axisListDestP = gridDst->getAxis(); 
     
    3436  return (new CAxisAlgorithmExtractDomain(axisListDestP[axisDstIndex], domainListSrcP[domainSrcIndex], extractDomain)); 
    3537} 
     38CATCH 
    3639 
    3740//bool CAxisAlgorithmExtractDomain::_dummyRegistered = CAxisAlgorithmExtractDomain::registerTrans(); 
    3841bool CAxisAlgorithmExtractDomain::registerTrans() 
     42TRY 
    3943{ 
    4044  CGridTransformationFactory<CAxis>::registerTransformation(TRANS_EXTRACT_DOMAIN_TO_AXIS, create); 
    4145} 
     46CATCH 
    4247 
    4348 
    4449CAxisAlgorithmExtractDomain::CAxisAlgorithmExtractDomain(CAxis* axisDestination, CDomain* domainSource, CExtractDomainToAxis* algo) 
    4550 : CAxisAlgorithmTransformation(axisDestination, domainSource), pos_(-1), reduction_(0) 
     51TRY 
    4652{ 
    4753  algo->checkValid(axisDestination, domainSource); 
     
    6167 
    6268  pos_ = algo->position; 
    63   if(CReductionAlgorithm::ReductionOperations_ptr == 0)  
    64   { 
    65     CReductionAlgorithm::initReductionOperation(); 
    66   } 
    67   reduction_ = CReductionAlgorithm::createOperation(CReductionAlgorithm::ReductionOperations_ptr->at(op)); 
     69  reduction_ = CReductionAlgorithm::createOperation(CReductionAlgorithm::ReductionOperations[op]); 
    6870} 
     71CATCH 
    6972 
    7073void CAxisAlgorithmExtractDomain::apply(const std::vector<std::pair<int,double> >& localIndex, 
     
    7376                                        std::vector<bool>& flagInitial,                      
    7477                                        bool ignoreMissingValue, bool firstPass) 
     78TRY 
    7579{ 
    7680  reduction_->apply(localIndex, dataInput, dataOut, flagInitial, ignoreMissingValue, firstPass); 
    7781} 
     82CATCH 
    7883 
    7984CAxisAlgorithmExtractDomain::~CAxisAlgorithmExtractDomain() 
     85TRY 
    8086{ 
    8187  if (0 != reduction_) delete reduction_; 
    8288} 
     89CATCH 
    8390 
    8491void CAxisAlgorithmExtractDomain::computeIndexSourceMapping_(const std::vector<CArray<double,1>* >& dataAuxInputs) 
     92TRY 
    8593{ 
    8694  this->transformationMapping_.resize(1); 
     
    120128  {} 
    121129} 
    122  
     130CATCH 
    123131} 
  • XIOS/dev/branch_openmp/src/transformation/axis_algorithm_extract_domain.hpp

    r1339 r1642  
    1313#include "transformation.hpp" 
    1414 
    15 #include "reduction.hpp" 
    1615namespace xios { 
    1716 
     
    2625  Extract a domain to an axis 
    2726*/ 
    28 class CAxisAlgorithmExtractDomain : public CAxisAlgorithmTransformation, public CReductionAlgorithm 
     27class CAxisAlgorithmExtractDomain : public CAxisAlgorithmTransformation 
    2928{ 
    3029public: 
  • XIOS/dev/branch_openmp/src/transformation/axis_algorithm_interpolate.cpp

    r1460 r1642  
    2929                                                                   std::map<int, int>& elementPositionInGridDst2AxisPosition, 
    3030                                                                   std::map<int, int>& elementPositionInGridDst2DomainPosition) 
     31TRY 
    3132{ 
    3233  std::vector<CAxis*> axisListDestP = gridDst->getAxis(); 
     
    3940  return (new CAxisAlgorithmInterpolate(axisListDestP[axisDstIndex], axisListSrcP[axisSrcIndex], interpolateAxis)); 
    4041} 
     42CATCH 
    4143 
    4244bool CAxisAlgorithmInterpolate::registerTrans() 
     45TRY 
    4346{ 
    4447  CGridTransformationFactory<CAxis>::registerTransformation(TRANS_INTERPOLATE_AXIS, create); 
    4548} 
    46  
     49CATCH 
    4750 
    4851CAxisAlgorithmInterpolate::CAxisAlgorithmInterpolate(CAxis* axisDestination, CAxis* axisSource, CInterpolateAxis* interpAxis) 
    4952: CAxisAlgorithmTransformation(axisDestination, axisSource), coordinate_(), transPosition_() 
     53TRY 
    5054{ 
    5155  interpAxis->checkValid(axisSource); 
     
    5862  } 
    5963} 
     64CATCH 
    6065 
    6166/*! 
     
    6368*/ 
    6469void CAxisAlgorithmInterpolate::computeIndexSourceMapping_(const std::vector<CArray<double,1>* >& dataAuxInputs) 
     70TRY 
    6571{ 
    6672  CTimer::get("CAxisAlgorithmInterpolate::computeIndexSourceMapping_").resume() ; 
     
    8894  CTimer::get("CAxisAlgorithmInterpolate::computeIndexSourceMapping_").suspend() ; 
    8995} 
     96CATCH 
    9097 
    9198/*! 
     
    98105                                                        const std::vector<int>& indexVec, 
    99106                                                        int transPos) 
     107TRY 
    100108{ 
    101109  std::vector<double>::const_iterator itb = axisValue.begin(), ite = axisValue.end(); 
     
    162170  computeWeightedValueAndMapping(interpolatingIndexValues, transPos); 
    163171} 
     172CATCH 
    164173 
    165174/*! 
     
    168177*/ 
    169178void CAxisAlgorithmInterpolate::computeWeightedValueAndMapping(const std::map<int, std::vector<std::pair<int,double> > >& interpolatingIndexValues, int transPos) 
     179TRY 
    170180{ 
    171181  TransformationIndexMap& transMap = this->transformationMapping_[transPos]; 
     
    205215 
    206216} 
     217CATCH 
    207218 
    208219/*! 
     
    213224void CAxisAlgorithmInterpolate::retrieveAllAxisValue(const CArray<double,1>& axisValue, const CArray<bool,1>& axisMask, 
    214225                                                     std::vector<double>& recvBuff, std::vector<int>& indexVec) 
     226TRY 
    215227{ 
    216228  CContext* context = CContext::getCurrent(); 
     
    260272 
    261273    int* recvCount=new int[nbClient]; 
    262     MPI_Allgather(&numValue,1,MPI_INT,recvCount,1,MPI_INT,client->intraComm); 
     274    ep_lib::MPI_Allgather(&numValue,1,EP_INT,recvCount,1,EP_INT,client->intraComm); 
    263275 
    264276    int* displ=new int[nbClient]; 
     
    267279 
    268280    // Each client have enough global info of axis 
    269     MPI_Allgatherv(sendIndexBuff,numValue,MPI_INT,recvIndexBuff,recvCount,displ,MPI_INT,client->intraComm); 
    270     MPI_Allgatherv(sendValueBuff,numValue,MPI_DOUBLE,&(recvBuff[0]),recvCount,displ,MPI_DOUBLE,client->intraComm); 
     281    ep_lib::MPI_Allgatherv(sendIndexBuff,numValue,EP_INT,recvIndexBuff,recvCount,displ,EP_INT,client->intraComm); 
     282    ep_lib::MPI_Allgatherv(sendValueBuff,numValue,EP_DOUBLE,&(recvBuff[0]),recvCount,displ,EP_DOUBLE,client->intraComm); 
    271283 
    272284    for (int idx = 0; idx < srcSize; ++idx) 
     
    282294  } 
    283295} 
     296CATCH 
    284297 
    285298/*! 
     
    289302void CAxisAlgorithmInterpolate::fillInAxisValue(std::vector<CArray<double,1> >& vecAxisValue, 
    290303                                                const std::vector<CArray<double,1>* >& dataAuxInputs) 
     304TRY 
    291305{ 
    292306  if (coordinate_.empty()) 
     
    377391  } 
    378392} 
    379  
    380 } 
     393CATCH 
     394 
     395} 
  • XIOS/dev/branch_openmp/src/transformation/axis_algorithm_inverse.cpp

    r1545 r1642  
    1515#include "inverse_axis.hpp" 
    1616#include "client_client_dht_template.hpp" 
    17 using namespace ep_lib; 
    1817 
    1918namespace xios { 
     
    2827                                                               std::map<int, int>& elementPositionInGridDst2AxisPosition, 
    2928                                                               std::map<int, int>& elementPositionInGridDst2DomainPosition) 
     29TRY 
    3030{ 
    3131  std::vector<CAxis*> axisListDestP = gridDst->getAxis(); 
     
    3838  return (new CAxisAlgorithmInverse(axisListDestP[axisDstIndex], axisListSrcP[axisSrcIndex], inverseAxis)); 
    3939} 
     40CATCH 
    4041 
    4142bool CAxisAlgorithmInverse::registerTrans() 
     43TRY 
    4244{ 
    4345  CGridTransformationFactory<CAxis>::registerTransformation(TRANS_INVERSE_AXIS, create); 
    4446} 
    45  
     47CATCH 
    4648 
    4749CAxisAlgorithmInverse::CAxisAlgorithmInverse(CAxis* axisDestination, CAxis* axisSource, CInverseAxis* inverseAxis) 
    4850 : CAxisAlgorithmTransformation(axisDestination, axisSource) 
     51TRY 
    4952{ 
    5053  if (axisDestination->n_glo.getValue() != axisSource->n_glo.getValue()) 
     
    5659  } 
    5760} 
     61CATCH 
    5862 
    5963void CAxisAlgorithmInverse::computeIndexSourceMapping_(const std::vector<CArray<double,1>* >& dataAuxInputs) 
     64TRY 
    6065{ 
    6166  this->transformationMapping_.resize(1); 
     
    8388  } 
    8489} 
     90CATCH 
    8591 
    8692/*! 
     
    8995*/ 
    9096void CAxisAlgorithmInverse::updateAxisValue() 
     97TRY 
    9198{ 
    9299  CContext* context = CContext::getCurrent(); 
     
    154161    sendRankSizeMap[itIndex->first] = sendSize; 
    155162  } 
    156   MPI_Allgather(&connectedClient,1,MPI_INT,recvCount,1,MPI_INT,client->intraComm); 
     163  ep_lib::MPI_Allgather(&connectedClient,1,EP_INT,recvCount,1,EP_INT,client->intraComm); 
    157164 
    158165  displ[0]=0 ; 
     
    161168  int* recvRankBuff=new int[recvSize]; 
    162169  int* recvSizeBuff=new int[recvSize]; 
    163   MPI_Allgatherv(sendRankBuff,connectedClient,MPI_INT,recvRankBuff,recvCount,displ,MPI_INT,client->intraComm); 
    164   MPI_Allgatherv(sendSizeBuff,connectedClient,MPI_INT,recvSizeBuff,recvCount,displ,MPI_INT,client->intraComm); 
     170  ep_lib::MPI_Allgatherv(sendRankBuff,connectedClient,EP_INT,recvRankBuff,recvCount,displ,EP_INT,client->intraComm); 
     171  ep_lib::MPI_Allgatherv(sendSizeBuff,connectedClient,EP_INT,recvSizeBuff,recvCount,displ,EP_INT,client->intraComm); 
    165172  for (int i = 0; i < nbClient; ++i) 
    166173  { 
     
    174181 
    175182  // Sending global index of grid source to corresponding process as well as the corresponding mask 
    176   std::vector<MPI_Request> requests; 
    177   std::vector<MPI_Status> status; 
     183  std::vector<ep_lib::MPI_Request> requests; 
     184  std::vector<ep_lib::MPI_Status> status; 
    178185  std::unordered_map<int, unsigned long* > recvGlobalIndexSrc; 
    179186  std::unordered_map<int, double* > sendValueToDest; 
     
    185192    sendValueToDest[recvRank] = new double [recvSize]; 
    186193 
    187     requests.push_back(MPI_Request()); 
    188     MPI_Irecv(recvGlobalIndexSrc[recvRank], recvSize, MPI_UNSIGNED_LONG, recvRank, 46, client->intraComm, &requests.back()); 
     194    requests.push_back(ep_lib::MPI_Request()); 
     195    ep_lib::MPI_Irecv(recvGlobalIndexSrc[recvRank], recvSize, EP_UNSIGNED_LONG, recvRank, 46, client->intraComm, &requests.back()); 
    189196  } 
    190197 
     
    207214 
    208215    // Send global index source and mask 
    209     requests.push_back(MPI_Request()); 
    210     MPI_Isend(sendGlobalIndexSrc[sendRank], sendSize, MPI_UNSIGNED_LONG, sendRank, 46, client->intraComm, &requests.back()); 
     216    requests.push_back(ep_lib::MPI_Request()); 
     217    ep_lib::MPI_Isend(sendGlobalIndexSrc[sendRank], sendSize, EP_UNSIGNED_LONG, sendRank, 46, client->intraComm, &requests.back()); 
    211218  } 
    212219 
    213220  status.resize(requests.size()); 
    214   MPI_Waitall(requests.size(), &requests[0], &status[0]); 
    215  
    216  
    217   std::vector<MPI_Request>().swap(requests); 
    218   std::vector<MPI_Status>().swap(status); 
     221  ep_lib::MPI_Waitall(requests.size(), &requests[0], &status[0]); 
     222 
     223 
     224  std::vector<ep_lib::MPI_Request>().swap(requests); 
     225  std::vector<ep_lib::MPI_Status>().swap(status); 
    219226 
    220227  // Okie, on destination side, we will wait for information of masked index of source 
     
    224231    int recvSize = itSend->second; 
    225232 
    226     requests.push_back(MPI_Request()); 
    227     MPI_Irecv(recvValueFromSrc[recvRank], recvSize, MPI_DOUBLE, recvRank, 48, client->intraComm, &requests.back()); 
     233    requests.push_back(ep_lib::MPI_Request()); 
     234    ep_lib::MPI_Irecv(recvValueFromSrc[recvRank], recvSize, EP_DOUBLE, recvRank, 48, client->intraComm, &requests.back()); 
    228235  } 
    229236 
     
    242249    } 
    243250    // Okie, now inform the destination which source index are masked 
    244     requests.push_back(MPI_Request()); 
    245     MPI_Isend(sendValueToDest[recvRank], recvSize, MPI_DOUBLE, recvRank, 48, client->intraComm, &requests.back()); 
     251    requests.push_back(ep_lib::MPI_Request()); 
     252    ep_lib::MPI_Isend(sendValueToDest[recvRank], recvSize, EP_DOUBLE, recvRank, 48, client->intraComm, &requests.back()); 
    246253  } 
    247254  status.resize(requests.size()); 
    248   MPI_Waitall(requests.size(), &requests[0], &status[0]); 
     255  ep_lib::MPI_Waitall(requests.size(), &requests[0], &status[0]); 
    249256 
    250257 
     
    283290    delete [] itLong->second; 
    284291} 
    285  
    286 } 
     292CATCH 
     293 
     294} 
  • XIOS/dev/branch_openmp/src/transformation/axis_algorithm_reduce_axis.cpp

    r1545 r1642  
    1212#include "grid.hpp" 
    1313#include "grid_transformation_factory_impl.hpp" 
     14#include "reduction.hpp" 
    1415 
    1516namespace xios { 
     
    2324                                                                   std::map<int, int>& elementPositionInGridDst2AxisPosition, 
    2425                                                                   std::map<int, int>& elementPositionInGridDst2DomainPosition) 
     26TRY 
    2527{ 
    2628  std::vector<CAxis*> axisListDestP = gridDst->getAxis(); 
     
    3335  return (new CAxisAlgorithmReduceAxis(axisListDestP[axisDstIndex], axisListSrcP[axisSrcIndex], reduceAxis)); 
    3436} 
     37CATCH 
    3538 
    3639bool CAxisAlgorithmReduceAxis::registerTrans() 
     40TRY 
    3741{ 
    3842  CGridTransformationFactory<CAxis>::registerTransformation(TRANS_REDUCE_AXIS_TO_AXIS, create); 
    3943} 
     44CATCH 
    4045 
    4146 
    4247CAxisAlgorithmReduceAxis::CAxisAlgorithmReduceAxis(CAxis* axisDestination, CAxis* axisSource, CReduceAxisToAxis* algo) 
    4348 : CAxisAlgorithmTransformation(axisDestination, axisSource), reduction_(0) 
     49TRY 
    4450{ 
    4551  eliminateRedondantSrc_= false ; 
     
    6773 
    6874  } 
    69   if(CReductionAlgorithm::ReductionOperations_ptr == 0)  
    70   { 
    71     CReductionAlgorithm::initReductionOperation(); 
    72   } 
    7375 
    74   reduction_ = CReductionAlgorithm::createOperation(CReductionAlgorithm::ReductionOperations_ptr->at(op)); 
     76  reduction_ = CReductionAlgorithm::createOperation(CReductionAlgorithm::ReductionOperations[op]); 
    7577} 
     78CATCH 
    7679 
    7780void CAxisAlgorithmReduceAxis::apply(const std::vector<std::pair<int,double> >& localIndex, 
     
    8083                                       std::vector<bool>& flagInitial,                      
    8184                                       bool ignoreMissingValue, bool firstPass) 
     85TRY 
    8286{ 
    8387  reduction_->apply(localIndex, dataInput, dataOut, flagInitial, ignoreMissingValue, firstPass); 
    8488} 
     89CATCH 
    8590 
    8691void CAxisAlgorithmReduceAxis::updateData(CArray<double,1>& dataOut) 
     92TRY 
    8793{ 
    8894  reduction_->updateData(dataOut); 
    8995} 
     96CATCH 
    9097 
    9198CAxisAlgorithmReduceAxis::~CAxisAlgorithmReduceAxis() 
     99TRY 
    92100{ 
    93101  if (0 != reduction_) delete reduction_; 
    94102} 
     103CATCH 
    95104 
    96105void CAxisAlgorithmReduceAxis::computeIndexSourceMapping_(const std::vector<CArray<double,1>* >& dataAuxInputs) 
     106TRY 
    97107{ 
    98108  this->transformationMapping_.resize(1); 
     
    112122  } 
    113123} 
     124CATCH 
    114125 
    115126} 
  • XIOS/dev/branch_openmp/src/transformation/axis_algorithm_reduce_axis.hpp

    r1460 r1642  
    1212#include "axis_algorithm_transformation.hpp" 
    1313#include "transformation.hpp" 
    14 #include "reduction.hpp" 
    1514 
    1615namespace xios { 
     
    2423  Reduce a axis to an axis 
    2524*/ 
    26 class CAxisAlgorithmReduceAxis : public CAxisAlgorithmTransformation, public CReductionAlgorithm 
     25class CAxisAlgorithmReduceAxis : public CAxisAlgorithmTransformation 
    2726{ 
    2827public: 
  • XIOS/dev/branch_openmp/src/transformation/axis_algorithm_reduce_domain.cpp

    r1545 r1642  
    1313#include "grid.hpp" 
    1414#include "grid_transformation_factory_impl.hpp" 
    15  
     15#include "reduction.hpp" 
    1616 
    1717namespace xios { 
     
    2525                                                                   std::map<int, int>& elementPositionInGridDst2AxisPosition, 
    2626                                                                   std::map<int, int>& elementPositionInGridDst2DomainPosition) 
     27TRY 
    2728{ 
    2829  std::vector<CAxis*> axisListDestP = gridDst->getAxis(); 
     
    3536  return (new CAxisAlgorithmReduceDomain(axisListDestP[axisDstIndex], domainListSrcP[domainSrcIndex], reduceDomain)); 
    3637} 
     38CATCH 
    3739 
    3840bool CAxisAlgorithmReduceDomain::registerTrans() 
     41TRY 
    3942{ 
    4043  CGridTransformationFactory<CAxis>::registerTransformation(TRANS_REDUCE_DOMAIN_TO_AXIS, create); 
    4144} 
     45CATCH 
    4246 
    4347 
    4448CAxisAlgorithmReduceDomain::CAxisAlgorithmReduceDomain(CAxis* axisDestination, CDomain* domainSource, CReduceDomainToAxis* algo) 
    4549 : CAxisAlgorithmTransformation(axisDestination, domainSource), reduction_(0) 
     50TRY 
    4651{ 
    4752  algo->checkValid(axisDestination, domainSource); 
     
    7075 
    7176  dir_ = (CReduceDomainToAxis::direction_attr::iDir == algo->direction)  ? iDir : jDir; 
    72   if(CReductionAlgorithm::ReductionOperations_ptr == 0)  
    73   { 
    74     CReductionAlgorithm::initReductionOperation(); 
    75   } 
    76   reduction_ = CReductionAlgorithm::createOperation(CReductionAlgorithm::ReductionOperations_ptr->at(op)); 
     77  reduction_ = CReductionAlgorithm::createOperation(CReductionAlgorithm::ReductionOperations[op]); 
    7778  local = algo->local ; 
    7879} 
     80CATCH 
    7981 
    8082void CAxisAlgorithmReduceDomain::apply(const std::vector<std::pair<int,double> >& localIndex, 
     
    8385                                       std::vector<bool>& flagInitial,                      
    8486                                       bool ignoreMissingValue, bool firstPass) 
     87TRY 
    8588{ 
    8689  reduction_->apply(localIndex, dataInput, dataOut, flagInitial, ignoreMissingValue, firstPass); 
    8790} 
     91CATCH 
    8892 
    8993void CAxisAlgorithmReduceDomain::updateData(CArray<double,1>& dataOut) 
     94TRY 
    9095{ 
    9196  reduction_->updateData(dataOut); 
    9297} 
     98CATCH 
    9399 
    94100CAxisAlgorithmReduceDomain::~CAxisAlgorithmReduceDomain() 
     101TRY 
    95102{ 
    96103  if (0 != reduction_) delete reduction_; 
    97104} 
     105CATCH 
    98106 
    99107void CAxisAlgorithmReduceDomain::computeIndexSourceMapping_(const std::vector<CArray<double,1>* >& dataAuxInputs) 
     108TRY 
    100109{ 
    101110  this->transformationMapping_.resize(1); 
     
    178187  {} 
    179188} 
     189CATCH 
    180190 
    181191} 
  • XIOS/dev/branch_openmp/src/transformation/axis_algorithm_reduce_domain.hpp

    r1460 r1642  
    1212#include "axis_algorithm_transformation.hpp" 
    1313#include "transformation.hpp" 
    14 #include "reduction.hpp" 
    1514 
    1615namespace xios { 
     
    2524  Reduce a domain to an axis 
    2625*/ 
    27 class CAxisAlgorithmReduceDomain : public CAxisAlgorithmTransformation, public CReductionAlgorithm 
     26class CAxisAlgorithmReduceDomain : public CAxisAlgorithmTransformation 
    2827{ 
    2928public: 
     
    4746    jDir = 2 
    4847  }; 
    49  
     48   
    5049  ReduceDirection dir_; 
    5150  bool local ; 
  • XIOS/dev/branch_openmp/src/transformation/axis_algorithm_temporal_splitting.cpp

    r1460 r1642  
    2121                                                                     std::map<int, int>& elementPositionInGridDst2AxisPosition, 
    2222                                                                     std::map<int, int>& elementPositionInGridDst2DomainPosition) 
     23TRY 
    2324{ 
    2425  std::vector<CAxis*> axisListDestP = gridDst->getAxis(); 
     
    3132  return (new CAxisAlgorithmTemporalSplitting(axisListDestP[axisDstIndex], scalarListSrcP[scalarSrcIndex], temporalSplitting)); 
    3233} 
     34CATCH 
    3335 
    3436bool CAxisAlgorithmTemporalSplitting::registerTrans() 
     37TRY 
    3538{ 
    3639  CGridTransformationFactory<CAxis>::registerTransformation(TRANS_TEMPORAL_SPLITTING, create); 
    3740} 
    38  
     41CATCH 
    3942 
    4043CAxisAlgorithmTemporalSplitting::CAxisAlgorithmTemporalSplitting(CAxis* axisDestination, CScalar* scalarSource, CTemporalSplitting* algo) 
     
    5053 
    5154void CAxisAlgorithmTemporalSplitting::computeIndexSourceMapping_(const std::vector<CArray<double,1>* >& dataAuxInputs) 
     55TRY 
    5256{ 
    5357  this->transformationMapping_.resize(1); 
     
    7276  } 
    7377} 
     78CATCH 
    7479 
    7580} 
  • XIOS/dev/branch_openmp/src/transformation/axis_algorithm_transformation.cpp

    r1460 r1642  
    2020CAxisAlgorithmTransformation::CAxisAlgorithmTransformation(CAxis* axisDestination, CAxis* axisSource) 
    2121 : CGenericAlgorithmTransformation(), axisDest_(axisDestination), axisSrc_(axisSource), domainSrc_(0),scalarSrc_(0) 
     22TRY 
    2223{ 
    2324  axisDestGlobalSize_ = axisDestination->n_glo.getValue(); 
     
    2829    if ((axisDestination->mask)(idx)) axisDestGlobalIndex_.push_back(ibeginDest+idx); 
    2930} 
     31CATCH 
    3032 
    3133CAxisAlgorithmTransformation::CAxisAlgorithmTransformation(CAxis* axisDestination, CDomain* domainSource) 
    3234 : CGenericAlgorithmTransformation(), axisDest_(axisDestination), axisSrc_(0), domainSrc_(domainSource),scalarSrc_(0) 
     35TRY 
    3336{ 
    3437  axisDestGlobalSize_ = axisDestination->n_glo.getValue(); 
     
    3942    if ((axisDestination->mask)(idx)) axisDestGlobalIndex_.push_back(ibeginDest+idx); 
    4043} 
     44CATCH 
    4145 
    4246CAxisAlgorithmTransformation::CAxisAlgorithmTransformation(CAxis* axisDestination, CScalar* scalarSource) 
    4347 : CGenericAlgorithmTransformation(), axisDest_(axisDestination), axisSrc_(0), domainSrc_(0), scalarSrc_(scalarSource) 
     48TRY 
    4449{ 
    4550  axisDestGlobalSize_ = axisDestination->n_glo.getValue(); 
     
    5055    if ((axisDestination->mask)(idx)) axisDestGlobalIndex_.push_back(ibeginDest+idx); 
    5156} 
     57CATCH 
     58 
    5259CAxisAlgorithmTransformation::~CAxisAlgorithmTransformation() 
    5360{ 
     
    6673                                                              int elementType, 
    6774                                                              CClientClientDHTInt::Index2VectorInfoTypeMap& globalAxisIndexOnProc) 
     75TRY 
    6876{ 
    6977  CContext* context = CContext::getCurrent(); 
     
    124132  globalAxisIndexOnProc = dhtIndexProcRank.getInfoIndexMap(); 
    125133} 
     134CATCH 
    126135 
    127136} 
  • XIOS/dev/branch_openmp/src/transformation/axis_algorithm_zoom.cpp

    r1460 r1642  
    11/*! 
    22   \file axis_algorithm_zoom.cpp 
    3    \author Ha NGUYEN 
    4    \since 03 June 2015 
    5    \date 12 June 2015 
    6  
    7    \brief Algorithm for zooming on an axis. 
     3   \brief Algorithm for zooming an axis. 
    84 */ 
    95#include "axis_algorithm_zoom.hpp" 
     
    2319                                                           std::map<int, int>& elementPositionInGridDst2AxisPosition, 
    2420                                                           std::map<int, int>& elementPositionInGridDst2DomainPosition) 
     21TRY 
    2522{ 
    2623  std::vector<CAxis*> axisListDestP = gridDst->getAxis(); 
     
    3330  return (new CAxisAlgorithmZoom(axisListDestP[axisDstIndex], axisListSrcP[axisSrcIndex], zoomAxis)); 
    3431} 
     32CATCH 
     33 
    3534bool CAxisAlgorithmZoom::registerTrans() 
     35TRY 
    3636{ 
    3737  CGridTransformationFactory<CAxis>::registerTransformation(TRANS_ZOOM_AXIS, create); 
    3838} 
     39CATCH 
    3940 
    4041CAxisAlgorithmZoom::CAxisAlgorithmZoom(CAxis* axisDestination, CAxis* axisSource, CZoomAxis* zoomAxis) 
    4142: CAxisAlgorithmTransformation(axisDestination, axisSource) 
     43TRY 
    4244{ 
    4345  zoomAxis->checkValid(axisSource); 
    4446  zoomBegin_ = zoomAxis->begin.getValue(); 
    45   zoomSize_  = zoomAxis->n.getValue(); 
    46   zoomEnd_   = zoomBegin_ + zoomSize_ - 1; 
     47  zoomN_  = zoomAxis->n.getValue(); 
     48  zoomEnd_   = zoomBegin_ + zoomN_ - 1; 
    4749 
    48   if (zoomSize_ > axisSource->n_glo.getValue()) 
     50  if (zoomN_ > axisSource->n_glo.getValue()) 
    4951  { 
    5052    ERROR("CAxisAlgorithmZoom::CAxisAlgorithmZoom(CAxis* axisDestination, CAxis* axisSource, CZoomAxis* zoomAxis)", 
    51            << "Zoom size is greater than global size of axis source" 
    52            << "Global size of axis source " <<axisSource->getId() << " is " << axisSource->n_glo.getValue()  << std::endl 
    53            << "Zoom size is " << zoomSize_ ); 
     53           << "Zoom size is greater than global size of source axis" 
     54           << "Global size of source axis " <<axisSource->getId() << " is " << axisSource->n_glo.getValue()  << std::endl 
     55           << "Zoom size is " << zoomN_ ); 
    5456  } 
    5557 
    56   if (!zoomAxis->index.isEmpty()) 
     58  int idxSrc, nDest = 0, beginDestLoc, beginDestGlo = 0 ; 
     59  int indGloDest, indGloSrc, iSrc; 
     60  for (int i = 0; i < axisSrc_->n.getValue(); i++) 
    5761  { 
    58     int sz = zoomAxis->index.numElements(); 
    59     zoomIndex_.resize(sz); 
    60     for (int i = 0; i < sz; ++i) 
    61       zoomIndex_[i] = zoomAxis->index(i); 
     62    idxSrc = axisSrc_->index(i); 
     63    if ((idxSrc >= zoomBegin_) && (idxSrc <= zoomEnd_)) 
     64    { 
     65      if (nDest == 0) beginDestLoc = i; 
     66      ++nDest; 
     67    } 
     68  } 
     69  beginDestGlo = beginDestLoc + axisSrc_->begin - zoomBegin_; 
     70  axisDest_->n_glo.setValue(zoomN_); 
     71  axisDest_->n.setValue(nDest); 
     72  axisDest_->begin.setValue(beginDestGlo); 
     73  axisDest_->index.resize(nDest); 
    6274 
    63     std::sort(zoomIndex_.begin(), zoomIndex_.end()); 
     75  axisDest_->data_n.setValue(nDest); 
     76  axisDest_->data_begin.setValue(0); 
     77  axisDest_->data_index.resize(nDest); 
     78 
     79  axisDest_->mask.resize(nDest); 
     80  if (axisSrc_->hasValue) axisDest_->value.resize(nDest); 
     81  if (axisSrc_->hasLabel) axisDest_->label.resize(nDest); 
     82  if (axisSrc_->hasBounds) axisDest_->bounds.resize(2,nDest); 
     83 
     84  this->transformationMapping_.resize(1); 
     85  this->transformationWeight_.resize(1); 
     86  TransformationIndexMap& transMap = this->transformationMapping_[0]; 
     87  TransformationWeightMap& transWeight = this->transformationWeight_[0]; 
     88 
     89  for (int iDest = 0; iDest < nDest; iDest++) 
     90  { 
     91    iSrc = iDest + beginDestLoc; 
     92    axisDest_->index(iDest) = iDest + beginDestGlo; 
     93    axisDest_->data_index(iDest) = axisSrc_->data_index(iSrc) - beginDestLoc; 
     94    axisDest_->mask(iDest) = axisSrc_->mask(iSrc); 
     95 
     96    if (axisSrc_->hasValue) 
     97      axisDest_->value(iDest) = axisSrc_->value(iSrc); 
     98    if (axisSrc_->hasLabel) 
     99      axisDest_->label(iDest) = axisSrc_->label(iSrc); 
     100    if (axisSrc_->hasBounds) 
     101    { 
     102      axisDest_->bounds(0,iDest) = axisSrc_->bounds(0,iSrc); 
     103      axisDest_->bounds(1,iDest) = axisSrc_->bounds(1,iSrc); 
     104    } 
     105    indGloDest = axisDest_->index(iDest); 
     106    indGloSrc = axisSrc_->index(iSrc); 
     107    transMap[indGloDest].push_back(indGloSrc); 
     108    transWeight[indGloDest].push_back(1.0); 
     109 
    64110  } 
    65  
    66111} 
     112CATCH 
    67113 
    68114/*! 
    69   Compute the index mapping between axis on grid source and one on grid destination 
     115  Compute the index mapping between domain on grid source and one on grid destination 
    70116*/ 
    71117void CAxisAlgorithmZoom::computeIndexSourceMapping_(const std::vector<CArray<double,1>* >& dataAuxInputs) 
    72118{ 
    73   // We use all index of source and destination to calculate the mapping index of zoom. 
    74   // The server who receives the "zoomed" fields will decide whether it will forward these fields or write "real zoomed" fields into file 
    75   // That means servers need to change to cover this problem. 
    76   StdSize niSource = axisSrc_->n.getValue(); 
    77   StdSize ibeginSource = axisSrc_->begin.getValue(); 
    78   StdSize iendSource = ibeginSource + niSource - 1; 
    79  
    80   StdSize ibegin = std::max(ibeginSource, zoomBegin_); 
    81   StdSize iend = std::min(iendSource, zoomEnd_); 
    82   StdSize ni = iend + 1 - ibegin; 
    83   if (iend < ibegin) ni = 0; 
    84  
    85   this->transformationMapping_.resize(1); 
    86   this->transformationWeight_.resize(1); 
    87  
    88   TransformationIndexMap& transMap = this->transformationMapping_[0]; 
    89   TransformationWeightMap& transWeight = this->transformationWeight_[0]; 
    90  
    91   if (!zoomIndex_.empty()) 
    92   { 
    93     std::vector<int>::iterator itZoomBegin, itZoomEnd; 
    94     itZoomBegin = std::lower_bound(zoomIndex_.begin(), zoomIndex_.end(), ibeginSource); 
    95     itZoomEnd   = std::upper_bound(zoomIndex_.begin(), zoomIndex_.end(), iendSource);             
    96     for (; itZoomBegin != itZoomEnd; ++itZoomBegin) 
    97     { 
    98       transMap[*itZoomBegin].push_back(*itZoomBegin); 
    99       transWeight[*itZoomBegin].push_back(1.0); 
    100     } 
    101   } 
    102   else 
    103   { 
    104     for (StdSize idx = 0; idx < ni; ++idx) 
    105     { 
    106       transMap[ibegin+idx].push_back(ibegin+idx); 
    107       transWeight[ibegin+idx].push_back(1.0); 
    108     } 
    109   } 
    110  
    111   updateZoom(); 
    112   // updateAxisDestinationMask(); 
    113119} 
    114120 
    115 /*! 
    116   After a zoom on axis, it should be certain that (global) zoom begin and (global) zoom size are updated 
    117 */ 
    118 void CAxisAlgorithmZoom::updateZoom() 
    119 { 
    120   axisDest_->global_zoom_begin = zoomBegin_; 
    121   axisDest_->global_zoom_n  = zoomSize_; 
    122   if (!zoomIndex_.empty()) 
    123   { 
    124     axisDest_->global_zoom_index.resize(zoomIndex_.size()); 
    125     std::copy(zoomIndex_.begin(), zoomIndex_.end(), axisDest_->global_zoom_index.begin()); 
    126   } 
    127121} 
    128  
    129 /*! 
    130   Update mask on axis 
    131   Because only zoomed region on axis is not masked, the remaining must be masked to make sure 
    132 correct index be extracted 
    133 */ 
    134 // void CAxisAlgorithmZoom::updateAxisDestinationMask() 
    135 // { 
    136 //   StdSize niMask = axisDest_->mask.numElements(); 
    137 //   StdSize iBeginMask = axisDest_->begin.getValue(); 
    138 //   StdSize globalIndexMask = 0; 
    139 //   TransformationIndexMap& transMap = this->transformationMapping_[0]; 
    140 //   TransformationIndexMap::const_iterator ite = (transMap).end(); 
    141 //   for (StdSize idx = 0; idx < niMask; ++idx) 
    142 //   { 
    143 //     globalIndexMask = iBeginMask + idx; 
    144 //     if (transMap.find(globalIndexMask) == ite) 
    145 //       (axisDest_->mask)(idx) = false; 
    146 //   } 
    147 // } 
    148  
    149 } 
  • XIOS/dev/branch_openmp/src/transformation/axis_algorithm_zoom.hpp

    r1460 r1642  
    11/*! 
    22   \file axis_algorithm_zoom.hpp 
    3    \author Ha NGUYEN 
    4    \since 03 June 2015 
    5    \date 12 June 2015 
    6  
    7    \brief Algorithm for zooming on an axis. 
     3   \brief Algorithm for zooming an axis. 
    84 */ 
    95#ifndef __XIOS_AXIS_ALGORITHM_ZOOM_HPP__ 
     
    2117  Implementing zoom on axis 
    2218  A zoomed region can be considered as region that isn't masked. 
    23   Only this zoomed region is extracted to write on Netcdf. 
     19  Only this zoomed region is zoomed to write on Netcdf. 
    2420*/ 
    2521class CAxisAlgorithmZoom : public CAxisAlgorithmTransformation 
     
    3531 
    3632private: 
    37   // void updateAxisDestinationMask(); 
    38   void updateZoom(); 
    3933 
    4034private: 
     
    4640 
    4741  //! Global zoom size on axis 
    48   StdSize zoomSize_; 
     42  StdSize zoomN_; 
    4943 
    5044  std::vector<int> zoomIndex_; 
  • XIOS/dev/branch_openmp/src/transformation/domain_algorithm_compute_connectivity.cpp

    r978 r1642  
    2424                                                                     std::map<int, int>& elementPositionInGridDst2AxisPosition, 
    2525                                                                     std::map<int, int>& elementPositionInGridDst2DomainPosition) 
     26TRY 
    2627{ 
    2728  std::vector<CDomain*> domainListDestP = gridDst->getDomains(); 
     
    3435  return (new CDomainAlgorithmComputeConnectivity(domainListDestP[domainDstIndex], domainListSrcP[domainSrcIndex], compute_connectivityDomain)); 
    3536} 
     37CATCH 
    3638 
    3739bool CDomainAlgorithmComputeConnectivity::registerTrans() 
     40TRY 
    3841{ 
    3942  CGridTransformationFactory<CDomain>::registerTransformation(TRANS_COMPUTE_CONNECTIVITY_DOMAIN, create); 
    4043} 
     44CATCH 
    4145 
    4246CDomainAlgorithmComputeConnectivity::CDomainAlgorithmComputeConnectivity(CDomain* domainDestination, CDomain* domainSource, 
    4347                                                                         CComputeConnectivityDomain* compute_connectivityDomain) 
    4448: CDomainAlgorithmTransformation(domainDestination, domainSource) 
     49TRY 
    4550{ 
    4651  this->type_ = (ELEMENT_NO_MODIFICATION_WITHOUT_DATA); 
     
    6469  computeLocalConnectivity(type, domainDestination, nbNeighborMax, nbNeighbor, localNeighbors); 
    6570} 
     71CATCH 
    6672 
    6773/*! 
     
    7884                                                                  CArray<int,1>& nbConnectivity, 
    7985                                                                  CArray<int,2>& localConnectivity) 
     86TRY 
    8087{ 
    8188 
     
    93100    if (nbConnectivityMax < nbConnectivity(idx)) nbConnectivityMax = nbConnectivity(idx); 
    94101} 
    95  
    96  
     102CATCH 
    97103 
    98104/*! 
  • XIOS/dev/branch_openmp/src/transformation/domain_algorithm_expand.cpp

    r1460 r1642  
    2626                                                               std::map<int, int>& elementPositionInGridDst2AxisPosition, 
    2727                                                               std::map<int, int>& elementPositionInGridDst2DomainPosition) 
     28TRY 
    2829{ 
    2930  std::vector<CDomain*> domainListDestP = gridDst->getDomains(); 
     
    3637  return (new CDomainAlgorithmExpand(domainListDestP[domainDstIndex], domainListSrcP[domainSrcIndex], expandDomain)); 
    3738} 
     39CATCH 
    3840 
    3941bool CDomainAlgorithmExpand::registerTrans() 
     42TRY 
    4043{ 
    4144  CGridTransformationFactory<CDomain>::registerTransformation(TRANS_EXPAND_DOMAIN, create); 
    4245} 
     46CATCH 
    4347 
    4448CDomainAlgorithmExpand::CDomainAlgorithmExpand(CDomain* domainDestination, 
     
    4751: CDomainAlgorithmTransformation(domainDestination, domainSource), 
    4852  isXPeriodic_(false), isYPeriodic_(false) 
     53TRY 
    4954{ 
    5055  if (domainDestination == domainSource) 
     
    7782  } 
    7883} 
     84CATCH 
    7985 
    8086/*! 
     
    8591void CDomainAlgorithmExpand::expandDomainEdgeConnectivity(CDomain* domainDestination, 
    8692                                                          CDomain* domainSource) 
     93TRY 
    8794{ 
    8895  CContext* context = CContext::getCurrent(); 
     
    104111  }   
    105112} 
     113CATCH 
    106114 
    107115/*! 
     
    112120void CDomainAlgorithmExpand::expandDomainNodeConnectivity(CDomain* domainDestination, 
    113121                                                          CDomain* domainSource) 
     122TRY 
    114123{ 
    115124  CContext* context = CContext::getCurrent(); 
     
    131140  }   
    132141} 
     142CATCH 
    133143 
    134144/*! 
     
    142152                                                               CDomain* domainSource, 
    143153                                                               CArray<int,2>& neighborsDomainSrc) 
     154TRY 
    144155{ 
    145156  int index, globalIndex, idx; 
     
    161172  else domainDestination->domain_ref.setValue(domainDstRef); 
    162173 
     174   
    163175  // Here are attributes of source need tranfering 
    164176  int niGloSrc = domainSource->ni_glo; 
     
    227239  domainDestination->ni.setValue(niDst); 
    228240  domainDestination->nj.setValue(njDst); 
    229   domainDestination->global_zoom_ni.setValue(domainSource->global_zoom_ni+2); 
    230   domainDestination->global_zoom_nj.setValue(domainSource->global_zoom_nj+2); 
    231241 
    232242  CArray<bool,1>& mask_1d_dst = domainDestination->domainMask; 
     
    456466   domainDestination->computeLocalMask() ; 
    457467} 
     468CATCH 
    458469 
    459470/*! 
     
    467478                                                                CDomain* domainSource, 
    468479                                                                CArray<int,2>& neighborsDomainSrc) 
     480TRY 
    469481{ 
    470482 
     
    670682  domainDestination->computeLocalMask() ; 
    671683} 
    672  
     684CATCH 
    673685 
    674686/*! 
  • XIOS/dev/branch_openmp/src/transformation/domain_algorithm_generate_rectilinear.cpp

    r1064 r1642  
    2020                                                                         CGenerateRectilinearDomain* genRectDomain) 
    2121: CDomainAlgorithmTransformation(domainDestination, domainSource), nbDomainDistributedPart_(0) 
     22TRY 
    2223{ 
    2324  type_ = ELEMENT_GENERATION; 
     
    3031  fillInAttributesDomainDestination(); 
    3132} 
     33CATCH 
    3234 
    3335/*! 
     
    4345*/ 
    4446void CDomainAlgorithmGenerateRectilinear::computeDistributionGridSource(CGrid* gridSrc) 
     47TRY 
    4548{ 
    4649  CContext* context = CContext::getCurrent(); 
     
    6770        StdSize hashValue = hashFunc.hashVec(globalAxisIndex); 
    6871        std::vector<StdSize> recvBuff(client->clientSize); 
    69         MPI_Gather(&hashValue, 1, MPI_UNSIGNED_LONG, 
    70                    &recvBuff[0], 1, MPI_UNSIGNED_LONG, 
     72        ep_lib::MPI_Gather(&hashValue, 1, EP_UNSIGNED_LONG, 
     73                   &recvBuff[0], 1, EP_UNSIGNED_LONG, 
    7174                   0, 
    7275                   client->intraComm); 
     
    8487        } 
    8588 
    86         MPI_Bcast(&nbLocalAxis[0], nbAxis, MPI_INT, 
     89        ep_lib::MPI_Bcast(&nbLocalAxis[0], nbAxis, EP_INT, 
    8790                  0, client->intraComm); 
    8891      } 
     
    9497  } 
    9598} 
     99CATCH 
    96100 
    97101/*! 
     
    99103*/ 
    100104void CDomainAlgorithmGenerateRectilinear::computeDistributionGridDestination(CGrid* gridDest) 
     105TRY 
    101106{ 
    102107  // For now, just suppose that the grid contains only one domain 
     
    121126 
    122127} 
     128CATCH 
    123129 
    124130/*! 
     
    126132*/ 
    127133void CDomainAlgorithmGenerateRectilinear::fillInAttributesDomainDestination() 
     134TRY 
    128135{ 
    129136  if (!domainDest_->distributionAttributesHaveValue()) 
     
    131138  domainDest_->fillInLonLat(); 
    132139} 
    133  
     140CATCH 
    134141} 
  • XIOS/dev/branch_openmp/src/transformation/domain_algorithm_interpolate.cpp

    r1555 r1642  
    2020#include "interpolate_domain.hpp" 
    2121#include "grid.hpp" 
    22 using namespace ep_lib; 
    2322 
    2423namespace xios { 
     
    3231                                                                     std::map<int, int>& elementPositionInGridDst2AxisPosition, 
    3332                                                                     std::map<int, int>& elementPositionInGridDst2DomainPosition) 
     33TRY 
    3434{ 
    3535  std::vector<CDomain*> domainListDestP = gridDst->getDomains(); 
     
    4242  return (new CDomainAlgorithmInterpolate(domainListDestP[domainDstIndex], domainListSrcP[domainSrcIndex], interpolateDomain)); 
    4343} 
     44CATCH 
    4445 
    4546bool CDomainAlgorithmInterpolate::registerTrans() 
     47TRY 
    4648{ 
    4749  CGridTransformationFactory<CDomain>::registerTransformation(TRANS_INTERPOLATE_DOMAIN, create); 
    4850} 
     51CATCH 
    4952 
    5053CDomainAlgorithmInterpolate::CDomainAlgorithmInterpolate(CDomain* domainDestination, CDomain* domainSource, CInterpolateDomain* interpDomain) 
    5154: CDomainAlgorithmTransformation(domainDestination, domainSource), interpDomain_(interpDomain), writeToFile_(false), readFromFile_(false) 
     55TRY 
    5256{ 
    5357  CContext* context = CContext::getCurrent(); 
     
    9498     
    9599} 
     100CATCH 
    96101 
    97102/*! 
     
    99104*/ 
    100105void CDomainAlgorithmInterpolate::computeRemap() 
     106TRY 
    101107{ 
    102108  using namespace sphereRemap; 
     
    305311  CArray<double,2> boundsLonSrcUnmasked(nVertexSrc,nSrcLocalUnmasked); 
    306312  CArray<double,2> boundsLatSrcUnmasked(nVertexSrc,nSrcLocalUnmasked); 
     313  CArray<double,1> areaSrcUnmasked(nSrcLocalUnmasked); 
     314   
    307315  long int * globalSrcUnmasked = new long int [nSrcLocalUnmasked]; 
    308316 
    309317  nSrcLocalUnmasked=0 ; 
     318  bool hasSrcArea=domainSrc_->hasArea && !domainSrc_->radius.isEmpty() && !interpDomain_->use_area.isEmpty() && interpDomain_->use_area==true  ; 
     319  double srcAreaFactor ; 
     320  if (hasSrcArea) srcAreaFactor=1./(domainSrc_->radius*domainSrc_->radius) ; 
     321   
    310322  for (int idx=0 ; idx < nSrcLocal; idx++) 
    311323  { 
     
    317329        boundsLatSrcUnmasked(n,nSrcLocalUnmasked) = boundsLatSrc(n,idx) ; 
    318330      } 
     331      if (hasSrcArea) areaSrcUnmasked(nSrcLocalUnmasked) = domainSrc_->areavalue(idx)*srcAreaFactor ; 
    319332      globalSrcUnmasked[nSrcLocalUnmasked]=globalSrc[idx] ; 
    320333      ++nSrcLocalUnmasked ; 
    321334    } 
    322335  } 
    323  
     336  
    324337 
    325338  int nDstLocalUnmasked = 0 ; 
     
    328341  CArray<double,2> boundsLonDestUnmasked(nVertexDest,nDstLocalUnmasked); 
    329342  CArray<double,2> boundsLatDestUnmasked(nVertexDest,nDstLocalUnmasked); 
     343  CArray<double,1>   areaDstUnmasked(nDstLocalUnmasked); 
     344 
    330345  long int * globalDstUnmasked = new long int [nDstLocalUnmasked]; 
    331346 
    332347  nDstLocalUnmasked=0 ; 
     348  bool hasDstArea=domainDest_->hasArea && !domainDest_->radius.isEmpty() && !interpDomain_->use_area.isEmpty() && interpDomain_->use_area==true ; 
     349  double dstAreaFactor ; 
     350  if (hasDstArea) dstAreaFactor=1./(domainDest_->radius*domainDest_->radius) ; 
    333351  for (int idx=0 ; idx < nDstLocal; idx++) 
    334352  { 
     
    340358        boundsLatDestUnmasked(n,nDstLocalUnmasked) = boundsLatDest(n,idx) ; 
    341359      } 
     360      if (hasDstArea) areaDstUnmasked(nDstLocalUnmasked) = domainDest_->areavalue(idx)*dstAreaFactor ; 
    342361      globalDstUnmasked[nDstLocalUnmasked]=globalDst[idx] ; 
    343362      ++nDstLocalUnmasked ; 
     
    345364  } 
    346365 
    347   mapper.setSourceMesh(boundsLonSrcUnmasked.dataFirst(), boundsLatSrcUnmasked.dataFirst(), nVertexSrc, nSrcLocalUnmasked, &srcPole[0], globalSrcUnmasked); 
    348   mapper.setTargetMesh(boundsLonDestUnmasked.dataFirst(), boundsLatDestUnmasked.dataFirst(), nVertexDest, nDstLocalUnmasked, &dstPole[0], globalDstUnmasked); 
     366  double* ptAreaSrcUnmasked = NULL ; 
     367  if (hasSrcArea) ptAreaSrcUnmasked=areaSrcUnmasked.dataFirst() ; 
     368 
     369  double* ptAreaDstUnmasked = NULL ; 
     370  if (hasDstArea) ptAreaDstUnmasked=areaDstUnmasked.dataFirst() ; 
     371 
     372  mapper.setSourceMesh(boundsLonSrcUnmasked.dataFirst(), boundsLatSrcUnmasked.dataFirst(), ptAreaSrcUnmasked, nVertexSrc, nSrcLocalUnmasked, &srcPole[0], globalSrcUnmasked); 
     373  mapper.setTargetMesh(boundsLonDestUnmasked.dataFirst(), boundsLatDestUnmasked.dataFirst(), ptAreaDstUnmasked, nVertexDest, nDstLocalUnmasked, &dstPole[0], globalDstUnmasked); 
    349374 
    350375  std::vector<double> timings = mapper.computeWeights(orderInterp,renormalize,quantity); 
     
    400425 
    401426} 
     427CATCH 
    402428 
    403429void CDomainAlgorithmInterpolate::processPole(std::map<int,std::vector<std::pair<int,double> > >& interMapValuePole, 
    404430                                              int nbGlobalPointOnPole) 
     431TRY 
    405432{ 
    406433  CContext* context = CContext::getCurrent(); 
    407434  CContextClient* client=context->client; 
    408435 
    409   ep_lib::MPI_Comm poleComme = MPI_COMM_NULL; 
     436  ep_lib::MPI_Comm poleComme(EP_COMM_NULL); 
     437  #ifdef _usingMPI 
     438  MPI_Comm_split(client->intraComm, interMapValuePole.empty() ? MPI_UNDEFINED : 1, 0, &poleComme); 
     439  #elif _usingEP 
    410440  ep_lib::MPI_Comm_split(client->intraComm, interMapValuePole.empty() ? 0 : 1, 0, &poleComme); 
    411   if (poleComme!=MPI_COMM_NULL) 
     441  #endif 
     442  if (EP_COMM_NULL != poleComme) 
    412443  { 
    413444    int nbClientPole; 
     
    423454    std::vector<int> recvCount(nbClientPole,0); 
    424455    std::vector<int> displ(nbClientPole,0); 
    425     ep_lib::MPI_Allgather(&nbWeight,1,MPI_INT,&recvCount[0],1,MPI_INT,poleComme) ; 
     456    ep_lib::MPI_Allgather(&nbWeight,1,EP_INT,&recvCount[0],1,EP_INT,poleComme) ; 
     457 
    426458    displ[0]=0; 
    427459    for(int n=1;n<nbClientPole;++n) displ[n]=displ[n-1]+recvCount[n-1] ; 
     
    445477 
    446478    // Gather all index and weight for pole 
    447     ep_lib::MPI_Allgatherv(&sendSourceIndexBuff[0],nbWeight,MPI_INT,&recvSourceIndexBuff[0],&recvCount[0],&displ[0],MPI_INT,poleComme); 
    448     ep_lib::MPI_Allgatherv(&sendSourceWeightBuff[0],nbWeight,MPI_DOUBLE,&recvSourceWeightBuff[0],&recvCount[0],&displ[0],MPI_DOUBLE,poleComme); 
     479    ep_lib::MPI_Allgatherv(&sendSourceIndexBuff[0],nbWeight,EP_INT,&recvSourceIndexBuff[0],&recvCount[0],&displ[0],EP_INT,poleComme); 
     480    ep_lib::MPI_Allgatherv(&sendSourceWeightBuff[0],nbWeight,EP_DOUBLE,&recvSourceWeightBuff[0],&recvCount[0],&displ[0],EP_DOUBLE,poleComme); 
    449481 
    450482    std::map<int,double> recvTemp; 
     
    468500 
    469501} 
     502CATCH 
    470503 
    471504/*! 
     
    473506*/ 
    474507void CDomainAlgorithmInterpolate::computeIndexSourceMapping_(const std::vector<CArray<double,1>* >& dataAuxInputs) 
     508TRY 
    475509{ 
    476510  if (readFromFile_)   
     
    481515  } 
    482516} 
     517CATCH 
    483518 
    484519void CDomainAlgorithmInterpolate::writeRemapInfo(std::map<int,std::vector<std::pair<int,double> > >& interpMapValue) 
     520TRY 
    485521 
    486522  writeInterpolationInfo(fileToReadWrite_, interpMapValue); 
    487523} 
     524CATCH 
    488525 
    489526void CDomainAlgorithmInterpolate::readRemapInfo() 
     527TRY 
    490528 
    491529  std::map<int,std::vector<std::pair<int,double> > > interpMapValue; 
     
    494532  exchangeRemapInfo(interpMapValue); 
    495533} 
     534CATCH 
    496535 
    497536void CDomainAlgorithmInterpolate::convertRemapInfo(std::map<int,std::vector<std::pair<int,double> > >& interpMapValue) 
     537TRY 
    498538{ 
    499539  CContext* context = CContext::getCurrent(); 
     
    520560  }       
    521561} 
     562CATCH 
    522563 
    523564/*! 
     
    525566*/ 
    526567void CDomainAlgorithmInterpolate::exchangeRemapInfo(std::map<int,std::vector<std::pair<int,double> > >& interpMapValue) 
     568TRY 
    527569{ 
    528570  CContext* context = CContext::getCurrent(); 
     
    593635 
    594636 
    595   ep_lib::MPI_Allreduce(sendBuff, recvBuff, nbClient, MPI_INT, MPI_SUM, client->intraComm); 
     637  ep_lib::MPI_Allreduce(sendBuff, recvBuff, nbClient, EP_INT, EP_SUM, client->intraComm); 
    596638 
    597639  int* sendIndexDestBuff = new int [sendBuffSize]; 
     
    599641  double* sendWeightBuff = new double [sendBuffSize]; 
    600642 
    601   std::vector<ep_lib::MPI_Request> sendRequest(3*globalIndexInterpSendToClient.size()); 
     643  std::vector<ep_lib::MPI_Request> sendRequest; 
    602644 
    603645  int sendOffSet = 0, l = 0; 
    604   int position = 0; 
    605646  for (itMap = itbMap; itMap != iteMap; ++itMap) 
    606647  { 
     
    621662    } 
    622663 
     664    sendRequest.push_back(ep_lib::MPI_Request()); 
    623665    ep_lib::MPI_Isend(sendIndexDestBuff + sendOffSet, 
    624666             k, 
    625              MPI_INT, 
     667             EP_INT, 
    626668             itMap->first, 
    627669             MPI_DOMAIN_INTERPOLATION_DEST_INDEX, 
    628670             client->intraComm, 
    629              &sendRequest[position++]); 
     671             &sendRequest.back()); 
     672    sendRequest.push_back(ep_lib::MPI_Request()); 
    630673    ep_lib::MPI_Isend(sendIndexSrcBuff + sendOffSet, 
    631674             k, 
    632              MPI_INT, 
     675             EP_INT, 
    633676             itMap->first, 
    634677             MPI_DOMAIN_INTERPOLATION_SRC_INDEX, 
    635678             client->intraComm, 
    636              &sendRequest[position++]); 
     679             &sendRequest.back()); 
     680    sendRequest.push_back(ep_lib::MPI_Request()); 
    637681    ep_lib::MPI_Isend(sendWeightBuff + sendOffSet, 
    638682             k, 
    639              MPI_DOUBLE, 
     683             EP_DOUBLE, 
    640684             itMap->first, 
    641685             MPI_DOMAIN_INTERPOLATION_WEIGHT, 
    642686             client->intraComm, 
    643              &sendRequest[position++]); 
     687             &sendRequest.back()); 
    644688    sendOffSet += k; 
    645689  } 
     
    654698  { 
    655699    ep_lib::MPI_Status recvStatus; 
     700    #ifdef _usingMPI 
     701    MPI_Recv((recvIndexDestBuff + receivedSize), 
     702             recvBuffSize, 
     703             EP_INT, 
     704             MPI_ANY_SOURCE, 
     705             MPI_DOMAIN_INTERPOLATION_DEST_INDEX, 
     706             client->intraComm, 
     707             &recvStatus); 
     708    #elif _usingEP 
    656709    ep_lib::MPI_Recv((recvIndexDestBuff + receivedSize), 
    657710             recvBuffSize, 
    658              MPI_INT, 
     711             EP_INT, 
    659712             -2, 
    660713             MPI_DOMAIN_INTERPOLATION_DEST_INDEX, 
    661714             client->intraComm, 
    662715             &recvStatus); 
     716    #endif 
    663717 
    664718    int countBuff = 0; 
    665     ep_lib::MPI_Get_count(&recvStatus, MPI_INT, &countBuff); 
     719    ep_lib::MPI_Get_count(&recvStatus, EP_INT, &countBuff); 
    666720    #ifdef _usingMPI 
    667721    clientSrcRank = recvStatus.MPI_SOURCE; 
     
    672726    ep_lib::MPI_Recv((recvIndexSrcBuff + receivedSize), 
    673727             recvBuffSize, 
    674              MPI_INT, 
     728             EP_INT, 
    675729             clientSrcRank, 
    676730             MPI_DOMAIN_INTERPOLATION_SRC_INDEX, 
     
    680734    ep_lib::MPI_Recv((recvWeightBuff + receivedSize), 
    681735             recvBuffSize, 
    682              MPI_DOUBLE, 
     736             EP_DOUBLE, 
    683737             clientSrcRank, 
    684738             MPI_DOMAIN_INTERPOLATION_WEIGHT, 
     
    695749 
    696750  std::vector<ep_lib::MPI_Status> requestStatus(sendRequest.size()); 
    697   ep_lib::MPI_Waitall(sendRequest.size(), &sendRequest[0], &requestStatus[0]); 
     751  #ifdef _usingMPI 
     752  MPI_Waitall(sendRequest.size(), &sendRequest[0], MPI_STATUS_IGNORE); 
     753  #elif _usingEP 
     754  std::vector<ep_lib::MPI_Status> waitstat(sendRequest.size()); 
     755  ep_lib::MPI_Waitall(sendRequest.size(), &sendRequest[0], &waitstat[0]); 
     756  #endif 
    698757 
    699758  delete [] sendIndexDestBuff; 
     
    706765  delete [] recvBuff; 
    707766} 
     767CATCH 
    708768  
    709769/*! Redefined some functions of CONetCDF4 to make use of them */ 
    710770CDomainAlgorithmInterpolate::WriteNetCdf::WriteNetCdf(const StdString& filename, const ep_lib::MPI_Comm comm) 
    711771  : CNc4DataOutput(NULL, filename, false, false, true, comm, false, true) {} 
    712    
    713 CDomainAlgorithmInterpolate::WriteNetCdf::WriteNetCdf(const StdString& filename, bool exist, const ep_lib::MPI_Comm comm) 
    714   : CNc4DataOutput(NULL, filename, exist, false, true, comm, false, true) {} 
    715    
    716772int CDomainAlgorithmInterpolate::WriteNetCdf::addDimensionWrite(const StdString& name,  
    717773                                                                const StdSize size) 
     774TRY 
    718775{ 
    719776  return CONetCDF4::addDimension(name, size);   
    720777} 
     778CATCH 
    721779 
    722780int CDomainAlgorithmInterpolate::WriteNetCdf::addVariableWrite(const StdString& name, nc_type type, 
    723781                                                               const std::vector<StdString>& dim) 
     782TRY 
    724783{ 
    725784  return CONetCDF4::addVariable(name, type, dim); 
    726785} 
     786CATCH 
    727787 
    728788void CDomainAlgorithmInterpolate::WriteNetCdf::endDefinition() 
     789TRY 
    729790{ 
    730791  CONetCDF4::definition_end(); 
    731792} 
     793CATCH 
    732794 
    733795void CDomainAlgorithmInterpolate::WriteNetCdf::writeDataIndex(const CArray<int,1>& data, const StdString& name, 
     
    735797                                                              const std::vector<StdSize>* start, 
    736798                                                              const std::vector<StdSize>* count) 
     799TRY 
    737800{ 
    738801  CONetCDF4::writeData<int,1>(data, name, collective, record, start, count); 
    739802} 
     803CATCH 
    740804 
    741805void CDomainAlgorithmInterpolate::WriteNetCdf::writeDataIndex(const CArray<double,1>& data, const StdString& name, 
     
    743807                                                              const std::vector<StdSize>* start, 
    744808                                                              const std::vector<StdSize>* count) 
     809TRY 
    745810{ 
    746811  CONetCDF4::writeData<double,1>(data, name, collective, record, start, count); 
    747812} 
     813CATCH 
    748814 
    749815/* 
     
    754820void CDomainAlgorithmInterpolate::writeInterpolationInfo(std::string& filename, 
    755821                                                         std::map<int,std::vector<std::pair<int,double> > >& interpMapValue) 
     822TRY 
    756823{ 
    757824  CContext* context = CContext::getCurrent(); 
     
    791858  } 
    792859 
    793   ep_lib::MPI_Allreduce(&localNbWeight, &globalNbWeight, 1, MPI_LONG, MPI_SUM, client->intraComm); 
    794   ep_lib::MPI_Scan(&localNbWeight, &startIndex, 1, MPI_LONG, MPI_SUM, client->intraComm); 
     860  ep_lib::MPI_Allreduce(&localNbWeight, &globalNbWeight, 1, EP_LONG, EP_SUM, client->intraComm); 
     861  ep_lib::MPI_Scan(&localNbWeight, &startIndex, 1, EP_LONG, EP_SUM, client->intraComm); 
    795862   
    796863  if (0 == globalNbWeight) 
     
    806873  std::vector<StdSize> count(1, localNbWeight); 
    807874   
    808   int my_rank_loc = client->intraComm->ep_comm_ptr->size_rank_info[1].first; 
    809   int my_rank = client->intraComm->ep_comm_ptr->size_rank_info[0].first; 
     875  WriteNetCdf netCdfWriter(filename, client->intraComm);   
     876 
     877  // Define some dimensions 
     878  netCdfWriter.addDimensionWrite("n_src", n_src); 
     879  netCdfWriter.addDimensionWrite("n_dst", n_dst); 
     880  netCdfWriter.addDimensionWrite("n_weight", globalNbWeight); 
    810881   
    811    
    812   
    813   WriteNetCdf *netCdfWriter; 
    814  
    815   MPI_Barrier_local(client->intraComm); 
    816    
    817   if(my_rank_loc==0) 
    818   { 
    819     info(100)<<"rank "<< my_rank <<" create weight info file"<< std::endl; 
    820      
    821     WriteNetCdf my_writer(filename, client->intraComm);   
    822     info(100)<<"rank "<< my_rank <<" file created"<< std::endl; 
    823     netCdfWriter = &my_writer;  
    824    
    825     // Define some dimensions 
    826     netCdfWriter->addDimensionWrite("n_src", n_src); 
    827     netCdfWriter->addDimensionWrite("n_dst", n_dst); 
    828     netCdfWriter->addDimensionWrite("n_weight", globalNbWeight); 
    829     info(100)<<"rank "<< my_rank <<" addDimensionWrite : n_src, n_dst, n_weight"<< std::endl; 
    830    
    831     std::vector<StdString> dims(1,"n_weight"); 
    832  
    833     // Add some variables 
    834     netCdfWriter->addVariableWrite("src_idx", NC_INT, dims); 
    835     netCdfWriter->addVariableWrite("dst_idx", NC_INT, dims); 
    836     netCdfWriter->addVariableWrite("weight", NC_DOUBLE, dims); 
    837      
    838     info(100)<<"rank "<< my_rank <<" addVariableWrite : src_idx, dst_idx, weight"<< std::endl; 
    839  
    840     // End of definition 
    841     netCdfWriter->endDefinition(); 
    842     info(100)<<"rank "<< my_rank <<" endDefinition"<< std::endl; 
    843    
    844     netCdfWriter->closeFile(); 
    845     info(100)<<"rank "<< my_rank <<" file closed"<< std::endl; 
    846   } 
    847    
    848   MPI_Barrier_local(client->intraComm); 
    849    
    850   #pragma omp critical (write_weight_data) 
    851   { 
    852     // open file 
    853     info(100)<<"rank "<< my_rank <<" writing in weight info file"<< std::endl; 
    854      
    855     WriteNetCdf my_writer(filename, true, client->intraComm);   
    856     info(100)<<"rank "<< my_rank <<" file opened"<< std::endl; 
    857     netCdfWriter = &my_writer;  
    858      
    859     // // Write variables 
    860     if (0 != localNbWeight) 
    861     { 
    862       netCdfWriter->writeDataIndex(src_idx, "src_idx", false, 0, &start, &count); 
    863       netCdfWriter->writeDataIndex(dst_idx, "dst_idx", false, 0, &start, &count); 
    864       netCdfWriter->writeDataIndex(weights, "weight", false, 0, &start, &count); 
    865        
    866       info(100)<<"rank "<< my_rank <<" WriteDataIndex : src_idx, dst_idx, weight"<< std::endl; 
    867     } 
    868      
    869     netCdfWriter->closeFile(); 
    870     info(100)<<"rank "<< my_rank <<" file closed"<< std::endl; 
    871      
    872   } 
    873    
    874   MPI_Barrier_local(client->intraComm); 
    875    
    876  
    877 } 
     882  std::vector<StdString> dims(1,"n_weight"); 
     883 
     884  // Add some variables 
     885  netCdfWriter.addVariableWrite("src_idx", NC_INT, dims); 
     886  netCdfWriter.addVariableWrite("dst_idx", NC_INT, dims); 
     887  netCdfWriter.addVariableWrite("weight", NC_DOUBLE, dims); 
     888 
     889  // End of definition 
     890  netCdfWriter.endDefinition(); 
     891 
     892  // // Write variables 
     893  if (0 != localNbWeight) 
     894  { 
     895    netCdfWriter.writeDataIndex(src_idx, "src_idx", false, 0, &start, &count); 
     896    netCdfWriter.writeDataIndex(dst_idx, "dst_idx", false, 0, &start, &count); 
     897    netCdfWriter.writeDataIndex(weights, "weight", false, 0, &start, &count); 
     898  } 
     899 
     900  netCdfWriter.closeFile(); 
     901} 
     902CATCH 
    878903 
    879904/*! 
     
    885910void CDomainAlgorithmInterpolate::readInterpolationInfo(std::string& filename, 
    886911                                                        std::map<int,std::vector<std::pair<int,double> > >& interpMapValue) 
     912TRY 
    887913{ 
    888914  int ncid ; 
     
    904930  } 
    905931                   
    906   #pragma omp critical (read_weight_data) 
    907   { 
    908     nc_open(filename.c_str(),NC_NOWRITE, &ncid) ; 
    909     nc_inq_dimid(ncid,"n_weight",&weightDimId) ; 
    910     nc_inq_dimlen(ncid,weightDimId,&nbWeightGlo) ; 
    911  
    912     size_t nbWeight ; 
    913     size_t start ; 
    914     size_t div = nbWeightGlo/clientSize ; 
    915     size_t mod = nbWeightGlo%clientSize ; 
    916     if (clientRank < mod) 
    917     { 
    918       nbWeight=div+1 ; 
    919       start=clientRank*(div+1) ; 
    920     } 
    921     else 
    922     { 
    923       nbWeight=div ; 
    924       start= mod * (div+1) + (clientRank-mod) * div ; 
    925     } 
    926  
    927     double* weight=new double[nbWeight] ; 
    928     int weightId ; 
    929     nc_inq_varid (ncid, "weight", &weightId) ; 
    930     nc_get_vara_double(ncid, weightId, &start, &nbWeight, weight) ; 
    931  
    932     long* srcIndex=new long[nbWeight] ; 
    933     int srcIndexId ; 
    934     nc_inq_varid (ncid, "src_idx", &srcIndexId) ; 
    935     nc_get_vara_long(ncid, srcIndexId, &start, &nbWeight, srcIndex) ; 
    936  
    937     long* dstIndex=new long[nbWeight] ; 
    938     int dstIndexId ; 
    939     nc_inq_varid (ncid, "dst_idx", &dstIndexId) ; 
    940     nc_get_vara_long(ncid, dstIndexId, &start, &nbWeight, dstIndex) ; 
    941  
    942     int indexOffset=0 ; 
    943     if (fortranConvention) indexOffset=1 ; 
    944       for(size_t ind=0; ind<nbWeight;++ind) 
    945         interpMapValue[dstIndex[ind]-indexOffset].push_back(make_pair(srcIndex[ind]-indexOffset,weight[ind])); 
    946   } 
    947 } 
     932  nc_open(filename.c_str(),NC_NOWRITE, &ncid) ; 
     933  nc_inq_dimid(ncid,"n_weight",&weightDimId) ; 
     934  nc_inq_dimlen(ncid,weightDimId,&nbWeightGlo) ; 
     935 
     936  size_t nbWeight ; 
     937  size_t start ; 
     938  size_t div = nbWeightGlo/clientSize ; 
     939  size_t mod = nbWeightGlo%clientSize ; 
     940  if (clientRank < mod) 
     941  { 
     942    nbWeight=div+1 ; 
     943    start=clientRank*(div+1) ; 
     944  } 
     945  else 
     946  { 
     947    nbWeight=div ; 
     948    start= mod * (div+1) + (clientRank-mod) * div ; 
     949  } 
     950 
     951  double* weight=new double[nbWeight] ; 
     952  int weightId ; 
     953  nc_inq_varid (ncid, "weight", &weightId) ; 
     954  nc_get_vara_double(ncid, weightId, &start, &nbWeight, weight) ; 
     955 
     956  long* srcIndex=new long[nbWeight] ; 
     957  int srcIndexId ; 
     958  nc_inq_varid (ncid, "src_idx", &srcIndexId) ; 
     959  nc_get_vara_long(ncid, srcIndexId, &start, &nbWeight, srcIndex) ; 
     960 
     961  long* dstIndex=new long[nbWeight] ; 
     962  int dstIndexId ; 
     963  nc_inq_varid (ncid, "dst_idx", &dstIndexId) ; 
     964  nc_get_vara_long(ncid, dstIndexId, &start, &nbWeight, dstIndex) ; 
     965 
     966  int indexOffset=0 ; 
     967  if (fortranConvention) indexOffset=1 ; 
     968    for(size_t ind=0; ind<nbWeight;++ind) 
     969      interpMapValue[dstIndex[ind]-indexOffset].push_back(make_pair(srcIndex[ind]-indexOffset,weight[ind])); 
     970 } 
     971CATCH 
    948972 
    949973void CDomainAlgorithmInterpolate::apply(const std::vector<std::pair<int,double> >& localIndex, 
     
    952976                                            std::vector<bool>& flagInitial, 
    953977                                            bool ignoreMissingValue, bool firstPass  ) 
     978TRY 
    954979{ 
    955980  int nbLocalIndex = localIndex.size();    
     
    9931018  } 
    9941019} 
     1020CATCH 
    9951021 
    9961022void CDomainAlgorithmInterpolate::updateData(CArray<double,1>& dataOut) 
     1023TRY 
    9971024{ 
    9981025  if (detectMissingValue) 
     
    10011028    size_t nbIndex=dataOut.numElements() ;  
    10021029 
    1003     for (int idx = 0; idx < nbIndex; ++idx) 
    1004     { 
    1005       if (allMissing(idx)) dataOut(idx) = defaultValue; // If all data source are nan then data destination must be nan 
     1030    if (allMissing.numElements()>0) 
     1031    { 
     1032      for (int idx = 0; idx < nbIndex; ++idx) 
     1033      { 
     1034        if (allMissing(idx)) dataOut(idx) = defaultValue; // If all data source are nan then data destination must be nan 
     1035      } 
    10061036    } 
    10071037     
     
    10131043  } 
    10141044} 
    1015  
    1016 } 
     1045CATCH 
     1046 
     1047} 
  • XIOS/dev/branch_openmp/src/transformation/domain_algorithm_interpolate.hpp

    r1540 r1642  
    99#ifndef __XIOS_DOMAIN_ALGORITHM_INTERPOLATE_HPP__ 
    1010#define __XIOS_DOMAIN_ALGORITHM_INTERPOLATE_HPP__ 
    11 #include "mpi_std.hpp" 
     11 
    1212#include "domain_algorithm_transformation.hpp" 
    1313#include "transformation.hpp" 
     
    7171  public: 
    7272    WriteNetCdf(const StdString& filename, const ep_lib::MPI_Comm comm); 
    73     WriteNetCdf(const StdString& filename, bool exist, const ep_lib::MPI_Comm comm); 
    7473    int addDimensionWrite(const StdString& name, const StdSize size = UNLIMITED_DIM); 
    7574    int addVariableWrite(const StdString& name, nc_type type, 
  • XIOS/dev/branch_openmp/src/transformation/domain_algorithm_reorder.cpp

    r1460 r1642  
    1919                                                             std::map<int, int>& elementPositionInGridDst2AxisPosition, 
    2020                                                             std::map<int, int>& elementPositionInGridDst2DomainPosition) 
     21TRY 
    2122{ 
    2223  std::vector<CDomain*> domainListDestP = gridDst->getDomains(); 
     
    2930  return (new CDomainAlgorithmReorder(domainListDestP[domainDstIndex], domainListSrcP[domainSrcIndex], reorderDomain)); 
    3031} 
     32CATCH 
    3133 
    3234bool CDomainAlgorithmReorder::registerTrans() 
     35TRY 
    3336{ 
    3437  CGridTransformationFactory<CDomain>::registerTransformation(TRANS_REORDER_DOMAIN, create); 
    3538} 
     39CATCH 
    3640 
    3741CDomainAlgorithmReorder::CDomainAlgorithmReorder(CDomain* domainDestination, CDomain* domainSource, CReorderDomain* reorderDomain) 
    3842: CDomainAlgorithmTransformation(domainDestination, domainSource) 
     43TRY 
    3944{ 
    4045  reorderDomain->checkValid(domainSource); 
     
    109114    } 
    110115  } 
    111      
    112    
    113116} 
     117CATCH 
    114118 
    115119/*! 
  • XIOS/dev/branch_openmp/src/transformation/domain_algorithm_transformation.cpp

    r1460 r1642  
    3636                                                                int elementType, 
    3737                                                                CClientClientDHTInt::Index2VectorInfoTypeMap& globalDomainIndexOnProc) 
     38TRY 
    3839{ 
    3940  CContext* context = CContext::getCurrent(); 
     
    6566  globalDomainIndexOnProc = dhtIndexProcRank.getInfoIndexMap(); 
    6667} 
     68CATCH 
    6769 
    6870} 
  • XIOS/dev/branch_openmp/src/transformation/domain_algorithm_zoom.cpp

    r1460 r1642  
    1 /*! 
    2    \file domain_algorithm_zoom.cpp 
    3    \author Ha NGUYEN 
    4    \since 02 Jul 2015 
    5    \date 02 Jul 2015 
    6  
    7    \brief Algorithm for zooming on an domain. 
    8  */ 
    91#include "domain_algorithm_zoom.hpp" 
    102#include "zoom_domain.hpp" 
     
    124#include "grid.hpp" 
    135#include "grid_transformation_factory_impl.hpp" 
     6#include "attribute_template.hpp" 
    147 
    158namespace xios { 
     
    2316                                                             std::map<int, int>& elementPositionInGridDst2AxisPosition, 
    2417                                                             std::map<int, int>& elementPositionInGridDst2DomainPosition) 
     18TRY 
    2519{ 
    2620  std::vector<CDomain*> domainListDestP = gridDst->getDomains(); 
     
    3327  return (new CDomainAlgorithmZoom(domainListDestP[domainDstIndex], domainListSrcP[domainSrcIndex], zoomDomain)); 
    3428} 
     29CATCH 
    3530 
    3631bool CDomainAlgorithmZoom::registerTrans() 
     32TRY 
    3733{ 
    3834  CGridTransformationFactory<CDomain>::registerTransformation(TRANS_ZOOM_DOMAIN, create); 
    3935} 
     36CATCH 
    4037 
    4138CDomainAlgorithmZoom::CDomainAlgorithmZoom(CDomain* domainDestination, CDomain* domainSource, CZoomDomain* zoomDomain) 
    4239: CDomainAlgorithmTransformation(domainDestination, domainSource) 
     40TRY 
    4341{ 
    4442  zoomDomain->checkValid(domainSource); 
     
    6765           << "Zoom size is " << zoomNj_ ); 
    6866  } 
    69 } 
     67 
     68  // Calculate the size of local domain 
     69  int ind, indLocSrc, indLocDest, iIdxSrc, jIdxSrc, destIBegin = -1, destJBegin = -1, niDest = 0, njDest = 0, ibeginDest, jbeginDest ; 
     70  int indGloDest, indGloSrc, niGloSrc = domainSrc_->ni_glo, iSrc, jSrc, nvertex = 0; 
     71  for (int j = 0; j < domainSrc_->nj.getValue(); j++) 
     72  { 
     73    for (int i = 0; i < domainSrc_->ni.getValue(); i++) 
     74    { 
     75      ind = j*domainSrc_->ni + i; 
     76      iIdxSrc = domainSrc_->i_index(ind); 
     77      if ((iIdxSrc >= zoomIBegin_) && (iIdxSrc <= zoomIEnd_)) 
     78      { 
     79        jIdxSrc = domainSrc_->j_index(ind); 
     80        if ((jIdxSrc >= zoomJBegin_) && (jIdxSrc <= zoomJEnd_)) 
     81        { 
     82          if ((niDest == 0) && (njDest == 0)) 
     83          { 
     84            destIBegin = i; 
     85            destJBegin = j; 
     86          } 
     87          if (i == destIBegin) ++njDest; 
     88        } 
     89        if (j == destJBegin) ++niDest; 
     90 
     91      } 
     92    } 
     93  } 
     94  ibeginDest = destIBegin + domainSrc_->ibegin - zoomIBegin_; 
     95  jbeginDest = destJBegin + domainSrc_->jbegin - zoomJBegin_; 
     96  domainDest_->ni_glo.setValue(zoomNi_); 
     97  domainDest_->nj_glo.setValue(zoomNj_); 
     98  domainDest_->ni.setValue(niDest); 
     99  domainDest_->nj.setValue(njDest); 
     100  if ( (niDest==0) || (njDest==0)) 
     101  { 
     102    domainDest_->ibegin.setValue(0); 
     103    domainDest_->jbegin.setValue(0); 
     104  } 
     105  else 
     106  { 
     107    domainDest_->ibegin.setValue(ibeginDest); 
     108    domainDest_->jbegin.setValue(jbeginDest); 
     109  } 
     110  domainDest_->i_index.resize(niDest*njDest); 
     111  domainDest_->j_index.resize(niDest*njDest); 
     112 
     113  domainDest_->data_ni.setValue(niDest); 
     114  domainDest_->data_nj.setValue(njDest); 
     115  domainDest_->data_ibegin.setValue(0); 
     116  domainDest_->data_jbegin.setValue(0); 
     117  domainDest_->data_i_index.resize(niDest*njDest); 
     118  domainDest_->data_j_index.resize(niDest*njDest); 
     119 
     120  domainDest_->domainMask.resize(niDest*njDest); 
     121 
     122  if (!domainSrc_->lonvalue_1d.isEmpty()) 
     123  { 
     124    if (domainDest_->type == CDomain::type_attr::rectilinear) 
     125    { 
     126      domainDest_->lonvalue_1d.resize(niDest); 
     127      domainDest_->latvalue_1d.resize(njDest); 
     128    } 
     129    else if (domainDest_->type == CDomain::type_attr::unstructured) 
     130    { 
     131      domainDest_->lonvalue_1d.resize(niDest); 
     132      domainDest_->latvalue_1d.resize(niDest); 
     133    } 
     134    else if (domainDest_->type == CDomain::type_attr::curvilinear) 
     135    { 
     136      domainDest_->lonvalue_1d.resize(niDest*njDest); 
     137      domainDest_->latvalue_1d.resize(niDest*njDest); 
     138    } 
     139  } 
     140  else if (!domainSrc_->lonvalue_2d.isEmpty()) 
     141  { 
     142    domainDest_->lonvalue_2d.resize(niDest,njDest); 
     143    domainDest_->latvalue_2d.resize(niDest,njDest); 
     144  } 
     145 
     146  if (domainSrc_->hasBounds) 
     147  { 
     148    nvertex = domainSrc_->nvertex; 
     149    domainDest_->nvertex.setValue(nvertex); 
     150    if (!domainSrc_->bounds_lon_1d.isEmpty()) 
     151    { 
     152      if (domainDest_->type == CDomain::type_attr::rectilinear) 
     153      { 
     154        domainDest_->bounds_lon_1d.resize(nvertex, niDest); 
     155        domainDest_->bounds_lat_1d.resize(nvertex, njDest); 
     156      } 
     157      else if (domainDest_->type == CDomain::type_attr::unstructured) 
     158      { 
     159        domainDest_->bounds_lon_1d.resize(nvertex, niDest); 
     160        domainDest_->bounds_lat_1d.resize(nvertex, niDest); 
     161      } 
     162      else if (domainDest_->type == CDomain::type_attr::curvilinear) 
     163      { 
     164        domainDest_->bounds_lon_1d.resize(nvertex, niDest*njDest); 
     165        domainDest_->bounds_lat_1d.resize(nvertex, niDest*njDest); 
     166      } 
     167    } 
     168    else if (!domainSrc_->bounds_lon_2d.isEmpty()) 
     169    { 
     170      domainDest_->bounds_lon_2d.resize(nvertex, niDest, njDest); 
     171      domainDest_->bounds_lat_2d.resize(nvertex, niDest, njDest); 
     172    } 
     173  } 
     174  if (domainSrc_->hasArea) domainDest_->area.resize(niDest,njDest); 
     175 
     176  this->transformationMapping_.resize(1); 
     177  this->transformationWeight_.resize(1); 
     178  TransformationIndexMap& transMap = this->transformationMapping_[0]; 
     179  TransformationWeightMap& transWeight = this->transformationWeight_[0]; 
     180 
     181  for (int iDest = 0; iDest < niDest; iDest++) 
     182  { 
     183    iSrc = iDest + destIBegin; 
     184    for (int jDest = 0; jDest < njDest; jDest++) 
     185    { 
     186      jSrc = jDest + destJBegin; 
     187      ind = jSrc * domainSrc_->ni + iSrc; 
     188      iIdxSrc = domainSrc_->i_index(ind); 
     189      jIdxSrc = domainSrc_->j_index(ind); 
     190      indLocDest = jDest*niDest + iDest; 
     191      indGloDest = (jDest + jbeginDest)*zoomNi_ + (iDest + ibeginDest); 
     192      indLocSrc = (jDest+destJBegin)*domainSrc_->ni + (iDest+destIBegin); 
     193      indGloSrc = (jIdxSrc )* niGloSrc + iIdxSrc; 
     194      domainDest_->i_index(indLocDest) = iDest + ibeginDest;                                             // i_index contains global positions 
     195      domainDest_->j_index(indLocDest) = jDest + jbeginDest;                                             // i_index contains global positions 
     196      domainDest_->data_i_index(indLocDest) = (domainSrc_->data_dim == 1) ? indLocDest : iDest;          // data_i_index contains local positions 
     197      domainDest_->data_j_index(indLocDest) = (domainSrc_->data_dim == 1) ? 0 :jDest;                    // data_i_index contains local positions 
     198      domainDest_->domainMask(indLocDest) = domainSrc_->domainMask(indLocSrc); 
     199 
     200      if (domainSrc_->hasArea) 
     201        domainDest_->area(iDest,jDest) = domainSrc_->area(iSrc,jSrc); 
     202 
     203      if (domainSrc_->hasLonLat) 
     204      { 
     205        if (!domainSrc_->latvalue_1d.isEmpty()) 
     206        { 
     207          if (domainDest_->type == CDomain::type_attr::rectilinear) 
     208          { 
     209            domainDest_->latvalue_1d(jDest) = domainSrc_->latvalue_1d(jSrc); 
     210          } 
     211          else 
     212          { 
     213            domainDest_->lonvalue_1d(indLocDest) = domainSrc_->lonvalue_1d(ind); 
     214            domainDest_->latvalue_1d(indLocDest) = domainSrc_->latvalue_1d(ind); 
     215          } 
     216        } 
     217        else if (!domainSrc_->latvalue_2d.isEmpty()) 
     218        { 
     219          domainDest_->lonvalue_2d(iDest,jDest) = domainSrc_->lonvalue_2d(iSrc,jSrc); 
     220          domainDest_->latvalue_2d(iDest,jDest) = domainSrc_->latvalue_2d(iSrc,jSrc); 
     221        } 
     222      } 
     223 
     224      if (domainSrc_->hasBounds) 
     225      { 
     226        if (!domainSrc_->bounds_lon_1d.isEmpty()) 
     227        { 
     228          if (domainDest_->type == CDomain::type_attr::rectilinear) 
     229          { 
     230            for (int n = 0; n < nvertex; ++n) 
     231              domainDest_->bounds_lat_1d(n,jDest) = domainSrc_->bounds_lat_1d(n,jSrc); 
     232          } 
     233          else 
     234          { 
     235            for (int n = 0; n < nvertex; ++n) 
     236            { 
     237              domainDest_->bounds_lon_1d(n,indLocDest) = domainSrc_->bounds_lon_1d(n,ind); 
     238              domainDest_->bounds_lat_1d(n,indLocDest) = domainSrc_->bounds_lat_1d(n,ind); 
     239            } 
     240          } 
     241        } 
     242        else if (!domainSrc_->bounds_lon_2d.isEmpty()) 
     243        { 
     244          for (int n = 0; n < nvertex; ++n) 
     245          { 
     246            domainDest_->bounds_lon_2d(n,iDest,jDest) = domainSrc_->bounds_lon_2d(n,iSrc,jSrc); 
     247            domainDest_->bounds_lat_2d(n,iDest,jDest) = domainSrc_->bounds_lat_2d(n,iSrc,jSrc); 
     248          } 
     249        } 
     250 
     251      } 
     252 
     253      transMap[indGloDest].push_back(indGloSrc); 
     254      transWeight[indGloDest].push_back(1.0); 
     255    } 
     256 
     257    if (domainSrc_->hasLonLat && !domainSrc_->latvalue_1d.isEmpty()) 
     258    { 
     259      if (domainDest_->type == CDomain::type_attr::rectilinear) 
     260      { 
     261        domainDest_->lonvalue_1d(iDest) = domainSrc_->lonvalue_1d(iSrc); 
     262      } 
     263    } 
     264 
     265    if (domainSrc_->hasBounds && !domainSrc_->bounds_lon_1d.isEmpty()) 
     266    { 
     267      if (domainDest_->type == CDomain::type_attr::rectilinear) 
     268      { 
     269        for (int n = 0; n < nvertex; ++n) 
     270          domainDest_->bounds_lon_1d(n,iDest) = domainSrc_->bounds_lon_1d(n,iSrc); 
     271      } 
     272    } 
     273  } 
     274  domainDest_->computeLocalMask(); 
     275} 
     276CATCH 
    70277 
    71278/*! 
     
    74281void CDomainAlgorithmZoom::computeIndexSourceMapping_(const std::vector<CArray<double,1>* >& dataAuxInputs) 
    75282{ 
    76  
    77   int niGlob = domainSrc_->ni_glo.getValue(); 
    78   int njGlob = domainSrc_->nj_glo.getValue(); 
    79  
    80   this->transformationMapping_.resize(1); 
    81   this->transformationWeight_.resize(1); 
    82  
    83   TransformationIndexMap& transMap = this->transformationMapping_[0]; 
    84   TransformationWeightMap& transWeight = this->transformationWeight_[0]; 
    85  
    86   int domainGlobalIndex; 
    87   int iglob ; 
    88   int jglob ; 
    89   const CArray<int,1>& i_index = domainSrc_->i_index.getValue() ; 
    90   const CArray<int,1>& j_index = domainSrc_->j_index.getValue() ; 
    91  
    92   int nglo = i_index.numElements() ; 
    93   for (size_t i = 0; i < nglo ; ++i) 
    94   { 
    95     iglob=i_index(i) ; jglob=j_index(i) ; 
    96     if (iglob>=zoomIBegin_ && iglob<=zoomIEnd_ && jglob>=zoomJBegin_ && jglob<=zoomJEnd_) 
    97     { 
    98       domainGlobalIndex = jglob*niGlob + iglob; 
    99       transMap[domainGlobalIndex].push_back(domainGlobalIndex); 
    100       transWeight[domainGlobalIndex].push_back(1.0); 
    101     } 
    102   } 
    103   updateZoom(); 
    104 } 
    105  
    106 /*! 
    107   After a zoom on domain, it should be certain that (global) zoom begin and (global) zoom size are updated 
    108 */ 
    109 void CDomainAlgorithmZoom::updateZoom() 
    110 { 
    111   domainDest_->global_zoom_ibegin = zoomIBegin_; 
    112   domainDest_->global_zoom_jbegin = zoomJBegin_; 
    113   domainDest_->global_zoom_ni  = zoomNi_; 
    114   domainDest_->global_zoom_nj  = zoomNj_; 
    115 } 
    116  
    117 /*! 
    118   Update mask on domain 
    119   Because only zoomed region on domain is not masked, the remaining must be masked to make sure 
    120 correct index be extracted 
    121 */ 
    122 // void CDomainAlgorithmZoom::updateDomainDestinationMask() 
    123 // { 
    124 //   int niMask     = domainDest_->ni.getValue(); 
    125 //   int iBeginMask = domainDest_->ibegin.getValue(); 
    126 //   int njMask     = domainDest_->nj.getValue(); 
    127 //   int jBeginMask = domainDest_->jbegin.getValue(); 
    128 //   int niGlob = domainDest_->ni_glo.getValue(); 
    129 //   int globalIndexMask = 0; 
    130  
    131 //   TransformationIndexMap& transMap = this->transformationMapping_[0]; 
    132 //   TransformationIndexMap::const_iterator ite = (transMap).end(); 
    133 //   for (int j = 0; j < njMask; ++j) 
    134 //   { 
    135 //     for (int i = 0; i < niMask; ++i) 
    136 //     { 
    137 //       globalIndexMask = (j+jBeginMask) * niGlob + (i + iBeginMask); 
    138 //       if (transMap.find(globalIndexMask) == ite) 
    139 //         (domainDest_->mask_1d)(i+j*niMask) = false; 
    140 //     } 
    141 //   } 
    142 // } 
    143  
    144 } 
     283} 
     284 
     285 
     286} 
  • XIOS/dev/branch_openmp/src/transformation/domain_algorithm_zoom.hpp

    r1460 r1642  
    1 /*! 
    2    \file domain_algorithm_zoom.hpp 
    3    \author Ha NGUYEN 
    4    \since 03 June 2015 
    5    \date 12 June 2015 
    61 
    7    \brief Algorithm for zooming on an domain. 
    8  */ 
    92#ifndef __XIOS_DOMAIN_ALGORITHM_ZOOM_HPP__ 
    103#define __XIOS_DOMAIN_ALGORITHM_ZOOM_HPP__ 
     
    2013/*! 
    2114  \class CDomainAlgorithmZoom 
    22   Implementing zoom on domain 
    23   A zoomed region can be considered as region that isnt masked. 
    24   Only this zoomed region is extracted to write on Netcdf. 
     15  Implementing zoom (alternative zoom) on domain 
    2516*/ 
    2617class CDomainAlgorithmZoom : public CDomainAlgorithmTransformation 
     
    3324  static bool registerTrans(); 
    3425protected: 
     26  void updateDomainAttributes(); 
    3527  void computeIndexSourceMapping_(const std::vector<CArray<double,1>* >& dataAuxInputs); 
    3628 
    3729private: 
    38   // void updateDomainDestinationMask(); 
    3930  void updateZoom(); 
    4031 
  • XIOS/dev/branch_openmp/src/transformation/generic_algorithm_transformation.cpp

    r1545 r1642  
    3434                                            std::vector<bool>& flagInitial, 
    3535                                            bool ignoreMissingValue, bool firstPass  ) 
     36TRY 
    3637{ 
    3738  int nbLocalIndex = localIndex.size();    
    3839  double defaultValue = std::numeric_limits<double>::quiet_NaN(); 
    39    
     40     
    4041  if (ignoreMissingValue) 
    4142  { 
    4243    if (firstPass) dataOut=defaultValue ; 
    43   
     44     
    4445    for (int idx = 0; idx < nbLocalIndex; ++idx) 
    4546    { 
     
    6162  } 
    6263} 
     64CATCH 
    6365 
    6466void CGenericAlgorithmTransformation::computePositionElements(CGrid* dst, CGrid* src) 
     67TRY 
    6568{ 
    6669  int idxScalar = 0, idxAxis = 0, idxDomain = 0; 
     
    108111  } 
    109112} 
     113CATCH 
    110114 
    111115bool CGenericAlgorithmTransformation::isDistributedTransformation(int elementPositionInGrid, CGrid* gridSrc, CGrid* gridDst) 
     116TRY 
    112117{ 
    113118 
     
    131136      { 
    132137        distributed=domainListSrcP[elementPositionInGridSrc2DomainPosition_[elementPositionInGrid]]->isDistributed() ; 
    133         ep_lib::MPI_Allreduce(&distributed,&distributed_glo, 1, MPI_INT, MPI_LOR, client->intraComm) ; 
     138        ep_lib::MPI_Allreduce(&distributed,&distributed_glo, 1, EP_INT, EP_LOR, client->intraComm) ; 
    134139     
    135140      } 
     
    137142      { 
    138143        distributed=axisListSrcP[elementPositionInGridSrc2AxisPosition_[elementPositionInGrid]]->isDistributed() ; 
    139         ep_lib::MPI_Allreduce(&distributed,&distributed_glo, 1, MPI_INT, MPI_LOR, client->intraComm) ; 
     144        ep_lib::MPI_Allreduce(&distributed,&distributed_glo, 1, EP_INT, EP_LOR, client->intraComm) ; 
    140145      } 
    141146      else //it's a scalar 
     
    147152  } 
    148153  return isDistributed_ ; 
    149  
     154} 
     155CATCH 
     156 
    150157/*! 
    151158  This function computes the global indexes of grid source, which the grid destination is in demand. 
     
    160167                                                               CGrid* gridDst, 
    161168                                                               SourceDestinationIndexMap& globaIndexWeightFromSrcToDst) 
     169TRY 
    162170 { 
    163171  CContext* context = CContext::getCurrent(); 
     
    230238  int sendValue = (computeGlobalIndexOnProc) ? 1 : 0; 
    231239  int recvValue = 0; 
    232   ep_lib::MPI_Allreduce(&sendValue, &recvValue, 1, MPI_INT, MPI_SUM, client->intraComm); 
     240  ep_lib::MPI_Allreduce(&sendValue, &recvValue, 1, EP_INT, EP_SUM, client->intraComm); 
    233241  computeGlobalIndexOnProc = (0 < recvValue); 
    234242 
     
    443451  }   
    444452 } 
     453CATCH 
    445454 
    446455/*! 
     
    461470                                                                   std::vector<std::unordered_map<int,std::vector<size_t> > >& globalElementIndexOnProc, 
    462471                                                                   SourceDestinationIndexMap& globaIndexWeightFromSrcToDst) 
     472TRY 
    463473{ 
    464474  SourceDestinationIndexMap globaIndexWeightFromSrcToDst_tmp ; 
     
    640650       } 
    641651     } 
    642  
    643 } 
     652} 
     653CATCH 
    644654 
    645655/*! 
     
    654664                                                                 CArray<size_t,1>& destGlobalIndexPositionInGrid, 
    655665                                                                 std::unordered_map<int,std::vector<size_t> >& globalScalarIndexOnProc) 
     666TRY 
    656667{ 
    657668  CContext* context = CContext::getCurrent(); 
     
    666677  } 
    667678} 
     679CATCH 
    668680 
    669681/*! 
     
    678690                                                               CArray<size_t,1>& destGlobalIndexPositionInGrid, 
    679691                                                               std::unordered_map<int,std::vector<size_t> >& globalAxisIndexOnProc) 
     692TRY 
    680693{ 
    681694  CContext* context = CContext::getCurrent(); 
     
    735748  } 
    736749} 
     750CATCH 
    737751 
    738752/*! 
     
    747761                                                                 CArray<size_t,1>& destGlobalIndexPositionInGrid, 
    748762                                                                 std::unordered_map<int,std::vector<size_t> >& globalDomainIndexOnProc) 
     763TRY 
    749764{ 
    750765  CContext* context = CContext::getCurrent(); 
     
    838853  } 
    839854} 
    840  
    841  
    842  
    843  
    844  
     855CATCH 
    845856 
    846857void CGenericAlgorithmTransformation::computeTransformationMappingNonDistributed(int elementPositionInGrid, CGrid* gridSrc, CGrid* gridDst, 
    847                                                                                  vector<int>& localSrc, vector<int>& localDst, vector<double>& weight, vector<bool>& localMaskOnGridDest) 
     858                                                                                 vector<int>& localSrc, vector<int>& localDst, vector<double>& weight, 
     859                                                                                 int& nlocalIndexDest) 
     860TRY 
    848861{ 
    849862 
     
    871884     
    872885  int nlocalIndexSrc=1 ; 
    873   int nlocalIndexDest=1 ; 
     886//  int nlocalIndexDest=1 ; 
     887  nlocalIndexDest=1 ; 
    874888  CArray<bool,1> maskScalar(1) ; 
    875889  maskScalar  = true ; 
     
    933947    nlocalIndexDest=nlocalIndexDest*nIndexDst[i] ; 
    934948  } 
    935  
    936  
    937  
    938  
    939  
    940949 
    941950  vector<int> dstLocalInd ; 
     
    985994  } 
    986995 
    987 // just get the local src mask 
    988   CArray<bool,1> localMaskOnSrcGrid; 
    989   gridSrc->getLocalMask(localMaskOnSrcGrid) ; 
    990 // intermediate grid, mask is not initialized => set up mask to true 
    991   if (localMaskOnSrcGrid.isEmpty()) 
    992   { 
    993     localMaskOnSrcGrid.resize(nlocalIndexSrc) ; 
    994     localMaskOnSrcGrid=true ; 
    995   } 
    996    
    997  
    998   localMaskOnGridDest.resize(nlocalIndexDest,false) ; 
    999  
    1000996  vector<vector<vector<pair<int,double> > > > dstIndWeight(transformationMapping_.size()) ; 
    1001997    
     
    10241020   
    10251021  nonDistributedrecursiveFunct(nElement-1,true,elementPositionInGrid,maskSrc,maskDst, srcInd, srcIndCompressed, nIndexSrc, t, dstIndWeight,   
    1026                                currentInd,localSrc,localDst,weight, localMaskOnSrcGrid, localMaskOnGridDest ); 
     1022                               currentInd,localSrc,localDst,weight); 
    10271023                
    10281024} 
    1029  
    1030  
    1031 void CGenericAlgorithmTransformation::nonDistributedrecursiveFunct(int currentPos, bool masked, int elementPositionInGrid, vector< CArray<bool,1>* >& maskSrc, vector< CArray<bool,1>* >& maskDst, int& srcInd, int& srcIndCompressed, vector<int>& nIndexSrc, int& t, vector<vector<vector<pair<int,double> > > >& dstIndWeight, int currentInd, 
    1032                     vector<int>& localSrc, vector<int>& localDst, vector<double>& weight,  CArray<bool,1>& localMaskOnGridSrc, vector<bool>& localMaskOnGridDest ) 
     1025CATCH 
     1026 
     1027 
     1028void CGenericAlgorithmTransformation::nonDistributedrecursiveFunct(int currentPos, bool masked, int elementPositionInGrid, 
     1029                                                                   vector< CArray<bool,1>* >& maskSrc, vector< CArray<bool,1>* >& maskDst, 
     1030                                                                   int& srcInd, int& srcIndCompressed, vector<int>& nIndexSrc, 
     1031                                                                   int& t, vector<vector<vector<pair<int,double> > > >& dstIndWeight, int currentInd, 
     1032                                                                   vector<int>& localSrc, vector<int>& localDst, vector<double>& weight) 
     1033TRY 
    10331034{ 
    10341035  int masked_ ; 
     
    10431044        masked_=masked ; 
    10441045        if (!mask(i)) masked_=false ; 
    1045         nonDistributedrecursiveFunct(currentPos-1, masked_, elementPositionInGrid, maskSrc, maskDst, srcInd, srcIndCompressed, nIndexSrc, t, dstIndWeight, currentInd, localSrc, localDst, weight, localMaskOnGridSrc, localMaskOnGridDest) ; 
     1046        nonDistributedrecursiveFunct(currentPos-1, masked_, elementPositionInGrid, maskSrc, maskDst, srcInd, srcIndCompressed, nIndexSrc, t, 
     1047                                     dstIndWeight, currentInd, localSrc, localDst, weight); 
    10461048      } 
    10471049    } 
     
    10571059            for(vector<pair<int,double> >::iterator it = dstIndWeight[t][currentInd].begin(); it!=dstIndWeight[t][currentInd].end(); ++it) 
    10581060            { 
    1059               if (localMaskOnGridSrc(srcInd)) 
    1060               { 
    1061                 localSrc.push_back(srcIndCompressed) ; 
    1062                 localDst.push_back(it->first) ; 
    1063                 weight.push_back(it->second) ; 
    1064                 localMaskOnGridDest[it->first]=true ; 
    1065               } 
     1061              localSrc.push_back(srcIndCompressed) ; 
     1062              localDst.push_back(it->first) ; 
     1063              weight.push_back(it->second) ; 
    10661064              (it->first)++ ; 
    10671065            } 
    10681066          } 
    10691067          if (t < dstIndWeight.size()-1) t++ ; 
    1070           if (localMaskOnGridSrc(srcInd)) srcIndCompressed ++ ; 
     1068            srcIndCompressed ++ ; 
    10711069        } 
    10721070        srcInd++ ; 
     
    10861084        masked_=masked ; 
    10871085        if (!mask(i)) masked_=false ;  
    1088         nonDistributedrecursiveFunct(currentPos-1, masked_, elementPositionInGrid, maskSrc, maskDst, srcInd, srcIndCompressed, nIndexSrc, t, dstIndWeight , i,  localSrc, localDst, weight, localMaskOnGridSrc, localMaskOnGridDest) ; 
     1086        nonDistributedrecursiveFunct(currentPos-1, masked_, elementPositionInGrid, maskSrc, maskDst, srcInd, 
     1087                                     srcIndCompressed, nIndexSrc, t, dstIndWeight , i,  localSrc, localDst, weight); 
    10891088      } 
    10901089    } 
     
    11001099            for(vector<pair<int,double> >::iterator it = dstIndWeight[t][i].begin(); it!=dstIndWeight[t][i].end(); ++it) 
    11011100            { 
    1102               if (localMaskOnGridSrc(srcInd)) 
    1103               { 
    1104                 localSrc.push_back(srcIndCompressed) ; 
    1105                 localDst.push_back(it->first) ; 
    1106                 weight.push_back(it->second) ; 
    1107                 localMaskOnGridDest[it->first]=true ; 
    1108               } 
     1101              localSrc.push_back(srcIndCompressed) ; 
     1102              localDst.push_back(it->first) ; 
     1103              weight.push_back(it->second) ; 
    11091104              (it->first)++ ; 
    11101105            } 
    11111106           } 
    11121107          if (t < dstIndWeight.size()-1) t++ ; 
    1113           if (localMaskOnGridSrc(srcInd)) srcIndCompressed ++ ; 
     1108          srcIndCompressed ++ ; 
    11141109        } 
    11151110        srcInd++ ; 
     
    11191114 
    11201115} 
    1121  
    1122  
    1123  
    1124  
    1125  
    1126  
    1127  
    1128  
    1129  
    1130  
     1116CATCH 
    11311117 
    11321118/*! 
     
    11361122*/ 
    11371123void CGenericAlgorithmTransformation::computeIndexSourceMapping(const std::vector<CArray<double,1>* >& dataAuxInputs) 
     1124TRY 
    11381125{ 
    11391126  computeIndexSourceMapping_(dataAuxInputs); 
    11401127} 
     1128CATCH 
    11411129 
    11421130std::vector<StdString> CGenericAlgorithmTransformation::getIdAuxInputs() 
     1131TRY 
    11431132{ 
    11441133  return idAuxInputs_; 
    11451134} 
     1135CATCH 
    11461136 
    11471137CGenericAlgorithmTransformation::AlgoTransType CGenericAlgorithmTransformation::type() 
     1138TRY 
    11481139{ 
    11491140  return type_; 
    11501141} 
    1151  
    1152 } 
     1142CATCH 
     1143 
     1144} 
  • XIOS/dev/branch_openmp/src/transformation/generic_algorithm_transformation.hpp

    r1545 r1642  
    8888  void computeIndexSourceMapping(const std::vector<CArray<double,1>* >& dataAuxInputs = std::vector<CArray<double,1>* >()); 
    8989  void computeTransformationMappingNonDistributed(int elementPositionInGrid, CGrid* gridSrc, CGrid* gridDst, 
    90                                                   vector<int>& localSrc, vector<int>& localDst, vector<double>& weight, vector<bool>& localMaskOnGridDest); 
    91   void nonDistributedrecursiveFunct(int currentPos, bool masked, int elementPositionInGrid,  vector< CArray<bool,1>* >& maskSrc, vector< CArray<bool,1>* >& maskDst, int& srcInd, int& srcIndCompressed, vector<int>& nIndexSrc, int& t, vector<vector<vector<pair<int,double> > > >& dstIndWeight, int currentInd, 
    92                                      vector<int>& localSrc, vector<int>& localDst, vector<double>& weight, CArray<bool,1>& localMaskOnGridSrc, vector<bool>& localMaskOnGridDest) ; 
     90                                                  vector<int>& localSrc, vector<int>& localDst, vector<double>& weight, int& nbLocalIndexOnGridDest); 
     91  void nonDistributedrecursiveFunct(int currentPos, bool masked, int elementPositionInGrid,  vector< CArray<bool,1>* >& maskSrc, vector< CArray<bool,1>* >& maskDst, 
     92                                    int& srcInd, int& srcIndCompressed, vector<int>& nIndexSrc, 
     93                                    int& t, vector<vector<vector<pair<int,double> > > >& dstIndWeight, int currentInd, 
     94                                    vector<int>& localSrc, vector<int>& localDst, vector<double>& weight) ; 
    9395 
    9496protected: 
  • XIOS/dev/branch_openmp/src/transformation/grid_generate.cpp

    r978 r1642  
    3030*/ 
    3131void CGridGenerate::selectScalarAlgo(int elementPositionInGrid, ETranformationType transType, int transformationOrder) 
     32TRY 
    3233{ 
    3334  CGenericAlgorithmTransformation* algo = 0; 
    3435  algoTransformation_.push_back(algo); 
    3536} 
     37CATCH 
    3638 
    3739/*! 
     
    4345*/ 
    4446void CGridGenerate::selectAxisAlgo(int elementPositionInGrid, ETranformationType transType, int transformationOrder) 
     47TRY 
    4548{ 
    4649  CGenericAlgorithmTransformation* algo = 0; 
    4750  algoTransformation_.push_back(algo); 
    4851} 
     52CATCH 
    4953 
    5054/*! 
     
    5660*/ 
    5761void CGridGenerate::selectDomainAlgo(int elementPositionInGrid, ETranformationType transType, int transformationOrder) 
     62TRY 
    5863{ 
    5964  std::vector<CDomain*> domainListDestP = gridDestination_->getDomains(); 
     
    8994  algoTransformation_.push_back(algo); 
    9095} 
     96CATCH 
    9197 
    9298/*! 
     
    94100*/ 
    95101void CGridGenerate::completeGrid() 
     102TRY 
    96103{ 
    97104  ListAlgoType::const_iterator itb = listAlgos_.begin(), 
     
    110117  } 
    111118} 
     119CATCH 
    112120 
    113121} 
  • XIOS/dev/branch_openmp/src/transformation/grid_transformation.cpp

    r1545 r1642  
    3838*/ 
    3939void CGridTransformation::selectScalarAlgo(int elementPositionInGrid, ETranformationType transType, int transformationOrder) 
     40TRY 
    4041{ 
    4142  std::vector<CScalar*> scaListDestP = gridDestination_->getScalars(); 
     
    5960  algoTransformation_.push_back(algo); 
    6061} 
     62CATCH 
    6163 
    6264/*! 
     
    6769*/ 
    6870void CGridTransformation::selectAxisAlgo(int elementPositionInGrid, ETranformationType transType, int transformationOrder) 
     71TRY 
    6972{ 
    7073  std::vector<CAxis*> axisListDestP = gridDestination_->getAxis(); 
     
    8891  algoTransformation_.push_back(algo); 
    8992} 
     93CATCH 
    9094 
    9195/*! 
     
    96100*/ 
    97101void CGridTransformation::selectDomainAlgo(int elementPositionInGrid, ETranformationType transType, int transformationOrder) 
     102TRY 
    98103{ 
    99104  std::vector<CDomain*> domainListDestP = gridDestination_->getDomains(); 
     
    117122  algoTransformation_.push_back(algo); 
    118123} 
     124CATCH 
    119125 
    120126/*! 
     
    123129*/ 
    124130std::map<int,std::pair<int,int> > CGridTransformation::getElementPosition(CGrid* grid) 
     131TRY 
    125132{ 
    126133  std::vector<CScalar*> scalarListP = grid->getScalars();  
     
    155162  return elementPosition;   
    156163} 
     164CATCH 
    157165 
    158166/*! 
     
    163171*/ 
    164172void CGridTransformation::setUpGridDestination(int elementPositionInGrid, ETranformationType transType) 
     173TRY 
    165174{ 
    166175  if (isSpecialTransformation(transType)) return; 
     
    240249  tempGridDests_.push_back(tmpGridDestination_); 
    241250} 
     251CATCH 
    242252 
    243253/*! 
     
    249259*/ 
    250260void CGridTransformation::setUpGridSource(int elementPositionInGrid) 
     261TRY 
    251262{ 
    252263  if (!tempGridSrcs_.empty() && (getNbAlgo()-1) == tempGridSrcs_.size()) 
     
    326337  tempGridSrcs_.push_back(gridSource_); 
    327338} 
     339CATCH 
    328340 
    329341/*! 
     
    336348*/ 
    337349void CGridTransformation::computeAll(const std::vector<CArray<double,1>* >& dataAuxInputs, Time timeStamp) 
     350TRY 
    338351{ 
    339352  if (nbNormalAlgos_ < 1) return; 
     
    346359      std::list<RecvIndexGridDestinationMap>().swap(localIndexToReceiveOnGridDest_); 
    347360      std::list<size_t>().swap(nbLocalIndexOnGridDest_); 
    348       std::list<std::vector<bool> >().swap(localMaskOnGridDest_); 
    349361    } 
    350362    else 
     
    399411        vector<int> localDst ; 
    400412        vector<double> weight ; 
    401         localMaskOnGridDest_.push_back(vector<bool>()) ; 
     413        int nbLocalIndexOnGridDest; 
    402414        CTimer::get("computeTransformationMappingNonDistributed").resume();   
    403415        algo->computeTransformationMappingNonDistributed(elementPosition, gridSource_, tmpGridDestination_,  
    404                                                          localSrc, localDst, weight, localMaskOnGridDest_.back()) ; 
     416                                                         localSrc, localDst, weight, nbLocalIndexOnGridDest) ; 
    405417        CTimer::get("computeTransformationMappingNonDistributed").suspend();   
    406418 
    407419        CTimer::get("computeTransformationMappingConvert").resume();   
    408         nbLocalIndexOnGridDest_.push_back(localMaskOnGridDest_.back().size()) ; 
     420        nbLocalIndexOnGridDest_.push_back(nbLocalIndexOnGridDest) ; 
    409421        int clientRank=client->clientRank ; 
    410422        { 
     
    453465  } 
    454466} 
     467CATCH 
    455468 
    456469/*! 
     
    459472*/ 
    460473void CGridTransformation::computeTransformationMapping(const SourceDestinationIndexMap& globaIndexWeightFromSrcToDst) 
     474TRY 
    461475{ 
    462476  CContext* context = CContext::getCurrent(); 
     
    472486  size_t nbLocalIndex = globalLocalIndexGridDestSendToServer.size(); 
    473487  nbLocalIndexOnGridDest_.push_back(nbLocalIndex); 
    474   localMaskOnGridDest_.push_back(std::vector<bool>()); 
    475   std::vector<bool>& tmpMask = localMaskOnGridDest_.back(); 
    476   tmpMask.resize(nbLocalIndex,false); 
     488//  localMaskOnGridDest_.push_back(std::vector<bool>()); 
     489//  std::vector<bool>& tmpMask = localMaskOnGridDest_.back(); 
     490//  tmpMask.resize(nbLocalIndex,false); 
    477491 
    478492  // Find out number of index sent from grid source and number of index received on grid destination 
     
    500514    sendRankSizeMap[itIndex->first] = sendSize; 
    501515  } 
    502   ep_lib::MPI_Allgather(&connectedClient,1,MPI_INT,recvCount,1,MPI_INT,client->intraComm); 
     516  ep_lib::MPI_Allgather(&connectedClient,1,EP_INT,recvCount,1,EP_INT,client->intraComm); 
    503517 
    504518  displ[0]=0 ; 
     
    507521  int* recvRankBuff=new int[recvSize]; 
    508522  int* recvSizeBuff=new int[recvSize]; 
    509   ep_lib::MPI_Allgatherv(sendRankBuff,connectedClient,MPI_INT,recvRankBuff,recvCount,displ,MPI_INT,client->intraComm); 
    510   ep_lib::MPI_Allgatherv(sendSizeBuff,connectedClient,MPI_INT,recvSizeBuff,recvCount,displ,MPI_INT,client->intraComm); 
     523  ep_lib::MPI_Allgatherv(sendRankBuff,connectedClient,EP_INT,recvRankBuff,recvCount,displ,EP_INT,client->intraComm); 
     524  ep_lib::MPI_Allgatherv(sendSizeBuff,connectedClient,EP_INT,recvSizeBuff,recvCount,displ,EP_INT,client->intraComm); 
    511525  for (int i = 0; i < nbClient; ++i) 
    512526  { 
     
    532546    recvGlobalIndexSrc[recvRank] = new unsigned long [recvSize]; 
    533547 
    534     ep_lib::MPI_Irecv(recvGlobalIndexSrc[recvRank], recvSize, MPI_UNSIGNED_LONG, recvRank, 46, client->intraComm, &requests[requests_position++]); 
    535     ep_lib::MPI_Irecv(recvMaskDst[recvRank], recvSize, MPI_UNSIGNED_CHAR, recvRank, 47, client->intraComm, &requests[requests_position++]); 
     548    ep_lib::MPI_Irecv(recvGlobalIndexSrc[recvRank], recvSize, EP_UNSIGNED_LONG, recvRank, 46, client->intraComm, &requests[requests_position++]); 
     549    ep_lib::MPI_Irecv(recvMaskDst[recvRank], recvSize, EP_UNSIGNED_CHAR, recvRank, 47, client->intraComm, &requests[requests_position++]); 
     550 
     551    //requests.push_back(ep_lib::MPI_Request()); 
     552    //ep_lib::MPI_Irecv(recvGlobalIndexSrc[recvRank], recvSize, EP_UNSIGNED_LONG, recvRank, 46, client->intraComm, &requests.back()); 
     553    //requests.push_back(ep_lib::MPI_Request()); 
     554    //ep_lib::MPI_Irecv(recvMaskDst[recvRank], recvSize, EP_UNSIGNED_CHAR, recvRank, 47, client->intraComm, &requests.back()); 
    536555  } 
    537556 
     
    568587 
    569588    // Send global index source and mask 
    570     ep_lib::MPI_Isend(sendGlobalIndexSrc[sendRank], sendSize, MPI_UNSIGNED_LONG, sendRank, 46, client->intraComm, &requests[requests_position++]); 
    571     ep_lib::MPI_Isend(sendMaskDst[sendRank], sendSize, MPI_UNSIGNED_CHAR, sendRank, 47, client->intraComm, &requests[requests_position++]); 
     589    ep_lib::MPI_Isend(sendGlobalIndexSrc[sendRank], sendSize, EP_UNSIGNED_LONG, sendRank, 46, client->intraComm, &requests[requests_position++]); 
     590    ep_lib::MPI_Isend(sendMaskDst[sendRank], sendSize, EP_UNSIGNED_CHAR, sendRank, 47, client->intraComm, &requests[requests_position++]); 
     591    //requests.push_back(ep_lib::MPI_Request()); 
     592    //ep_lib::MPI_Isend(sendGlobalIndexSrc[sendRank], sendSize, EP_UNSIGNED_LONG, sendRank, 46, client->intraComm, &requests.back()); 
     593    //requests.push_back(ep_lib::MPI_Request()); 
     594    //ep_lib::MPI_Isend(sendMaskDst[sendRank], sendSize, EP_UNSIGNED_CHAR, sendRank, 47, client->intraComm, &requests.back()); 
    572595  } 
    573596 
     
    585608    int recvSize = itSend->second; 
    586609 
    587     ep_lib::MPI_Irecv(sendMaskDst[recvRank], recvSize, MPI_UNSIGNED_CHAR, recvRank, 48, client->intraComm, &requests[requests_position++]); 
     610    ep_lib::MPI_Irecv(sendMaskDst[recvRank], recvSize, EP_UNSIGNED_CHAR, recvRank, 48, client->intraComm, &requests[requests_position++]); 
     611    //requests.push_back(ep_lib::MPI_Request()); 
     612    //ep_lib::MPI_Irecv(sendMaskDst[recvRank], recvSize, EP_UNSIGNED_CHAR, recvRank, 48, client->intraComm, &requests.back()); 
    588613  } 
    589614 
     
    621646 
    622647    // Okie, now inform the destination which source index are masked 
    623     ep_lib::MPI_Isend(recvMaskDst[recvRank], recvSize, MPI_UNSIGNED_CHAR, recvRank, 48, client->intraComm, &requests[requests_position++]); 
     648    ep_lib::MPI_Isend(recvMaskDst[recvRank], recvSize, EP_UNSIGNED_CHAR, recvRank, 48, client->intraComm, &requests[requests_position++]); 
     649    //requests.push_back(ep_lib::MPI_Request()); 
     650    //ep_lib::MPI_Isend(recvMaskDst[recvRank], recvSize, EP_UNSIGNED_CHAR, recvRank, 48, client->intraComm, &requests.back()); 
    624651  } 
    625652  status.resize(requests.size()); 
     
    653680        recvTmp[recvRank][realRecvSize].first = globalLocalIndexGridDestSendToServer[recvIndexDst(idx)]; 
    654681        recvTmp[recvRank][realRecvSize].second = recvWeightDst(idx); 
    655         tmpMask[globalLocalIndexGridDestSendToServer[recvIndexDst(idx)]] = true; 
    656682         ++realRecvSize; 
    657683      } 
     
    678704 
    679705} 
     706CATCH 
    680707 
    681708/*! 
     
    684711*/ 
    685712const std::list<CGridTransformation::SendingIndexGridSourceMap>& CGridTransformation::getLocalIndexToSendFromGridSource() const 
     713TRY 
    686714{ 
    687715  return localIndexToSendFromGridSource_; 
    688716} 
     717CATCH 
    689718 
    690719/*! 
     
    693722*/ 
    694723const std::list<CGridTransformation::RecvIndexGridDestinationMap>& CGridTransformation::getLocalIndexToReceiveOnGridDest() const 
     724TRY 
    695725{ 
    696726  return localIndexToReceiveOnGridDest_; 
    697727} 
     728CATCH 
    698729 
    699730/*! 
     
    702733*/ 
    703734const std::list<size_t>& CGridTransformation::getNbLocalIndexToReceiveOnGridDest() const 
     735TRY 
    704736{ 
    705737  return nbLocalIndexOnGridDest_; 
    706738} 
    707  
    708 /*! 
    709   Local mask of data which will be received on the grid destination 
    710   \return local mask of data 
    711 */ 
    712 const std::list<std::vector<bool> >& CGridTransformation::getLocalMaskIndexOnGridDest() const 
    713 { 
    714   return localMaskOnGridDest_; 
    715 } 
    716  
    717 } 
     739CATCH 
     740 
     741} 
  • XIOS/dev/branch_openmp/src/transformation/grid_transformation.hpp

    r1328 r1642  
    1212#include <map> 
    1313#include <vector> 
    14 #include "mpi_std.hpp" 
    1514#include "generic_algorithm_transformation.hpp" 
    1615#include "transformation_enum.hpp" 
     
    5049  const std::list<RecvIndexGridDestinationMap>& getLocalIndexToReceiveOnGridDest() const; 
    5150  const std::list<size_t>& getNbLocalIndexToReceiveOnGridDest() const; 
    52   const std::list<std::vector<bool> >& getLocalMaskIndexOnGridDest() const; 
    5351 
    5452  CGrid* getGridSource() { return originalGridSource_; } 
     
    8583  //! Number of local index of data to receive on grid destination 
    8684  std::list<size_t> nbLocalIndexOnGridDest_; 
    87   std::list<std::vector<bool> > localMaskOnGridDest_; 
    8885 
    8986  bool dynamicalTransformation_; 
  • XIOS/dev/branch_openmp/src/transformation/grid_transformation_factory_impl.hpp

    r1334 r1642  
    5757  typedef std::map<ETranformationType, CreateTransformationCallBack> CallBackMap; 
    5858  static CallBackMap* transformationCreationCallBacks_; 
    59   #pragma omp threadprivate(transformationCreationCallBacks_) 
    6059  static bool registerTransformation(ETranformationType transType, CreateTransformationCallBack createFn); 
    6160  static bool unregisterTransformation(ETranformationType transType); 
    6261  static bool initializeTransformation_; 
    63   #pragma omp threadprivate(initializeTransformation_) 
    6462}; 
    6563 
  • XIOS/dev/branch_openmp/src/transformation/grid_transformation_selector.cpp

    r1460 r1642  
    1010#include "grid.hpp" 
    1111#include "algo_types.hpp" 
    12 using namespace ep_lib; 
    1312 
    1413namespace xios { 
     
    2928  CAxisAlgorithmExtractDomain::registerTrans(); 
    3029  CAxisAlgorithmInterpolate::registerTrans(); 
     30  CAxisAlgorithmExtract::registerTrans(); 
    3131  CAxisAlgorithmInverse::registerTrans(); 
    3232  CAxisAlgorithmReduceDomain::registerTrans(); 
     
    4141  CDomainAlgorithmExpand::registerTrans(); 
    4242  CDomainAlgorithmReorder::registerTrans(); 
     43  CDomainAlgorithmExtract::registerTrans(); 
    4344} 
    4445 
     
    4647 : gridSource_(source), gridDestination_(destination), isSameGrid_(false), 
    4748  listAlgos_(), algoTypes_(), nbNormalAlgos_(0), nbSpecialAlgos_(0), auxInputs_() 
     49TRY 
    4850{ 
    4951  if (0 == source) 
     
    6163  initializeTransformations(type); 
    6264} 
     65CATCH 
    6366 
    6467/*! 
     
    6972*/ 
    7073void CGridTransformationSelector::initializeTransformations(TransformationType type) 
     74TRY 
    7175{ 
    7276  // Initialize algorithms 
     
    99103  } 
    100104} 
     105CATCH 
    101106 
    102107CGridTransformationSelector::~CGridTransformationSelector() 
     108TRY 
    103109{ 
    104110  std::vector<CGenericAlgorithmTransformation*>::const_iterator itb = algoTransformation_.begin(), it, 
     
    106112  for (it = itb; it != ite; ++it) delete (*it); 
    107113} 
     114CATCH 
    108115 
    109116/*! 
     
    111118*/ 
    112119void CGridTransformationSelector::updateElementPosition() 
     120TRY 
    113121{ 
    114122  int idxScalar = 0, idxAxis = 0, idxDomain = 0; 
     
    162170  } 
    163171} 
     172CATCH 
    164173 
    165174/*! 
     
    167176*/ 
    168177void CGridTransformationSelector::initializeAlgorithms() 
     178TRY 
    169179{ 
    170180  updateElementPosition(); 
     
    187197  } 
    188198} 
     199CATCH 
    189200 
    190201/*! 
     
    196207*/ 
    197208void CGridTransformationSelector::initializeScalarAlgorithms(int scalarPositionInGrid) 
     209TRY 
    198210{ 
    199211  std::vector<CScalar*> scalarListDestP = gridDestination_->getScalars(); 
     
    228240  } 
    229241} 
     242CATCH 
    230243 
    231244/*! 
     
    237250*/ 
    238251void CGridTransformationSelector::initializeAxisAlgorithms(int axisPositionInGrid) 
     252TRY 
    239253{ 
    240254  std::vector<CAxis*> axisListDestP = gridDestination_->getAxis(); 
     
    269283  } 
    270284} 
     285CATCH 
    271286 
    272287/*! 
     
    277292*/ 
    278293void CGridTransformationSelector::initializeDomainAlgorithms(int domPositionInGrid) 
     294TRY 
    279295{ 
    280296  std::vector<CDomain*> domListDestP = gridDestination_->getDomains(); 
     
    308324    } 
    309325  } 
    310  
    311 } 
     326} 
     327CATCH 
    312328 
    313329/*! 
     
    320336*/ 
    321337void CGridTransformationSelector::selectAlgo(int elementPositionInGrid, ETranformationType transType, int transformationOrder, int algoType) 
     338TRY 
    322339{ 
    323340  updateElementPosition(); 
     
    337354  } 
    338355} 
     356CATCH 
    339357 
    340358bool CGridTransformationSelector::isSpecialTransformation(ETranformationType transType) 
     359TRY 
    341360{ 
    342361  bool res = false; 
     
    352371  return res; 
    353372} 
    354  
    355 } 
     373CATCH 
     374 
     375} 
  • XIOS/dev/branch_openmp/src/transformation/grid_transformation_selector.hpp

    r1460 r1642  
    1212#include <map> 
    1313#include <vector> 
    14 #include "mpi_std.hpp" 
    1514#include "generic_algorithm_transformation.hpp" 
    1615#include "transformation_enum.hpp" 
  • XIOS/dev/branch_openmp/src/transformation/scalar_algorithm_extract_axis.cpp

    r1545 r1642  
    1414#include "grid_transformation_factory_impl.hpp" 
    1515 
    16  
     16#include "reduction.hpp" 
    1717 
    1818namespace xios { 
     
    2626                                                                     std::map<int, int>& elementPositionInGridDst2AxisPosition, 
    2727                                                                     std::map<int, int>& elementPositionInGridDst2DomainPosition) 
     28TRY 
    2829{ 
    2930  std::vector<CScalar*> scalarListDestP = gridDst->getScalars(); 
     
    3637  return (new CScalarAlgorithmExtractAxis(scalarListDestP[scalarDstIndex], axisListSrcP[axisSrcIndex], extractAxis)); 
    3738} 
     39CATCH 
    3840 
    3941bool CScalarAlgorithmExtractAxis::registerTrans() 
     42TRY 
    4043{ 
    4144  CGridTransformationFactory<CScalar>::registerTransformation(TRANS_EXTRACT_AXIS_TO_SCALAR, create); 
    4245} 
     46CATCH 
    4347 
    4448CScalarAlgorithmExtractAxis::CScalarAlgorithmExtractAxis(CScalar* scalarDestination, CAxis* axisSource, CExtractAxisToScalar* algo) 
    4549 : CScalarAlgorithmTransformation(scalarDestination, axisSource), 
    4650   reduction_(0) 
     51TRY 
    4752{ 
    4853  algo->checkValid(scalarDestination, axisSource); 
    4954  StdString op = "extract"; 
    5055  pos_ = algo->position; 
    51   if(CReductionAlgorithm::ReductionOperations_ptr == 0)  
    52   { 
    53     CReductionAlgorithm::initReductionOperation(); 
    54   } 
    55   reduction_ = CReductionAlgorithm::createOperation(CReductionAlgorithm::ReductionOperations_ptr->at(op)); 
     56  reduction_ = CReductionAlgorithm::createOperation(CReductionAlgorithm::ReductionOperations[op]); 
    5657} 
     58CATCH 
    5759 
    5860void CScalarAlgorithmExtractAxis::apply(const std::vector<std::pair<int,double> >& localIndex, 
     
    6163                                         std::vector<bool>& flagInitial,                      
    6264                                         bool ignoreMissingValue, bool firstPass) 
     65TRY 
    6366{ 
    6467  reduction_->apply(localIndex, dataInput, dataOut, flagInitial, ignoreMissingValue, firstPass); 
    6568} 
     69CATCH 
    6670 
    6771CScalarAlgorithmExtractAxis::~CScalarAlgorithmExtractAxis() 
     72TRY 
    6873{ 
    6974  if (0 != reduction_) delete reduction_; 
    7075} 
     76CATCH 
    7177 
    7278void CScalarAlgorithmExtractAxis::computeIndexSourceMapping_(const std::vector<CArray<double,1>* >& dataAuxInputs) 
     79TRY 
    7380{ 
    7481  this->transformationMapping_.resize(1); 
     
    8188  transWeight[0].push_back(1.0); 
    8289} 
     90CATCH 
    8391 
    8492} 
  • XIOS/dev/branch_openmp/src/transformation/scalar_algorithm_extract_axis.hpp

    r1339 r1642  
    1212#include "scalar_algorithm_transformation.hpp" 
    1313#include "transformation.hpp" 
    14 #include "reduction.hpp" 
    1514 
    1615namespace xios { 
     
    2524  Extract a scalar from an axis 
    2625*/ 
    27 class CScalarAlgorithmExtractAxis : public CScalarAlgorithmTransformation, public CReductionAlgorithm 
     26class CScalarAlgorithmExtractAxis : public CScalarAlgorithmTransformation 
    2827{ 
    2928public: 
  • XIOS/dev/branch_openmp/src/transformation/scalar_algorithm_reduce_axis.cpp

    r1545 r1642  
    1313#include "grid.hpp" 
    1414#include "grid_transformation_factory_impl.hpp" 
     15#include "reduction.hpp" 
    1516 
    16  
     17#include "reduction.hpp" 
    1718 
    1819namespace xios { 
     
    2627                                                                     std::map<int, int>& elementPositionInGridDst2AxisPosition, 
    2728                                                                     std::map<int, int>& elementPositionInGridDst2DomainPosition) 
     29TRY 
    2830{ 
    2931  std::vector<CScalar*> scalarListDestP = gridDst->getScalars(); 
     
    3638  return (new CScalarAlgorithmReduceAxis(scalarListDestP[scalarDstIndex], axisListSrcP[axisSrcIndex], reduceAxis)); 
    3739} 
     40CATCH 
    3841 
    3942bool CScalarAlgorithmReduceAxis::registerTrans() 
     43TRY 
    4044{ 
    4145  CGridTransformationFactory<CScalar>::registerTransformation(TRANS_REDUCE_AXIS_TO_SCALAR, create); 
    4246} 
     47CATCH 
    4348 
    4449CScalarAlgorithmReduceAxis::CScalarAlgorithmReduceAxis(CScalar* scalarDestination, CAxis* axisSource, CReduceAxisToScalar* algo) 
    4550 : CScalarAlgorithmTransformation(scalarDestination, axisSource), 
    4651   reduction_(0) 
     52TRY 
    4753{ 
    4854  if (algo->operation.isEmpty()) 
     
    7480  } 
    7581   
    76   if(CReductionAlgorithm::ReductionOperations_ptr == 0)  
    77   { 
    78     CReductionAlgorithm::initReductionOperation(); 
    79   } 
    80    
    81   if ((*CReductionAlgorithm::ReductionOperations_ptr).end() == (*CReductionAlgorithm::ReductionOperations_ptr).find(op)) 
     82  if (CReductionAlgorithm::ReductionOperations.end() == CReductionAlgorithm::ReductionOperations.find(op)) 
    8283    ERROR("CScalarAlgorithmReduceAxis::CScalarAlgorithmReduceAxis(CAxis* axisDestination, CAxis* axisSource, CReduceAxisToScalar* algo)", 
    8384       << "Operation '" << op << "' not found. Please make sure to use a supported one" 
     
    8586       << "Scalar destination " << scalarDestination->getId()); 
    8687 
    87   reduction_ = CReductionAlgorithm::createOperation((*CReductionAlgorithm::ReductionOperations_ptr)[op]); 
     88  reduction_ = CReductionAlgorithm::createOperation(CReductionAlgorithm::ReductionOperations[op]); 
    8889} 
     90CATCH 
    8991 
    9092void CScalarAlgorithmReduceAxis::apply(const std::vector<std::pair<int,double> >& localIndex, const double* dataInput, CArray<double,1>& dataOut, 
    9193                                         std::vector<bool>& flagInitial, bool ignoreMissingValue, bool firstPass) 
     94TRY 
    9295{ 
    9396  reduction_->apply(localIndex, dataInput, dataOut, flagInitial, ignoreMissingValue, firstPass); 
    9497} 
     98CATCH 
    9599 
    96100void CScalarAlgorithmReduceAxis::updateData(CArray<double,1>& dataOut) 
     101TRY 
    97102{ 
    98103  reduction_->updateData(dataOut); 
    99104} 
     105CATCH 
    100106 
    101107CScalarAlgorithmReduceAxis::~CScalarAlgorithmReduceAxis() 
     108TRY 
    102109{ 
    103110  if (0 != reduction_) delete reduction_; 
    104111} 
     112CATCH 
    105113 
    106114void CScalarAlgorithmReduceAxis::computeIndexSourceMapping_(const std::vector<CArray<double,1>* >& dataAuxInputs) 
     115TRY 
    107116{ 
    108117  this->transformationMapping_.resize(1); 
     
    120129  } 
    121130} 
     131CATCH 
    122132 
    123133} 
  • XIOS/dev/branch_openmp/src/transformation/scalar_algorithm_reduce_axis.hpp

    r1339 r1642  
    1212#include "scalar_algorithm_transformation.hpp" 
    1313#include "transformation.hpp" 
    14 #include "reduction.hpp" 
    1514 
    1615namespace xios { 
     
    2524  Reducing an axis to a scalar 
    2625*/ 
    27 class CScalarAlgorithmReduceAxis : public CScalarAlgorithmTransformation, public CReductionAlgorithm 
     26class CScalarAlgorithmReduceAxis : public CScalarAlgorithmTransformation 
    2827{ 
    2928public: 
  • XIOS/dev/branch_openmp/src/transformation/scalar_algorithm_reduce_domain.cpp

    r1545 r1642  
    1414#include "grid_transformation_factory_impl.hpp" 
    1515 
     16#include "reduction.hpp" 
    1617 
    1718namespace xios { 
     
    2526                                                                     std::map<int, int>& elementPositionInGridDst2AxisPosition, 
    2627                                                                     std::map<int, int>& elementPositionInGridDst2DomainPosition) 
     28TRY 
    2729{ 
    2830  std::vector<CScalar*> scalarListDestP = gridDst->getScalars(); 
     
    3537  return (new CScalarAlgorithmReduceDomain(scalarListDestP[scalarDstIndex], domainListSrcP[domainSrcIndex], reduceDomain)); 
    3638} 
     39CATCH 
    3740 
    3841bool CScalarAlgorithmReduceDomain::registerTrans() 
     42TRY 
    3943{ 
    4044  CGridTransformationFactory<CScalar>::registerTransformation(TRANS_REDUCE_DOMAIN_TO_SCALAR, create); 
    4145} 
     46CATCH 
    4247 
    4348CScalarAlgorithmReduceDomain::CScalarAlgorithmReduceDomain(CScalar* scalarDestination, CDomain* domainSource, CReduceDomainToScalar* algo) 
    4449 : CScalarAlgorithmTransformation(scalarDestination, domainSource), 
    4550   reduction_(0) 
     51TRY 
    4652{ 
    4753  algo->checkValid(scalarDestination, domainSource); 
     
    7076  } 
    7177   
    72   if(CReductionAlgorithm::ReductionOperations_ptr == 0)  
    73   { 
    74     CReductionAlgorithm::initReductionOperation(); 
    75   } 
    76   if (CReductionAlgorithm::ReductionOperations_ptr->end() == CReductionAlgorithm::ReductionOperations_ptr->find(op)) 
     78  if (CReductionAlgorithm::ReductionOperations.end() == CReductionAlgorithm::ReductionOperations.find(op)) 
    7779    ERROR("CScalarAlgorithmReduceDomain::CScalarAlgorithmReduceDomain(CDomain* domainDestination, CDomain* domainSource, CReduceDomainToScalar* algo)", 
    7880       << "Operation '" << op << "' not found. Please make sure to use a supported one" 
     
    8082       << "Scalar destination " << scalarDestination->getId()); 
    8183 
    82   reduction_ = CReductionAlgorithm::createOperation(CReductionAlgorithm::ReductionOperations_ptr->at(op)); 
     84  reduction_ = CReductionAlgorithm::createOperation(CReductionAlgorithm::ReductionOperations[op]); 
    8385  local = algo->local ; 
    8486} 
     87CATCH 
    8588 
    8689void CScalarAlgorithmReduceDomain::apply(const std::vector<std::pair<int,double> >& localIndex, 
     
    8992                                         std::vector<bool>& flagInitial,                      
    9093                                         bool ignoreMissingValue, bool firstPass) 
     94TRY 
    9195{ 
    9296  reduction_->apply(localIndex, dataInput, dataOut, flagInitial, ignoreMissingValue, firstPass); 
    9397} 
     98CATCH 
    9499 
    95100void CScalarAlgorithmReduceDomain::updateData(CArray<double,1>& dataOut) 
     101TRY 
    96102{ 
    97103  reduction_->updateData(dataOut); 
    98104} 
     105CATCH 
    99106 
    100107CScalarAlgorithmReduceDomain::~CScalarAlgorithmReduceDomain() 
     108TRY 
    101109{ 
    102110  if (0 != reduction_) delete reduction_; 
    103111} 
     112CATCH 
    104113 
    105114void CScalarAlgorithmReduceDomain::computeIndexSourceMapping_(const std::vector<CArray<double,1>* >& dataAuxInputs) 
     115TRY 
    106116{ 
    107117  this->transformationMapping_.resize(1); 
     
    140150   
    141151} 
     152CATCH 
    142153 
    143154} 
  • XIOS/dev/branch_openmp/src/transformation/scalar_algorithm_reduce_domain.hpp

    r1460 r1642  
    1212#include "scalar_algorithm_transformation.hpp" 
    1313#include "transformation.hpp" 
    14 #include "reduction.hpp" 
    1514 
    1615namespace xios { 
     
    2524  Reducing an DOMAIN to a scalar 
    2625*/ 
    27 class CScalarAlgorithmReduceDomain : public CScalarAlgorithmTransformation, public CReductionAlgorithm 
     26class CScalarAlgorithmReduceDomain : public CScalarAlgorithmTransformation 
    2827{ 
    2928public: 
  • XIOS/dev/branch_openmp/src/transformation/scalar_algorithm_reduce_scalar.cpp

    r1545 r1642  
    99#include "grid.hpp" 
    1010#include "grid_transformation_factory_impl.hpp" 
    11  
     11#include "reduction.hpp" 
    1212 
    1313 
     
    2222                                                                     std::map<int, int>& elementPositionInGridDst2AxisPosition, 
    2323                                                                     std::map<int, int>& elementPositionInGridDst2DomainPosition) 
     24TRY 
    2425{ 
    2526  std::vector<CScalar*> scalarListDestP = gridDst->getScalars(); 
     
    3233  return (new CScalarAlgorithmReduceScalar(scalarListDestP[scalarDstIndex], scalarListSrcP[scalarSrcIndex], reduceScalar)); 
    3334} 
     35CATCH 
    3436 
    3537bool CScalarAlgorithmReduceScalar::registerTrans() 
     38TRY 
    3639{ 
    3740  CGridTransformationFactory<CScalar>::registerTransformation(TRANS_REDUCE_SCALAR_TO_SCALAR, create); 
    3841} 
     42CATCH 
    3943 
    4044CScalarAlgorithmReduceScalar::CScalarAlgorithmReduceScalar(CScalar* scalarDestination, CScalar* scalarSource, CReduceScalarToScalar* algo) 
    4145 : CScalarAlgorithmTransformation(scalarDestination, scalarSource), 
    4246   reduction_(0) 
     47TRY 
    4348{ 
    4449  eliminateRedondantSrc_= false ; 
     
    7075 
    7176  } 
    72  
    73   if(CReductionAlgorithm::ReductionOperations_ptr == 0)  
    74   { 
    75     CReductionAlgorithm::initReductionOperation(); 
    76   } 
    7777   
    78   if (CReductionAlgorithm::ReductionOperations_ptr->end() == CReductionAlgorithm::ReductionOperations_ptr->find(op)) 
     78  if (CReductionAlgorithm::ReductionOperations.end() == CReductionAlgorithm::ReductionOperations.find(op)) 
    7979    ERROR("CScalarAlgorithmReduceScalar::CScalarAlgorithmReduceScalar(CScalar* scalarDestination, CScalar* scalarSource, CReduceScalarToScalar* algo)", 
    8080       << "Operation '" << op << "' not found. Please make sure to use a supported one" 
     
    8282       << "Scalar destination " << scalarDestination->getId()); 
    8383 
    84   reduction_ = CReductionAlgorithm::createOperation(CReductionAlgorithm::ReductionOperations_ptr->at(op)); 
     84  reduction_ = CReductionAlgorithm::createOperation(CReductionAlgorithm::ReductionOperations[op]); 
    8585} 
     86CATCH 
    8687 
    8788void CScalarAlgorithmReduceScalar::apply(const std::vector<std::pair<int,double> >& localIndex, const double* dataInput, CArray<double,1>& dataOut, 
    8889                                         std::vector<bool>& flagInitial, bool ignoreMissingValue, bool firstPass) 
     90TRY 
    8991{ 
    9092  reduction_->apply(localIndex, dataInput, dataOut, flagInitial, ignoreMissingValue, firstPass); 
    9193} 
     94CATCH 
    9295 
    9396void CScalarAlgorithmReduceScalar::updateData(CArray<double,1>& dataOut) 
     97TRY 
    9498{ 
    9599  reduction_->updateData(dataOut); 
    96100} 
     101CATCH 
    97102 
    98103CScalarAlgorithmReduceScalar::~CScalarAlgorithmReduceScalar() 
     104TRY 
    99105{ 
    100106  if (0 != reduction_) delete reduction_; 
    101107} 
     108CATCH 
    102109 
    103110void CScalarAlgorithmReduceScalar::computeIndexSourceMapping_(const std::vector<CArray<double,1>* >& dataAuxInputs) 
     111TRY 
    104112{ 
    105113  this->transformationMapping_.resize(1); 
     
    113121 
    114122} 
     123CATCH 
    115124 
    116125} 
  • XIOS/dev/branch_openmp/src/transformation/scalar_algorithm_reduce_scalar.hpp

    r1460 r1642  
    88#include "scalar_algorithm_transformation.hpp" 
    99#include "transformation.hpp" 
    10 #include "reduction.hpp" 
    1110 
    1211namespace xios { 
     
    2019  Reducing an scalar to a scalar 
    2120*/ 
    22 class CScalarAlgorithmReduceScalar : public CScalarAlgorithmTransformation, public CReductionAlgorithm 
     21class CScalarAlgorithmReduceScalar : public CScalarAlgorithmTransformation 
    2322{ 
    2423public: 
  • XIOS/dev/branch_openmp/src/transformation/scalar_algorithm_transformation.cpp

    r1460 r1642  
    5757                                                                int elementSourceType, 
    5858                                                                CClientClientDHTInt::Index2VectorInfoTypeMap& globalIndexElementSourceOnProc) 
     59TRY 
    5960{ 
    6061  CContext* context = CContext::getCurrent(); 
     
    121122  } 
    122123} 
    123  
     124CATCH 
    124125} 
Note: See TracChangeset for help on using the changeset viewer.