00001 #ifdef CH_LANG_CC
00002
00003
00004
00005
00006
00007
00008
00009 #endif
00010
00011
00012
00013 #ifndef _FACEINDEX_H_
00014 #define _FACEINDEX_H_
00015
00016 #include "LoHiSide.H"
00017 #include "VolIndex.H"
00018 #include "SPMD.H"
00019 #include "BaseIndex.H"
00020 #include "NamespaceHeader.H"
00021
00022
00023
00024
00025
00026
00027
00028 class FaceIndex : public BaseIndex
00029 {
00030 public:
00031
00032
00033
00034
00035
00036
00037 FaceIndex(const VolIndex& a_vof1,
00038 const VolIndex& a_vof2,
00039 const int& a_direction);
00040
00041
00042
00043
00044 FaceIndex(const VolIndex& a_vof1,
00045 const VolIndex& a_vof2);
00046
00047
00048
00049
00050
00051
00052
00053 void define(const VolIndex& a_vof1,
00054 const VolIndex& a_vof2,
00055 const int& a_direction);
00056
00057
00058
00059
00060
00061
00062 void define(const VolIndex& a_vof1,
00063 const VolIndex& a_vof2);
00064
00065
00066
00067 FaceIndex();
00068
00069
00070
00071
00072 FaceIndex(const FaceIndex& a_facein);
00073
00074
00075
00076
00077 void define(const FaceIndex& a_facein);
00078
00079
00080
00081
00082 ~FaceIndex();
00083
00084
00085
00086
00087 FaceIndex& operator= (const FaceIndex& a_facein);
00088
00089
00090
00091 friend bool operator<( const FaceIndex& f1, const FaceIndex& f2 );
00092
00093
00094 friend ostream& operator<<( ostream& out, const FaceIndex& fi );
00095
00096
00097
00098
00099
00100 bool operator== (const FaceIndex& a_facein) const;
00101
00102
00103
00104
00105 bool operator!= (const FaceIndex& a_facein) const;
00106
00107
00108
00109
00110 const int& direction() const;
00111
00112
00113
00114
00115 const bool& isDefined() const;
00116
00117
00118
00119
00120 const bool& isBoundary() const;
00121
00122
00123
00124
00125
00126
00127
00128 const int& cellIndex(const Side::LoHiSide& a_sd) const;
00129
00130
00131
00132
00133
00134
00135 const IntVect& gridIndex(const Side::LoHiSide& a_sd) const;
00136
00137
00138
00139
00140
00141 VolIndex getVoF(const Side::LoHiSide& a_sd) const;
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151 int faceSign(const VolIndex& a_vof) const;
00152
00153
00154 static size_t lo_offset, hi_offset, rest_offset;
00155 static int initializeOffsets();
00156
00157
00158 void shift(const IntVect& a_iv)
00159 {
00160 m_loiv += a_iv;
00161 m_hiiv += a_iv;
00162 }
00163
00164 private:
00165
00166
00167
00168
00169 IntVect m_loiv;
00170
00171
00172
00173
00174 IntVect m_hiiv;
00175
00176
00177
00178
00179
00180
00181
00182 int m_loIndex;
00183
00184
00185
00186
00187
00188
00189
00190 int m_hiIndex;
00191
00192
00193 int m_direction;
00194
00195
00196
00197
00198
00199 bool m_isDefined;
00200
00201
00202
00203
00204
00205
00206 bool m_isBoundary;
00207
00208 };
00209
00210
00211 inline
00212 bool operator<( const FaceIndex& f1, const FaceIndex& f2 )
00213 {
00214 if ( f1.m_loiv.lexLT( f2.m_loiv ) )
00215 {
00216 return true;
00217 }
00218 else
00219 if ( f2.m_loiv.lexLT( f1.m_loiv ) )
00220 {
00221 return false;
00222 }
00223 else
00224 if ( f1.m_loIndex < f2.m_loIndex )
00225 {
00226 return true;
00227 }
00228 else
00229 if ( f2.m_loIndex < f1.m_loIndex )
00230 {
00231 return false;
00232 }
00233 else
00234 if ( f1.m_hiiv.lexLT( f2.m_hiiv ) )
00235 {
00236 return true;
00237 }
00238 else
00239 if ( f2.m_hiiv.lexLT( f1.m_hiiv ) )
00240 {
00241 return false;
00242 }
00243 else
00244 if ( f1.m_hiIndex < f2.m_hiIndex )
00245 {
00246 return true;
00247 }
00248 else
00249 if ( f2.m_hiIndex < f1.m_hiIndex )
00250 {
00251 return false;
00252 }
00253 else
00254 if ( f1.m_direction < f2.m_direction )
00255 {
00256 return true;
00257 }
00258 else
00259 if ( f2.m_direction < f1.m_direction )
00260 {
00261 return false;
00262 }
00263 else
00264 if ( f1.m_isBoundary && (!f2.m_isBoundary) )
00265 {
00266 return true;
00267 }
00268 else
00269 if ( (!f1.m_isBoundary) && f2.m_isBoundary )
00270 {
00271 return false;
00272 }
00273
00274 return false;
00275 }
00276
00277
00278 template < >
00279 int linearSize(const FaceIndex& findex);
00280
00281
00282 template < >
00283 void linearIn(FaceIndex& a_outputT, const void* const inBuf);
00284
00285
00286 template < >
00287 void linearOut(void* const a_outBuf, const FaceIndex& a_inputT);
00288
00289 #include "NamespaceFooter.H"
00290 #endif