00001 #ifdef CH_LANG_CC
00002
00003
00004
00005
00006
00007
00008
00009 #endif
00010
00011 #ifndef _FACTORIAL_H_
00012 #define _FACTORIAL_H_
00013
00014 #include "MayDay.H"
00015 #include "RealVect.H"
00016 #include "IndexTM.H"
00017 #include "NamespaceHeader.H"
00018
00019
00020
00021
00022
00023
00024
00025 inline Real factorial(const int n)
00026 {
00027 CH_assert(n >= 0);
00028 Real nfact = 1.0;
00029 for (int i = 2; i <= n; nfact*= i, i++);
00030 return nfact;
00031 }
00032
00033 inline Real POW(const Real& a_x, const int& a_p)
00034 {
00035 Real retval = 1;
00036 for(int iexp = 0; iexp < Abs(a_p); iexp++)
00037 {
00038 if(a_p >= 0)
00039 {
00040 retval *= a_x;
00041 }
00042 else
00043 {
00044 retval /= a_x;
00045 }
00046 }
00047 return retval;
00048 }
00049
00050
00051 inline Real nCk(const int n, const int k)
00052 {
00053 CH_assert((n >= k)&&(k >= 0)&&(n >= 0));
00054 Real nck = 1.0;
00055 for (int i = n-k+1; i <= n; nck*= i, i++);
00056 return nck / factorial(k);
00057 }
00058
00059
00060 template <int Dim>
00061 inline Real pfactorial(const IndexTM<int, Dim> p)
00062 {
00063 Real pfact = 1;
00064 for(int idir = 0; idir < Dim; idir++)
00065 {
00066 CH_assert(p[idir] >= 0);
00067 pfact *= factorial(p[idir]);
00068 }
00069 return pfact;
00070 }
00071
00072
00073 template <int Dim>
00074 inline Real pCk(const IndexTM<int, Dim>& p, const IndexTM<int, Dim>& k)
00075 {
00076
00077
00078 Real pfact = 1;
00079 for(int idir = 0; idir < Dim; idir++)
00080 {
00081 pfact *= nCk(p[idir],k[idir]);
00082 }
00083 return pfact;
00084 }
00085
00086
00087
00088 template <int Dim>
00089 inline Real power(const IndexTM<Real, Dim>& a_x, const IndexTM<int, Dim>& a_p)
00090 {
00091 Real retval = 1;
00092 for(int idir = 0; idir < Dim; idir++)
00093 {
00094 if((a_p[idir] >= 0))
00095 {
00096 for(int ipow = 0; ipow < a_p[idir]; ipow++)
00097 {
00098 retval *= a_x[idir];
00099 }
00100 }
00101 else
00102 {
00103 for(int ipow = 0; ipow < a_p[idir]; ipow++)
00104 {
00105 retval /= a_x[idir];
00106 }
00107 }
00108 }
00109 return retval;
00110 }
00111
00112
00113 #include "NamespaceFooter.H"
00114 #endif