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

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

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

revision 1724 by jfenwick, Mon Aug 25 05:38:57 2008 UTC revision 1734 by jfenwick, Thu Aug 28 06:11:56 2008 UTC
# Line 203  namespace DataTypes Line 203  namespace DataTypes
203        return temp.str();        return temp.str();
204     }     }
205    
206    
207    // Additional slice operations
208    
209       inline
210       bool
211       checkOffset(ValueType::size_type offset, int size, int noval)
212       {
213          return (size >= (offset+noval));
214       }
215    
216    
217       void
218       copySlice(ValueType& left,
219                    const ShapeType& leftShape,
220                    ValueType::size_type thisOffset,
221                                const ValueType& other,
222                    const ShapeType& otherShape,
223                                ValueType::size_type otherOffset,
224                                const RegionLoopRangeType& region)
225       {
226    
227          //
228          // Make sure views are not empty
229    
230          EsysAssert(!left.size()==0,
231                     "Error - left data is empty.");
232          EsysAssert(!other.size()==0,
233                     "Error - other data is empty.");
234    
235          //
236          // Check the view to be sliced from is compatible with the region to be sliced,
237          // and that the region to be sliced is compatible with this view:
238    
239          EsysAssert(checkOffset(thisOffset,left.size(),noValues(leftShape)),
240                     "Error - offset incompatible with this view.");
241          EsysAssert(otherOffset+noValues(leftShape)<=other.size(),
242                     "Error - offset incompatible with other view.");
243    
244          EsysAssert(getRank(otherShape)==region.size(),
245                     "Error - slice not same rank as view to be sliced from.");
246    
247          EsysAssert(noValues(leftShape)==noValues(getResultSliceShape(region)),
248                     "Error - slice shape not compatible shape for this view.");
249    
250          //
251          // copy the values in the specified region of the other view into this view
252    
253          // the following loops cannot be parallelised due to the numCopy counter
254          int numCopy=0;
255    
256          switch (region.size()) {
257          case 0:
258             /* this case should never be encountered,
259             as python will never pass us an empty region.
260             here for completeness only, allows slicing of a scalar */
261    //          (*m_data)[thisOffset+numCopy]=(*other.m_data)[otherOffset+other.relIndex()];
262    
263             left[thisOffset+numCopy]=other[otherOffset];
264             numCopy++;
265             break;
266          case 1:
267             for (int i=region[0].first;i<region[0].second;i++) {
268                left[thisOffset+numCopy]=other[otherOffset+getRelIndex(otherShape,i)];
269                numCopy++;
270             }
271             break;
272          case 2:
273             for (int j=region[1].first;j<region[1].second;j++) {
274                for (int i=region[0].first;i<region[0].second;i++) {
275    /*               (*m_data)[thisOffset+numCopy]=(*other.m_data)[otherOffset+other.relIndex(i,j)];*/
276                   left[thisOffset+numCopy]=other[otherOffset+getRelIndex(otherShape,i,j)];
277                   numCopy++;
278                }
279             }
280             break;
281          case 3:
282             for (int k=region[2].first;k<region[2].second;k++) {
283                for (int j=region[1].first;j<region[1].second;j++) {
284                   for (int i=region[0].first;i<region[0].second;i++) {
285    //                  (*m_data)[thisOffset+numCopy]=(*other.m_data)[otherOffset+other.relIndex(i,j,k)];
286                      left[thisOffset+numCopy]=other[otherOffset+getRelIndex(otherShape,i,j,k)];
287                      numCopy++;
288                   }
289                }
290             }
291             break;
292          case 4:
293             for (int l=region[3].first;l<region[3].second;l++) {
294                for (int k=region[2].first;k<region[2].second;k++) {
295                   for (int j=region[1].first;j<region[1].second;j++) {
296                      for (int i=region[0].first;i<region[0].second;i++) {
297    /*                     (*m_data)[thisOffset+numCopy]=(*other.m_data)[otherOffset+other.relIndex(i,j,k,l)];*/
298                         left[thisOffset+numCopy]=other[otherOffset+getRelIndex(otherShape,i,j,k,l)];
299                         numCopy++;
300                      }
301                   }
302                }
303             }
304             break;
305          default:
306             std::stringstream mess;
307             mess << "Error - (copySlice) Invalid slice region rank: " << region.size();
308             throw DataException(mess.str());
309          }
310       }
311    
312    
313       void
314       copySliceFrom(ValueType& left,
315                    const ShapeType& leftShape,
316                    ValueType::size_type thisOffset,
317                                    const ValueType& other,
318                    const ShapeType& otherShape,
319                                    ValueType::size_type otherOffset,
320                                    const RegionLoopRangeType& region)
321       {
322    
323          //
324          // Make sure views are not empty
325    
326          EsysAssert(left.size()!=0,
327                     "Error - this view is empty.");
328          EsysAssert(other.size()!=0,
329                     "Error - other view is empty.");
330    
331          //
332          // Check this view is compatible with the region to be sliced,
333          // and that the region to be sliced is compatible with the other view:
334    
335          EsysAssert(checkOffset(otherOffset,other.size(),noValues(otherShape)),
336                     "Error - offset incompatible with other view.");
337          EsysAssert(thisOffset+noValues(otherShape)<=left.size(),
338                     "Error - offset incompatible with this view.");
339    
340          EsysAssert(getRank(leftShape)==region.size(),
341                     "Error - slice not same rank as this view.");
342    
343          EsysAssert(getRank(otherShape)==0 || noValues(otherShape)==noValues(getResultSliceShape(region)),
344                     "Error - slice shape not compatible shape for other view.");
345    
346          //
347          // copy the values in the other view into the specified region of this view
348    
349          // allow for case where other view is a scalar
350          if (getRank(otherShape)==0) {
351    
352             // the following loops cannot be parallelised due to the numCopy counter
353             int numCopy=0;
354    
355             switch (region.size()) {
356             case 0:
357                /* this case should never be encountered,
358                as python will never pass us an empty region.
359                here for completeness only, allows slicing of a scalar */
360                //(*m_data)[thisOffset+relIndex()]=(*other.m_data)[otherOffset];
361            left[thisOffset]=other[otherOffset];
362                numCopy++;
363                break;
364             case 1:
365                for (int i=region[0].first;i<region[0].second;i++) {
366                   left[thisOffset+getRelIndex(leftShape,i)]=other[otherOffset];
367                   numCopy++;
368                }
369                break;
370             case 2:
371                for (int j=region[1].first;j<region[1].second;j++) {
372                   for (int i=region[0].first;i<region[0].second;i++) {
373                      left[thisOffset+getRelIndex(leftShape,i,j)]=other[otherOffset];
374                      numCopy++;
375                   }
376                }
377                break;
378             case 3:
379                for (int k=region[2].first;k<region[2].second;k++) {
380                   for (int j=region[1].first;j<region[1].second;j++) {
381                      for (int i=region[0].first;i<region[0].second;i++) {
382                         left[thisOffset+getRelIndex(leftShape,i,j,k)]=other[otherOffset];
383                         numCopy++;
384                      }
385                   }
386                }
387                break;
388             case 4:
389                for (int l=region[3].first;l<region[3].second;l++) {
390                   for (int k=region[2].first;k<region[2].second;k++) {
391                      for (int j=region[1].first;j<region[1].second;j++) {
392                         for (int i=region[0].first;i<region[0].second;i++) {
393                            left[thisOffset+getRelIndex(leftShape,i,j,k,l)]=other[otherOffset];
394                            numCopy++;
395                         }
396                      }
397                   }
398                }
399                break;
400             default:
401                std::stringstream mess;
402                mess << "Error - (copySliceFrom) Invalid slice region rank: " << region.size();
403                throw DataException(mess.str());
404             }
405    
406          } else {
407    
408             // the following loops cannot be parallelised due to the numCopy counter
409             int numCopy=0;
410    
411             switch (region.size()) {
412             case 0:
413                /* this case should never be encountered,
414                as python will never pass us an empty region.
415                here for completeness only, allows slicing of a scalar */
416                //(*m_data)[thisOffset+relIndex()]=(*other.m_data)[otherOffset+numCopy];
417            left[thisOffset]=other[otherOffset+numCopy];
418                numCopy++;
419                break;
420             case 1:
421                for (int i=region[0].first;i<region[0].second;i++) {
422                   left[thisOffset+getRelIndex(leftShape,i)]=other[otherOffset+numCopy];
423                   numCopy++;
424                }
425                break;
426             case 2:
427                for (int j=region[1].first;j<region[1].second;j++) {
428                   for (int i=region[0].first;i<region[0].second;i++) {
429                      left[thisOffset+getRelIndex(leftShape,i,j)]=other[otherOffset+numCopy];
430                      numCopy++;
431                   }
432                }
433                break;
434             case 3:
435                for (int k=region[2].first;k<region[2].second;k++) {
436                   for (int j=region[1].first;j<region[1].second;j++) {
437                      for (int i=region[0].first;i<region[0].second;i++) {
438                         left[thisOffset+getRelIndex(leftShape,i,j,k)]=other[otherOffset+numCopy];
439                         numCopy++;
440                      }
441                   }
442                }
443                break;
444             case 4:
445                for (int l=region[3].first;l<region[3].second;l++) {
446                   for (int k=region[2].first;k<region[2].second;k++) {
447                      for (int j=region[1].first;j<region[1].second;j++) {
448                         for (int i=region[0].first;i<region[0].second;i++) {
449                            left[thisOffset+getRelIndex(leftShape,i,j,k,l)]=other[otherOffset+numCopy];
450                            numCopy++;
451                         }
452                      }
453                   }
454                }
455                break;
456             default:
457                std::stringstream mess;
458                mess << "Error - (copySliceFrom) Invalid slice region rank: " << region.size();
459                throw DataException(mess.str());
460             }
461    
462          }
463    
464       }
465    
466    
467    
468    
469    
470  }   // end namespace DataTypes  }   // end namespace DataTypes
471  }   // end namespace escript  }   // end namespace escript

Legend:
Removed from v.1724  
changed lines
  Added in v.1734

  ViewVC Help
Powered by ViewVC 1.1.26