1C $$$$$$
2 SUBROUTINE ROTGRID(COD,COD2,HD,HI,HJMSAV,HL,HP,HR,HRU,HS,HS1,HS2,
3 * * HSTOT,IBEG,IEND,LCZ,M,WSAV,DR,ECOD,
4 * * ECOD2,EI,EJ,EM,EW,LDUM2)
5C 10/15/26 MHP via Claude
6C code changed to take JSON from DIMENSIONS_MOD instead of declaring
7C PARAMETER(JSON=5000) here.
8 USE DIMENSIONS_MOD
9C 10/14/26 MHP via Claude
10C code changed to convert COMMON/SPLIN/ into SPLIN_MOD.
11 USE SPLIN_MOD
12C 10/14/26 MHP via Claude
13C code changed to convert COMMON/MDPHY/ into MDPHY_MOD.
14 USE MDPHY_MOD
15C 10/14/26 MHP via Claude
16C code changed to convert COMMON/EGRID/ into EGRID_MOD.
17 USE EGRID_MOD
18C 10/14/26 MHP via Claude
19C code changed to convert COMMON/DIFAD2/ into DIFAD2_MOD.
20 USE DIFAD2_MOD
21C 10/14/26 MHP via Claude
22C code changed to convert COMMON/DIFAD/ into DIFAD_MOD.
23 USE DIFAD_MOD
24C 10/14/26 MHP via Claude
25C code changed to convert COMMON/NMLPAR/ into NMLPAR_MOD.
26 USE NMLPAR_MOD
27C 10/14/26 MHP via Claude
28C code changed to convert COMMON/CONSTANTS/ into CONSTANTS_MOD.
29 USE CONSTANTS_MOD
30C 10/20/26 MHP via Claude
31C code changed to replace implicit typing with IMPLICIT NONE and
32C explicit declarations.
33 IMPLICIT NONE
34 REAL*8 COD,COD2,DL,DM,DP,DR,ECOD,ECOD2,EI,EI0,EJ,EM,EMBOT,EMTOP,
35 * * EW,FAC,HD,HI,HJMSAV,HL,HP,HR,HRU,HS,HS1,HS2,HSTOT,QCHIR,
36 * * WSAV
37 INTEGER I,I0,I1,IBEG,IEND,II,M,NTAB,NTABB
38 LOGICAL*4 LCZ,LDUM2
39C 9/25/26 MHP via Claude
40C code changed to merge COMMON/CONST/, COMMON/CONST1/, COMMON/CONST2/,
41C and COMMON/CONST3/ into a single COMMON/CONSTANTS/
42C 10/12/26 MHP via Claude
43C code changed to extend COMMON/NMLPAR/ to 234 members, adding the
44C namelist variables that the physics routines read from 27 COMMON
45C blocks which also held derived or working members. Those blocks keep
46C only their non-namelist members; five of them -- NEWMX, VMULT,
47C PMMWIND, CCOUT1 and ENVGEN -- had nothing left and are gone.
48C Derivation-only namelist variables from the same blocks went to
49C COMMON/NMLBYPASS/ instead, not here.
50C
51C Declared identically in all 121 files that hold any of these members.
52C Generated from one member list, so every copy is byte-identical; the
53C linker's 'size of symbol changed' warning is the check that they are.
54C 10/13/26 MHP via Claude: removed the unused COMMON/CTOL/ declaration
55C (no member referenced here; residue of the obsolete-option removals).
56C MHP 05/02
57C 10/13/26 MHP via Claude
58C code changed to drop COMMON/VARFC/, declared here but never used.
59C INPUT VARIABLES
60 DIMENSION HD(JSON),HI(JSON),HJMSAV(JSON),HL(JSON),HP(JSON),
61 * * HR(JSON),HRU(JSON),HS(JSON),HS1(JSON),HS2(JSON),
62 * * LCZ(JSON),WSAV(JSON),COD(JSON),COD2(JSON)
63C OUTPUT VARIABLES
64 DIMENSION ECOD(JSON),ECOD2(JSON),EI(JSON),EJ(JSON),EM(JSON),
65 * * EW(JSON),EI0(JSON)
66C FLAG THE SPECIAL CASE OF A SINGLE UNSTABLE INTERFACE AND EXIT
67 SAVE
68 IF(IEND-IBEG.LE.1)THEN
69 LDUM2 = .TRUE.
70 GOTO 9999
71 ELSE
72 LDUM2 = .FALSE.
73 ENDIF
74C DEFINE A GRID OF EQUALLY SPACED POINTS.
75 CALL GETGRID(HL,HP,HS,IBEG,IEND,M)
76C GETGRID HAS DEFINED A SET OF CO-ORDINATES (CHI) AND EQUALLY SPACED
77C MASS POINTS. NOW FIND THE OTHER QUANTITIES OF INTEREST AT ZONE
78C CENTERS:
79C J/M (TO GET JTOT)
80C I/MR^2 (TO GET ITOT)
81C OMEGA
82C R (NEEDED FOR I CALCULATION) - STORED IN YVAL
83 NTAB = IEND - IBEG + 1
84 DO I = 1,NTAB
85 II = IBEG + I - 1
86 XTAB(I) = CHI(I)
87 YTAB(I) = HR(II)
88 END DO
89 DO I = 1,NTOT
90 XVAL(I) = ECHI(I)
91 END DO
92 CALL OSPLIN(XVAL,YVAL,XTAB,YTAB,NTAB,NTOT)
93C I/MR^2
94 DO I = 1,NTAB
95 II = IBEG + I - 1
96 YTAB(I) = HI(II)/(HS2(II)*HRU(II)**2)
97 END DO
98C MHP 05/02 STORE I/MR^2 FOR LATER USE IN
99C DIFFUSION COEFFICIENTS FOR ANGULAR MOMENTUM
100C TRANSPORT
101 CALL OSPLIN(XVAL,EI0,XTAB,YTAB,NTAB,NTOT)
102C J/M
103 DO I = 1,NTAB
104 II = IBEG + I - 1
105 YTAB(I) = HJMSAV(II)
106 END DO
107 CALL OSPLIN(XVAL,EJ,XTAB,YTAB,NTAB,NTOT)
108C OMEGA
109 DO I = 1,NTAB
110 II = IBEG + I - 1
111 YTAB(I) = WSAV(II)
112 END DO
113 CALL OSPLIN(XVAL,EW,XTAB,YTAB,NTAB,NTOT)
114C CONVERT TO TOTAL I AND TOTAL J OF THE ZONES.
115C INTERMEDIATE POINTS
116 DO I = 2, NTOT-1
117 EM(I) = 0.5D0*(ES1(I+1)-ES1(I-1))
118C MHP 05/02 CHANGED TO REFLECT THE FACT THAT
119C THE INFO PREVIOUSLY STORED IN EI IS NOW IN EI0
120 EI(I) = EI0(I)*EM(I)*EXP(CLN*2.0D0*YVAL(I))
121 EJ(I) = EJ(I)*EM(I)
122 END DO
123C SPECIAL TREATMENT OF THE BOUNDARIES; CAN BE CONVECTIVE.
124C IF CONVECTIVE SUM OVER ALL SHELLS. CARE IS NEEDED TO DO BOOK-KEEPING
125C PROPERLY AT THE EDGES - TOP IS HALFWAY TO EQUALLY SPACED POINT, NOT
126C HALFWAY TO EDGE OF UNEQUALLY SPACED ORIGINAL SET OF POINTS.
127C
128C CENTER
129 EMTOP = 0.5D0*(ES1(2)+ES1(1))
130 IF(IBEG.GT.1)THEN
131 EMBOT = 0.5D0*(HS1(IBEG)+HS1(IBEG-1))
132 ELSE
133 EMBOT = 0.0D0
134 ENDIF
135 EM(1) = EMTOP - EMBOT
136C MHP 05/02 CHANGED TO REFLECT THE FACT THAT
137C THE INFO PREVIOUSLY STORED IN EI IS NOW IN EI0
138 EI(1) = EI0(1)*EM(1)*HRU(IBEG)**2
139 EJ(1) = EJ(1)*EM(1)
140 IF(IBEG.GT.1)THEN
141 DO II = IBEG-1,1,-1
142 IF(.NOT.LCZ(II))THEN
143 I0 = I + 1
144 GOTO 10
145 ENDIF
146 EM(1) = EM(1)+HS2(II)
147 EI(1) = EI(1)+HI(II)
148 EJ(1) = EJ(1)+HJMSAV(II)*HS2(II)
149 END DO
150 I0 = 1
151 10 10 CONTINUE
152 ELSE
153 I0 = 1
154 ENDIF
155C SURFACE
156 EMBOT = 0.5D0*(ES1(NTOT)+ES1(NTOT-1))
157 IF(IEND.LT.M)THEN
158 EMTOP = 0.5D0*(HS1(IEND)+HS1(IEND+1))
159 ELSE
160 EMTOP = EXP(CLN*HSTOT)
161 ENDIF
162 EM(NTOT) = EMTOP - EMBOT
163C MHP 05/02 CHANGED TO REFLECT THE FACT THAT
164C THE INFO PREVIOUSLY STORED IN EI IS NOW IN EI0
165 EI(NTOT) = EI0(NTOT)*EM(NTOT)*HRU(IEND)**2
166 EJ(NTOT) = EJ(NTOT)*EM(NTOT)
167 IF(IEND.LT.M)THEN
168 DO II = IEND+1,M
169 IF(.NOT.LCZ(II))THEN
170 I1 = I -1
171 GOTO 20
172 ENDIF
173 EM(NTOT) = EM(NTOT)+HS2(II)
174 EI(NTOT) = EI(NTOT)+HI(II)
175 EJ(NTOT) = EJ(NTOT)+HJMSAV(II)*HS2(II)
176 END DO
177 I1 = M
178 20 20 CONTINUE
179 ELSE
180 I1 = M
181 ENDIF
182C NOW SOLVE FOR QUANTITIES NEEDED AT THE ZONE EDGES. THESE ARE
183C RELATED TO THE DIFFUSION COEFFICIENTS. UNLIKE THE EQUALLY SPACED
184C GRID IN R, WE NEED TO INCLUDE A JACOBIAN TERM FOR THE TRANSFORMATION
185C OF VARIABLES.
186C DIFFUSION COEFFICIENT FOR ANGULAR MOMENTUM - ASSUME CONSTANT BELOW
187C BOTTOM INTERFACE OR ABOVE TOP INTERFACE
188 XTAB(1) = CHI(1)
189 YTAB(1) = COD(IBEG+1)
190 DO I = 2,NTAB
191 II = IBEG + I - 1
192 XTAB(I) = 0.5D0*(CHI(I)+CHI(I-1))
193 YTAB(I) = COD(II)
194 END DO
195 NTABB = NTAB + 1
196 XTAB(NTABB) = CHI(NTAB)
197 YTAB(NTABB) = COD(IEND)
198 XVAL(1) = CHI(1)
199 DO I = 2, NTOT
200 XVAL(I) = ECHI(I)-0.5D0*DCHI
201 END DO
202 CALL OSPLIN(XVAL,ECOD,XTAB,YTAB,NTABB,NTOT)
203C DIFFUSION COEFFICIENT FOR MIXING - ASSUME CONSTANT BELOW
204C BOTTOM INTERFACE OR ABOVE TOP INTERFACE
205 YTAB(1) = COD2(IBEG+1)
206 DO I = 2,NTAB
207 II = IBEG + I - 1
208 YTAB(I) = COD2(II)
209 END DO
210 YTAB(NTABB) = COD2(IEND)
211 CALL OSPLIN(XVAL,ECOD2,XTAB,YTAB,NTABB,NTOT)
212C ADD DIFFUSION PLUS ADVECTION TREATMENT IF DESIRED
213 IF(LDIFAD)THEN
214 FAC = 0.2D0*C4PI*FW
215 YTAB(1) = FAC*VESA(IBEG + 1)
216 DO I = 2,NTAB
217 II = IBEG + I - 1
218 YTAB(I) = FAC*VESA(II)
219 END DO
220 YTAB(NTABB) = FAC*VESA(IEND)
221 CALL OSPLIN(XVAL,ECOD3,XTAB,YTAB,NTABB,NTOT)
222 YTAB(1) = FAC*VESD(IBEG + 1)
223 DO I = 2,NTAB
224 II = IBEG + I - 1
225 YTAB(I) = FAC*VESD(II)
226 END DO
227 YTAB(NTABB) = FAC*VESD(IEND)
228 CALL OSPLIN(XVAL,ECOD4,XTAB,YTAB,NTABB,NTOT)
229C MHP 05/02 NOTE THAT THE COMPOSITION DIFFUSION COEFFICIENTS
230C SHOULD BE ADDED TO THE DIFFUSIVE PART OF THE DIFFUSION + ADVECTION
231C ANGULAR MOMENTUM TRANSPORT; C.F. ZAHN 1992. ESSENTIALLY THE
232C ORIGINAL VESD TERM IS THE DIFFUSIVE COMPONENT FROM HORIZONTAL
233C TRANSPORT WHILE THE COD2 TERM REPRESENTS THE DIFFUSIVE COMPONENT
234C FROM VERTICAL TRANSPORT.
235 DO I = 1, NTOT
236 ECOD4(I) = ECOD4(I) + ECOD2(I)
237 END DO
238 ENDIF
239C PRODUCT OF RHO R^2 BY D CHI/DR
240 DM = HPTTOL(2)
241 DL = HPTTOL(9)*HL(M)*CLSUN
242 DP = HPTTOL(11)
243 DO I = 1, NTAB
244 II = IBEG + I - 1
245 XTAB(I) = CHI(I)
246C D CHI/DR = 1/DM*( D LOG M/DR) + 1/DL*(DL/DR) - 1/DP*(D LOG P/DR)
247C OR, USING FAC = 4*PI*RHO*R**2
248C D CHI/DR = FAC/(LN 10 * DM * M) + FAC*EPSILON/DL + RHO*GM/(LN10*DP*R**2)
249C STORED IN YVAL
250 FAC = C4PI*EXP(CLN*(HD(II)+2.0D0*HR(II)))
251 QCHIR = FAC/(CLN*DM*HS1(II))+FAC*EPSM(II)/DL+
252 * * EXP(CLN*(CGL+HD(II)+HS(II)-HP(II)-2.0D0*HR(II)))/(CLN*DP)
253 YTAB(I) = HD(II) + LOG10(QCHIR) + 2.0D0*HR(II)
254 END DO
255 CALL OSPLIN(XVAL,YVAL,XTAB,YTAB,NTAB,NTOT)
256C NOW ADD MULTIPLICATIVE FACTORS TO DIFFUSION COEFFICIENTS
257C NOTE THAT A FACTOR OF 4PI HAS ALREADY BEEN INCLUDED IN
258C CODIFF.
259 DO I = 1, NTOT
260 ECOD2(I) = ECOD2(I)*EXP(CLN*YVAL(I))
261 END DO
262C PRODUCT OF RHO R^4 BY D CHI/DR - STORED IN YVAL
263C MHP 05/02 ADDED FACTOR OF I/MR^2 - 2/3 FOR A SPHERICAL SHELL
264 DO I = 1, NTAB
265 II = IBEG + I - 1
266C YTAB(I) = YTAB(I) + 2.0D0*HR(II) + LOG10(EI0(I))
267 YTAB(I) = YTAB(I) + LOG10(HI(II)/HS2(II))
268 END DO
269 CALL OSPLIN(XVAL,YVAL,XTAB,YTAB,NTAB,NTOT)
270C NOW ADD MULTIPLICATIVE FACTORS TO DIFFUSION COEFFICIENTS
271 DO I = 1, NTOT
272 ECOD(I) = ECOD(I)*EXP(CLN*YVAL(I))
273 END DO
274C MHP 05/02
275 IF(LDIFAD)THEN
276 DO I = 1,NTOT
277 ECOD3(I) = ECOD3(I)*EXP(CLN*YVAL(I))
278 ECOD4(I) = ECOD4(I)*EXP(CLN*YVAL(I))
279 END DO
280 ENDIF
281C REDEFINE DR AS DCHI
282 DR = DCHI
283 9999 9999 CONTINUE
284 RETURN
285 END
1"""Python version of rotgrid.f (YREC 7be4133): one radiative region mapped
2onto an equally spaced grid for the transport of angular momentum."""
3
4import math
5
6import numpy as np
7
8from pyrec import constants_mod
9from pyrec import difad2_mod
10from pyrec import difad_mod
11from pyrec import dimensions_mod
12from pyrec import egrid_mod
13from pyrec import mdphy_mod
14from pyrec import nmlpar_mod
15from pyrec import splin_mod
16from pyrec.getgrid import getgrid
17from pyrec.osplin import osplin
18
19# The local array EI0 (SAVE): I/(m r^2) at the new points.
20ei0 = np.zeros(dimensions_mod.json + 1)
21
22
23def _edge_table(ytab: np.ndarray, values: np.ndarray, ibeg: int, iend: int, ntab: int,
24 fac: float = 1.0) -> None:
25 """The edge values for OSPLIN: fac*values at IBEG+1, IBEG+1..IEND
26 and IEND, beside XTAB's ends and half-way points."""
27
28 ytab[1] = fac * values[ibeg + 1]
29 for i in range(2, ntab + 1):
30 ii = ibeg + i - 1
31 ytab[i] = fac * values[ii]
32 ytab[ntab + 1] = fac * values[iend]
33
34
35def rotgrid(cod: np.ndarray, cod2: np.ndarray, hd: np.ndarray, hi: np.ndarray, hjmsav: np.ndarray, hl: np.ndarray,
36 hp: np.ndarray, hr: np.ndarray, hru: np.ndarray, hs: np.ndarray, hs1: np.ndarray, hs2: np.ndarray,
37 hstot: float, ibeg: int, iend: int, lcz: np.ndarray, m: int, wsav: np.ndarray, dr: float, ecod: np.ndarray,
38 ecod2: np.ndarray, ei: np.ndarray, ej: np.ndarray, em: np.ndarray, ew: np.ndarray,
39 ldum2: bool) -> tuple[float, bool]:
40 """Map the radiative region ibeg..iend onto points equally spaced in
41 the mesh coordinate chi (GETGRID), and compute there the zones'
42 masses, moments of inertia, angular momenta and angular velocities
43 (at the centers) and the diffusion coefficients times the Jacobian
44 rho r^2 dchi/dr (at the edges). End zones take in any neighboring
45 convection zone whole.
46
47 Translates: rotgrid.f#ROTGRID (7be4133)
48
49 Arguments: the model's cod, cod2, hd, hi, hjmsav, hl, hp, hr, hru, hs,
50 hs1, hs2 (index 0 unused); hstot; ibeg, iend, the region; lcz; m;
51 wsav; dr (set); ecod, ecod2, ei, ej, em, ew, set in place on the new
52 grid; ldum2 (set). Returns (dr, ldum2): dr = DCHI, and ldum2 True
53 (nothing done) when the region has at most one interface.
54
55 """
56
57 c = constants_mod
58 nml = nmlpar_mod
59 xval = splin_mod.xval
60 yval = splin_mod.yval
61 xtab = splin_mod.xtab
62 ytab = splin_mod.ytab
63
64 # A single unstable interface: nothing to do (Fortran lines 66–73).
65 if iend - ibeg <= 1:
66 ldum2 = True
67 return dr, ldum2 # goto 9999
68 ldum2 = False
69
70 # The grid of equally spaced points (Fortran lines 74–75).
71 getgrid(hl, hp, hs, ibeg, iend, m)
72 chi = egrid_mod.chi
73 echi = egrid_mod.echi
74 es1 = egrid_mod.es1
75 ntot = egrid_mod.ntot
76 ntab = iend - ibeg + 1
77
78 # 1. Zone centers: log r, I/(m r^2), j and Omega on the new points
79 # (Fortran lines 76–113).
80 for i in range(1, ntab + 1):
81 ii = ibeg + i - 1
82 xtab[i] = chi[i]
83 ytab[i] = hr[ii]
84 for i in range(1, ntot + 1):
85 xval[i] = echi[i]
86 osplin(xval, yval, xtab, ytab, ntab, ntot)
87 for i in range(1, ntab + 1):
88 ii = ibeg + i - 1
89 ytab[i] = hi[ii] / (hs2[ii] * hru[ii]**2)
90 osplin(xval, ei0, xtab, ytab, ntab, ntot)
91 for i in range(1, ntab + 1):
92 ii = ibeg + i - 1
93 ytab[i] = hjmsav[ii]
94 osplin(xval, ej, xtab, ytab, ntab, ntot)
95 for i in range(1, ntab + 1):
96 ii = ibeg + i - 1
97 ytab[i] = wsav[ii]
98 osplin(xval, ew, xtab, ytab, ntab, ntot)
99
100 # Total I and J of the interior zones (Fortran lines 114–122).
101 for i in range(2, ntot):
102 em[i] = 0.5 * (es1[i + 1] - es1[i - 1])
103 ei[i] = ei0[i] * em[i] * math.exp(c.cln * 2.0 * yval[i])
104 ej[i] = ej[i] * em[i]
105 i = max(2, ntot) # the Fortran's I after the loop
106
107 # 2. The inner end zone, with any convection zone below it (Fortran
108 # lines 123–154).
109 emtop = 0.5 * (es1[2] + es1[1])
110 if ibeg > 1:
111 embot = 0.5 * (hs1[ibeg] + hs1[ibeg - 1])
112 else:
113 embot = 0.0
114 em[1] = emtop - embot
115 # r^2 at the shell IBEG, the same as the interpolated value.
116 ei[1] = ei0[1] * em[1] * hru[ibeg]**2
117 ej[1] = ej[1] * em[1]
118 if ibeg > 1:
119 for ii in range(ibeg - 1, 0, -1):
120 if not lcz[ii]:
121 # I, not II; i0 is unused?
122 i0 = i + 1 # noqa: F841 (unused in the Fortran too)
123 break # goto 10
124 em[1] = em[1] + hs2[ii]
125 ei[1] = ei[1] + hi[ii]
126 ej[1] = ej[1] + hjmsav[ii] * hs2[ii]
127 else:
128 i0 = 1
129 else:
130 i0 = 1 # noqa: F841 (unused in the Fortran too)
131
132 # The outer end zone, with any convection zone above it (Fortran
133 # lines 155–181).
134 embot = 0.5 * (es1[ntot] + es1[ntot - 1])
135 if iend < m:
136 emtop = 0.5 * (hs1[iend] + hs1[iend + 1])
137 else:
138 emtop = math.exp(c.cln * hstot)
139 em[ntot] = emtop - embot
140 ei[ntot] = ei0[ntot] * em[ntot] * hru[iend]**2
141 ej[ntot] = ej[ntot] * em[ntot]
142 if iend < m:
143 for ii in range(iend + 1, m + 1):
144 if not lcz[ii]:
145 i1 = i - 1 # noqa: F841 (unused in the Fortran too; I, not II)
146 break # goto 20
147 em[ntot] = em[ntot] + hs2[ii]
148 ei[ntot] = ei[ntot] + hi[ii]
149 ej[ntot] = ej[ntot] + hjmsav[ii] * hs2[ii]
150 else:
151 i1 = m
152 else:
153 i1 = m # noqa: F841 (unused in the Fortran too)
154
155 # 3. Zone edges: the diffusion coefficients at chi - dchi/2 (Fortran
156 # lines 182–211).
157 xtab[1] = chi[1]
158 for i in range(2, ntab + 1):
159 xtab[i] = 0.5 * (chi[i] + chi[i - 1])
160 ntabb = ntab + 1
161 xtab[ntabb] = chi[ntab]
162 _edge_table(ytab, cod, ibeg, iend, ntab)
163 xval[1] = chi[1]
164 for i in range(2, ntot + 1):
165 xval[i] = echi[i] - 0.5 * egrid_mod.dchi
166 osplin(xval, ecod, xtab, ytab, ntabb, ntot)
167 _edge_table(ytab, cod2, ibeg, iend, ntab)
168 osplin(xval, ecod2, xtab, ytab, ntabb, ntot)
169
170 # With LDIFAD, the advective and diffusive terms; unused? (DADCOEFT
171 # sets ecod3, ecod4 afresh) (Fortran lines 212–238).
172 if nml.ldifad:
173 fac = 0.2 * c.c4pi * nml.fw
174 _edge_table(ytab, difad2_mod.vesa, ibeg, iend, ntab, fac)
175 osplin(xval, difad_mod.ecod3, xtab, ytab, ntabb, ntot)
176 _edge_table(ytab, difad2_mod.vesd, ibeg, iend, ntab, fac)
177 osplin(xval, difad_mod.ecod4, xtab, ytab, ntabb, ntot)
178 for i in range(1, ntot + 1):
179 difad_mod.ecod4[i] = difad_mod.ecod4[i] + ecod2[i]
180
181 # 4. The Jacobian rho r^2 dchi/dr, interpolated in log10; question
182 # (see the page): the comment omits P (Fortran lines 239–255).
183 dm = nml.hpttol[2]
184 dl = nml.hpttol[9] * hl[m] * c.clsun
185 dp = nml.hpttol[11]
186 for i in range(1, ntab + 1):
187 ii = ibeg + i - 1
188 xtab[i] = chi[i]
189 fac = c.c4pi * math.exp(c.cln * (hd[ii] + 2.0 * hr[ii]))
190 qchir = (fac / (c.cln * dm * hs1[ii]) + fac * mdphy_mod.epsm[ii] / dl
191 + math.exp(c.cln * (c.cgl + hd[ii] + hs[ii] - hp[ii]
192 - 2.0 * hr[ii])) / (c.cln * dp))
193 ytab[i] = hd[ii] + math.log10(qchir) + 2.0 * hr[ii]
194 osplin(xval, yval, xtab, ytab, ntab, ntot)
195
196 # The factor for the composition coefficient (Fortran lines 256–261).
197 for i in range(1, ntot + 1):
198 ecod2[i] = ecod2[i] * math.exp(c.cln * yval[i])
199
200 # rho r^2 (I/m) dchi/dr for the angular-momentum coefficients
201 # (Fortran lines 262–280).
202 for i in range(1, ntab + 1):
203 ii = ibeg + i - 1
204 ytab[i] = ytab[i] + math.log10(hi[ii] / hs2[ii])
205 osplin(xval, yval, xtab, ytab, ntab, ntot)
206 for i in range(1, ntot + 1):
207 ecod[i] = ecod[i] * math.exp(c.cln * yval[i])
208 if nml.ldifad:
209 for i in range(1, ntot + 1):
210 difad_mod.ecod3[i] = difad_mod.ecod3[i] * math.exp(c.cln * yval[i])
211 difad_mod.ecod4[i] = difad_mod.ecod4[i] * math.exp(c.cln * yval[i])
212
213 # DR is DCHI (Fortran lines 281–283; label 9999).
214 dr = egrid_mod.dchi
215 return dr, ldum2