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
00022
00023
00024
00025
00026
00027
00028 class TransformIF: public BaseIF
00029 {
00030 public:
00031
00032
00033
00034
00035 TransformIF(const BaseIF& a_impFunc);
00036
00037
00038 TransformIF(const TransformIF& a_inputIF);
00039
00040
00041 virtual ~TransformIF();
00042
00043
00044
00045
00046
00047 void translate(const RealVect& a_trans);
00048
00049
00050
00051
00052
00053 void scale(const Real& a_scale);
00054
00055
00056
00057
00058
00059 void scale(const RealVect& a_scale);
00060
00061
00062
00063
00064
00065
00066
00067 void rotate(const Real& a_angle,
00068 const RealVect& a_point = RealVect::Zero,
00069 const RealVect& a_axis = BASISREALV(0));
00070
00071
00072
00073
00074
00075 void rotate(const RealVect& a_axis1,
00076 const RealVect& a_axis2,
00077 const RealVect& a_point = RealVect::Zero);
00078
00079
00080
00081
00082
00083 virtual Real value(const RealVect& a_point) const;
00084
00085 Real value(const IndexTM<Real,GLOBALDIM>& a_point) const;
00086
00087 virtual BaseIF* newImplicitFunction() const;
00088
00089 virtual bool fastIntersection(const RealVect& a_lo,
00090 const RealVect& a_hi) const ;
00091
00092 virtual GeometryService::InOut InsideOutside(const RealVect& a_lo,
00093 const RealVect& a_hi) const ;
00094
00095
00096
00097
00098
00099 virtual void boxLayoutChanged(const DisjointBoxLayout & a_newBoxLayout,
00100 const RealVect & a_dx)
00101 {
00102 m_impFunc->boxLayoutChanged(a_newBoxLayout,a_dx);
00103 }
00104
00105 protected:
00106
00107
00108
00109
00110 TransformIF(const BaseIF& a_impFunc,
00111 const Real a_transform[SpaceDim+1][SpaceDim+1],
00112 const Real a_invTransform[SpaceDim+1][SpaceDim+1]);
00113
00114
00115 Real m_transform[SpaceDim+1][SpaceDim+1];
00116
00117
00118 Real m_invTransform[SpaceDim+1][SpaceDim+1];
00119
00120 BaseIF* m_impFunc;
00121
00122 void vectorMultiply(RealVect& m_outPoint,
00123 const Real m_intrans[SpaceDim+1][SpaceDim+1],
00124 const RealVect& m_inPoint) const;
00125
00126 void vectorMultiply(IndexTM<Real,GLOBALDIM>& m_outPoint,
00127 const Real m_intrans[SpaceDim+1][SpaceDim+1],
00128 const IndexTM<Real,GLOBALDIM>& m_inPoint) const;
00129
00130 void matrixIdentity(Real m_trans[SpaceDim+1][SpaceDim+1]) const;
00131
00132 void matrixMultiply(Real m_outTrans[SpaceDim+1][SpaceDim+1],
00133 const Real m_intrans1[SpaceDim+1][SpaceDim+1],
00134 const Real m_intrans2[SpaceDim+1][SpaceDim+1]) const;
00135
00136 void matrixTranslate(Real m_trans[SpaceDim+1][SpaceDim+1],
00137 const RealVect& m_translate) const;
00138
00139 void matrixScale(Real m_trans[SpaceDim+1][SpaceDim+1],
00140 const RealVect& m_scale) const;
00141
00142 private:
00143 TransformIF()
00144 {
00145 MayDay::Abort("TransformIF uses strong construction");
00146 }
00147
00148 void operator=(const TransformIF& a_inputIF)
00149 {
00150 MayDay::Abort("TransformIF doesn't allow assignment");
00151 }
00152 };
00153
00154 #include "NamespaceFooter.H"
00155 #endif