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

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

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

revision 964 by gross, Tue Feb 13 05:10:26 2007 UTC revision 1319 by matt, Thu Sep 27 00:27:51 2007 UTC
# Line 1  Line 1 
1  // $Id$  
2  /*  /* $Id$ */
3   ************************************************************  
4   *          Copyright 2006 by ACcESS MNRF                   *  /*******************************************************
5   *                                                          *   *
6   *              http://www.access.edu.au                    *   *           Copyright 2003-2007 by ACceSS MNRF
7   *       Primary Business: Queensland, Australia            *   *       Copyright 2007 by University of Queensland
8   *  Licensed under the Open Software License version 3.0    *   *
9   *     http://www.opensource.org/licenses/osl-3.0.php       *   *                http://esscc.uq.edu.au
10   *                                                          *   *        Primary Business: Queensland, Australia
11   ************************************************************   *  Licensed under the Open Software License version 3.0
12  */   *     http://www.opensource.org/licenses/osl-3.0.php
13     *
14     *******************************************************/
15    
16  #include "DataExpanded.h"  #include "DataExpanded.h"
17  #include "DataException.h"  #include "DataException.h"
18  #include "DataConstant.h"  #include "DataConstant.h"
19  #include "DataTagged.h"  #include "DataTagged.h"
20    #ifdef USE_NETCDF
21    #include <netcdfcpp.h>
22    #endif
23    
24  #include <boost/python/extract.hpp>  #include <boost/python/extract.hpp>
25    
# Line 155  DataExpanded::~DataExpanded() Line 160  DataExpanded::~DataExpanded()
160  }  }
161    
162  DataAbstract*  DataAbstract*
163  DataExpanded::getSlice(const DataArrayView::RegionType& region) const  DataExpanded::getSlice(const DataArrayView::RegionType& region) const
164  {  {
165    return new DataExpanded(*this,region);    return new DataExpanded(*this,region);
166  }  }
167    
168  void  void
169  DataExpanded::setSlice(const DataAbstract* value,  DataExpanded::setSlice(const DataAbstract* value,
170                         const DataArrayView::RegionType& region)                         const DataArrayView::RegionType& region)
171  {  {
172    const DataExpanded* tempDataExp=dynamic_cast<const DataExpanded*>(value);    const DataExpanded* tempDataExp=dynamic_cast<const DataExpanded*>(value);
173    if (tempDataExp==0) {    if (tempDataExp==0) {
# Line 198  DataExpanded::setSlice(const DataAbstrac Line 203  DataExpanded::setSlice(const DataAbstrac
203  }  }
204    
205  void  void
206  DataExpanded::copy(const DataArrayView& value)  DataExpanded::copy(const DataArrayView& value)
207  {  {
208    //    //
209    // copy a single value to every data point in this object    // copy a single value to every data point in this object
# Line 208  DataExpanded::copy(const DataArrayView& Line 213  DataExpanded::copy(const DataArrayView&
213    #pragma omp parallel for private(i,j) schedule(static)    #pragma omp parallel for private(i,j) schedule(static)
214    for (i=0;i<nRows;i++) {    for (i=0;i<nRows;i++) {
215      for (j=0;j<nCols;j++) {      for (j=0;j<nCols;j++) {
216        // NOTE: An exception may be thown from this call if        // NOTE: An exception may be thown from this call if
217        // DOASSERT is on which of course will play        // DOASSERT is on which of course will play
218        // havoc with the omp threads. Run single threaded        // havoc with the omp threads. Run single threaded
219        // if using DOASSERT.        // if using DOASSERT.
220        getPointDataView().copy(m_data.index(i,j),value);        getPointDataView().copy(m_data.index(i,j),value);
221      }      }
222    }    }
223  }  }
224    
225  void  void
226  DataExpanded::copy(const boost::python::numeric::array& value)  DataExpanded::copy(const boost::python::numeric::array& value)
227  {  {
228    //  
229    // first convert the numarray into a DataArray object    // extract the shape of the numarray
230    DataArray temp(value);    DataArrayView::ShapeType tempShape;
231      for (int i=0; i < value.getrank(); i++) {
232        tempShape.push_back(extract<int>(value.getshape()[i]));
233      }
234    
235      // get the space for the data vector
236      int len = DataArrayView::noValues(tempShape);
237      DataVector temp_data(len, 0.0, len);
238      DataArrayView temp_dataView(temp_data, tempShape);
239      temp_dataView.copy(value);
240    
241    //    //
242    // check the input shape matches this shape    // check the input shape matches this shape
243    if (!getPointDataView().checkShape(temp.getView().getShape())) {    if (!getPointDataView().checkShape(temp_dataView.getShape())) {
244      throw DataException(getPointDataView().createShapeErrorMessage(      throw DataException(getPointDataView().createShapeErrorMessage(
245                          "Error - (DataExpanded) Cannot copy due to shape mismatch.",                          "Error - (DataExpanded) Cannot copy due to shape mismatch.",
246                          temp.getView().getShape()));                          temp_dataView.getShape()));
247    }    }
248    //    //
249    // now copy over the data    // now copy over the data
250    copy(temp.getView());    copy(temp_dataView);
251  }  }
252    
253  void  void
# Line 306  DataExpanded::extractData(ifstream& arch Line 321  DataExpanded::extractData(ifstream& arch
321    return(m_data.extractData(archiveFile, noValues));    return(m_data.extractData(archiveFile, noValues));
322  }  }
323    
324  void  void
325  DataExpanded::copyToDataPoint(const int sampleNo, const int dataPointNo, const double value) {  DataExpanded::copyToDataPoint(const int sampleNo, const int dataPointNo, const double value) {
326    //    //
327    // Get the number of samples and data-points per sample.    // Get the number of samples and data-points per sample.
# Line 353  DataExpanded::copyToDataPoint(const int Line 368  DataExpanded::copyToDataPoint(const int
368               }               }
369             }             }
370           }           }
371       }       }
372    }    }
373  }  }
374  void  void
375  DataExpanded::copyToDataPoint(const int sampleNo, const int dataPointNo, const boost::python::numeric::array& value) {  DataExpanded::copyToDataPoint(const int sampleNo, const int dataPointNo, const boost::python::numeric::array& value) {
376    //    //
377    // Get the number of samples and data-points per sample.    // Get the number of samples and data-points per sample.
# Line 407  DataExpanded::copyToDataPoint(const int Line 422  DataExpanded::copyToDataPoint(const int
422               }               }
423             }             }
424           }           }
425       }       }
426    }    }
427  }  }
428  void  void
# Line 615  DataExpanded::eigenvalues_and_eigenvecto Line 630  DataExpanded::eigenvalues_and_eigenvecto
630  }  }
631    
632  void  void
633  DataExpanded::dump(const std::string fileName) const  DataExpanded::setToZero(){
634  {    int numSamples = getNumSamples();
635      throw DataException("Error - DataExpanded:: dump: not implemented.");    int numDataPointsPerSample = getNumDPPSample();
636      DataArrayView& thisView=getPointDataView();
637      DataArrayView::ValueType::size_type n = thisView.noValues();
638      double* p;
639      int  sampleNo,dataPointNo, i;
640      #pragma omp parallel for private(sampleNo,dataPointNo,p,i) schedule(static)
641      for (sampleNo = 0; sampleNo < numSamples; sampleNo++) {
642        for (dataPointNo = 0; dataPointNo < numDataPointsPerSample; dataPointNo++) {
643            p=&(m_data[getPointOffset(sampleNo,dataPointNo)]);
644            for (int i=0; i<n ;++i) p[i]=0.;
645        }
646      }
647  }  }
648    
649    
650    void
651    DataExpanded::dump(const std::string fileName) const
652    {
653       #ifdef PASO_MPI
654       throw DataException("Error - DataExpanded:: dump is not implemented for MPI yet.");
655       #endif
656       #ifdef USE_NETCDF
657       const int ldims=2+DataArrayView::maxRank;
658       const NcDim* ncdims[ldims];
659       NcVar *var, *ids;
660       int rank = getPointDataView().getRank();
661       int type=  getFunctionSpace().getTypeCode();
662       int ndims =0;
663       long dims[ldims];
664       const double* d_ptr=&(m_data[0]);
665       DataArrayView::ShapeType shape = getPointDataView().getShape();
666    
667       // netCDF error handler
668       NcError err(NcError::verbose_nonfatal);
669       // Create the file.
670       NcFile dataFile(fileName.c_str(), NcFile::Replace);
671       // check if writing was successful
672       if (!dataFile.is_valid())
673            throw DataException("Error - DataExpanded:: opening of netCDF file for output failed.");
674       if (!dataFile.add_att("type_id",2) )
675            throw DataException("Error - DataExpanded:: appending data type to netCDF file failed.");
676       if (!dataFile.add_att("rank",rank) )
677            throw DataException("Error - DataExpanded:: appending rank attribute to netCDF file failed.");
678       if (!dataFile.add_att("function_space_type",type))
679            throw DataException("Error - DataExpanded:: appending function space attribute to netCDF file failed.");
680       ndims=rank+2;
681       if ( rank >0 ) {
682           dims[0]=shape[0];
683           if (! (ncdims[0] = dataFile.add_dim("d0",shape[0])) )
684                throw DataException("Error - DataExpanded:: appending ncdimsion 0 to netCDF file failed.");
685       }
686       if ( rank >1 ) {
687           dims[1]=shape[1];
688           if (! (ncdims[1] = dataFile.add_dim("d1",shape[1])) )
689                throw DataException("Error - DataExpanded:: appending ncdimsion 1 to netCDF file failed.");
690       }
691       if ( rank >2 ) {
692           dims[2]=shape[2];
693           if (! (ncdims[2] = dataFile.add_dim("d2", shape[2])) )
694                throw DataException("Error - DataExpanded:: appending ncdimsion 2 to netCDF file failed.");
695       }
696       if ( rank >3 ) {
697           dims[3]=shape[3];
698           if (! (ncdims[3] = dataFile.add_dim("d3", shape[3])) )
699                throw DataException("Error - DataExpanded:: appending ncdimsion 3 to netCDF file failed.");
700       }
701       dims[rank]=getFunctionSpace().getNumDataPointsPerSample();
702       if (! (ncdims[rank] = dataFile.add_dim("num_data_points_per_sample", dims[rank])) )
703                throw DataException("Error - DataExpanded:: appending num_data_points_per_sample to netCDF file failed.");
704       dims[rank+1]=getFunctionSpace().getNumSamples();
705       if (! (ncdims[rank+1] = dataFile.add_dim("num_samples", dims[rank+1])) )
706                throw DataException("Error - DataExpanded:: appending num_sample to netCDF file failed.");
707    
708       if (! ( ids = dataFile.add_var("id", ncInt, ncdims[rank+1])) )
709            throw DataException("Error - DataExpanded:: appending reference id to netCDF file failed.");
710       const int* ids_p=getFunctionSpace().borrowSampleReferenceIDs();
711       if (! (ids->put(ids_p,dims[rank+1])) )
712            throw DataException("Error - DataExpanded:: copy reference id  to netCDF buffer failed.");
713    
714       if (! ( var = dataFile.add_var("data", ncDouble, ndims, ncdims)) )
715            throw DataException("Error - DataExpanded:: appending variable to netCDF file failed.");
716       if (! (var->put(d_ptr,dims)) )
717            throw DataException("Error - DataExpanded:: copy data to netCDF buffer failed.");
718       #else
719       throw DataException("Error - DataExpanded:: dump is not configured with netCDF. Please contact your installation manager.");
720       #endif
721    }
722  }  // end of namespace  }  // end of namespace

Legend:
Removed from v.964  
changed lines
  Added in v.1319

  ViewVC Help
Powered by ViewVC 1.1.26