Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Class Members | File Members

BaseFab.H

Go to the documentation of this file.
00001 /*   _______              __
00002     / ___/ /  ___  __ _  / /  ___
00003    / /__/ _ \/ _ \/  V \/ _ \/ _ \
00004    \___/_//_/\___/_/_/_/_.__/\___/
00005 */
00006 // CHOMBO Copyright (c) 2000-2004, The Regents of the University of
00007 // California, through Lawrence Berkeley National Laboratory (subject to
00008 // receipt of any required approvals from U.S. Dept. of Energy).  All
00009 // rights reserved.
00010 //
00011 // Redistribution and use in source and binary forms, with or without
00012 // modification, are permitted provided that the following conditions are met:
00013 //
00014 // (1) Redistributions of source code must retain the above copyright
00015 // notice, this list of conditions and the following disclaimer.
00016 // (2) Redistributions in binary form must reproduce the above copyright
00017 // notice, this list of conditions and the following disclaimer in the
00018 // documentation and/or other materials provided with the distribution.
00019 // (3) Neither the name of Lawrence Berkeley National Laboratory, U.S.
00020 // Dept. of Energy nor the names of its contributors may be used to endorse
00021 // or promote products derived from this software without specific prior
00022 // written permission.
00023 //
00024 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
00025 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
00026 // TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
00027 // PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
00028 // OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
00029 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
00030 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
00031 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
00032 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
00033 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
00034 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00035 //
00036 // You are under no obligation whatsoever to provide any bug fixes,
00037 // patches, or upgrades to the features, functionality or performance of
00038 // the source code ("Enhancements") to anyone; however, if you choose to
00039 // make your Enhancements available either publicly, or directly to
00040 // Lawrence Berkeley National Laboratory, without imposing a separate
00041 // written license agreement for such Enhancements, then you hereby grant
00042 // the following license: a non-exclusive, royalty-free perpetual license
00043 // to install, use, modify, prepare derivative works, incorporate into
00044 // other computer software, distribute, and sublicense such Enhancements or
00045 // derivative works thereof, in binary and source code form.
00046 //
00047 // TRADEMARKS. Product and company names mentioned herein may be the
00048 // trademarks of their respective owners.  Any rights not expressly granted
00049 // herein are reserved.
00050 //
00051 
00052 #ifndef _BASEFAB_H_
00053 #define _BASEFAB_H_
00054 
00055 #include <cstdlib>
00056 #include "SPACE.H"
00057 #include <string>
00058 #include <typeinfo>
00059 
00060 #include "Box.H"
00061 #include "Arena.H"
00062 #include "Interval.H"
00063 #include "REAL.H"
00064 
00111 extern Real BaseFabRealSetVal;
00112 
00113 template <class T> class BaseFab
00114 {
00115 public:
00117 
00124   BaseFab ();
00125 
00127 
00130   BaseFab(const Box& a_bx,
00131           int        a_n,
00132           T*         a_alias = NULL);
00133 
00147   BaseFab(const Interval& a_comps,
00148           BaseFab<T>&     a_original);
00149 
00151 
00155   virtual ~BaseFab();
00156 
00166   void resize(const Box& a_b,
00167               int        a_n = 1,
00168               T*         a_alias=NULL);
00169 
00174   virtual void define(const Box& a_box,
00175                       int        a_comps,
00176                       T*         a_alias = NULL)
00177   {
00178     resize(a_box, a_comps, a_alias);
00179   }
00180 
00185   virtual void define(const Interval& a_comps,
00186                       BaseFab<T>&     a_original);
00187 
00192   void clear();
00193 
00195 
00197 
00200   int nComp() const;
00201 
00203 
00206   const Box& box() const;
00207 
00212   const int* size() const;
00213 
00217   const IntVect& smallEnd() const;
00218 
00222   const IntVect& bigEnd() const;
00223 
00225 
00228   Interval interval() const
00229   {
00230     return Interval(0, m_nvar-1);
00231   }
00232 
00238   T& operator () (const IntVect& a_p,
00239                   int            a_N);
00240 
00241   T& operator () (const IntVect& a_p);
00242 
00248   const T& operator () (const IntVect& p,
00249                         int            N) const;
00250 
00251   const T& operator () (const IntVect& p) const;
00252 
00258   void getVal(T*             a_data,
00259               const IntVect& a_pos,
00260               int            a_N,
00261               int            a_numcomp) const;
00262 
00268   void getVal(T*             a_data,
00269               const IntVect& a_pos) const;
00270 
00272 
00280   const int* loVect() const;
00281 
00289   const int* hiVect() const;
00290 
00296   const int* nCompPtr() const;
00297 
00307   T* dataPtr(int a_n = 0);
00308 
00318   const T* dataPtr(int a_n = 0) const;
00319 
00321 
00326   bool contains(const BaseFab<T>& a_fab) const;
00327 
00332   bool contains(const Box& a_bx) const;
00333 
00335 
00341   void setVal(T          a_x,
00342               const Box& a_bx,
00343               int        a_nstart,
00344               int        a_numcomp);
00345 
00347 
00351   void setVal(T          a_x,
00352               const Box& a_bx,
00353               int        a_n);
00354 
00356 
00360   void setVal(T   a_x,
00361               int a_n);
00362 
00364 
00368   void setVal(T a_x);
00369 
00385   BaseFab<T>& copy(const BaseFab<T>& a_src,
00386                    const Box&        a_srcbox,
00387                    int               a_srccomp,
00388                    const Box&        a_destbox,
00389                    int               a_destcomp,
00390                    int               a_numcomp);
00391 
00399   BaseFab<T>& copy(const BaseFab<T>& a_src,
00400                    int               a_srccomp,
00401                    int               a_destcomp,
00402                    int               a_numcomp = 1);
00403 
00410   BaseFab<T>& copy(const BaseFab<T>& a_src,
00411                    const Box&        a_destbox);
00412 
00418   BaseFab<T>& copy(const BaseFab<T>& a_src);
00419 
00421 
00426   void copy(const Box&        a_RegionFrom,
00427             const Interval&   a_Cdest,
00428             const Box&        a_RegionTo,
00429             const BaseFab<T>& a_src,
00430             const Interval&   a_Csrc);
00431 
00433 
00435 
00440   BaseFab<T>& shift(const IntVect& a_v);
00441 
00443 
00449   BaseFab<T>& shift(int a_idir,
00450                     int a_ncells);
00451 
00453 
00463   BaseFab<T>& shiftHalf(int a_dir,
00464                         int a_numHalfs);
00465 
00467 
00472   BaseFab<T>& shiftHalf(const IntVect& a_v);
00473 
00475 
00477 
00483   virtual int size(const Box&      a_box,
00484                    const Interval& a_comps) const;
00485 
00487 
00492   virtual void linearOut(void*           a_buf,
00493                          const Box&      a_R,
00494                          const Interval& a_comps) const;
00495 
00497   virtual void linearIn(void*           a_buf,
00498                         const Box&      a_R,
00499                         const Interval& a_comps);
00500 
00502   static int preAllocatable()
00503   {
00504     return 0; // static preAllocatable
00505   }
00506 
00507 
00508 protected:
00509   //
00510   // Allocates memory for the `BaseFab<T>'.
00511   //
00512   void define();
00513 
00514   //
00515   // Deallocates memory for the `BaseFab<T>'.
00516   //
00517   void undefine();
00518 
00519   static std::string name();
00520 
00521   //
00522   // The function called by BaseFab copy operations.
00523   //
00524   virtual void performCopy(const BaseFab<T>& a_src,
00525                            const Box&        a_srcbox,
00526                            int               a_srccomp,
00527                            const Box&        a_destbox,
00528                            int               a_destcomp,
00529                            int               a_numcomp);
00530 
00531   //
00532   // This function is called by the `BaseFab' setVal operations.
00533   //
00534   void performSetVal(T          a_x,
00535                      const Box& a_bx,
00536                      int        a_nstart,
00537                      int        a_numcomp);
00538 
00539   //
00540   // template class static data member.  not sure if this will
00541   // work with all compilers.  It has been in the draft standard
00542   // for some time
00543   //
00544   static Arena* s_Arena;
00545 
00546   Box  m_domain;   // My index space.
00547   int  m_nvar;     // Number components.
00548   long m_numpts;   // Cached number of points in FAB.
00549   long m_truesize; // m_nvar * m_numpts that was allocated on heap
00550                    //   (only if m_aliased == false).
00551   T*   m_dptr;     // The data pointer.
00552   bool m_aliased;  // The BaseFab is not allocated memory, but is an alias. bvs
00553 
00554 private:
00555   //
00556   // These functions are made private to prevent use of the default
00557   // functions provided by the C++ compiler.
00558   //
00559   BaseFab<T>& operator= (const BaseFab<T>&);
00560   BaseFab (const BaseFab<T>&);
00561 };
00562 
00563 #include "BaseFabImplem.H"
00564 
00565 #endif

Generated on Wed Oct 5 13:52:08 2005 for Chombo&AMRSelfGravity by  doxygen 1.4.1