void read(BinaryReader& bin, OLattice<T>& d)
void read(BinaryReader& bin, OScalar<T>& d)
void read(BinaryReader& bin, OLattice<T>& d){  typedef typename UnaryReturn<OLattice<T>, FnGetSite>::Type_t  Site_t;  Site_t  recv_buf;  // Find the location of each site and send to primary node  for(int site=0; site < Layout::vol(); ++site)  {    multi1d<int> coord = crtesn(site, Layout::lattSize());    int node   = Layout::nodeNumber(coord);    int linear = Layout::linearSiteIndex(coord);    int outersite = linear >> INNER_LOG;    int innersite = linear & ((1 << INNER_LOG)-1);    // Only on primary node read the data    bin.readArrayPrimaryNode((char *)&recv_buf,			     sizeof(typename WordType<Site_t>::Type_t), 			     sizeof(Site_t) / sizeof(typename WordType<Site_t>::Type_t));    // Send result to destination node. Avoid sending prim-node sending to itself    if (node != 0)    {      if (Layout::primaryNode())	Internal::sendToWait((void *)recv_buf, node, sizeof(Site_t));      if (Layout::nodeNumber() == node)	Internal::recvFromWait((void *)recv_buf, 0, sizeof(Site_t));    }    if (Layout::nodeNumber() == node)      copy_site(d.elem(outersite), innersite, recv_buf.elem());// insert into conventional scalar form  }}