aboutsummaryrefslogtreecommitdiff
path: root/src/diffraction.c
diff options
context:
space:
mode:
authorThomas White <taw@bitwiz.org.uk>2009-11-17 12:04:02 +0100
committerThomas White <taw@bitwiz.org.uk>2009-11-17 12:04:02 +0100
commit490b52e0864c336ec1eede32c7bd8e6340fac762 (patch)
treefc228ff33215098b970c8283826fc97820a7b5d9 /src/diffraction.c
parentd3459eb9d394ebebeed58141843748c2d69eb284 (diff)
Whitespace
Diffstat (limited to 'src/diffraction.c')
-rw-r--r--src/diffraction.c93
1 files changed, 47 insertions, 46 deletions
diff --git a/src/diffraction.c b/src/diffraction.c
index 4f5a1d1d..9fcde28b 100644
--- a/src/diffraction.c
+++ b/src/diffraction.c
@@ -35,28 +35,28 @@ static double lattice_factor(struct threevec q, double ax, double ay, double az,
Udotq.u = (ax*q.u + ay*q.v + az*q.w)/2.0;
Udotq.v = (bx*q.u + by*q.v + bz*q.w)/2.0;
Udotq.w = (cx*q.u + cy*q.v + cz*q.w)/2.0;
-
+
if ( na > 1 ) {
f1 = sin(2.0*M_PI*(double)na*Udotq.u)
/ sin(2.0*M_PI*Udotq.u);
} else {
f1 = 1.0;
}
-
+
if ( nb > 1 ) {
f2 = sin(2.0*M_PI*(double)nb*Udotq.v)
/ sin(2.0*M_PI*Udotq.v);
} else {
f2 = 1.0;
}
-
+
if ( nc > 1 ) {
f3 = sin(2.0*M_PI*(double)nc*Udotq.w)
/ sin(2.0*M_PI*Udotq.w);
} else {
f3 = 1.0;
}
-
+
return f1 * f2 * f3;
}
@@ -134,22 +134,22 @@ static complex molecule_factor(struct molecule *mol, struct threevec q,
int i;
double F = 0.0;
double s;
-
+
s = modulus(q.u, q.v, q.w);
-
+
for ( i=0; i<mol->n_species; i++ ) {
double complex sfac;
double complex contrib = 0.0;
struct mol_species *spec;
int j;
-
+
spec = mol->species[i];
-
+
for ( j=0; j<spec->n_atoms; j++ ) {
-
+
double ph;
-
+
ph= q.u*spec->x[j] + q.v*spec->y[j] + q.w*spec->z[j];
contrib += cos(2.0*M_PI*ph) + I*sin(2.0*M_PI*ph);
}
@@ -157,7 +157,7 @@ static complex molecule_factor(struct molecule *mol, struct threevec q,
sfac = get_sfac(spec->species, en);
F += sfac * contrib * exp(-2.0 * spec->B[j] * s);
}
-
+
return F;
}
@@ -169,11 +169,11 @@ static struct molecule *load_molecule()
char line[1024];
char *rval;
int i;
-
+
mol = malloc(sizeof(struct molecule));
if ( mol == NULL ) return NULL;
mol->n_species = 0;
-
+
fh = fopen("molecule.pdb", "r");
if ( fh == NULL ) {
fprintf(stderr, "Couldn't open file\n");
@@ -181,18 +181,18 @@ static struct molecule *load_molecule()
}
do {
-
+
char el[4];
int i, r;
int done = 0;
float x, y, z, occ, B;
char *coords;
-
+
rval = fgets(line, 1023, fh);
-
+
/* Only interested in atoms */
if ( strncmp(line, "HETATM", 6) != 0 ) continue;
-
+
/* The following crimes against programming style
* were brought to you by Wizbit Enterprises, Inc. */
if ( line[76] == ' ' ) {
@@ -203,44 +203,44 @@ static struct molecule *load_molecule()
el[1] = line[77];
el[2] = '\0';
}
-
+
coords = line + 29;
r = sscanf(coords, "%f %f %f %f %f", &x, &y, &z, &occ, &B);
if ( r != 5 ) {
fprintf(stderr, "WTF?\n");
abort();
}
-
+
for ( i=0; i<mol->n_species; i++ ) {
-
+
struct mol_species *spec;
int n;
-
+
spec = mol->species[i];
-
+
if ( strcmp(spec->species, el) != 0 ) continue;
-
-
+
+
n = mol->species[i]->n_atoms;
-
+
spec->x[n] = x;
spec->y[n] = y;
spec->z[n] = z;
spec->occ[n] = occ;
spec->B[n] = B;
mol->species[i]->n_atoms++;
-
+
done = 1;
-
+
}
-
+
if ( !done ) {
-
+
/* Need to create record for this species */
struct mol_species *spec;
-
+
spec = malloc(sizeof(struct mol_species));
-
+
memcpy(spec->species, el, 4);
spec->x[0] = x;
spec->y[0] = y;
@@ -248,23 +248,23 @@ static struct molecule *load_molecule()
spec->occ[0] = occ;
spec->B[0] = B;
spec->n_atoms = 1;
-
+
mol->species[mol->n_species] = spec;
mol->n_species++;
-
+
}
-
-
+
+
} while ( rval != NULL );
-
+
fclose(fh);
-
+
printf("There are %i species\n", mol->n_species);
for ( i=0; i<mol->n_species; i++ ) {
printf("'%s': %i\n", mol->species[i]->species,
mol->species[i]->n_atoms);
}
-
+
return mol;
}
@@ -275,33 +275,34 @@ void get_diffraction(struct image *image, UnitCell *cell)
double ax, ay, az;
double bx, by, bz;
double cx, cy, cz;
-
+
/* Generate the array of reciprocal space vectors in image->qvecs */
get_ewald(image);
image->molecule = load_molecule();
if ( image->molecule == NULL ) return;
-
+
cell_get_cartesian(cell, &ax, &ay, &az,
&bx, &by, &bz,
&cx, &cy, &cz);
-
+
image->sfacs = malloc(image->width * image->height * sizeof(complex));
-
+
for ( x=0; x<image->width; x++ ) {
for ( y=0; y<image->height; y++ ) {
-
+
double f_lattice;
complex f_molecule;
struct threevec q;
-
+
q = image->qvecs[x + image->width*y];
-
+
f_lattice = lattice_factor(q, ax,ay,az,bx,by,bz,cx,cy,cz);
f_molecule = molecule_factor(image->molecule, q,
image->xray_energy);
-
+
image->sfacs[x + image->width*y] = f_lattice * f_molecule;
}
+ printf("x=%i\n", x);
}
}