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;
 }