00001 #ifdef CH_LANG_CC
00002
00003
00004
00005
00006
00007
00008
00009 #endif
00010
00011 #ifndef _COORDINATESYSTEMIMPLEM_H_
00012 #define _COORDINATESYSTEMIMPLEM_H_
00013
00014 #if defined(CH_Darwin) && defined(__GNUC__) && ( __GNUC__ == 3 )
00015
00016 #include <unistd.h>
00017 #define _GLIBCPP_USE_C99 1
00018 #endif
00019
00020 #include <iostream>
00021 #include <iomanip>
00022
00023 #include "NamespaceHeader.H"
00024
00025 template <int dim> CoordinateSystem<dim>::CoordinateSystem()
00026 {
00027 }
00028
00029 template <int dim> CoordinateSystem<dim>::CoordinateSystem(const CoordinateSystem<dim>& a_coordinateSystem)
00030 :m_origin(a_coordinateSystem.m_origin),
00031 m_dx(a_coordinateSystem.m_dx)
00032 {
00033 }
00034
00035
00036 template <int dim> CoordinateSystem<dim>::CoordinateSystem( const RvDim & a_origin,
00037 const RvDim & a_dx)
00038 :m_origin(a_origin),
00039 m_dx(a_dx)
00040 {
00041 }
00042
00043 template <int dim> CoordinateSystem<dim>::CoordinateSystem(const CoordinateSystem<dim+1> & a_hiCoord,
00044 const int & a_idir)
00045 {
00046 CH_TIME("CoordinateSystem::ConstructorReduceInfo");
00047 for (int idir = 0; idir < dim; ++idir)
00048 {
00049 if (idir < a_idir)
00050 {
00051 m_origin[idir] = a_hiCoord.m_origin[idir];
00052 m_dx[idir] = a_hiCoord.m_dx[idir];
00053 }
00054 else
00055 {
00056 m_origin[idir] = a_hiCoord.m_origin[idir + 1];
00057 m_dx[idir] = a_hiCoord.m_dx [idir + 1];
00058 }
00059 }
00060 }
00061
00062
00063 template <int dim> CoordinateSystem<dim>::~CoordinateSystem()
00064 {
00065 }
00066
00067 template <int dim> IndexTM<Real,dim> CoordinateSystem<dim>::convert(const RvDim & a_point,
00068 const CoordinateSystem<dim> & a_system) const
00069 {
00070 RvDim retval;
00071
00072 for (int idir = 0; idir < dim; ++idir)
00073 {
00074
00075
00076
00077
00078
00079
00080 retval[idir] = a_point[idir];
00081
00082 retval[idir] -= a_system.m_origin[idir];
00083 retval[idir] /= a_system.m_dx [idir];
00084 retval[idir] *= m_dx [idir];
00085 retval[idir] += m_origin[idir];
00086 }
00087
00088 return retval;
00089 }
00090
00091 template <int dim> Real CoordinateSystem<dim>::convertDir(const Real & a_coord,
00092 const CoordinateSystem<dim> & a_system,
00093 const int & a_dir) const
00094 {
00095 Real retval;
00096
00097 retval = a_coord;
00098
00099 retval -= a_system.m_origin[a_dir];
00100 retval /= a_system.m_dx [a_dir];
00101 retval *= m_dx [a_dir];
00102 retval += m_origin[a_dir];
00103
00104 return retval;
00105 }
00106
00107 template <int dim> void CoordinateSystem<dim>::print(ostream& a_out) const
00108 {
00109 std::ios::fmtflags origFlags = a_out.flags();
00110 int origWidth = a_out.width();
00111 int origPrecision = a_out.precision();
00112
00113 a_out << "origin = "
00114 << setprecision(16)
00115 << setiosflags(ios::showpoint)
00116 << setiosflags(ios::scientific)
00117 << m_origin << ", ";
00118
00119 a_out << "dx = "
00120 << setprecision(16)
00121 << setiosflags(ios::showpoint)
00122 << setiosflags(ios::scientific)
00123 << m_dx << "\n";
00124
00125 a_out.flags(origFlags);
00126 a_out.width(origWidth);
00127 a_out.precision(origPrecision);
00128 }
00129
00130 template <int dim> ostream& operator<<(ostream & a_out,
00131 const CoordinateSystem<dim> & a_coordinateSystem)
00132 {
00133 a_coordinateSystem.print(a_out);
00134 return a_out;
00135 }
00136
00137
00138 template <int dim> void CoordinateSystem<dim>::operator=(const CoordinateSystem & a_coordinateSystem)
00139 {
00140 m_origin = a_coordinateSystem.m_origin;
00141 m_dx = a_coordinateSystem.m_dx;
00142 }
00143
00144 #include "NamespaceFooter.H"
00145
00146 #endif