00001 #ifndef __INCLUDE_ARRAYS_H
00002 #define __INCLUDE_ARRAYS_H
00003
00004 #include <cstdlib>
00005 #include <cmath>
00006 #include <cstdio>
00007 #include <complex>
00008 #include "random.h"
00009 #include "parametermap.h"
00010 #include "sf.h"
00011 #include "gslmatrix.h"
00012
00013 using namespace std;
00014
00015 class CCHArray{
00016 public:
00017 CCHArray(string arrayparsfilename);
00018 CCHArray(int LMAXset,int NRADIALset,double RADSTEPset);
00019 CCHArray(int LMAXset,int NRADIALset,double RADSTEPset,
00020 bool XSYMset,bool YSYMset,bool ZSYMset);
00021 ~CCHArray();
00022
00023 int GetLMAX();
00024 int GetNRADIAL();
00025 double GetRADSTEP();
00026 void SetLMAX(int LMAXset);
00027 void SetRADSTEP(double RADSTEPset);
00028 bool GetXSYM();
00029 bool GetYSYM();
00030 bool GetZSYM();
00031 void PrintPars();
00032
00033 void ZeroArray();
00034 void ZeroArray(int lx,int ly,int lz);
00035 void ZeroArray(int ir);
00036 void ZeroArray_Partial(int LMAX_Partial);
00037 void ZeroArray_Partial(int LMAX_Partial,int ir);
00038 void ScaleArray(double scalefactor);
00039 void ScaleArray(double scalefactor,int ir);
00040
00041 double GetElement(int lx,int ly,int lz,int ir);
00042 double GetElement(int lx,int ly,int lz,double r);
00043 void SetElement(int lx,int ly,int lz,int ir,double Element);
00044 void SetElement(int lx,int ly,int lz,double r,double Element);
00045 void IncrementElement(int lx,int ly,int lz,int ir,double increment);
00046 void IncrementElement(int lx,int ly,int lz,double r,double increment);
00047
00048 void PrintArrayFixedIR(int ir);
00049 void PrintArrayFixedIR(int LMAXPrint,int ir);
00050 void Print(int lx,int ly,int lz);
00051 void PrintProjections();
00052 void GetProjections(double **A);
00053
00054
00055
00056 void PrintMoments();
00057
00058 double GetBiggest(int ir);
00059
00060
00061
00062 void ReadAX(string dirname);
00063 void WriteAX(string dirname);
00064 void ReadAllA(string dirname);
00065 void WriteAllA(string dirname);
00066 void WriteShort(string filename,int WLMAX);
00067
00068 void IncrementAExpArray(double x,double y,double z,double weight);
00069 void IncrementAExpArrayFromE(double ex,double ey,double ez,
00070 double weight,int ir);
00071 void AltIncrementAExpArrayFromE(double ex,double ey,double ez,
00072 double weight,int ir);
00073 void AltAltIncrementAExpArrayFromE(double ex,double ey,double ez,
00074 double weight,int ir);
00075 void IncrementMArrayFromE(double ex,double ey,double ez,double weight,int ir);
00076 void IncrementAExpArrayFromThetaPhi(double theta,double phi,
00077 double weight,int ir);
00078 void IncrementMArrayFromThetaPhi(double theta,double phi,
00079 double weight,int ir);
00080
00081
00082 double GetMElementFromAExpArray(int lx,int ly,int lz,int ir);
00083
00084
00085 double GetAExpElementFromMArray(int lx,int ly,int lz,int ir);
00086
00087 void FillRemainderX(int ir);
00088 void FillRemainderY(int ir);
00089 void FillRemainderZ(int ir);
00090 void FillRemainderX();
00091 void FillRemainderY();
00092 void FillRemainderZ();
00093
00094
00095
00096
00097 double AExpand(double ex,double ey,double ez,int ir);
00098 double AExpand(double x,double y,double z);
00099 double AExpand(double theta,double phi,int ir);
00100
00101 void Detrace(int ir);
00102 void Detrace();
00103
00104 void Randomize(double mag,int ir);
00105 void RandomizeA(double mag,int ir);
00106 void Randomize(double mag);
00107 void RandomizeA(double mag);
00108 void RandomizeA_Gaussian(double mag,int ir);
00109 void RandomizeA_Gaussian(double mag);
00110
00111 static CCHCalc *chcalc;
00112
00113 private:
00114 static CRandom *randy;
00115 bool XSYM,YSYM,ZSYM;
00116 double RADSTEP;
00117 int NRADIAL;
00118 int LMAX;
00119 double ****A;
00120 int dlx,dly,dlz;
00121 void CreateArray();
00122 void RandomInit(int iseed);
00123
00124 };
00125
00126 class C3DArray{
00127 public:
00128 C3DArray(string arrayparsfilename);
00129 C3DArray(int NXYZMAX,double DELXYZ,bool XSYM,bool YSYM,bool ZSYM);
00130 C3DArray(int NXMAX,double DELX,int NYMAX,double DELY,int NZMAX,double DELZ,
00131 bool XSYM,bool YSYM,bool ZSYM);
00132 ~C3DArray();
00133
00134 int GetNXMAX();
00135 int GetNYMAX();
00136 int GetNZMAX();
00137 double GetDELX();
00138 double GetDELY();
00139 double GetDELZ();
00140 bool GetXSYM();
00141 bool GetYSYM();
00142 bool GetZSYM();
00143 void PrintPars();
00144
00145
00146 double GetElement(double x,double y,double z);
00147 double GetElement_NoInterpolation(double x,double y,double z);
00148 double GetElement(int isx,int ix,int isy,int iy,int isz,int iz);
00149 void SetElement(int isx,int ix,int isy,int iy,int isz,int iz,double value);
00150 void IncrementElement(int isx,int ix,int isy,int iy,int isz,int iz,
00151 double value);
00152 void SetElement(double x,double y,double z,double value);
00153 void IncrementElement(double x,double y,double z,double increment);
00154 void CalcMoments(double roff[3],double r2[3][3]);
00155 void PrintMoments();
00156
00157 void ZeroArray();
00158 void MakeConstant(double c);
00159 void ScaleArray(double scalefactor);
00160
00161 void Randomize(double c);
00162 void RandomizeGaussian(double c);
00163
00164 void PrintArray();
00165 void PrintProjections();
00166 double GetBiggest();
00167
00168 void ReadArray(string dirname);
00169 void WriteArray(string dirname);
00170
00171 private:
00172 bool XSYM,YSYM,ZSYM;
00173 double DELX,DELY,DELZ;
00174 int NXMAX,NYMAX,NZMAX;
00175 double ******F;
00176 void ReadPars(string arrayparsfilename);
00177 void CreateArray();
00178 void DeleteArray();
00179 static CRandom *randy;
00180 };
00181
00182 class CYlmArray{
00183 public:
00184 CYlmArray(int LMAXset,int NRADIALset);
00185 ~CYlmArray();
00186 int GetLMAX();
00187 complex<double> GetElement(int L,int M,int ir);
00188 void SetElement(int L,int M,int ir,complex<double>);
00189 void IncrementElement(int L,int M,int ir,complex<double> increment);
00190 void ScaleArray(double scalefactor);
00191 void ScaleArray(double scalefactor,int ir);
00192 void ZeroArray();
00193 void ZeroArray(int ir);
00194 void PrintArrayFixedIR(int ir);
00195 void PrintArrayFixedIR(int LMAXPrint,int ir);
00196 private:
00197 int NRADIAL;
00198 int LMAX;
00199 complex<double> ***ylm;
00200 };
00201
00202 class CMCList{
00203 public:
00204 CMCList(int nmcset);
00205 ~CMCList();
00206 void Resize(int nmcset);
00207 int GetNMC();
00208 void SetR(int imc,double t,double x,double y,double z);
00209 void SetR(int imc,double *r1);
00210 void SetNorm(double normset);
00211 double GetNorm();
00212 double *GetR(int imc);
00213 private:
00214 int nmc;
00215 double norm;
00216 double **r;
00217 };
00218
00219 namespace ArrayCalc{
00220
00221 void CalcMArrayFromAExpArray(CCHArray *A,CCHArray *M);
00222 void CalcMArrayFromAExpArray(CCHArray *A,int ira,CCHArray *M,int irm);
00223 void CalcAExpArrayFromMArray(CCHArray *M,CCHArray *A);
00224 void CalcAExpArrayFromMArray(CCHArray *M,int irm,CCHArray *A,int ira);
00225
00226 void AddArrays(CCHArray *A,CCHArray *B,CCHArray *C);
00227 void SubtractArrays(CCHArray *A,CCHArray *B,CCHArray *C);
00228 void AddArrays(CCHArray *A,int ira,CCHArray *B,int irb,CCHArray *C,int irc);
00229 void SubtractArrays(CCHArray *A,int ira,CCHArray *B,int irb,CCHArray *C,int irc);
00230
00231 void DivideArrays(CCHArray *A,CCHArray *B,CCHArray *C);
00232 void DivideArrays(CCHArray *A,int ira,CCHArray *B,int irb,
00233 CCHArray *C,int irc);
00234
00235 void MultiplyArrays(CCHArray *A,CCHArray *B,CCHArray *C);
00236 void MultiplyArrays(CCHArray *A,int ira,CCHArray *B,
00237 int irb,CCHArray *C,int irc);
00238
00239
00240 void MultiplyArrays_Partial(int LMAXA,CCHArray *A,int ira,
00241 int LMAXB,CCHArray *B,int irb,
00242 int LMAXC,CCHArray *C,int irc);
00243
00244 void CopyArray(CCHArray *A,CCHArray *B);
00245 void CopyArray(CCHArray *A,int ira,CCHArray *B,int irb);
00246
00247 void CalcYlmExpArrayFromAExpArray(CCHArray *A,int ir,
00248 CYlmArray *YlmArray,int irlm);
00249 void CalcAExpArrayFromYlmExpArray(CYlmArray *YlmArray,int irlm,
00250 CCHArray *A,int ira);
00251
00252
00253
00254
00255
00256 void Detrace(CCHArray *M,CCHArray *A);
00257 void Detrace(CCHArray *M,int irm,CCHArray *A,int ira);
00258
00259
00260 void CalcAExpArrayFromXExpArray(CCHArray *X,CCHArray *A);
00261 void CalcAExpArrayFromXExpArray(CCHArray *X,int irx,CCHArray *A,int ira);
00262 void CalcXExpArrayFromAExpArray(CCHArray *A,CCHArray *X);
00263 void CalcXExpArrayFromAExpArray(CCHArray *A,int ira,CCHArray *X,int irx);
00264
00265
00266 void CalcAExpArrayFrom3DArray(C3DArray *threedarray,CCHArray *A);
00267 void Calc3DArrayFromAExpArray(CCHArray *A,C3DArray *threed);
00268
00269 void MultiplyArrays(C3DArray *A,C3DArray *B,C3DArray *C);
00270 void DivideArrays(C3DArray *A,C3DArray *B,C3DArray *C);
00271 void AddArrays(C3DArray *A,C3DArray *B,C3DArray *C);
00272 void SubtractArrays(C3DArray *A,C3DArray *B,C3DArray *C);
00273 void CopyArray(C3DArray *A,C3DArray *B);
00274
00275 void InvertArray(C3DArray *A,C3DArray *B);
00276 void InvertArray(CCHArray *A,int ira,CCHArray *B,int irb);
00277 void InvertArray(CCHArray *A,CCHArray *B);
00278
00279
00280
00281
00282 bool CompareArrayParameters(C3DArray *threed,CCHArray *A);
00283 bool CompareArrayParameters(CCHArray *A,C3DArray *threed);
00284 bool CompareArrayParameters(CCHArray *A,CCHArray *B);
00285 bool CompareArrayParameters(C3DArray *threeda,C3DArray *threedb);
00286 };
00287
00288 #endif
00289