1C
2C$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
3C WRTOUT
4C$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
5 SUBROUTINE WRTOUT(HCOMP,HD,HL,HP,HR,HS,HS1,HT,LC,M,MODEL,DAGE,
6 * *DDAGE,SMASS,TEFFL,BL,GL,LSHELL,JXBEG,JXMID,JXEND,JCORE,JENV,
7 * *TLUMX,TRIT,TRIL,PS,TS,RS,CFENV,FTRI,HSTOT,OMEGA,LPUNCH,
8C * FP,FT,ETA2,R0,HJM,HI,SJTOT,SKEROT,HS2,NKK) ! KC 2025-05-31
9 * * FP,FT,ETA2,R0,HJM,HI,SJTOT,SKEROT,HS2,CMIXL,XMSOL,COMPMIX)
10C 10/15/26 MHP via Claude
11C code changed to take JSON from DIMENSIONS_MOD instead of declaring
12C PARAMETER(JSON=5000) here.
13 USE DIMENSIONS_MOD
14C 10/14/26 MHP via Claude
15C code changed to convert COMMON/LABEL/ into LABEL_MOD.
16 USE LABEL_MOD
17C 10/14/26 MHP via Claude
18C code changed to convert COMMON/ACDPTH/ into ACDPTH_MOD.
19 USE ACDPTH_MOD
20C 10/14/26 MHP via Claude
21C code changed to convert COMMON/SCRTCH/ into SCRTCH_MOD.
22 USE SCRTCH_MOD
23C 10/14/26 MHP via Claude
24C code changed to convert COMMON/OVRTRN/ into OVRTRN_MOD.
25 USE OVRTRN_MOD
26C 10/14/26 MHP via Claude
27C code changed to convert COMMON/FLUXES/ into FLUXES_MOD.
28 USE FLUXES_MOD
29C 10/14/26 MHP via Claude
30C code changed to convert COMMON/DEBHU/ into DEBHU_MOD.
31 USE DEBHU_MOD
32C 10/14/26 MHP via Claude
33C code changed to convert COMMON/COMP/ into COMP_MOD.
34 USE COMP_MOD
35C 10/14/26 MHP via Claude
36C code changed to convert COMMON/CENT/ into CENT_MOD.
37 USE CENT_MOD
38C 10/14/26 MHP via Claude
39C code changed to convert COMMON/NMLPAR/ into NMLPAR_MOD.
40 USE NMLPAR_MOD
41C 10/14/26 MHP via Claude
42C code changed to convert COMMON/CONSTANTS/ into CONSTANTS_MOD.
43 USE CONSTANTS_MOD
44C 10/14/26 MHP via Claude
45C code changed to convert COMMON/IOUNITS/ into IOUNITS_MOD.
46 USE IOUNITS_MOD
47C 10/20/26 MHP via Claude
48C code changed to replace implicit typing with IMPLICIT NONE and
49C explicit declarations.
50 IMPLICIT NONE
51 REAL*8 AMU,BETA,BETA14,BETAI,BL,BOLM,CFENV,CLSNUF,CMIXL,COREM,
52 * * CORER,CORERL,CZSURF_D,CZSURF_DL,CZSURF_O,CZSURF_P,
53 * * CZSURF_PL,CZSURF_RL,CZSURF_T,CZSURF_TL,D,DAGE,DD1,DD2,
54 * * DDAGE,DELA,DL,EMU,ETA,ETA2,FITMAS,FL115IN,FL37CL,FL71GA,
55 * * FL7LI,FL81BR,FL98MO,FP,FT,FTRI,FX,FX2,FXION,GASNUF,GL,
56 * * HCOMP,HD,HI,HICZ,HITOT,HJM,HL,HP,HR,HS,HS1,HS2,HSB,HSTOT,
57 * * HT,OMEGA,P,PL,PS,QAP,QAT,QCP,QCPP,QCPT,QDP,QDT,QDTP,QDTT,
58 * * R0,RL,RLMAX,RMU,ROTP,ROTV,RRR1,RRR2,RRR3,RS,SJTOT,SKEROT,
59 * * SMASS,SS1,SS2,SS3,SS4,SSS1,SSS2,SSS3,T,TEFFL,TEMP,THL,TL,
60 * * TLMAX,TLUMX,TRIL,TRIT,TS,X,XMSOL,Z
61 INTEGER I,ICHECK,ITMAX,IWRITE,J,JCORE,JENV,JXBEG,JXEND,JXMID,K,
62 * * KSAHA,M,MODEL
63 LOGICAL*4 LATMO,LC,LCMAX,LDERIV,LPUNCH,LSHELL,LTSCAL
64C 10/13/26 MHP via Claude
65C COMPMIX arrives as an argument now that COMMON/I2O/ is gone, and is
66C passed on to PUTSTORE and WRTLST. It must be declared CHARACTER here:
67C implicit typing would make it REAL*8, since C falls in A-H, and nothing
68C would flag that -- F77 does no cross-file interface checking.
69 CHARACTER*4 COMPMIX
70C MHP 8/25 Fscomp file depreciated,unused variables removed
71C CHARACTER*256 FLAST, FFIRST, FRUN, FSTAND, FFERMI,
72C 1 FDEBUG, FTRACK, FSHORT, FMILNE, FMODPT,
73C 2 FSTOR, FPMOD, FPENV, FPATM, FDYN, FISO,
74C 3 FLLDAT, FSNU, FSCOMP, FKUR,
75C 4 FMHD1, FMHD2, FMHD3, FMHD4, FMHD5, FMHD6, FMHD7, FMHD8
76C JVS 0712 for call to envint:
77C REAL*8 DUM1(4),DUM2(3),DUM3(3),DUM4(3)
78C JVS 10/13 for recalculation of taucz
79C REAL*8 DEL1(JSON), DEL2(JSON)
80C end JVS
81C 9/25/26 MHP via Claude
82C code changed to consolidate all I/O logical unit numbers, previously
83C scattered across COMMON/LUOUT/, COMMON/LUNUM/, COMMON/ALEX06/,
84C COMMON/ACDPTH/, COMMON/NEWOPAC/, COMMON/LOPAL95/, COMMON/ATMOS2/,
85C COMMON/ALATM03/, COMMON/OPALEOS/, and COMMON/SCV2/, into a single
86C COMMON/IOUNITS/
87C 9/24/26 MHP via Claude
88C code changed to remove dead ILLDAT, IKUR from COMMON/LUNUM/
89C 9/24/26 MHP via Claude
90C code changed to remove dead IDYN from COMMON/LUNUM/
91C 9/25/26 MHP via Claude
92C code changed to remove dead COMMON/LUNUM/ISCOMP (declared,
93C assigned a unit number, but never opened or read anywhere)
94C COMMON/LUFNM/ FLAST, FFIRST, FRUN, FSTAND, FFERMI,
95C 1 FDEBUG, FTRACK, FSHORT, FMILNE, FMODPT,
96C 2 FSTOR, FPMOD, FPENV, FPATM, FDYN,
97C 3 FLLDAT, FSNU, FSCOMP, FKUR,
98C 4 FMHD1, FMHD2, FMHD3, FMHD4, FMHD5, FMHD6, FMHD7, FMHD8
99C 10/12/26 MHP via Claude
100C code changed to extend COMMON/NMLPAR/ to 234 members, adding the
101C namelist variables that the physics routines read from 27 COMMON
102C blocks which also held derived or working members. Those blocks keep
103C only their non-namelist members; five of them -- NEWMX, VMULT,
104C PMMWIND, CCOUT1 and ENVGEN -- had nothing left and are gone.
105C Derivation-only namelist variables from the same blocks went to
106C COMMON/NMLBYPASS/ instead, not here.
107C
108C Declared identically in all 121 files that hold any of these members.
109C Generated from one member list, so every copy is byte-identical; the
110C linker's 'size of symbol changed' warning is the check that they are.
111C 10/13/26 MHP via Claude: removed the unused COMMON/CCOUT/ declaration
112C (no member referenced here; residue of the obsolete-option removals).
113C 9/25/26 MHP via Claude
114C code changed to merge COMMON/CONST/, COMMON/CONST1/, COMMON/CONST2/,
115C and COMMON/CONST3/ into a single COMMON/CONSTANTS/
116C DBG PULSE
117C 10/13/26 MHP via Claude
118C code changed to drop COMMON/PULSE/, declared here but never used.
119C*** MHP 5/90 ADD COMMON BLOCK FOR GRAVITATIONAL SETTLING.
120C*** MHP 7/91 ADD COMMON BLOCKS FOR SOLAR NEUTRINO I/O.
121C MHP 8/25 Removed character file names from common block
122C DBG 11/11/91
123C 9/25/26 MHP via Claude
124C code changed to remove the LISO isochrone-output option
125C DBG 7/92 COMMON BLOCK ADDED TO COMPUTE DEBYE-HUCKEL CORRECTION.
126C 10/13/26 MHP via Claude
127C code changed to drop COMMON/ROTPRT/, declared here but never used.
128C MHP 4/09 ADDED OPTION TO SCALE THE SATURATION RATE BY THE OVERTURN TIMESCALE
129C 10/13/26 MHP via Claude: removed the unused COMMON/DEUTER/ declaration
130C (no member referenced here; residue of the obsolete-option removals).
131C JVS 01/11 ACOUSTIC DEPTH
132C KC 2025-05-30 reordered common block elements
133C COMMON/ACDPTH/TAUCZN,DELADJ(JSON),TAUHE, TNORM, TCZ, WHE, ICLCD,
134C 9/25/26 MHP via Claude
135C code changed to remove dead IACAT, IJVS, IJENT, IJDEL unit
136C reservations from COMMON/ACDPTH/ (declared but never opened anywhere)
137C *LCLCD, AGEOUT(5), IACAT, IJLAST, LJLAST, LJWRT, LADON,LAOLY, IJVS,
138C JVS 08/13 IF THE CZ IS BEYOND THE FITTING POINT, STORE ITS LOCATION
139C 10/13/26 MHP via Claude
140C code changed to remove COMMON/ENVCZ/: ENVRCZ was written once in
141C envint.f and read nowhere, and RINT was never referenced at all. Its
142C only reader was the commented-out JVS block deleted from wrtout.f
143C earlier in this work, so the block died with it.
144C 10/13/26 MHP via Claude: removed the unused COMMON/SOUND/ declaration
145C (no member referenced here; residue of the obsolete-option removals).
146C G Somers 10/14, Add spot common block
147C 10/13/26 MHP via Claude: removed the unused COMMON/TEMP2/ declaration
148C (no member referenced here; residue of the obsolete-option removals).
149C 10/13/26 MHP via Claude: removed the unused COMMON/ROTEN/ declaration
150C (no member referenced here; residue of the obsolete-option removals).
151C G Somers END
152
153
154C JVS END
155C JVS 10/11 Common block for He3+He3 luminosity
156C 10/13/26 MHP via Claude: removed the unused COMMON/GRAB/ declaration
157C (no member referenced here; residue of the obsolete-option removals).
158C JVS end
159C G Somers 3/17, ADDING NEW TAUCZ COMMON BLOCK
160 DIMENSION FXION(3),TLUMX(8),HCOMP(15,JSON),HD(JSON),HL(JSON),
161 * *HP(JSON),HR(JSON),HS(JSON),HS1(JSON),HT(JSON),LC(JSON),
162 * *PS(3),TS(3),RS(3),CFENV(9),TRIT(3),TRIL(3),OMEGA(JSON),
163 * * FP(JSON),FT(JSON),ETA2(JSON),R0(JSON),HJM(JSON),HI(JSON),
164 * * HS2(JSON), CLSNUF(8),GASNUF(8) ! ID(JSON)
165C MHP 8/96 CROSS SECTIONS OF DIFFERENT NEUTRINOS TO THE CHLORINE
166C AND GALLIUM EXPERIMENTS; TAKEN FROM NEUTRINO ASTROPHYSICS,P.207.
167C note changes in cl37 cross sections (see bahcall and pinsonneault,
168C REV.MOD.PHYS., P.895)
169 DATA GASNUF/1.18D1,2.15D2,7.14D4,7.17D1,2.40D4,6.04D1,
170 * * 1.137D2,1.139D2/
171 DATA CLSNUF/0.0D0,1.6D1,4.26D4,2.4D0,1.14D4,1.7D0,6.8D0,6.9D0/
172
173 DATA ICHECK/0/
174 SAVE
175
176 LTSCAL=.FALSE.
177C RENORMALIZE LUMINOSITY TERMS TLUMX - SKIPPED FOR HE FLASH
178 IF(.NOT.LKUTHE) THEN
179 THL = TLUMX(1)+TLUMX(2)+TLUMX(3)+TLUMX(4)+TLUMX(5)+TLUMX(6)+
180 * * TLUMX(7)+TLUMX(8)
181 TEMP = HL(M)/THL
182 DO 10 I = 1,8
183 TLUMX(I) = TLUMX(I)*TEMP
184 10 10 CONTINUE
185 ENDIF
186C WRITE HEADER FILE DESCRIBING THE GLOBAL PROPERTIES OF THE STAR
187C AND THE CENTRAL CONDITIONS TO THE SHORT OUTPUT FILE
188C THIS INFORMATION IS ALSO WRITTEN TO THE MODEL OUTPUT FILE IF
189C A DETAILED BREAKDOWN OF THE STELLAR STRUCTURE IS TO BE PRINTED
190C FOR THIS MODEL.
191C
192 WRITE(ISHORT,21)
193 20 20 FORMAT(1X,127('*'))
194 21 21 FORMAT(/,1X,127('*'))
195 IF(.NOT.LKUTHE) THEN
196 WRITE(ISHORT,30)MODEL,SMASS,XNEW,ZNEW,DAGE,DDAGE
197 30 30 FORMAT(1X,'MODEL NO.',I5,2X,'MASS',F13.7,2X,'(X,Z)=(',F11.9,
198 * * ',',F11.9,')',2X,'AGE(GYRS)',F14.8,' STEP(YRS)=',F12.0)
199 ELSE
200 WRITE(ISHORT,40)MODEL,SMASS,XNEW,ZNEW,DAGE,DDAGE
201 40 40 FORMAT(1X,'MODEL NO.',I5,2X,'MASS',F13.7,2X,'(X,Z)=(',F11.9,
202 * * ',',F11.9,')',2X,'AGE(GYRS)',F14.8,' STEP(YRS)=',1PE12.4)
203 ENDIF
204C CALCULATE MASS OF CENTRAL AND SURFACE CONVECTION ZONES
205C THESE MASSES ARE IN SOLAR UNITS
206 IF(JCORE.GT.1) THEN
207 COREM = HS1(JCORE)/CMSUN
208 ELSE
209 COREM = 0.0D0
210 ENDIF
211
212C JVS 10/11 Be more care about the true boundary of the convective core
213 IF (JCORE.GT.1) THEN
214 FX2 = (SDEL(3,JCORE+1)-SDEL(1,JCORE))/
215 * * (SDEL(3,JCORE+1)-SDEL(1,JCORE))
216 CORERL = HR(JCORE)+FX*(HR(JCORE+1)-HR(JCORE))-CRSUNL
217 CORER = DEXP(CLN*CORERL)
218 ELSE
219 CORER = 0.0D0
220 ENDIF
221C JVS end
222
223 BOLM = CMBOL-2.5D0*BL
224 RL = 0.5D0*(BL + CLSUNL - C4PIL - CSIGL - 4.0D0*TEFFL)
225 GL = CGL + STOTAL - RL - RL
226C MHP 02/12 MOVED ABOVE SECTION WHERE THESE ARE USED
227C DETERMINE CENTRAL T,P, AND DENSITY USING THE FIRST SHELL VALUES.
228C CENTRAL ETA AND BETA ARE ALSO CALCULATED.
229C EXTRAPOLATE FROM INNER SHELL P AND T TO CENTRAL P AND T
230 TEMP =0.5D0*DEXP(CLN*(CC13*(C4PI3L+HD(1)-HS(1))+HD(1)+CGL+HS(1)))
231 P = DEXP(CLN*HP(1))
232 PL = DLOG10(P + TEMP)
233C SDEL(2,1) IS THE ACTUAL T GRADIENT AT POINT 1( = DEL)
234 TL = HT(1) + DLOG10(1.0D0+ TEMP*SDEL(2,1)/P)
235 DL = HD(1)
236 X = HCOMP(1,1)
237 Z = HCOMP(3,1)
238 LATMO = .TRUE.
239 LDERIV = .FALSE.
240C CALL EQSTAT TO GET TRUE CENTRAL DENSITY, BETA, AND ETA.
241C 9/22/26 MHP via Claude
242C code changed to remove the MHD equation of state
243 IF (LDH) THEN
244 XXDH = HCOMP(1,1)
245 YYDH = HCOMP(2,1)+HCOMP(4,1)
246 ZZDH = HCOMP(3,1)
247 ZDH(1) = HCOMP(5,1)+HCOMP(6,1)
248 ZDH(2) = HCOMP(7,1)+HCOMP(8,1)
249 ZDH(3) = HCOMP(9,1)+HCOMP(10,1)+HCOMP(11,1)
250 END IF
251 CALL EQSTAT(TL,T,PL,P,DL,D,X,Z,BETA,BETAI,BETA14,FXION,RMU,
252 * * AMU,EMU,ETA,QDT,QDP,QCP,DELA,QDTT,QDTP,QAT,QAP,QCPT,QCPP,
253 * * LDERIV,LATMO,KSAHA)
254C MHP 02/12 MOVED ABOVE TO WHERE FIRST USED
255C STORE CENTRAL RHO,P,T FOR LATER USE
256 PCENTER = PL
257 TCENTER = TL
258 DCENTER = DL
259C MHP 02/12 FIXED MINOR GLITCH ON BASE OF THE CONVECTION ZONE
260C PROPERTIES FOR FULLY CONVECTIVE STARS; TCENTER PCENTER RHOCENTER
261C WERE BEING DEFINED AFTER THIS CODE SECTION
262 IF(JENV.LT.M) THEN
263 IF(JENV.GT.1) THEN
264C FIND MASS FRACTION OF THE ZONE EDGE AT BASE OF SURFACE C.Z.
265C JVS 10/11/13 SDEL(1,JENV) IN DENOMINATOR WAS A TYPO. CHANGED TO SDEL(3,JENV)
266C FX = (SDEL(3,JENV)-SDEL(1,JENV-1))/
267C * (SDEL(3,JENV)-SDEL(1,JENV-1))
268 DD2 = SDEL(1,JENV-1)-SDEL(3,JENV-1)
269 DD1 = SDEL(1,JENV)-SDEL(3,JENV)
270 FX = DD2/(DD2-DD1)
271c HSB = 0.5D0*(HS1(JENV)+HS1(JENV-1))
272 HSB = HS1(JENV-1)+FX*(HS1(JENV)-HS1(JENV-1))
273 CZsurf_M = (EXP(CLN*HSTOT) - HSB)/CMSUN
274C ENVLM = SMASS-HS1(JENV-1)/CMSUN
275C HSR = 0.5D0*(10.0D0**HR(JENV)+10.0D0**HR(JENV-1))
276C ENVX = HSR/(10.0D0**RL)
277C MHP 2/98 FIND RADIUS OF CZ BASE
278 CZsurf_RL = HR(JENV-1)+FX*(HR(JENV)-HR(JENV-1))-CRSUNL
279 CZsurf_R = EXP(CLN*CZsurf_RL)
280 CZsurf_O = SO(JENV-1)+FX*(SO(JENV)-SO(JENV-1))
281 CZsurf_TL = HT(JENV-1)+FX*(HT(JENV)-HT(JENV-1))
282 CZsurf_DL = HD(JENV-1)+FX*(HD(JENV)-HD(JENV-1))
283 CZsurf_PL = HP(JENV-1)+FX*(HP(JENV)-HP(JENV-1))
284 CZsurf_T = EXP(CLN*CZsurf_TL)
285 CZsurf_D = EXP(CLN*CZsurf_DL)
286 CZsurf_P = EXP(CLN*CZsurf_PL)
287 ELSE
288 CZsurf_M = SMASS
289 CZsurf_R = 0.0D0
290 CZsurf_T = 10.0D0**TCENTER
291 CZsurf_D = 10.0D0**DCENTER
292 CZsurf_P = 10.0D0**PCENTER
293 CZsurf_O = SO(1)
294 ENDIF
295 ELSE
296 CZsurf_M = 0.0D0
297 CZsurf_R = 0.0D0
298 CZsurf_T = 0.0D0
299 CZsurf_D = 0.0D0
300 CZsurf_P = 0.0D0
301 CZsurf_O = 0.0D0
302 ENDIF
303 WRITE(ISHORT,50)M,XENV0,ZENV0,COREM,CZsurf_M, CZsurf_R
304 50 50 FORMAT(1X,'SHELLS=',I5,2X,'(X0,Z0)=(',F9.7,',',F9.7,')',2X,
305 * *'CONV. ZONE MASSES(MSUN): CORE',F10.7,' ENV.',F10.7,
306 * *' RAD. FRAC.',F10.7)
307 RL = RL - CRSUNL
308 WRITE(ISHORT,60)TEFFL,BOLM,BL,RL,GL
309 60 60 FORMAT(1X,'LOG(TEFF)=',F11.8,' M(BOL)=',F11.7,' LOG(L/LSUN)='
310 * *,F12.8,' LOG(R/RSUN)=',F12.8,' LOG(G) =',F12.8)
311C MHP 02/12 MOVED ABOVE SECTION WHERE THESE ARE USED
312C DETERMINE CENTRAL T,P, AND DENSITY USING THE FIRST SHELL VALUES.
313C CENTRAL ETA AND BETA ARE ALSO CALCULATED.
314C EXTRAPOLATE FROM INNER SHELL P AND T TO CENTRAL P AND T
315C TEMP =0.5D0*DEXP(CLN*(CC13*(C4PI3L+HD(1)-HS(1))+HD(1)+CGL+HS(1)))
316C P = DEXP(CLN*HP(1))
317C PL = DLOG10(P + TEMP)
318C SDEL(2,1) IS THE ACTUAL T GRADIENT AT POINT 1( = DEL)
319C TL = HT(1) + DLOG10(1.0D0+ TEMP*SDEL(2,1)/P)
320C DL = HD(1)
321C X = HCOMP(1,1)
322C Z = HCOMP(3,1)
323C LATMO = .TRUE.
324C LDERIV = .FALSE.
325C CALL EQSTAT TO GET TRUE CENTRAL DENSITY, BETA, AND ETA.
326C YC If LMHD then use MHD equation of state.
327C IF (LMHD) THEN
328C CALL MEQOS(TL,T,PL,P,DL,D,X,Z,BETA,BETAI,BETA14,FXION,RMU,
329C * AMU,EMU,ETA,QDT,QDP,QCP,DELA,QDTT,QDTP,QAT,QAP,QCPT,QCPP,
330C * LDERIV,LATMO,KSAHA)
331C ELSE
332C IF (LDH) THEN
333C XXDH = HCOMP(1,1)
334C YYDH = HCOMP(2,1)+HCOMP(4,1)
335C ZZDH = HCOMP(3,1)
336C ZDH(1) = HCOMP(5,1)+HCOMP(6,1)
337C ZDH(2) = HCOMP(7,1)+HCOMP(8,1)
338C ZDH(3) = HCOMP(9,1)+HCOMP(10,1)+HCOMP(11,1)
339C END IF
340C CALL EQSTAT(TL,T,PL,P,DL,D,X,Z,BETA,BETAI,BETA14,FXION,RMU,
341C *AMU,EMU,ETA,QDT,QDP,QCP,DELA,QDTT,QDTP,QAT,QAP,QCPT,QCPP,LDERIV,
342C *LATMO,KSAHA)
343C END IF
344 WRITE(ISHORT,70)PL,TL,DL,BETA,ETA,X,Z,HCOMP(9,1)
345 70 70 FORMAT(1X,'CENTER: LOG P=',F10.7,' LOG T=',F10.8,' LOG D=',
346 * *F10.6,' BETA=',F9.7,' ETA=',0PF10.5,' X=',0PF9.7,' Z=',F9.7,
347 * *' O16=',F9.7)
348 WRITE(ISHORT,80)(TLUMX(J),J = 1,5),TLUMX(8),TLUMX(6),TLUMX(7)
349 80 80 FORMAT(1X,'ENERGY: PPI',1PE13.6,' PPII',E13.6,' PPIII',E13.6,
350 * *' CNO',E13.6,/,9X,'TRIPLE ALPHA',E13.6,' HE-C',E13.6,
351 * *' NEUTRINOS',E13.6,' GRAV',E13.6)
352 SS3 = 0.0D0
353 SS4 = 0.0D0
354 IF(LSHELL) THEN
355C H-SHELL VALUES PRINTED OUT - MASSES IN SOLAR UNITS
356C SS1 - MASS INTERIOR TO CENTER OF H SHELL; SS2 = MASS OF H SHELL;
357C SS3 = HE CORE MASS; SS4 = MASS INTERIOR TO SHELL WITH MAXIMUM T
358 SS1 = HS1(JXMID)/CMSUN
359 SS2 = (HS1(JXEND) - HS1(JXBEG-1))/CMSUN
360 SS3 = HS1(JXBEG-1)/CMSUN
361 TLMAX = TL
362C LOCATE MAXIMUM T - NOTE DIFFERENT METHOD USED FOR HE FLASH
363 IF(.NOT.LKUTHE) THEN
364 DO 100 I = 2,M
365 IF(HT(I).LT.HT(I-1))GOTO 110
366 100 100 CONTINUE
367 I = M + 1
368 110 110 ITMAX = I - 1
369 IF(ITMAX.GT.1) THEN
370 SS4 = HS1(ITMAX)/CMSUN
371 TLMAX = HT(ITMAX)
372 ELSE
373 SS4 = 0.0D0
374 TLMAX = HT(1)
375 ENDIF
376 WRITE(ISHORT,120)SS1,SS2,SS3,TLMAX,SS4
377 120 120 FORMAT(1X,'H-SHELL MID-PT=',F10.7,' MASS TOTAL=',
378 * * F10.7,2X,'HE-CORE MASS=',F10.7,1X,'MAX-T=',F10.7,
379 * * ' (MASS=',F9.7,')')
380 ELSE
381C HE FLASH
382 DO 130 I = 2,M
383 IF(HT(I).LT.HT(I-1) .AND. HT(I-1).GT.7.98D0) GOTO 140
384 130 130 CONTINUE
385 I = M + 1
386 140 140 ITMAX = I - 1
387 IF(ITMAX.GT.1) THEN
388 SS4 = HS1(ITMAX)/CMSUN
389 TLMAX = HT(ITMAX)
390C ADDITIONAL OUTPUT FOR HE FLASH
391 RLMAX = HR(ITMAX)
392 LCMAX = LC(ITMAX)
393 WRITE(ISHORT,120)SS1,SS2,SS3,TLMAX,SS4
394 WRITE(ISHORT,150)LCMAX,RLMAX
395 150 150 FORMAT(1X,'CONVECTION = ',L1,5X,'LOG(R) MAX-T =',F8.5)
396 ENDIF
397 ENDIF
398C END H-SHELL SECTION
399 ENDIF
400C PRINT OUT NEUTRINO RATES FROM ENGEB CALCULATION
401 WRITE(ISHORT,160) (FLUXTOT(I),I=1,8)
402 160 160 FORMAT(1X,'NEUTRINOS 1E10ERG/CM^2 PP,PEP,HEP,BE7,',
403 * * 'B8,N13,O15,F17:', 1P8E9.2)
404C DBG 7/93 from Bahcall's book p 207 table 8.2
405 FL7LI = 0.0D0*FLUXTOT(1)+665.0D0*FLUXTOT(2)+8.4D4*FLUXTOT(3)+
406 * * 9.6D0*FLUXTOT(4)+3.9D4*FLUXTOT(5)+42.4D0*FLUXTOT(6)+
407 * * 246.0D0*FLUXTOT(7)+249.0D0*FLUXTOT(8)
408 FL37CL = 0.0D0*FLUXTOT(1)+16.0D0*FLUXTOT(2)+4.26D4*FLUXTOT(3)+
409 * * 2.4D0*FLUXTOT(4)+1.09D4*FLUXTOT(5)+1.7D0*FLUXTOT(6)+
410 * * 6.8D0*FLUXTOT(7)+6.9D0*FLUXTOT(8)
411 FL71GA = 11.8D0*FLUXTOT(1)+215.0D0*FLUXTOT(2)+7.3D4*FLUXTOT(3)+
412 * * 73.2D0*FLUXTOT(4)+2.43D4*FLUXTOT(5)+61.8D0*FLUXTOT(6)+
413 * * 116.0D0*FLUXTOT(7)+117.0D0*FLUXTOT(8)
414 FL81BR = 0.0D0*FLUXTOT(1)+75.0D0*FLUXTOT(2)+9.0D4*FLUXTOT(3)+
415 * * 18.3D0*FLUXTOT(4)+2.7D4*FLUXTOT(5)+14.5D0*FLUXTOT(6)+
416 * * 36.7D0*FLUXTOT(7)+37.0D0*FLUXTOT(8)
417 FL98MO = 0.0D0*FLUXTOT(1)+0.0D0*FLUXTOT(2)+10.0D4*FLUXTOT(3)+
418 * * 0.0D0*FLUXTOT(4)+3.0D4*FLUXTOT(5)+0.0D0*FLUXTOT(6)+
419 * * 0.0D0*FLUXTOT(7)+0.0D0*FLUXTOT(8)
420 FL115IN = 78.0D0*FLUXTOT(1)+576.0D0*FLUXTOT(2)+6.1D4*FLUXTOT(3)+
421 * * 248.0D0*FLUXTOT(4)+2.5D4*FLUXTOT(5)+224.0D0*FLUXTOT(6)+
422 * * 355.0D0*FLUXTOT(7)+356.0D0*FLUXTOT(8)
423 WRITE(ISHORT,2160) FL7LI,FL37CL,FL71GA,FL81BR,FL98MO,FL115IN
424 2160 2160 FORMAT(1X,'NEUTRINO ENERGIES (1.E-36ERG): 7Li=', 1PE9.2,
425 * * ' 37Cl=',1PE9.2,' 71Ga=',1PE9.2,' 81Br=',1PE9.2,' 98Mo=',
426 * * 1PE9.2, ' 115In=', 1PE9.2)
427 FITMAS = HS1(M)/CMSUN
428 WRITE(ISHORT,170)FITMAS,HP(M),HT(M),HR(M)
429 170 170 FORMAT(1X,'FIT-POINT M/MSUN=',F16.12,5X,'(P,T,R) =',3F12.7)
430 WRITE(ISHORT,20)
431 IF(LTRACK) THEN
432C MHP 02/12 MOVED ABOVE TO WHERE FIRST USED
433C MHP 8/96
434C STORE CENTRAL RHO,P,T FOR LATER USE
435C PCENTER = PL
436C TCENTER = TL
437C DCENTER = DL
438c Total moment of inertia
439 HITOT = 0.0D0
440 IF(.NOT.LROT)THEN
441 DO I = 1,M
442 HITOT = HITOT + CC23*HS2(I)*EXP(2.0D0*CLN*HR(I))
443 END DO
444 ELSE
445 DO I = 1,M
446 HITOT = HITOT + HI(I)
447 END DO
448 ENDIF
449C MHP 12/09 NEW OPTION TO OUTPUT TRACK INFORMATION IN ONE LINE PER MODEL FORMAT.
450 IF(ITRVER .EQ. 0) THEN
451C MHP 8/96 ADD LINE TO COMPUTE SNU's for Cl37 and Ga71.
452 CLSNU = 0.0D0
453 GASNU = 0.0D0
454 IF(LSNU) THEN
455 DO I = 1,8
456 CLSNU = CLSNU + CLSNUF(I)*FLUXTOT(I)
457 GASNU = GASNU + GASNUF(I)*FLUXTOT(I)
458 END DO
459 ELSE
460 DO I = 1,10
461 FLUXTOT(I) = 0.0D0
462 END DO
463 ENDIF
464C MHP 02/12
465C ADDED SURFACE CZ MOMENT OF INERTIA CALCULATION TO NON-ROTATING
466C MODELS, AND CORRECTLY ZERO OUT TERMS NOT COMPUTED IN SPHERICAL MODELS
467C ROTATION I/O
468 HICZ = 0.0D0
469 IF(LROT) THEN
470 ROTP = MIN(9999.0D0,0.5D0*C4PI/OMEGA(M)/8.64D4)
471 ROTV = OMEGA(M)*EXP(CLN*(RL+CRSUNL))*1.0D-5
472 IF(JENV.LT.M)THEN
473 DO K = JENV,M
474 HICZ = HICZ + HI(K)
475 END DO
476 ENDIF
477 ELSE
478 ROTP = 0.0D0
479 ROTV = 0.0D0
480 IF(JENV.LT.M)THEN
481 DO K = JENV,M
482 HICZ = HICZ + CC23*HS2(K)*EXP(2.0D0*CLN*HR(K))
483 END DO
484 ENDIF
485 ENDIF
486C END CHANGED SECTION
487C Get location of bottom, middle, top of B burning shell.
488 IF(LSHELL) THEN
489 SSS1 = HS1(JXBEG)/CMSUN
490 SSS2 = HS1(JXMID)/CMSUN
491 SSS3 = HS1(JXEND)/CMSUN
492 RRR1 = EXP(CLN*(HR(JXBEG)-RL-CRSUNL))
493 RRR2 = EXP(CLN*(HR(JXMID)-RL-CRSUNL))
494 RRR3 = EXP(CLN*(HR(JXEND)-RL-CRSUNL))
495 ELSE
496 SSS1 = 0.0D0
497 SSS2 = SSS1
498 SSS3 = SSS1
499 RRR1 = SSS1
500 RRR2 = SSS1
501 RRR3 = SSS1
502 ENDIF
503C JVS 0712 Drop sinkline to get pressure at photosphere (updates PPHOT)
504C ABEG0 = ATMBEG
505C AMIN0 = ATMMIN
506C AMAX0 = ATMMAX
507C EBEG0 = ENVBEG
508C EMIN0 = ENVMIN
509C EMAX0 = ENVMAX
510C ATMBEG = ATMSTP
511C ATMMIN = ATMSTP
512C ATMMAX = ATMSTP
513C ENVBEG = ENVSTP
514C ENVMIN = ENVSTP
515C ENVMAX = ENVSTP
516C IDUM = 0
517C B = DEXP(CLN*BL)
518C FPL = FP(M)
519C FTL = FT(M)
520C KATM = 0
521C KENV = 0
522C KSAHA = 0
523CCCC LPULPT=.FALSE.
524C IXX=0
525C LPRT=.FALSE.
526C LSBC0 = .FALSE.
527C X = HCOMP(1,M)
528C Z = HCOMP(3,M)
529C RLL = 0.5D0*(BL + CLSUNL - 4.0D0*TEFFL - C4PIL - CSIGL)
530C GL = CGL + HSTOT - RLL - RLL
531C PLIM = HP(M)
532CC G Somers 10/14, FOR SPOTTED RUNS, FIND THE
533CC PRESSURE AT THE AMBIENT TEMPERATURE ATEFFL
534C IF(JENV.EQ.M.AND.SPOTF.NE.0.0.AND.SPOTX.NE.1.0)THEN
535C ATEFFL = TEFFL - 0.25*LOG10(SPOTF*SPOTX**4.0+1.0-SPOTF)
536C ELSE
537C ATEFFL = TEFFL
538C ENDIF
539C CALL ENVINT(B,FPL,FTL,GL,HSTOT,IXX,LPRT,LSBC0,
540C * PLIM,RLL,ATEFFL,X,Z,DUM1,IDUM,KATM,KENV,KSAHA,
541C * DUM2,DUM3,DUM4,LPULPT)
542CC G Somers END
543C
544C 10/13/26 MHP via Claude
545C code changed to remove a commented-out JVS block that tracked the CZ
546C outside the envelope fitting point. It was the only code referencing
547C LJVS, whose COMMON/JTEST/ is removed in this change, and it also read
548C ENVRCZ, which is why that COMMON/ENVCZ/ member has no live consumer.
549C G Somers 3/17, ADDED CALL TO NEW TAUCZ AND PPHOT CALCULATION ROUTINE.
550
551C CALL GETTAU(HCOMP,HR,HP,HD,HG,HS1,HT,FP,FT,TEFFL, ! KC 2025-05-31
552 CALL GETTAU(HCOMP,HR,HP,HD,HS1,HT,FP,FT,TEFFL,
553 * * HSTOT,BL,M,LC,CZsurf_R,CMIXL)
554 TAUCZ0 = TAUCZ
555 PPHOT0 = PPHOT
556
557C JVS 02/12 Added PPHOT and SMASS to the output
558 WRITE(ITRACK, 1499) MODEL,M,DAGE,BL,RL,GL,TEFFL,COREM,CZsurf_M,
559 * * CZsurf_R,CZsurf_T,CZsurf_D,CZsurf_P,CZsurf_O,TL,DL,PL,BETA,ETA,HCOMP(1,1),HCOMP(2,1),
560 1 1 HCOMP(3,1),(TLUMX(J),J = 1,5),TLUMX(8),TLUMX(7),TLUMX(6),
561 2 2 CLSNU,GASNU,(FLUXTOT(I),I=1,10),(HCOMP(I,1),I=4,11),
562 3 3 (HCOMP(I,M),I=4,15),(HCOMP(I,M),I=1,3),HCOMP(3,M)/HCOMP(1,M),
563 4 4 SJTOT,SKEROT,HITOT,HICZ,OMEGA(M),OMEGA(1),ROTP,ROTV,TAUCZ,
564 5 5 SSS1,SSS2,SSS3,RRR1,RRR2,RRR3,PPHOT,SMASS
565C MHP 9/25 added more columns to cz depth to avoid overflow
566C 1499 FORMAT(1X,2I8,1P7E16.8,0PF8.4,1P4E12.4,16E16.8,12E10.3,41E16.8)
567C MCR 12/25 Preserve precision and 'E' for values w/ 3-digit exponents
568 1499 1499 FORMAT(1X,2I8,1P7E17.8E3,1P5E12.4,16E17.8E3,12E10.3,41E17.8E3)
569 ELSE IF(ITRVER .EQ.1 .OR. ITRVER .EQ.2) THEN
570 WRITE(ITRACK,1500)MODEL,M,DAGE,BL,RL,GL,TEFFL,COREM,CZsurf_M,
571 * * CZsurf_R,CZsurf_T,CZsurf_D,CZsurf_P,CZsurf_O
572 1500 1500 FORMAT(1X,2I8,1P7E16.8,0PF8.4,1P4E12.4)
573 WRITE(ITRACK,1509)TL,DL,PL,BETA,ETA,HCOMP(1,1),HCOMP(2,1),
574 1 1 HCOMP(3,1),HITOT
575 1509 1509 FORMAT(1X,1P9E16.8)
576 1510 1510 FORMAT(1X,1P8E16.8)
577 WRITE(ITRACK,1510)(TLUMX(J),J = 1,5),
578 1 1 TLUMX(8),TLUMX(7),TLUMX(6)
579
580C MHP 8/96 ADD LINE TO COMPUTE SNU's for Cl37 and Ga71.
581 CLSNU = 0.0D0
582 GASNU = 0.0D0
583 DO I = 1,8
584 CLSNU = CLSNU + CLSNUF(I)*FLUXTOT(I)
585 GASNU = GASNU + GASNUF(I)*FLUXTOT(I)
586 END DO
587 WRITE(ITRACK, 1515) CLSNU,GASNU,(FLUXTOT(I),I=1,10)
588 1515 1515 FORMAT(1X,2F8.3,1P10E10.3)
589 WRITE(ITRACK,1510)(HCOMP(I,1),I=4,11)
590C ADD SURFACE X,Y,Z,Z/X.
591 WRITE(ITRACK,1520)(HCOMP(I,M),I=4,15),
592 * * (HCOMP(I,M),I=1,3),HCOMP(3,M)/HCOMP(1,M)
593 1520 1520 FORMAT(1X,1P8E16.8,/,1X,1P8E16.8)
594C ROTATION I/O
595 IF(LROT) THEN
596C MHP 8/25 removed limit on rotation period output
597C ROTP = MIN(9999.0D0,0.5D0*C4PI/OMEGA(M)/8.64D4)
598 ROTP = 0.5D0*C4PI/OMEGA(M)/8.64D4
599 ROTV = OMEGA(M)*EXP(CLN*(RL+CRSUNL))*1.0D-5
600 HICZ = 0.0D0
601 IF(LC(M))THEN
602 DO K = JENV,M
603 HICZ = HICZ + HI(K)
604 END DO
605 ELSE
606 HICZ = 0.0D0
607 ENDIF
608 ENDIF
609C Get location of bottom, middle, top of B burning shell.
610 IF(LSHELL) THEN
611 SSS1 = HS1(JXBEG)/CMSUN
612 SSS2 = HS1(JXMID)/CMSUN
613 SSS3 = HS1(JXEND)/CMSUN
614 RRR1 = EXP(CLN*(HR(JXBEG)-RL-CRSUNL))
615 RRR2 = EXP(CLN*(HR(JXMID)-RL-CRSUNL))
616 RRR3 = EXP(CLN*(HR(JXEND)-RL-CRSUNL))
617 ELSE
618 SSS1 = 0.0D0
619 SSS2 = SSS1
620 SSS3 = SSS1
621 RRR1 = SSS1
622 RRR2 = SSS1
623 RRR3 = SSS1
624 ENDIF
625 WRITE(ITRACK,1530)SSS1,SSS2,SSS3,RRR1,RRR2,RRR3
626 1530 1530 FORMAT(1X, 1P6E16.8)
627 ENDIF
628C ROTATION STUFF
629C 4/09 ADDED TAUCZ TO ROTATION INFORMATION
630 IF (ITRVER .EQ. 2) THEN
631
632 WRITE(ITRACK,1540)SJTOT,SKEROT,HITOT,HICZ,OMEGA(M),
633 * * OMEGA(1),ROTP,ROTV,TAUCZ
634 1540 1540 FORMAT(1X, 1P6E13.5,0P,2F11.5,1E13.5)
635 END IF
636 IF (ITRVER .EQ. 3) THEN
637C RATIO OF GRAV TO TOTAL ENERGY
638C GROTOT = 100.0*TLUMX(7)/HL(M)
639 WRITE(ITRACK,1501)MODEL,M,DAGE,BL,RL,GL,TEFFL,COREM,CZsurf_M,
640 * * CZsurf_R, XNEW
641 1501 1501 FORMAT(1X,2I8,1P5E13.5, 1P2E11.3, 0PF8.4, 1PE13.5)
642
643 END IF
644 ENDIF
645
646C 9/25/26 MHP via Claude
647C code changed to remove the LISO isochrone-output option
648C MHP 8/25 Fscomp depreciated, call commented out
649C WRITE OUT SURFACE COMPOSITIONS TO FILE ISCOMP IF extended comp MODEL.
650C IF(LEXCOM) THEN
651C OPEN(UNIT=ISCOMP,FILE=FSCOMP, FORM='FORMATTED',
652C * STATUS='UNKNOWN',ACCESS='APPEND')
653C WRITE(ISCOMP,235)MODEL,DAGE,HCOMP(4,M),HCOMP(5,M),HCOMP(6,M),
654C * HCOMP(7,M),HCOMP(14,M),HCOMP(15,M)
655C 235 FORMAT(I4,F13.9,1P6E10.3)
656c CLOSE(ISCOMP)
657C ENDIF
658C
659C G Somers 11/14, WRITE THE LAST MODEL TO .LAST, AND IF LSTORE=T AND WE'RE ON
660C A STORING TIMESTEP, WRITE THE EXTENDED INFORMATION TO LSTORE. IF NOT, GRAB
661C THE PULSATION INFO IF LPULSE=TRUE.
662C
663C STORE LAST CONVERGED MODEL IN LOGICAL UNIT ILAST
664C IF LSTORE = T, STORE EVERY NPUNCH MODELS IN LOGICAL UNIT ISTOR
665C IF LSTPCH = T, STORE THE LAST MODEL CALCULATED IN A RUN
666 IWRITE = ILAST
667 CALL WRTLST(IWRITE,HCOMP,HD,HL,HP,HR,HS,HT,LC,TRIT,TRIL,PS,
668 * *TS,RS,CFENV,FTRI,TLUMX,JCORE,JENV,MODEL,M,SMASS,TEFFL,BL,HSTOT,
669 * *DAGE,DDAGE,OMEGA,CMIXL,COMPMIX)
670C
671C PRINT OUT MODEL DETAILS IF REQUESTED FOR THIS MODEL. THIS IS ALL DONE
672C IN THE SR PUTSTORE.
673C
674 IF(LSTORE.AND.MOD(MODEL,NPRTMOD).EQ.0) THEN
675 CALL PUTSTORE(HCOMP,HD,HL,HP,HR,HS,HT,LC,TRIT,TRIL,PS,
676 * * TS,RS,CFENV,FTRI,TLUMX,JCORE,JENV,MODEL,M,SMASS,TEFFL,BL,
677 * * HSTOT,DAGE,DDAGE,OMEGA,HS1,ETA2,R0,FP,FT,HJM,HI,CMIXL,XMSOL,COMPMIX)
678 LPUNCH = .FALSE.
679 ENDIF
680c the call to putstore above creates the necessary pulsation output for LPULSE.
681c however, in the event that the above block is not executed and pulsation
682c output is desired, call wrtmod.
683 IF(.NOT.(LSTORE.AND.MOD(MODEL,NPRTMOD).EQ.0) .AND. LPULSE) THEN
684 IF(LMILNE) CALL WRTMIL(HCOMP,HD,HL,HP,HR,HS1,M,MODEL)
685C CALL WRTMOD(M,LSHELL,JXBEG,JXEND,JCORE,JENV,HCOMP,HS1,HD,HL,
686C * HP,HR,HT,LC,MODEL,BL,TEFFL,OMEGA,FP,FT,ETA2,R0,HJM,HI,HS,
687C * DAGE) ! KC 2025-05-31
688 CALL WRTMOD(M,JENV,HCOMP,HS1,HD,HL,
689 * * HP,HR,HT,MODEL,BL,TEFFL,FP,FT,HS,DAGE,CMIXL,XMSOL)
690 ENDIF
691C G Somers END
692
693C JVS 01/11 Added new track file output format, +manipulations for stitching
694C together the interior and envelope pieces. Columns 68,69,70 are normalized
695C acoustic depth, depth to CZ and acoustic crossing time, respectively.
696 IF (LACOUT) THEN
697 IF(JENV.GT.1 .AND. LADON) THEN
698 CALL CALCAD(HR, CZsurf_RL, M, HD, HP,HT,BL, FP, FT, HSTOT,
699C * LPRT, TEFFL, HCOMP, NKK, DAGE, DDAGE, JENV) ! KC 2025-05-31
700 * * TEFFL, HCOMP, DAGE, JENV, CMIXL)
701 ELSE IF (JENV.EQ.1) THEN
702 TAUCZN=0.0D0
703 ENDIF
704 IF (LC(M)) THEN
705 ICHECK=1
706 ELSE IF (.NOT. LC(M)) THEN
707 ICHECK = 0
708 ENDIF
709
710 IF (LJLAST) THEN
711 IWRITE = IJLAST
712 CALL WRTLST(IWRITE,HCOMP,HD,HL,HP,HR,HS,HT,LC,TRIT,TRIL,PS,
713 * * TS,RS,CFENV,FTRI,TLUMX,JCORE,JENV,MODEL,M,SMASS,TEFFL,BL,HSTOT,
714 * * DAGE,DDAGE,OMEGA,CMIXL,COMPMIX)
715 ENDIF
716
717 WRITE(ITRACK, 1800) MODEL,M,DAGE,BL,RL,GL,TEFFL,COREM,CZsurf_M,
718 * * CZsurf_R,CZsurf_T,CZsurf_D,CZsurf_P,CZsurf_O,TL,DL,PL,BETA,ETA,HCOMP(1,1),HCOMP(2,1),
719 1 1 HCOMP(3,1),(TLUMX(J),J = 1,5),TLUMX(8),TLUMX(7),TLUMX(6),
720 2 2 CLSNU,GASNU,(FLUXTOT(I),I=1,10),(HCOMP(I,1),I=4,11),
721 3 3 (HCOMP(I,M),I=4,15),(HCOMP(I,M),I=1,3),HCOMP(3,M)/HCOMP(1,M),
722 4 4 SJTOT,TAUCZN,TCZ,TNORM,TAUHE,WHE,TATMOS,ROTV,TAUCZ,
723 5 5 SSS1,SSS2,SSS3,RRR1,RRR2,RRR3, ICHECK
724 1800 1800 FORMAT(1X,2I8,1P7E16.8,0PF8.4,1P4E12.4,16E16.8,12E10.3,
725 * * 39E16.8, I8)
726
727C JVS END
728 ENDIF
729
730 RETURN
731 END1"""Python version of wrtout.f (YREC 7be4133): the output of each converged
2model (summary block, track lines, last model, detailed profiles), with
3the summary quantities computed on the way."""
4
5import math
6
7import numpy as np
8
9from pyrec import acdpth_mod
10from pyrec import cent_mod
11from pyrec import comp_mod
12from pyrec import constants_mod
13from pyrec import debhu_mod
14from pyrec import fluxes_mod
15from pyrec import iounits_mod
16from pyrec import label_mod
17from pyrec import nmlpar_mod
18from pyrec import ovrtrn_mod
19from pyrec import scrtch_mod
20from pyrec.calcad import calcad
21from pyrec.eqstat import eqstat
22from pyrec.gettau import gettau
23from pyrec.putstore import putstore
24from pyrec.wrtlst import wrtlst
25from pyrec.wrtmil import wrtmil
26from pyrec.wrtmod import wrtmod
27
28# DATA: the track's cross sections for the Cl and Ga rates (SNU), for the
29# fluxes pp, pep, hep, Be7, B8, N13, O15, F17 (Fortran lines 165–171).
30GASNUF = np.array([0.0, 1.18e1, 2.15e2, 7.14e4, 7.17e1, 2.40e4, 6.04e1,
31 1.137e2, 1.139e2])
32CLSNUF = np.array([0.0, 0.0, 1.6e1, 4.26e4, 2.4, 1.14e4, 1.7, 6.8, 6.9])
33
34# SAVE: locals that a call can use before setting them, so their values
35# come from an earlier model (see the page: the unused CORER, bug 1, and the
36# acoustic-depth line) (Fortran lines 173–174).
37icheck = 0 # DATA ICHECK/0/
38fx = 0.0
39czsurf_rl = 0.0
40rotp = 0.0
41rotv = 0.0
42hicz = 0.0
43sss1 = sss2 = sss3 = 0.0
44rrr1 = rrr2 = rrr3 = 0.0
45ksaha = 0 # KSAHA: a counter EQSAHA increments; never set or read here.
46
47
48# --- Fortran edit descriptors -------------------------------------------
49
50def _e(v, w, d, e=2, scale=1):
51 """Fortran Ew.d (Ee) under the scale factor 1P (scale=1: d.ddd) or 0P
52 (scale=0: 0.ddd). With e = 2 an exponent beyond 99 drops the 'E', as
53 Fortran does; a field too narrow is filled with '*'."""
54
55 digits = d + 1 if scale == 1 else d
56 m, x = f"{v:.{digits - 1}E}".split('E')
57 x = int(x)
58 if scale == 0:
59 sign = '-' if m.startswith('-') else ''
60 m = sign + '0.' + m.lstrip('-').replace('.', '')
61 x = 0 if v == 0 else x + 1
62 if e == 2 and abs(x) > 99:
63 text = f"{m}{x:+04d}"
64 else:
65 text = f"{m}E{x:+0{e + 1}d}"
66 return text.rjust(w) if len(text) <= w else '*' * w
67
68
69def _es(values, w, d, e=2, scale=1):
70 """A repeated E descriptor."""
71
72 return ''.join(_e(v, w, d, e, scale) for v in values)
73
74
75def _f(v, w, d):
76 """Fortran Fw.d (Fw.0 keeps its decimal point)."""
77
78 text = f"{v:.{d}f}" + ('.' if d == 0 else '')
79 return text.rjust(w) if len(text) <= w else '*' * w
80
81
82def _l(flag):
83 return 'T' if flag else 'F'
84
85
86# --- The track lines ----------------------------------------------------
87
88def _model_block(model, m, dage, bl, rl, gl, teffl, corem, czsurf_m,
89 w, d, e):
90 """The common start of FORMATs 1499, 1500, 1800: 1X,2I8, then seven E
91 fields (DAGE ... CZsurf_M)."""
92
93 return (f" {model:8d}{m:8d}"
94 + _es([dage, bl, rl, gl, teffl, corem, czsurf_m], w, d, e))
95
96
97def _hcomp_columns(hcomp, m):
98 """HCOMP(4..11,1), HCOMP(4..15,M), HCOMP(1..3,M), Z/X at the surface."""
99
100 return ([hcomp[i, 1] for i in range(4, 12)]
101 + [hcomp[i, m] for i in range(4, 16)]
102 + [hcomp[i, m] for i in range(1, 4)]
103 + [hcomp[3, m] / hcomp[1, m]])
104
105
106def wrtout(hcomp: np.ndarray, hd: np.ndarray, hl: np.ndarray, hp: np.ndarray, hr: np.ndarray, hs: np.ndarray,
107 hs1: np.ndarray, ht: np.ndarray, lc: np.ndarray, m: int, model: int, dage: float, ddage: float, smass: float,
108 teffl: float, bl: float, gl: float, lshell: bool, jxbeg: int, jxmid: int, jxend: int, jcore: int, jenv: int,
109 tlumx: np.ndarray, trit: np.ndarray, tril: np.ndarray, ps: np.ndarray, ts: np.ndarray, rs: np.ndarray,
110 cfenv: np.ndarray, ftri: float, hstot: float, omega: np.ndarray, lpunch: bool, fp: np.ndarray,
111 ft: np.ndarray, eta2: np.ndarray, r0: np.ndarray, hjm: np.ndarray, hi: np.ndarray, sjtot: float,
112 skerot: float, hs2: np.ndarray, cmixl: float, xmsol: float, compmix: str) -> tuple[float, bool]:
113 """Write the output of a converged model: the summary block to ISHORT,
114 the track line(s) to ITRACK (by ITRVER), the last model to ILAST, and at
115 intervals the detailed profiles (PUTSTORE, or WRTMIL and WRTMOD) and the
116 acoustic depths (CALCAD). On the way it rescales the luminosity terms,
117 finds the central conditions and the base of the surface convection
118 zone (stored in CENT_MOD), and the neutrino capture rates.
119
120 Translates: wrtout.f#WRTOUT (7be4133)
121
122 Arguments: the model (hcomp, hd, hl, hp, hr, hs, hs1, ht, lc, m, the
123 rotation arrays omega, fp, ft, eta2, r0, hjm, hi, hs2), its run data
124 (model, dage, ddage, smass, teffl, bl, hstot, sjtot, skerot), the shell
125 and zone indices (lshell, jxbeg, jxmid, jxend, jcore, jenv), the
126 luminosity terms tlumx (rescaled in place), the envelope data passed to
127 WRTLST/PUTSTORE (trit, tril, ps, ts, rs, cfenv, ftri), and cmixl, xmsol,
128 compmix, passed on. Returns (gl, lpunch): log g, set here, and lpunch,
129 cleared when the model is stored.
130
131 """
132
133 global icheck, fx, czsurf_rl, rotp, rotv, hicz
134 global sss1, sss2, sss3, rrr1, rrr2, rrr3
135 n = nmlpar_mod
136 c = constants_mod
137 sc = scrtch_mod
138 fl = fluxes_mod
139 ac = acdpth_mod
140 ce = cent_mod
141 ishort = iounits_mod.ishort
142 itrack = iounits_mod.itrack
143 w = iounits_mod.write
144
145 # LTSCAL is set and never used (Fortran line 176).
146 ltscal = False # noqa: F841 (unused in the Fortran too)
147
148 # Rescale the luminosity terms to the surface luminosity (Fortran lines
149 # 177–185). Question (see the page): the unscaled sum.
150 if not n.lkuthe:
151 thl = 0.0
152 for i in range(1, 9):
153 thl = thl + tlumx[i]
154 temp = hl[m] / thl
155 for i in range(1, 9): # label 10
156 tlumx[i] = tlumx[i] * temp
157
158 # The summary block on ISHORT: the model line (Fortran lines 186–203).
159 w(ishort, "\n " + '*' * 127) # 21
160 if not n.lkuthe:
161 step = _f(ddage, 12, 0) # 30
162 else:
163 step = _e(ddage, 12, 4) # 40
164 w(ishort, f" MODEL NO.{model:5d} MASS{_f(smass, 13, 7)} (X,Z)=("
165 f"{_f(comp_mod.xnew, 11, 9)},{_f(comp_mod.znew, 11, 9)}) "
166 f"AGE(GYRS){_f(dage, 14, 8)} STEP(YRS)={step}")
167
168 # The convective core's mass (Fortran lines 204–210).
169 if jcore > 1:
170 corem = hs1[jcore] / c.cmsun
171 else:
172 corem = 0.0
173
174 # Its radius (JVS 10/11), never used: FX2 is 1 (or 0/0), and FX is
175 # left from the previous model (Fortran lines 212–221).
176 if jcore > 1:
177 fx2 = ((sc.sdel[3, jcore + 1] - sc.sdel[1, jcore]) # noqa: F841 (unused in the Fortran too)
178 / (sc.sdel[3, jcore + 1] - sc.sdel[1, jcore]))
179 corerl = hr[jcore] + fx * (hr[jcore + 1] - hr[jcore]) - c.crsunl
180 corer = math.exp(c.cln * corerl) # noqa: F841 (unused in the Fortran too)
181 else:
182 corer = 0.0 # noqa: F841 (unused in the Fortran too)
183
184 # Bolometric magnitude, radius and gravity (Fortran lines 223–225).
185 # Question (see the page): CMBOL = 4.79.
186 bolm = c.cmbol - 2.5 * bl
187 rl = 0.5 * (bl + c.clsunl - c.c4pil - c.csigl - 4.0 * teffl)
188 gl = c.cgl + comp_mod.stotal - rl - rl
189
190 # Central conditions, extrapolated from shell 1, then EQSTAT (Fortran
191 # lines 226–258).
192 temp = 0.5 * math.exp(c.cln * (c.cc13 * (c.c4pi3l + hd[1] - hs[1])
193 + hd[1] + c.cgl + hs[1]))
194 p = math.exp(c.cln * hp[1])
195 pl = math.log10(p + temp)
196 tl = ht[1] + math.log10(1.0 + temp * sc.sdel[2, 1] / p)
197 dl = hd[1]
198 x = hcomp[1, 1]
199 z = hcomp[3, 1]
200 latmo = True
201 lderiv = False
202 if n.ldh:
203 dh = debhu_mod
204 dh.xxdh = hcomp[1, 1]
205 dh.yydh = hcomp[2, 1] + hcomp[4, 1]
206 dh.zzdh = hcomp[3, 1]
207 dh.zdh[1] = hcomp[5, 1] + hcomp[6, 1]
208 dh.zdh[2] = hcomp[7, 1] + hcomp[8, 1]
209 dh.zdh[3] = hcomp[9, 1] + hcomp[10, 1] + hcomp[11, 1]
210 fxion = np.zeros(4)
211 (t, p, dl, d, beta, betai, beta14, rmu, amu, emu, eta, qdt, qdp, qcp,
212 dela, qdtt, qdtp, qat, qap, qcpt, qcpp, _) = eqstat(
213 tl, 0.0, pl, p, dl, 0.0, x, z, 0.0, 0.0, 0.0, fxion, 0.0, 0.0,
214 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
215 lderiv, latmo, ksaha)
216 ce.pcenter = pl
217 ce.tcenter = tl
218 ce.dcenter = dl
219
220 # The base of the surface convection zone, where DEL_rad - DEL_ad
221 # changes sign between JENV-1 and JENV (Fortran lines 259–302).
222 if jenv < m:
223 if jenv > 1:
224 dd2 = sc.sdel[1, jenv - 1] - sc.sdel[3, jenv - 1]
225 dd1 = sc.sdel[1, jenv] - sc.sdel[3, jenv]
226 fx = dd2 / (dd2 - dd1)
227 hsb = hs1[jenv - 1] + fx * (hs1[jenv] - hs1[jenv - 1])
228 ce.czsurf_m = (math.exp(c.cln * hstot) - hsb) / c.cmsun
229 czsurf_rl = hr[jenv - 1] + fx * (hr[jenv] - hr[jenv - 1]) - c.crsunl
230 ce.czsurf_r = math.exp(c.cln * czsurf_rl)
231 czsurf_o = sc.so[jenv - 1] + fx * (sc.so[jenv] - sc.so[jenv - 1])
232 czsurf_tl = ht[jenv - 1] + fx * (ht[jenv] - ht[jenv - 1])
233 czsurf_dl = hd[jenv - 1] + fx * (hd[jenv] - hd[jenv - 1])
234 czsurf_pl = hp[jenv - 1] + fx * (hp[jenv] - hp[jenv - 1])
235 czsurf_t = math.exp(c.cln * czsurf_tl)
236 czsurf_d = math.exp(c.cln * czsurf_dl)
237 czsurf_p = math.exp(c.cln * czsurf_pl)
238 else:
239 # Fully convective.
240 ce.czsurf_m = smass
241 ce.czsurf_r = 0.0
242 czsurf_t = 10.0 ** ce.tcenter
243 czsurf_d = 10.0 ** ce.dcenter
244 czsurf_p = 10.0 ** ce.pcenter
245 czsurf_o = sc.so[1]
246 else:
247 # No surface convection zone.
248 ce.czsurf_m = 0.0
249 ce.czsurf_r = 0.0
250 czsurf_t = 0.0
251 czsurf_d = 0.0
252 czsurf_p = 0.0
253 czsurf_o = 0.0
254
255 # The summary lines 50, 60, 70, 80 (Fortran lines 303–351).
256 w(ishort, f" SHELLS={m:5d} (X0,Z0)=({_f(label_mod.xenv0, 9, 7)},"
257 f"{_f(label_mod.zenv0, 9, 7)}) CONV. ZONE MASSES(MSUN): CORE"
258 f"{_f(corem, 10, 7)} ENV.{_f(ce.czsurf_m, 10, 7)}"
259 f" RAD. FRAC.{_f(ce.czsurf_r, 10, 7)}") # 50
260 rl = rl - c.crsunl
261 w(ishort, f" LOG(TEFF)={_f(teffl, 11, 8)} M(BOL)={_f(bolm, 11, 7)}"
262 f" LOG(L/LSUN)={_f(bl, 12, 8)} LOG(R/RSUN)={_f(rl, 12, 8)}"
263 f" LOG(G) ={_f(gl, 12, 8)}") # 60
264 w(ishort, f" CENTER: LOG P={_f(pl, 10, 7)} LOG T={_f(tl, 10, 8)} LOG D="
265 f"{_f(dl, 10, 6)} BETA={_f(beta, 9, 7)} ETA={_f(eta, 10, 5)}"
266 f" X={_f(x, 9, 7)} Z={_f(z, 9, 7)} O16={_f(hcomp[9, 1], 9, 7)}")
267 # FORMAT 80: PPI, PPII, PPIII, CNO; triple alpha, He-C, neutrinos, grav.
268 w(ishort, f" ENERGY: PPI{_e(tlumx[1], 13, 6)} PPII{_e(tlumx[2], 13, 6)}"
269 f" PPIII{_e(tlumx[3], 13, 6)} CNO{_e(tlumx[4], 13, 6)}\n"
270 f"{'':9s}TRIPLE ALPHA{_e(tlumx[5], 13, 6)}"
271 f" HE-C{_e(tlumx[8], 13, 6)} NEUTRINOS{_e(tlumx[6], 13, 6)}"
272 f" GRAV{_e(tlumx[7], 13, 6)}")
273
274 # The hydrogen shell and the temperature maximum (Fortran lines
275 # 352–399).
276 ss3 = 0.0
277 ss4 = 0.0
278 if lshell:
279 ss1 = hs1[jxmid] / c.cmsun
280 ss2 = (hs1[jxend] - hs1[jxbeg - 1]) / c.cmsun
281 ss3 = hs1[jxbeg - 1] / c.cmsun
282 tlmax = tl
283 line120 = None
284 if not n.lkuthe:
285 # The first temperature maximum from the center.
286 for i in range(2, m + 1): # label 100
287 if ht[i] < ht[i - 1]:
288 break
289 else:
290 i = m + 1
291 itmax = i - 1 # label 110
292 if itmax > 1:
293 ss4 = hs1[itmax] / c.cmsun
294 tlmax = ht[itmax]
295 else:
296 ss4 = 0.0
297 tlmax = ht[1]
298 line120 = True
299 else:
300 # Helium flash: the first maximum above log T = 7.98.
301 # Question (see the page): the threshold 7.98.
302 for i in range(2, m + 1): # label 130
303 if ht[i] < ht[i - 1] and ht[i - 1] > 7.98:
304 break
305 else:
306 i = m + 1
307 itmax = i - 1 # label 140
308 if itmax > 1:
309 ss4 = hs1[itmax] / c.cmsun
310 tlmax = ht[itmax]
311 rlmax = hr[itmax]
312 lcmax = lc[itmax]
313 line120 = True
314 if line120:
315 w(ishort, f" H-SHELL MID-PT={_f(ss1, 10, 7)} MASS TOTAL="
316 f"{_f(ss2, 10, 7)} HE-CORE MASS={_f(ss3, 10, 7)} MAX-T="
317 f"{_f(tlmax, 10, 7)} (MASS={_f(ss4, 9, 7)})") # 120
318 if n.lkuthe:
319 w(ishort, f" CONVECTION = {_l(lcmax)} LOG(R) MAX-T ="
320 f"{_f(rlmax, 8, 5)}") # 150
321
322 # Neutrino fluxes and detector capture rates (Fortran lines 400–426).
323 # Suspected bug (see the page): the labels give them in erg.
324 fluxtot = fl.fluxtot
325 w(ishort, " NEUTRINOS 1E10ERG/CM^2 PP,PEP,HEP,BE7,B8,N13,O15,F17:"
326 + _es(fluxtot[1:9], 9, 2)) # 160
327 # Question (see the page): these cross sections differ from CLSNUF and
328 # GASNUF.
329 f = fluxtot
330 fl7li = (0.0 * f[1] + 665.0 * f[2] + 8.4e4 * f[3] + 9.6 * f[4]
331 + 3.9e4 * f[5] + 42.4 * f[6] + 246.0 * f[7] + 249.0 * f[8])
332 fl37cl = (0.0 * f[1] + 16.0 * f[2] + 4.26e4 * f[3] + 2.4 * f[4]
333 + 1.09e4 * f[5] + 1.7 * f[6] + 6.8 * f[7] + 6.9 * f[8])
334 fl71ga = (11.8 * f[1] + 215.0 * f[2] + 7.3e4 * f[3] + 73.2 * f[4]
335 + 2.43e4 * f[5] + 61.8 * f[6] + 116.0 * f[7] + 117.0 * f[8])
336 fl81br = (0.0 * f[1] + 75.0 * f[2] + 9.0e4 * f[3] + 18.3 * f[4]
337 + 2.7e4 * f[5] + 14.5 * f[6] + 36.7 * f[7] + 37.0 * f[8])
338 fl98mo = (0.0 * f[1] + 0.0 * f[2] + 10.0e4 * f[3] + 0.0 * f[4]
339 + 3.0e4 * f[5] + 0.0 * f[6] + 0.0 * f[7] + 0.0 * f[8])
340 fl115in = (78.0 * f[1] + 576.0 * f[2] + 6.1e4 * f[3] + 248.0 * f[4]
341 + 2.5e4 * f[5] + 224.0 * f[6] + 355.0 * f[7] + 356.0 * f[8])
342 w(ishort, f" NEUTRINO ENERGIES (1.E-36ERG): 7Li={_e(fl7li, 9, 2)}"
343 f" 37Cl={_e(fl37cl, 9, 2)} 71Ga={_e(fl71ga, 9, 2)}"
344 f" 81Br={_e(fl81br, 9, 2)} 98Mo={_e(fl98mo, 9, 2)}"
345 f" 115In={_e(fl115in, 9, 2)}") # 2160
346
347 # The fitting point, and the closing line (Fortran lines 427–430).
348 fitmas = hs1[m] / c.cmsun
349 w(ishort, f" FIT-POINT M/MSUN={_f(fitmas, 16, 12)} (P,T,R) ="
350 f"{_f(hp[m], 12, 7)}{_f(ht[m], 12, 7)}{_f(hr[m], 12, 7)}")
351 w(ishort, " " + '*' * 127) # 20
352
353 if n.ltrack:
354 # The total moment of inertia (Fortran lines 431–448).
355 hitot = 0.0
356 if not n.lrot:
357 for i in range(1, m + 1):
358 hitot = hitot + c.cc23 * hs2[i] * math.exp(2.0 * c.cln * hr[i])
359 else:
360 for i in range(1, m + 1):
361 hitot = hitot + hi[i]
362
363 if n.itrver == 0:
364 # The Cl and Ga rates in SNU; without LSNU the fluxes are zeroed
365 # (Fortran lines 450–463).
366 fl.clsnu = 0.0
367 fl.gasnu = 0.0
368 if n.lsnu:
369 for i in range(1, 9):
370 fl.clsnu = fl.clsnu + CLSNUF[i] * fluxtot[i]
371 fl.gasnu = fl.gasnu + GASNUF[i] * fluxtot[i]
372 else:
373 for i in range(1, 11):
374 fluxtot[i] = 0.0
375
376 # Rotation period (days), velocity (km/s), the zone's inertia
377 # (Fortran lines 464–486).
378 hicz = 0.0
379 if n.lrot:
380 # Question (see the page): the old cap of 9999 days.
381 rotp = min(9999.0, 0.5 * c.c4pi / omega[m] / 8.64e4)
382 rotv = omega[m] * math.exp(c.cln * (rl + c.crsunl)) * 1.0e-5
383 if jenv < m:
384 for k in range(jenv, m + 1):
385 hicz = hicz + hi[k]
386 else:
387 rotp = 0.0
388 rotv = 0.0
389 if jenv < m:
390 for k in range(jenv, m + 1):
391 hicz = hicz + c.cc23 * hs2[k] * math.exp(
392 2.0 * c.cln * hr[k])
393
394 # The hydrogen shell's location (Fortran lines 487–502).
395 _shell_location(lshell, jxbeg, jxmid, jxend, hs1, hr, rl)
396
397 # tau_cz and P_phot; GETTAU also sets CZsurf_R (Fortran lines
398 # 549–555).
399 ce.czsurf_r = gettau(hcomp, hr, hp, hd, hs1, ht, fp, ft, teffl,
400 hstot, bl, m, lc, ce.czsurf_r, cmixl)
401 ovrtrn_mod.taucz0 = ovrtrn_mod.taucz
402 ovrtrn_mod.pphot0 = ovrtrn_mod.pphot
403
404 # FORMAT 1499 (E17.8E3, for three-digit exponents) (MCR 12/25)
405 # (Fortran lines 557–568).
406 w(itrack, _model_block(model, m, dage, bl, rl, gl, teffl, corem,
407 ce.czsurf_m, 17, 8, 3)
408 + _es([ce.czsurf_r, czsurf_t, czsurf_d, czsurf_p,
409 czsurf_o], 12, 4)
410 + _es([tl, dl, pl, beta, eta, hcomp[1, 1], hcomp[2, 1],
411 hcomp[3, 1]] + list(tlumx[1:6])
412 + [tlumx[8], tlumx[7], tlumx[6]], 17, 8, 3)
413 + _es([fl.clsnu, fl.gasnu] + list(fluxtot[1:11]), 10, 3)
414 + _es(_hcomp_columns(hcomp, m)
415 + [sjtot, skerot, hitot, hicz, omega[m], omega[1],
416 rotp, rotv, ovrtrn_mod.taucz,
417 sss1, sss2, sss3, rrr1, rrr2, rrr3,
418 ovrtrn_mod.pphot, smass], 17, 8, 3))
419 elif n.itrver == 1 or n.itrver == 2:
420 # The model, the center and the luminosities (Fortran lines
421 # 569–578).
422 w(itrack, _model_block(model, m, dage, bl, rl, gl, teffl, corem,
423 ce.czsurf_m, 16, 8, 2)
424 + _f(ce.czsurf_r, 8, 4)
425 + _es([czsurf_t, czsurf_d, czsurf_p, czsurf_o],
426 12, 4)) # 1500
427 w(itrack, " " + _es([tl, dl, pl, beta, eta, hcomp[1, 1],
428 hcomp[2, 1], hcomp[3, 1], hitot], 16, 8))
429 w(itrack, " " + _es(list(tlumx[1:6])
430 + [tlumx[8], tlumx[7], tlumx[6]], 16, 8))
431
432 # The Cl and Ga rates in SNU, the fluxes, the central and surface
433 # abundances (Fortran lines 580–593).
434 fl.clsnu = 0.0
435 fl.gasnu = 0.0
436 for i in range(1, 9):
437 fl.clsnu = fl.clsnu + CLSNUF[i] * fluxtot[i]
438 fl.gasnu = fl.gasnu + GASNUF[i] * fluxtot[i]
439 w(itrack, f" {_f(fl.clsnu, 8, 3)}{_f(fl.gasnu, 8, 3)}"
440 + _es(fluxtot[1:11], 10, 3)) # 1515
441 w(itrack, " " + _es([hcomp[i, 1] for i in range(4, 12)], 16, 8))
442 surf = _hcomp_columns(hcomp, m)[8:]
443 w(itrack, " " + _es(surf[:8], 16, 8) + "\n "
444 + _es(surf[8:], 16, 8)) # 1520
445
446 # Rotation (Fortran lines 594–608). Suspected bug (see the
447 # page): without rotation ROTP, ROTV and HICZ keep earlier
448 # values, and version 2 writes them.
449 if n.lrot:
450 rotp = 0.5 * c.c4pi / omega[m] / 8.64e4
451 rotv = omega[m] * math.exp(c.cln * (rl + c.crsunl)) * 1.0e-5
452 hicz = 0.0
453 if lc[m]:
454 for k in range(jenv, m + 1):
455 hicz = hicz + hi[k]
456 else:
457 hicz = 0.0
458
459 # The hydrogen shell's location (Fortran lines 609–626).
460 _shell_location(lshell, jxbeg, jxmid, jxend, hs1, hr, rl)
461 w(itrack, " " + _es([sss1, sss2, sss3, rrr1, rrr2, rrr3],
462 16, 8)) # 1530
463
464 if n.itrver == 2:
465 # FORMAT 1540, (1X,1P6E13.5,0P,2F11.5,1E13.5): the last field
466 # is under 0P, so it prints as 0.ddddd (Fortran lines 628–635).
467 w(itrack, " " + _es([sjtot, skerot, hitot, hicz, omega[m],
468 omega[1]], 13, 5)
469 + _f(rotp, 11, 5) + _f(rotv, 11, 5)
470 + _e(ovrtrn_mod.taucz, 13, 5, scale=0))
471
472 if n.itrver == 3:
473 # FORMAT 1501 (Fortran lines 636–643).
474 w(itrack, f" {model:8d}{m:8d}"
475 + _es([dage, bl, rl, gl, teffl], 13, 5)
476 + _es([corem, ce.czsurf_m], 11, 3)
477 + _f(ce.czsurf_r, 8, 4)
478 + _e(comp_mod.xnew, 13, 5)) # 1501
479
480 # The last model, every time (Fortran lines 659–669).
481 iwrite = iounits_mod.ilast
482 wrtlst(iwrite, hcomp, hd, hl, hp, hr, hs, ht, lc, trit, tril, ps,
483 ts, rs, cfenv, ftri, tlumx, jcore, jenv, model, m, smass, teffl,
484 bl, hstot, dage, ddage, omega, cmixl, compmix)
485
486 # The detailed output every NPRTMOD models (PUTSTORE also writes the
487 # stitched profile); otherwise the pulsation files (Fortran lines
488 # 670–691).
489 stored = n.lstore and model % n.nprtmod == 0
490 if stored:
491 putstore(hcomp, hd, hl, hp, hr, hs, ht, lc, trit, tril, ps,
492 ts, rs, cfenv, ftri, tlumx, jcore, jenv, model, m, smass,
493 teffl, bl, hstot, dage, ddage, omega, hs1, eta2, r0, fp, ft,
494 hjm, hi, cmixl, xmsol, compmix)
495 lpunch = False
496 if not stored and n.lpulse:
497 if n.lmilne:
498 wrtmil(hcomp, hd, hl, hp, hr, hs1, m, model)
499 wrtmod(m, jenv, hcomp, hs1, hd, hl, hp, hr, ht, model, bl, teffl,
500 fp, ft, hs, dage, cmixl, xmsol)
501
502 # Acoustic depths, and a second track line (JVS); LACOUT is never set
503 # (Fortran lines 693–728).
504 if ac.lacout:
505 if jenv > 1 and ac.ladon:
506 # Question (see the page): CZsurf_RL may be from an earlier
507 # model.
508 calcad(hr, czsurf_rl, m, hd, hp, ht, bl, fp, ft, hstot, teffl,
509 hcomp, dage, jenv, cmixl)
510 elif jenv == 1:
511 ac.tauczn = 0.0
512 if lc[m]:
513 icheck = 1
514 elif not lc[m]:
515 icheck = 0
516 if ac.ljlast:
517 iwrite = iounits_mod.ijlast
518 wrtlst(iwrite, hcomp, hd, hl, hp, hr, hs, ht, lc, trit, tril, ps,
519 ts, rs, cfenv, ftri, tlumx, jcore, jenv, model, m, smass,
520 teffl, bl, hstot, dage, ddage, omega, cmixl, compmix)
521 # FORMAT 1800. Question (see the page): a second line format in the
522 # track file, with values that may be from earlier models.
523 w(itrack, _model_block(model, m, dage, bl, rl, gl, teffl, corem,
524 ce.czsurf_m, 16, 8, 2)
525 + _f(ce.czsurf_r, 8, 4)
526 + _es([czsurf_t, czsurf_d, czsurf_p, czsurf_o], 12, 4)
527 + _es([tl, dl, pl, beta, eta, hcomp[1, 1], hcomp[2, 1],
528 hcomp[3, 1]] + list(tlumx[1:6])
529 + [tlumx[8], tlumx[7], tlumx[6]], 16, 8)
530 + _es([fl.clsnu, fl.gasnu] + list(fluxtot[1:11]), 10, 3)
531 + _es(_hcomp_columns(hcomp, m)
532 + [sjtot, ac.tauczn, ac.tcz, ac.tnorm, ac.tauhe,
533 ac.whe, ac.tatmos, rotv, ovrtrn_mod.taucz,
534 sss1, sss2, sss3, rrr1, rrr2, rrr3], 16, 8)
535 + f"{icheck:8d}")
536 return gl, lpunch
537
538
539def _shell_location(lshell, jxbeg, jxmid, jxend, hs1, hr, rl):
540 """The hydrogen shell's base, middle and top, in mass (Msun) and in
541 radius (fraction of R), for the track (the block both track versions
542 repeat: Fortran lines 487–502 and 609–624)."""
543
544 global sss1, sss2, sss3, rrr1, rrr2, rrr3
545 c = constants_mod
546 if lshell:
547 sss1 = hs1[jxbeg] / c.cmsun
548 sss2 = hs1[jxmid] / c.cmsun
549 sss3 = hs1[jxend] / c.cmsun
550 rrr1 = math.exp(c.cln * (hr[jxbeg] - rl - c.crsunl))
551 rrr2 = math.exp(c.cln * (hr[jxmid] - rl - c.crsunl))
552 rrr3 = math.exp(c.cln * (hr[jxend] - rl - c.crsunl))
553 else:
554 sss1 = 0.0
555 sss2 = sss1
556 sss3 = sss1
557 rrr1 = sss1
558 rrr2 = sss1
559 rrr3 = sss1