Changeset 1328 for XIOS/dev/branch_openmp/src/filter
- Timestamp:
- 11/15/17 12:14:34 (6 years ago)
- Location:
- XIOS/dev/branch_openmp/src/filter
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
XIOS/dev/branch_openmp/src/filter/file_writer_filter.cpp
r1205 r1328 17 17 void CFileWriterFilter::onInputReady(std::vector<CDataPacketPtr> data) 18 18 { 19 CDataPacketPtr packet = data[0];20 21 19 const bool detectMissingValue = (!field->detect_missing_value.isEmpty() 22 20 && !field->default_value.isEmpty() 23 21 && field->detect_missing_value == true); 22 23 CArray<double, 1> dataArray = (detectMissingValue) ? data[0]->data.copy() : data[0]->data; 24 24 25 if (detectMissingValue) 25 26 { 26 27 const double missingValue = field->default_value; 27 const size_t nbData = packet->data.numElements();28 const size_t nbData = dataArray.numElements(); 28 29 for (size_t idx = 0; idx < nbData; ++idx) 29 30 { 30 if (NumTraits<double>::isnan( packet->data(idx)))31 packet->data(idx) = missingValue;31 if (NumTraits<double>::isnan(dataArray(idx))) 32 dataArray(idx) = missingValue; 32 33 } 33 34 } 34 35 35 field->sendUpdateData( packet->data);36 field->sendUpdateData(dataArray); 36 37 } 37 38 -
XIOS/dev/branch_openmp/src/filter/source_filter.cpp
r1205 r1328 99 99 void CSourceFilter::signalEndOfStream(CDate date) 100 100 { 101 date = date + offset; // this is a temporary solution, it should be part of a proper temporal filter 102 101 103 CDataPacketPtr packet(new CDataPacket); 102 104 packet->date = date; -
XIOS/dev/branch_openmp/src/filter/spatial_transform_filter.cpp
r1287 r1328 1 #include "mpi.hpp" 1 2 #include "spatial_transform_filter.hpp" 2 3 #include "grid_transformation.hpp" 3 4 #include "context.hpp" 4 5 #include "context_client.hpp" 6 using namespace ep_lib; 5 7 6 8 namespace xios … … 65 67 } 66 68 69 //std::map<CGridTransformation*, boost::shared_ptr<CSpatialTransformFilterEngine> > CSpatialTransformFilterEngine::engines; 67 70 std::map<CGridTransformation*, boost::shared_ptr<CSpatialTransformFilterEngine> > *CSpatialTransformFilterEngine::engines_ptr = 0; 68 71 … … 72 75 ERROR("CSpatialTransformFilterEngine& CSpatialTransformFilterEngine::get(CGridTransformation* gridTransformation)", 73 76 "Impossible to get the requested engine, the grid transformation is invalid."); 74 77 75 78 if(engines_ptr == NULL) engines_ptr = new std::map<CGridTransformation*, boost::shared_ptr<CSpatialTransformFilterEngine> >; 76 79 80 //std::map<CGridTransformation*, boost::shared_ptr<CSpatialTransformFilterEngine> >::iterator it = engines.find(gridTransformation); 77 81 std::map<CGridTransformation*, boost::shared_ptr<CSpatialTransformFilterEngine> >::iterator it = engines_ptr->find(gridTransformation); 82 //if (it == engines.end()) 78 83 if (it == engines_ptr->end()) 79 84 { 80 85 boost::shared_ptr<CSpatialTransformFilterEngine> engine(new CSpatialTransformFilterEngine(gridTransformation)); 86 //it = engines.insert(std::make_pair(gridTransformation, engine)).first; 81 87 it = engines_ptr->insert(std::make_pair(gridTransformation, engine)).first; 82 88 } … … 122 128 double defaultValue = std::numeric_limits<double>::quiet_NaN(); 123 129 if (0 != dataDest.numElements()) ignoreMissingValue = NumTraits<double>::isnan(dataDest(0)); 124 125 const std::list<CGridTransformation::SendingIndexGridSourceMap> *listLocalIndexSend_ptr = & (gridTransformation->getLocalIndexToSendFromGridSource()); 126 130 127 131 const std::list<CGridTransformation::SendingIndexGridSourceMap>& listLocalIndexSend = gridTransformation->getLocalIndexToSendFromGridSource(); 128 132 const std::list<CGridTransformation::RecvIndexGridDestinationMap>& listLocalIndexToReceive = gridTransformation->getLocalIndexToReceiveOnGridDest(); … … 133 137 CArray<double,1> dataCurrentDest(dataSrc.copy()); 134 138 135 std::list<CGridTransformation::SendingIndexGridSourceMap>::const_iterator itListSend = listLocalIndexSend _ptr->begin(),136 iteListSend = listLocalIndexSend _ptr->end();139 std::list<CGridTransformation::SendingIndexGridSourceMap>::const_iterator itListSend = listLocalIndexSend.begin(), 140 iteListSend = listLocalIndexSend.end(); 137 141 std::list<CGridTransformation::RecvIndexGridDestinationMap>::const_iterator itListRecv = listLocalIndexToReceive.begin(); 138 142 std::list<size_t>::const_iterator itNbListRecv = listNbLocalIndexToReceive.begin(); … … 155 159 sendBuff[idxSendBuff] = new double[itSend->second.numElements()]; 156 160 } 157 158 const CGridTransformation::RecvIndexGridDestinationMap& localIndexToReceive = *itListRecv;159 CGridTransformation::RecvIndexGridDestinationMap::const_iterator itbRecv = localIndexToReceive.begin(), itRecv,160 iteRecv = localIndexToReceive.end();161 161 162 162 idxSendBuff = 0; 163 std::vector< ep_lib::MPI_Request> sendRecvRequest(localIndexToSend.size()+localIndexToReceive.size());163 std::vector<MPI_Request> sendRecvRequest(localIndexToSend.size() + itListRecv->size()); 164 164 int position = 0; 165 165 for (itSend = itbSend; itSend != iteSend; ++itSend, ++idxSendBuff) … … 172 172 sendBuff[idxSendBuff][idx] = dataCurrentSrc(localIndex_p(idx)); 173 173 } 174 MPI_Isend(sendBuff[idxSendBuff], countSize, MPI_DOUBLE, destRank, 12, client->intraComm, &sendRecvRequest[position]); 175 position++; 174 MPI_Isend(sendBuff[idxSendBuff], countSize, MPI_DOUBLE, destRank, 12, client->intraComm, &sendRecvRequest[position++]); 176 175 } 177 176 178 177 // Receiving data on destination fields 179 178 const CGridTransformation::RecvIndexGridDestinationMap& localIndexToReceive = *itListRecv; 179 CGridTransformation::RecvIndexGridDestinationMap::const_iterator itbRecv = localIndexToReceive.begin(), itRecv, 180 iteRecv = localIndexToReceive.end(); 180 181 int recvBuffSize = 0; 181 182 for (itRecv = itbRecv; itRecv != iteRecv; ++itRecv) recvBuffSize += itRecv->second.size(); //(recvBuffSize < itRecv->second.size()) … … 188 189 int srcRank = itRecv->first; 189 190 int countSize = itRecv->second.size(); 190 MPI_Irecv(recvBuff + currentBuff, countSize, MPI_DOUBLE, srcRank, 12, client->intraComm, &sendRecvRequest[position]); 191 position++; 191 MPI_Irecv(recvBuff + currentBuff, countSize, MPI_DOUBLE, srcRank, 12, client->intraComm, &sendRecvRequest[position++]); 192 192 currentBuff += countSize; 193 193 } 194 std::vector< ep_lib::MPI_Status> status(sendRecvRequest.size());194 std::vector<MPI_Status> status(sendRecvRequest.size()); 195 195 MPI_Waitall(sendRecvRequest.size(), &sendRecvRequest[0], &status[0]); 196 196 … … 203 203 std::vector<bool> localInitFlag(dataCurrentDest.numElements(), true); 204 204 currentBuff = 0; 205 bool firstPass=true; 205 206 for (itRecv = itbRecv; itRecv != iteRecv; ++itRecv) 206 207 { … … 211 212 dataCurrentDest, 212 213 localInitFlag, 213 ignoreMissingValue );214 ignoreMissingValue,firstPass); 214 215 215 216 currentBuff += countSize; 217 firstPass=false ; 216 218 } 217 219 -
XIOS/dev/branch_openmp/src/filter/spatial_transform_filter.hpp
r1134 r1328 3 3 4 4 #include "filter.hpp" 5 6 5 namespace xios 7 6 { … … 106 105 //static std::map<CGridTransformation*, boost::shared_ptr<CSpatialTransformFilterEngine> > engines; 107 106 static std::map<CGridTransformation*, boost::shared_ptr<CSpatialTransformFilterEngine> > *engines_ptr; 108 #pragma omp threadprivate(engines_ptr)109 110 107 }; // class CSpatialTransformFilterEngine 111 108 } // namespace xios -
XIOS/dev/branch_openmp/src/filter/store_filter.cpp
r1205 r1328 78 78 void CStoreFilter::onInputReady(std::vector<CDataPacketPtr> data) 79 79 { 80 CDataPacketPtr packet = data[0]; 80 81 CDataPacketPtr packet; 82 if (detectMissingValues) 83 { 84 const size_t nbData = data[0]->data.numElements(); 85 86 packet = CDataPacketPtr(new CDataPacket); 87 packet->date = data[0]->date; 88 packet->timestamp = data[0]->timestamp; 89 packet->status = data[0]->status; 90 packet->data.resize(nbData); 91 packet->data = data[0]->data; 92 93 for (size_t idx = 0; idx < nbData; ++idx) 94 { 95 if (NumTraits<double>::isnan(packet->data(idx))) 96 packet->data(idx) = missingValue; 97 } 98 99 } 100 101 else 102 { 103 packet = data[0]; 104 } 81 105 82 106 packets.insert(std::make_pair(packet->timestamp, packet)); … … 85 109 gc.registerObject(this, packet->timestamp); 86 110 87 if (detectMissingValues)88 {89 const size_t nbData = packet->data.numElements();90 for (size_t idx = 0; idx < nbData; ++idx)91 {92 if (NumTraits<double>::isnan(packet->data(idx)))93 packet->data(idx) = missingValue;94 }95 }96 111 } 97 112 -
XIOS/dev/branch_openmp/src/filter/temporal_filter.cpp
r1124 r1328 14 14 , isOnceOperation(functor->timeType() == func::CFunctor::once) 15 15 , isInstantOperation(functor->timeType() == func::CFunctor::instant) 16 // If we can optimize the sampling when dealing with an instant functor we do it 17 , samplingFreq((isInstantOperation && samplingFreq == TimeStep && samplingOffset == NoneDu) ? opFreq : samplingFreq) 18 , samplingOffset((isInstantOperation && samplingFreq == TimeStep && samplingOffset == NoneDu) ? opFreq - initDate.getRelCalendar().getTimeStep() : samplingOffset) 16 , samplingFreq(samplingFreq) 17 , samplingOffset(samplingOffset) 19 18 , opFreq(opFreq) 20 19 , nextSamplingDate(initDate + this->samplingOffset + initDate.getRelCalendar().getTimeStep())
Note: See TracChangeset
for help on using the changeset viewer.