[a0bcf1] | 1 | /** \file riemann.c
|
---|
| 2 | * RiemannTensor-transformations.
|
---|
| 3 | *
|
---|
| 4 | * This is all still not really working, thus so far untouched.
|
---|
| 5 | *
|
---|
| 6 | Project: ParallelCarParrinello
|
---|
| 7 | \author Jan Hamaekers
|
---|
| 8 | \date 2000
|
---|
| 9 |
|
---|
| 10 | File: riemann.c
|
---|
| 11 | $Id: riemann.c,v 1.8 2006/03/30 22:19:52 foo Exp $
|
---|
| 12 | */
|
---|
| 13 |
|
---|
| 14 | #include <stdlib.h>
|
---|
| 15 | #include <stdio.h>
|
---|
| 16 | #include <stddef.h>
|
---|
| 17 | #include <math.h>
|
---|
| 18 | #include <string.h>
|
---|
| 19 |
|
---|
| 20 | #include"data.h"
|
---|
| 21 | #include"errors.h"
|
---|
| 22 | #include"helpers.h"
|
---|
| 23 | #include"mymath.h"
|
---|
| 24 | #include"riemann.h"
|
---|
| 25 | #include"myfft.h"
|
---|
| 26 |
|
---|
| 27 | static void RiemannRTransformPosNFRto0(const struct RiemannTensor *RT, fftw_real *source, fftw_real *dest, const int NF)
|
---|
| 28 | {
|
---|
| 29 | struct LatticeLevel *Lev = RT->LevR;
|
---|
| 30 | int es = Lev->NUp0[2]*NF;
|
---|
| 31 | unsigned int cpyes = sizeof(fftw_real)*es;
|
---|
| 32 | int nx=Lev->Plan0.plan->local_nx,ny=Lev->N[1],nz=Lev->N[2],Nx=Lev->NUp0[0],Ny=Lev->NUp0[1];
|
---|
| 33 | int lx,ly,z,Lx,Ly;
|
---|
| 34 | for(lx=0; lx < nx; lx++)
|
---|
| 35 | for(Lx=0; Lx < Nx; Lx++)
|
---|
| 36 | for(ly=0; ly < ny; ly++)
|
---|
| 37 | for(Ly=0; Ly < Ny; Ly++)
|
---|
| 38 | for(z=0; z < nz; z++) {
|
---|
| 39 | memcpy( &dest[es*(z+nz*(Ly+Ny*(ly+ny*(Lx+Nx*lx))))],
|
---|
| 40 | &source[es*(Ly+Ny*(Lx+Nx*(z+nz*(ly+ny*lx))))],
|
---|
| 41 | cpyes);
|
---|
| 42 | }
|
---|
| 43 | }
|
---|
| 44 |
|
---|
| 45 | static void RiemannRTransformPosNFRtoS(const struct RiemannTensor *RT, fftw_real *source, fftw_real *dest, const int NF)
|
---|
| 46 | {
|
---|
| 47 | struct LatticeLevel *Lev = RT->LevR;
|
---|
| 48 | int es = Lev->NUp1[2]*NF;
|
---|
| 49 | unsigned int cpyes = sizeof(fftw_real)*es;
|
---|
| 50 | int nx=Lev->Plan0.plan->local_nx,ny=Lev->N[1],nz=Lev->N[2],Nx=Lev->NUp1[0],Ny=Lev->NUp1[1];
|
---|
| 51 | int lx,ly,z,Lx,Ly;
|
---|
| 52 | for(lx=0; lx < nx; lx++)
|
---|
| 53 | for(Lx=0; Lx < Nx; Lx++)
|
---|
| 54 | for(ly=0; ly < ny; ly++)
|
---|
| 55 | for(Ly=0; Ly < Ny; Ly++)
|
---|
| 56 | for(z=0; z < nz; z++) {
|
---|
| 57 | memcpy( &dest[es*(z+nz*(Ly+Ny*(ly+ny*(Lx+Nx*lx))))],
|
---|
| 58 | &source[es*(Ly+Ny*(Lx+Nx*(z+nz*(ly+ny*lx))))],
|
---|
| 59 | cpyes);
|
---|
| 60 | }
|
---|
| 61 | }
|
---|
| 62 |
|
---|
| 63 | static void RiemannRTransformPos(const struct LatticeLevel *Lev, fftw_real *source, fftw_real *dest, const int NF)
|
---|
| 64 | {
|
---|
| 65 | int es = Lev->NUp[2]*NF;
|
---|
| 66 | unsigned int cpyes = sizeof(fftw_real)*es;
|
---|
| 67 | int nx=Lev->Plan0.plan->local_nx,ny=Lev->N[1],nz=Lev->N[2],Nx=Lev->NUp[0],Ny=Lev->NUp[1];
|
---|
| 68 | int lx,ly,z,Lx,Ly;
|
---|
| 69 | for(lx=0; lx < nx; lx++)
|
---|
| 70 | for(Lx=0; Lx < Nx; Lx++)
|
---|
| 71 | for(ly=0; ly < ny; ly++)
|
---|
| 72 | for(Ly=0; Ly < Ny; Ly++)
|
---|
| 73 | for(z=0; z < nz; z++) {
|
---|
| 74 | memcpy( &dest[es*(z+nz*(Ly+Ny*(ly+ny*(Lx+Nx*lx))))],
|
---|
| 75 | &source[es*(Ly+Ny*(Lx+Nx*(z+nz*(ly+ny*lx))))],
|
---|
| 76 | cpyes);
|
---|
| 77 | }
|
---|
| 78 | }
|
---|
| 79 |
|
---|
| 80 | static void CalculateLapiGcgS(const struct Lattice *Lat, const struct RiemannTensor *RT, fftw_complex *source)
|
---|
| 81 | {
|
---|
| 82 | int i,Index,j;
|
---|
| 83 | struct fft_plan_3d *plan = Lat->plan;
|
---|
| 84 | struct LatticeLevel *LevS = RT->LevS;
|
---|
| 85 | fftw_complex *LapiGcgC = RT->DensityC[RTAiGcg];
|
---|
| 86 | fftw_complex *LapcgC = RT->DensityC[RTAcg];
|
---|
| 87 | fftw_complex *work = RT->TempC;
|
---|
| 88 | fftw_complex *destCS, *destCD;
|
---|
| 89 | int TotalSize = RT->TotalSize[RTAiGcg]/LevS->MaxNUp;
|
---|
| 90 | double *G;
|
---|
| 91 | SetArrayToDouble0((double *)LapiGcgC, TotalSize*2);
|
---|
| 92 | SetArrayToDouble0((double *)LapcgC, (TotalSize/NDIM)*2);
|
---|
| 93 | for (i=0;i<LevS->MaxG;i++) {
|
---|
| 94 | Index = LevS->GArray[i].Index;
|
---|
| 95 | LapcgC[Index].re = source[i].re;
|
---|
| 96 | LapcgC[Index].im = source[i].im;
|
---|
| 97 | G = LevS->GArray[i].G;
|
---|
| 98 | for (j=0;j<NDIM;j++) {
|
---|
| 99 | LapiGcgC[Index*NDIM+j].re = -source[i].im*G[j];
|
---|
| 100 | LapiGcgC[Index*NDIM+j].im = source[i].re*G[j];
|
---|
| 101 | }
|
---|
| 102 | }
|
---|
| 103 | for (i=0; i<LevS->MaxDoubleG; i++) {
|
---|
| 104 | destCS = &LapiGcgC[LevS->DoubleG[2*i]*NDIM];
|
---|
| 105 | destCD = &LapiGcgC[LevS->DoubleG[2*i+1]*NDIM];
|
---|
| 106 | for (j=0; j < NDIM; j++) {
|
---|
| 107 | destCD[j].re = destCS[j].re;
|
---|
| 108 | destCD[j].im = -destCS[j].im;
|
---|
| 109 | }
|
---|
| 110 | }
|
---|
| 111 | fft_3d_complex_to_real(plan, LevS->LevelNo, FFTNFSVec, LapiGcgC, work);
|
---|
| 112 | for (i=0; i<LevS->MaxDoubleG; i++) {
|
---|
| 113 | destCS = &LapcgC[LevS->DoubleG[2*i]];
|
---|
| 114 | destCD = &LapcgC[LevS->DoubleG[2*i+1]];
|
---|
| 115 | destCD[0].re = destCS[0].re;
|
---|
| 116 | destCD[0].im = -destCS[0].im;
|
---|
| 117 | }
|
---|
| 118 | fft_3d_complex_to_real(plan, LevS->LevelNo, FFTNF1, LapcgC, work);
|
---|
| 119 | }
|
---|
| 120 |
|
---|
| 121 | static void CalculateLapiGcg0(const struct Lattice *Lat, const struct RiemannTensor *RT, fftw_complex *source/*, const double FactorC_R, const double FactorR_C*/)
|
---|
| 122 | {
|
---|
| 123 | int i,Index,j;
|
---|
| 124 | struct fft_plan_3d *plan = Lat->plan;
|
---|
| 125 | struct LatticeLevel *Lev0 = RT->Lev0;
|
---|
| 126 | fftw_complex *LapiGcgC = RT->DensityC[RTAiGcg];
|
---|
| 127 | fftw_complex *LapcgC = RT->DensityC[RTAcg];
|
---|
| 128 | fftw_complex *work = RT->TempC;
|
---|
| 129 | fftw_complex *destCS, *destCD;
|
---|
| 130 | int TotalSize = RT->TotalSize[RTAiGcg];
|
---|
| 131 | double *G;
|
---|
| 132 | SetArrayToDouble0((double *)LapiGcgC, TotalSize*2);
|
---|
| 133 | SetArrayToDouble0((double *)LapcgC, (TotalSize/NDIM)*2);
|
---|
| 134 | for (i=0;i<Lev0->MaxG;i++) {
|
---|
| 135 | Index = Lev0->GArray[i].Index;
|
---|
| 136 | LapcgC[Index].re = source[i].re;
|
---|
| 137 | LapcgC[Index].im = source[i].im;
|
---|
| 138 | G = Lev0->GArray[i].G;
|
---|
| 139 | for (j=0;j<NDIM;j++) {
|
---|
| 140 | LapiGcgC[Index*NDIM+j].re = -source[i].im*G[j];
|
---|
| 141 | LapiGcgC[Index*NDIM+j].im = source[i].re*G[j];
|
---|
| 142 | }
|
---|
| 143 | }
|
---|
| 144 | for (i=0; i<Lev0->MaxDoubleG; i++) {
|
---|
| 145 | destCS = &LapiGcgC[Lev0->DoubleG[2*i]*NDIM];
|
---|
| 146 | destCD = &LapiGcgC[Lev0->DoubleG[2*i+1]*NDIM];
|
---|
| 147 | for (j=0; j < NDIM; j++) {
|
---|
| 148 | destCD[j].re = destCS[j].re;
|
---|
| 149 | destCD[j].im = -destCS[j].im;
|
---|
| 150 | }
|
---|
| 151 | }
|
---|
| 152 | fft_3d_complex_to_real(plan, Lev0->LevelNo, FFTNF0Vec, LapiGcgC, work);
|
---|
| 153 | for (i=0; i<Lev0->MaxDoubleG; i++) {
|
---|
| 154 | destCS = &LapcgC[Lev0->DoubleG[2*i]];
|
---|
| 155 | destCD = &LapcgC[Lev0->DoubleG[2*i+1]];
|
---|
| 156 | destCD[0].re = destCS[0].re;
|
---|
| 157 | destCD[0].im = -destCS[0].im;
|
---|
| 158 | }
|
---|
| 159 | fft_3d_complex_to_real(plan, Lev0->LevelNo, FFTNF1, LapcgC, work);
|
---|
| 160 | }
|
---|
| 161 |
|
---|
| 162 | void CalculateRiemannLaplace0(const struct Lattice *Lat, struct RiemannTensor *RT, fftw_complex *src, fftw_complex *Lap/*, const double FactorC_R, const double FactorR_C*/)
|
---|
| 163 | {
|
---|
| 164 | int i,j,Index;
|
---|
| 165 | struct fft_plan_3d *plan = Lat->plan;
|
---|
| 166 | struct LatticeLevel *Lev0 = RT->Lev0;
|
---|
| 167 | fftw_real **RTAR = RT->DensityR;
|
---|
| 168 | const int *LocalSizeR = RT->LocalSizeR;
|
---|
| 169 | const int *LocalSizeC = RT->LocalSizeC;
|
---|
| 170 | fftw_complex *work = RT->TempC;
|
---|
| 171 | fftw_real *LapiGcgR = RTAR[RTAiGcg], *LapcgR = RTAR[RTAcg];
|
---|
| 172 | fftw_real *LapValR = RTAR[RTAARTA];
|
---|
| 173 | fftw_real *LapVecR = RTAR[RTARTA];
|
---|
| 174 | fftw_real *LapMatR = RTAR[RTAIRT];
|
---|
| 175 | fftw_real *MulValR = RTAR[RTAcg];
|
---|
| 176 | fftw_complex *MulValC = (fftw_complex *)MulValR;
|
---|
| 177 | fftw_real *MulVecR = RTAR[RTAiGcg];
|
---|
| 178 | fftw_complex *MulVecC = (fftw_complex *)MulVecR;
|
---|
| 179 | fftw_real ValR, VecR[NDIM];
|
---|
| 180 | double *G;
|
---|
| 181 | double factorR_C_0 = /*FactorR_C*/1.0/Lev0->MaxN;
|
---|
| 182 | CalculateLapiGcg0(Lat,RT,src);
|
---|
| 183 | for (i=0; i < LocalSizeR[RTAcg]; i++) {
|
---|
| 184 | ValR = LapValR[i]*LapcgR[i] + RSP3(&LapVecR[i*NDIM],&LapiGcgR[i*NDIM]);
|
---|
| 185 | RMat33Vec3(VecR,&LapMatR[i*NDIM_NDIM],&LapiGcgR[i*NDIM]);
|
---|
| 186 | for (j=0;j<NDIM;j++)
|
---|
| 187 | MulVecR[i*NDIM+j] = VecR[j]+LapVecR[i*NDIM+j]*LapcgR[i];
|
---|
| 188 | MulValR[i] = ValR;
|
---|
| 189 | }
|
---|
| 190 | fft_3d_real_to_complex(plan, Lev0->LevelNo, FFTNF1, MulValC, work);
|
---|
| 191 | for (i=0; i < LocalSizeC[RTAcg]; i++) {
|
---|
| 192 | MulValC[i].re *= factorR_C_0;
|
---|
| 193 | MulValC[i].im *= factorR_C_0;
|
---|
| 194 | }
|
---|
| 195 | fft_3d_real_to_complex(plan, Lev0->LevelNo, FFTNF0Vec, MulVecC, work);
|
---|
| 196 | for (i=0; i < LocalSizeC[RTAiGcg]; i++) {
|
---|
| 197 | MulVecC[i].re *= factorR_C_0;
|
---|
| 198 | MulVecC[i].im *= factorR_C_0;
|
---|
| 199 | }
|
---|
| 200 | for (i=0;i<Lev0->MaxG;i++) {
|
---|
| 201 | Index = Lev0->GArray[i].Index;
|
---|
| 202 | G = Lev0->GArray[i].G;
|
---|
| 203 | Lap[i].re = MulValC[Index].re;
|
---|
| 204 | Lap[i].im = MulValC[Index].im;
|
---|
| 205 | for (j=0;j<NDIM;j++) {
|
---|
| 206 | Lap[i].im -= G[j]*(MulVecC[Index*NDIM+j].re);
|
---|
| 207 | Lap[i].re += G[j]*(MulVecC[Index*NDIM+j].im);
|
---|
| 208 | }
|
---|
| 209 | }
|
---|
| 210 | }
|
---|
| 211 |
|
---|
| 212 | void CalculateRiemannLaplaceS(const struct Lattice *Lat, struct RiemannTensor *RT, fftw_complex *src, fftw_complex *Lap/*, const double FactorC_R, const double FactorR_C*/)
|
---|
| 213 | {
|
---|
| 214 | int i,i0,iS,j,Index;
|
---|
| 215 | struct fft_plan_3d *plan = Lat->plan;
|
---|
| 216 | struct LatticeLevel *LevS = RT->LevS;
|
---|
| 217 | fftw_real **RTAR = RT->DensityR;
|
---|
| 218 | const int *TotalSize = RT->TotalSize;
|
---|
| 219 | fftw_complex *work = RT->TempC;
|
---|
| 220 | fftw_real *LapiGcgR = RTAR[RTAiGcg], *LapcgR = RTAR[RTAcg];
|
---|
| 221 | fftw_real *LapValR = RTAR[RTAARTA];
|
---|
| 222 | fftw_real *LapVecR = RTAR[RTARTA];
|
---|
| 223 | fftw_real *LapMatR = RTAR[RTAIRT];
|
---|
| 224 | fftw_real *MulValR = RTAR[RTAcg];
|
---|
| 225 | fftw_complex *MulValC = (fftw_complex *)MulValR;
|
---|
| 226 | fftw_real *MulVecR = RTAR[RTAiGcg];
|
---|
| 227 | fftw_complex *MulVecC = (fftw_complex *)MulVecR;
|
---|
| 228 | fftw_real ValR, VecR[NDIM];
|
---|
| 229 | int nx,ny,nz;
|
---|
| 230 | const int Nx = LevS->Plan0.plan->local_nx;
|
---|
| 231 | const int Ny = LevS->Plan0.plan->N[1];
|
---|
| 232 | const int Nz = LevS->Plan0.plan->N[2];
|
---|
| 233 | const int NUpx = LevS->NUp[0];
|
---|
| 234 | const int NUpy = LevS->NUp[1];
|
---|
| 235 | const int NUpz = LevS->NUp[2];
|
---|
| 236 | double *G;
|
---|
| 237 | double factorR_C_S = /*FactorR_C*/1.0/LevS->MaxN;
|
---|
| 238 | CalculateLapiGcgS(Lat,RT,src);
|
---|
| 239 | for (nx=0;nx<Nx;nx++)
|
---|
| 240 | for (ny=0;ny<Ny;ny++)
|
---|
| 241 | for (nz=0;nz<Nz;nz++) {
|
---|
| 242 | i0 = nz*NUpz+Nz*NUpz*(ny*NUpy+Ny*NUpy*nx*NUpx);
|
---|
| 243 | iS = nz+Nz*(ny+Ny*nx);
|
---|
| 244 | ValR = LapValR[i0]*LapcgR[iS] + RSP3(&LapVecR[i0*NDIM],&LapiGcgR[iS*NDIM]);
|
---|
| 245 | RMat33Vec3(VecR,&LapMatR[i0*NDIM_NDIM],&LapiGcgR[iS*NDIM]);
|
---|
| 246 | for (j=0;j<NDIM;j++) {
|
---|
| 247 | MulVecR[iS*NDIM+j] = VecR[j]+LapVecR[i0*NDIM+j]*LapcgR[iS];
|
---|
| 248 | }
|
---|
| 249 | MulValR[iS] = ValR;
|
---|
| 250 | }
|
---|
| 251 | fft_3d_real_to_complex(plan, LevS->LevelNo, FFTNF1, MulValC, work);
|
---|
| 252 | for (i=0; i < TotalSize[RTAcg]/LevS->MaxNUp; i++) {
|
---|
| 253 | MulValC[i].re *= factorR_C_S;
|
---|
| 254 | MulValC[i].im *= factorR_C_S;
|
---|
| 255 | }
|
---|
| 256 | fft_3d_real_to_complex(plan, LevS->LevelNo, FFTNFSVec, MulVecC, work);
|
---|
| 257 | for (i=0; i < TotalSize[RTAiGcg]/LevS->MaxNUp; i++) {
|
---|
| 258 | MulVecC[i].re *= factorR_C_S;
|
---|
| 259 | MulVecC[i].im *= factorR_C_S;
|
---|
| 260 | }
|
---|
| 261 | for (i=0;i<LevS->MaxG;i++) {
|
---|
| 262 | Index = LevS->GArray[i].Index;
|
---|
| 263 | G = LevS->GArray[i].G;
|
---|
| 264 | Lap[i].re = MulValC[Index].re;
|
---|
| 265 | Lap[i].im = MulValC[Index].im;
|
---|
| 266 | for (j=0;j<NDIM;j++) {
|
---|
| 267 | Lap[i].im -= G[j]*(MulVecC[Index*NDIM+j].re);
|
---|
| 268 | Lap[i].re += G[j]*(MulVecC[Index*NDIM+j].im);
|
---|
| 269 | }
|
---|
| 270 | }
|
---|
| 271 | }
|
---|
| 272 |
|
---|
| 273 | static void CalculateRTData(const struct Lattice *Lat, struct RiemannTensor *RT/*, const double FactorC_R, const double FactorR_C*/)
|
---|
| 274 | {
|
---|
| 275 | struct fft_plan_3d *plan = Lat->plan;
|
---|
| 276 | struct LatticeLevel *LevR = RT->LevR;
|
---|
| 277 | struct LatticeLevel *LevS = RT->LevS;
|
---|
| 278 | const double factorR_C_S = /*FactorR_C*/1./LevS->MaxN;
|
---|
| 279 | fftw_complex **RTAC = RT->DensityC;
|
---|
| 280 | fftw_real **RTAR = RT->DensityR;
|
---|
| 281 | fftw_complex **PosFactor = RT->PosFactor;
|
---|
| 282 | const int *TotalSize = RT->TotalSize;
|
---|
| 283 | const int *LocalSizeR = RT->LocalSizeR;
|
---|
| 284 | const int *LocalSizeC = RT->LocalSizeC;
|
---|
| 285 | const int *NFields = RT->NFields;
|
---|
| 286 | const int *MaxNUp = RT->MaxNUp;
|
---|
| 287 | const int MaxNUpS0 = LevS->MaxNUp;
|
---|
| 288 | fftw_complex *PosFactorS0 = LevS->PosFactorUp;
|
---|
| 289 | fftw_complex *coeff, *posfac, *destpos, *destCS, *destCD, *srcC, source;
|
---|
| 290 | fftw_complex *work = RT->TempC;
|
---|
| 291 | fftw_real *workR = (fftw_real*)work;
|
---|
| 292 | fftw_real *srcR, *srcR2, *destR3;
|
---|
| 293 | fftw_real *srcRT = RTAR[RTAIRT], *srcA = workR, *destDet = RTAR[RTADetPreRT], *destRT = RTAR[RTAIRT];
|
---|
| 294 | fftw_real *destIRT = RTAR[RTAIRT], *destA = RTAR[RTAA], *destRTA = RTAR[RTARTA], *destARTA = RTAR[RTAARTA];
|
---|
| 295 | int i,i0,iS,j,Index,pos,n,ng,n0,n1,nx,ny,nz;
|
---|
| 296 | const int Nx = LevS->Plan0.plan->local_nx;
|
---|
| 297 | const int Ny = LevS->Plan0.plan->N[1];
|
---|
| 298 | const int Nz = LevS->Plan0.plan->N[2];
|
---|
| 299 | const int NUpx = LevS->NUp[0];
|
---|
| 300 | const int NUpy = LevS->NUp[1];
|
---|
| 301 | const int NUpz = LevS->NUp[2];
|
---|
| 302 | double *G;
|
---|
| 303 | double MatR[NDIM_NDIM], MatRT[NDIM_NDIM], MatIG[NDIM_NDIM], VecR[NDIM];
|
---|
| 304 | SetArrayToDouble0((double *)RTAC[RTAPreA], TotalSize[RTAPreA]*2);
|
---|
| 305 | SetArrayToDouble0((double *)RTAC[RTAIRT], TotalSize[RTAIRT]*2);
|
---|
| 306 | for (i=0;i < LevR->MaxG;i++) {
|
---|
| 307 | Index = LevR->GArray[i].Index;
|
---|
| 308 | coeff = &RT->Coeff[i];
|
---|
| 309 | G = LevR->GArray[i].G;
|
---|
| 310 | /* RTAIRT */
|
---|
| 311 | posfac = &(PosFactor[RTPFRto0][MaxNUp[RTPFRto0]*i]);
|
---|
| 312 | destpos = &(RTAC[RTAIRT][MaxNUp[RTPFRto0]*Index*NFields[RTAIRT]]);
|
---|
| 313 | for (pos=0; pos < MaxNUp[RTPFRto0]; pos++) {
|
---|
| 314 | for (n1=0; n1 < NDIM; n1++) {
|
---|
| 315 | for (n0=0; n0 < NDIM; n0++) {
|
---|
| 316 | source.re = -coeff[n0].im*G[n1];
|
---|
| 317 | source.im = coeff[n0].re*G[n1];
|
---|
| 318 | n = n0+NDIM*n1;
|
---|
| 319 | destpos[n+NDIM_NDIM*pos].re = source.re*posfac[pos].re-source.im*posfac[pos].im;
|
---|
| 320 | destpos[n+NDIM_NDIM*pos].im = source.re*posfac[pos].im+source.im*posfac[pos].re;
|
---|
| 321 | }
|
---|
| 322 | }
|
---|
| 323 | }
|
---|
| 324 | /* RTAPreA */
|
---|
| 325 | posfac = &(PosFactor[RTPFRtoS][MaxNUp[RTPFRtoS]*i]);
|
---|
| 326 | destpos = &(RTAC[RTAPreA][MaxNUp[RTPFRtoS]*Index*NFields[RTAPreA]]);
|
---|
| 327 | for (pos=0; pos < MaxNUp[RTPFRtoS]; pos++) {
|
---|
| 328 | for (n1=0; n1 < NDIM; n1++) {
|
---|
| 329 | for (n0=0; n0 < NDIM; n0++) {
|
---|
| 330 | for (ng=0; ng < NDIM; ng++) {
|
---|
| 331 | source.re = -coeff[n0].re*G[n1]*G[ng];
|
---|
| 332 | source.im = -coeff[n0].im*G[n1]*G[ng];
|
---|
| 333 | n = ng+NDIM*(n0+NDIM*n1);
|
---|
| 334 | destpos[n+NDIM_NDIM*NDIM*pos].re = source.re*posfac[pos].re-source.im*posfac[pos].im;
|
---|
| 335 | destpos[n+NDIM_NDIM*NDIM*pos].im = source.re*posfac[pos].im+source.im*posfac[pos].re;
|
---|
| 336 | }
|
---|
| 337 | }
|
---|
| 338 | }
|
---|
| 339 | }
|
---|
| 340 | }
|
---|
| 341 | /* RTAIRT */
|
---|
| 342 | for (i=0; i < LevR->MaxDoubleG; i++) {
|
---|
| 343 | destCS = &(RTAC[RTAIRT][LevR->DoubleG[2*i]*MaxNUp[RTPFRto0]*NFields[RTAIRT]]);
|
---|
| 344 | destCD = &(RTAC[RTAIRT][LevR->DoubleG[2*i+1]*MaxNUp[RTPFRto0]*NFields[RTAIRT]]);
|
---|
| 345 | for (pos=0; pos < MaxNUp[RTPFRto0]; pos++) {
|
---|
| 346 | for (n=0; n < NFields[RTAIRT]; n++) {
|
---|
| 347 | destCD[n+NFields[RTAIRT]*pos].re = destCS[n+NFields[RTAIRT]*pos].re;
|
---|
| 348 | destCD[n+NFields[RTAIRT]*pos].im = -destCS[n+NFields[RTAIRT]*pos].im;
|
---|
| 349 | }
|
---|
| 350 | }
|
---|
| 351 | }
|
---|
| 352 | fft_3d_complex_to_real(plan, LevR->LevelNo, (int)FFTNFRMatUp0, RTAC[RTAIRT], work);
|
---|
| 353 | RiemannRTransformPosNFRto0(RT, RTAR[RTAIRT], workR, NFields[RTAIRT]);
|
---|
| 354 | memcpy(RTAR[RTAIRT],workR,sizeof(fftw_real)*LocalSizeR[RTAIRT]*NFields[RTAIRT]);
|
---|
| 355 | /* RTAPreA */
|
---|
| 356 | for (i=0; i < LevR->MaxDoubleG; i++) {
|
---|
| 357 | destCS = &(RTAC[RTAPreA][LevR->DoubleG[2*i]*MaxNUp[RTPFRtoS]*NFields[RTAPreA]]);
|
---|
| 358 | destCD = &(RTAC[RTAPreA][LevR->DoubleG[2*i+1]*MaxNUp[RTPFRtoS]*NFields[RTAPreA]]);
|
---|
| 359 | for (pos=0; pos < MaxNUp[RTPFRtoS]; pos++) {
|
---|
| 360 | for (n=0; n < NFields[RTAPreA]; n++) {
|
---|
| 361 | destCD[n+NFields[RTAPreA]*pos].re = destCS[n+NFields[RTAPreA]*pos].re;
|
---|
| 362 | destCD[n+NFields[RTAPreA]*pos].im = -destCS[n+NFields[RTAPreA]*pos].im;
|
---|
| 363 | }
|
---|
| 364 | }
|
---|
| 365 | }
|
---|
| 366 | fft_3d_complex_to_real(plan, LevR->LevelNo, (int)FFTNFRMatVecUpS, RTAC[RTAPreA], work);
|
---|
| 367 | RiemannRTransformPosNFRtoS(RT, RTAR[RTAPreA], workR, NFields[RTAPreA]);
|
---|
| 368 | memcpy(RTAR[RTAPreA],workR,sizeof(fftw_real)*LocalSizeR[RTAPreA]*NFields[RTAPreA]);
|
---|
| 369 | /* RTAA(S) - RTAIRT */
|
---|
| 370 | for (i=0; i< LocalSizeR[RTAIRT];i++) {
|
---|
| 371 | srcR = &(RTAR[RTAIRT][i*NFields[RTAIRT]]);
|
---|
| 372 | srcR[0+NDIM*0] += 1.; /* Diag plus eins */
|
---|
| 373 | srcR[1+NDIM*1] += 1.;
|
---|
| 374 | srcR[2+NDIM*2] += 1.;
|
---|
| 375 | }
|
---|
| 376 | for (nx=0;nx<Nx;nx++)
|
---|
| 377 | for (ny=0;ny<Ny;ny++)
|
---|
| 378 | for (nz=0;nz<Nz;nz++) {
|
---|
| 379 | i0 = nz*NUpz+Nz*NUpz*(ny*NUpy+Ny*NUpy*nx*NUpx);
|
---|
| 380 | iS = nz+Nz*(ny+Ny*nx);
|
---|
| 381 | srcR = &(RTAR[RTAIRT][i0*NFields[RTAIRT]]);
|
---|
| 382 | srcR2 = &(RTAR[RTAPreA][iS*NFields[RTAPreA]]);
|
---|
| 383 | destR3 = &(RTAR[RTAA][iS*NFields[RTAA]]);
|
---|
| 384 | for (ng=0; ng<NDIM;ng++) {
|
---|
| 385 | destR3[ng]
|
---|
| 386 | = srcR2[ng+NDIM*(0+NDIM*0)] * srcR[1+NDIM*1] * srcR[2+NDIM*2]
|
---|
| 387 | + srcR[0+NDIM*0] * srcR2[ng+NDIM*(1+NDIM*1)] * srcR[2+NDIM*2]
|
---|
| 388 | + srcR[0+NDIM*0] * srcR[1+NDIM*1] * srcR2[ng+NDIM*(2+NDIM*2)];
|
---|
| 389 | destR3[ng]
|
---|
| 390 | += srcR2[ng+NDIM*(0+NDIM*1)] * srcR[1+NDIM*2] * srcR[2+NDIM*0]
|
---|
| 391 | + srcR[0+NDIM*1] * srcR2[ng+NDIM*(1+NDIM*2)] * srcR[2+NDIM*0]
|
---|
| 392 | + srcR[0+NDIM*1] * srcR[1+NDIM*2] * srcR2[ng+NDIM*(2+NDIM*0)];
|
---|
| 393 | destR3[ng]
|
---|
| 394 | += srcR2[ng+NDIM*(0+NDIM*2)] * srcR[1+NDIM*0] * srcR[2+NDIM*1]
|
---|
| 395 | + srcR[0+NDIM*2] * srcR2[ng+NDIM*(1+NDIM*0)] * srcR[2+NDIM*1]
|
---|
| 396 | + srcR[0+NDIM*2] * srcR[1+NDIM*0] * srcR2[ng+NDIM*(2+NDIM*1)];
|
---|
| 397 | destR3[ng]
|
---|
| 398 | +=-srcR2[ng+NDIM*(2+NDIM*0)] * srcR[1+NDIM*1] * srcR[0+NDIM*2]
|
---|
| 399 | - srcR[2+NDIM*0] * srcR2[ng+NDIM*(1+NDIM*1)] * srcR[0+NDIM*2]
|
---|
| 400 | - srcR[2+NDIM*0] * srcR[1+NDIM*1] * srcR2[ng+NDIM*(0+NDIM*2)];
|
---|
| 401 | destR3[ng]
|
---|
| 402 | +=-srcR2[ng+NDIM*(2+NDIM*1)] * srcR[1+NDIM*2] * srcR[0+NDIM*0]
|
---|
| 403 | - srcR[2+NDIM*1] * srcR2[ng+NDIM*(1+NDIM*2)] * srcR[0+NDIM*0]
|
---|
| 404 | - srcR[2+NDIM*1] * srcR[1+NDIM*2] * srcR2[ng+NDIM*(0+NDIM*0)];
|
---|
| 405 | destR3[ng]
|
---|
| 406 | +=-srcR2[ng+NDIM*(2+NDIM*2)] * srcR[1+NDIM*0] * srcR[0+NDIM*1]
|
---|
| 407 | - srcR[2+NDIM*2] * srcR2[ng+NDIM*(1+NDIM*0)] * srcR[0+NDIM*1]
|
---|
| 408 | - srcR[2+NDIM*2] * srcR[1+NDIM*0] * srcR2[ng+NDIM*(0+NDIM*1)];
|
---|
| 409 | }
|
---|
| 410 | }
|
---|
| 411 | fft_3d_real_to_complex(plan, LevS->LevelNo, FFTNFSVec, RTAC[RTAA], work);
|
---|
| 412 | for (i=0; i< LocalSizeC[RTAPreA]*NFields[RTAA]; i++) {
|
---|
| 413 | work[i].re = RTAC[RTAA][i].re * factorR_C_S;
|
---|
| 414 | work[i].im = RTAC[RTAA][i].im * factorR_C_S;
|
---|
| 415 | }
|
---|
| 416 | /* RTAA (0) */
|
---|
| 417 | SetArrayToDouble0((double *)RTAC[RTAA], TotalSize[RTAA]*2);
|
---|
| 418 | for (i=0;i < LevS->MaxG;i++) {
|
---|
| 419 | Index = LevS->GArray[i].Index;
|
---|
| 420 | posfac = &(PosFactorS0[MaxNUpS0*i]);
|
---|
| 421 | destpos = &(RTAC[RTAA][MaxNUpS0*Index*NFields[RTAA]]);
|
---|
| 422 | srcC = &(work[Index*NFields[RTAA]]);
|
---|
| 423 | for (pos=0; pos < MaxNUpS0; pos++) {
|
---|
| 424 | for (n=0; n < NDIM; n++) {
|
---|
| 425 | destpos[n+NDIM*pos].re = srcC[n].re*posfac[pos].re-srcC[n].im*posfac[pos].im;
|
---|
| 426 | destpos[n+NDIM*pos].im = srcC[n].re*posfac[pos].im+srcC[n].im*posfac[pos].re;
|
---|
| 427 | }
|
---|
| 428 | }
|
---|
| 429 | }
|
---|
| 430 | for (i=0; i < LevS->MaxDoubleG; i++) {
|
---|
| 431 | destCS = &(RTAC[RTAA][LevS->DoubleG[2*i]*MaxNUpS0*NFields[RTAA]]);
|
---|
| 432 | destCD = &(RTAC[RTAA][LevS->DoubleG[2*i+1]*MaxNUpS0*NFields[RTAA]]);
|
---|
| 433 | for (pos=0; pos < MaxNUpS0; pos++) {
|
---|
| 434 | for (n=0; n < NFields[RTAA]; n++) {
|
---|
| 435 | destCD[n+NFields[RTAA]*pos].re = destCS[n+NFields[RTAA]*pos].re;
|
---|
| 436 | destCD[n+NFields[RTAA]*pos].im = -destCS[n+NFields[RTAA]*pos].im;
|
---|
| 437 | }
|
---|
| 438 | }
|
---|
| 439 | }
|
---|
| 440 | fft_3d_complex_to_real(plan, LevS->LevelNo, (int)FFTNFSVecUp, RTAC[RTAA], work);
|
---|
| 441 | RiemannRTransformPos(LevS, RTAR[RTAA], workR, NFields[RTAA]);
|
---|
| 442 | /* All RTAŽs in R*/
|
---|
| 443 | for (i=0; i < LocalSizeR[RTAIRT]; i++) {
|
---|
| 444 | destDet[i] = 1./RDET3(&srcRT[NDIM_NDIM*i]);
|
---|
| 445 | for(j=0;j<NDIM_NDIM;j++) {
|
---|
| 446 | MatR[j] = srcRT[NDIM_NDIM*i+j];
|
---|
| 447 | MatRT[j] = MatR[j];
|
---|
| 448 | }
|
---|
| 449 | RTranspose3(MatRT);
|
---|
| 450 | RMatMat33(&destRT[NDIM_NDIM*i],MatRT,MatR);
|
---|
| 451 | RMatReci3(MatIG,&destRT[NDIM_NDIM*i]);
|
---|
| 452 | for (j=0;j<NDIM_NDIM;j++)
|
---|
| 453 | destIRT[NDIM_NDIM*i+j] = MatIG[j];
|
---|
| 454 | for(j=0;j<NDIM;j++) {
|
---|
| 455 | VecR[j] = srcA[j]*destDet[i]*0.5;
|
---|
| 456 | destA[NDIM*i+j] = VecR[j];
|
---|
| 457 | }
|
---|
| 458 | RMat33Vec3(&destRTA[i*NDIM],MatIG,VecR);
|
---|
| 459 | destARTA[i]=RSP3(VecR,&destRTA[i*NDIM]);
|
---|
| 460 | }
|
---|
| 461 | }
|
---|
| 462 |
|
---|
| 463 |
|
---|
| 464 | void CalculateRiemannTensorData(struct Problem *const P)
|
---|
| 465 | {
|
---|
| 466 | if (P->Lat.RT.ActualUse != active) return;
|
---|
| 467 | CalculateRTData(&P->Lat, &P->Lat.RT/*, P->Lat.FactorDensityR, P->Lat.FactorDensityC*/);
|
---|
| 468 | }
|
---|
| 469 |
|
---|
| 470 | void InitRiemannTensor(struct Problem *const P)
|
---|
| 471 | {
|
---|
| 472 | int i, MaxSize=0;
|
---|
| 473 | struct Lattice *Lat = &P->Lat;
|
---|
| 474 | struct RunStruct *R = &P->R;
|
---|
| 475 | struct LatticeLevel *LevR;
|
---|
| 476 | struct LatticeLevel *LevS = NULL;
|
---|
| 477 | struct LatticeLevel *Lev0 = NULL;
|
---|
| 478 | struct RiemannTensor *RT = &Lat->RT;
|
---|
| 479 | if (P->Lat.RT.Use == UseNotRT) return;
|
---|
| 480 | if (P->Call.out[NormalOut]) fprintf(stderr, "(%i)InitRiemannTensor\n", P->Par.me);
|
---|
| 481 | RT->LevR = LevR = &Lat->Lev[R->LevRNo];
|
---|
| 482 | RT->LevS = LevS = &Lat->Lev[R->LevRSNo];
|
---|
| 483 | RT->Lev0 = Lev0 = &Lat->Lev[R->LevR0No];
|
---|
| 484 | RT->Coeff = (fftw_complex*)
|
---|
| 485 | Malloc(sizeof(fftw_complex)*LevR->MaxG*3,"InitRiemannTensor: RT->Coeff");
|
---|
| 486 | SetArrayToDouble0((double *)RT->Coeff, LevR->MaxG*3*2);
|
---|
| 487 | RT->RTLaplaceS = (fftw_complex*)
|
---|
| 488 | Malloc(sizeof(fftw_complex)*LevS->MaxG,"InitRiemannTensor: RT->Laplace");
|
---|
| 489 | RT->RTLaplace0 = (fftw_complex*)
|
---|
| 490 | Malloc(sizeof(fftw_complex)*Lev0->MaxG,"InitRiemannTensor: RT->Laplace");
|
---|
| 491 | RT->MaxNUp[RTPFRtoS] = LevR->NUp1[0]*LevR->NUp1[1]*LevR->NUp1[2];
|
---|
| 492 | RT->MaxNUp[RTPFRto0] = LevR->NUp0[0]*LevR->NUp0[1]*LevR->NUp0[2];
|
---|
| 493 | /* RTADetPreRT : */
|
---|
| 494 | RT->TotalSize[RTADetPreRT] = Lev0->Plan0.plan->LocalSizeC;
|
---|
| 495 | RT->LocalSizeC[RTADetPreRT] = Lev0->Plan0.plan->LocalSizeC;
|
---|
| 496 | RT->LocalSizeR[RTADetPreRT] = Lev0->Plan0.plan->LocalSizeR;
|
---|
| 497 | RT->NFields[RTADetPreRT] = 1;
|
---|
| 498 | /* RTAPreA : */
|
---|
| 499 | RT->TotalSize[RTAPreA] = LevR->Plan0.plan->LocalSizeC*RT->MaxNUp[RTPFRtoS]*NDIM_NDIM*NDIM;
|
---|
| 500 | RT->LocalSizeC[RTAPreA] = LevS->Plan0.plan->LocalSizeC;
|
---|
| 501 | RT->LocalSizeR[RTAPreA] = LevS->Plan0.plan->LocalSizeR;
|
---|
| 502 | RT->NFields[RTAPreA] = NDIM_NDIM*NDIM;
|
---|
| 503 | /* RTAA : */
|
---|
| 504 | RT->TotalSize[RTAA] = LevS->Plan0.plan->LocalSizeC*LevS->MaxNUp*NDIM;
|
---|
| 505 | RT->LocalSizeC[RTAA] = Lev0->Plan0.plan->LocalSizeC;
|
---|
| 506 | RT->LocalSizeR[RTAA] = Lev0->Plan0.plan->LocalSizeR;
|
---|
| 507 | RT->NFields[RTAA] = NDIM;
|
---|
| 508 | /* RTAIRT : */
|
---|
| 509 | RT->TotalSize[RTAIRT] = LevR->Plan0.plan->LocalSizeC*RT->MaxNUp[RTPFRto0]*NDIM_NDIM;
|
---|
| 510 | RT->LocalSizeC[RTAIRT] = Lev0->Plan0.plan->LocalSizeC;
|
---|
| 511 | RT->LocalSizeR[RTAIRT] = Lev0->Plan0.plan->LocalSizeR;
|
---|
| 512 | RT->NFields[RTAIRT] = NDIM_NDIM;
|
---|
| 513 | /* RTARTA : */
|
---|
| 514 | RT->TotalSize[RTARTA] = Lev0->Plan0.plan->LocalSizeC*NDIM;
|
---|
| 515 | RT->LocalSizeC[RTARTA] = Lev0->Plan0.plan->LocalSizeC;
|
---|
| 516 | RT->LocalSizeR[RTARTA] = Lev0->Plan0.plan->LocalSizeR;
|
---|
| 517 | RT->NFields[RTARTA] = NDIM;
|
---|
| 518 | /* RTAARTA : */
|
---|
| 519 | RT->TotalSize[RTAARTA] = Lev0->Plan0.plan->LocalSizeC;
|
---|
| 520 | RT->LocalSizeC[RTAARTA] = Lev0->Plan0.plan->LocalSizeC;
|
---|
| 521 | RT->LocalSizeR[RTAARTA] = Lev0->Plan0.plan->LocalSizeR;
|
---|
| 522 | RT->NFields[RTAARTA] = 1;
|
---|
| 523 | /* RTAiGcg : fuer Vektoren*/
|
---|
| 524 | RT->TotalSize[RTAiGcg] = LevS->Plan0.plan->LocalSizeC*LevS->MaxNUp*NDIM;
|
---|
| 525 | RT->LocalSizeC[RTAiGcg] = Lev0->Plan0.plan->LocalSizeC;
|
---|
| 526 | RT->LocalSizeR[RTAiGcg] = Lev0->Plan0.plan->LocalSizeR;
|
---|
| 527 | RT->NFields[RTAiGcg] = NDIM;
|
---|
| 528 | /* RTAcg : fuer values*/
|
---|
| 529 | RT->TotalSize[RTAcg] = LevS->Plan0.plan->LocalSizeC*LevS->MaxNUp;
|
---|
| 530 | RT->LocalSizeC[RTAcg] = Lev0->Plan0.plan->LocalSizeC;
|
---|
| 531 | RT->LocalSizeR[RTAcg] = Lev0->Plan0.plan->LocalSizeR;
|
---|
| 532 | RT->NFields[RTAcg] = 1;
|
---|
| 533 | for (i=0; i< MAXRTARRAYS; i++) {
|
---|
| 534 | switch (i) {
|
---|
| 535 | case RTAiGcg:
|
---|
| 536 | RT->DensityC[i] = (fftw_complex *)
|
---|
| 537 | Malloc(sizeof(fftw_complex)*MAX(RT->TotalSize[i],RT->TotalSize[RTAIRT]/NDIM),"InitRiemannTensor: RT->Density");
|
---|
| 538 | RT->DensityR[i] = (fftw_real *)RT->DensityC[i];
|
---|
| 539 | if ( MAX(RT->TotalSize[i],RT->TotalSize[RTAIRT]/NDIM) > MaxSize) MaxSize = MAX(RT->TotalSize[i],RT->TotalSize[RTAIRT]/NDIM);
|
---|
| 540 | break;
|
---|
| 541 | default:
|
---|
| 542 | RT->DensityC[i] = (fftw_complex *)
|
---|
| 543 | Malloc(sizeof(fftw_complex)*RT->TotalSize[i],"InitRiemannTensor: RT->Density");
|
---|
| 544 | RT->DensityR[i] = (fftw_real *)RT->DensityC[i];
|
---|
| 545 | if (RT->TotalSize[i] > MaxSize) MaxSize = RT->TotalSize[i];
|
---|
| 546 | break;
|
---|
| 547 | }
|
---|
| 548 | }
|
---|
| 549 | RT->TempC = (fftw_complex *)
|
---|
| 550 | Malloc(sizeof(fftw_complex)*MaxSize,"InitRiemannTensor: RT->TempC");
|
---|
| 551 | RT->TempTotalSize = sizeof(fftw_complex)*MaxSize;
|
---|
| 552 | }
|
---|
| 553 |
|
---|