1C $$$$$$
2C SUBROUTINE SETUPV(HD,HG,HL,HP,HR,HS1,HT,IMIN,IMAX,LCZ,M,HRU, ! KC 2025-05-31
3 SUBROUTINE SETUPV(HD,HG,HL,HP,HR,HS1,HT,IMIN,IMAX,M,HRU,
4 * * QWRMAX,FACI)
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/VFACT/ into VFACT_MOD.
11 USE VFACT_MOD
12C 10/14/26 MHP via Claude
13C code changed to convert COMMON/TAUKH/ into TAUKH_MOD.
14 USE TAUKH_MOD
15C 10/14/26 MHP via Claude
16C code changed to convert COMMON/ROTDER/ into ROTDER_MOD.
17 USE ROTDER_MOD
18C 10/14/26 MHP via Claude
19C code changed to convert COMMON/OLDROT2/ into OLDROT2_MOD.
20 USE OLDROT2_MOD
21C 10/14/26 MHP via Claude
22C code changed to convert COMMON/MDPHY/ into MDPHY_MOD.
23 USE MDPHY_MOD
24C 10/14/26 MHP via Claude
25C code changed to convert COMMON/INTVAR/ into INTVAR_MOD.
26 USE INTVAR_MOD
27C 10/14/26 MHP via Claude
28C code changed to convert COMMON/EGRIDDER/ into EGRIDDER_MOD.
29 USE EGRIDDER_MOD
30C 10/14/26 MHP via Claude
31C code changed to convert COMMON/DIFAD3/ into DIFAD3_MOD.
32 USE DIFAD3_MOD
33C 10/14/26 MHP via Claude
34C code changed to convert COMMON/NMLPAR/ into NMLPAR_MOD.
35 USE NMLPAR_MOD
36C 10/14/26 MHP via Claude
37C code changed to convert COMMON/CONSTANTS/ into CONSTANTS_MOD.
38 USE CONSTANTS_MOD
39C 10/20/26 MHP via Claude
40C code changed to replace implicit typing with IMPLICIT NONE and
41C explicit declarations.
42 IMPLICIT NONE
43 REAL*8 A21,A31,A32,A41,A42,A43,C1,CG,CG2,CPIGI,CPMI,D1,D2,D3,D4,
44 * * DDEL,DELMU,DMIN,DR,EM,ETA,F1,F2,F3,FAC,FACI,FF,FL,FNU,HD,
45 * * HG,HL,HP,HPSC,HR,HRU,HS1,HT,HTM,HTP,HTP2,HTSC,OPM,QC1R,
46 * * QCHIT,QDR,QETM,QHTR,QQC1RR,QQCHITR,QWRMAX,V0,XA1,XA2,XA3,
47 * * XA4
48 INTEGER I,I0,I1,IMAX,IMIN,M
49
50C 10/13/26 MHP via Claude
51C FACI is now a dummy argument, formerly COMMON/INTFAC/.
52 DIMENSION FACI(4,JSON)
53C 9/25/26 MHP via Claude
54C code changed to merge COMMON/CONST/, COMMON/CONST1/, COMMON/CONST2/,
55C and COMMON/CONST3/ into a single COMMON/CONSTANTS/
56C MHP 06/02 ADDED FACT7 AND FACT8 FOR DIF/AD TREATMENT
57C 10/13/26 MHP via Claude
58C code changed to replace COMMON/INTFAC/ with an explicit argument:
59C setupv.f fills FACI and vcirc.f reads it, both called only from
60C seculr.f, which now owns the storage.
61C MHP 3/92 COMMON BLOCK ADDED FOR SHEAR VELOCITY
62C MHP 06/02
63C Time change of theta
64C CAPPA AND EPSILON DERIVATIVES
65C 10/13/26 MHP via Claude
66C code changed to drop the write-only members SQOD and SQED from
67C COMMON/ROTDER/. coefft.f assigned both and nothing ever read them;
68C setupv.f, the block's only reader, uses SQOT, SQET and FRACNUC. That
69C frees 10,000 words. The block itself stays: coefft.f and setupv.f sit
70C in different phases -- setupv.f is reached via seculr.f -- so passing
71C the rest explicitly would mean threading 15,000-word arrays through
72C main.f and GETW.
73C DEFINITION TERMS FOR THE SECOND AND THIRD DERIVATIVE
74C TERMS IN THE ZAHN FORMULATION
75C MHP 06/02
76C HIGHER ORDER TERMS IN M.C. VELOCITY
77C 10/12/26 MHP via Claude
78C code changed to extend COMMON/NMLPAR/ to 234 members, adding the
79C namelist variables that the physics routines read from 27 COMMON
80C blocks which also held derived or working members. Those blocks keep
81C only their non-namelist members; five of them -- NEWMX, VMULT,
82C PMMWIND, CCOUT1 and ENVGEN -- had nothing left and are gone.
83C Derivation-only namelist variables from the same blocks went to
84C COMMON/NMLBYPASS/ instead, not here.
85C
86C Declared identically in all 121 files that hold any of these members.
87C Generated from one member list, so every copy is byte-identical; the
88C linker's 'size of symbol changed' warning is the check that they are.
89C 10/13/26 MHP via Claude
90C code changed to drop COMMON/VARFC/, declared here but never used.
91C JvS 09/25 CHANGED CPM --> CPMI TO AVOID CONFLICT IN MDPHY
92 DIMENSION HD(JSON),HG(JSON),HL(JSON),HP(JSON),HR(JSON),HS1(JSON),
93C * HT(JSON),LCZ(JSON),HRU(JSON),QWRMAX(JSON), ! KC 2025-05-31
94 * * HT(JSON),HRU(JSON),QWRMAX(JSON),
95 * * CPMI(JSON),OPM(JSON)
96 SAVE
97C THE PROCEDURE FOR CALCULATING STABILITY AGAINST ROTATIONALLY INDUCED
98C MIXING IS AS FOLLOWS:
99C STABILITY IS CALCULATED FOR THE I/I-1 INTERFACE; QUANTITIES RELATED
100C TO STABILITY AT THIS INTERFACE ARE STORED IN ARRAY ELEMENT(S) I.
101C EACH STABILITY CRITERION IS EXPRESSED AS FOLLOWS:
102C A COMBINATION OF VARIABLES(RHO,P,ETC.)STORED AT EACH SHELL
103C MULTIPLIED BY A GRADIENT BETWEEN THE SHELLS MUST BE LESS THAN
104C SOME CRITICAL NUMBER.
105C SETUPV CALCULATES THE FACTORS WHICH ARE BASED ON
106C QUANTITIES WHICH DO NOT CHANGE DURING A DIFFUSION TIMESTEP.
107C
108C FIND UNLOGGED RADII OF THE MODEL POINTS.
109 DO 5 I = 1,M
110 HRU(I) = EXP(CLN*HR(I))
111 5 5 CONTINUE
112C FIND LOCATION (IN RADIUS) OF THE MIDPOINTS OF THE INTERFACES.
113 DO 10 I = 2,M
114 RM(I) = 0.5D0*(HRU(I) + HRU(I-1))
115 10 10 CONTINUE
116C FIND 4 POINT LAGRANGIAN INTERPOLATION FACTORS FOR ALL INTERFACES.
117C INTERFACE BETWEEN FIRST AND SECOND POINT USES THE FIRST 4 POINTS FOR
118C INTERPOLATION; BETWEEN LAST AND SECOND TO LAST USES THE LAST FOUR POINTS
119C AND BETWEEN I AND I-1 USES I-2,I-1,I,I+1.
120C TREATMENT OF FIRST INTERFACE.
121 IF(IMIN.LT.3)THEN
122 A43 = HRU(4) - HRU(3)
123 A42 = HRU(4) - HRU(2)
124 A41 = HRU(4) - HRU(1)
125 A32 = HRU(3) - HRU(2)
126 A31 = HRU(3) - HRU(1)
127 A21 = HRU(2) - HRU(1)
128 D1 = -A21*A31*A41
129 D2 = A21*A32*A42
130 D3 = -A31*A32*A43
131 D4 = A41*A42*A43
132 XA1 = RM(2) - HRU(1)
133 XA2 = RM(2) - HRU(2)
134 XA3 = RM(2) - HRU(3)
135 XA4 = RM(2) - HRU(4)
136 FACI(1,2) = (XA2*XA3*XA4)/D1
137 FACI(2,2) = (XA1*XA3*XA4)/D2
138 FACI(3,2) = (XA1*XA2*XA4)/D3
139 FACI(4,2) = (XA1*XA2*XA3)/D4
140 I0 = 3
141 PM(2)=EXP(CLN*(HP(1)*FACI(1,2)+HP(2)*FACI(2,2)
142 * * +HP(3)*FACI(3,2)+HP(4)*FACI(4,2)))
143 TM(2)=EXP(CLN*(HT(1)*FACI(1,2)+HT(2)*FACI(2,2)
144 * * +HT(3)*FACI(3,2)+HT(4)*FACI(4,2)))
145 DM(2)=EXP(CLN*(HD(1)*FACI(1,2)+HD(2)*FACI(2,2)
146 * * +HD(3)*FACI(3,2)+HD(4)*FACI(4,2)))
147 DELMI(2)=DELRM(1)*FACI(1,2)+DELRM(2)*FACI(2,2)+
148 * * DELRM(3)*FACI(3,2)+DELRM(4)*FACI(4,2)
149 DELAMI(2)=DELAM(1)*FACI(1,2)+DELAM(2)*FACI(2,2)+
150 * * DELAM(3)*FACI(3,2)+DELAM(4)*FACI(4,2)
151 QDTMI(2)=QDTM(1)*FACI(1,2)+QDTM(2)*FACI(2,2)+
152 * * QDTM(3)*FACI(3,2)+QDTM(4)*FACI(4,2)
153 HS3(2)=HS1(1)*FACI(1,2)+HS1(2)*FACI(2,2)+
154 * * HS1(3)*FACI(3,2)+HS1(4)*FACI(4,2)
155 EPSILM(2)=ESUMM(1)*FACI(1,2)+ESUMM(2)*FACI(2,2)+
156 * * ESUMM(3)*FACI(3,2)+ESUMM(4)*FACI(4,2)
157 ALM(2)=CLSUN*(HL(1)*FACI(1,2)+HL(2)*FACI(2,2)+
158 * * HL(3)*FACI(3,2)+HL(4)*FACI(4,2))
159 HGM(2)=HG(1)*FACI(1,2)+HG(2)*FACI(2,2)+
160 * * HG(3)*FACI(3,2)+HG(4)*FACI(4,2)
161C opacity.
162 OPM(2)=OM(1)*FACI(1,2)+OM(2)*FACI(2,2)+
163 * * OM(3)*FACI(3,2)+OM(4)*FACI(4,2)
164C specific heat
165 CPMI(2)=CPM(1)*FACI(1,2)+CPM(2)*FACI(2,2)+
166 * * CPM(3)*FACI(3,2)+CPM(4)*FACI(4,2)
167 ELSE
168 I0 = IMIN
169 ENDIF
170C TREATMENT OF LAST INTERFACE.
171 IF(IMAX.EQ.M)THEN
172 A43 = HRU(M) - HRU(M-1)
173 A42 = HRU(M) - HRU(M-2)
174 A41 = HRU(M) - HRU(M-3)
175 A32 = HRU(M-1) - HRU(M-2)
176 A31 = HRU(M-1) - HRU(M-3)
177 A21 = HRU(M-2) - HRU(M-3)
178 D1 = -A21*A31*A41
179 D2 = A21*A32*A42
180 D3 = -A31*A32*A43
181 D4 = A41*A42*A43
182 XA1 = RM(M) - HRU(M-3)
183 XA2 = RM(M) - HRU(M-2)
184 XA3 = RM(M) - HRU(M-1)
185 XA4 = RM(M) - HRU(M)
186 FACI(1,M) = (XA2*XA3*XA4)/D1
187 FACI(2,M) = (XA1*XA3*XA4)/D2
188 FACI(3,M) = (XA1*XA2*XA4)/D3
189 FACI(4,M) = (XA1*XA2*XA3)/D4
190 I1 = M-1
191 PM(M)=EXP(CLN*(HP(M-3)*FACI(1,M)+HP(M-2)*FACI(2,M)
192 * * +HP(M-1)*FACI(3,M)+HP(M)*FACI(4,M)))
193 TM(M)=EXP(CLN*(HT(M-3)*FACI(1,M)+HT(M-2)*FACI(2,M)
194 * * +HT(M-1)*FACI(3,M)+HT(M)*FACI(4,M)))
195 DM(M)=EXP(CLN*(HD(M-3)*FACI(1,M)+HD(M-2)*FACI(2,M)
196 * * +HD(M-1)*FACI(3,M)+HD(M)*FACI(4,M)))
197 DELMI(M)=DELRM(M-3)*FACI(1,M)+DELRM(M-2)*FACI(2,M)+
198 * * DELRM(M-1)*FACI(3,M)+DELRM(M)*FACI(4,M)
199 DELAMI(M)=DELAM(M-3)*FACI(1,M)+DELAM(M-2)*FACI(2,M)+
200 * * DELAM(M-1)*FACI(3,M)+DELAM(M)*FACI(4,M)
201 QDTMI(M)=QDTM(M-3)*FACI(1,M)+QDTM(M-2)*FACI(2,M)+
202 * * QDTM(M-1)*FACI(3,M)+QDTM(M)*FACI(4,M)
203 HS3(M)=HS1(M-3)*FACI(1,M)+HS1(M-2)*FACI(2,M)+
204 * * HS1(M-1)*FACI(3,M)+HS1(M)*FACI(4,M)
205 EPSILM(M)=ESUMM(M-3)*FACI(1,M)+ESUMM(M-2)*FACI(2,M)+
206 * * ESUMM(M-1)*FACI(3,M)+ESUMM(M)*FACI(4,M)
207 ALM(M)=CLSUN*(HL(M-3)*FACI(1,M)+HL(M-2)*FACI(2,M)+
208 * * HL(M-1)*FACI(3,M)+HL(M)*FACI(4,M))
209 HGM(M)=HG(M-3)*FACI(1,M)+HG(M-2)*FACI(2,M)+
210 * * HG(M-1)*FACI(3,M)+HG(M)*FACI(4,M)
211C opacity.
212 OPM(M)=OM(M-3)*FACI(1,M)+OM(M-2)*FACI(2,M)+
213 * * OM(M-1)*FACI(3,M)+OM(M)*FACI(4,M)
214C specific heat
215 CPMI(M)=CPM(M-3)*FACI(1,M)+CPM(M-2)*FACI(2,M)+
216 * * CPM(M-1)*FACI(3,M)+CPM(M)*FACI(4,M)
217 ELSE
218 I1 = IMAX
219 ENDIF
220C COMPUTE INTERPOLATION FACTORS FOR ALL OTHER POINTS.
221 DO 20 I = I0,I1
222 A43 = HRU(I+1) - HRU(I)
223 A42 = HRU(I+1) - HRU(I-1)
224 A41 = HRU(I+1) - HRU(I-2)
225 A32 = HRU(I) - HRU(I-1)
226 A31 = HRU(I) - HRU(I-2)
227 A21 = HRU(I-1) - HRU(I-2)
228 D1 = -A21*A31*A41
229 D2 = A21*A32*A42
230 D3 = -A31*A32*A43
231 D4 = A41*A42*A43
232 XA1 = RM(I) - HRU(I-2)
233 XA2 = RM(I) - HRU(I-1)
234 XA3 = RM(I) - HRU(I)
235 XA4 = RM(I) - HRU(I+1)
236 FACI(1,I) = (XA2*XA3*XA4)/D1
237 FACI(2,I) = (XA1*XA3*XA4)/D2
238 FACI(3,I) = (XA1*XA2*XA4)/D3
239 FACI(4,I) = (XA1*XA2*XA3)/D4
240 20 20 CONTINUE
241 CG = EXP(CLN*CGL)
242 CG2 = CG**2
243 DO 30 I = I0,I1
244C USE 4-POINT LAGRANGIAN INTERPOLATION TO FIND PHYSICAL VARIABLES
245C AT THE INTERFACES.
246C PRESSURE.
247 PM(I)=EXP(CLN*(HP(I-2)*FACI(1,I)+HP(I-1)*FACI(2,I)
248 * * +HP(I)*FACI(3,I)+HP(I+1)*FACI(4,I)))
249C TEMPERATURE.
250 TM(I)=EXP(CLN*(HT(I-2)*FACI(1,I)+HT(I-1)*FACI(2,I)
251 * * +HT(I)*FACI(3,I)+HT(I+1)*FACI(4,I)))
252C DENSITY.
253 DM(I)=EXP(CLN*(HD(I-2)*FACI(1,I)+HD(I-1)*FACI(2,I)
254 * * +HD(I)*FACI(3,I)+HD(I+1)*FACI(4,I)))
255C DEL (ACTUAL).
256C DEL (RADIATIVE) IS INTERPOLATED, AND DEL IS THE MIN OF DELA,DELR.
257 DELMI(I)=DELRM(I-2)*FACI(1,I)+DELRM(I-1)*FACI(2,I)+
258 * * DELRM(I)*FACI(3,I)+DELRM(I+1)*FACI(4,I)
259C DEL(ADIABATIC).
260 DELAMI(I)=DELAM(I-2)*FACI(1,I)+DELAM(I-1)*FACI(2,I)+
261 * * DELAM(I)*FACI(3,I)+DELAM(I+1)*FACI(4,I)
262C D LN RHO/D LN T.
263 QDTMI(I)=QDTM(I-2)*FACI(1,I)+QDTM(I-1)*FACI(2,I)+
264 * * QDTM(I)*FACI(3,I)+QDTM(I+1)*FACI(4,I)
265C UNLOGGED MASS INTERIOR TO THE INTERFACE.
266 HS3(I)=HS1(I-2)*FACI(1,I)+HS1(I-1)*FACI(2,I)+
267 * * HS1(I)*FACI(3,I)+HS1(I+1)*FACI(4,I)
268C SPECIFIC ENERGY GENERATION RATE.
269 EPSILM(I)=ESUMM(I-2)*FACI(1,I)+ESUMM(I-1)*FACI(2,I)+
270 * * ESUMM(I)*FACI(3,I)+ESUMM(I+1)*FACI(4,I)
271C LUMINOSITY.
272 ALM(I)=CLSUN*(HL(I-2)*FACI(1,I)+HL(I-1)*FACI(2,I)+
273 * * HL(I)*FACI(3,I)+HL(I+1)*FACI(4,I))
274C LOCAL AVERAGE FORCE OF GRAVITY.
275 HGM(I)=HG(I-2)*FACI(1,I)+HG(I-1)*FACI(2,I)+
276 * * HG(I)*FACI(3,I)+HG(I+1)*FACI(4,I)
277C opacity.
278 OPM(I)=OM(I-2)*FACI(1,I)+OM(I-1)*FACI(2,I)+
279 * * OM(I)*FACI(3,I)+OM(I+1)*FACI(4,I)
280C specific heat
281 CPMI(I)=CPM(I-2)*FACI(1,I)+CPM(I-1)*FACI(2,I)+
282 * * CPM(I)*FACI(3,I)+CPM(I+1)*FACI(4,I)
283 30 30 CONTINUE
284 DO 35 I = IMIN,IMAX
285 DELMI(I) = MIN(DELMI(I),DELAMI(I))
286 35 35 CONTINUE
287 DO I = 1,M
288 FES1(I) = 0.0D0
289 FES2(I) = 0.0D0
290 FES3(I) = 0.0D0
291 FGSFJ(I) = 0.0D0
292 FGSFK(I) = 0.0D0
293 FACT1(I) = 0.0D0
294 FACT2(I) = 0.0D0
295 FACT3(I) = 0.0D0
296 FACT4(I) = 0.0D0
297 FACT5(I) = 0.0D0
298C MHP 06/02
299 FESTIME(I) = 0.0D0
300 THM(I) = 0.0D0
301 FACT7(I) = 0.0D0
302 FACT8(I) = 0.0D0
303 END DO
304 DO I = 2,M
305C ADDED FOR D THETA/DT TERM FROM ZAHN&MAEDER 1998
306 FAC = 2.0D0*(HR(I)+HR(I-1))-0.5D0*
307 * * (LOG10(HS1(I))+LOG10(HS1(I-1)))-CGL
308 THM(I) = EXP(CLN*FAC)
309 END DO
310C NOW COMPUTE STRUCTURAL QUANTITIES NEEDED TO EVALUATE VELOCITIES AT
311C ALL INTERFACES.
312 CPIGI = 4.0D0/C4PI/CG
313 DO 40 I = IMIN,IMAX
314 IF(.NOT.LDIFAD)THEN
315 DELMU = (LOG10(AMUM(I))-LOG10(AMUM(I-1)))/
316 * * (HP(I)-HP(I-1))
317 ELSE
318 DELMU = 0.0D0
319 ENDIF
320 IF(I.EQ.IMIN)THEN
321 DMIN=MAX(1.0D-3,0.5D0*(DELAM(IMIN+1)-DELM(IMIN+1))
322 * * +DELMU)
323 ELSE IF(I.EQ.IMAX)THEN
324 DMIN=MAX(1.0D-3,0.5D0*(DELAM(IMAX-1)-DELM(IMAX-1))
325 * * +DELMU)
326 ELSE
327 DMIN = 1.0D-3
328 ENDIF
329 DDEL = MAX(DELAMI(I)-DELMI(I),DMIN)
330C MHP 06/02
331C ADDED FOR ALTERNATE TREATMENT OF MU GRADIENTS
332C DDELM(I) = 0.5D0*(DELAMI(I)+DELAMI(I-1)-
333C * DELMI(I)-DELMI(I-1))
334C DDELM(I) = DDEL
335 DDELM(I) = MAX(DELAMI(I)-DELMI(I)+DELMU,DMIN)
336C FESTIME(I) = PM(I)/(HGM(I)*DDEL*DM(I)*TM(I))
337 FESTIME(I) = PM(I)/(HGM(I)*DDEL*DM(I))
338 HPSC = PM(I)*RM(I)**2/DM(I)/HS3(I)/CG
339 HTSC = HPSC/DELMI(I)
340 ETA = 2.0D0*CC23*RM(I)**3/CG/HS3(I)
341C TTHERM = 8.0d0*CC23*CSIG*TM(I)**3/OPM(I)/DM(I)**2/CPM(I)
342 FGSFK(I)= 8.0D0*HPSC*ETA/DDEL
343 FF = PM(I)/(HGM(I)*DDEL*CPMI(I)*DM(I)*TM(I))
344 FAC = 2.0D0*ETA*FF
345 EM = ALM(I)/HS3(I)
346 FES1(I) = FAC*(EM-EPSILM(I))
347 FES2(I)= -0.5D0*FAC*EM*CPIGI/DM(I)
348 FES3(I) = EM*FF*CC13*CPIGI*RM(I)/DM(I)
349C FES3(I) = EM*FF*CPIGI*(3.0D0*HTSC-RM(I))/DM(I)
350 FV0(I) = FF
351 FV1A(I) = FES1(I)/FF
352 FV1B(I) = FES2(I)/FF
353 FV2A(I) = EM*CPIGI*3.0D0*HTSC/DM(I)
354 FV2B(I) = -EM*CPIGI*RM(I)/DM(I)
355 FGSFJ(I) = ABS(FAC*EM*HTSC)*RM(I)
356C EDDINGTON CIRCULATION VELOCITY IS DEFINED AS
357C VES = FACT1*FACT2*OMEGA**2 (ENDAL AND SOFIA PAPER II).
358C NOTE THAT TO AVOID OVERFLOW 1/(DEL(AD)-DEL)IS SET TO A MAXIMUM OF 10^6.
359C THIS SHOULD ONLY BE AN ISSUE IF YOU HAVE ZERO OVERSHOOT AT THE BOUNDARY
360C OF A CONVECTION ZONE. CAVEAT EMPTOR.
361 FACT1(I) = 1.0D0/QDTMI(I)/MAX(DELAMI(I)-DELMI(I),1.0D-3)
362C FACT2(I) = DELAMI(I)*ALM(I)*(RM(I)**3/CG2/HS3(I)**2)*
363C * (2.0D0*RM(I)**2*(EPSILM(I)/ALM(I) - 1.0D0/HS3(I))
364C * - 3.0D0/(C4PI*DM(I)*RM(I)))
365 FAC = DELAMI(I)/HGM(I)
366 FACT2(I) = FAC*ETA*(EPSILM(I)-EM)
367 FACT6(I) = -FAC*EM/C4PI/CG/DM(I)/RM(I)
368C GSF VELOCITY IS DEFINED AS
369C VGSF = VES*FACT3/Hj**2/(2OMEGA/(D OMEGA/D LNR) + 1)
370C WHERE HJ IS THE SPECIFIC ANGULAR MOMENTUM SCALE HEIGHT.
371C AND FACT3 IS THE TEMPERATURE SCALE HEIGHT TIMES THE RADIUS.
372C HT = (DEL*D(LN P)/DR)**-1 = P*R**2/(DEL*RHO*GM)
373C FACT3(I) = PM(I)*RM(I)**3/(DELMI(I)*DM(I)*CG*HS3(I))
374 FACT3(I) = ABS(HTSC*RM(I))
375C FICTITIOUS MU CURRENTS THAT OPPOSE ES AND GSF CIRCULATION CALCULATED HERE.
376C VMU = FMU*FACT1*FACT4*mu*del(mu), FACT4=(D RHO/D MU)*PSCALH/TKH/MU
377C (KIPPENHAHN, IAU#66,P.22) USING TKH* = THE LOCAL KELVIN-HELMHOLTZ TIMESCALE.
378C FMU IS A USER PARAMETER, DMU IS DELTA MU BETWEEN THE SHELLS, AND QDMU IS
379C THE DERIVATIVE OF THE DENSITY WITH RESPECT TO MU.
380C IF VMU EXCEEDS VES AND VGSF THE INTERFACE IS STABLE.
381C D RHO/DMU = (1-(a/3)*T**4/P)*P*MU/(RHO*T*CGAS)
382C THE PRESSURE SCALE HEIGHT IS CGAS*T*R**2/GM (EXCLUDING A FACTOR MU
383C WHICH CANCELS WITH ANOTHER FACTOR OF MU WHICH ARISES ELSEWHERE) AND
384C THE KELVIN-HELMHOLTZ TIMESCALE IS G*M**2/(R*L).
385C FACT4(I) = ALM(I)*(RM(I)/HS3(I))**3/CG2/DM(I)*
386C * (PM(I)-CA3*TM(I)**4)
387 FACT4(I) = RM(I)**2/HS3(I)/CG/DM(I)*
388 * * (PM(I)-CA3*TM(I)**4)/SQRT(HGM(I))
389C DYNAMICAL SHEAR INSTABILITY.
390C AN INTERFACE IS STABLE AGAINST THIS SHEAR WHENEVER THE RICHARDSON NUMBER
391C RICHNO = (RHO/P)*(DEL(AD)-DEL)*g**2/(D OMEGA/D LN R)**2>.25.
392 QWRMAX(I)=SQRT(DM(I)/PM(I)*MAX(DELAMI(I) - DELMI(I),1.0D-3))
393 * * *2.0D0*HGM(I)
394C THE DIFFUSIVE SHEAR IS INHIBITED BY MU GRADIENTS.
395C AN INTERFACE IS STABLE AGAINST THE DIFFUSIVE SHEAR IF
396C RICHARDSON NUMBER = FACT5*DMU/MU/(D OMEGA/D LNR)**2 > .25, WHERE
397C FACT5 = RHO/P*(-d lnT/d lnMU)/(del LN P)*G**2 AND
398C -d lnT/d lnMU = (CON-1)/(1+3CON),CON=(a/3)T**4/P
399C GIVEN (1 - CON)P = CGAS*RHO*T/MU
400C 1 - CON IS BETA(CORRECTION FOR RADIATION PRESSURE).
401 FACT5(I) = DM(I)*HGM(I)**2/PM(I)/CLN/(HP(I)-HP(I-1))*
402 * * (CA3*TM(I)**4/PM(I)-1.0D0)/(1.0D0 + 3.0D0*CA3*TM(I)**4/PM(I))
403C MHP 3/92 ADD VECTOR FOR LOCAL KELVIN-HELMHOLTZ TIME SCALE.
404C TKH(I) = CG*HS3(I)**2/ABS(ALM(I))/RM(I)
405 40 40 CONTINUE
406C MHP 06/02 ADDED TERMS OF ORDER DW/DR FROM ZAH&MAEDER 1998
407 IF(LDIFAD)THEN
408 HTM = EXP(CLN*(HP(IMIN-1)+2.0D0*HR(IMIN-1)-HD(IMIN-1)))
409 * * /HS1(IMIN-1)/CG/DELRM(IMIN-1)
410 QQQCOD(IMIN-1) = HTM
411 DO I = IMIN,IMAX
412C DDEL = MAX(DELAMI(I)-DELMI(I),1.0D-3)
413 HPSC = PM(I)*RM(I)**2/DM(I)/HS3(I)/CG
414 HTSC = HPSC/DELMI(I)
415 F1 = PM(I)/(HGM(I)*DDELM(I)*CPMI(I)*DM(I)*TM(I))
416 F2 = ALM(I)*RM(I)/HS3(I)/3.0D0
417 F3 = 0.75D0*HS3(I)/(CPI*DM(I)*RM(I)**3)
418 V0 = -F1*F2*F3
419C V0 = -PM(I)*ALM(I)/(C4PI*CG**2*HS3(I)*DDEL*CPM(I)*
420C * DM(I)**2*TM(I))
421 FF = RM(I)**3/HS3(I)
422 C1 = CC23*RM(I)**4/CG/HS3(I)
423 QQCOD(I) = C1
424 QC1R = 4.0D0*CC23*FF/CG*
425 * * (1.0D0-CPI*DM(I)*FF)
426 DR = 10.0D0**HR(I)-10.0D0**HR(I-1)
427 QDR = (10.0D0**HD(I)-10.0D0**HD(I-1))/DR
428 QQC1RR = 8.0D0*FF/CG/RM(I)*
429 * * (1.0D0-CC13*CPI*FF*(1.0D1*DM(I)-RM(I)*QDR)
430 * * + CC13*8.0D0*(CPI*DM(I)*FF)**2)
431C D LN CHI/D LN T = 3 - D LN CAPPA/D LN T
432 QCHIT = 3.0D0 - 0.5D0*(SQOT(I)+SQOT(I-1))
433 QQCHITR = (SQOT(I-1)-SQOT(I))/DR
434 HTP = EXP(CLN*(HP(I)+2.0D0*HR(I)-HD(I)))/HS1(I)/CG/DELM(I)
435 QQQCOD(I) = HTP
436 HTP2 = DR/CLN/(HT(I-1)-HT(I))
437 QHTR = (ABS(HTP)-ABS(HTM))/DR
438 HTM = HTP
439 QETM = 0.5D0*(SQET(I)+SQET(I-1))
440 FNU = 0.5D0*(FRACNUC(I)+FRACNUC(I-1))
441C FACT7(I)= -V0*(QQCHITR*C1+QCHIT*QC1R)
442C FACT7(I)= -V0*(QQCHITR*C1)
443 FACT7(I)=
444 * * - F1*C1*(FNU*QETM + EPSILM(I)*(1.0D0 - FNU - QCHIT))
445 FV2B(I) = FV2B(I)+FACT7(I)/F1
446C FACT7(I)=V0*((QHTR-QCHIT)*QC1R-QQCHITR*C1+HTSC*QQC1RR)
447C * - F1*EPSILM(I)*(HTSC*QC1R + C1*(QETM - QCHIT))
448 FACT8(I) = 0.0D0
449C FACT8(I)=V0*((QHTR-QCHIT)*C1+HTSC*2.0D0*QC1R)
450C * - F1*EPSILM(I)*HTSC*C1
451C Q variables not used
452C Q1 = -V0*(QQCHITR*C1)
453C Q2 = -F1*C1*FNU*QETM
454C Q3 = -F1*C1*EPSILM(I)*(1.0D0 - FNU - QCHIT)
455C Q4 = F1*FL*QCHIT
456C Q5 = -F1*EPSILM(I)*HTSC
457 FL = ALM(I)/C4PI/DM(I)/RM(I)**2
458 FACD2(I) = F1*(FL*QCHIT - EPSILM(I)*HTSC)
459 FACD3(I) = -F1*FL
460C WRITE(*,911)I,V0,FES3(I),FACT7(I),FACD2(I),FACD3(I),DDELM(I)
461C WRITE(*,912)Q1,Q2,Q3,Q4,Q5
462C 911 FORMAT(I5,1P6E12.3)
463C 912 FORMAT(5X,1P5E12.3)
464 END DO
465 ENDIF
466 RETURN
467 END
1"""Python version of setupv.f (YREC 7be4133): the structural factors at
2the shell interfaces that the rotational-mixing criteria and circulation
3velocities need, computed once per rotational-mixing step."""
4
5import math
6
7import numpy as np
8
9from pyrec import constants_mod
10from pyrec import difad3_mod
11from pyrec import dimensions_mod
12from pyrec import egridder_mod
13from pyrec import intvar_mod
14from pyrec import mdphy_mod
15from pyrec import nmlpar_mod
16from pyrec import oldrot2_mod
17from pyrec import rotder_mod
18from pyrec import taukh_mod
19from pyrec import vfact_mod
20
21# SAVE: the local arrays keep their values between calls (elements the
22# current call does not set are read only if IMIN < 2 or IMAX > M).
23cpmi = np.zeros(dimensions_mod.json + 1) # c_P at the interfaces
24opm = np.zeros(dimensions_mod.json + 1) # opacity at the interfaces (unused)
25
26
27def _lagrange(hru: np.ndarray, rm: np.ndarray, i: int, j: int, faci: np.ndarray) -> None:
28 """Fill faci[1..4, i], the 4-point Lagrange weights at rm[i] over the
29 shells j .. j+3 (the Fortran repeats this block three times: lines
30 122–139, 172–189 and 222–239)."""
31
32 a43 = hru[j + 3] - hru[j + 2]
33 a42 = hru[j + 3] - hru[j + 1]
34 a41 = hru[j + 3] - hru[j]
35 a32 = hru[j + 2] - hru[j + 1]
36 a31 = hru[j + 2] - hru[j]
37 a21 = hru[j + 1] - hru[j]
38 d1 = -a21*a31*a41
39 d2 = a21*a32*a42
40 d3 = -a31*a32*a43
41 d4 = a41*a42*a43
42 xa1 = rm[i] - hru[j]
43 xa2 = rm[i] - hru[j + 1]
44 xa3 = rm[i] - hru[j + 2]
45 xa4 = rm[i] - hru[j + 3]
46 faci[1, i] = (xa2*xa3*xa4)/d1
47 faci[2, i] = (xa1*xa3*xa4)/d2
48 faci[3, i] = (xa1*xa2*xa4)/d3
49 faci[4, i] = (xa1*xa2*xa3)/d4
50
51
52def _interp(y: np.ndarray, faci: np.ndarray, i: int, j: int) -> float:
53 """y interpolated to interface i from shells j .. j+3, summed in the
54 Fortran's order."""
55
56 return (y[j]*faci[1, i] + y[j + 1]*faci[2, i]
57 + y[j + 2]*faci[3, i] + y[j + 3]*faci[4, i])
58
59
60def _interface_values(i: int, j: int, hd: np.ndarray, hg: np.ndarray, hl: np.ndarray, hp: np.ndarray,
61 hs1: np.ndarray, ht: np.ndarray, faci: np.ndarray) -> None:
62 """The physical variables at interface i, from shells j .. j+3 (the
63 Fortran repeats this block three times: first, last and inner
64 interfaces, lines 141–166, 191–216 and 247–282). P, T and rho are
65 interpolated in the log."""
66
67 c = constants_mod
68 iv = intvar_mod
69 md = mdphy_mod
70 iv.pm[i] = math.exp(c.cln*_interp(hp, faci, i, j))
71 iv.tm[i] = math.exp(c.cln*_interp(ht, faci, i, j))
72 iv.dm[i] = math.exp(c.cln*_interp(hd, faci, i, j))
73 # del (radiative) is interpolated; del is set to min(dela, delr) later.
74 iv.delmi[i] = _interp(md.delrm, faci, i, j)
75 iv.delami[i] = _interp(md.delam, faci, i, j)
76 iv.qdtmi[i] = _interp(md.qdtm, faci, i, j) # d ln rho / d ln T
77 iv.hs3[i] = _interp(hs1, faci, i, j) # mass inside (g)
78 iv.epsilm[i] = _interp(md.esumm, faci, i, j) # energy generation
79 iv.alm[i] = c.clsun*_interp(hl, faci, i, j) # luminosity (erg/s)
80 iv.hgm[i] = _interp(hg, faci, i, j) # gravity
81 opm[i] = _interp(md.om, faci, i, j) # opacity
82 cpmi[i] = _interp(md.cpm, faci, i, j) # specific heat
83
84
85def setupv(hd: np.ndarray, hg: np.ndarray, hl: np.ndarray, hp: np.ndarray, hr: np.ndarray, hs1: np.ndarray,
86 ht: np.ndarray, imin: int, imax: int, m: int, hru: np.ndarray, qwrmax: np.ndarray, faci: np.ndarray) -> None:
87 """Prepare, for the interfaces imin..imax (interface i lies between
88 shells i-1 and i), the factors of the stability criteria and
89 circulation velocities that do not change during a diffusion time
90 step; VCIRC multiplies them by the current Omega gradients.
91
92 Translates: setupv.f#SETUPV (7be4133)
93
94 Arguments: the model's log rho (hd), gravity (hg), L in solar units
95 (hl), log P (hp), log r (hr), enclosed mass in g (hs1), log T (ht),
96 arrays with index 0 unused; the interface range imin, imax; m, the
97 number of shells. Set in place: hru (unlogged radii), qwrmax (the
98 largest stable d Omega / d ln r against the dynamical shear) and
99 faci[1..4, i], the interpolation weights (owned by SECULR, read by
100 VCIRC). Also set: the interface values in intvar_mod, the velocity
101 factors in vfact_mod, taukh_mod, oldrot2_mod and, with ldifad, in
102 difad3_mod and egridder_mod.
103
104 Returns nothing.
105
106 """
107
108 c = constants_mod
109 iv = intvar_mod
110 md = mdphy_mod
111 vf = vfact_mod
112 tk = taukh_mod
113 o2 = oldrot2_mod
114 da = difad3_mod
115 rd = rotder_mod
116 eg = egridder_mod
117
118 # Unlogged radii of the model points (label 5) (Fortran lines 109–111).
119 for i in range(1, m + 1):
120 hru[i] = math.exp(c.cln*hr[i])
121
122 # Radii of the midpoints of the interfaces (label 10) (Fortran lines
123 # 113–115).
124 for i in range(2, m + 1):
125 iv.rm[i] = 0.5*(hru[i] + hru[i - 1])
126
127 # 4-point Lagrange interpolation: the first interface uses the first 4
128 # points, the last the last 4, and interface i uses i-2, i-1, i, i+1
129 # (Fortran lines 121–219).
130 if imin < 3:
131 _lagrange(hru, iv.rm, 2, 1, faci)
132 i0 = 3
133 _interface_values(2, 1, hd, hg, hl, hp, hs1, ht, faci)
134 else:
135 i0 = imin
136 if imax == m:
137 _lagrange(hru, iv.rm, m, m - 3, faci)
138 i1 = m - 1
139 _interface_values(m, m - 3, hd, hg, hl, hp, hs1, ht, faci)
140 else:
141 i1 = imax
142
143 # Interpolation factors for all other interfaces (label 20) (Fortran
144 # lines 221–240).
145 for i in range(i0, i1 + 1):
146 _lagrange(hru, iv.rm, i, i - 2, faci)
147
148 # Physical variables at the interfaces (label 30) (Fortran lines
149 # 241–283).
150 cg = math.exp(c.cln*c.cgl)
151 cg2 = cg**2 # noqa: F841 (unused in the Fortran too)
152 for i in range(i0, i1 + 1):
153 _interface_values(i, i - 2, hd, hg, hl, hp, hs1, ht, faci)
154
155 # The actual del is min(del_rad, del_ad) (label 35) (Fortran lines
156 # 284–286).
157 for i in range(imin, imax + 1):
158 iv.delmi[i] = min(iv.delmi[i], iv.delami[i])
159
160 # Clear the factors (Fortran lines 287–303).
161 for i in range(1, m + 1):
162 tk.fes1[i] = 0.0
163 tk.fes2[i] = 0.0
164 tk.fes3[i] = 0.0
165 tk.fgsfj[i] = 0.0
166 tk.fgsfk[i] = 0.0
167 vf.fact1[i] = 0.0
168 vf.fact2[i] = 0.0
169 vf.fact3[i] = 0.0
170 vf.fact4[i] = 0.0
171 vf.fact5[i] = 0.0
172 o2.festime[i] = 0.0
173 o2.thm[i] = 0.0
174 vf.fact7[i] = 0.0
175 vf.fact8[i] = 0.0
176
177 # The d theta/dt term of Zahn and Maeder 1998: r_i^2 r_(i-1)^2 /
178 # (G sqrt(m_i m_(i-1))), about r^2/g (Fortran lines 304–309).
179 for i in range(2, m + 1):
180 fac = (2.0*(hr[i] + hr[i - 1])
181 - 0.5*(math.log10(hs1[i]) + math.log10(hs1[i - 1])) - c.cgl)
182 o2.thm[i] = math.exp(c.cln*fac)
183
184 # Structural quantities for the velocities at all interfaces (label 40)
185 # (Fortran lines 312–405).
186 cpigi = 4.0/c.c4pi/cg
187 for i in range(imin, imax + 1):
188 # The mu gradient and the floors of del_ad - del (Fortran lines
189 # 314–335).
190 if not nmlpar_mod.ldifad:
191 delmu = ((math.log10(md.amum[i]) - math.log10(md.amum[i - 1]))
192 / (hp[i] - hp[i - 1]))
193 else:
194 delmu = 0.0
195 if i == imin:
196 dmin = max(1.0e-3, 0.5*(md.delam[imin + 1] - md.delm[imin + 1])
197 + delmu)
198 elif i == imax:
199 dmin = max(1.0e-3, 0.5*(md.delam[imax - 1] - md.delm[imax - 1])
200 + delmu)
201 else:
202 dmin = 1.0e-3
203 ddel = max(iv.delami[i] - iv.delmi[i], dmin)
204 o2.ddelm[i] = max(iv.delami[i] - iv.delmi[i] + delmu, dmin)
205
206 # Scale heights and the Zahn-type factors (Fortran lines 337–355).
207 o2.festime[i] = iv.pm[i]/(iv.hgm[i]*ddel*iv.dm[i])
208 hpsc = iv.pm[i]*iv.rm[i]**2/iv.dm[i]/iv.hs3[i]/cg
209 htsc = hpsc/iv.delmi[i]
210 # Question (see the page): the factor 2 in eta.
211 eta = 2.0*c.cc23*iv.rm[i]**3/cg/iv.hs3[i]
212 tk.fgsfk[i] = 8.0*hpsc*eta/ddel
213 ff = iv.pm[i]/(iv.hgm[i]*ddel*cpmi[i]*iv.dm[i]*iv.tm[i])
214 fac = 2.0*eta*ff
215 em = iv.alm[i]/iv.hs3[i]
216 tk.fes1[i] = fac*(em - iv.epsilm[i])
217 tk.fes2[i] = -0.5*fac*em*cpigi/iv.dm[i]
218 tk.fes3[i] = em*ff*c.cc13*cpigi*iv.rm[i]/iv.dm[i]
219 da.fv0[i] = ff
220 da.fv1a[i] = tk.fes1[i]/ff
221 da.fv1b[i] = tk.fes2[i]/ff
222 da.fv2a[i] = em*cpigi*3.0*htsc/iv.dm[i]
223 da.fv2b[i] = -em*cpigi*iv.rm[i]/iv.dm[i]
224 tk.fgsfj[i] = abs(fac*em*htsc)*iv.rm[i]
225
226 # Eddington circulation: v_ES = fact1*fact2*Omega**2 (Endal and
227 # Sofia, paper II) (Fortran lines 361–367).
228 # Question (see the page): the floor 1e-3 caps 1/(del_ad - del)
229 # at 1e3, not the comment's 1e6.
230 vf.fact1[i] = 1.0/iv.qdtmi[i]/max(iv.delami[i] - iv.delmi[i], 1.0e-3)
231 fac = iv.delami[i]/iv.hgm[i]
232 vf.fact2[i] = fac*eta*(iv.epsilm[i] - em)
233 tk.fact6[i] = -fac*em/c.c4pi/cg/iv.dm[i]/iv.rm[i]
234
235 # GSF: fact3 is the temperature scale height times the radius
236 # (Fortran line 374).
237 vf.fact3[i] = abs(htsc*iv.rm[i])
238
239 # Fictitious mu currents (Kippenhahn, IAU 66) (Fortran lines
240 # 387–388).
241 vf.fact4[i] = (iv.rm[i]**2/iv.hs3[i]/cg/iv.dm[i]
242 * (iv.pm[i] - c.ca3*iv.tm[i]**4)/math.sqrt(iv.hgm[i]))
243
244 # Dynamical shear: stable when the Richardson number exceeds 1/4
245 # (Fortran lines 392–393).
246 qwrmax[i] = (math.sqrt(iv.dm[i]/iv.pm[i]
247 * max(iv.delami[i] - iv.delmi[i], 1.0e-3))
248 * 2.0*iv.hgm[i])
249
250 # Secular shear inhibited by mu gradients (Fortran lines 401–402).
251 vf.fact5[i] = (iv.dm[i]*iv.hgm[i]**2/iv.pm[i]/c.cln
252 / (hp[i] - hp[i - 1])
253 * (c.ca3*iv.tm[i]**4/iv.pm[i] - 1.0)
254 / (1.0 + 3.0*c.ca3*iv.tm[i]**4/iv.pm[i]))
255
256 # Terms of order d Omega/dr from Zahn and Maeder 1998; imin >= 2, so
257 # shell imin-1 exists (Fortran lines 407–465). qqqcod is read by no
258 # routine: unused? (see the page).
259 if nmlpar_mod.ldifad:
260 htm = (math.exp(c.cln*(hp[imin - 1] + 2.0*hr[imin - 1]
261 - hd[imin - 1]))
262 / hs1[imin - 1]/cg/md.delrm[imin - 1])
263 eg.qqqcod[imin - 1] = htm
264 for i in range(imin, imax + 1):
265 hpsc = iv.pm[i]*iv.rm[i]**2/iv.dm[i]/iv.hs3[i]/cg
266 htsc = hpsc/iv.delmi[i]
267 f1 = iv.pm[i]/(iv.hgm[i]*o2.ddelm[i]*cpmi[i]*iv.dm[i]*iv.tm[i])
268 f2 = iv.alm[i]*iv.rm[i]/iv.hs3[i]/3.0
269 f3 = 0.75*iv.hs3[i]/(c.cpi*iv.dm[i]*iv.rm[i]**3)
270 # v0, qc1r, qqc1rr, qqchitr, htp2 and qhtr feed only
271 # commented-out formulas: unused? (see the page).
272 v0 = -f1*f2*f3 # noqa: F841 (unused in the Fortran too)
273 ff = iv.rm[i]**3/iv.hs3[i]
274 c1 = c.cc23*iv.rm[i]**4/cg/iv.hs3[i]
275 eg.qqcod[i] = c1
276 qc1r = 4.0*c.cc23*ff/cg*(1.0 - c.cpi*iv.dm[i]*ff) # noqa: F841 (unused in the Fortran too)
277 dr = 10.0**hr[i] - 10.0**hr[i - 1]
278 qdr = (10.0**hd[i] - 10.0**hd[i - 1])/dr
279 qqc1rr = (8.0*ff/cg/iv.rm[i] # noqa: F841 (unused in the Fortran too)
280 * (1.0 - c.cc13*c.cpi*ff*(1.0e1*iv.dm[i] - iv.rm[i]*qdr)
281 + c.cc13*8.0*(c.cpi*iv.dm[i]*ff)**2))
282 # d ln chi / d ln T = 3 - d ln kappa / d ln T
283 qchit = 3.0 - 0.5*(rd.sqot[i] + rd.sqot[i - 1])
284 qqchitr = (rd.sqot[i - 1] - rd.sqot[i])/dr # noqa: F841 (unused in the Fortran too)
285 htp = (math.exp(c.cln*(hp[i] + 2.0*hr[i] - hd[i]))
286 / hs1[i]/cg/md.delm[i])
287 eg.qqqcod[i] = htp
288 htp2 = dr/c.cln/(ht[i - 1] - ht[i]) # noqa: F841 (unused in the Fortran too)
289 qhtr = (abs(htp) - abs(htm))/dr # noqa: F841 (unused in the Fortran too)
290 htm = htp
291 qetm = 0.5*(rd.sqet[i] + rd.sqet[i - 1])
292 fnu = 0.5*(rd.fracnuc[i] + rd.fracnuc[i - 1])
293 vf.fact7[i] = (-f1*c1*(fnu*qetm
294 + iv.epsilm[i]*(1.0 - fnu - qchit)))
295 da.fv2b[i] = da.fv2b[i] + vf.fact7[i]/f1
296 vf.fact8[i] = 0.0
297 fl = iv.alm[i]/c.c4pi/iv.dm[i]/iv.rm[i]**2
298 da.facd2[i] = f1*(fl*qchit - iv.epsilm[i]*htsc)
299 da.facd3[i] = -f1*fl