https://github.com/florentrenaud/nbody6tt
Tip revision: 8a4716382ead3ece116c48a4ae5c65f8c9534437 authored by Florent on 29 January 2015, 12:19:28 UTC
Nbody6 - 29 January 2015 (added GPU2/Build/.gitkeep)
Nbody6 - 29 January 2015 (added GPU2/Build/.gitkeep)
Tip revision: 8a47163
merge2.f
SUBROUTINE MERGE2
*
*
* Merging of double hierarchy.
* ----------------------------
*
INCLUDE 'common6.h'
COMMON/BINARY/ CM(4,MMAX),XREL(3,MMAX),VREL(3,MMAX),
& HM(MMAX),UM(4,MMAX),UMDOT(4,MMAX),TMDIS(MMAX),
& NAMEM(MMAX),NAMEG(MMAX),KSTARM(MMAX),IFLAG(MMAX)
CHARACTER*11 WHICH1
*
*
* COMMON variables for merge procedure
* ************************************
*
* ------------------------------------------------------------------
* CM Component masses of merged binary (2nd binary in CM(3&4)).
* HM Binding energy per unit mass of merged binary.
* KSTARM Roche stage indicator (KSTAR for 1st c.m.; ghost is OK).
* NAMEG Name of the associated ghost component.
* NAMEM Name of new c.m. (< 0) for identification of merger index.
* NMERG Total number of mergers.
* NMERGE Current number of merged binaries (maximum is MMAX).
* UM Regularized coordinates of merged binary.
* UMDOT Regularized velocity of merged binary.
* VREL Relative velocity of merged binary components.
* XREL Relative coordinates of merged binary components.
* ------------------------------------------------------------------
*
*
* Ensure that the hierarchy is retained as primary KS pair.
IF (NAME(N+KSPAIR).GT.0) THEN
K = KSPAIR
KSPAIR = JCOMP - N
JCOMP = N + K
END IF
*
* Select deepest level as primary in case of two hierarchies.
IF (NAME(N+KSPAIR).LT.0.AND.NAME(JCOMP).LT.0) THEN
* Note possibility of a quartet (or even quintet) and triple.
IF (NAME(JCOMP).LT.NAME(N+KSPAIR)) THEN
K = KSPAIR
KSPAIR = JCOMP - N
JCOMP = N + K
END IF
END IF
*
* Set pair index & c.m. of inner binary and save outer component.
IPAIR = KSPAIR
I = N + IPAIR
JCOMP1 = JCOMP
ICOMP1 = I
I1 = 2*IPAIR - 1
I2 = I1 + 1
SEMI = -0.5*BODY(I)/H(IPAIR)
ECC2 = (1.0 - R(IPAIR)/SEMI)**2 + TDOT2(IPAIR)**2/(BODY(I)*SEMI)
ECC = SQRT(ECC2)
*
* Produce diagnostics for [[B,S],B] quintuplet or sextuplet system.
IF (NAME(JCOMP).GT.NZERO) THEN
RI2 = 0.0
DO 2 K = 1,3
RI2 = RI2 + (X(K,I) - RDENS(K))**2
2 CONTINUE
RI = SQRT(RI2)
EB = 0.5*BODY(I1)*BODY(I2)/SEMI
EB = EB*FLOAT(N-NPAIRS)/ZKIN
EB = MIN(EB,999.9D0)
ZM = (BODY(I) + BODY(JCOMP))*SMU
CALL FINDJ(I,JG,IM)
* Check possible extension of next look-up time (skip GR case).
IF (KZ(19).GE.3.AND.KZ(27).LT.3) THEN
JLIST(1) = I1
JLIST(2) = I2
JLIST(3) = 2*(JCOMP - N) - 1
JLIST(4) = JLIST(3) + 1
JLIST(5) = JG
CALL NEWTEV(5,IX)
END IF
WHICH1 = ' QUINTUPLET'
IF (JG.GT.N) WHICH1 = ' SEXTUPLET '
WRITE (6,5) WHICH1, TIME+TOFF, ZM, NAME(I1), NAME(I2),
& NAME(JCOMP), RI, ECC, EB, SEMI,PCRIT,GAMMA(IPAIR)
5 FORMAT (/,' NEW',A11,' T MT NM1 NM2 NM3 RI E0 EB0 A0 PC G0',
& F10.2,F6.2,3I6,2F6.2,F6.1,1P,3E10.2)
END IF
*
* Check for [[B,S],S] quartet or [[B,B],S] quintuplet.
IF (NAME(JCOMP).GT.0.AND.NAME(JCOMP).LE.NZERO) THEN
CALL FINDJ(I,JG,IM)
IF (KZ(19).GE.3.AND.KZ(27).LT.3) THEN
JLIST(1) = I1
JLIST(2) = I2
JLIST(3) = JCOMP
JLIST(4) = JG
CALL NEWTEV(4,IX)
END IF
ZM = (BODY(I) + BODY(JCOMP))*SMU
IF (JG.LE.N.AND.JCOMP.LE.N) THEN
WRITE (6,7) TIME+TOFF, ZM, NAME(I1), NAME(I2),
& NAME(JCOMP), ECC, SEMI, PCRIT, GAMMA(IPAIR)
7 FORMAT (/,' NEW QUARTET T MT NM1 NMG NM3 E0 A0 PC G0 ',
& F9.2,F6.2,3I6,F6.2,1P,3E10.2)
ELSE
WRITE (6,8) TIME+TOFF, ZM, NAME(I1), NAME(I2),
& NAME(JCOMP), ECC, SEMI, PCRIT, GAMMA(IPAIR)
8 FORMAT (/,' NEW QUINTUP2 T MT NM1 NMG NM3 E0 A0 PC G0',
& F10.2,F6.2,3I6,F6.2,1P,3E10.2)
END IF
END IF
*
* Include diagnostics for double triple as [[B,S],[B,S]].
IF (NAME(JCOMP).LT.0) THEN
JPAIR = JCOMP - N
J1 = 2*JPAIR - 1
CALL FINDJ(I1,JI,IM)
CALL FINDJ(J1,JJ,JM)
IF (KZ(19).GE.3.AND.kZ(27).LT.3) THEN
JLIST(1) = I1
JLIST(2) = I2
JLIST(3) = J1
JLIST(4) = J1 + 1
JLIST(5) = JI
JLIST(6) = JJ
CALL NEWTEV(6,IX)
END IF
AI = -0.5*(CM(1,IM) + CM(2,IM))/HM(IM)
AJ = -0.5*(CM(1,JM) + CM(2,JM))/HM(JM)
ZM = (BODY(I) + BODY(JCOMP))*SMU
GX = MAX(GAMMA(IPAIR),GAMMA(JPAIR))
WRITE (6,10) TIME+TOFF, ZM, NAME(I1), NAME(I2), NAME(J1),
& NAME(2*JPAIR), ECC, AI, AJ, R(IPAIR), R(JPAIR),
& PCRIT, GX
10 FORMAT (/,' NEW HITRIP T MT NM E0 AI AJ RI RJ PC GX ',
& F9.2,F6.2,4I6,F6.2,1P,6E10.2)
END IF
*
* Ensure correct coordinates & velocities.
CALL RESOLV(IPAIR,3)
*
* Check optional diagnostics for hierarchy.
IF ((KZ(18).EQ.1.OR.KZ(18).EQ.3).AND.KSTAR(I).LE.20) THEN
CALL HIARCH(IPAIR)
END IF
*
* Increase merger counter and set current merger index.
NMERG = NMERG + 1
NMERGE = NMERGE + 1
IMERGE = NMERGE
*
* Save component masses and evaluate reduced mass of inner binary.
CM(1,IMERGE) = BODY(2*IPAIR-1)
CM(2,IMERGE) = BODY(2*IPAIR)
CM(3,IMERGE) = 0.0D0
ZMU = BODY(2*IPAIR-1)*BODY(2*IPAIR)/BODY(N+IPAIR)
*
* Set current energy of any second perturbed binary (from XVPRED).
IF (JCOMP.GT.N) THEN
CALL XVPRED(JCOMP,-1)
JPAIR = JCOMP - N
IF (LIST(1,2*JPAIR-1).GT.0) H(JPAIR) = HT
* Ensure that outer binary components are resolved.
CALL KSRES(JPAIR,J1,J2,0.0D0)
* Enforce non-zero membership for potential correction in NBPOT.
LIST(1,2*JPAIR-1) = 1
ELSE
CALL XVPRED(JCOMP,-1)
END IF
*
* Save the neighbours for correction procedure.
NNB = LIST(1,I)
DO 20 L = 1,NNB
J = LIST(L+1,I)
JPERT(L) = J
20 CONTINUE
*
* Retain basic KS variables for explicit restart at merge termination.
HM(IMERGE) = H(IPAIR)
DO 25 K = 1,4
UM(K,IMERGE) = U(K,IPAIR)
UMDOT(K,IMERGE) = UDOT(K,IPAIR)
25 CONTINUE
*
* Save stellar type.
KSTARM(IMERGE) = KSTAR(I)
*
* Predict outer component to highest order if not on the block.
IF (TIME - T0(JCOMP1).GT.0.0D0) THEN
CALL XVPRED(JCOMP1,-1)
END IF
*
* Set temporary KS components for hierarchical binary.
ICOMP = 2*IPAIR - 1
JCOMP = ICOMP + 1
*
* Obtain potential energy with respect to inner components.
JLIST(1) = ICOMP
JLIST(2) = JCOMP
CALL NBPOT(2,NNB,POT1)
*
* Save relative configuration.
DO 30 K = 1,3
XREL(K,IMERGE) = X(K,ICOMP) - X(K,JCOMP)
VREL(K,IMERGE) = X0DOT(K,ICOMP) - X0DOT(K,JCOMP)
* Initialize primary velocity of JCOMP1 (needed in KSIN2).
X0DOT(K,JCOMP1) = XDOT(K,JCOMP1)
30 CONTINUE
*
* Include interaction of inner c.m. & neighbours before making new KS.
ICOMP = ICOMP1
JLIST(1) = ICOMP
CALL NBPOT(1,NNB,POT2)
*
* Copy mass of intruder to second KS component.
BODY(JCOMP) = BODY(JCOMP1)
*
* Replace name of #JCOMP with c.m. name (temporary for diagnostics).
NAME2 = NAME(JCOMP)
NAME(JCOMP) = NAME(JCOMP1)
*
* Form new c.m. and initialize KS variables (JPERT safe first call!).
JCOMP = JCOMP1
CALL KSIN2(1)
*
* See whether modifications due to second binary are needed.
POT3 = 0.0D0
POT4 = 0.0D0
IF (JCOMP1.LE.N) GO TO 50
*
* Initialize unperturbed ghost binary of outer component.
T0(2*JPAIR-1) = 1.0E+06
LIST(1,2*JPAIR-1) = 0
*
* Apply tidal correction for outer binary perturbers.
JLIST(1) = 2*JPAIR - 1
JLIST(2) = 2*JPAIR
CALL NBPOT(2,NNB,POT3)
JLIST(1) = JCOMP1
CALL NBPOT(1,NNB,POT4)
*
* Update the merger energy to maintain conservation.
EB1 = BODY(2*JPAIR-1)*BODY(2*JPAIR)*H(JPAIR)/BODY(JCOMP1)
EMERGE = EMERGE + EB1
*
* Save component masses and initialize ghost components.
CM(3,IMERGE) = BODY(2*JPAIR-1)
CM(4,IMERGE) = BODY(2*JPAIR)
BODY(2*JPAIR-1) = 0.0D0
BODY(2*JPAIR) = 0.0D0
LIST(1,JCOMP) = 0
*
* Remove ghost from all neighbour lists.
50 JLIST(1) = JCOMP1
ICM = N + KSPAIR
CALL NBREM(ICM,1,NNB)
*
* Specify JCOMP1 as ghost of zero mass.
BODY(JCOMP1) = 0.0D0
*
* Initialize integration variables to prevent spurious predictions.
DO 60 K = 1,3
X0DOT(K,JCOMP1) = 0.0D0
XDOT(K,JCOMP1) = 0.0D0
F(K,JCOMP1) = 0.0D0
FDOT(K,JCOMP1) = 0.0D0
D2(K,JCOMP1) = 0.0D0
D3(K,JCOMP1) = 0.0D0
D2R(K,JCOMP1) = 0.0D0
D3R(K,JCOMP1) = 0.0D0
60 CONTINUE
*
* Set large value of T0 which avoids integration of ghost particle.
T0(JCOMP1) = 1.0E+06
* Set large X0 & X to avoid perturber selection (no escape removal).
X0(1,JCOMP1) = 1.0E+06
X(1,JCOMP1) = 1.0E+06
*
* Initialize c.m. & KS polynomials.
ICOMP = 2*IPAIR - 1
JCOMP = ICOMP + 1
CALL KSIN2(2)
*
* Define large negative c.m. name for identification & termination.
NAME(ICM) = NAME(ICM) - 3*NZERO
*
* Set c.m. & ghost names for merger identification (include escape).
NAMEM(IMERGE) = NAME(ICM)
NAMEG(IMERGE) = NAME(JCOMP1)
NAME(JCOMP) = NAME2
*
* Copy stability limit for termination test A(1 - E) < R0 in KSINT.
R0(IPAIR) = PCRIT
*
* Update merger energy to maintain conservation.
DPHI = (POT2 - POT1) + (POT4 - POT3)
EMERGE = EMERGE + ZMU*HM(IMERGE) + DPHI
*
* Set IPHASE < 0 for new time-step list in routine INTGRT.
IPHASE = -1
*
RETURN
*
END