1CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
2C MICRODIFF
3CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
4 SUBROUTINE MICRODIFF(DT,HCOMP,HQPR,HR,HD,HS1,HT,LC,M,STOT)
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/NMLPAR/ into NMLPAR_MOD.
11 USE NMLPAR_MOD
12C 10/20/26 MHP via Claude
13C code changed to replace implicit typing with IMPLICIT NONE and
14C explicit declarations.
15 IMPLICIT NONE
16 REAL*8 ASLIGHT,DR,DT,EDELLI,EDELR,EDELR_H,EDELX,EDELZ,EDEN,EDEN_H,
17 * * EDXDR,EDXDR_H,EHQPR,EHQPR_H,ELI,ELI_H,EM,EM_H,ER,ER_H,
18 * * ESPEC,ESPEC_H,ETEM,ETEM_H,EX,EX_H,EY,EY_H,EZ,EZ_H,HCOMP,HD,
19 * * HQPR,HQPRU,HR,HRU,HS1,HS1U,HT,HTU,ODEN,OTEM,STOT,STOTU,THEA,
20 * * THEZ,ZSLIGHT,DTU
21 INTEGER I,IBEGIN,IEND,II,J,M,NLIGHT,NPT
22 LOGICAL*4 LALLCZ,LC
23
24C SET NLIGHT TO THE NUMBER OF LIGHT ELEMENTS TO BE DIFFUSED.
25 PARAMETER (NLIGHT=3)
26CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
27C 10/12/26 MHP via Claude
28C code changed to extend COMMON/NMLPAR/ to 234 members, adding the
29C namelist variables that the physics routines read from 27 COMMON
30C blocks which also held derived or working members. Those blocks keep
31C only their non-namelist members; five of them -- NEWMX, VMULT,
32C PMMWIND, CCOUT1 and ENVGEN -- had nothing left and are gone.
33C Derivation-only namelist variables from the same blocks went to
34C COMMON/NMLBYPASS/ instead, not here.
35C
36C Declared identically in all 121 files that hold any of these members.
37C Generated from one member list, so every copy is byte-identical; the
38C linker's 'size of symbol changed' warning is the check that they are.
39C 10/13/26 MHP via Claude: removed the unused COMMON/CONSTANTS/ declaration
40C (no member referenced here; residue of the obsolete-option removals).
41C 10/13/26 MHP via Claude: removed the unused COMMON/IOUNITS/ declaration
42C (no member referenced here; residue of the obsolete-option removals).
43 DIMENSION HCOMP(15,JSON),HQPR(JSON),HR(JSON),HS1(JSON),HT(JSON),
44 * * HD(JSON),HRU(JSON),HTU(JSON),LC(JSON),ODEN(JSON),
45C KC 2025-05-30 fixed -Wconversion
46C * OTEM(JSON),CSLIGHT(NLIGHT),ASLIGHT(NLIGHT),ZSLIGHT(NLIGHT)
47 * * OTEM(JSON),ASLIGHT(NLIGHT),ZSLIGHT(NLIGHT),HS1U(JSON),
48 * * HQPRU(JSON)
49 INTEGER CSLIGHT(NLIGHT)
50 DIMENSION EM(JSON),ER(JSON),EDEN(JSON),ETEM(JSON),EHQPR(JSON),
51 * * EDELR(JSON),EX(JSON),EY(JSON),EZ(JSON),ELI(NLIGHT,JSON),
52 * * ESPEC(3,JSON),EDXDR(JSON)
53 DIMENSION EM_H(JSON),ER_H(JSON),EDEN_H(JSON),ETEM_H(JSON),EHQPR_H(JSON),
54 * * EDELR_H(JSON),EX_H(JSON),EY_H(JSON),EZ_H(JSON),
55 * * ELI_H(NLIGHT,JSON),ESPEC_H(3,JSON),EDXDR_H(JSON),
56 * * EDELX(JSON),EDELZ(JSON),EDELLI(NLIGHT,JSON)
57C
58C SET UP VECTORS FOR LIGHT ELEMENT DIFFUSION. THE LENGTH
59C OF EACH SHOULD EQUAL NLIGHT.
60 DATA CSLIGHT/13,14,15/
61 DATA ASLIGHT/6.015D0,7.016D0,9.012D0/
62 DATA ZSLIGHT/3.0D0,3.0D0,4.0D0/
63 SAVE
64
65C GARRETT SOMERS - 05/2015
66C MICRODIFF IS AN UPDATED HELIUM, METAL, AND LIGHT ELEMENT DIFFUSION
67C ROUTINE. MUCH IS ADAPTED FROM GRSETT.F, WHICH IS RETAINED FOR BACKWARDS
68C COMPATABILITY. FOLLOWS THE FORMULISM OF BAHCALL AND LOEB 1989.
69C
70C MICRODIFF PERFORMS THE FOLLOWING OPERATIONS:
71C 1) TRANSFORMS PYHSICAL VARIABLES TO AN EQUALLY SPACED GRID IN RADIUS
72C (AND MANIPULATES THE MODEL VARIABLES INTO BAHCALL AND LOEB UNITS).
73C 2) CALCULATES DIFFUSION COEFFICIENTS ALONG THE GRID FOR Y, Z, AND FOR
74C LIGHT ELEMENTS. THE DIFFUSION EQUATION HAS TWO TERMS : ONE THAT DEPENDS
75C ON DLNP/DR*DX/DR AND ONE THAT DEPENDS ON D^2X/DR^2. THE DIFFUSION
76C COEFFICIENTS ARE THEMSELVES FUNCTIONS OF BOTH THE THERMAL STRUCTURE,
77C ABUNDANCE, AND THE HYDROGEN GRADIENT.
78C 3) SOLVES THIS DIFFUSION EQUATION IN TWO STEPS. THE FIRST TERM IS SOLVED
79C EXPLICITLY USING THE TWO-STEP LAX-WENDROFF SCHEME (NUMERICAL RECIPES,
80C PRESS ET AL. 1986,CAMBRIDGE UNIVERSITY PRESS,P.633). DIFFUSION
81C COEFFICIENTS ARE RECALCUALTED AT THE GRID MID-POINTS IN THE PROCESS.
82C 4) THE SECOND TERM IS SOLVED IMPLICITLY, USING THE MODIFIED RUN OF
83C ABUNDANCE FOUND IN STEP 3) AS THE 'INITIAL' RUN OF ABUNDANCE.
84C THE IMPLICIT SCHEME ITERATES ON THE DIFFUSION COEFFICIENTS UNTIL
85C THE SOLUTION CONVERGES TO WITHIN THE USER-SPECIFIED TOLERANCE GRTOL.
86C 5) UPDATES ABUNDANCE ARRAYS, TRANSFORMS BACK TO THE MODEL GRID, AND EXITS
87C
88C DT - TIMESTEP (SEC)
89C HCOMP - RUN OF MASS FRACTIONS OF SPECIES.HCOMP(1,..)=X,HCOMP(2,...)=Y
90C HCOMP(3,...)=Z
91C HQPR - DLNP/DR
92C HR - LOG RADIUS (CM)
93C HS1 - MASS (GM), UNLOGGED
94C HT - LOG TEMPERATURE (K)
95C LC - FLAG T/F FOR CONVECTION
96C M - NUMBER OF MODEL POINTS
97C [COMMON] SDEL(2,...) - DEL (=DLNT/DLNP)
98C
99C OUTPUT VARIABLES :
100C
101C NEW RUN OF HCOMP(1-N,...).
102C
103C CONVERT MODEL QUANTITIES TO BAHCALL AND LOEB UNITS; LOCATE
104C BOUNDARIES OF CONVECTIVE CORE AND ENVELOPE IF APPLICABLE;
105C COLLECT PHYSICAL VARIABLES FOR DIFFCO CALCULATION.
106C
107C 10/30/26 MHP via Claude
108C code changed to hand the settling routines copies of DT, STOT, HS1 and
109C HQPR. They convert these to Bahcall-Loeb units in place and back
110C afterwards, and x*c/c need not equal x, so the structure's mass
111C coordinate and MIX's sub-step could change in the last bit each call.
112 DTU = DT
113 STOTU = STOT
114 DO I = 1,M
115 HS1U(I) = HS1(I)
116 HQPRU(I) = HQPR(I)
117 END DO
118 CALL MICRODIFF_SETUP(DTU,HQPRU,HR,HD,HS1U,HT,LC,M,STOTU,HCOMP,HRU,HTU,
119 * * IBEGIN,IEND,LALLCZ,ODEN,OTEM)
120C
121C SKIP SETTLING FOR FULLY CONVECTIVE MODELS.
122 IF(LALLCZ) RETURN
123C TRANSFORM TO AN EQUALLY SPACED GRID IN RADIUS.
124C NOTE : PREFIX E ALONE=VARIABLE AT EQUALLY SPACED GRID POINTS.
125C PREFIX E + SUFFIX _H= VARIABLE AT MIDPOINT BETWEEN EQUALLY
126C SPACED GRID POINTS.(BOTH ARE NEEDED FOR THE DIFFUSION TECHNIQUE).
127C
128C CALL MICRODIFF_MTE(NLIGHT,CSLIGHT,HCOMP,HQPR,HRU,HS1,HTU,IBEGIN,
129C * IEND,M,DR,NPT,LC,ODEN,OTEM,EM,ER,EDEN,ETEM,EHQPR,EDELR, ! KC 2025-05-31
130 CALL MICRODIFF_MTE(NLIGHT,CSLIGHT,HCOMP,HQPRU,HRU,HS1U,IBEGIN,
131 * * IEND,M,DR,NPT,ODEN,OTEM,EM,ER,EDEN,ETEM,EHQPR,EDELR,
132 * * EX,EY,EZ,ELI,EM_H,ER_H,EDEN_H,ETEM_H,EHQPR_H,EDELR_H,
133 * * EX_H,EY_H,EZ_H,ELI_H)
134C
135C PARTIALLY CONSTRUCT THE VECTORS ESPEC AND ESPEC_H, WHICH ARE THE
136C THREE SPECIES USED IN THE THOUL CALCULATION. 1=X, 2=Y, 3=METAL.
137 DO I=1,NPT-1
138 ESPEC(1,I) = EX(I)
139 ESPEC(2,I) = EY(I)
140 ESPEC_H(1,I) = EX_H(I)
141 ESPEC_H(2,I) = EY_H(I)
142 ENDDO
143 ESPEC(1,NPT) = EX(NPT)
144 ESPEC(2,NPT) = EY(NPT)
145c
146CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
147C
148C WITH THE EQUAL GRID CALCULATED, RUN THE DIFFUSION ROUTINE FOR EACH
149C DESIRED ELEMENT. PASS IN EQUAL GRID AND THREE PARAMETERS:
150C J = THOUL COLUMN OF DIFFUSED SPECIES (1 FOR X, 3 OTHERWISE)
151C THEA = ATOMIC WEIGHT OF DIFFUSED SPECIES
152C THEZ = ATOMIC CHARGE OF DIFFUSED SPECIES
153C IN THE CASE OF HYDROGEN DIFFUSION, PASS IN THEA/THEZ FOR IRON SINCE
154C THESE VALUES ARE USED FOR THE METAL ABUNDANCE IN THOUL.
155c
156C DIFFUSE HYDROGEN.
157 IF(LDIFY)THEN
158 J = 1
159 THEA = 55.86D0
160 THEZ = 26.0D0
161C SET ESPEC(3,*) TO THE HEAVY METAL ABUNDANCE.
162 DO I=1,NPT-1
163 ESPEC(3,I) = EZ(I)
164 ESPEC_H(3,I) = EZ_H(I)
165 ENDDO
166 ESPEC(3,NPT) = EZ(NPT)
167C PASS THE EVEN GRID INTO MICRODIFF_RUN TO PERFORM THE DIFFUSION.
168C CALL MICRODIFF_RUN(NLIGHT,CSLIGHT,DR,DT,STOT,NPT,EM,ER,EDEN,ETEM, ! KC 2025-05-31
169 CALL MICRODIFF_RUN(DR,DTU,STOTU,NPT,EM,ER,EDEN,ETEM,
170 * * EHQPR,EDELR,ESPEC,EDXDR,EM_H,ER_H,EDEN_H,ETEM_H,EHQPR_H,
171 * * EDELR_H,ESPEC_H,EDXDR_H,THEA,THEZ,J)
172C STORE THE RUN OF CHANGES TO HYDROGEN
173 DO I = 1,NPT
174 EDELX(I) = ESPEC(1,I)
175 ENDDO
176C RESTORE THE ORIGINAL ESPEC HYDROGEN VECTORS.
177 DO I = 1,NPT-1
178 ESPEC(1,I) = EX(I)
179 ESPEC_H(1,I) = EX_H(I)
180 ENDDO
181 ESPEC(1,NPT) = EX(NPT)
182 ENDIF
183c
184CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
185C
186C DIFFUSE HEAVY METALS.
187 IF(LDIFZ)THEN
188 J = 3
189 THEA = 55.86D0
190 THEZ = 26.0D0
191C SET ESPEC(3,*) TO THE HEAVY METAL ABUNDANCE.
192 DO I=1,NPT-1
193 ESPEC(3,I) = EZ(I)
194 ESPEC_H(3,I) = EZ_H(I)
195 ENDDO
196 ESPEC(3,NPT) = EZ(NPT)
197C PASS THE EVEN GRID INTO MICRODIFF_RUN TO PERFORM THE DIFFUSION.
198C CALL MICRODIFF_RUN(NLIGHT,CSLIGHT,DR,DT,STOT,NPT,EM,ER,EDEN,ETEM, ! KC 2025-05-31
199 CALL MICRODIFF_RUN(DR,DTU,STOTU,NPT,EM,ER,EDEN,ETEM,
200 * * EHQPR,EDELR,ESPEC,EDXDR,EM_H,ER_H,EDEN_H,ETEM_H,EHQPR_H,
201 * * EDELR_H,ESPEC_H,EDXDR_H,THEA,THEZ,J)
202C STORE THE RUN OF CHANGES TO HEAVY METALS
203 DO I=1,NPT
204 EDELZ(I) = ESPEC(3,I)
205 ENDDO
206C THE ORIGINAL HEAVY VECTOR DOESN'T NEED RESTORATION, SINCE IT WILL
207C BE OVERWRITTEN BELOW.
208 ENDIF
209c
210CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
211C
212C DIFFUSE LIGHT ELEMENTS.
213 IF(LDIFLI)THEN
214C ITERATE OVER THE DIFFUSION ROUTINES FOR EACH LIGHT ELEMENT.
215 J = 3
216 DO II = 1,NLIGHT
217 THEA = ASLIGHT(II)
218 THEZ = ZSLIGHT(II)
219C SET ESPEC(3,*) TO THE LIGHT ELEMENT ABUNDANCE.
220 DO I=1,NPT-1
221 ESPEC(3,I) = ELI(II,I)
222 ESPEC_H(3,I) = ELI_H(II,I)
223 ENDDO
224 ESPEC(3,I) = ELI(II,NPT)
225C PASS THE EVEN GRID INTO MICRODIFF_RUN TO PERFORM THE DIFFUSION.
226C CALL MICRODIFF_RUN(NLIGHT,CSLIGHT,DR,DT,STOT,NPT,EM,ER,EDEN,ETEM, ! KC 2025-05-31
227 CALL MICRODIFF_RUN(DR,DTU,STOTU,NPT,EM,ER,EDEN,ETEM,
228 * * EHQPR,EDELR,ESPEC,EDXDR,EM_H,ER_H,EDEN_H,ETEM_H,
229 * * EHQPR_H,EDELR_H,ESPEC_H,EDXDR_H,THEA,THEZ,J)
230C STORE THE NEW RUN OF LIGHT METALS
231 DO I=1,NPT
232 EDELLI(II,I) = ESPEC(3,I)
233 ENDDO
234 ENDDO
235 ENDIF
236C
237CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
238
239C TRANSFORM BACK TO ORIGINAL MODEL GRID; UPDATE HELIUM ARRAY USING
240C X+Y+Z=1. PRINT DIAGNOSTIC OUTPUT.
241c
242 CALL MICRODIFF_ETM(DTU,ER,EDELX,EDELZ,EDELLI,IBEGIN,IEND,NPT,
243 * * HCOMP,HQPRU,HRU,HS1U,HTU,M,STOTU,NLIGHT,CSLIGHT)
244 RETURN
245 END
1"""Python version of microdiff.f (YREC 7be4133): the driver of the newer
2gravitational settling (Bahcall and Loeb 1989) of helium, metals and light
3elements."""
4
5import numpy as np
6
7from pyrec import dimensions_mod
8from pyrec import nmlpar_mod
9from pyrec.microdiff_etm import microdiff_etm
10from pyrec.microdiff_mte import microdiff_mte
11from pyrec.microdiff_run import microdiff_run
12from pyrec.microdiff_setup import microdiff_setup
13
14JSON = dimensions_mod.json
15NLIGHT = 3
16
17# DATA: the light elements (6Li, 7Li, 9Be), their HCOMP rows, atomic
18# weights and charges (index 0 unused).
19CSLIGHT = np.array([0, 13, 14, 15])
20ASLIGHT = np.array([0.0, 6.015, 7.016, 9.012])
21ZSLIGHT = np.array([0.0, 3.0, 3.0, 4.0])
22
23# The Fortran's local arrays and scalars (SAVE).
24hru = np.zeros(JSON + 1)
25htu = np.zeros(JSON + 1)
26oden = np.zeros(JSON + 1)
27otem = np.zeros(JSON + 1)
28em = np.zeros(JSON + 1)
29er = np.zeros(JSON + 1)
30eden = np.zeros(JSON + 1)
31etem = np.zeros(JSON + 1)
32ehqpr = np.zeros(JSON + 1)
33edelr = np.zeros(JSON + 1)
34ex = np.zeros(JSON + 1)
35ey = np.zeros(JSON + 1)
36ez = np.zeros(JSON + 1)
37eli = np.zeros((NLIGHT + 1, JSON + 1))
38espec = np.zeros((4, JSON + 1))
39edxdr = np.zeros(JSON + 1)
40em_h = np.zeros(JSON + 1)
41er_h = np.zeros(JSON + 1)
42eden_h = np.zeros(JSON + 1)
43etem_h = np.zeros(JSON + 1)
44ehqpr_h = np.zeros(JSON + 1)
45edelr_h = np.zeros(JSON + 1)
46ex_h = np.zeros(JSON + 1)
47ey_h = np.zeros(JSON + 1)
48ez_h = np.zeros(JSON + 1)
49eli_h = np.zeros((NLIGHT + 1, JSON + 1))
50espec_h = np.zeros((4, JSON + 1))
51edxdr_h = np.zeros(JSON + 1)
52# EDELX is always set: MICRODIFF runs only with LDIFY on.
53edelx = np.zeros(JSON + 1)
54edelz = np.zeros(JSON + 1)
55edelli = np.zeros((NLIGHT + 1, JSON + 1))
56# The copies handed to the settling routines (Bahcall and Loeb's units).
57hs1u = np.zeros(JSON + 1)
58hqpru = np.zeros(JSON + 1)
59dtu = 0.0
60stotu = 0.0
61ibegin = 0
62iend = 0
63lallcz = False
64dr = 0.0
65npt = 0
66
67
68def microdiff(dt: float, hcomp: np.ndarray, hqpr: np.ndarray, hr: np.ndarray, hd: np.ndarray, hs1: np.ndarray,
69 ht: np.ndarray, lc: np.ndarray, m: int, stot: float) -> None:
70 """Settle hydrogen (LDIFY), the metals as iron (LDIFZ) and the light
71 elements (LDIFLI) over one step: move the model onto an equally spaced
72 grid in radius, diffuse each species there, and map the changes back.
73
74 Translates: microdiff.f#MICRODIFF (7be4133)
75
76 Arguments: the step dt (s); the model's hcomp[k, j], hqpr (dlnP/dr),
77 hr (log r), hd (log rho), hs1 (mass, g), ht (log T) and convective
78 flags lc, with m shells; the total mass stot (g). Arrays have index 0
79 unused.
80
81 Sets in place: hcomp. dt, stot, hs1 and hqpr are not changed: the
82 callees convert copies (dtu, stotu, hs1u, hqpru) to Bahcall and Loeb's
83 units and back.
84
85 Returns nothing.
86
87 """
88
89 global ibegin, iend, lallcz, dr, npt, dtu, stotu
90
91 # Copies for the settling routines (Fortran lines 112–117).
92 dtu = dt
93 stotu = stot
94 for i in range(1, m + 1):
95 hs1u[i] = hs1[i]
96 hqpru[i] = hqpr[i]
97
98 # Units and boundaries; skip settling for fully convective models
99 # (Fortran lines 118–122).
100 dtu, stotu, ibegin, iend, lallcz = microdiff_setup(
101 dtu, hqpru, hr, hd, hs1u, ht, lc, m, stotu, hcomp, hru, htu,
102 ibegin, iend, lallcz, oden, otem)
103 if lallcz:
104 return
105
106 # Transform to an equally spaced grid in radius (E: at the grid points,
107 # E..._H: at the midpoints) (Fortran lines 130–133).
108 dr, npt = microdiff_mte(NLIGHT, CSLIGHT, hcomp, hqpru, hru, hs1u, ibegin,
109 iend, m, dr, npt, oden, otem, em, er, eden, etem,
110 ehqpr, edelr, ex, ey, ez, eli, em_h, er_h, eden_h,
111 etem_h, ehqpr_h, edelr_h, ex_h, ey_h, ez_h, eli_h)
112
113 # The three species of the Thoul calculation: 1 = X, 2 = Y, 3 = metal
114 # (Fortran lines 137–144).
115 for i in range(1, npt):
116 espec[1, i] = ex[i]
117 espec[2, i] = ey[i]
118 espec_h[1, i] = ex_h[i]
119 espec_h[2, i] = ey_h[i]
120 espec[1, npt] = ex[npt]
121 espec[2, npt] = ey[npt]
122
123 # Diffuse hydrogen, with the metals as iron for the third species
124 # (Fortran lines 157–182). Question (see the page): iron, fully
125 # ionized, for all the metals.
126 if nmlpar_mod.ldify:
127 j = 1
128 thea = 55.86
129 thez = 26.0
130 for i in range(1, npt):
131 espec[3, i] = ez[i]
132 espec_h[3, i] = ez_h[i]
133 espec[3, npt] = ez[npt]
134 microdiff_run(dr, dtu, stotu, npt, em, er, eden, etem, ehqpr, edelr,
135 espec, edxdr, em_h, er_h, eden_h, etem_h, ehqpr_h,
136 edelr_h, espec_h, edxdr_h, thea, thez, j)
137 for i in range(1, npt + 1):
138 edelx[i] = espec[1, i]
139 # Restore the original hydrogen vectors.
140 for i in range(1, npt):
141 espec[1, i] = ex[i]
142 espec_h[1, i] = ex_h[i]
143 espec[1, npt] = ex[npt]
144
145 # Diffuse the metals, as iron (Fortran lines 187–208). Question (see the
146 # page): iron for all the metals.
147 if nmlpar_mod.ldifz:
148 j = 3
149 thea = 55.86
150 thez = 26.0
151 for i in range(1, npt):
152 espec[3, i] = ez[i]
153 espec_h[3, i] = ez_h[i]
154 espec[3, npt] = ez[npt]
155 microdiff_run(dr, dtu, stotu, npt, em, er, eden, etem, ehqpr, edelr,
156 espec, edxdr, em_h, er_h, eden_h, etem_h, ehqpr_h,
157 edelr_h, espec_h, edxdr_h, thea, thez, j)
158 for i in range(1, npt + 1):
159 edelz[i] = espec[3, i]
160
161 # Diffuse the light elements, each in turn as the third species
162 # (Fortran lines 213–235). Question (see the page): the metals are left
163 # out of these runs.
164 if nmlpar_mod.ldifli:
165 j = 3
166 for ii in range(1, NLIGHT + 1):
167 thea = ASLIGHT[ii]
168 thez = ZSLIGHT[ii]
169 for i in range(1, npt):
170 espec[3, i] = eli[ii, i]
171 espec_h[3, i] = eli_h[ii, i]
172 # The Fortran's I after DO I=1,NPT-1, that is max(npt, 1),
173 # equal to NPT.
174 i = max(npt, 1)
175 espec[3, i] = eli[ii, npt]
176 microdiff_run(dr, dtu, stotu, npt, em, er, eden, etem, ehqpr,
177 edelr, espec, edxdr, em_h, er_h, eden_h, etem_h,
178 ehqpr_h, edelr_h, espec_h, edxdr_h, thea, thez, j)
179 for i in range(1, npt + 1):
180 edelli[ii, i] = espec[3, i]
181
182 # Back to the model grid; helium by closure (Fortran lines 242–243).
183 dtu, stotu = microdiff_etm(dtu, er, edelx, edelz, edelli, ibegin, iend,
184 npt, hcomp, hqpru, hru, hs1u, htu, m, stotu,
185 NLIGHT, CSLIGHT)