/[escript]/trunk/escript/src/Data.cpp
ViewVC logotype

Diff of /trunk/escript/src/Data.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 2259 by jfenwick, Thu Feb 5 06:04:55 2009 UTC revision 2260 by jfenwick, Tue Feb 10 04:50:10 2009 UTC
# Line 593  Data::copyWithMask(const Data& other, Line 593  Data::copyWithMask(const Data& other,
593      // first, add any tags missing from other or mask      // first, add any tags missing from other or mask
594      const DataTagged::DataMapType& olookup=optr->getTagLookup();      const DataTagged::DataMapType& olookup=optr->getTagLookup();
595          const DataTagged::DataMapType& mlookup=mptr->getTagLookup();          const DataTagged::DataMapType& mlookup=mptr->getTagLookup();
596        const DataTagged::DataMapType& tlookup=tptr->getTagLookup();
597      DataTagged::DataMapType::const_iterator i; // i->first is a tag, i->second is an offset into memory      DataTagged::DataMapType::const_iterator i; // i->first is a tag, i->second is an offset into memory
598      for (i=olookup.begin();i!=olookup.end();i++)      for (i=olookup.begin();i!=olookup.end();i++)
599      {      {
# Line 607  Data::copyWithMask(const Data& other, Line 608  Data::copyWithMask(const Data& other,
608      // There are two possibilities: 1. all objects have the same rank. 2. other is a scalar      // There are two possibilities: 1. all objects have the same rank. 2. other is a scalar
609      if ((selfrank==otherrank) && (otherrank==maskrank))      if ((selfrank==otherrank) && (otherrank==maskrank))
610      {      {
611          for (i=olookup.begin();i!=olookup.end();i++)          for (i=tlookup.begin();i!=tlookup.end();i++)
612          {          {
613              // get the target offset              // get the target offset
614              DataTypes::ValueType::size_type toff=tptr->getOffsetForTag(i->first);              DataTypes::ValueType::size_type toff=tptr->getOffsetForTag(i->first);
615                  DataTypes::ValueType::size_type moff=mptr->getOffsetForTag(i->first);                  DataTypes::ValueType::size_type moff=mptr->getOffsetForTag(i->first);
616              DataTypes::ValueType::size_type ooff=optr->getOffsetForTag(i->first);              DataTypes::ValueType::size_type ooff=optr->getOffsetForTag(i->first);
617              for (int i=0;i<getDataPointSize();++i)              for (int j=0;j<getDataPointSize();++j)
618              {              {
619                  if (mvec[i+moff]>0)                  if (mvec[j+moff]>0)
620                  {                  {
621                      self[i+toff]=ovec[i+ooff];                      self[j+toff]=ovec[j+ooff];
622                  }                  }
623              }              }
624              }              }
625            // now for the default value
626            for (int j=0;j<getDataPointSize();++j)
627            {
628                if (mvec[j+mptr->getDefaultOffset()]>0)
629                {
630                    self[j+tptr->getDefaultOffset()]=ovec[j+optr->getDefaultOffset()];
631                }
632            }
633      }      }
634      else    // other is a scalar      else    // other is a scalar
635      {      {
636          for (i=mlookup.begin();i!=mlookup.end();i++)          for (i=tlookup.begin();i!=tlookup.end();i++)
637          {          {
638              // get the target offset              // get the target offset
639              DataTypes::ValueType::size_type toff=tptr->getOffsetForTag(i->first);              DataTypes::ValueType::size_type toff=tptr->getOffsetForTag(i->first);
640                  DataTypes::ValueType::size_type moff=mptr->getOffsetForTag(i->first);                  DataTypes::ValueType::size_type moff=mptr->getOffsetForTag(i->first);
641              DataTypes::ValueType::size_type ooff=optr->getOffsetForTag(i->first);              DataTypes::ValueType::size_type ooff=optr->getOffsetForTag(i->first);
642              for (int i=0;i<getDataPointSize();++i)              for (int j=0;j<getDataPointSize();++j)
643              {              {
644                  if (mvec[i+moff]>0)                  if (mvec[j+moff]>0)
645                  {                  {
646                      self[i+toff]=ovec[ooff];                      self[j+toff]=ovec[ooff];
647                  }                  }
648              }              }
649              }              }
650            // now for the default value
651            for (int j=0;j<getDataPointSize();++j)
652            {
653                if (mvec[j+mptr->getDefaultOffset()]>0)
654                {
655                    self[j+tptr->getDefaultOffset()]=ovec[0];
656                }
657            }
658      }      }
659    
660      return;         // ugly      return;         // ugly
# Line 651  Data::copyWithMask(const Data& other, Line 668  Data::copyWithMask(const Data& other,
668      long i;      long i;
669      #else      #else
670      size_t i;      size_t i;
671      #endif            #endif  
672        size_t psize=getDataPointSize();    
673      #pragma omp parallel for private(i) schedule(static)      #pragma omp parallel for private(i) schedule(static)
674      for (i=0;i<num_points;++i)      for (i=0;i<num_points;++i)
675      {      {
676          if (mvec[i]>0)          if (mvec[i]>0)
677          {          {
678              self[i]=ovec[0];              self[i]=ovec[i/psize];      // since this is expanded there is one scalar
679          }          }                   // dest point
680      }      }
681      return;         // ugly!      return;         // ugly!
682    }    }

Legend:
Removed from v.2259  
changed lines
  Added in v.2260

  ViewVC Help
Powered by ViewVC 1.1.26