00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef _GENMGINTERPIMPLEM_H_
00029 #define _GENMGINTERPIMPLEM_H_
00030
00031 #include "DisjointBoxLayout.H"
00032 #include "LevelData.H"
00033 #include "REAL.H"
00034 #include "DataIterator.H"
00035
00036 #include "GenLevelMGF_F.H"
00037
00038 template <class T>
00039 GenMGInterp<T>::GenMGInterp()
00040 :m_isDefined(false)
00041 {
00042 }
00043
00044 template <class T>
00045 GenMGInterp<T>::GenMGInterp(const DisjointBoxLayout& a_fineDomain,
00046 int a_numcomps,
00047 int a_refRatio,
00048 const Box& a_problemDomain)
00049 :m_isDefined(false)
00050 {
00051 ProblemDomain finePhysdomain(a_problemDomain);
00052 define(a_fineDomain, a_numcomps, a_refRatio, finePhysdomain);
00053 }
00054
00055 template <class T>
00056 GenMGInterp<T>::GenMGInterp(const DisjointBoxLayout& a_fineDomain,
00057 int a_numcomps,
00058 int a_refRatio,
00059 const ProblemDomain& a_problemDomain)
00060 :m_isDefined(false)
00061 {
00062 define(a_fineDomain, a_numcomps, a_refRatio, a_problemDomain);
00063 }
00064
00065 template <class T>
00066 GenMGInterp<T>::~GenMGInterp()
00067 {
00068 }
00069
00070 template <class T>
00071 bool GenMGInterp<T>::isDefined() const
00072 {
00073 return m_isDefined;
00074 }
00075
00076 template <class T>
00077 void GenMGInterp<T>::define(const DisjointBoxLayout& a_fineDomain,
00078 int a_numcomps,
00079 int a_refRatio,
00080 const Box& a_problemDomain)
00081 {
00082 ProblemDomain physdomain(a_problemDomain);
00083 define(a_fineDomain, a_numcomps, a_refRatio, physdomain);
00084 }
00085
00086 template <class T>
00087 void GenMGInterp<T>::define(const DisjointBoxLayout& a_fineDomain,
00088 int a_numcomps,
00089 int a_refRatio,
00090 const ProblemDomain& a_problemDomain)
00091 {
00092 m_refRatio = a_refRatio;
00093 m_problemDomain = a_problemDomain;
00094 m_grids = a_fineDomain;
00095
00096
00097 DisjointBoxLayout coarsenedFineDomain;
00098 coarsen(coarsenedFineDomain,
00099 a_fineDomain,
00100 m_refRatio);
00101 m_coarsenedFineData.define(coarsenedFineDomain,
00102 a_numcomps,
00103 IntVect::TheZeroVector());
00104
00105 m_isDefined = true;
00106 }
00107
00108
00109 template <class T>
00110 void GenMGInterp<T>::interpToFine(T& a_fineData,
00111 const T& a_coarseData)
00112 {
00113 assert(m_isDefined);
00114
00115 a_coarseData.copyTo(a_coarseData.interval(),
00116 m_coarsenedFineData,
00117 m_coarsenedFineData.interval());
00118
00119 #if FIXIT
00120 DataIterator dit = m_grids.dataIterator();
00121 for (dit.begin(); dit.ok(); ++dit)
00122 {
00123 T& fine = a_fineData[dit()];
00124 const T& coarsenedFine = m_coarsenedFineData[dit()];
00125 Box crseBox = coarsenedFine.box();
00126 Box fineBox = m_grids.get(dit());
00127 fineBox.coarsen(m_refRatio);
00128
00129 assert(fineBox == crseBox);
00130
00131 Box nrefbox(IntVect::TheZeroVector(),
00132 (m_refRatio-1)*IntVect::TheUnitVector());
00133 FORT_GENINTERPMG(CHF_FRA(fine),
00134 CHF_FRA(coarsenedFine),
00135 CHF_BOX(crseBox),
00136 CHF_CONST_INT(m_refRatio),
00137 CHF_BOX(nrefbox));
00138 }
00139 #endif
00140 }
00141
00142 #endif