1C $$$$$$
2C 11/91 MHP REVISED SUBROUTINE (REPLACES OLD FINDW).
3C GETW EVOLVES THE ANGULAR MOMENTUM DISTRIBUTION IN TIME.
4C IT ENFORCES LOCAL CONSERVATION OF ANGULAR MOMENTUM IN RADIATIVE REGIONS,
5C AND ENFORCES THE USER-SPECIFIED ROTATION LAW IN CONVECTIVE REGIONS.
6C BOTH MERIDIONAL CIRCULATION AND DIFFERENTIAL ROTATION WITH DEPTH CAN
7C CAUSE THE RADIAL TRANSPORT OF ANGULAR MOMENTUM AND MATERIAL.
8C GETW SOLVES FOR THE TRANSPORT OF ANGULAR MOMENTUM AND THE ASSOCIATED MIXING
9C IF DESIRED (LINSTB=T), AND ACCOUNTS FOR ANGULAR MOMENTUM LOSS CAUSED BY A
10C MAGNETIC STELLAR WIND IF DESIRED (LJDOT0=T).
11C IF INSTABILITIES ARE BEING TREATED, THE BURNING OF THE LIGHT ELEMENTS
12C LITHIUM AND BERYLLIUM ARE CONSIDERED HERE IF DESIRED (LEXCOM=T).
13C FOR A DISCUSSION OF THE OVERALL TECHNIQUE USED SEE PINSONNEAULT, KAWALER,
14C SOFIA, AND DEMARQUE (1989), AP.J. VOL. 338, P.424.
15C 11/91 JENV0 ADDED TO CALL.
16 SUBROUTINE GETW(BL,DELTS,DWMAX,FP,FT,HCOMP,HD,HJM,HL,HP,HR,HS,
17C * HS1,HS2,HSTOT,HT,LC,LJDOT,M,MODEL,SJTOT,SMASS, ! KC 2025-05-31
18 * * HS1,HS2,HSTOT,HT,LC,LJDOT,M,SMASS,
19 * * TEFFL,ETA2,HG,HI,OMEGA,QIW,R0,JENV0,CMIXL,LPRT0)
20C 10/15/26 MHP via Claude
21C code changed to take JSON from DIMENSIONS_MOD instead of declaring
22C PARAMETER(JSON=5000) here.
23 USE DIMENSIONS_MOD
24C 10/14/26 MHP via Claude
25C code changed to convert COMMON/TEMP/ into TEMP_MOD.
26 USE TEMP_MOD
27C 10/14/26 MHP via Claude
28C code changed to convert COMMON/QUADRU/ into QUADRU_MOD.
29 USE QUADRU_MOD
30C 10/14/26 MHP via Claude
31C code changed to convert COMMON/OVRTRN/ into OVRTRN_MOD.
32 USE OVRTRN_MOD
33C 10/14/26 MHP via Claude
34C code changed to convert COMMON/OLDROT2/ into OLDROT2_MOD.
35 USE OLDROT2_MOD
36C 10/14/26 MHP via Claude
37C code changed to convert COMMON/OLDROT/ into OLDROT_MOD.
38 USE OLDROT_MOD
39C 10/14/26 MHP via Claude
40C code changed to convert COMMON/OLDRAT/ into OLDRAT_MOD.
41 USE OLDRAT_MOD
42C 10/14/26 MHP via Claude
43C code changed to convert COMMON/OLDPHY/ into OLDPHY_MOD.
44 USE OLDPHY_MOD
45C 10/14/26 MHP via Claude
46C code changed to convert COMMON/OLDMOD/ into OLDMOD_MOD.
47 USE OLDMOD_MOD
48C 10/14/26 MHP via Claude
49C code changed to convert COMMON/NEWRAT/ into NEWRAT_MOD.
50 USE NEWRAT_MOD
51C 10/14/26 MHP via Claude
52C code changed to convert COMMON/MDPHY/ into MDPHY_MOD.
53 USE MDPHY_MOD
54C 10/14/26 MHP via Claude
55C code changed to convert COMMON/LIOV/ into LIOV_MOD.
56 USE LIOV_MOD
57C 10/14/26 MHP via Claude
58C code changed to convert COMMON/DISK/ into DISK_MOD.
59 USE DISK_MOD
60C 10/14/26 MHP via Claude
61C code changed to convert COMMON/NMLPAR/ into NMLPAR_MOD.
62 USE NMLPAR_MOD
63C 10/14/26 MHP via Claude
64C code changed to convert COMMON/CONSTANTS/ into CONSTANTS_MOD.
65 USE CONSTANTS_MOD
66C 10/20/26 MHP via Claude
67C code changed to replace implicit typing with IMPLICIT NONE and
68C explicit declarations.
69 IMPLICIT NONE
70 REAL*8 BL,CMIXL,COD2,DELTS,DR,DT,DWMAX,ENVR,ETA2,ETA2M,FP,FT,FX,
71 * * HCOMP,HCOMPS,HD,HDM,HG,HGM,HI,HICZ,HIM,HJM,HJMSAV,HL,HLM,
72 * * HP,HPM,HR,HRM,HS,HS1,HS2,HSBOT,HSTOP,HSTOT,HT,HTM,HV,OMEGA,
73 * * OMEGAM,OMEGAS,PSURF,QIW,QIWM,QSURF,QW,R0,R0M,RL,SMASS,
74 * * SUMDT,TEFFL,TEST,WMID
75 INTEGER I,IEND,IMAX,IMIN,IREDO,J,JCORE1,JENV0,JENV1,M,MRZONE,
76 * * MXZON0,MXZONE,NRZONE,NSPEC,NSTEP,NSTEP2,NZONE,NZONE0
77 LOGICAL*4 LALLCZ,LBURS,LC,LCM,LCZ,LCZM,LCZSUR,LFIRSTIT,LIMIX,
78 * * LJDOT,LOCK,LOK,LPRT0,LREDO,LSKIP
79C 10/13/26 MHP via Claude
80C HCOMPS was COMMON/OLDAB/; getw.f now owns it and passes it to MIDMOD
81C and SECULR, its only users.
82 DIMENSION HCOMPS(15,JSON)
83 DIMENSION HD(JSON),HJM(JSON),HR(JSON),HS(JSON),HS2(JSON),LC(JSON),
84 * * ETA2(JSON),HI(JSON),OMEGA(JSON),R0(JSON),HCOMP(15,JSON),
85 * * HL(JSON),HP(JSON),HT(JSON),FP(JSON),FT(JSON),HG(JSON),LCZ(JSON),
86 * * QIW(JSON),HJMSAV(JSON),HS1(JSON),
87 * * ETA2M(JSON),HDM(JSON),HGM(JSON),HIM(JSON),HLM(JSON),HPM(JSON),
88 * * HRM(JSON),HTM(JSON),LCM(JSON),OMEGAM(JSON),QIWM(JSON),R0M(JSON),
89 * * LCZM(JSON)
90C MHP 6/00 ADDED COD2, HV TO ALLOW BUR-ST MIXING PLUS BURNING.
91 DIMENSION COD2(JSON),HV(JSON)
92 DIMENSION MXZONE(12,2),MXZON0(12,2),MRZONE(13,2)
93C 9/25/26 MHP via Claude
94C code changed to merge COMMON/CONST/, COMMON/CONST1/, COMMON/CONST2/,
95C and COMMON/CONST3/ into a single COMMON/CONSTANTS/
96C 9/24/26 MHP via Claude
97C code changed to pass CMIXL as an explicit argument instead of via
98C common block, to reduce implicit global state ahead of the F90
99C module conversion (also drops the unused CMIXZ alias for this slot)
100C 11/91 COMMON BLOCKS ADDED FOR PRESSURE SCALE HEIGHT CALC. FOR LIBURN
101C 10/12/26 MHP via Claude
102C code changed to extend COMMON/NMLPAR/ to 234 members, adding the
103C namelist variables that the physics routines read from 27 COMMON
104C blocks which also held derived or working members. Those blocks keep
105C only their non-namelist members; five of them -- NEWMX, VMULT,
106C PMMWIND, CCOUT1 and ENVGEN -- had nothing left and are gone.
107C Derivation-only namelist variables from the same blocks went to
108C COMMON/NMLBYPASS/ instead, not here.
109C
110C Declared identically in all 121 files that hold any of these members.
111C Generated from one member list, so every copy is byte-identical; the
112C linker's 'size of symbol changed' warning is the check that they are.
113C 10/13/26 MHP via Claude: removed the unused COMMON/DPMIX/ declaration
114C (no member referenced here; residue of the obsolete-option removals).
115C 10/13/26 MHP via Claude
116C code changed to drop COMMON/CTLIM/, declared here but never used.
117C MHP 8/17 ADDED EXCEN, C_2 TO COMMON BLOCK FOR MATT ET AL. 2012 CENT. TERM
118C 10/13/26 MHP via Claude: removed the unused COMMON/CWIND/ declaration
119C (no member referenced here; residue of the obsolete-option removals).
120C 10/13/26 MHP via Claude: removed the unused COMMON/IOUNITS/ declaration
121C (no member referenced here; residue of the obsolete-option removals).
122C 7/91 NEW LITHIUM BURNING COMMON BLOCKS ADDED.
123C 10/13/26 MHP via Claude
124C code changed to replace COMMON/OLDAB/ with an explicit argument: midmod.f
125C fills HCOMPS and seculr.f reads it, both called only from getw.f, which
126C now owns the storage.
127C 8/92 COMMON BLOCK FOR COMPUTATION OF BEGINNING OF STEP MU
128C BARRIER.
129C 10/13/26 MHP via Claude: removed the unused COMMON/TEMP2/ declaration
130C (no member referenced here; residue of the obsolete-option removals).
131C 10/13/26 MHP via Claude
132C code changed to replace COMMON/ROTPRT/ with an explicit argument: main.f
133C sets LPRT0 and getw.f is its only reader.
134C MHP 3/99 ADDED FLAG TO TREAT THE ENTIRE STAR AS 'CONVECTIVE'
135C FOR ANGULAR MOMENTUM PURPOSES.
136C JNT 09/2025 FOR 05/15 ADD IMPJMOD
137C MHP 06/02
138C Time change of theta
139 SAVE
140 LBURS = .FALSE.
141C DETERMINE THE NUMBER OF DIFFERENT ELEMENTS AND ISOTOPES BEING TRACKED
142C BY THE CODE (NSPEC).
143 NSPEC = 11
144 IF(LEXCOM) NSPEC = 15
145C CONVECTIVE AND RADIATIVE REGIONS ARE TREATED DIFFERENTLY FOR ANGULAR
146C MOMENTUM PURPOSES; IF CONVECTIVE OVERSHOOT IS BEING INCLUDED THE
147C OVERSHOOT REGION IS TREATED AS CONVECTIVE FOR ANGULAR MOMENTUM PURPOSES.
148C ***NOTE : IF LINSTB=T THERE MUST BE AT LEAST ONE SHELL IN THE OVERSHOOT
149C REGION, TO COUPLE THE RADIATIVE AND CONVECTIVE REGIONS AND TO AVOID
150C NUMERICAL PROBLEMS IN SOME OF THE TERMS WHICH ARISE IN THE SOLUTION OF
151C THE DIFFUSION EQUATIONS.
152C
153C OVROT CALCULATES CONVECTIVE OVERSHOOT BY ARBITRARILY MIXING TO A
154C USER-SPECIFIED FRACTION OF A PRESSURE SCALE HEIGHT ABOVE OR BELOW A
155C CONVECTIVE REGION. IT RETURNS A VECTOR LCZ, WHICH IS TRUE IF A SHELL IS
156C CONVECTIVE FOR ANGULAR MOMENTUM PURPOSES.
157C 7/91 CHANGED CALL TO OVROT.
158 CALL OVROT(HCOMP,HD,HP,HR,HS,HT,LC,M,LCZ,MRZONE,MXZONE,NRZONE,
159 * * NZONE)
160C MHP 9/94 ADDED DISK LOCKING OPTION.
161 LOCK = .FALSE.
162 IF(LDISK .AND. SAGE.LE.TDISK)LOCK = .TRUE.
163 IF(.NOT.LINSTB)THEN
164C STORE THE SURFACE ANGULAR VELOCITY FROM THE BEGINNING OF THE TIMESTEP.
165 OMEGAS = OMEGA(M)
166C ENFORCE SB ROTATION (OR UNIFORM ROTATION LAW IN ENTIRE STAR) IF DESIRED.
167C JNT 2025/09 FOR 05/15 MAKE IMPJMOD=1 ACT LIKE LSOLID
168 IF(LSOLID .OR. (IMPJMOD.EQ.1))THEN
169 DO I = 1,M
170 LCZ(I) = .TRUE.
171 END DO
172 ENDIF
173C GETROT TAKES THE ANGULAR MOMENTUM DISTRIBUTION AND FINDS THE
174C ROTATION CURVE THAT CORRESPONDS TO IT. CONVECTIVE REGIONS HAVE
175C SOLID BODY ROTATION ENFORCED ON THEM.
176 CALL GETROT(HD,HJM,HR,HS,HS2,LCZ,M,ETA2,HI,OMEGA,QIW,R0)
177C ANGULAR MOMENTUM LOSS WITHOUT INTERNAL ANGULAR MOMENTUM TRANSPORT.
178C DO I = 1,M
179C WOLD(I) = OMEGA(I)
180C END DO
181 IF(.NOT.LOCK .AND. LJDOT0 .AND. LC(M)) THEN
182C FIND MOMENT OF INERTIA OF THE SURFACE C.Z.
183 HICZ = 0.0D0
184C ENFORCE SB ROTATION (OR UNIFORM ROTATION LAW IN ENTIRE STAR) IF DESIRED.
185 IF(LSOLID.OR. (IMPJMOD.EQ.1))THEN
186 IMAX = 1
187 ELSE
188 IMAX = MXZONE(NZONE,1)
189 ENDIF
190 DO I = IMAX,M
191 HICZ = HICZ + HI(I)
192 END DO
193C FIND LOWEST SHELL IN SURFACE CZ (IMAX)
194C IMAX = MXZONE(NZONE,1)
195C HSTOP IS THE MASS AT THE TOP OF THE C.Z.
196C HSBOT IS THE MASS AT THE BOTTOM OF THE C.Z.
197 HSTOP = EXP(CLN*HSTOT)
198 IF(IMAX.GT.1)THEN
199 HSBOT = 0.5D0*(HS1(IMAX)+HS1(IMAX-1))
200 ELSE
201 HSBOT = 0.0D0
202 ENDIF
203 LJDOT = LJDOT0
204C MHP 10/02 UNUSED LFIRSTIT REMOVED FROM CALL
205C MHP 10/17 timestep average loss rate
206C FRACSTEP = 1.
207 FRACSTEP = 0.5
208 CALL MWIND(BL,DELTS,HSBOT,HSTOP,IMAX,M,LJDOT,OMEGAS,
209C * SJTOT,SMASS,TEFFL,HICZ,HJM,LFIRSTIT) ! KC 2025-05-31
210 * * SMASS,TEFFL,HICZ,HJM)
211C FIND THE NEW RUN OF OMEGA IN THE CONVECTION ZONE AFTER THE WIND.
212C MHP 10/02 REPLACED IEND WITH M IN CALL, DEFINED IEND=M
213 IEND = M
214C JNT 09/2025 FOR 05/15 REPLACE WCZ WITH WCZIMP
215 CALL WCZIMP(HD,HJM,HR,HS,HS2,IMAX,IEND,ETA2,HI,OMEGA,
216 * * QIW,R0,M)
217 ENDIF
218 GOTO 9999
219 ENDIF
220C GETROT TAKES THE ANGULAR MOMENTUM DISTRIBUTION AND FINDS THE
221C ROTATION CURVE THAT CORRESPONDS TO IT. CONVECTIVE REGIONS HAVE
222C SOLID BODY ROTATION ENFORCED ON THEM.
223 CALL GETROT(HD,HJM,HR,HS,HS2,LCZ,M,ETA2,HI,OMEGA,QIW,R0)
224 LSKIP = .NOT.LINSTB .AND. .NOT.LJDOT
225 IF(LSKIP.OR.DELTS.LE.0.0D0) GOTO 9999
226C NOW LIMIT THE DIFFUSION TIMESTEP TO A MAXIMUM CHANGE IN OMEGA
227C FROM THE PREVIOUS MODEL.
228 IF(DWMAX.EQ.0.0D0) DWMAX = DTWIND
229 NSTEP = INT(DWMAX/DTDIF)
230 IF (MOD(DWMAX,DTDIF).NE.0.0D0) NSTEP = NSTEP + 1
231 NSTEP2 = INT(DTWIND/DTDIF)
232 IF (MOD(DTWIND,DTDIF).NE.0.0D0) NSTEP2 = NSTEP2 + 1
233C NSTEP = MAX(NSTEP,NSTEP2/2)
234 NSTEP = MIN(NSTEP,NSTEP2)
235 DT = DELTS/DFLOAT(NSTEP)
236C FIND BASIC PHYSICAL QUANTITIES NEEDED FOR BOTH SECULAR AND DYNAMICAL
237C INSTABILITES: ADIABATIC AND ACTUAL TEMPERATURE GRADIENTS,OPACITIES,
238C KINEMATIC VISCOSITIES,THERMOMETRIC DIFFUSIVITY, AND HEAT CAPACITY.
239C CALL PHYSIC(FP,FT,HCOMP,HD,HG,HL,HP,HR,HS,HT,LC,LCZ,M,TEFFL) ! KC 2025-05-31
240 CALL PHYSIC(FP,FT,HCOMP,HD,HG,HL,HP,HR,HS,HT,LC,M,TEFFL,CMIXL)
241C 8/17 DETERMINE TAUCZ AND PPHOT
242C CALL GETTAU(HCOMP,HR,HP,HD,HG,HS1,HT,FP,FT,TEFFL, ! KC 2025-05-31
243 CALL GETTAU(HCOMP,HR,HP,HD,HS1,HT,FP,FT,TEFFL,
244 * * HSTOT,BL,M,LC,ENVR,CMIXL)
245C IF DT IS LESS THAN DELTS, THEN THE MODEL TIMESTEP IS TOO LONG FOR THE
246C DIFFUSION CALCULATIONS. IF THIS OCCURS,
247C USE A SERIES OF SMALLER TIMESTEPS THAT DON'T VIOLATE THIS CONDITION.
248C INTERPOLATE THE MODEL STRUCTURE BETWEEN THE OLD MODEL AND THE NEW ONE
249C TO CALCULATE DIFFUSION AND WIND BETWEEN MODELS.
250 SUMDT = 0.0D0
251 LFIRSTIT = .TRUE.
252C DO 20 I = 1,M
253C WOLD(I) = OMEGA(I)
254C 20 CONTINUE
255C ENTRY FOR SERIES OF DIFFUSION TIMESTEPS.
256 30 30 CONTINUE
257 IREDO = 0
258C ENTRY FOR DIFFUSION TIMESTEP CUTTING.
259 40 40 CONTINUE
260C MHP 06/02 CHANGED TO ELIMINATE OCCASIONAL
261C ALMOST ZERO TIMESTEP FROM ROUNDOFF ERROR
262 TEST = DELTS - DELTS*1.0D-6
263 IF(SUMDT+DT.GE.TEST)THEN
264 DT = DELTS - SUMDT
265 SUMDT = DELTS
266 ELSE
267 SUMDT = SUMDT + DT
268 ENDIF
269C COPY OVER PRIOR THETA(TIME) TERM TO TEMPORARY SLOT
270C FOR USE IN THE ADVECTION/DIFFUSION TREATMENT OF MAEDER&ZAHN 1998
271 IF(LFIRSTIT)THEN
272 THP(1) = THO(1)
273 WMST(1) = WOLD(1)
274 DO I = 2,M
275 QWRMST(I) = QWRST(I)
276 THP(I) = THO(I)
277 WMST(I) = WOLD(I)
278 END DO
279C RECOMPUTE THETA
280 ELSE
281 WMST(1) = OMEGA(1)
282 DO I = 2,M
283 WMID = 0.5D0*(OMEGA(I)+OMEGA(I-1))
284 DR = 10.0D0**HRM(I)-10.0D0**HRM(I-1)
285 QW = (OMEGA(I)-OMEGA(I-1))/DR
286 THP(I) = THM(I)*WMID*QW
287 QWRMST(I) = QW
288 WMST(I) = OMEGA(I)
289 END DO
290 ENDIF
291 FX = SUMDT/DELTS
292 FRACSTEP = FX
293C INTERPOLATE LINEARLY IN TIME FOR THE MODEL STRUCTURE BETWEEN THE
294C START AND END OF THE TIMESTEP.
295C JVS
296 CALL MIDMOD(DELTS,DT,FX,HCOMP,HD,HG,HJM,HL,HP,HR,HS,HS1,HS2,
297C * HSTOT,HT,LC,LCZ,LFIRSTIT,M,ETA2M,HDM,HGM,HICZ,HIM, ! KC 2025-05-31
298 * * HSTOT,HT,LC,LFIRSTIT,M,ETA2M,HDM,HGM,HICZ,HIM,
299 * * HLM,HPM,HRM,HSBOT,HSTOP,HTM,IMIN,IMAX,LALLCZ,LCM,
300 * * LCZM,LCZSUR,OMEGAM,R0M,QIWM,MRZONE,MXZONE,NRZONE,
301 * * NZONE,HCOMPS)
302C IF DESIRED, REMOVE ANGULAR MOMENTUM FROM OUTER CONVECTION ZONE
303C USING A WEBER-DAVIS MAGNETIC WIND MODEL
304 IF(.NOT.LOCK .AND. LJDOT .AND. LCZSUR) THEN
305 OMEGAS = OMEGAM(M)
306C WIND CALCULATION WITHOUT INSTABILITIES
307 IF(LALLCZ.OR..NOT.LINSTB) THEN
308C MHP 10/02 UNUSED LFIRSTIT REMOVED FROM CALL
309 CALL MWIND(BL,DT,HSBOT,HSTOP,IMAX,M,LJDOT,OMEGAS,
310C * SJTOT,SMASS,TEFFL,HICZ,HJM,LFIRSTIT) ! KC 2025-05-31
311 * * SMASS,TEFFL,HICZ,HJM)
312C FIND THE NEW OMEGA OF THE CONVECTION ZONE AFTER THE WIND.
313C MHP 10/02 REPLACED IEND WITH M IN CALL, DEFINED IEND=M
314 IEND = M
315C JNT 09/2025 FOR 05/15 REPLACE WCZ WITH WCZIMP
316 CALL WCZIMP(HDM,HJM,HRM,HS,HS2,IMAX,IEND,ETA2M,HIM,OMEGAM,
317 * * QIWM,R0M,M)
318 ENDIF
319 ENDIF
320C NOW CHECK FOR INSTABILITIES IN RADIATIVE REGIONS
321 IF(LINSTB.AND..NOT.LALLCZ) THEN
322C ENSURE THAT CONVECTIVE REGIONS ARE FULLY MIXED.
323C JVS 0212 CALL MIXCZ(HCOMP,HS2,LCZM,M)
324C KC 2025-05-30 addressed warning messages from Makefile.legacy
325C C G Somers 6/14, SET IMIX = .FALSE. SO THE CORRECT GRADS ARE USED.
326C IMIX = .FALSE.
327C CALL MIXCZ(HCOMP,HS2,HS1,LCZM,HRM,HPM,HDM,HGM,M,IMIX)
328C G Somers 6/14, SET LIMIX = .FALSE. SO THE CORRECT GRADS ARE USED.
329 LIMIX = .FALSE.
330C CALL MIXCZ(HCOMP,HS2,HS1,LCZM,HRM,HPM,HDM,HGM,M,LIMIX) ! KC 2025-05-31
331 CALL MIXCZ(HCOMP,HS2,LCZM,M)
332C G Somers END
333C NOW SOLVE FOR LONG-TIMESCALE(SECULAR) INSTABILITIES.
334C THESE ARE TREATED USING DIFFUSION EQUATIONS.
335 DO 60 I = 1,M
336 HJMSAV(I) = HJM(I)
337 60 60 CONTINUE
338C MHP 6/00 ADDED COD2,HV TO LIST RETURNED FROM SECULR
339C FOR THE BUR-ST MIXING ROUTINES
340C CALL SECULR(DELTS,DT,HDM,HGM,HIM,HLM,HPM,HRM,HS,HS1,HS2,
341C * HTM,HJMSAV,LCZM,LCM,M,MODEL,OMEGAM,
342C * HJM,ETA2M,QIWM,R0M,HCOMP,LFIRSTIT,IMIN,IMAX,BL,
343C * HSTOT,SJTOT,SMASS,TEFFL,LREDO,IREDO, ! KC 2025-05-31
344 CALL SECULR(DT,HDM,HGM,HIM,HLM,HPM,HRM,HS,HS1,HS2,
345 * * HTM,HJMSAV,LCZM,M,OMEGAM,
346 * * HJM,ETA2M,QIWM,R0M,HCOMP,IMIN,IMAX,BL,
347 * * HSTOT,SMASS,TEFFL,LREDO,IREDO,
348 * * HICZ,HSBOT,HSTOP,OMEGAS,LCZSUR,
349C * MRZONE,MXZONE,NRZONE,NZONE, ! KC 2025-05-31
350 * * COD2,HV,LOK,HCOMPS)
351C DIFFUSION TIMESTEP CUTTING REQUIRED IF LREDO IS TRUE.
352C RESET MEAN MOLECULAR WEIGHT,COMPOSITION,AND SPECIFIC ANGULAR MOMENTUM
353C TO THE VALUES THEY HAD PRIOR TO THE START OF THE STEP.
354 IF(LREDO)THEN
355 FX = 2.0D0*DT/DELTS
356 SUMDT = SUMDT - 2.0D0*DT
357 DO 80 I = 1,M
358 HJM(I) = HJMSAV(I)
359 AMUM(I) = AMUM(I) - FX*(HAMU(I)-AMUO(I))
360 DO 70 J = 1,NSPEC
361 HCOMP(J,I) = HCOMPP(J,I)
362 70 70 CONTINUE
363 80 80 CONTINUE
364 GOTO 40
365 ENDIF
366 ENDIF
367C MHP 05/02 TAKEN OUT OF LOOP SO THAT NUCLEAR BURNING
368C IS ACCOUNTED FOR IN MODELS THAT ARE FULLY CONVECTIVE
369C OR WITHOUT INSTABILITIES
370C ADDED CHANGE FOR BURLICH-STORER TREATMENT OF MIXING PLUS
371C BURNING - ONLY UPDATED IF NOT USED
372 IF(.NOT.LBURS)THEN
373 DO I = 1,M
374 DO J = 1,11
375 HCOMPP(J,I) = HCOMP(J,I)
376 END DO
377 END DO
378 ENDIF
379 LFIRSTIT = .FALSE.
380C CLEAN UP EXTENDED COMP ARRAYS; ZERO VALUES THROUGHOUT MOST OF THE
381C INTERIOR CAN LEAD TO SMALL NEGATIVE VALUES DUE TO ROUNDOFF ERROR IN
382C THE DIFFUSION CALCULATIONS.
383 IF(LEXCOM)THEN
384C PERFORM LIGHT ELEMENT BURNING.
385C FIND SURFACE C.Z. DEPTH AT THE END OF THE TIME STEP.
386 CALL CONVEC(HCOMP,HDM,HPM,HRM,HS,HTM,LCM,M,MRZONE,MXZONE,
387 * * MXZON0,JCORE1,JENV1,NRZONE,NZONE,NZONE0)
388C 11/91 CHANGED FOR LITHIUM BURNING WITH OVERSHOOT.
389 IF(LOVSTE .AND. LCM(M))THEN
390 PSCAL1 = ALPHAE*EXP(CLNDP*(HPM(JENV1)+2.0D0*HRM(JENV1)
391 * * -HDM(JENV1)-CGL-HS(JENV1)))
392 ELSE
393 PSCAL1 = 0.0D0
394 ENDIF
395C FIND LIGHT ELEMENT BURNING RATES AT THE END OF THE TIME STEP.
396C 10/29/26 MHP via Claude: flag 2 -> 1. J=2 ignored HDM and HTM and
397C recomputed the start-of-step rates; J=1 evaluates the model passed in.
398 CALL LIRATE88(HCOMP,HDM,HTM,M,1)
399C STORE CURRENT "END OF STEP" QUANTITIES AS "BEGINNING" ONES FOR
400C THE NEXT STEP.
401C ADDED CHANGE FOR BURLICH-STORER TREATMENT OF MIXING PLUS
402C BURNING - ONLY UPDATED IF NOT USED
403 IF(.NOT.LINSTB .OR. .NOT.LBURS .OR. LALLCZ)THEN
404C COMPUTE BURNING.
405C CALL LIBURN(DT,HCOMP,HDM,HRM,HS1,HS2,HTM,JENV1,JENV0,M) ! KC 2025-05-31
406 CALL LIBURN(DT,HCOMP,HRM,HS1,HS2,HTM,JENV1,JENV0,M)
407 JENV0 = JENV1
408 PSCAL0 = PSCAL1
409 DO 155 I = 1,M
410 RLI60(I) = RLI6(I)
411 RLI70(I) = RLI7(I)
412 RBE90(I) = RBE9(I)
413 155 155 CONTINUE
414 ELSE
415C COMPUTE BURNING.
416C CALL LIBURN2(DT,HCOMP,HDM,HRM,HS1,HS2,HTM,JENV1,JENV0,M) ! KC 2025-05-31
417 CALL LIBURN2(DT,HCOMP,HRM,HS1,HS2,HTM,JENV1,JENV0,M)
418 ENDIF
419C ENSURE THAT CONVECTIVE REGIONS ARE FULLY MIXED.
420C JVS 0212 CALL MIXCZ(HCOMP,HS2,LCZM,M)
421C KC 2025-05-30 addressed warning messages from Makefile.legacy
422C C G Somers 6/14, SET IMIX = .FALSE. SO THE CORRECT GRADS ARE USED.
423C IMIX = .FALSE.
424C CALL MIXCZ(HCOMP,HS2,HS1,LCZM,HRM,HPM,HDM,HGM,M,IMIX)
425C G Somers 6/14, SET LIMIX = .FALSE. SO THE CORRECT GRADS ARE USED.
426 LIMIX = .FALSE.
427C CALL MIXCZ(HCOMP,HS2,HS1,LCZM,HRM,HPM,HDM,HGM,M,LIMIX) ! KC 2025-05-31
428 CALL MIXCZ(HCOMP,HS2,LCZM,M)
429C G Somers END
430C ZERO OUT LOW ABUNDANCES.
431 DO 100 I = 1,M
432 DO 90 J = 12,15
433 IF(HCOMP(J,I).LT.1.0D-24)HCOMP(J,I)=0.0D0
434 90 90 CONTINUE
435 100 100 CONTINUE
436C MHP 6/00 ADDED OVERWRITE OF HCOMPP FOR LIGHT ELEMENTS
437C ADDED CHANGE FOR BURLICH-STORER TREATMENT OF MIXING PLUS
438C BURNING - ONLY UPDATED IF NOT USED
439 IF(.NOT.LINSTB.OR.LALLCZ)THEN
440 DO I = 1,M
441 DO J = 12,15
442 HCOMPP(J,I) = HCOMP(J,I)
443 END DO
444 END DO
445 ELSE IF(.NOT.LBURS)THEN
446 DO I = 1,M
447 DO J = 12,15
448 HCOMPP(J,I) = HCOMP(J,I)
449 END DO
450 END DO
451 ENDIF
452 ENDIF
453C MHP 6/00 NOW ADDED THE OPTION OF PERFORMING A BUR-ST EXTRAPOLATION
454C TO ZERO TIMESTEP FOR THE COMBINATION OF MIXING AND NUCLEAR BURNING.
455 IF(LINSTB .AND. .NOT.LALLCZ)THEN
456 IF(LBURS)THEN
457 CALL BURSMIX(COD2,DT,HCOMP,HDM,HLM,HPM,HRM,HS,HS1,HS2,HSTOT,
458 * * HTM,HV,IMAX,IMIN,JENV0,JENV1,LOK,LCZM,M,MRZONE,
459 * * MXZONE,NRZONE,NZONE)
460 ENDIF
461 ENDIF
462C RETURN FOR NEXT SMALL DIFFUSION TIMESTEP IF NEEDED.
463 IF(SUMDT.LT.DELTS)GOTO 30
464C UPDATE OMEGA ARRAY TO REFLECT NEW ANGULAR MOMENTUM DISTRIBUTION.
465 DO 110 I = 1,M
466 OMEGA(I) = OMEGAM(I)
467 110 110 CONTINUE
468C MHP 3/96 ADDED CALL TO RECOMPUTE SELF-CONSISTENT SET OF OMEGAS
469 CALL GETROT(HD,HJM,HR,HS,HS2,LCZ,M,ETA2,HI,OMEGA,QIW,R0)
470 9999 9999 CONTINUE
471 IF(LPRT0)THEN
472 BL = LOG10(HL(M))
473 RL = 0.5D0*(BL + CLSUNL - 4.0D0*TEFFL - C4PIL - CSIGL)
474 FX = EXP(CLN*3.0D0*(HR(M)-RL))
475 QSURF = FX*QUAD(M)
476 PSURF = EXP(CLN*(CGL+HSTOT-RL))
477 WRITE(*,9911)QSURF,PSURF,-1.5D0*QSURF/PSURF
478 9911 9911 FORMAT(1X,'QUAD ',1PE12.3,' PHIS ',E12.3,' 3/2 QUAD/G ',
479 * * E12.3)
480 ENDIF
481 RETURN
482 END
1"""Python version of getw.f (YREC development, 7be4133): the evolution of
2the internal rotation over one model step."""
3
4import math
5
6import numpy as np
7
8from pyrec import constants_mod
9from pyrec import dimensions_mod
10from pyrec import disk_mod
11from pyrec import liov_mod
12from pyrec import mdphy_mod
13from pyrec import newrat_mod
14from pyrec import nmlpar_mod
15from pyrec import oldmod_mod
16from pyrec import oldphy_mod
17from pyrec import oldrat_mod
18from pyrec import oldrot2_mod
19from pyrec import oldrot_mod
20from pyrec import ovrtrn_mod
21from pyrec import quadru_mod
22from pyrec import temp_mod
23from pyrec.bursmix import bursmix
24from pyrec.convec import convec
25from pyrec.getrot import getrot
26from pyrec.gettau import gettau
27from pyrec.liburn import liburn
28from pyrec.liburn2 import liburn2
29from pyrec.lirate88 import lirate88
30from pyrec.midmod import midmod
31from pyrec.mixcz import mixcz
32from pyrec.mwind import mwind
33from pyrec.ovrot import ovrot
34from pyrec.physic import physic
35from pyrec.seculr import seculr
36from pyrec.wczimp import wczimp
37
38JSON = dimensions_mod.json
39
40# GETW has SAVE: its local arrays are module-level. HCOMPS (the composition
41# at the start of the step, filled by MIDMOD and read by SECULR) is owned
42# by GETW.
43hcomps = np.zeros((16, JSON + 1))
44lcz = np.zeros(JSON + 1, dtype=bool)
45hjmsav = np.zeros(JSON + 1)
46eta2m = np.zeros(JSON + 1)
47hdm = np.zeros(JSON + 1)
48hgm = np.zeros(JSON + 1)
49him = np.zeros(JSON + 1)
50hlm = np.zeros(JSON + 1)
51hpm = np.zeros(JSON + 1)
52hrm = np.zeros(JSON + 1)
53htm = np.zeros(JSON + 1)
54lcm = np.zeros(JSON + 1, dtype=bool)
55omegam = np.zeros(JSON + 1)
56qiwm = np.zeros(JSON + 1)
57r0m = np.zeros(JSON + 1)
58lczm = np.zeros(JSON + 1, dtype=bool)
59cod2 = np.zeros(JSON + 1)
60hv = np.zeros(JSON + 1)
61mxzone = np.zeros((13, 3), dtype=int)
62mxzon0 = np.zeros((13, 3), dtype=int)
63mrzone = np.zeros((14, 3), dtype=int)
64nrzone = 0
65nzone = 0
66
67
68def _print_quad(bl: float, hl: np.ndarray, hr: np.ndarray, teffl: float, hstot: float, m: int,
69 quad: np.ndarray) -> float:
70 """Label 9999: with LPRT0, print the surface quadrupole term (Fortran
71 lines 470–480).
72
73 Returns BL, overwritten with log10 HL(M), as CRRECT sets it.
74
75 """
76
77 c = constants_mod
78 bl = math.log10(hl[m])
79 rl = 0.5 * (bl + c.clsunl - 4.0 * teffl - c.c4pil - c.csigl)
80 fx = math.exp(c.cln * 3.0 * (hr[m] - rl))
81 qsurf = fx * quad[m]
82 psurf = math.exp(c.cln * (c.cgl + hstot - rl))
83 print(f" QUAD {qsurf:12.3E} PHIS {psurf:12.3E} 3/2 QUAD/G "
84 f"{-1.5 * qsurf / psurf:12.3E}") # format 9911
85 return bl
86
87
88def getw(bl: float, delts: float, dwmax: float, fp: np.ndarray, ft: np.ndarray, hcomp: np.ndarray, hd: np.ndarray,
89 hjm: np.ndarray, hl: np.ndarray, hp: np.ndarray, hr: np.ndarray, hs: np.ndarray, hs1: np.ndarray,
90 hs2: np.ndarray, hstot: float, ht: np.ndarray, lc: np.ndarray, ljdot: bool, m: int, smass: float, teffl: float,
91 eta2: np.ndarray, hg: np.ndarray, hi: np.ndarray, omega: np.ndarray, qiw: np.ndarray, r0: np.ndarray,
92 jenv0: int, cmixl: float, lprt0: bool) -> tuple[float, float, bool, int]:
93 """Evolve the angular momentum distribution over one model step.
94
95 Enforces local conservation of angular momentum in radiative regions
96 and the rotation law in convective regions; with instabilities
97 (LINSTB), solves for the transport of angular momentum and the
98 associated mixing in substeps, with the wind loss (LJDOT0) and, with
99 LEXCOM, lithium and beryllium burning (Pinsonneault et al. 1989).
100
101 Translates: getw.f#GETW (7be4133)
102
103 Parameters
104 ----------
105 bl : float
106 log10 L/Lsun; overwritten when ``lprt0`` is set.
107 delts : float
108 The model time step (s).
109 dwmax : float
110 Largest fractional change of Omega in the last step; 0 is replaced
111 by DTWIND.
112 fp, ft, hcomp, hd, hl, hp, hr, hs, hs1, hs2, ht, lc : arrays
113 The model at the end of the step.
114 hjm : array
115 Specific angular momentum per shell; updated.
116 hstot, smass, teffl : float
117 ljdot : bool
118 Wind on; set to LJDOT0 in the path without instabilities.
119 m : int
120 eta2, hg, hi, omega, qiw, r0 : arrays
121 Rotation quantities; updated.
122 jenv0 : int
123 Base of the convective envelope at the last burning step.
124 cmixl : float
125 Mixing-length parameter, passed to PHYSIC and GETTAU.
126 lprt0 : bool
127 Print the surface quadrupole term.
128
129 Returns
130 -------
131 bl, dwmax, ljdot, jenv0
132
133 """
134
135 global nrzone, nzone
136 c = constants_mod
137 nml = nmlpar_mod
138 o2 = oldrot2_mod
139
140 # LBURS is never changed, so BURSMIX and LIBURN2 are unused? (see the
141 # page) (Fortran line 140).
142 lburs = False
143
144 # The number of species tracked (Fortran lines 143–144).
145 nspec = 11
146 if nml.lexcom:
147 nspec = 15
148
149 # Shells convective for angular momentum (convection plus overshoot)
150 # (Fortran lines 158–159).
151 nrzone, nzone = ovrot(hcomp, hd, hp, hr, hs, ht, lc, m, lcz, mrzone,
152 mxzone, nrzone, nzone)
153
154 # Disk locking (Fortran lines 161–162).
155 lock = False
156 if nml.ldisk and disk_mod.sage <= nml.tdisk:
157 lock = True
158
159 # Without instabilities: solid-body option and Omega from j (Fortran
160 # lines 163–176).
161 if not nml.linstb:
162 omegas = omega[m]
163 if nml.lsolid or nml.impjmod == 1:
164 lcz[1:m + 1] = True
165 getrot(hd, hjm, hr, hs, hs2, lcz, m, eta2, hi, omega, qiw, r0)
166
167 # The wind over the whole step, from the surface convection zone
168 # (or the whole star) (Fortran lines 181–217).
169 if not lock and nml.ljdot0 and lc[m]:
170 hicz = 0.0
171 if nml.lsolid or nml.impjmod == 1:
172 imax = 1
173 else:
174 imax = mxzone[nzone, 1]
175 for i in range(imax, m + 1):
176 hicz = hicz + hi[i]
177 hstop = math.exp(c.cln * hstot)
178 if imax > 1:
179 hsbot = 0.5 * (hs1[imax] + hs1[imax - 1])
180 else:
181 hsbot = 0.0
182 ljdot = nml.ljdot0
183 # Timestep-average loss rate.
184 ovrtrn_mod.fracstep = 0.5
185 mwind(bl, delts, hsbot, hstop, imax, m, ljdot, omegas,
186 smass, teffl, hicz, hjm)
187 iend = m
188 wczimp(hd, hjm, hr, hs, hs2, imax, iend, eta2, hi, omega,
189 qiw, r0, m)
190
191 # GOTO 9999 (Fortran line 218).
192 if lprt0:
193 bl = _print_quad(bl, hl, hr, teffl, hstot, m, quadru_mod.quad)
194 return bl, dwmax, ljdot, jenv0
195
196 # Omega from j, and the exit without instabilities or without a step
197 # (Fortran lines 223–225).
198 getrot(hd, hjm, hr, hs, hs2, lcz, m, eta2, hi, omega, qiw, r0)
199 lskip = not nml.linstb and not ljdot
200 if lskip or delts <= 0.0:
201 if lprt0:
202 bl = _print_quad(bl, hl, hr, teffl, hstot, m, quadru_mod.quad)
203 return bl, dwmax, ljdot, jenv0
204
205 # The number of diffusion substeps (Fortran lines 228–235).
206 if dwmax == 0.0:
207 dwmax = nml.dtwind
208 nstep = int(dwmax / nml.dtdif)
209 if math.fmod(dwmax, nml.dtdif) != 0.0:
210 nstep = nstep + 1
211 nstep2 = int(nml.dtwind / nml.dtdif)
212 if math.fmod(nml.dtwind, nml.dtdif) != 0.0:
213 nstep2 = nstep2 + 1
214 nstep = min(nstep, nstep2)
215 dt = delts / float(nstep)
216
217 # Physics and the overturn time, once per step; ENVR, GETTAU's RBCZ,
218 # is never read: unused? (see the page) (Fortran lines 240–244).
219 physic(fp, ft, hcomp, hd, hg, hl, hp, hr, hs, ht, lc, m, teffl, cmixl)
220 envr = 0.0
221 envr = gettau(hcomp, hr, hp, hd, hs1, ht, fp, ft, teffl, # noqa: F841 (unused in the Fortran too)
222 hstot, bl, m, lc, envr, cmixl)
223
224 # The substeps (Fortran lines 250–251).
225 sumdt = 0.0
226 lfirstit = True
227
228 while True: # label 30
229 iredo = 0
230 while True: # label 40
231 # The substep's end, without a near-zero last step (Fortran
232 # lines 262–268).
233 test = delts - delts * 1.0e-6
234 if sumdt + dt >= test:
235 dt = delts - sumdt
236 sumdt = delts
237 else:
238 sumdt = sumdt + dt
239
240 # Time change of theta, for the d theta/dt term of the
241 # circulation (MHP 06/02) (Fortran lines 271–290).
242 # Suspected bug (see the page): after the first substep, THP and
243 # WMST come from omega, which is not updated until the end of
244 # the step.
245 if lfirstit:
246 o2.thp[1] = o2.tho[1]
247 o2.wmst[1] = oldrot_mod.wold[1]
248 for i in range(2, m + 1):
249 o2.qwrmst[i] = o2.qwrst[i]
250 o2.thp[i] = o2.tho[i]
251 o2.wmst[i] = oldrot_mod.wold[i]
252 else:
253 o2.wmst[1] = omega[1]
254 for i in range(2, m + 1):
255 wmid = 0.5 * (omega[i] + omega[i - 1])
256 dr = 10.0 ** hrm[i] - 10.0 ** hrm[i - 1]
257 qw = (omega[i] - omega[i - 1]) / dr
258 o2.thp[i] = o2.thm[i] * wmid * qw
259 o2.qwrmst[i] = qw
260 o2.wmst[i] = omega[i]
261
262 # The structure in the middle of the substep (Fortran lines
263 # 291–301).
264 fx = sumdt / delts
265 ovrtrn_mod.fracstep = fx
266 (fx, hicz, hsbot, hstop, imin, imax, lallcz, lczsur,
267 nrzone, nzone) = midmod(
268 delts, dt, fx, hcomp, hd, hg, hjm, hl, hp, hr, hs, hs1,
269 hs2, hstot, ht, lc, lfirstit, m, eta2m, hdm, hgm, 0.0, him,
270 hlm, hpm, hrm, 0.0, 0.0, htm, 0, 0, False, lcm,
271 lczm, False, omegam, r0m, qiwm, mrzone, mxzone, nrzone,
272 nzone, hcomps)
273
274 # The wind, here only for a fully convective star (or without
275 # instabilities); otherwise SECULR calls MWIND (Fortran lines
276 # 304–319).
277 if not lock and ljdot and lczsur:
278 omegas = omegam[m]
279 if lallcz or not nml.linstb:
280 mwind(bl, dt, hsbot, hstop, imax, m, ljdot, omegas,
281 smass, teffl, hicz, hjm)
282 iend = m
283 wczimp(hdm, hjm, hrm, hs, hs2, imax, iend, eta2m, him,
284 omegam, qiwm, r0m, m)
285
286 # Instabilities in radiative regions: mix the convection zones,
287 # then SECULR (Fortran lines 321–350).
288 if nml.linstb and not lallcz:
289 limix = False # noqa: F841 (unused in the Fortran too)
290 mixcz(hcomp, hs2, lczm, m)
291 for i in range(1, m + 1): # label 60
292 hjmsav[i] = hjm[i]
293 dt, lredo, iredo, hicz, omegas, lok = seculr(
294 dt, hdm, hgm, him, hlm, hpm, hrm, hs, hs1, hs2,
295 htm, hjmsav, lczm, m, omegam,
296 hjm, eta2m, qiwm, r0m, hcomp, imin, imax, bl,
297 hstot, smass, teffl, False, iredo,
298 hicz, hsbot, hstop, omegas, lczsur,
299 cod2, hv, False, hcomps)
300
301 # Redo the substep (DT already halved): restore j, the
302 # composition and mu (Fortran lines 354–365).
303 if lredo:
304 fx = 2.0 * dt / delts
305 sumdt = sumdt - 2.0 * dt
306 for i in range(1, m + 1): # label 80
307 hjm[i] = hjmsav[i]
308 mdphy_mod.amum[i] = (mdphy_mod.amum[i]
309 - fx * (temp_mod.hamu[i]
310 - oldphy_mod.amuo[i]))
311 for j in range(1, nspec + 1): # label 70
312 hcomp[j, i] = oldmod_mod.hcompp[j, i]
313 continue # GOTO 40
314 break
315
316 # The composition at the start of the next substep (Fortran lines
317 # 372–379).
318 if not lburs:
319 for i in range(1, m + 1):
320 for j in range(1, 12):
321 oldmod_mod.hcompp[j, i] = hcomp[j, i]
322 lfirstit = False
323
324 # Light elements: the convection zone's depth (Fortran lines
325 # 383–387).
326 if nml.lexcom:
327 jcore1, jenv1, nrzone, nzone, nzone0 = convec(
328 hcomp, hdm, hpm, hrm, hs, htm, lcm, m, mrzone, mxzone,
329 mxzon0, 0, 0, nrzone, nzone, 0)
330
331 # Overshoot depth alpha_e H_P, H_P = P r**2 / (rho G m)
332 # (Fortran lines 389–394).
333 if nml.lovste and lcm[m]:
334 liov_mod.pscal1 = nml.alphae * math.exp(
335 c.clndp * (hpm[jenv1] + 2.0 * hrm[jenv1] - hdm[jenv1]
336 - c.cgl - hs[jenv1]))
337 else:
338 liov_mod.pscal1 = 0.0
339
340 # J=1: the end-of-step rates on the model passed in (since
341 # 7be4133) (Fortran line 398).
342 lirate88(hcomp, hdm, htm, m, 1)
343
344 # Burning, and the rates stored for the next step (Fortran lines
345 # 403–418).
346 if not nml.linstb or not lburs or lallcz:
347 liburn(dt, hcomp, hrm, hs1, hs2, htm, jenv1, jenv0, m)
348 jenv0 = jenv1
349 liov_mod.pscal0 = liov_mod.pscal1
350 for i in range(1, m + 1): # label 155
351 oldrat_mod.rli60[i] = newrat_mod.rli6[i]
352 oldrat_mod.rli70[i] = newrat_mod.rli7[i]
353 oldrat_mod.rbe90[i] = newrat_mod.rbe9[i]
354 else:
355 liburn2(dt, hcomp, hrm, hs1, hs2, htm, jenv1, jenv0, m)
356
357 # Mix the convection zones (Fortran lines 426–428).
358 limix = False # noqa: F841 (unused in the Fortran too)
359 mixcz(hcomp, hs2, lczm, m)
360
361 # Zero out low abundances (Fortran lines 431–435).
362 for i in range(1, m + 1): # labels 100, 90
363 for j in range(12, 16):
364 if hcomp[j, i] < 1.0e-24:
365 hcomp[j, i] = 0.0
366
367 # The light elements at the start of the next substep (Fortran
368 # lines 439–451).
369 if not nml.linstb or lallcz:
370 oldmod_mod.hcompp[12:16, 1:m + 1] = hcomp[12:16, 1:m + 1]
371 elif not lburs:
372 oldmod_mod.hcompp[12:16, 1:m + 1] = hcomp[12:16, 1:m + 1]
373
374 # Bulirsch-Stoer mixing plus burning (never reached: LBURS false)
375 # (Fortran lines 455–461).
376 if nml.linstb and not lallcz:
377 if lburs:
378 jenv0 = bursmix(cod2, dt, hcomp, hdm, hlm, hpm, hrm, hs, hs1,
379 hs2, hstot, htm, hv, imax, imin, jenv0, jenv1,
380 lok, lczm, m, mrzone, mxzone, nrzone, nzone)
381
382 # The next substep (Fortran line 463).
383 if not sumdt < delts:
384 break # else GOTO 30
385
386 # The new Omega from the final j (Fortran lines 465–469).
387 for i in range(1, m + 1): # label 110
388 omega[i] = omegam[i]
389 getrot(hd, hjm, hr, hs, hs2, lcz, m, eta2, hi, omega, qiw, r0)
390
391 # The surface quadrupole term (Fortran lines 470–480).
392 if lprt0: # label 9999
393 bl = _print_quad(bl, hl, hr, teffl, hstot, m, quadru_mod.quad)
394 return bl, dwmax, ljdot, jenv0