Nbody6
 All Files Functions Variables
data.f
Go to the documentation of this file.
1  SUBROUTINE data
2 *
3 *
4 * Initial conditions.
5 * -------------------
6 *
7  include 'common6.h'
8  REAL*8 ran2
9 *
10 *
11 * Initialize the portable random number generator (range: 0 to 1).
12  kdum = -1
13  rn1 = ran2(kdum)
14 * Skip the first random numbers (IDUM1 specified at input).
15  DO 1 k = 1,idum1
16  rn1 = ran2(kdum)
17  1 CONTINUE
18 *
19 * Save random number sequence in COMMON for future use.
20  idum1 = kdum
21 *
22 * Read IMF parameters, # primordials, Z-abundance, epoch & HR interval.
23  READ (5,*) alphas, body1, bodyn, nbin0, nhi0, zmet, epoch0, dtplot
24  IF (n + 2*nbin0 + 2*nhi0.GE.nmax - 2) THEN
25  WRITE (6,2) n, nbin0, nhi0
26  2 FORMAT (' FATAL ERROR! BAD INPUT N NBIN0 NHI0 ',i7,2i6)
27  stop
28  END IF
29  IF (zmet.LE.0.0d0) zmet = 1.0d-04
30  IF (zmet.GT.0.03) zmet = 0.03
31  IF (kz(12).GT.0) dtplot = max(dtplot,deltat)
32 *
33  IF (kz(19).GE.3) THEN
34  CALL zcnsts(zmet,zpars)
35  WRITE (6,4) zpars(11), zpars(12), zmet
36  4 FORMAT (//,12x,'ABUNDANCES: X =',f6.3,' Y =',f6.3,
37  & ' Z =',f7.4)
38  END IF
39 *
40 * Check options for reading initial conditions from input file.
41  IF (kz(22).GE.2.OR.kz(22).EQ.-1) THEN
42  zmass = 0.0
43  DO 5 i = 1,n
44  READ (10,*) body(i), (x(k,i),k=1,3), (xdot(k,i),k=1,3)
45  zmass = zmass + body(i)
46  5 CONTINUE
47 * Include possibility of a new IMF via option #20.
48  IF (kz(22).GT.2.OR.kz(22).EQ.-1) go to 50
49  END IF
50 *
51 * Include optional initial conditions on #10 in astrophysical units.
52 * IF (KZ(22).EQ.-1) THEN
53 * CALL SETUP2
54 * GO TO 30
55 * END IF
56 *
57 * Include the case of equal masses (ALPHAS = 1 or BODY1 = BODYN).
58  IF (alphas.EQ.1.0.OR.body1.EQ.bodyn) THEN
59  DO 10 i = 1,n
60  body(i) = 1.0
61  10 CONTINUE
62 * Set provisional total mass (rescaled in routine SCALE).
63  zmass = float(n)
64  go to 40
65  END IF
66 *
67 * Choose between two realistic IMF's and standard Salpeter function.
68  IF (kz(20).EQ.1) THEN
69  CALL imf(body1,bodyn)
70  go to 30
71  ELSE IF (kz(20).GE.2) THEN
72  CALL imf2(body1,bodyn)
73  go to 30
74  END IF
75 * Assign #20 = 0 for no new IMF and no scaling with input on fort.10.
76  IF (kz(22).EQ.2.AND.kz(20).EQ.0) go to 50
77 *
78  WRITE (6,15) alphas, body1, bodyn
79  15 FORMAT (/,12x,'STANDARD IMF ALPHAS =',f5.2,
80  & ' BODY1 =',f5.1,' BODYN =',f5.2)
81 *
82 * Generate a power-law mass function with exponent ALPHAS.
83  alpha1 = alphas - 1.0
84  fm1 = 1.0/body1**alpha1
85  fmn = (fm1 - 1.0/bodyn**alpha1)/(float(n) - 1.0)
86  zmass = 0.0d0
87  const = 1.0/alpha1
88 *
89 * Assign individual masses sequentially.
90  DO 20 i = 1,n
91  fmi = fm1 - float(i - 1)*fmn
92  body(i) = 1.0/fmi**const
93  zmass = zmass + body(i)
94  20 CONTINUE
95 *
96 * Scale the masses to <M> = 1 for now and set consistent total mass.
97  30 zmbar1 = zmass/float(n)
98  DO 35 i = 1,n
99  body(i) = body(i)/zmbar1
100  35 CONTINUE
101  zmass = float(n)
102 *
103 * Set up initial coordinates & velocities (uniform or Plummer model).
104  40 IF (kz(22).EQ.0.OR.kz(22).EQ.1) THEN
105  CALL setup
106  END IF
107 *
108  50 RETURN
109 *
110  END