| [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 |  | 
|---|