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

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

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

revision 2636 by jfenwick, Thu Aug 27 04:54:41 2009 UTC revision 2637 by jfenwick, Fri Aug 28 04:12:24 2009 UTC
# Line 179  bool append) Line 179  bool append)
179      using std::endl;      using std::endl;
180      boost::python::list keys=arg.keys();      boost::python::list keys=arg.keys();
181      int numdata = boost::python::extract<int>(arg.attr("__len__")());      int numdata = boost::python::extract<int>(arg.attr("__len__")());
182        bool hasmask=arg.has_key("mask");
183        Data mask;
184        if (hasmask)
185        {
186        mask=boost::python::extract<escript::Data>(arg["mask"]);
187        keys.remove("mask");
188        numdata--;
189            if (mask.getDataPointRank()!=0)
190        {
191            throw DataException("saveDataCSVcpp: masks must be scalar.");
192        }
193        }
194      if (numdata<1)      if (numdata<1)
195      {      {
196      throw DataException("saveDataCSVcpp: no data to save specified.");      throw DataException("saveDataCSVcpp: no data to save specified.");
# Line 196  bool append) Line 208  bool append)
208      {      {
209      names[i]=boost::python::extract<std::string>(keys[i]);      names[i]=boost::python::extract<std::string>(keys[i]);
210      data[i]=boost::python::extract<escript::Data>(arg[keys[i]]);      data[i]=boost::python::extract<escript::Data>(arg[keys[i]]);
211      step[i]=(data[i].actsConstant()?0:DataTypes::noValues(data[i].getDataPointShape()));      step[i]=(data[i].actsExpanded()?DataTypes::noValues(data[i].getDataPointShape()):0);
212      fstypes[i]=data[i].getFunctionSpace().getTypeCode();      fstypes[i]=data[i].getFunctionSpace().getTypeCode();
213      if (i>0)      if (i>0)
214      {      {
# Line 326  bool append) Line 338  bool append)
338      }      }
339      os << endl;      os << endl;
340    
341        boost::scoped_ptr<BufferGroup> maskbuffer;  // sample buffer for the mask [if we have one]
342        const double* masksample=0;
343        int maskoffset=0;
344      //the use of shared_ptr here is just to ensure the buffer group is freed      //the use of shared_ptr here is just to ensure the buffer group is freed
345      //I would have used scoped_ptr but they don't work in vectors      //I would have used scoped_ptr but they don't work in vectors
346      std::vector<boost::shared_ptr<BufferGroup> > bg(numdata);      std::vector<boost::shared_ptr<BufferGroup> > bg(numdata);
# Line 334  bool append) Line 349  bool append)
349      bg[d].reset(data[d].allocSampleBuffer());      bg[d].reset(data[d].allocSampleBuffer());
350      }      }
351    
352        bool expandedmask=false;        // does the mask act expanded. Are there mask value for each point in the sample
353        bool wantrow=true;          // do we output this row?
354        if (hasmask)
355        {
356        maskbuffer.reset(mask.allocSampleBuffer());
357        if (mask.actsExpanded())
358        {
359            maskoffset=DataTypes::noValues(mask.getDataPointShape());
360            expandedmask=true;
361        }
362        }
363      try{      try{
364        for (int i=0;i<numsamples;++i)        for (int i=0;i<numsamples;++i)
365        {        {
366        wantrow=true;
367      for (int d=0;d<numdata;++d)      for (int d=0;d<numdata;++d)
368      {      {
369          samples[d]=data[d].getSampleDataRO(i,bg[d].get());          samples[d]=data[d].getSampleDataRO(i,bg[d].get());
370      }      }
371        if (hasmask)
372        {
373            masksample=mask.getSampleDataRO(i, maskbuffer.get());
374            if (!expandedmask)      // mask controls whole sample
375            {
376                if (masksample[0]<=0)       // masks are scalar
377                {
378                    wantrow=false;
379                }
380            }
381        }
382      for (int j=0;j<dpps;++j)      for (int j=0;j<dpps;++j)
383      {      {
384          bool needsep=false;          // now we need to check if this point is masked off
385          for (int d=0;d<numdata;++d)          if (expandedmask)
386          {          {
387          DataTypes::pointToStream(os, samples[d], data[d].getDataPointShape(), offset[d], needsep, sep);          wantrow=(masksample[j]>0); // masks are scalar to the relevant value is at [j]
388          needsep=true;          }
389          offset[d]+=step[d];          if (wantrow)
390            {
391            bool needsep=false;
392            for (int d=0;d<numdata;++d)
393            {
394                DataTypes::pointToStream(os, samples[d], data[d].getDataPointShape(), offset[d], needsep, sep);
395                needsep=true;
396                offset[d]+=step[d];
397            }
398            os << endl;
399          }          }
         os << endl;  
400      }      }
401      for (int d=0;d<numdata;++d)      for (int d=0;d<numdata;++d)
402      {      {
# Line 363  bool append) Line 409  bool append)
409      throw;      throw;
410      }      }
411      os.close();      os.close();
412    
413    cout << "This method is not MPI safe" << endl;
414    
415  }  }
416    
417  }  // end of namespace  }  // end of namespace

Legend:
Removed from v.2636  
changed lines
  Added in v.2637

  ViewVC Help
Powered by ViewVC 1.1.26