19 std::string configName(inConfig.
GetValue(
"ConfigName"));
20 std::ostringstream Ostr;
21 if(!configName.empty())
22 Ostr << configName <<
":";
24 std::string solutionKey(Ostr.str());
26 if(fieldNames.empty()){
27 messageStream <<
"No fields specified for domain" 28 << (configName.empty() ? std::string(
" ") : std::string(
" ("+configName+
") "))
29 <<
"state" << std::endl;
32 std::vector<std::string>::iterator fieldIt = fieldNames.begin();
33 while(fieldIt != fieldNames.end()){
34 std::string fieldName(*fieldIt++);
35 std::string fieldKey(solutionKey+std::string(
":")+fieldName);
36 std::string fieldUnits = inConfig.
GetValue<std::string>(
ConfigKey(fieldKey,
"Units"));
39 std::string fieldLocation = inConfig.
GetValue<std::string>(
ConfigKey(fieldKey,
"Location"));
40 if(dataSize <= 0 || dataSize > 8){
41 messageStream <<
"ConfigureState:Warning: invalid data size for " 42 << fieldName <<
", defaulting to double(8)." << std::endl;
46 if(numComponents <= 0)
48 if(fieldLocation.empty())
50 if(fieldLocation.size() != 1)
51 fieldLocation = fieldLocation.substr(0,1);
52 fieldLocation[0] = std::tolower(fieldLocation[0]);
53 if(fieldLocation !=
"n" && fieldLocation !=
"c" &&
54 fieldLocation !=
"m" && fieldLocation !=
"s" &&
55 fieldLocation !=
"d"){
56 messageStream <<
"ConfigureState:Warning: invalid solution location for " 57 << fieldName <<
", defaulting to nodes." << std::endl;
60 AddField(fieldName,fieldLocation[0],numComponents,dataSize,fieldUnits);
68 const std::vector<pcpp::IndexIntervalType> &haloExtents,
71 numStateComponents = numHaloVar;
72 globalPartitionExtent = partitionExtent;
73 remoteHaloExtents = haloExtents;
80 std::vector<size_t> &haloSizes)
82 std::vector<pcpp::IndexIntervalType> haloExtents;
83 int numDim = haloSizes.size()/2;
84 haloExtents.resize(numDim*2);
85 for(
int iDim = 0;iDim < numDim;iDim++){
86 size_t numNodesDim = partitionExtent[iDim].second - partitionExtent[iDim].first + 1;
87 bool leftHaloRequired =
false;
88 if(haveNeighbor.empty()){
89 if(partitionExtent[iDim].first > globalExtent[iDim].first)
90 leftHaloRequired =
true;
91 }
else if (haveNeighbor[2*iDim]) {
92 leftHaloRequired =
true;
95 size_t haloSize = haloSizes[iDim*2];
99 assert(haloSize < numNodesDim);
100 for(
int hDim = 0;hDim < numDim;hDim++){
102 if(partitionExtent[iDim].first == 0){
103 leftHaloExtent[hDim].first = globalExtent[iDim].second - haloSize + 1;
104 leftHaloExtent[hDim].second = globalExtent[iDim].second;
106 leftHaloExtent[hDim].first = partitionExtent[iDim].first - haloSize;
107 leftHaloExtent[hDim].second = leftHaloExtent[hDim].first + haloSize - 1;
110 leftHaloExtent[hDim] = partitionExtent[hDim];
113 haloExtents[iDim*2].Copy(leftHaloExtent);
115 bool rightHaloRequired =
false;
116 if(haveNeighbor.empty()){
117 if(partitionExtent[iDim].second < globalExtent[iDim].second)
118 rightHaloRequired =
true;
119 }
else if (haveNeighbor[2*iDim+1]) {
120 rightHaloRequired =
true;
122 if(rightHaloRequired){
123 size_t haloSize = haloSizes[iDim*2+1];
127 assert(haloSize < numNodesDim);
128 for(
int hDim = 0;hDim < numDim;hDim++){
130 if(partitionExtent[iDim].second == globalExtent[iDim].second){
131 rightHaloExtent[hDim].second = globalExtent[iDim].first + haloSize - 1;
132 rightHaloExtent[hDim].first = globalExtent[iDim].first;
134 rightHaloExtent[hDim].first = partitionExtent[iDim].second + 1;
135 rightHaloExtent[hDim].second = rightHaloExtent[hDim].first + haloSize - 1;
138 rightHaloExtent[hDim] = partitionExtent[hDim];
141 haloExtents[iDim*2+1].Copy(rightHaloExtent);
147 std::vector<pcpp::IndexIntervalType> halo::CreateRemoteHaloExtents(std::vector<size_t> &haloSizes)
149 std::vector<pcpp::IndexIntervalType> haloExtents(CreateRemoteHaloExtents(globalGridExtent,globalPartitionExtent,haloSizes));
157 std::vector<size_t> &haloSizes)
159 std::vector<pcpp::IndexIntervalType> haloExtents;
160 int numDim = haloSizes.size()/2;
161 haloExtents.resize(numDim*2);
162 for(
int iDim = 0;iDim < numDim;iDim++){
163 size_t numNodesDim = partitionExtent[iDim].second - partitionExtent[iDim].first + 1;
164 bool leftHaloRequired =
false;
165 if(haveNeighbor.empty()){
166 if(partitionExtent[iDim].first > globalExtent[iDim].first)
167 leftHaloRequired =
true;
168 }
else if (haveNeighbor[iDim*2]) {
169 leftHaloRequired =
true;
171 if(leftHaloRequired){
172 size_t haloSize = haloSizes[iDim*2];
176 assert(haloSize < numNodesDim);
177 for(
int hDim = 0;hDim < numDim;hDim++){
179 leftHaloExtent[hDim].first = partitionExtent[iDim].first;
180 leftHaloExtent[hDim].second = leftHaloExtent[hDim].first + haloSize - 1;
182 leftHaloExtent[hDim] = partitionExtent[hDim];
185 haloExtents[iDim*2].Copy(leftHaloExtent);
187 bool rightHaloRequired =
false;
188 if(haveNeighbor.empty()){
189 if(partitionExtent[iDim].second < globalExtent[iDim].second)
190 rightHaloRequired =
true;
191 }
else if(haveNeighbor[2*iDim+1]) {
192 rightHaloRequired =
true;
194 if(rightHaloRequired){
195 size_t haloSize = haloSizes[iDim*2+1];
199 assert(haloSize < numNodesDim);
200 for(
int hDim = 0;hDim < numDim;hDim++){
202 rightHaloExtent[hDim].first = partitionExtent[iDim].second - haloSize + 1;
203 rightHaloExtent[hDim].second = partitionExtent[hDim].second;
205 rightHaloExtent[hDim] = partitionExtent[hDim];
208 haloExtents[iDim*2+1].Copy(rightHaloExtent);
214 std::vector<pcpp::IndexIntervalType> halo::CreateLocalHaloExtents(std::vector<size_t> &haloSizes)
216 std::vector<pcpp::IndexIntervalType> haloExtents(CreateLocalHaloExtents(globalGridExtent,globalPartitionExtent,haloSizes));
222 const std::vector<pcpp::IndexIntervalType> &haloExtents)
225 globalGridExtent = globalExtent;
226 globalPartitionExtent = partitionExtent;
227 remoteHaloExtents = haloExtents;
234 globalGridExtent = globalExtent;
235 globalPartitionExtent = partitionExtent;
238 void halo::CreateHaloBuffers()
240 if(remoteHaloExtents.empty())
242 DestroyHaloBuffers();
243 ownHaloBuffers =
true;
244 haloBuffers.resize(numStateFields);
245 for(
int iField = 0;iField < numStateFields;iField++){
246 haloBuffers[iField].resize(remoteHaloExtents.size(),NULL);
247 std::vector<pcpp::IndexIntervalType>::iterator haloExtentIt = remoteHaloExtents.begin();
248 while(haloExtentIt != remoteHaloExtents.end()){
249 int haloIndex = haloExtentIt - remoteHaloExtents.begin();
251 size_t numNodes = haloExtent.
NNodes();
252 size_t numVar = numStateComponents * numNodes;
254 haloBuffers[iField][haloIndex] =
new double [numVar];
256 double *haloBufferPtr = haloBuffers[iField][haloIndex];
257 for(
size_t iVar = 0;iVar < numVar;iVar++)
258 haloBufferPtr[iVar] = -100.0;
265 void halo::DestroySendBuffers(){
267 std::vector<double *>::iterator sbIt = sendBuffers.begin();
268 while(sbIt != sendBuffers.end()){
269 double *sendBuffer = *sbIt++;
270 if(sendBuffer != NULL)
271 delete [] sendBuffer;
274 sendBuffers.resize(0);
275 sendIndices.resize(0);
278 void halo::DestroyHaloBuffers(){
280 int numHalos = remoteHaloExtents.size();
281 int numHaloBuffers = haloBuffers.size();
282 for(
int i = 0;i < numHaloBuffers;i++){
283 for(
int j = 0;j < numHalos;j++)
284 if(haloBuffers[i][j])
delete [] haloBuffers[i][j];
285 haloBuffers[i].resize(0);
288 haloBuffers.resize(0);
291 void halo::DestroyRecvBuffers(){
293 std::vector<double *>::iterator sbIt = recvBuffers.begin();
294 while(sbIt != recvBuffers.end()){
295 double *recvBuffer = *sbIt++;
296 if(recvBuffer)
delete [] recvBuffer;
299 recvBuffers.resize(0);
301 haloRecvIndices.resize(0);
305 int halo::CreateSimpleSendIndices()
307 haveSendData =
false;
308 size_t totalNumSend = 0;
309 if(localHaloExtents.empty())
312 int numSendIntervals = localHaloExtents.size();
313 sendIndices.resize(numSendIntervals);
314 for(
int i = 0;i < numSendIntervals;i++){
315 size_t numPointsSend = localHaloExtents[i].NNodes();
316 if(numPointsSend > 0){
323 if(localPartitionExtent.empty()){
325 globalPartitionExtent.GetFlatIndices(localHaloExtents[i],sendIndices[i]);
332 subHaloExtent += localPartitionExtent;
339 totalNumSend += numPointsSend;
342 haveSendData = (totalNumSend > 0);
343 return(totalNumSend);
347 int halo::CreateSimpleSendBuffers()
349 haveSendData =
false;
350 size_t totalNumSend = 0;
351 if(localHaloExtents.empty())
353 DestroySendBuffers();
354 ownSendBuffers =
true;
355 int numSendBuffers = localHaloExtents.size();
356 sendBuffers.resize(numSendBuffers,NULL);
357 sendIndices.resize(numSendBuffers);
358 for(
int i = 0;i < numSendBuffers;i++){
359 size_t numSend = localHaloExtents[i].NNodes() * numStateComponents;
366 if(localPartitionExtent.empty()){
368 globalPartitionExtent.GetFlatIndices(localHaloExtents[i],sendIndices[i]);
374 subHaloExtent += localPartitionExtent;
381 sendBuffers[i] =
new double [numSend];
385 double *bufPtr = &sendBuffers[i][0];
386 for(
size_t iSend = 0;iSend < numSend;iSend++)
387 bufPtr[iSend] = -100.0*(i+1);
389 totalNumSend += numSend;
392 haveSendData = (totalNumSend > 0);
393 return(totalNumSend);
397 int halo::CreateThreadSendIndices(
int threadId)
401 if(localHaloExtents.empty())
403 int numSendBuffers = localHaloExtents.size();
404 threadSendIndices[threadId].resize(numSendBuffers);
405 threadSendBufferIndices[threadId].resize(numSendBuffers);
407 for(
int i = 0;i < numSendBuffers;i++){
408 double *sendBuffer = sendBuffers[i];
409 size_t numSendNodes = localHaloExtents[i].NNodes();
410 std::vector<size_t> &threadSendInds(threadSendIndices[threadId][i]);
411 std::vector<size_t> &threadSendBufferInds(threadSendBufferIndices[threadId][i]);
412 if(numSendNodes > 0){
429 size_t numThreadSendNodes = threadSendInterval.
NNodes();
430 if(numThreadSendNodes > 0){
442 if(localPartitionExtent.empty()){
443 globalPartitionExtent.GetFlatIndices(threadSendInterval,threadSendInds);
449 subThreadSendExtent += localPartitionExtent;
453 bufferInterval.
GetFlatIndices(subThreadSendExtent,threadSendInds);
458 localHaloExtents[i].GetFlatIndices(threadSendInterval,threadSendBufferInds);
459 if(threadSendInds.size() != numThreadSendNodes){
464 size_t *indexPtr = &threadSendBufferInds[0];
465 for(
int iComponent = 0;iComponent < numStateComponents;iComponent++){
466 for(
size_t iSend = 0;iSend < numThreadSendNodes;iSend++){
468 sendBuffer[indexPtr[iSend]+iComponent*numSendNodes] = -100.0*(threadId+1)*(i+1);
481 int halo::CreateSendBuffers(
const std::vector<pcpp::RemoteCollisionType> &inCollisions)
483 if(inCollisions.empty())
485 DestroySendBuffers();
486 ownSendBuffers =
true;
487 int numCollisions = inCollisions.size();
488 sendBuffers.resize(numCollisions);
489 sendIndices.resize(numCollisions);
490 for(
int i = 0;i < numCollisions;i++){
493 globalPartitionExtent.GetFlatIndices(collisionExtent,sendIndices[i]);
495 size_t numSend = sendIndices[i].size() * numStateComponents;
496 sendBuffers[i] =
new double [numSend];
504 int halo::CreateRecvBuffers(
const std::vector<pcpp::RemoteCollisionType> &inCollisions)
507 recvCollisions = inCollisions;
509 if(inCollisions.empty())
511 DestroyRecvBuffers();
512 int numRecvBuffers = 0;
517 std::vector<pcpp::RemoteCollisionType>::const_iterator collIt = inCollisions.begin();
518 while(collIt != inCollisions.end()){
520 int collisionIndex = collIt - inCollisions.begin();
522 size_t numRecv = collisionExtent.
NNodes();
523 std::vector<pcpp::IndexIntervalType>::iterator haloExtentIt = remoteHaloExtents.begin();
525 while(haloExtentIt != remoteHaloExtents.end()){
527 int haloIndex = haloExtentIt - remoteHaloExtents.begin();
532 int numCollisions = 0;
533 std::vector<size_t> recvIndices;
534 if(!haloCollision.empty()){
538 assert(recvIndices.size() == numRecv);
540 haloRecvIndices.push_back(std::make_pair(haloIndex,recvIndices));
541 size_t numRecvItems = numRecv * numStateComponents;
542 double *recvBuffer =
new double [numRecvItems];
543 recvBuffers.push_back(recvBuffer);
546 assert(numCollisions == 1);
554 int halo::CreateSimpleRecvBuffers()
556 haveRecvData =
false;
557 if(remoteHaloExtents.empty()){
558 std::cout <<
"halo::CreateSimpleRecvBuffers: WARNING No remote halos." << std::endl;
561 DestroyRecvBuffers();
562 size_t totalNumRecv = 0;
563 int numRecvBuffers = remoteHaloExtents.size();
564 recvBuffers.resize(numRecvBuffers,NULL);
565 haloRecvIndices.resize(numRecvBuffers);
566 for(
int i = 0;i < numRecvBuffers;i++){
567 std::vector<size_t> recvIndices;
568 size_t numRemoteHaloNodes = remoteHaloExtents[i].NNodes();
569 if(numRemoteHaloNodes > 0){
570 if(localPartitionExtent.empty()){
571 remoteHaloExtents[i].GetFlatIndices(remoteHaloExtents[i],recvIndices);
574 localBufferExtent.
InitSimple(localBufferSizes);
575 localBufferExtent.
GetFlatIndices(remoteHaloBufferExtents[i],recvIndices);
577 assert(recvIndices.size() == remoteHaloExtents[i].NNodes());
578 haloRecvIndices[i].first = i;
579 haloRecvIndices[i].second = recvIndices;
580 size_t numRecvItems = remoteHaloExtents[i].NNodes() * numStateComponents;
581 if(numRecvItems > 0) {
582 recvBuffers[i] =
new double [numRecvItems];
586 double *recvBufferPtr = recvBuffers[i];
587 for(
size_t iItem = 0;iItem < numRecvItems;iItem++)
588 recvBufferPtr[iItem] = -1.0*(i+1);
591 totalNumRecv += numRecvItems;
593 haloRecvIndices[i].first = -1;
594 recvBuffers[i] = NULL;
597 haveRecvData = (totalNumRecv > 0);
598 return(totalNumRecv);
601 int halo::CreateSimpleRecvIndices()
603 haveRecvData =
false;
604 if(remoteHaloExtents.empty()){
605 std::cout <<
"halo::CreateSimpleRecvBuffers: WARNING No remote halos." << std::endl;
609 size_t totalNumRecv = 0;
610 int numRecvIntervals = remoteHaloExtents.size();
612 recvIndices.resize(numRecvIntervals);
613 for(
int i = 0;i < numRecvIntervals;i++){
614 std::vector<size_t> &recvIndex(recvIndices[i]);
615 size_t numRemoteHaloNodes = remoteHaloExtents[i].NNodes();
616 if(numRemoteHaloNodes > 0){
617 if(localPartitionExtent.empty()){
618 remoteHaloExtents[i].GetFlatIndices(remoteHaloExtents[i],recvIndex);
621 localBufferExtent.
InitSimple(localBufferSizes);
622 localBufferExtent.
GetFlatIndices(remoteHaloBufferExtents[i],recvIndex);
624 assert(recvIndex.size() == remoteHaloExtents[i].NNodes());
626 totalNumRecv += numRemoteHaloNodes;
629 haveRecvData = (totalNumRecv > 0);
630 return(totalNumRecv);
635 int numCommunication = recvIndices.size();
636 if(numCommunication != sendIndices.size())
638 int messageId = communicationBuffers.size();
641 newMessageBuffers.
sendBuffers.resize(numCommunication);
642 newMessageBuffers.
recvBuffers.resize(numCommunication);
645 for(
int iComm = 0;iComm < numCommunication;iComm++){
646 int numRecv = recvIndices[iComm].size();
647 int numSend = sendIndices[iComm].size();
650 newMessageBuffers.
sendBuffers[iComm] =
new double [numComponents * numSend];
651 newMessageBuffers.
recvBuffers[iComm] =
new double [numComponents * numRecv];
653 communicationBuffers.push_back(newMessageBuffers);
666 int halo::PackMessageBuffers(
const int messageId,
const int componentId,
669 assert(messageId < communicationBuffers.size());
671 assert((componentId+numComponents) <= messageBuffers.numComponents);
672 int numMessages = sendIndices.size();
673 for(
int iMessage = 0;iMessage < numMessages;iMessage++){
674 std::vector<size_t> &sendIndex(sendIndices[iMessage]);
675 size_t numSend = sendIndex.size();
676 for(
int componentIndex = 0;componentIndex <
numComponents;componentIndex++){
677 for(
size_t pointIndex = 0;pointIndex < numSend;pointIndex++){
678 size_t sendBufferIndex = pointIndex + (componentId+componentIndex)*numSend;
680 messageBuffers.sendBuffers[iMessage][sendBufferIndex] =
681 sourceBuffer[sourceBufferIndex+sendIndex[pointIndex]];
697 int halo::PackMessageBuffers(
const int messageId,
const int componentId,
701 assert(messageId < communicationBuffers.size());
703 assert((componentId+numComponents) <= messageBuffers.numComponents);
704 int numMessages = sendIndices.size();
705 for(
int iMessage = 0;iMessage < numMessages;iMessage++){
706 std::vector<size_t> &threadSendIndex(threadSendIndices[threadId][iMessage]);
707 std::vector<size_t> &threadSendBufferIndex(threadSendBufferIndices[threadId][iMessage]);
708 std::vector<size_t> &sendIndex(sendIndices[iMessage]);
709 size_t numThreadSend = threadSendIndex.size();
710 size_t numSend = sendIndex.size();
711 for(
int componentIndex = 0;componentIndex <
numComponents;componentIndex++){
712 for(
size_t pointIndex = 0;pointIndex < numThreadSend;pointIndex++){
713 size_t sendBufferIndex = threadSendBufferIndex[pointIndex] + (componentId+componentIndex)*numSend;
714 size_t sourceBufferIndex = componentIndex*
numPointsBuffer + threadSendIndex[pointIndex];
715 messageBuffers.sendBuffers[iMessage][sendBufferIndex] = sourceBuffer[sourceBufferIndex];
722 int halo::SendMessage(
const int messageId,
const std::vector<int> &neighborRanks,
725 assert(messageId < communicationBuffers.size());
727 int numMessages = neighborRanks.size();
729 assert(numMessages == messageBuffers.sendBuffers.size());
730 int messageTagBase = messageId*100;
731 for(
int iMessage = 0;iMessage < numMessages;iMessage++){
732 int numPointsSend = messageBuffers.numPointsSend[iMessage];
733 double *sendBuffer = messageBuffers.sendBuffers[iMessage];
735 int remoteRank = neighborRanks[iMessage];
736 int messageTag = messageTagBase + iMessage;
737 inComm.
ASendBuf(sendBuffer,numSendItems,remoteRank,messageTag);
742 int halo::ReceiveMessage(
const int messageId,
const std::vector<int> &neighborRanks,
745 assert(messageId < communicationBuffers.size());
747 int numMessages = neighborRanks.size();
749 assert(numMessages == messageBuffers.sendBuffers.size());
750 int messageTagBase = messageId*100;
751 for(
int iMessage = 0;iMessage < numMessages;iMessage++){
752 int iDir = iMessage%2;
753 int numPointsRecv = messageBuffers.numPointsSend[iMessage];
754 double *recvBuffer = messageBuffers.recvBuffers[iMessage];
756 int remoteRank = neighborRanks[iMessage];
757 int messageTag = messageTagBase + iMessage;
762 inComm.
ARecvBuf(recvBuffer,numRecvItems,remoteRank,messageTag);
777 int halo::UnPackMessageBuffers(
const int messageId,
const int componentId,
780 assert(messageId < communicationBuffers.size());
782 assert((componentId+numComponents) <= messageBuffers.numComponents);
783 int numMessages = recvIndices.size();
784 for(
int iMessage = 0;iMessage < numMessages;iMessage++){
785 std::vector<size_t> &recvIndex(recvIndices[iMessage]);
786 size_t numRecv = recvIndex.size();
787 for(
int componentIndex = 0;componentIndex <
numComponents;componentIndex++){
788 for(
size_t pointIndex = 0;pointIndex < numRecv;pointIndex++){
789 size_t recvBufferIndex = pointIndex + (componentId+componentIndex)*numRecv;
790 size_t targetBufferIndex = componentIndex*
numPointsBuffer + recvIndex[pointIndex];
791 targetBuffer[targetBufferIndex] = messageBuffers.recvBuffers[iMessage][recvBufferIndex];
798 int halo::UnPackMessageBuffers(
const int messageId,
const int componentId,
802 assert(messageId < communicationBuffers.size());
804 assert((componentId+numComponents) <= messageBuffers.numComponents);
805 int numMessages = recvIndices.size();
806 for(
int iMessage = 0;iMessage < numMessages;iMessage++){
807 std::vector<size_t> &threadRecvIndex(threadHaloBufferIndices[threadId][iMessage]);
808 std::vector<size_t> &threadRecvBufferIndex(threadRecvBufferIndices[threadId][iMessage]);
809 size_t recvBufferSize = recvIndices[iMessage].size();
810 size_t numThreadRecv = threadRecvIndex.size();
811 for(
int componentIndex = 0;componentIndex <
numComponents;componentIndex++){
812 for(
size_t pointIndex = 0;pointIndex < numThreadRecv;pointIndex++){
813 size_t recvBufferIndex = threadRecvBufferIndex[pointIndex] +
814 (componentId+componentIndex)*recvBufferSize;
815 size_t targetBufferIndex = componentIndex*
numPointsBuffer + threadRecvIndex[pointIndex];
816 targetBuffer[targetBufferIndex] = messageBuffers.recvBuffers[iMessage][recvBufferIndex];
826 int halo::CreateThreadRecvIndices(
int threadId)
828 if(remoteHaloExtents.empty()){
829 std::cout <<
"halo::CreateThreadRecvIndices: WARNING No remote halos." << std::endl;
840 int numRecvBuffers = remoteHaloExtents.size();
843 threadRecvBufferIndices[threadId].resize(numRecvBuffers);
844 threadHaloBufferIndices[threadId].resize(numRecvBuffers);
848 for(
int i = 0;i < numRecvBuffers;i++){
850 int recvDirection = i/2;
851 int recvOrientation = i%2;
852 std::vector<size_t> recvIndices;
857 std::vector<size_t> &threadRecvBufferIndex(threadRecvBufferIndices[threadId][i]);
858 std::vector<size_t> &threadHaloBufferIndex(threadHaloBufferIndices[threadId][i]);
860 if(!localPartitionExtent.empty()){
862 localBufferExtent.
InitSimple(localBufferSizes);
864 if(overlapInterval.NNodes() > 0){
865 remoteHaloBufferExtent.
GetFlatIndices(overlapInterval,threadRecvBufferIndex);
866 localBufferExtent.
GetFlatIndices(overlapInterval,threadHaloBufferIndex);
871 size_t numRemoteHaloNodes = remoteHaloExtent.
NNodes();
876 if(numRemoteHaloNodes > 0){
879 if(threadExtent[recvDirection].second != globalPartitionExtent[recvDirection].second)
882 if(threadExtent[recvDirection].first != globalPartitionExtent[recvDirection].first)
887 checkExtent[recvDirection] = remoteHaloExtent[recvDirection];
889 size_t totalNumComponents = 0;
890 size_t numThreadRecvNodes = threadRecvExtent.
NNodes();
893 if(numThreadRecvNodes > 0){
895 remoteHaloExtent.
GetFlatIndices(threadRecvExtent,threadRecvBufferIndex);
896 size_t *threadRecvBufferIndexPtr = &threadRecvBufferIndex[0];
900 double *recvBufferPtr = recvBuffers[i];
901 for(
int iField = 0;iField < numStateFields;iField++){
903 double *haloBufferPtr = NULL;
904 haloBufferPtr = haloBuffers[iField][i];
905 threadHaloBufferIndex = threadRecvBufferIndex;
907 for(
int iComponent = 0;iComponent <
numComponents;iComponent++){
908 size_t componentRecvIndex = numRemoteHaloNodes*totalNumComponents++;
909 size_t componentHaloIndex = iComponent*numRemoteHaloNodes;
910 for(
size_t iItem = 0;iItem < numThreadRecvNodes;iItem++){
911 size_t recvIndex = threadRecvBufferIndexPtr[iItem];
912 recvBufferPtr[recvIndex+componentRecvIndex] = -100.0*(threadId+1)+(i+1);
913 if(haloBufferPtr != NULL)
914 haloBufferPtr[recvIndex+componentHaloIndex] = -100.0*(threadId+1)+(i+1);
926 int halo::UnpackReceiveBuffers()
931 std::vector<std::pair<int,std::vector<size_t> > >::iterator haloRecvIndicesIt =
932 haloRecvIndices.begin();
934 while(haloRecvIndicesIt != haloRecvIndices.end()){
936 int recvIndex = haloRecvIndicesIt - haloRecvIndices.begin();
937 std::pair<int,std::vector<size_t> > &haloRecvInfo(*haloRecvIndicesIt++);
938 int haloIndex = haloRecvInfo.first;
941 std::vector<size_t> &targetIndices(haloRecvInfo.second);
942 size_t numRecv = targetIndices.size();
945 double *sourceBuffer = recvBuffers[recvIndex];
946 size_t numHalo = remoteHaloExtents[haloIndex].NNodes();
948 int recvBufferIndex = 0;
949 for(
int iField = 0;iField < numStateFields;iField++){
950 double *haloBufferPtr = haloBuffers[iField][haloIndex];
952 for(
int iComponent = 0;iComponent <
numComponents;iComponent++){
953 for(
size_t iRecv = 0;iRecv < numRecv;iRecv++){
954 size_t targetIndex = targetIndices[iRecv] + iComponent*numHalo;
955 haloBufferPtr[targetIndex] = sourceBuffer[recvBufferIndex++];
963 int halo::UnpackSimpleRecvBuffers()
966 std::cout <<
"halo::UnpackSimpleRecvBuffers: WARNING NO RECEIVE DATA!!" << std::endl;
970 std::vector<std::pair<int,std::vector<size_t> > >::iterator haloRecvIndicesIt =
971 haloRecvIndices.begin();
973 while(haloRecvIndicesIt != haloRecvIndices.end()){
976 std::pair<int,std::vector<size_t> > &haloRecvInfo(*haloRecvIndicesIt++);
977 int haloIndex = haloRecvInfo.first;
980 std::vector<size_t> &targetIndices(haloRecvInfo.second);
981 size_t *targetIndPtr = &targetIndices[0];
982 size_t numRecv = targetIndices.size();
983 double *sourceBuffer = recvBuffers[haloIndex];
984 size_t numHalo = remoteHaloExtents[haloIndex].NNodes();
993 int recvBufferIndex = 0;
994 for(
int iField = 0;iField < numStateFields;iField++){
995 double *haloBufferPtr = haloBuffers[iField][haloIndex];
997 for(
int iComponent = 0;iComponent <
numComponents;iComponent++){
998 size_t componentIndex = iComponent*numHalo;
999 for(
size_t iRecv = 0;iRecv < numRecv;iRecv++){
1000 size_t targetIndex = targetIndPtr[iRecv] + componentIndex;
1001 haloBufferPtr[targetIndex] = sourceBuffer[recvBufferIndex++];
1009 int halo::UnpackSimpleRecvBuffers(
int threadId)
1012 std::cout <<
"halo::UnpackSimpleRecvBuffers: WARNING NO RECEIVE DATA!!" << std::endl;
1016 std::vector<std::pair<int,std::vector<size_t> > >::iterator haloRecvIndicesIt =
1017 haloRecvIndices.begin();
1019 while(haloRecvIndicesIt != haloRecvIndices.end()){
1022 std::pair<int,std::vector<size_t> > &haloRecvInfo(*haloRecvIndicesIt++);
1023 int haloIndex = haloRecvInfo.first;
1028 std::vector<size_t> &haloIndices(haloRecvInfo.second);
1029 if(haloIndices.empty()){
1033 std::vector<size_t> &targetIndices(threadRecvBufferIndices[threadId][haloIndex]);
1034 size_t numRecv = targetIndices.size();
1035 size_t numHalo = remoteHaloExtents[haloIndex].NNodes();
1040 if(numRecv <= 0 || numHalo == 0){
1044 size_t *targetIndPtr = &targetIndices[0];
1045 double *sourceBuffer = recvBuffers[haloIndex];
1051 int componentId = 0;
1052 for(
int iField = 0;iField < numStateFields;iField++){
1053 double *haloBufferPtr = haloBuffers[iField][haloIndex];
1055 for(
int iComponent = 0;iComponent <
numComponents;iComponent++){
1056 size_t targetComponentIndex = iComponent*numHalo;
1057 size_t sourceComponentIndex = numHalo*componentId++;
1058 for(
size_t iRecv = 0;iRecv < numRecv;iRecv++){
1059 size_t targetIndex = targetIndPtr[iRecv] + targetComponentIndex;
1060 size_t sourceIndex = targetIndPtr[iRecv] + sourceComponentIndex;
1061 haloBufferPtr[targetIndex] = sourceBuffer[sourceIndex];
1079 std::vector<double *>::iterator sendBufIt = sendBuffers.begin();
1080 std::vector<std::vector<size_t> >::iterator sendIndIt = sendIndices.begin();
1082 while(sendBufIt != sendBuffers.end()){
1084 double *sendBuffer = *sendBufIt++;
1085 std::vector<size_t> &sendIndex(*sendIndIt++);
1086 std::vector<int>::const_iterator fieldIndexIt = stateFieldIndices.begin();
1088 size_t numSend = sendIndex.size();
1089 size_t *sIndex = NULL;
1090 if(numSend > 0) sIndex = &sendIndex[0];
1092 while(fieldIndexIt != stateFieldIndices.end()){
1094 int fieldIndex = *fieldIndexIt++;
1097 const double *sourceBuffer = fieldData.
Data<
double>();
1098 size_t sourceSize = fieldData.
NItems();
1100 size_t dataIndex = iVar * numSend;
1102 for(
int iComponent = 0;iComponent <
numComponents;iComponent++){
1103 size_t sourceIndex = iComponent*sourceSize;
1104 for(
size_t iData = 0;iData < numSend;iData++)
1105 sendBuffer[dataIndex++] = sourceBuffer[sourceIndex+sIndex[iData]];
1122 std::cout <<
"halo::SimpleSend: WARNING: No Send Data!!" << std::endl;
1126 std::vector<double *> &sendBuffers(this->SendBuffers());
1128 int numSendBuffers = sendBuffers.size();
1130 for(
int i = 0;i < numSendBuffers;i++){
1131 if(sendBuffers[i] == NULL)
1134 if(localHaloExtent.empty())
1136 int remoteRank = neighborRanks[i];
1138 size_t numSend = numPoints * this->numStateComponents;
1150 inComm.
ASendBuf(sendBuffers[i],numSend,remoteRank,i);
1207 std::cout <<
"halo::PackSimpleSendBuffersAXPY: WARNING: No send data!!" << std::endl;
1214 std::vector<double *>::iterator sendBufIt = sendBuffers.begin();
1215 std::vector<std::vector<size_t> >::iterator sendIndIt = sendIndices.begin();
1217 while(sendBufIt != sendBuffers.end()){
1219 size_t bufferIndex = 0;
1220 double *sendBuffer = *sendBufIt++;
1221 std::vector<size_t> &sendIndex(*sendIndIt++);
1222 size_t *sIndex = &sendIndex[0];
1223 std::vector<int>::const_iterator fieldIndexIt = stateFieldIndices.begin();
1225 size_t numSend = sendIndex.size();
1227 while(fieldIndexIt != stateFieldIndices.end()){
1229 int fieldIndex = *fieldIndexIt++;
1235 const double *yBuffer = yFieldData.
Data<
double>();
1236 const double *xBuffer = xFieldData.
Data<
double>();
1241 for(
int iComponent = 0;iComponent <
numComponents;iComponent++){
1242 size_t sourceIndex = iComponent*sourceSize;
1243 for(
size_t iData = 0;iData < numSend;iData++){
1244 size_t dataIndex = sourceIndex + sIndex[iData];
1245 sendBuffer[bufferIndex++] = inA*xBuffer[dataIndex]+yBuffer[dataIndex];
1257 std::cout <<
"halo::PackSimpleSendBuffers2: WARNING: No send data!!" << std::endl;
1263 std::vector<double *>::iterator sendBufIt = sendBuffers.begin();
1264 std::vector<std::vector<size_t> >::iterator sendIndIt = sendIndices.begin();
1266 while(sendBufIt != sendBuffers.end()){
1268 size_t bufferIndex = 0;
1269 double *sendBuffer = *sendBufIt++;
1270 std::vector<size_t> &sendIndex(*sendIndIt++);
1271 size_t *sIndex = &sendIndex[0];
1272 std::vector<int>::const_iterator fieldIndexIt = stateFieldIndices.begin();
1274 size_t numSend = sendIndex.size();
1276 while(fieldIndexIt != stateFieldIndices.end()){
1278 int fieldIndex = *fieldIndexIt++;
1283 const double *xBuffer = xFieldData.
Data<
double>();
1288 for(
int iComponent = 0;iComponent <
numComponents;iComponent++){
1289 size_t sourceIndex = iComponent*sourceSize;
1290 for(
size_t iData = 0;iData < numSend;iData++){
1291 size_t dataIndex = sourceIndex + sIndex[iData];
1292 sendBuffer[bufferIndex++] = xBuffer[dataIndex];
1303 if(localHaloExtents.empty())
1307 std::cout <<
"halo::PackSimpleSendBuffers2: WARNING: No send data!!" << std::endl;
1313 std::vector<double *>::iterator sendBufIt = sendBuffers.begin();
1315 std::vector<std::vector<size_t> >::iterator sendIndIt = threadSendIndices[threadId].begin();
1316 std::vector<std::vector<size_t> >::iterator sendBufferIndIt = threadSendBufferIndices[threadId].begin();
1317 std::vector<std::vector<size_t> >::iterator sendAllIndIt = sendIndices.begin();
1319 while(sendBufIt != sendBuffers.end()){
1321 double *sendBuffer = *sendBufIt++;
1322 std::vector<size_t> &sendIndex(*sendIndIt++);
1323 std::vector<size_t> &sendBufferIndex(*sendBufferIndIt++);
1324 size_t *sIndex = &sendIndex[0];
1325 size_t *sBufferIndex = &sendBufferIndex[0];
1327 int numPackedComponents = 0;
1328 std::vector<int>::const_iterator fieldIndexIt = stateFieldIndices.begin();
1329 size_t totalNumSend = sendAllIndIt++->size();
1330 size_t numSend = sendIndex.size();
1332 while(fieldIndexIt != stateFieldIndices.end()){
1334 int fieldIndex = *fieldIndexIt++;
1339 const double *xBuffer = xFieldData.
Data<
double>();
1344 for(
int iComponent = 0;iComponent <
numComponents;iComponent++){
1345 size_t sourceIndex = iComponent*sourceSize;
1346 size_t targetIndex = (numPackedComponents++)*totalNumSend;
1347 for(
size_t iData = 0;iData < numSend;iData++){
1348 size_t dataIndex = sourceIndex + sIndex[iData];
1349 size_t bufferIndex = targetIndex + sBufferIndex[iData];
1350 sendBuffer[bufferIndex] = xBuffer[dataIndex];
1410 if(inComm.
NProc() <= 1)
1414 std::vector<double *> &sendBuffers(this->SendBuffers());
1415 std::vector<pcpp::RemoteCollisionType> &sendCollisions(this->SendCollisions());
1417 int numSendBuffers = sendBuffers.size();
1419 for(
int i = 0;i < numSendBuffers;i++){
1421 int remoteRank = sendInfo.first;
1422 size_t numPoints = sendInfo.second.NNodes();
1423 size_t numSend = numPoints * this->numStateComponents;
1424 inComm.
ASendBuf(sendBuffers[i],numSend,remoteRank);
1434 if(inComm.
NProc() <= 1)
1436 if(this->RecvCollisions().empty())
1440 int numStateComponents = this->numStateComponents;
1441 std::vector<pcpp::RemoteCollisionType> &recvCollisions(this->RecvCollisions());
1442 std::vector<double *> &recvBuffers(this->RecvBuffers());
1443 int numRecvs = recvBuffers.size();
1445 for(
int i = 0;i < numRecvs;i++){
1447 int remoteRank = recvInfo.first;
1448 size_t numPoints = recvInfo.second.NNodes();
1449 size_t numRecv = numPoints * numStateComponents;
1450 inComm.
ARecvBuf(recvBuffers[i],numRecv,remoteRank);
1462 std::cout <<
"halo::PostSimpleRecveives: WARNING: No data to receive!!" << std::endl;
1466 int numStateComponents = this->numStateComponents;
1467 std::vector<double *> &recvBuffers(this->RecvBuffers());
1468 size_t numRecvs = haloRecvIndices.size();
1470 for(
size_t i = 0;i < numRecvs;i++){
1472 int recvBufferIndex = haloRecvIndices[i].first;
1474 if(recvBufferIndex < 0){
1478 int remoteRank = sourceRanks[i];
1481 if(recvBuffers[recvBufferIndex] != NULL){
1489 if(recvBuffers[recvBufferIndex] == NULL){
1490 std::cout <<
"No receive buffer exists for this neighbor: " << remoteRank << std::endl;
1495 std::vector<size_t> &recvIndices(haloRecvIndices[i].second);
1497 size_t numRecv = numPoints * numStateComponents;
1508 inComm.
ARecvBuf(recvBuffers[recvBufferIndex],numRecv,remoteRank,tag);
1516 ConfigureData(inState,selectFields);
1519 void halo::ConfigureData(
const state::base &inState,
const std::vector<int> &selectFields)
1522 stateFieldIndices = selectFields;
1523 numStateFields = stateFieldIndices.size();
1524 numFieldComponents.resize(numStateFields);
1525 numStateComponents = 0;
1527 std::vector<int>::iterator fieldIndexIt = stateFieldIndices.begin();
1528 while(fieldIndexIt != stateFieldIndices.end()){
1529 int fieldIndex(*fieldIndexIt++);
1530 numFieldComponents[fieldCount] = inState.
Meta()[fieldIndex].ncomp;
1531 numStateComponents += numFieldComponents[fieldCount];
1541 this->UnpackReceiveBuffers();
1556 std::cout <<
"halo::CompleteSimpleReceives: WARNING: No Data!!" 1561 this->UnpackSimpleRecvBuffers();
1565 void halo::ReportSimpleBufferContents(std::ostream &outStream)
1567 if(!localHaloExtents.empty()){
1568 int numLocalHalos = localHaloExtents.size();
1569 for(
int iHalo = 0;iHalo < numLocalHalos;iHalo++){
1571 if(!localHaloExtent.empty()){
1572 size_t nNodesSend = localHaloExtent.
NNodes();
1573 outStream <<
"Local halo " << iHalo <<
" send buffer: ";
1574 if(!(sendBuffers[iHalo] == NULL)){
1575 outStream << std::endl;
1577 for(
int iField = 0;iField < numStateFields;iField++){
1578 for(
int iComp = 0;iComp < numFieldComponents[iField];iComp++){
1580 sendBuffers[iHalo+(tcomp*nNodesSend)+iComp*nNodesSend],
1582 outStream << std::endl;
1584 tcomp += numFieldComponents[iField];
1587 outStream <<
"[NULL]" << std::endl;
1592 if(!remoteHaloExtents.empty()){
1593 int numRemoteHalos = remoteHaloExtents.size();
1594 for(
int iHalo = 0;iHalo < numRemoteHalos;iHalo++){
1596 if(!remoteHaloExtent.empty()){
1597 size_t numPointsHalo = remoteHaloExtent.
NNodes();
1598 outStream <<
"Remote halo " << iHalo <<
": ";
1599 for(
int iField = 0;iField < numStateFields;iField++){
1600 outStream <<
"Field " << iField <<
": ";
1601 if(!(haloBuffers[iField][iHalo] == NULL)){
1602 outStream << std::endl;
1603 for(
int iComp = 0;iComp < numFieldComponents[iField];iComp++){
1604 pcpp::report::StructuredBufferContents<double>
1605 (outStream,haloBuffers[iField][iHalo],remoteHaloExtent);
1606 outStream << std::endl;
1609 outStream <<
"[NULL]" << std::endl;
1615 if(!remoteHaloExtents.empty()){
1616 int numRemoteHalos = remoteHaloExtents.size();
1617 for(
int iHalo = 0;iHalo < numRemoteHalos;iHalo++){
1619 if(!remoteHaloExtent.empty()){
1620 size_t nNodesRecv = remoteHaloExtent.
NNodes();
1621 outStream <<
"Remote halo " << iHalo <<
" recv buffer: ";
1622 if(!(recvBuffers[iHalo] == NULL)){
1623 outStream << std::endl;
1625 for(
int iField = 0;iField < numStateFields;iField++){
1626 for(
int iComp = 0;iComp < numFieldComponents[iField];iComp++){
1628 recvBuffers[iHalo+(tcomp*nNodesRecv)+iComp*nNodesRecv],
1630 outStream << std::endl;
1632 tcomp += numFieldComponents[iField];
1635 outStream <<
"[NULL]" << std::endl;
1641 void probe::SetProbeFields(
const std::vector<std::string> &inFields)
1643 if(!fieldIndices.empty())
1644 fieldIndices.resize(0);
1645 probeFields = inFields;
1647 void probe::SetDelimiter(
const std::string &inPointDelimiter)
1649 pointDelimiter = inPointDelimiter;
1653 statePtr = &inState;
1654 fieldIndices.resize(0);
1658 if(!flatProbeIndices.empty())
1659 flatProbeIndices.resize(0);
1660 dataInterval = inInterval;
1664 if(!flatProbeIndices.empty())
1665 flatProbeIndices.resize(0);
1666 probeInterval = inInterval;
1671 return(Probe(outStream));
1673 int probe::Probe(std::ostream &outStream)
1675 if(statePtr == NULL)
1677 if(fieldIndices.empty()){
1678 if(InitFieldIndices())
1681 if(flatProbeIndices.empty()){
1682 if(InitFlatProbeIndices())
1685 std::ostringstream Ostr;
1688 size_t numNodes = flatProbeIndices.size();
1689 int numFields = fieldIndices.size();
1690 for(
size_t iNode = 0;iNode < numNodes;iNode++){
1691 size_t probeIndex = flatProbeIndices[iNode];
1692 for(
int iField = 0;iField < numFields;iField++){
1693 int fieldIndex = fieldIndices[iField];
1697 int dsize = fieldMeta.
dsize;
1698 int nItems = fieldData.
NItems();
1702 const char *dataPtr = fieldData.
Data<
char>();
1703 outStream << dataPtr[probeIndex+nPerComponent*iComp];
1704 }
else if (dsize == 4){
1705 const int *dataPtr = fieldData.
Data<
int>();
1706 outStream << dataPtr[probeIndex+nPerComponent*iComp];
1707 }
else if (dsize == 8){
1708 const double *dataPtr = fieldData.
Data<
double>();
1709 outStream << dataPtr[probeIndex+nPerComponent*iComp];
1714 outStream << pointDelimiter;
1718 int probe::InitFieldIndices(){
1719 fieldIndices.resize(0);
1720 std::vector<std::string>::iterator fieldNameIt = probeFields.begin();
1721 while(fieldNameIt != probeFields.end()){
1722 std::string &fieldName(*fieldNameIt++);
1723 int fieldIndex = statePtr->GetFieldIndex(fieldName);
1726 fieldIndices.push_back(fieldIndex);
1730 int probe::InitFlatProbeIndices(){
1731 flatProbeIndices.resize(0);
1733 dataInterval.
Overlap(probeInterval,overlapInterval);
1734 if(overlapInterval != probeInterval)
1736 dataInterval.GetFlatIndices(probeInterval,flatProbeIndices);
1737 if(flatProbeIndices.empty())
1739 numNodes = flatProbeIndices.size();
DataContainerType & Data()
void GetFlatIndices(const sizeextent &extent, ContainerType &indices) const
int ARecvBuf(DataType *recvbuf, size_t nVal, unsigned int remote_rank, int tag=0)
void const size_t * numPoints
void StructuredBufferContents(std::ostream &outStream, const BufferDataType *dataBuffer, const pcpp::IndexIntervalType &bufferExtent)
const std::vector< int > & StateFieldIndices() const
std::vector< size_t > numPointsSend
std::vector< double * > recvBuffers
int ASendBuf(DataType *sendBuf, size_t nVal, unsigned int remote_rank, int tag=-1)
std::vector< size_t > numPointsRecv
Main encapsulation of MPI.
std::string GetValue(const std::string &key) const
std::vector< std::string > GetValueVector(const std::string &key) const
void Overlap(const sizeextent &inextent, sizeextent &outextent) const
std::vector< DataBufferType > DataContainerType
void size_t int size_t int size_t int int int int double int int double double *void size_t int size_t int int int int int double int size_t size_t size_t double double *void size_t int size_t int size_t size_t int double int double double *void size_t size_t size_t * bufferInterval
std::string ConfigKey(const std::string &configName, const std::string &keyName)
std::vector< double * > sendBuffers
Simple Block Structured Mesh object.
void size_t int * numComponents
void InitSimple(const ContainerType &inSize)
void const size_t * numPointsBuffer
std::pair< int, IndexIntervalType > RemoteCollisionType