/[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 4174 by caltinay, Wed Jan 30 03:21:27 2013 UTC revision 4277 by caltinay, Wed Mar 6 01:30:41 2013 UTC
# Line 164  bool Rectangle::operator==(const Abstrac Line 164  bool Rectangle::operator==(const Abstrac
164  }  }
165    
166  void Rectangle::readNcGrid(escript::Data& out, string filename, string varname,  void Rectangle::readNcGrid(escript::Data& out, string filename, string varname,
167              const vector<int>& first, const vector<int>& numValues) const              const vector<int>& first, const vector<int>& numValues,
168                const vector<int>& multiplier) const
169  {  {
170  #ifdef USE_NETCDF  #ifdef USE_NETCDF
171      // check destination function space      // check destination function space
# Line 185  void Rectangle::readNcGrid(escript::Data Line 186  void Rectangle::readNcGrid(escript::Data
186      if (numValues.size() != 2)      if (numValues.size() != 2)
187          throw RipleyException("readNcGrid(): argument 'numValues' must have 2 entries");          throw RipleyException("readNcGrid(): argument 'numValues' must have 2 entries");
188    
189        if (multiplier.size() != 2)
190            throw RipleyException("readNcGrid(): argument 'multiplier' must have 2 entries");
191        for (size_t i=0; i<multiplier.size(); i++)
192            if (multiplier[i]<1)
193                throw RipleyException("readNcGrid(): all multipliers must be positive");
194    
195      // check file existence and size      // check file existence and size
196      NcFile f(filename.c_str(), NcFile::ReadOnly);      NcFile f(filename.c_str(), NcFile::ReadOnly);
197      if (!f.is_valid())      if (!f.is_valid())
# Line 210  void Rectangle::readNcGrid(escript::Data Line 217  void Rectangle::readNcGrid(escript::Data
217      }      }
218    
219      // check if this rank contributes anything      // check if this rank contributes anything
220      if (first[0] >= m_offset0+myN0 || first[0]+numValues[0] <= m_offset0 ||      if (first[0] >= m_offset0+myN0 || first[0]+numValues[0]*multiplier[0] <= m_offset0 ||
221              first[1] >= m_offset1+myN1 || first[1]+numValues[1] <= m_offset1)              first[1] >= m_offset1+myN1 || first[1]+numValues[1]*multiplier[1] <= m_offset1)
222          return;          return;
223    
224      // now determine how much this rank has to write      // now determine how much this rank has to write
# Line 222  void Rectangle::readNcGrid(escript::Data Line 229  void Rectangle::readNcGrid(escript::Data
229      // indices to first value in file      // indices to first value in file
230      const int idx0 = max(0, m_offset0-first[0]);      const int idx0 = max(0, m_offset0-first[0]);
231      const int idx1 = max(0, m_offset1-first[1]);      const int idx1 = max(0, m_offset1-first[1]);
232      // number of values to write      // number of values to read
233      const int num0 = min(numValues[0]-idx0, myN0-first0);      const int num0 = min(numValues[0]-idx0, myN0-first0);
234      const int num1 = min(numValues[1]-idx1, myN1-first1);      const int num1 = min(numValues[1]-idx1, myN1-first1);
235    
# Line 241  void Rectangle::readNcGrid(escript::Data Line 248  void Rectangle::readNcGrid(escript::Data
248      for (index_t y=0; y<num1; y++) {      for (index_t y=0; y<num1; y++) {
249  #pragma omp parallel for  #pragma omp parallel for
250          for (index_t x=0; x<num0; x++) {          for (index_t x=0; x<num0; x++) {
251              const int dataIndex = (first1+y)*myN0+first0+x;              const int baseIndex = first0+x*multiplier[0]
252              const int srcIndex=y*num0+x;                                    +(first1+y*multiplier[1])*myN0;
253                const int srcIndex = y*num0+x;
254              if (!isnan(values[srcIndex])) {              if (!isnan(values[srcIndex])) {
255                  double* dest = out.getSampleDataRW(dataIndex);                  for (index_t m1=0; m1<multiplier[1]; m1++) {
256                  for (index_t q=0; q<dpp; q++) {                      for (index_t m0=0; m0<multiplier[0]; m0++) {
257                      *dest++ = values[srcIndex];                          const int dataIndex = baseIndex+m0+m1*myN0;
258                            double* dest = out.getSampleDataRW(dataIndex);
259                            for (index_t q=0; q<dpp; q++) {
260                                *dest++ = values[srcIndex];
261                            }
262                        }
263                  }                  }
264              }              }
265          }          }
# Line 257  void Rectangle::readNcGrid(escript::Data Line 270  void Rectangle::readNcGrid(escript::Data
270  }  }
271    
272  void Rectangle::readBinaryGrid(escript::Data& out, string filename,  void Rectangle::readBinaryGrid(escript::Data& out, string filename,
273              const vector<int>& first, const vector<int>& numValues) const                                 const vector<int>& first,
274                                   const vector<int>& numValues,
275                                   const vector<int>& multiplier) const
276  {  {
277      // check destination function space      // check destination function space
278      int myN0, myN1;      int myN0, myN1;
# Line 300  void Rectangle::readBinaryGrid(escript:: Line 315  void Rectangle::readBinaryGrid(escript::
315      // indices to first value in file      // indices to first value in file
316      const int idx0 = max(0, m_offset0-first[0]);      const int idx0 = max(0, m_offset0-first[0]);
317      const int idx1 = max(0, m_offset1-first[1]);      const int idx1 = max(0, m_offset1-first[1]);
318      // number of values to write      // number of values to read
319      const int num0 = min(numValues[0]-idx0, myN0-first0);      const int num0 = min(numValues[0]-idx0, myN0-first0);
320      const int num1 = min(numValues[1]-idx1, myN1-first1);      const int num1 = min(numValues[1]-idx1, myN1-first1);
321    
# Line 313  void Rectangle::readBinaryGrid(escript:: Line 328  void Rectangle::readBinaryGrid(escript::
328          f.seekg(fileofs*sizeof(float));          f.seekg(fileofs*sizeof(float));
329          f.read((char*)&values[0], num0*numComp*sizeof(float));          f.read((char*)&values[0], num0*numComp*sizeof(float));
330          for (index_t x=0; x<num0; x++) {          for (index_t x=0; x<num0; x++) {
331              double* dest = out.getSampleDataRW(first0+x+(first1+y)*myN0);              const int baseIndex = first0+x*multiplier[0]
332              for (index_t c=0; c<numComp; c++) {                                      +(first1+y*multiplier[1])*myN0;
333                  if (!isnan(values[x*numComp+c])) {              for (index_t m1=0; m1<multiplier[1]; m1++) {
334                      for (index_t q=0; q<dpp; q++) {                  for (index_t m0=0; m0<multiplier[0]; m0++) {
335                          *dest++ = static_cast<double>(values[x*numComp+c]);                      const int dataIndex = baseIndex+m0+m1*myN0;
336                        double* dest = out.getSampleDataRW(dataIndex);
337                        for (index_t c=0; c<numComp; c++) {
338                            if (!isnan(values[x*numComp+c])) {
339                                for (index_t q=0; q<dpp; q++) {
340                                    *dest++ = static_cast<double>(values[x*numComp+c]);
341                                }
342                            }
343                      }                      }
344                  }                  }
345              }              }

Legend:
Removed from v.4174  
changed lines
  Added in v.4277

  ViewVC Help
Powered by ViewVC 1.1.26