summaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.target/powerpc/pr64019.c
blob: d90c4800a1e35587b5da8ea6bf00e977541f2720 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
/* { dg-do compile { target { powerpc*-*-* } } } */
/* { dg-skip-if "" { powerpc*-*-darwin* } } */
/* { dg-require-effective-target powerpc_vsx_ok } */
/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power7" } } */
/* { dg-options "-O2 -ffast-math -mcpu=power7" } */

#include <math.h>

typedef struct
{
  double x, y, z;
  double q, a, b, mass;
  double vx, vy, vz, vw, dx, dy, dz;
}
ATOM;
int
u_f_nonbon (lambda)
     double lambda;
{
  double r, r0, xt, yt, zt;
  double lcutoff, cutoff, get_f_variable ();
  double rdebye;
  int inbond, inangle, i;
  ATOM *a1, *a2, *bonded[10], *angled[10];
  ATOM *(*use)[];
  int uselist (), nuse, used;
  ATOM *cp, *bp;
  int a_number (), inbuffer;
  double (*buffer)[], xx, yy, zz, k;
  int invector, atomsused, ii, jj, imax;
  double (*vector)[];
  ATOM *(*atms)[];
  double dielectric;
  rdebye = cutoff / 2.;
  dielectric = get_f_variable ("dielec");
  imax = a_number ();
  for (jj = 1; jj < imax; jj++, a1 = bp)
    {
      if ((*use)[used] == a1)
	{
	  used += 1;
	}
      while ((*use)[used] != a1)
	{
	  for (i = 0; i < inbuffer; i++)
	    {
	    }
	  xx = a1->x + lambda * a1->dx;
	  yy = a1->y + lambda * a1->dy;
	  zz = a1->z + lambda * a1->dz;
	  for (i = 0; i < inbuffer; i++)
	    {
	      xt = xx - (*buffer)[3 * i];
	      yt = yy - (*buffer)[3 * i + 1];
	      zt = zz - (*buffer)[3 * i + 2];
	      r = xt * xt + yt * yt + zt * zt;
	      r0 = sqrt (r);
	      xt = xt / r0;
	      zt = zt / r0;
	      k =
		-a1->q * (*atms)[i]->q * dielectric * exp (-r0 / rdebye) *
		(1. / (rdebye * r0) + 1. / r);
	      k += a1->a * (*atms)[i]->a / r / r0 * 6;
	      k -= a1->b * (*atms)[i]->b / r / r / r0 * 12;
	      (*vector)[3 * i] = xt * k;
	      (*vector)[3 * i + 1] = yt * k;
	      (*vector)[3 * i + 2] = zt * k;
	    }
	}
    }
}