/[escript]/trunk/ripley/src/Rectangle.cpp
ViewVC logotype

Diff of /trunk/ripley/src/Rectangle.cpp

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

revision 4482 by caltinay, Tue Jun 25 05:20:01 2013 UTC revision 4495 by caltinay, Fri Jul 5 02:19:47 2013 UTC
# Line 276  void Rectangle::readNcGrid(escript::Data Line 276  void Rectangle::readNcGrid(escript::Data
276  void Rectangle::readBinaryGrid(escript::Data& out, string filename,  void Rectangle::readBinaryGrid(escript::Data& out, string filename,
277                                 const vector<int>& first,                                 const vector<int>& first,
278                                 const vector<int>& numValues,                                 const vector<int>& numValues,
279                                 const vector<int>& multiplier) const                                 const std::vector<int>& multiplier,
280                                   int byteOrder, int dataType) const
281  {  {
282        // the mapping is not universally correct but should work on our
283        // supported platforms
284        switch (dataType) {
285            case DATATYPE_INT32:
286                readBinaryGridImpl<int>(out, filename, first, numValues,
287                                        multiplier, byteOrder);
288                break;
289            case DATATYPE_FLOAT32:
290                readBinaryGridImpl<float>(out, filename, first, numValues,
291                                          multiplier, byteOrder);
292                break;
293            case DATATYPE_FLOAT64:
294                readBinaryGridImpl<double>(out, filename, first, numValues,
295                                           multiplier, byteOrder);
296                break;
297            default:
298                throw RipleyException("readBinaryGrid(): invalid or unsupported datatype");
299        }
300    }
301    
302    template<typename ValueType>
303    void Rectangle::readBinaryGridImpl(escript::Data& out, const string& filename,
304                                       const vector<int>& first,
305                                       const vector<int>& numValues,
306                                       const std::vector<int>& multiplier,
307                                       int byteOrder) const
308    {
309        if (byteOrder != BYTEORDER_NATIVE)
310            throw RipleyException("readBinaryGrid(): only native byte order supported at the moment.");
311    
312      // check destination function space      // check destination function space
313      int myN0, myN1;      int myN0, myN1;
314      if (out.getFunctionSpace().getTypeCode() == Nodes) {      if (out.getFunctionSpace().getTypeCode() == Nodes) {
# Line 298  void Rectangle::readBinaryGrid(escript:: Line 329  void Rectangle::readBinaryGrid(escript::
329      f.seekg(0, ios::end);      f.seekg(0, ios::end);
330      const int numComp = out.getDataPointSize();      const int numComp = out.getDataPointSize();
331      const int filesize = f.tellg();      const int filesize = f.tellg();
332      const int reqsize = numValues[0]*numValues[1]*numComp*sizeof(float);      const int reqsize = numValues[0]*numValues[1]*numComp*sizeof(ValueType);
333      if (filesize < reqsize) {      if (filesize < reqsize) {
334          f.close();          f.close();
335          throw RipleyException("readBinaryGrid(): not enough data in file");          throw RipleyException("readBinaryGrid(): not enough data in file");
# Line 324  void Rectangle::readBinaryGrid(escript:: Line 355  void Rectangle::readBinaryGrid(escript::
355      const int num1 = min(numValues[1]-idx1, myN1-first1);      const int num1 = min(numValues[1]-idx1, myN1-first1);
356    
357      out.requireWrite();      out.requireWrite();
358      vector<float> values(num0*numComp);      vector<ValueType> values(num0*numComp);
359      const int dpp = out.getNumDataPointsPerSample();      const int dpp = out.getNumDataPointsPerSample();
360    
361      for (index_t y=0; y<num1; y++) {      for (index_t y=0; y<num1; y++) {
362          const int fileofs = numComp*(idx0+(idx1+y)*numValues[0]);          const int fileofs = numComp*(idx0+(idx1+y)*numValues[0]);
363          f.seekg(fileofs*sizeof(float));          f.seekg(fileofs*sizeof(ValueType));
364          f.read((char*)&values[0], num0*numComp*sizeof(float));          f.read((char*)&values[0], num0*numComp*sizeof(ValueType));
365          for (index_t x=0; x<num0; x++) {          for (int x=0; x<num0; x++) {
366              const int baseIndex = first0+x*multiplier[0]              const int baseIndex = first0+x*multiplier[0]
367                                      +(first1+y*multiplier[1])*myN0;                                      +(first1+y*multiplier[1])*myN0;
368              for (index_t m1=0; m1<multiplier[1]; m1++) {              for (index_t m1=0; m1<multiplier[1]; m1++) {
369                  for (index_t m0=0; m0<multiplier[0]; m0++) {                  for (index_t m0=0; m0<multiplier[0]; m0++) {
370                      const int dataIndex = baseIndex+m0+m1*myN0;                      const int dataIndex = baseIndex+m0+m1*myN0;
371                      double* dest = out.getSampleDataRW(dataIndex);                      double* dest = out.getSampleDataRW(dataIndex);
372                      for (index_t c=0; c<numComp; c++) {                      for (int c=0; c<numComp; c++) {
373                          if (!std::isnan(values[x*numComp+c])) {                          if (!std::isnan(values[x*numComp+c])) {
374                              for (index_t q=0; q<dpp; q++) {                              for (int q=0; q<dpp; q++) {
375                                  *dest++ = static_cast<double>(values[x*numComp+c]);                                  *dest++ = static_cast<double>(values[x*numComp+c]);
376                              }                              }
377                          }                          }

Legend:
Removed from v.4482  
changed lines
  Added in v.4495

  ViewVC Help
Powered by ViewVC 1.1.26