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