/[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 2607 by jfenwick, Tue Aug 18 01:02:56 2009 UTC revision 2635 by jfenwick, Thu Aug 27 04:54:41 2009 UTC
# Line 14  Line 14 
14    
15  #include <string.h>  #include <string.h>
16    
17    // added for saveCSV
18    #include <boost/python.hpp>
19    #include "Data.h"
20    
21  #include "Utils.h"  #include "Utils.h"
22  #include "DataVector.h"  #include "DataVector.h"
23    
# Line 166  ESCRIPT_DLL_API void MPIBarrierWorld() { Line 170  ESCRIPT_DLL_API void MPIBarrierWorld() {
170    #endif    #endif
171  }  }
172    
173    ESCRIPT_DLL_API
174    void
175    saveDataCSV(const std::string& filename, boost::python::dict arg, const std::string& sep, const std::string& csep,
176    bool append)
177    {
178        using std::cout;
179        using std::endl;
180        boost::python::list keys=arg.keys();
181        int numdata = boost::python::extract<int>(arg.attr("__len__")());
182        if (numdata<1)
183        {
184        throw DataException("saveDataCSVcpp: no data to save specified.");
185        }
186        std::vector<int> step(numdata);
187        std::vector<std::string> names(numdata);
188        std::vector<Data> data(numdata);
189        std::vector<const DataAbstract::ValueType::value_type*> samples(numdata);
190        std::vector<int> offset(numdata);
191        std::vector<int> fstypes(numdata);      // FunctionSpace types for each data
192    
193        // We need to interpret the samples correctly even if they are different types
194        // for this reason, we should interate over samples
195        for (int i=0;i<numdata;++i)
196        {
197        names[i]=boost::python::extract<std::string>(keys[i]);
198        data[i]=boost::python::extract<escript::Data>(arg[keys[i]]);
199        step[i]=(data[i].actsConstant()?0:DataTypes::noValues(data[i].getDataPointShape()));
200        fstypes[i]=data[i].getFunctionSpace().getTypeCode();
201        if (i>0)
202        {
203            if (data[i].getDomain()!=data[i-1].getDomain())
204            {
205            throw DataException("saveDataCSVcpp: all data must be on the same domain.");
206            }
207        }
208        }
209        int bestfnspace=0;
210        if (!data[0].getDomain()->commonFunctionSpace(fstypes, bestfnspace))
211        {
212        throw DataException("saveDataCSVcpp: FunctionSpaces of data are incompatible");
213        }
214        // now we interpolate all data to the same type
215        FunctionSpace best(data[0].getDomain(),bestfnspace);
216        for (int i=0;i<numdata;++i)
217        {
218        data[i]=data[i].interpolate(best);
219        }
220        int numsamples=data[0].getNumSamples();     // these must be the same for all data
221        int dpps=data[0].getNumDataPointsPerSample();
222    
223        
224        std::ofstream os;
225        if (append)
226        {
227        os.open(filename.c_str(), std::ios_base::app);
228        }
229        else
230        {
231        os.open(filename.c_str());
232        }
233        if (!os.is_open())
234        {
235        throw DataException("saveDataCSVcpp: unable to open file for writing");
236        }
237    
238        bool first=true;
239        for (int i=0;i<numdata;++i)
240        {
241        const DataTypes::ShapeType& s=data[i].getDataPointShape();
242            switch (data[i].getDataPointRank())
243        {
244        case 0: if (!first)
245                {
246                os << sep;
247                }
248                else
249                {
250                first=false;
251                }
252            os << names[i]; break;
253        case 1: for (int j=0;j<s[0];++j)
254            {
255                if (!first)
256                {
257                os << sep;
258                }
259                else
260                {
261                first=false;
262                }
263                os << names[i] << csep << j;
264            }
265            break;
266        case 2: for (int j=0;j<s[0];++j)
267            {
268                for (int k=0;k<s[1];++k)
269                {
270                if (!first)
271                {
272                    os << sep;
273                }
274                else
275                {
276                    first=false;
277                }
278                    os << names[i] << csep << k << csep << j;
279                }
280            }
281            break;
282        case 3: for (int j=0;j<s[0];++j)
283            {
284                for (int k=0;k<s[1];++k)
285                {
286                for (int l=0;l<s[2];++l)
287                {
288                    if (!first)
289                    {
290                        os << sep;
291                    }
292                    else
293                    {
294                        first=false;
295                    }
296                    os << names[i] << csep << k << csep << j << csep << l;
297                }
298                }
299            }
300            break;
301        case 4: for (int j=0;j<s[0];++j)
302            {
303                for (int k=0;k<s[1];++k)
304                {
305                for (int l=0;l<s[2];++l)
306                {
307                    for (int m=0;m<s[3];++m)
308                    {
309                    if (!first)
310                    {
311                        os << sep;
312                    }
313                    else
314                    {
315                        first=false;
316                    }
317                    os << names[i] << csep << k << csep << j << csep << l << csep << m;
318                    }
319                }
320                }
321            }
322            break;
323        default:
324            throw DataException("saveDataCSV: Illegal rank");
325        }
326        }
327        os << endl;
328    
329        //the use of shared_ptr here is just to ensure the buffer group is freed
330        //I would have used scoped_ptr but they don't work in vectors
331        std::vector<boost::shared_ptr<BufferGroup> > bg(numdata);
332        for (int d=0;d<numdata;++d)
333        {
334        bg[d].reset(data[d].allocSampleBuffer());
335        }
336    
337        try{
338          for (int i=0;i<numsamples;++i)
339          {
340        for (int d=0;d<numdata;++d)
341        {
342            samples[d]=data[d].getSampleDataRO(i,bg[d].get());
343        }
344        for (int j=0;j<dpps;++j)
345        {
346            bool needsep=false;
347            for (int d=0;d<numdata;++d)
348            {
349            DataTypes::pointToStream(os, samples[d], data[d].getDataPointShape(), offset[d], needsep, sep);
350            needsep=true;
351            offset[d]+=step[d];
352            }
353            os << endl;
354        }
355        for (int d=0;d<numdata;++d)
356        {
357            offset[d]=0;
358        }  
359          }
360        } catch (...)
361        {
362            os.close();
363        throw;
364        }
365        os.close();
366    }
367    
368  }  // end of namespace  }  // end of namespace

Legend:
Removed from v.2607  
changed lines
  Added in v.2635

  ViewVC Help
Powered by ViewVC 1.1.26