00001 #ifdef CH_LANG_CC
00002
00003
00004
00005
00006
00007
00008
00009 #endif
00010
00011 #ifndef _TRANSFORMIF_H_
00012 #define _TRANSFORMIF_H_
00013
00014 #include "MayDay.H"
00015 #include "RealVect.H"
00016 #include "Vector.H"
00017
00018 #include "BaseIF.H"
00019
00020 #include "NamespaceHeader.H"
00021
00023
00028 class TransformIF: public BaseIF
00029 {
00030 public:
00032
00035 TransformIF(const BaseIF& a_impFunc);
00036
00038 TransformIF(const TransformIF& a_inputIF);
00039
00041 virtual ~TransformIF();
00042
00044
00047 void translate(const RealVect& a_trans);
00048
00050
00053 void scale(const Real& a_scale);
00054
00056
00059 void scale(const RealVect& a_scale);
00060
00062
00067 void rotate(const Real& a_angle,
00068 const RealVect& a_point = RealVect::Zero,
00069 const RealVect& a_axis = BASISREALV(0));
00070
00072
00075 void rotate(const RealVect& a_axis1,
00076 const RealVect& a_axis2,
00077 const RealVect& a_point = RealVect::Zero);
00078
00080
00083 virtual Real value(const RealVect& a_point) const;
00084
00085 Real value(const IndexTM<Real,GLOBALDIM>& a_point) const;
00086
00087 virtual IndexTM<Real,GLOBALDIM> normal(const IndexTM<Real,GLOBALDIM>& a_point) const;
00088
00089 virtual Vector< IndexTM<Real,GLOBALDIM> > gradNormal(const IndexTM<Real,GLOBALDIM>& a_point) const;
00090
00091 virtual BaseIF* newImplicitFunction() const;
00092
00093 virtual bool fastIntersection(const RealVect& a_lo,
00094 const RealVect& a_hi) const ;
00095
00096 virtual GeometryService::InOut InsideOutside(const RealVect& a_lo,
00097 const RealVect& a_hi) const ;
00098
00099 protected:
00101
00104 TransformIF(const BaseIF& a_impFunc,
00105 const Real a_transform[SpaceDim+1][SpaceDim+1],
00106 const Real a_invTransform[SpaceDim+1][SpaceDim+1]);
00107
00108
00109 Real m_transform[SpaceDim+1][SpaceDim+1];
00110
00111
00112 Real m_invTransform[SpaceDim+1][SpaceDim+1];
00113
00114 BaseIF* m_impFunc;
00115
00116 void vectorMultiply(RealVect& m_outPoint,
00117 const Real m_intrans[SpaceDim+1][SpaceDim+1],
00118 const RealVect& m_inPoint) const;
00119
00120 void vectorMultiply(IndexTM<Real,GLOBALDIM>& m_outPoint,
00121 const Real m_intrans[SpaceDim+1][SpaceDim+1],
00122 const IndexTM<Real,GLOBALDIM>& m_inPoint) const;
00123
00124 void matrixIdentity(Real m_trans[SpaceDim+1][SpaceDim+1]) const;
00125
00126 void matrixMultiply(Real m_outTrans[SpaceDim+1][SpaceDim+1],
00127 const Real m_intrans1[SpaceDim+1][SpaceDim+1],
00128 const Real m_intrans2[SpaceDim+1][SpaceDim+1]) const;
00129
00130 void matrixTranslate(Real m_trans[SpaceDim+1][SpaceDim+1],
00131 const RealVect& m_translate) const;
00132
00133 void matrixScale(Real m_trans[SpaceDim+1][SpaceDim+1],
00134 const RealVect& m_scale) const;
00135
00136 private:
00137 TransformIF()
00138 {
00139 MayDay::Error("TransformIF uses strong construction");
00140 }
00141
00142 void operator=(const TransformIF& a_inputIF)
00143 {
00144 MayDay::Error("TransformIF doesn't allow assignment");
00145 }
00146 };
00147
00148 #include "NamespaceFooter.H"
00149 #endif