00001 #ifdef CH_LANG_CC
00002
00003
00004
00005
00006
00007
00008
00009 #endif
00010
00011 #ifndef _MINIIVFAB_H_
00012 #define _MINIIVFAB_H_
00013
00014 #include <cmath>
00015 #include <cstdlib>
00016 #include <memory>
00017 #include "SPACE.H"
00018 #include "Vector.H"
00019 #include "IntVectSet.H"
00020 #include "VolIndex.H"
00021 #include "BaseFab.H"
00022 #include "EBGraph.H"
00023 #include "BaseIVFAB.H"
00024 #include "NamespaceHeader.H"
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 template <class T>
00037 class MiniIVFAB
00038 {
00039 public:
00040
00041
00042
00043
00044 MiniIVFAB();
00045
00046
00047
00048
00049
00050
00051
00052
00053 MiniIVFAB( const IntVectSet& a_region,
00054 const EBGraph& a_ebgraph,
00055 const int& a_nvarin);
00056
00057
00058 bool hasVoFs() const
00059 {
00060 if(m_vofs) return true;
00061 return false;
00062 }
00063
00064
00065
00066
00067
00068 MiniIVFAB(const Interval& a_comps,
00069 MiniIVFAB<T>& a_original);
00070
00071
00072
00073 virtual ~MiniIVFAB();
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083 virtual void define(const IntVectSet& a_region,
00084 const EBGraph& a_ebgraph,
00085 const int& a_nvarin);
00086
00087
00088
00089 void copy(const Box& a_fromBox,
00090 const Interval& a_dstInterval,
00091 const Box& a_toBox,
00092 const MiniIVFAB<T>& a_src,
00093 const Interval& a_srcInterval);
00094
00095 int size(const Box& R, const Interval& comps) const ;
00096
00097
00098 void linearOut(void* buf, const Box& R, const Interval& comps) const;
00099
00100
00101 void linearIn(void* buf, const Box& R, const Interval& comps);
00102
00103 Vector<VolIndex> getVoFs() const;
00104
00105 inline T* dataPtr(int a_ivar)
00106 {
00107 if(m_vofs) return m_data+a_ivar*m_vofs->size();
00108 return m_data;
00109 }
00110
00111 const T* dataPtr(int a_ivar) const
00112 {
00113 if(m_vofs) return m_data+a_ivar*m_vofs->size();
00114 return m_data;
00115 }
00116
00117 void setVal(const T& a_val);
00118
00119 void setVal(int a_comp, const T& a_val);
00120
00121 void setVal(const T& a_val, const Box& a_box, int a_startcomp, int a_ncomp);
00122
00123
00124
00125
00126
00127
00128 virtual T* getIndex(const VolIndex& a_vof,const int& a_comp) const;
00129
00130
00131 long offset(const BaseIndex& a_vof, const int& a_ivar) const
00132 {
00133 const VolIndex* vof = dynamic_cast< const VolIndex* >(&a_vof);
00134 if (vof == NULL) MayDay::Error("cast failed:MiniIVFAB only takes vofs for indexing");
00135 unsigned int i = 0;
00136 for(;i<m_vofs->size(); i++)
00137 if(*vof == (*m_vofs)[i]) break;
00138 i+=a_ivar*m_vofs->size();
00139 return i;
00140 }
00141
00142
00143 T& operator() (const VolIndex& a_vof, int a_comp)
00144 { return *(getIndex(a_vof, a_comp));}
00145
00146
00147 const T& operator() (const VolIndex& a_vof, int a_comp) const
00148 {
00149 return *(getIndex(a_vof, a_comp));
00150 }
00151
00152 template <typename F>
00153 void forall(const MiniIVFAB& a_src, const Box& a_box, int a_srccomp, int a_destcomp, int a_numcomp, bool sameRegBox, const F& func);
00154
00155 int numVoFs() const;
00156
00157 int nComp() const {return m_nComp;}
00158 private:
00159
00160 protected:
00161
00162 shared_ptr<Vector<VolIndex> > m_vofs;
00163 shared_ptr<Vector<T> > m_Memory;
00164 int m_nComp = 0;
00165 T* m_data = nullptr;
00166
00167 };
00168
00169 #include "NamespaceFooter.H"
00170
00171 #ifndef CH_EXPLICIT_TEMPLATES
00172 #include "MiniIVFABI.H"
00173 #endif
00174
00175 #endif