Nbody6
 All Files Functions Variables
xtrnlv.f
Go to the documentation of this file.
1  SUBROUTINE xtrnlv(I1,I2)
2 *
3 *
4 * External potential and virial energy.
5 * -------------------------------------
6 *
7  include 'common6.h'
8  common/galaxy/ gmg,rg(3),vg(3),fg(3),fgd(3),tg,
9  & omega,disk,a,b,v02,rl2,gmb,ar,gam,zdum(7)
10  REAL*8 xi(3),xidot(3),firr(3),freg(3),fd(3),fdr(3)
11  SAVE first
12  LOGICAL first
13  DATA first /.true./
14 *
15 *
16  et = 0.0d0
17 * Skip external potential during scaling (parameters not defined).
18  IF (first.AND.time.EQ.0.0d0) THEN
19  first = .false.
20  go to 30
21 * Treat all cases uniformly (but note Coliolis term in FIRR).
22  ELSE IF (kz(14).LE.4.AND.i2.NE.i1) THEN
23  vir = 0.0
24  DO 5 i = i1,i2
25  DO 2 k = 1,3
26 * Initialize scalars for force contributions.
27  xi(k) = x(k,i)
28  xidot(k) = xdot(k,i)
29  firr(k) = 0.0
30  freg(k) = 0.0
31  fd(k) = 0.0
32  fdr(k) = 0.0
33  2 CONTINUE
34 * Evaluate the virial energy using definition sum {m*r*F}.
35  CALL xtrnlf(xi,xidot,firr,freg,fd,fdr,1)
36 * Note that FIRR(K) only contributes for #14 = 1 or 2.
37  DO 4 k = 1,3
38  vir = vir + body(i)*xi(k)*(firr(k) + freg(k))
39  4 CONTINUE
40  5 CONTINUE
41 * Quit for pure 3D tidal field (case of full N summation).
42  IF (kz(14).EQ.3) go to 40
43 * Note ETIDE is accumulated after each regular step (REGINT/GPUCOR).
44  END IF
45 *
46 * See whether to include a linearized galactic tidal force.
47  IF (kz(14).LE.2) THEN
48  DO 10 i = i1,i2
49  et = et - 0.5d0*body(i)*(tidal(1)*x(1,i)**2 +
50  & tidal(3)*x(3,i)**2)
51  10 CONTINUE
52  ELSE IF (kz(14).EQ.3) THEN
53 * Retain 3D potential energy expressions for future use.
54  i = i1
55  rg2 = 0.0
56  ri2 = 0.0
57  DO 20 k = 1,3
58  xi(k) = x(k,i)
59  rg2 = rg2 + rg(k)**2
60  ri2 = ri2 + (rg(k) + xi(k))**2
61  20 CONTINUE
62 *
63 * Include galaxy point mass term for body #I in differential form.
64  IF (gmg.GT.0.0d0) THEN
65  et = et + gmg*(1.0/sqrt(ri2) - 1.0/sqrt(rg2))
66  END IF
67 *
68 * Check contribution from gamma/eta bulge potential.
69  IF (gmb.GT.0.0d0) THEN
70  IF (gam.NE.2.0d0) THEN
71  rrg = 1.0 - (1.0 + ar/sqrt(rg2))**(gam-2.0)
72  rri = 1.0 - (1.0 + ar/sqrt(ri2))**(gam-2.0)
73  et = et + gmb/(ar*(2.0-gam))*(rri-rrg)
74  ELSE
75  rrg = 1.0 + ar/sqrt(rg2)
76  rri = 1.0 + ar/sqrt(ri2)
77  et = et + gmb/ar*log(rrg/rri)
78  ENDIF
79  END IF
80 *
81 * Add optional Miyamoto disk potential.
82  IF (disk.GT.0.0d0) THEN
83  r2 = (rg(1) + xi(1))**2 + (rg(2) + xi(2))**2
84  bz = sqrt(b**2 + (rg(3) + xi(3))**2)
85  az = sqrt(r2 + (a + bz)**2)
86  r20 = rg(1)**2 + rg(2)**2
87  bz0 = sqrt(b**2 + rg(3)**2)
88  az0 = sqrt(r20 + (a + bz0)**2)
89  et = et + disk*(1.0/az - 1.0/az0)
90  END IF
91 *
92 * Check addition of differential logarithmic potential.
93  IF (v02.GT.0.0d0) THEN
94  et = et + 0.5*v02*(log(ri2) - log(rg2))
95  END IF
96 * Form the differential potential energy due to tides.
97  et = body(i)*et
98  END IF
99 *
100 * Place sum in ETIDE and single particle contribution in HT.
101  30 IF (i2.GT.i1) THEN
102  etide = et
103  ELSE
104  ht = et
105  END IF
106 *
107  40 RETURN
108 *
109  END