void MonolithicBlockMatrix::createInterfaceMap( const MapEpetra& interfaceMap , const std::map<ID, ID>& locDofMap, const UInt subdomainMaxId, const boost::shared_ptr<Epetra_Comm> epetraWorldComm ) { //std::map<ID, ID> const& locDofMap = M_dofStructureToHarmonicExtension->locDofMap(); std::map<ID, ID>::const_iterator ITrow; Int numtasks = epetraWorldComm->NumProc(); int* numInterfaceDof(new int[numtasks]); int pid=epetraWorldComm->MyPID(); int numMyElements = interfaceMap.map(Unique)->NumMyElements(); numInterfaceDof[pid]=numMyElements; MapEpetra subMap(*interfaceMap.map(Unique), (UInt)0, subdomainMaxId); M_numerationInterface.reset(new vector_Type(subMap,Unique)); //should be an int vector instead of double // M_numerationInterfaceInt.reset(new Epetra_IntVector(*M_interfaceMap.getMap(Unique))); for (int j=0; j<numtasks; ++j) epetraWorldComm->Broadcast( &numInterfaceDof[j], 1, j); for (int j=numtasks-1; j>0 ; --j) { numInterfaceDof[j] = numInterfaceDof[j-1]; } numInterfaceDof[0]=0; for (int j=1; j<numtasks ; ++j) numInterfaceDof[j] += numInterfaceDof[j-1]; UInt l=0; M_interface = (UInt) interfaceMap.map(Unique)->NumGlobalElements()/nDimensions; //UInt solidDim=M_dFESpace->map().map(Unique)->NumGlobalElements()/nDimensions; for (l=0, ITrow=locDofMap.begin(); ITrow!=locDofMap.end() ; ++ITrow) { if (interfaceMap.map(Unique)->LID(ITrow->second /*+ dim*solidDim*/)>=0) { (*M_numerationInterface)[ITrow->second /*+ dim*solidDim*/ ]=l+ (int)(numInterfaceDof[pid]/nDimensions)/*+ dim*localInterface*/ ; // (*M_numerationInterfaceInt)[ITrow->second /*+ dim*solidDim*/ ]=l+1+ (int)(M_numInterfaceDof[pid]/nDimensions)/*+ dim*localInterface*/ ; if ((int)(*M_numerationInterface)(ITrow->second )!=floor(l+ numInterfaceDof[pid]/nDimensions+0.2 /*+ dim*localInterface*/) ) std::cout<<"ERROR! the numeration of the coupling map is not correct"<<std::endl; ++l; } } std::vector<int> couplingVector; couplingVector.reserve((int)(interfaceMap.map(Unique)->NumMyElements())); for (UInt dim=0; dim<nDimensions; ++dim) { for ( ITrow=locDofMap.begin(); ITrow!=locDofMap.end() ; ++ITrow) { if (interfaceMap.map(Unique)->LID(ITrow->second)>=0) { couplingVector.push_back((*M_numerationInterface)(ITrow->second /*+ dim * solidDim*/)+ dim * M_interface ); //couplingVector.push_back((*M_numerationInterfaceInt)[ITrow->second /*+ dim * solidDim*/]+ dim * M_interface ); } } }// so the map for the coupling part of the matrix is just Unique M_interfaceMap.reset(new MapEpetra(-1, static_cast< Int> ( couplingVector.size() ), &couplingVector[0], epetraWorldComm)); }
NormalizeCharMapPtr MappingCharFilter::match(NormalizeCharMapPtr map) { NormalizeCharMapPtr result; if (map->submap) { int32_t chr = nextChar(); if (chr != -1) { NormalizeCharMapPtr subMap(map->submap.get((wchar_t)chr)); if (subMap) result = match(subMap); if (!result) pushChar(chr); } } if (!result) result = map; return result; }