3 #include <gsl/gsl_rng.h>
24 unsigned int seed = 0x7fffffff * gsl_rng_uniform(rng);
26 int ii[2] = {i, (pm->
Nmesh[0] - i) % pm->
Nmesh[0]};
27 int jj[2] = {j, (pm->
Nmesh[1] - j) % pm->
Nmesh[1]};
29 for(d1 = 0; d1 < 2; d1++) {
33 for(d1 = 0; d1 < 2; d1++)
34 for(d2 = 0; d2 < 2; d2++) {
44 static inline unsigned int
57 SAMPLE(gsl_rng * rng,
double * ampl,
double * phase)
59 *phase = gsl_rng_uniform(rng) * 2 * M_PI;
61 do *ampl = gsl_rng_uniform(rng);
while(*ampl == 0);
71 gsl_rng * rng = gsl_rng_alloc(gsl_rng_ranlxd1);
72 gsl_rng_set(rng, seed);
74 unsigned int * seedtable[2][2];
75 for(i = 0; i < 2; i ++)
76 for(j = 0; j < 2; j ++) {
81 for(i = 0; i < pm->
Nmesh[0] / 2; i++) {
82 for(j = 0; j < i; j++)
SETSEED(pm, seedtable, i, j, rng);
83 for(j = 0; j < i + 1; j++)
SETSEED(pm, seedtable, j, i, rng);
84 for(j = 0; j < i; j++)
SETSEED(pm, seedtable, pm->
Nmesh[0] - 1 - i, j, rng);
85 for(j = 0; j < i + 1; j++)
SETSEED(pm, seedtable, pm->
Nmesh[1] - 1 - j, i, rng);
86 for(j = 0; j < i; j++)
SETSEED(pm, seedtable, i, pm->
Nmesh[1] - 1 - j, rng);
87 for(j = 0; j < i + 1; j++)
SETSEED(pm, seedtable, j, pm->
Nmesh[0] - 1 - i, rng);
88 for(j = 0; j < i; j++)
SETSEED(pm, seedtable, pm->
Nmesh[0] - 1 - i, pm->
Nmesh[1] - 1 - j, rng);
89 for(j = 0; j < i + 1; j++)
SETSEED(pm, seedtable, pm->
Nmesh[1] - 1 - j, pm->
Nmesh[0] - 1 - i, rng);
98 gsl_rng * lower_rng = gsl_rng_alloc(gsl_rng_ranlxd1);
99 gsl_rng * this_rng = gsl_rng_alloc(gsl_rng_ranlxd1);
101 int ci = pm->
Nmesh[0] - i;
112 int cj = pm->
Nmesh[1] - j;
116 if( (ci == i && cj < j)
117 || (ci < i && cj != j)
118 || (ci < i && cj == j)) {
123 unsigned int seed_conj, seed_this;
125 seed_conj =
GETSEED(pm, seedtable, i, j, d1, d2);
126 gsl_rng_set(lower_rng, seed_conj);
128 seed_this =
GETSEED(pm, seedtable, i, j, 0, 0);
129 gsl_rng_set(this_rng, seed_this);
131 for(k = 0; k <= pm->
Nmesh[2] / 2; k ++) {
132 int use_conj = (d1 != 0 || d2 != 0) && (k == 0 || k == pm->
Nmesh[2] / 2);
138 SAMPLE(this_rng, &l, &phase);
139 SAMPLE(lower_rng, &l, &phase);
141 SAMPLE(lower_rng, &l, &phase);
142 SAMPLE(this_rng, &l, &phase);
145 ptrdiff_t iabs[3] = {i, j, k};
147 for(d = 0; d < 3; d ++) {
152 if(irel[2] < 0)
continue;
156 ampl = sqrt(- log(ampl));
158 if (setUnitaryAmplitude) ampl = 1.0;
165 (delta_k + 2 * ip)[0] = ampl * cos(phase);
166 (delta_k + 2 * ip)[1] = ampl * sin(phase);
169 (delta_k + 2 * ip)[1] *= -1;
172 if((pm->
Nmesh[0] - iabs[0]) % pm->
Nmesh[0] == iabs[0] &&
173 (pm->
Nmesh[1] - iabs[1]) % pm->
Nmesh[1] == iabs[1] &&
174 (pm->
Nmesh[2] - iabs[2]) % pm->
Nmesh[2] == iabs[2]) {
176 (delta_k + 2 * ip)[1] = 0;
177 (delta_k + 2 * ip)[0] = ampl * cos(phase);
180 if(iabs[0] == 0 && iabs[1] == 0 && iabs[2] == 0) {
182 (delta_k + 2 * ip)[0] = 0;
183 (delta_k + 2 * ip)[1] = 0;
187 gsl_rng_free(lower_rng);
188 gsl_rng_free(this_rng);
190 for(i = 1; i >= 0; i --)
191 for(j = 1; j >= 0; j --) {
#define mymalloc(name, size)
static void SETSEED(PMDesc *pm, unsigned int *table[2][2], int i, int j, gsl_rng *rng)
static void SAMPLE(gsl_rng *rng, double *ampl, double *phase)
static void pmic_fill_gaussian_gadget(PMDesc *pm, double *delta_k, int seed, int setUnitaryAmplitude, int setInvertPhase)
static unsigned int GETSEED(PMDesc *pm, unsigned int *table[2][2], int i, int j, int d1, int d2)
struct PMDesc::@16 ORegion