00001 #ifndef __INCLUDE_3D_CC
00002 #define __INCLUDE_3D_CC
00003 #include "arrays.h"
00004
00005 using namespace std;
00006
00007 CRandom *C3DArray::randy=NULL;
00008
00009 C3DArray::C3DArray(string arrayparsfilename){
00010
00011 NXMAX=NYMAX=NZMAX=20;
00012 DELX=DELY=DELZ=1.0;
00013 XSYM=YSYM=ZSYM=true;
00014 ReadPars(arrayparsfilename);
00015 CreateArray();
00016 }
00017
00018 void C3DArray::ReadPars(string arrayparsfilename){
00019 parameterMap apars;
00020 parameter::ReadParsFromFile(apars,arrayparsfilename);
00021
00022 if(parameter::getB(apars,"IDENTICAL",true)){
00023 parameter::set(apars,"XSYM",true);
00024 parameter::set(apars,"YSYM",true);
00025 parameter::set(apars,"ZSYM",true);
00026 }
00027 if(parameter::getD(apars,"DELXYZ",0) > 1.0E-10){
00028 DELX=DELY=DELZ=parameter::getD(apars,"DELXYZ",0);
00029 }
00030
00031 NXMAX=parameter::getI(apars,"NXMAX",NXMAX);
00032 NYMAX=parameter::getI(apars,"NYMAX",NYMAX);
00033 NZMAX=parameter::getI(apars,"NZMAX",NZMAX);
00034 DELX=parameter::getD(apars,"DELX",DELX);
00035 DELY=parameter::getD(apars,"DELY",DELY);
00036 DELZ=parameter::getD(apars,"DELZ",DELZ);
00037 XSYM=bool(parameter::getB(apars,"XSYM",XSYM));
00038 YSYM=bool(parameter::getB(apars,"YSYM",YSYM));
00039 ZSYM=bool(parameter::getB(apars,"ZSYM",ZSYM));
00040 if(parameter::getI(apars,"NXYZMAX",0) != 0){
00041 NXMAX=NYMAX=NZMAX=parameter::getI(apars,"NXYZMAX",0);
00042 }
00043 }
00044
00045 C3DArray::C3DArray(int NXMAXset,double DELXset,int NYMAXset,double DELYset,
00046 int NZMAXset,double DELZset,bool XSYMset,bool YSYMset,bool ZSYMset){
00047 XSYM=XSYMset;
00048 YSYM=YSYMset;
00049 ZSYM=ZSYMset;
00050 NXMAX=NXMAXset;
00051 NYMAX=NYMAXset;
00052 NZMAX=NZMAXset;
00053 DELX=DELXset;
00054 DELY=DELYset;
00055 DELZ=DELZset;
00056
00057 CreateArray();
00058 }
00059
00060 C3DArray::C3DArray(int NXYZMAXset,double DELXYZset,bool XSYMset,bool YSYMset,bool ZSYMset){
00061 XSYM=XSYMset;
00062 YSYM=YSYMset;
00063 ZSYM=ZSYMset;
00064 NXMAX=NXYZMAXset;
00065 NYMAX=NXYZMAXset;
00066 NZMAX=NXYZMAXset;
00067 DELX=DELXYZset;
00068 DELY=DELXYZset;
00069 DELZ=DELXYZset;
00070
00071 CreateArray();
00072 }
00073
00074 void C3DArray::CreateArray(){
00075 int ix,iy,iz,isx,isy,isz;
00076 int nsx,nsy,nsz;
00077 nsx=nsy=nsz=2;
00078 if(XSYM) nsx=1;
00079 if(YSYM) nsy=1;
00080 if(ZSYM) nsz=1;
00081 F=new double *****[nsx];
00082 for(isx=0;isx<nsx;isx++){
00083 F[isx]=new double ****[NXMAX];
00084 for(ix=0;ix<NXMAX;ix++){
00085 F[isx][ix]=new double ***[nsy];
00086 for(isy=0;isy<nsy;isy++){
00087 F[isx][ix][isy]=new double **[NYMAX];
00088 for(iy=0;iy<NYMAX;iy++){
00089 F[isx][ix][isy][iy]=new double *[nsz];
00090 for(isz=0;isz<nsz;isz++){
00091 F[isx][ix][isy][iy][isz]=new double[NZMAX];
00092 for(iz=0;iz<NZMAX;iz++) F[isx][ix][isy][iy][isz][iz]=0.0;
00093 }
00094 }
00095 }
00096 }
00097 }
00098 }
00099
00100 C3DArray::~C3DArray(){
00101 DeleteArray();
00102 }
00103
00104 void C3DArray::DeleteArray(){
00105 int isx,isy,isz,ix,iy,nsx,nsy,nsz;
00106 nsx=nsy=nsz=1;
00107 if(!XSYM) nsx=2;
00108 if(!YSYM) nsy=2;
00109 if(!ZSYM) nsz=2;
00110 for(isx=0;isx<nsx;isx++){
00111 for(ix=0;ix<NXMAX;ix++){
00112 for(isy=0;isy<nsy;isy++){
00113 for(iy=0;iy<NYMAX;iy++){
00114 for(isz=0;isz<nsz;isz++){
00115 delete [] F[isx][ix][isy][iy][isz];
00116 }
00117 delete [] F[isx][ix][isy][iy];
00118 }
00119 delete [] F[isx][ix][isy];
00120 }
00121 delete [] F[isx][ix];
00122 }
00123 delete [] F[isx];
00124 }
00125 delete [] F;
00126 }
00127
00128 bool C3DArray::GetXSYM(){
00129 return XSYM;
00130 }
00131
00132 bool C3DArray::GetYSYM(){
00133 return YSYM;
00134 }
00135
00136 bool C3DArray::GetZSYM(){
00137 return ZSYM;
00138 }
00139
00140 void C3DArray::ZeroArray(){
00141 int ix,iy,iz,isx,isy,isz,nsx,nsy,nsz;
00142 nsx=nsy=nsz=2;
00143 if(XSYM) nsx=1;
00144 if(YSYM) nsy=1;
00145 if(ZSYM) nsz=1;
00146 for(isx=0;isx<nsx;isx++){
00147 for(ix=0;ix<NXMAX;ix++){
00148 for(isy=0;isy<nsy;isy++){
00149 for(iy=0;iy<NYMAX;iy++){
00150 for(isz=0;isz<nsz;isz++){
00151 for(iz=0;iz<NZMAX;iz++){
00152 F[isx][ix][isy][iy][isz][iz]=0.0;
00153 }
00154 }
00155 }
00156 }
00157 }
00158 }
00159 }
00160
00161 void C3DArray::ScaleArray(double scalefactor){
00162 int ix,iy,iz,isx,isy,isz,nsx,nsy,nsz;
00163 nsx=nsy=nsz=2;
00164 if(XSYM) nsx=1;
00165 if(YSYM) nsy=1;
00166 if(ZSYM) nsz=1;
00167 for(isx=0;isx<nsx;isx++){
00168 for(ix=0;ix<NXMAX;ix++){
00169 for(isy=0;isy<nsy;isy++){
00170 for(iy=0;iy<NYMAX;iy++){
00171 for(isz=0;isz<nsz;isz++){
00172 for(iz=0;iz<NZMAX;iz++)
00173 F[isx][ix][isy][iy][isz][iz]*=scalefactor;
00174 }
00175 }
00176 }
00177 }
00178 }
00179 }
00180
00181 double C3DArray::GetElement(int isx,int ix,int isy,int iy,int isz,int iz){
00182 return F[isx][ix][isy][iy][isz][iz];
00183 }
00184
00185 void C3DArray::SetElement(int isx,int ix,int isy,int iy,int isz,int iz,double value){
00186 F[isx][ix][isy][iy][isz][iz]=value;
00187 }
00188
00189 void C3DArray::IncrementElement(int isx,int ix,int isy,int iy,int isz,int iz,double value){
00190 F[isx][ix][isy][iy][isz][iz]+=value;
00191 }
00192
00193 double C3DArray::GetElement_NoInterpolation(double x,double y,double z){
00194 int ix,iy,iz,isx,isy,isz;
00195 double answer;
00196 answer=0.0;
00197 ix=int(floor(fabs(x)/DELX));
00198 if(ix<NXMAX){
00199 iy=int(floor(fabs(y)/DELY));
00200 if(iy<NYMAX){
00201 iz=int(floor(fabs(z)/DELY));
00202 if(iz<NZMAX){
00203 isx=isy=isz=0;
00204 if(!XSYM && x<-1.0E-10) isx=1;
00205 if(!YSYM && y<-1.0E-10) isy=1;
00206 if(!ZSYM && z<-1.0E-10) isz=1;
00207 answer=F[isx][ix][isy][iy][isz][iz];
00208 }
00209 }
00210 }
00211 return answer;
00212 }
00213
00214 double C3DArray::GetElement(double x,double y,double z){
00215 int ixa,ixb,iya,iyb,iza,izb,isxa,isxb,isya,isyb,isza,iszb;
00216 double fx,fy,fz,interpolate;
00217 ixb=int(floor(0.5+fabs(x)/DELX));
00218 iyb=int(floor(0.5+fabs(y)/DELY));
00219 izb=int(floor(0.5+fabs(z)/DELZ));
00220 ixa=ixb-1;
00221 iya=iyb-1;
00222 iza=izb-1;
00223 isxb=isyb=iszb=0;
00224 if(x<1.0E-10 && !XSYM) isxb=1;
00225 if(y<1.0E-10 && !YSYM) isyb=1;
00226 if(z<1.0E-10 && !ZSYM) iszb=1;
00227 isxa=isxb;
00228 isya=isyb;
00229 isza=iszb;
00230
00231 if(ixa<0){
00232 ixa=0;
00233 if(!XSYM){
00234 if(isxb==1) isxa=0;
00235 if(isxb==0) isxa=1;
00236 }
00237 }
00238 if(iya<0){
00239 iya=0;
00240 if(!YSYM){
00241 if(isyb==1) isya=0;
00242 if(isyb==0) isya=1;
00243 }
00244 }
00245 if(iza<0){
00246 iza=0;
00247 if(!ZSYM){
00248 if(iszb==1) isza=0;
00249 if(iszb==0) isza=1;
00250 }
00251 }
00252
00253 fx=((0.5+ixb)*DELX-fabs(x))/DELX;
00254 fy=((0.5+iyb)*DELY-fabs(y))/DELY;
00255 fz=((0.5+izb)*DELZ-fabs(z))/DELZ;
00256
00257 if(ixb==NXMAX) ixb=ixa;
00258 if(iyb==NYMAX) iyb=iya;
00259 if(izb==NZMAX) izb=iza;
00260
00261 interpolate=(1.0-fx)*(1.0-fy)*(1.0-fz)
00262 *GetElement(isxb,ixb,isyb,iyb,iszb,izb);
00263 interpolate+=fx*(1.0-fy)*(1.0-fz)
00264 *GetElement(isxa,ixa,isyb,iyb,iszb,izb);
00265 interpolate+=(1.0-fx)*fy*(1.0-fz)
00266 *GetElement(isxb,ixb,isya,iya,iszb,izb);
00267 interpolate+=(1.0-fx)*(1.0-fy)*fz
00268 *GetElement(isxb,ixb,isyb,iyb,isza,iza);
00269 interpolate+=fx*fy*(1.0-fz)
00270 *GetElement(isxa,ixa,isya,iya,iszb,izb);
00271 interpolate+=fx*(1.0-fy)*fz
00272 *GetElement(isxa,ixa,isyb,iyb,isza,iza);
00273 interpolate+=(1.0-fx)*fy*fz
00274 *GetElement(isxb,ixb,isya,iya,isza,iza);
00275 interpolate+=fx*fy*fz
00276 *GetElement(isxa,ixa,isya,iya,isza,iza);
00277 return interpolate;
00278 }
00279
00280 void C3DArray::SetElement(double x,double y,double z,double value){
00281 int ix,iy,iz,isx,isy,isz;
00282 ix=int(floor(fabs(x)/DELX));
00283 if(ix<NXMAX){
00284 iy=int(floor(fabs(y)/DELY));
00285 if(iy<NYMAX){
00286 iz=int(floor(fabs(z)/DELY));
00287 if(iz<NZMAX){
00288 isx=isy=isz=0;
00289 if(XSYM && x<-1.0E-15) isx=1;
00290 if(YSYM && y<-1.0E-15) isy=1;
00291 if(ZSYM && z<-1.0E-15) isz=1;
00292 F[isx][ix][isy][iy][isz][iz]=value;
00293 }
00294 }
00295 }
00296 }
00297
00298 void C3DArray::IncrementElement(double x,double y,double z,double value){
00299 int ix,iy,iz,isx,isy,isz;
00300 ix=int(floor(fabs(x)/DELX));
00301 if(ix<NXMAX){
00302 iy=int(floor(fabs(y)/DELY));
00303 if(iy<NYMAX){
00304 iz=int(floor(fabs(z)/DELY));
00305 if(iz<NZMAX){
00306 isx=isy=isz=0;
00307 if(XSYM && x<-1.0E-15) isx=1;
00308 if(YSYM && y<-1.0E-15) isy=1;
00309 if(ZSYM && z<-1.0E-15) isz=1;
00310 F[isx][ix][isy][iy][isz][iz]+=value;
00311 }
00312 }
00313 }
00314 }
00315
00316 int C3DArray::GetNXMAX(){
00317 return NXMAX;
00318 }
00319
00320 int C3DArray::GetNYMAX(){
00321 return NYMAX;
00322 }
00323
00324 int C3DArray::GetNZMAX(){
00325 return NZMAX;
00326 }
00327
00328 double C3DArray::GetDELX(){
00329 return DELX;
00330 }
00331
00332 double C3DArray::GetDELY(){
00333 return DELY;
00334 }
00335
00336 double C3DArray::GetDELZ(){
00337 return DELZ;
00338 }
00339
00340 void C3DArray::PrintPars(){
00341 printf("_______ 3DArray Pars ________\n");
00342 printf("XYZSYM=(%d,%d,%d)\n",XSYM,YSYM,ZSYM);
00343 printf("NXYZMAX=(%d,%d,%d)\n",NXMAX,NYMAX,NZMAX);
00344 printf("DELXYZ=(%g,%g,%g)\n",DELX,DELY,DELZ);
00345 printf("_____________________________\n");
00346 }
00347
00348 void C3DArray::WriteArray(string dirname){
00349 int isx,isy,isz,nsx,nsy,nsz,ix,iy,iz;
00350 FILE *fptr;
00351 char shellcommand[120];
00352
00353 sprintf(shellcommand,"mkdir -p %s",dirname.c_str());
00354 system(shellcommand);
00355 sprintf(shellcommand,"rm -f %s/*.tmp",dirname.c_str());
00356 system(shellcommand);
00357
00358 char filename[160];
00359 sprintf(filename,"%s/3Darraypars.dat",dirname.c_str());
00360 fptr=fopen(filename,"w");
00361 fprintf(fptr,"bool XSYM %d\n",XSYM);
00362 fprintf(fptr,"bool YSYM %d\n",YSYM);
00363 fprintf(fptr,"bool ZSYM %d\n",ZSYM);
00364 fprintf(fptr,"int NXMAX %d\n",NXMAX);
00365 fprintf(fptr,"int NYMAX %d\n",NYMAX);
00366 fprintf(fptr,"int NZMAX %d\n",NZMAX);
00367 fprintf(fptr,"double DELX %g\n",DELX);
00368 fprintf(fptr,"double DELY %g\n",DELY);
00369 fprintf(fptr,"double DELZ %g\n",DELZ);
00370 fclose(fptr);
00371 nsx=nsy=nsz=2;
00372 if(XSYM) nsx=1;
00373 if(YSYM) nsy=1;
00374 if(ZSYM) nsz=1;
00375 for(ix=0;ix<NXMAX;ix++){
00376 for(iy=0;iy<NYMAX;iy++){
00377 sprintf(filename,"%s/ix%d_iy%d.tmp",
00378 dirname.c_str(),ix,iy);
00379 fptr=fopen(filename,"w");
00380 for(iz=0;iz<NZMAX;iz++){
00381 for(isz=0;isz<nsz;isz++){
00382 for(isy=0;isy<nsy;isy++){
00383 for(isx=0;isx<nsx;isx++){
00384 fprintf(fptr,"%17.10e ",F[isx][ix][isy][iy][isz][iz]);
00385 }
00386 }
00387 }
00388 fprintf(fptr,"\n");
00389 }
00390 fclose(fptr);
00391
00392 }
00393 }
00394 }
00395
00396 void C3DArray::ReadArray(string dirname){
00397 int isx,isy,isz,nsx,nsy,nsz,ix,iy,iz;
00398 bool XSYMb,YSYMb,ZSYMb;
00399 int NXMAXb,NYMAXb,NZMAXb;
00400 double DELXb,DELYb,DELZb;
00401 parameterMap apars;
00402 NXMAXb=NXMAX; NYMAXb=NYMAX; NZMAXb=NZMAX;
00403 DELXb=DELX; DELYb=DELY; DELZb=DELZ;
00404 XSYMb=XSYM; YSYMb=YSYM; ZSYMb=ZSYM;
00405 FILE *fptr;
00406 char filename[160];
00407 sprintf(filename,"%s/3Darraypars.dat",dirname.c_str());
00408 ReadPars(filename);
00409 if(NXMAXb!=NXMAX || NYMAXb!=NYMAX|| NZMAXb!=NZMAX
00410 || fabs(DELXb-DELX)>1.0E-10 || fabs(DELYb-DELY)>1.0E-10
00411 || fabs(DELZb-DELZ)>1.0E-10 || XSYMb!=XSYM
00412 || YSYMb!=YSYM || ZSYMb!=ZSYM){
00413 printf("Warning: In ReadArray parameters have changed, new array being created\n");
00414 DeleteArray();
00415 CreateArray();
00416 }
00417 nsx=nsy=nsz=2;
00418 if(XSYM) nsx=1;
00419 if(YSYM) nsy=1;
00420 if(ZSYM) nsz=1;
00421 for(ix=0;ix<NXMAX;ix++){
00422 for(iy=0;iy<NYMAX;iy++){
00423 sprintf(filename,"%s/ix%d_iy%d.tmp",dirname.c_str(),ix,iy);
00424 fptr=fopen(filename,"r");
00425 for(iz=0;iz<NZMAX;iz++){
00426 for(isz=0;isz<nsz;isz++){
00427 for(isy=0;isy<nsy;isy++){
00428 for(isx=0;isx<nsx;isx++){
00429 fscanf(fptr,"%lf ",&F[isx][ix][isy][iy][isz][iz]);
00430 }
00431 }
00432 }
00433 }
00434 fclose(fptr);
00435
00436 }
00437 }
00438 }
00439
00440 double C3DArray::GetBiggest(){
00441 int isx,isy,isz,ix,iy,iz,nsx,nsy,nsz;
00442 double biggest=0.0;
00443 nsx=nsy=nsz=2;
00444 if(XSYM) nsx=1;
00445 if(YSYM) nsy=1;
00446 if(ZSYM) nsz=1;
00447 for(isx=0;isx<nsx;isx++){
00448 for(ix=0;ix<NXMAX;ix++){
00449 for(isy=0;isy<nsy;isy++){
00450 for(iy=0;iy<NYMAX;iy++){
00451 for(iz=0;iz<NZMAX;iz++){
00452 for(isz=0;isz<nsz;isz++){
00453 if(fabs(F[isx][ix][isy][iy][isz][iz])>fabs(biggest))
00454 biggest=F[isx][ix][isy][iy][isz][iz];
00455 }
00456 }
00457 }
00458 }
00459 }
00460 }
00461 return biggest;
00462 }
00463
00464 void C3DArray::Randomize(double c){
00465 int isx,isy,isz,ix,iy,iz,nsx,nsy,nsz;
00466 if(randy==NULL) randy=new CRandom(-1234);
00467 nsx=nsy=nsz=2;
00468 if(XSYM) nsx=1;
00469 if(YSYM) nsy=1;
00470 if(ZSYM) nsz=1;
00471 for(isx=0;isx<nsx;isx++){
00472 for(ix=0;ix<NXMAX;ix++){
00473 for(isy=0;isy<nsy;isy++){
00474 for(iy=0;iy<NYMAX;iy++){
00475 for(iz=0;iz<NZMAX;iz++){
00476 for(isz=0;isz<nsz;isz++){
00477 F[isx][ix][isy][iy][isz][iz]=c*(1.0-2.0*randy->ran());
00478 }
00479 }
00480 }
00481 }
00482 }
00483 }
00484
00485 }
00486
00487 void C3DArray::RandomizeGaussian(double c){
00488 int isx,isy,isz,ix,iy,iz,nsx,nsy,nsz;
00489 if(randy==NULL) randy=new CRandom(-1234);
00490 nsx=nsy=nsz=2;
00491 if(XSYM) nsx=1;
00492 if(YSYM) nsy=1;
00493 if(ZSYM) nsz=1;
00494 for(isx=0;isx<nsx;isx++){
00495 for(ix=0;ix<NXMAX;ix++){
00496 for(isy=0;isy<nsy;isy++){
00497 for(iy=0;iy<NYMAX;iy++){
00498 for(iz=0;iz<NZMAX;iz++){
00499 for(isz=0;isz<nsz;isz++){
00500 F[isx][ix][isy][iy][isz][iz]=c*randy->gauss();
00501 }
00502 }
00503 }
00504 }
00505 }
00506 }
00507
00508 }
00509
00510 void C3DArray::MakeConstant(double c){
00511 int isx,isy,isz,ix,iy,iz,nsx,nsy,nsz;
00512 nsx=nsy=nsz=2;
00513 if(XSYM) nsx=1;
00514 if(YSYM) nsy=1;
00515 if(ZSYM) nsz=1;
00516 for(isx=0;isx<nsx;isx++){
00517 for(ix=0;ix<NXMAX;ix++){
00518 for(isy=0;isy<nsy;isy++){
00519 for(iy=0;iy<NYMAX;iy++){
00520 for(iz=0;iz<NZMAX;iz++){
00521 for(isz=0;isz<nsz;isz++){
00522 F[isx][ix][isy][iy][isz][iz]=c;
00523 }
00524 }
00525 }
00526 }
00527 }
00528 }
00529 }
00530
00531 void C3DArray::PrintProjections(){
00532 int isx,isy,isz,nsx,nsy,nsz,NMAX,i,nav;
00533 double fbar;
00534 nsx=nsy=nsz=2;
00535 if(XSYM) nsx=1;
00536 if(YSYM) nsy=1;
00537 if(ZSYM) nsz=1;
00538 NMAX=NXMAX;
00539 if(NYMAX>NMAX) NMAX=NXMAX;
00540 if(NZMAX>NMAX) NMAX=NZMAX;
00541 printf("bool XSYM %d ",XSYM);
00542 printf("bool YSYM %d ",YSYM);
00543 printf("bool ZSYM %d\n",ZSYM);
00544 printf("int NXMAX %d ",NXMAX);
00545 printf("int NYMAX %d ",NYMAX);
00546 printf("int NZMAX %d\n",NZMAX);
00547 printf("double DELX %g ",DELX);
00548 printf("double DELY %g ",DELY);
00549 printf("double DELZ %g\n",DELZ);
00550 for(i=0;i<NMAX;i++){
00551 printf("%3d | ",i);
00552 for(isx=0;isx<nsx;isx++){
00553 fbar=0.0;
00554 if(i<NXMAX){
00555 nav=0;
00556 for(isy=0;isy<nsy;isy++){
00557 for(isz=0;isz<nsz;isz++){
00558 nav+=1;
00559 fbar+=F[isx][i][isy][0][isz][0];
00560 }
00561 }
00562 fbar=fbar/double(nav);
00563 }
00564 printf("%9.3e ",fbar);
00565 }
00566 printf("| ");
00567 for(isy=0;isy<nsy;isy++){
00568 fbar=0.0;
00569 if(i<NYMAX){
00570 nav=0;
00571 for(isx=0;isx<nsx;isx++){
00572 for(isz=0;isz<nsz;isz++){
00573 nav+=1;
00574 fbar+=F[isx][0][isy][i][isz][0];
00575 }
00576 }
00577 fbar=fbar/double(nav);
00578 }
00579 printf("%9.3e ",fbar);
00580 }
00581 printf("| ");
00582 for(isz=0;isz<nsz;isz++){
00583 fbar=0.0;
00584 if(i<NZMAX){
00585 nav=0;
00586 for(isy=0;isy<nsy;isy++){
00587 for(isx=0;isx<nsx;isx++){
00588 nav+=1;
00589 fbar+=F[isx][0][isy][0][isz][i];
00590 }
00591 }
00592 fbar=fbar/double(nav);
00593 }
00594 printf("%9.3e ",fbar);
00595 }
00596 printf("\n");
00597 }
00598 }
00599
00600 void C3DArray::CalcMoments(double roff[3],double r2[3][3]){
00601 int ix,iy,iz,isx,isy,isz,nsx,nsy,nsz;
00602 double norm;
00603 int i,j;
00604 double r[3];
00605 nsx=nsy=nsz=2;
00606 if(XSYM) nsx=1;
00607 if(YSYM) nsy=1;
00608 if(ZSYM) nsz=1;
00609 for(i=0;i<3;i++){
00610 roff[i]=0.0;
00611 for(j=0;j<3;j++) r2[i][j]=0.0;
00612 }
00613 norm=0.0;
00614 for(isx=0;isx<nsx;isx++){
00615 for(ix=0;ix<NXMAX;ix++){
00616 r[0]=(ix+0.5)*DELX;
00617 if(isx==1) r[0]=-r[0];
00618 for(isy=0;isy<nsy;isy++){
00619 for(iy=0;iy<NYMAX;iy++){
00620 r[1]=(iy+0.5)*DELY;
00621 if(isy==1) r[1]=-r[1];
00622 for(isz=0;isz<nsz;isz++){
00623 for(iz=0;iz<NZMAX;iz++){
00624 r[2]=(iz+0.5)*DELZ;
00625 if(isz==0) r[3]=-r[3];
00626 norm+=F[isx][ix][isy][iy][isz][iz];
00627 for(i=0;i<3;i++){
00628 roff[i]+=r[i]*F[isx][ix][isy][iy][isz][iz];
00629 for(j=i;j<3;j++) r2[i][j]+=r[i]*r[j]*F[isx][ix][isy][iy][isz][iz];
00630 }
00631 }
00632 }
00633 }
00634 }
00635 }
00636 }
00637 if(XSYM) roff[0]=r2[0][1]=r2[0][2]=0.0;
00638 if(YSYM) roff[1]=r2[0][1]=r2[1][2]=0.0;
00639 if(ZSYM) roff[2]=r2[0][2]=r2[1][2]=0.0;
00640
00641 for(i=0;i<3;i++){
00642 roff[i]=roff[i]/norm;
00643
00644 for(j=0;j<i;j++) r2[i][j]=r2[j][i];
00645 }
00646 printf("\n<r_ir_j>:\n");
00647 for(i=0;i<3;i++){
00648 for(j=0;j<3;j++){
00649 r2[i][j]=r2[i][j]/norm;
00650 r2[i][j]=r2[i][j]-roff[i]*roff[j];
00651
00652 }
00653
00654 }
00655
00656 }
00657
00658 void C3DArray::PrintMoments(){
00659 double roff[3],r2[3][3];
00660 int ix,iy,iz,isx,isy,isz,nsx,nsy,nsz;
00661 double norm;
00662 int i,j;
00663 double r[3];
00664 nsx=nsy=nsz=2;
00665 if(XSYM) nsx=1;
00666 if(YSYM) nsy=1;
00667 if(ZSYM) nsz=1;
00668 for(i=0;i<3;i++){
00669 roff[i]=0.0;
00670 for(j=0;j<3;j++) r2[i][j]=0.0;
00671 }
00672 norm=0.0;
00673 for(isx=0;isx<nsx;isx++){
00674 for(ix=0;ix<NXMAX;ix++){
00675 r[0]=(ix+0.5)*DELX;
00676 if(isx==1) r[0]=-r[0];
00677 for(isy=0;isy<nsy;isy++){
00678 for(iy=0;iy<NYMAX;iy++){
00679 r[1]=(iy+0.5)*DELY;
00680 if(isy==1) r[1]=-r[1];
00681 for(isz=0;isz<nsz;isz++){
00682 for(iz=0;iz<NZMAX;iz++){
00683 r[2]=(iz+0.5)*DELZ;
00684 if(isz==0) r[3]=-r[3];
00685 norm+=F[isx][ix][isy][iy][isz][iz];
00686 for(i=0;i<3;i++){
00687 roff[i]+=r[i]*F[isx][ix][isy][iy][isz][iz];
00688 for(j=i;j<3;j++) r2[i][j]+=r[i]*r[j]*F[isx][ix][isy][iy][isz][iz];
00689 }
00690 }
00691 }
00692 }
00693 }
00694 }
00695 }
00696 if(XSYM) roff[0]=r2[0][1]=r2[0][2]=0.0;
00697 if(YSYM) roff[1]=r2[0][1]=r2[1][2]=0.0;
00698 if(ZSYM) roff[2]=r2[0][2]=r2[1][2]=0.0;
00699 printf("Offsets: ");
00700 for(i=0;i<3;i++){
00701 roff[i]=roff[i]/norm;
00702 printf("%11.3e ",roff[i]);
00703 for(j=0;j<i;j++) r2[i][j]=r2[j][i];
00704 }
00705 printf("\n<r_ir_j>:\n");
00706 for(i=0;i<3;i++){
00707 for(j=0;j<3;j++){
00708 r2[i][j]=r2[i][j]/norm;
00709 r2[i][j]=r2[i][j]-roff[i]*roff[j];
00710 printf("%11.3e ",r2[i][j]);
00711 }
00712 printf("\n");
00713 }
00714 printf("xyz_rms = (%g,%g,%g)\n",sqrt(r2[0][0]),sqrt(r2[1][1]),sqrt(r2[2][2]));
00715 }
00716 #endif