00001 #ifdef CH_LANG_CC
00002
00003
00004
00005
00006
00007
00008
00009 #endif
00010
00011 #ifndef _NWOQUADCFINTERP_H_
00012 #define _NWOQUADCFINTERP_H_
00013
00014 #include "FArrayBox.H"
00015 #include "DisjointBoxLayout.H"
00016 #include "LevelData.H"
00017 #include "RealVect.H"
00018 #include "ProblemDomain.H"
00019 #include "CFIVS.H"
00020 #include "NamespaceHeader.H"
00021
00022
00023
00024
00025
00026 class NWOQuadCFInterp
00027 {
00028 public:
00029
00030
00031
00032
00033 NWOQuadCFInterp()
00034 {
00035 m_defined = false;
00036 }
00037
00038
00039 NWOQuadCFInterp(
00040 const DisjointBoxLayout& a_thisDisjointBoxLayout,
00041
00042 const DisjointBoxLayout& a_coarserDisjointBoxLayout,
00043
00044 const int& a_numStates,
00045
00046 const ProblemDomain& a_coarseDomain,
00047
00048 const int& a_refineCoarse,
00049
00050 const int& a_interpRadius)
00051 {
00052 define(a_thisDisjointBoxLayout, a_coarserDisjointBoxLayout,
00053 a_numStates, a_coarseDomain, a_refineCoarse, a_interpRadius);
00054 }
00055
00056
00057
00058
00059
00060
00061 ~NWOQuadCFInterp()
00062 {
00063 }
00064
00065
00066 void
00067 homogeneousCoarseFineInterp(
00068 LevelData<FArrayBox>& a_fineData,
00069
00070 int a_srcComp,
00071
00072 int a_dstComp,
00073
00074 int a_numComp);
00075
00076
00077
00078
00079 void define(
00080 const DisjointBoxLayout& a_thisDisjointBoxLayout,
00081
00082 const DisjointBoxLayout& a_coarserDisjointBoxLayout,
00083
00084 const int& a_numStates,
00085
00086 const ProblemDomain& a_coarseDomain,
00087
00088 const int& a_refineCoarse,
00089
00090 const int& a_interpRadius);
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100 void coarseFineInterp(
00101 LevelData<FArrayBox>& a_fineData,
00102
00103 const LevelData<FArrayBox>& a_coarseData,
00104
00105 int a_srcComp,
00106
00107 int a_dstComp,
00108
00109 int a_numComp);
00110
00111
00112
00113 protected:
00114
00115
00116 bool m_defined;
00117
00118
00119 DisjointBoxLayout m_layout;
00120
00121
00122 DisjointBoxLayout m_coarseLayout;
00123
00124
00125 int m_interpRadius;
00126
00127
00128 ProblemDomain m_coarseDomain;
00129
00130
00131 int m_refineCoarse;
00132
00133
00134 IntVect m_refineVect;
00135
00136
00137 int m_numStates;
00138 DisjointBoxLayout m_layoutCoarsened;
00139
00140
00141 LevelData<FArrayBox> m_coarsenedFineData;
00142
00143
00144 LayoutData<CFIVS> m_cfivs;
00145
00146
00147 void
00148 interpOnPatch(FArrayBox& a_fineData,
00149 const FArrayBox& a_coarseData,
00150 const DataIndex& a_dit,
00151 int a_srcComp,
00152 int a_dstComp,
00153 int a_numComp);
00154
00155 void
00156 extrapolateValue(Real & a_fineValue,
00157 const Real & a_coarValue,
00158 const RealVect & a_firstDerivs,
00159 const RealVect & a_secondDerivs,
00160 const RealVect & a_mixedDerivs,
00161 const RealVect & a_distance);
00162
00163 void
00164 getDerivs(RealVect& firstDerivs,
00165 RealVect& secondDerivs,
00166 RealVect& mixedDerivs,
00167 const FArrayBox & a_data,
00168 const IntVect& a_ivCoar,
00169 const Real & a_dx,
00170 const int & a_icomp);
00171
00172
00173 int getMixedIndex(int a_derivDir1, int a_derivDir2)
00174 {
00175 int retval;
00176
00177 if(((a_derivDir1 == 0) && (a_derivDir2 == 1)) || ((a_derivDir1 == 1) && (a_derivDir2 == 0)))
00178 {
00179 retval = 0;
00180 }
00181 else if (((a_derivDir1 == 0) && (a_derivDir2 == 2)) || ((a_derivDir1 == 2) && (a_derivDir2 == 0)))
00182 {
00183 retval = 1;
00184 }
00185 else if (((a_derivDir1 == 1) && (a_derivDir2 == 2)) || ((a_derivDir1 == 2) && (a_derivDir2 == 1)))
00186 {
00187 retval = 2;
00188 }
00189 else
00190 {
00191 MayDay::Error("bogus arguments to getmixedindex");
00192 }
00193 return retval;
00194 }
00195
00196 void
00197 getMixedDerivDirections(int & a_derivDir1, int& a_derivDir2, const int& a_index)
00198 {
00199
00200 if(a_index == 0)
00201 {
00202 a_derivDir1 = 0;
00203 a_derivDir2 = 1;
00204 }
00205 else if(a_index == 1)
00206 {
00207 a_derivDir1 = 0;
00208 a_derivDir2 = 2;
00209 }
00210 else if(a_index == 2)
00211 {
00212 a_derivDir1 = 1;
00213 a_derivDir2 = 2;
00214 }
00215 else
00216 {
00217 MayDay::Error("bogus arguments to getmixedderivdirections");
00218 }
00219 }
00220 private:
00221
00222
00223 void operator=(const NWOQuadCFInterp&);
00224 NWOQuadCFInterp(const NWOQuadCFInterp&);
00225 };
00226
00227 #include "NamespaceFooter.H"
00228 #endif