Line data Source code
1 : ! ***********************************************************************
2 : !
3 : ! Copyright (C) 2019 Radek Smolec & The MESA Team
4 : !
5 : ! This program is free software: you can redistribute it and/or modify
6 : ! it under the terms of the GNU Lesser General Public License
7 : ! as published by the Free Software Foundation,
8 : ! either version 3 of the License, or (at your option) any later version.
9 : !
10 : ! This program is distributed in the hope that it will be useful,
11 : ! but WITHOUT ANY WARRANTY; without even the implied warranty of
12 : ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13 : ! See the GNU Lesser General Public License for more details.
14 : !
15 : ! You should have received a copy of the GNU Lesser General Public License
16 : ! along with this program. If not, see <https://www.gnu.org/licenses/>.
17 : !
18 : ! ***********************************************************************
19 :
20 : module rsp_lina
21 : use star_def, only: star_info
22 : use utils_lib, only: is_bad, mesa_error
23 : use const_def, only: dp, i8, crad
24 : use rsp_def
25 :
26 : implicit none
27 :
28 : private
29 : public :: mesa_eos_kap, SORT, do_LINA
30 :
31 : contains
32 :
33 0 : subroutine do_LINA(s, L0, NZN, NMODES, VEL, PERS, ETO, &
34 0 : M, DM, DM_BAR, R, Vol, T, Et, Lr, ierr)
35 : ! LINear Analysis (LINA) USING LAPACK/EISPACK
36 : ! SETS THE MATRIX FOR THE LINEAR EIGENVALUE PROBLEM
37 :
38 : type (star_info), pointer :: s
39 : real(dp), intent(in) :: L0
40 : integer, intent(in) :: NMODES, NZN
41 : real(dp), intent(out) :: VEL(:,:) ! (NZN+1,15)
42 : real(dp), intent(out), dimension(15) :: PERS, ETO
43 : real(dp), intent(inout), dimension(:) :: &
44 : M, DM, DM_BAR, R, Vol, T, Et, Lr
45 : integer, intent(out) :: ierr
46 :
47 0 : real(dp), dimension(15) :: OMEG, EK
48 : real(dp), allocatable, dimension(:) :: &
49 0 : E, P, Lc, Hp_face, Y_face, K, CPS, QQS, &
50 0 : MX10,MX00,MX01,MY00,MY01, &
51 0 : MU10,MU00,MU01,MZ00,MZ01, &
52 0 : EVUU0,EVUUM, &
53 0 : EX20,EX10,EX00,EX01, &
54 0 : EY10,EY00,EY01, &
55 0 : EU10,EU00,EZ10,EZ00,EZ01, &
56 0 : CX10,CX00,CX01,CY00,CY01, &
57 0 : CZ00,CX20,CY10,CU00,CU10, &
58 0 : CZ01,CZ10, &
59 0 : dC_dr_in, dC_dr_00, dC_dr_out, dC_dT_out, &
60 0 : dC_dT_00, dC_dT_in,dC_dw_00,dC_dr_in2, &
61 0 : DPV,dP_dT_00,DEV,dE_dT_00,dK_dV_00, &
62 0 : dK_dT_00,DVR,DVRM, &
63 0 : ELRP,ELRM,ELR,ELTP,ELT, &
64 0 : ELZ0,ELZP, &
65 0 : CPV,dCp_dT_00,QQV,dQQ_dT_00 , &
66 0 : dP_dr_00, dCp_dr_00, dQQ_dr_00, &
67 0 : dP_dr_in,dCp_dr_in,dQQ_dr_in, &
68 0 : dHp_dr_in,dHp_dr_out,dHp_dr_00,dHp_dT_00,dHp_dT_out, &
69 0 : dY_dr_in,dY_dr_00,dY_dr_out,dY_dT_00, &
70 0 : dY_dT_out, &
71 0 : PII,dPII_dr_in,dPII_dr_00,dPII_dr_out, &
72 0 : dPII_dT_00,dPII_dT_out,DPIIZ0, &
73 0 : dsrc_dr_in,dsrc_dr_00,dsrc_dr_out,dsrc_dT_00, &
74 0 : dsrc_dT_out,dsrc_dw_00,source, &
75 0 : d_damp_dr_in,d_damp_dr_00,d_damp_dr_out,d_damp_dT_00, &
76 0 : d_damp_dT_out,d_damp_dw_00,DAMP, &
77 0 : dsrc_dr_in2,dsrc_dT_in,d_damp_dr_in2,d_damp_dT_in, &
78 0 : d_dampR_dr_in,d_dampR_dr_00,d_dampR_dr_out,d_dampR_dT_00, &
79 0 : d_dampR_dT_out,d_dampR_dw_00,DAMPR, &
80 0 : d_dampR_dr_in2,d_dampR_dT_in, &
81 0 : DLCXM,DLCX0,DLCXP,DLCY0, &
82 0 : DLCYP,DLCZ0,DLCZP, &
83 0 : DLTXM,DLTX0,DLTXP,DLTY0, &
84 0 : DLTYP,DLTZ0,DLTZP,Lt, &
85 0 : PTURB,dPtrb_dw_00,dPtrb_dr_00,dPtrb_dr_in,XXL
86 : real(dp), allocatable, dimension(:,:) :: &
87 0 : QWK,QWKEV,PHR,PHT,PHL,PHU,PHC,ZZZ
88 : complex(8), allocatable, dimension(:,:) :: &
89 0 : VRR,VRT,VRL,VRC,DVRR,DVRT,DVRL,DVRC,VRU
90 :
91 0 : real(dp) :: FFXM,FFX0,FFXP,FFY0,FFYP,FF,POM1
92 0 : real(dp) :: IGR1,IGR1XM,IGR1X0,IGR1XP,IGR1Y0,IGR1YP
93 0 : real(dp) :: IGR2,IGR2XM,IGR2X0,IGR2XP,IGR2Y0,IGR2YP
94 0 : real(dp) :: GGXM,GGX0,GGXP,GGY0,GGYP,GG,GPF
95 0 : real(dp) :: DFCX0,DFCXM,DFCXP,DFCY0,DFCYP,DFCZ0,DFCZP
96 0 : real(dp) :: DFCMX0,DFCMXM,DFCMXP,DFCMY0,DFCMYP,DFCMZ0,DFCMZP
97 0 : real(dp) :: T1,DLR,DLRP,DLRM,DLT,DLTP,DLMR,DLMRP,DLMRM,DLMT,DLMTP
98 0 : real(dp) :: W_00,W_out,BW,BK,T2,T3,DLK,DLKP,MINI
99 0 : real(dp) :: T4,POM3,POM2,POM,POM4
100 : integer :: I,J,NZN3,IG,IE,IR,IC,INFO,IMI,LD_VL,LD_VR,n,op_err
101 : real(dp) :: VRRS(15),Q(15)
102 : character (len=250) :: FILENAME
103 : character (len=1) :: NUMER1
104 : character (len=2) :: NUMER2
105 0 : complex(8):: DP_0,DV_0,VTTS(15),SCALE(15),DPEV,dP_dT_00URB
106 0 : real(dp) :: SGRP,SGRM
107 0 : real(dp) :: PSIG,TEMI,TEMM,TEM1
108 0 : real(dp) :: NORMC
109 0 : real(dp) :: QCHECK(15),ETOIEV(15),QWKPT(1000,15),ETOIPT(15),SGR(15)
110 0 : real(dp) :: EFL02
111 0 : real(dp) :: ETOI(15)
112 :
113 : !write(*,'(a55,i12,99(1pd26.16))') 'start LINA s% w(2)**2', &
114 : ! 2, s% w(2)**2, Et(NZN-1)
115 :
116 : if (.false.) then
117 : write(*,*) 'L0', L0
118 : do I=1,NZN
119 : write(*,*) 'M', I, M(I)
120 : write(*,*) 'DM', I, DM(I)
121 : write(*,*) 'DM_BAR', I, DM_BAR(I)
122 : write(*,*) 'R', I, R(I)
123 : write(*,*) 'R**3', I, R(I)**3
124 : write(*,*) 'Vol', I, Vol(I)
125 : write(*,*) 'T', I, T(I)
126 : write(*,*) 'Lr', I, Lr(I)
127 : write(*,*) 'Et', I, Et(I)
128 : end do
129 : call mesa_error(__FILE__,__LINE__,'do_LINA')
130 : end if
131 :
132 0 : ierr = 0
133 0 : EFL02 = EFL0*EFL0
134 0 : n = NZN+1
135 : allocate( &
136 : E(n), P(n), Lc(n), Hp_face(n), Y_face(n), K(n), CPS(n), QQS(n), &
137 : MX10(n),MX00(n),MX01(n),MY00(n),MY01(n), &
138 : MU10(n),MU00(n),MU01(n),MZ00(n),MZ01(n), &
139 : EVUU0(n),EVUUM(n), &
140 : EX20(n),EX10(n),EX00(n),EX01(n), &
141 : EY10(n),EY00(n),EY01(n), &
142 : EU10(n),EU00(n),EZ10(n),EZ00(n),EZ01(n), &
143 : CX10(n),CX00(n),CX01(n),CY00(n),CY01(n), &
144 : CZ00(n),CX20(n),CY10(n),CU00(n),CU10(n), &
145 : CZ01(n),CZ10(n), &
146 : dC_dr_in(n), dC_dr_00(n), dC_dr_out(n), dC_dT_out(n), &
147 : dC_dT_00(n), dC_dT_in(n),dC_dw_00(n),dC_dr_in2(n), &
148 0 : DPV(n),dP_dT_00(n),DEV(n),dE_dT_00(n),dK_dV_00(n), &
149 : dK_dT_00(n),DVR(n),DVRM(n), &
150 : ELRP(n),ELRM(n),ELR(n),ELTP(n),ELT(n), &
151 : ELZ0(n),ELZP(n), &
152 0 : CPV(n),dCp_dT_00(n),QQV(n),dQQ_dT_00(n) , &
153 0 : dP_dr_00(n), dCp_dr_00(n), dQQ_dr_00(n), &
154 0 : dP_dr_in(n),dCp_dr_in(n),dQQ_dr_in(n), &
155 : dHp_dr_in(n),dHp_dr_out(n),dHp_dr_00(n),dHp_dT_00(n),dHp_dT_out(n), &
156 : dY_dr_in(n),dY_dr_00(n),dY_dr_out(n),dY_dT_00(n), &
157 : dY_dT_out(n), &
158 : PII(n),dPII_dr_in(n),dPII_dr_00(n),dPII_dr_out(n), &
159 : dPII_dT_00(n),dPII_dT_out(n),DPIIZ0(n), &
160 : dsrc_dr_in(n),dsrc_dr_00(n),dsrc_dr_out(n),dsrc_dT_00(n), &
161 : dsrc_dT_out(n),dsrc_dw_00(n),source(n), &
162 : d_damp_dr_in(n),d_damp_dr_00(n),d_damp_dr_out(n),d_damp_dT_00(n), &
163 : d_damp_dT_out(n),d_damp_dw_00(n),DAMP(n), &
164 : dsrc_dr_in2(n),dsrc_dT_in(n),d_damp_dr_in2(n),d_damp_dT_in(n), &
165 : d_dampR_dr_in(n),d_dampR_dr_00(n),d_dampR_dr_out(n),d_dampR_dT_00(n), &
166 : d_dampR_dT_out(n),d_dampR_dw_00(n),DAMPR(n), &
167 : d_dampR_dr_in2(n),d_dampR_dT_in(n), &
168 : DLCXM(n),DLCX0(n),DLCXP(n),DLCY0(n), &
169 : DLCYP(n),DLCZ0(n),DLCZP(n), &
170 : DLTXM(n),DLTX0(n),DLTXP(n),DLTY0(n), &
171 : DLTYP(n),DLTZ0(n),DLTZP(n),Lt(n), &
172 : PTURB(n),dPtrb_dw_00(n),dPtrb_dr_00(n),dPtrb_dr_in(n), &
173 : QWK(n,15),QWKEV(n,15),VRU(n,15), &
174 : VRR(n,15), VRT(n,15), VRL(n,15), VRC(n,15), &
175 : DVRR(n,15),DVRT(n,15),DVRL(n,15),DVRC(n,15), &
176 : PHR(n,15), PHT(n,15), PHL(n,15), PHU(n,15), PHC(n,15), &
177 0 : ZZZ(4*n,4*n),XXL(4*n))
178 :
179 0 : NZN3=4*NZN
180 0 : LD_VL = LD_LLL
181 0 : LD_VR = LD_LLL
182 :
183 : ! SET ALL NECESSARY DERIVATIVES AND VALUES EQUAL 0
184 : ! FOR FROZEN-IN APPROXIMATION, OR IN CASE ALFA=0 (RADIATIVE)
185 0 : if(ALFA==0.d0)then
186 0 : do I=1,NZN
187 0 : Et(I)=0.d0
188 0 : EFL02=0.d0
189 0 : DLCX0(I)=0.d0
190 0 : DLCXM(I)=0.d0
191 0 : DLCXP(I)=0.d0
192 0 : DLCY0(I)=0.d0
193 0 : DLCYP(I)=0.d0
194 0 : DLCZ0(I)=0.d0
195 0 : DLCZP(I)=0.d0
196 0 : DLTX0(I)=0.d0
197 0 : DLTXM(I)=0.d0
198 0 : DLTXP(I)=0.d0
199 0 : DLTY0(I)=0.d0
200 0 : DLTYP(I)=0.d0
201 0 : DLTZ0(I)=0.d0
202 0 : DLTZP(I)=0.d0
203 0 : EVUU0(I)= 0.d0
204 0 : EVUUM(I)= 0.d0
205 0 : PTURB(I)= 0.d0
206 0 : dPtrb_dr_00(I)= 0.d0
207 0 : dPtrb_dr_in(I)= 0.d0
208 0 : dPtrb_dw_00(I)= 0.d0
209 0 : dC_dr_00(I) = 0.d0
210 0 : dC_dr_out(I) = 0.d0
211 0 : dC_dr_in(I) = 0.d0
212 0 : dC_dr_in2(I)= 0.d0
213 0 : dC_dT_in(I) = 0.d0
214 0 : dC_dT_00(I) = 0.d0
215 0 : dC_dT_out(I) = 0.d0
216 0 : dC_dw_00(I) = 0.d0
217 : end do
218 : end if
219 :
220 : ! LOOP 1 .. EOS
221 :
222 0 : !$OMP PARALLEL DO PRIVATE(I,T1,op_err) SCHEDULE(dynamic,2)
223 : do I=1,NZN
224 :
225 : if(Et(I)<=EFL02) Et(I)=EFL02
226 :
227 : call mesa_eos_kap(s,0, &
228 : T(I),Vol(I),P(I),DPV(I),dP_dT_00(I), &
229 : E(I),DEV(I),dE_dT_00(I),CPS(I),CPV(I),dCp_dT_00(I), &
230 : QQS(I),QQV(I),dQQ_dT_00(I),K(I),dK_dV_00(I),dK_dT_00(I),op_err)
231 : if (op_err /= 0) ierr = op_err
232 : if (ierr /= 0) cycle
233 :
234 : T1=P43/dm(I)
235 : DVR(I)=3.d0*T1*R(I)**2
236 : if(I==1) GOTO 2
237 : DVRM(I)=-3.d0*T1*R(max(1,I-1))**2
238 : ! bp: max(1,i-1) to prevent bogus warning from gfortran
239 : GOTO 3
240 : 2 DVRM(I)=-3.d0*T1*s% R_center**2
241 : 3 continue
242 : dP_dr_00(I) =DPV(I)*DVR(I)
243 : dP_dr_in(I)=DPV(I)*DVRM(I)
244 : dCp_dr_00(I) =CPV(I)*DVR(I)
245 : dCp_dr_in(I)=CPV(I)*DVRM(I)
246 : dQQ_dr_00(I) =QQV(I)*DVR(I)
247 : dQQ_dr_in(I)=QQV(I)*DVRM(I)
248 :
249 : end do
250 : !$OMP END PARALLEL DO
251 0 : if (ierr /= 0) return
252 :
253 : ! SKIP ALL DERIVATIVE CALCULATIONS IN CASE OF FROZEN-IN
254 : ! APPROXIMATION OR ALFA=0 (RADIATIVE CASE)
255 0 : if(ALFA==0.d0) GOTO 999
256 :
257 : ! SET E_T (NOW =w) BELOW AND ABOVE BOUNDARIES
258 0 : Et(NZN) = 0.d0
259 0 : do I=1,IBOTOM
260 0 : Et(I) = 0.d0
261 : end do
262 :
263 0 : do I=1,NZN-1
264 0 : POM= (R(I)**2)/(2.d0*G*M(I))
265 0 : POM2=POM*(P(I)*Vol(I)+P(I+1)*Vol(I+1))
266 0 : Hp_face(I)=POM2
267 0 : dHp_dr_in(I)=POM*(P(I)*DVRM(I)+Vol(I)*dP_dr_in(I))
268 : dHp_dr_00(I)=2.d0*Hp_face(I)/R(I)+POM*(P(I)*DVR(I)+Vol(I)*dP_dr_00(I) &
269 0 : +P(I+1)*DVRM(I+1)+Vol(I+1)*dP_dr_in(I+1))
270 0 : dHp_dr_out(I)=POM*(P(I+1)*DVR(I+1)+Vol(I+1)*dP_dr_00(I+1))
271 0 : dHp_dT_00(I)=POM*Vol(I)*dP_dT_00(I)
272 0 : dHp_dT_out(I)=POM*Vol(I+1)*dP_dT_00(I+1)
273 : end do
274 0 : POM=(R(NZN)**2)/(2.d0*G*M(NZN))
275 0 : Hp_face(NZN)=POM*P(NZN)*Vol(NZN)
276 0 : dHp_dr_in(NZN)=POM*(P(NZN)*DVRM(NZN)+Vol(NZN)*dP_dr_in(NZN))
277 : dHp_dr_00(NZN)=2.d0*Hp_face(NZN)/R(NZN)+POM* &
278 0 : (P(NZN)*DVR(NZN)+Vol(NZN)*dP_dr_00(NZN))
279 0 : dHp_dr_out(NZN)=0.d0
280 0 : dHp_dT_00(NZN)=POM*Vol(NZN)*dP_dT_00(NZN)
281 0 : dHp_dT_out(NZN)=0.d0
282 :
283 : !call mesa_error(__FILE__,__LINE__,'Hp_face')
284 :
285 0 : do I=1,NZN-1
286 0 : POM=0.5d0*(QQS(I)/CPS(I)+QQS(I+1)/CPS(I+1))
287 0 : POM2=0.5d0*(P(I+1)-P(I))
288 : IGR1=0.5d0*(QQS(I)/CPS(I)+QQS(I+1)/CPS(I+1))*(P(I+1)-P(I)) &
289 0 : -(dlog(T(I+1))-dlog(T(I)))
290 : IGR1X0=POM2*((dQQ_dr_00(I)-QQS(I)/CPS(I)*dCp_dr_00(I))/CPS(I)+ &
291 : (dQQ_dr_in(I+1)-QQS(I+1)/CPS(I+1)*dCp_dr_in(I+1))/CPS(I+1)) &
292 0 : +POM*(dP_dr_in(I+1)-dP_dr_00(I))
293 : IGR1XM=POM2*(dQQ_dr_in(I)-QQS(I)/CPS(I)*dCp_dr_in(I))/CPS(I) &
294 0 : +POM*(-dP_dr_in(I))
295 : IGR1XP=POM2*(dQQ_dr_00(I+1)-QQS(I+1)/CPS(I+1)*dCp_dr_00(I+1))/CPS(I+1) &
296 0 : +POM*(dP_dr_00(I+1))
297 : IGR1Y0=POM2*(dQQ_dT_00(I)-QQS(I)/CPS(I)*dCp_dT_00(I))/CPS(I) &
298 0 : +POM*(-dP_dT_00(I))+1.d0/T(I)
299 : IGR1YP=POM2*(dQQ_dT_00(I+1)-QQS(I+1)/CPS(I+1)*dCp_dT_00(I+1))/CPS(I+1) &
300 0 : +POM*(dP_dT_00(I+1))-1.d0/T(I+1)
301 :
302 0 : POM=2.d0/(Vol(I)+Vol(I+1))
303 0 : POM2=8.d0*PI*(R(I)**2)/dm_bar(I)*Hp_face(I)
304 0 : IGR2=4.d0*PI*(R(I)**2)*Hp_face(I)*POM/dm_bar(I)
305 : IGR2X0=2.d0*IGR2/R(I)+IGR2/Hp_face(I)*dHp_dr_00(I) &
306 0 : -POM2/(Vol(I)+Vol(I+1))**2*(DVR(I)+DVRM(I+1))
307 : IGR2XM=-POM2/(Vol(I)+Vol(I+1))**2*DVRM(I) &
308 0 : +IGR2/Hp_face(I)*dHp_dr_in(I)
309 : IGR2XP=-POM2/(Vol(I)+Vol(I+1))**2*DVR(I+1) &
310 0 : +IGR2/Hp_face(I)*dHp_dr_out(I)
311 0 : IGR2Y0=IGR2/Hp_face(I)*dHp_dT_00(I)
312 0 : IGR2YP=IGR2/Hp_face(I)*dHp_dT_out(I)
313 :
314 0 : Y_face(I)=IGR1*IGR2
315 0 : dY_dr_00(I)=IGR1*IGR2X0+IGR2*IGR1X0
316 0 : dY_dr_in(I)=IGR1*IGR2XM+IGR2*IGR1XM
317 0 : dY_dr_out(I)=IGR1*IGR2XP+IGR2*IGR1XP
318 0 : dY_dT_00(I)=IGR1*IGR2Y0+IGR2*IGR1Y0
319 0 : dY_dT_out(I)=IGR1*IGR2YP+IGR2*IGR1YP
320 : end do
321 :
322 : !call mesa_error(__FILE__,__LINE__,'IGRS')
323 :
324 0 : do I=1,NZN-1
325 0 : POM=sqrt(2.d0/3.d0)*0.5d0
326 : FF=POM*((E(I) +P(I) *Vol(I) )/T(I) &
327 0 : +(E(I+1)+P(I+1)*Vol(I+1))/T(I+1))
328 0 : FFY0=POM*(dE_dT_00(I)+dP_dT_00(I)*Vol(I)-(E(I)+P(I)*Vol(I))/T(I))/T(I)
329 : FFYP=POM*(dE_dT_00(I+1)+dP_dT_00(I+1)*Vol(I+1)-(E(I+1)+P(I+1)*Vol(I+1)) &
330 0 : /T(I+1))/T(I+1)
331 0 : FFXP=POM* ((DEV(I+1)+P(I+1))*DVR(I+1)+Vol(I+1)*dP_dr_00(I+1))/T(I+1)
332 : FFX0=POM*(((DEV(I) +P(I) )*DVR(I) +Vol(I) *dP_dr_00(I) )/T(I)+ &
333 : ((DEV(I+1)+P(I+1))*DVRM(I+1)+Vol(I+1)*dP_dr_in(I+1)) &
334 0 : /T(I+1))
335 0 : FFXM=POM* ((DEV(I) +P(I) )*DVRM(I) +Vol(I)*dP_dr_in(I))/T(I)
336 :
337 0 : POM=ALFAS*ALFA
338 0 : POM2=0.5d0*(CPS(I)+CPS(I+1))
339 0 : GG=POM*POM2*Y_face(I)
340 0 : GGXM=POM*(POM2*dY_dr_in(I)+Y_face(I)*0.5d0*dCp_dr_in(I))
341 0 : GGX0=POM*(POM2*dY_dr_00(I)+Y_face(I)*0.5d0*(dCp_dr_00(I)+dCp_dr_in(I+1)))
342 0 : GGXP=POM*(POM2*dY_dr_out(I)+Y_face(I)*0.5d0*dCp_dr_00(I+1))
343 0 : GGY0=POM*(POM2*dY_dT_00(I)+Y_face(I)*0.5d0*dCp_dT_00(I))
344 0 : GGYP=POM*(POM2*dY_dT_out(I)+Y_face(I)*0.5d0*dCp_dT_00(I+1))
345 0 : GPF=GG/FF
346 :
347 : ! corelation PI defined without e_t
348 0 : POM=1.d0
349 :
350 0 : PII(I)=POM*GG
351 0 : DPIIZ0(I)=0.d0
352 0 : dPII_dr_00(I)=POM*GGX0
353 0 : dPII_dr_in(I)=POM*GGXM
354 0 : dPII_dr_out(I)=POM*GGXP
355 0 : dPII_dT_00(I)=POM*GGY0
356 0 : dPII_dT_out(I)=POM*GGYP
357 : end do
358 :
359 : !call mesa_error(__FILE__,__LINE__,'LINA')
360 :
361 0 : do I=IBOTOM+1,NZN-1
362 : ! SOURCE TERM
363 0 : POM=0.5d0*(PII(I)/Hp_face(I)+PII(I-1)/Hp_face(I-1))
364 0 : POM2=T(I)*P(I)*QQS(I)/CPS(I)
365 0 : POM3=sqrt(Et(I))
366 0 : SOURCE(I)=POM*POM2*POM3
367 0 : TEM1=POM2*POM3*0.5d0
368 0 : TEMI=-PII(I)/Hp_face(I)**2
369 0 : TEMM=-PII(I-1)/Hp_face(I-1)**2
370 :
371 : dsrc_dr_out(I)= TEM1*(dPII_dr_out(I)/Hp_face(I) &
372 0 : +TEMI*dHp_dr_out(I))
373 : dsrc_dr_00(I)= TEM1*(dPII_dr_00(I)/Hp_face(I)+dPII_dr_out(I-1)/Hp_face(I-1) &
374 0 : +TEMI*dHp_dr_00(I)+TEMM*dHp_dr_out(I-1))
375 : dsrc_dr_in(I)= TEM1*(dPII_dr_in(I)/Hp_face(I)+dPII_dr_00(I-1)/Hp_face(I-1) &
376 0 : +TEMI*dHp_dr_in(I)+TEMM*dHp_dr_00(I-1))
377 : dsrc_dr_in2(I)=TEM1*(dPII_dr_in(I-1)/Hp_face(I-1) &
378 0 : +TEMM*dHp_dr_in(I-1))
379 :
380 : dsrc_dT_out(I)= TEM1*(dPII_dT_out(I)/Hp_face(I) &
381 0 : +TEMI*dHp_dT_out(I))
382 : dsrc_dT_00(I)= TEM1*(dPII_dT_00(I)/Hp_face(I)+dPII_dT_out(I-1)/Hp_face(I-1) &
383 0 : +TEMI*dHp_dT_00(I)+TEMM*dHp_dT_out(I-1))
384 : dsrc_dT_in(I)= TEM1*(dPII_dT_00(I-1)/Hp_face(I-1) &
385 0 : +TEMM*dHp_dT_00(I-1))
386 :
387 0 : dsrc_dw_00(I)= POM*POM2*0.5d0/sqrt(Et(I))
388 :
389 0 : POM=POM*POM3
390 :
391 : dsrc_dT_00(I)=dsrc_dT_00(I)+ &
392 : POM/CPS(I)*(P(I)*QQS(I)+T(I)*QQS(I)*dP_dT_00(I)+T(I)*P(I)*dQQ_dT_00(I) &
393 0 : -T(I)*P(I)*QQS(I)/CPS(I)*dCp_dT_00(I))
394 : dsrc_dr_00(I)=dsrc_dr_00(I)+ &
395 : POM*T(I)/CPS(I)*(QQS(I)*dP_dr_00(I)+P(I)*dQQ_dr_00(I) &
396 0 : -P(I)*QQS(I)/CPS(I)*dCp_dr_00(I))
397 : dsrc_dr_in(I)=dsrc_dr_in(I)+ &
398 : POM*T(I)/CPS(I)*(QQS(I)*dP_dr_in(I)+P(I)*dQQ_dr_in(I) &
399 0 : -P(I)*QQS(I)/CPS(I)*dCp_dr_in(I))
400 :
401 : ! SOURCE TERM ALWAYS POSITIVE
402 : ! THIS IS FORMULATION USED IN BUDAPEST-FLORIDA CODE
403 : ! IT REQUIRES E_T AS MAIN VARIABLE - OTHERWISE CONVERGENCE
404 : ! IS EXTREMELY SLOW, AND POSSIBLE ONLY IF LOW ACCURACY
405 : ! FOR CONVERGENCE CONDITION, DXXC< 1d-2 - 1.d-4, IS SET
406 : ! if(SOURCE(I)<=0.d0)then
407 : ! SOURCE(I) = 0.d0
408 : ! dsrc_dr_out(I) = 0.d0
409 : ! dsrc_dr_00(I) = 0.d0
410 : ! dsrc_dr_in(I) = 0.d0
411 : ! dsrc_dr_in2(I)= 0.d0
412 : ! dsrc_dT_out(I) = 0.d0
413 : ! dsrc_dT_in(I) = 0.d0
414 : ! dsrc_dT_00(I) = 0.d0
415 : ! dsrc_dw_00(I) = 0.d0
416 : ! end if
417 :
418 : ! DAMP TERM
419 0 : POM=(CEDE/ALFA)*(Et(I)**1.5d0-EFL02**1.5d0)
420 0 : POM2=0.5d0*(Hp_face(I)+Hp_face(I-1))
421 0 : DAMP(I)=POM/POM2
422 0 : TEM1=-0.5d0*POM/POM2**2
423 0 : d_damp_dr_out(I) =TEM1*dHp_dr_out(I)
424 0 : d_damp_dr_00(I) =TEM1*(dHp_dr_00(I)+dHp_dr_out(I-1))
425 0 : d_damp_dr_in(I) =TEM1*(dHp_dr_in(I)+dHp_dr_00(I-1))
426 0 : d_damp_dr_in2(I)=TEM1*(dHp_dr_in(I-1))
427 0 : d_damp_dT_00(I) =TEM1*(dHp_dT_00(I)+dHp_dT_out(I-1))
428 0 : d_damp_dT_out(I) =TEM1*dHp_dT_out(I)
429 0 : d_damp_dT_in(I) =TEM1*dHp_dT_00(I-1)
430 0 : d_damp_dw_00(I) =1.5d0*(CEDE/ALFA)/POM2*sqrt(Et(I))
431 :
432 : ! RADIATIVE DAMP TERM
433 0 : if(GAMMAR==0.d0)then
434 0 : DAMPR(I) = 0.d0
435 0 : d_dampR_dr_out(I) = 0.d0
436 0 : d_dampR_dr_00(I) = 0.d0
437 0 : d_dampR_dr_in(I) = 0.d0
438 0 : d_dampR_dr_in2(I)= 0.d0
439 0 : d_dampR_dT_out(I) = 0.d0
440 0 : d_dampR_dT_in(I) = 0.d0
441 0 : d_dampR_dT_00(I) = 0.d0
442 0 : d_dampR_dw_00(I) = 0.d0
443 : else
444 0 : POM=(GAMMAR**2)/(ALFA**2)*4.d0*SIG
445 0 : POM2=T(I)**3*Vol(I)**2/(CPS(I)*K(I))
446 0 : POM3=Et(I)
447 0 : POM4=0.5d0*(Hp_face(I)**2+Hp_face(I-1)**2)
448 0 : DAMPR(I)=POM*POM2*POM3/POM4
449 0 : TEM1=-DAMPR(I)/POM4
450 0 : d_dampR_dr_out(I) =TEM1*(Hp_face(I)*dHp_dr_out(I))
451 : d_dampR_dr_00(I) =TEM1*(Hp_face(I)*dHp_dr_00(I) &
452 0 : +Hp_face(I-1)*dHp_dr_out(I-1))
453 : d_dampR_dr_in(I) =TEM1*(Hp_face(I)*dHp_dr_in(I) &
454 0 : +Hp_face(I-1)*dHp_dr_00(I-1))
455 0 : d_dampR_dr_in2(I)=TEM1*(Hp_face(I-1)*dHp_dr_in(I-1))
456 0 : d_dampR_dT_out(I) =TEM1*(Hp_face(I)*dHp_dT_out(I))
457 : d_dampR_dT_00(I) =TEM1*(Hp_face(I)*dHp_dT_00(I) &
458 0 : +Hp_face(I-1)*dHp_dT_out(I-1))
459 0 : d_dampR_dT_in(I) =TEM1*(Hp_face(I-1)*dHp_dT_00(I-1))
460 :
461 0 : d_dampR_dw_00(I)=POM*POM2/POM4
462 :
463 0 : TEM1=POM*POM3/POM4
464 : d_dampR_dr_00(I)=d_dampR_dr_00(I) &
465 : +TEM1*T(I)**3*(2.d0*Vol(I)*DVR(I) &
466 : -Vol(I)**2*( 1.d0/CPS(I)*dCp_dr_00(I) &
467 : +1.d0/K(I)*dK_dV_00(I)*DVR(I))) &
468 0 : /(CPS(I)*K(I))
469 :
470 : d_dampR_dr_in(I)=d_dampR_dr_in(I) &
471 : +TEM1*T(I)**3*(2.d0*Vol(I)*DVRM(I) &
472 : -Vol(I)**2*( 1.d0/CPS(I)*dCp_dr_in(I) &
473 : +1.d0/K(I)*dK_dV_00(I)*DVRM(I))) &
474 0 : /(CPS(I)*K(I))
475 :
476 : d_dampR_dT_00(I)=d_dampR_dT_00(I) &
477 : +TEM1*Vol(I)**2*(3.d0*T(I)**2 &
478 : -T(I)**3*( 1.d0/CPS(I)*dCp_dT_00(I) &
479 : +1.d0/K(I)*dK_dT_00(I))) &
480 0 : /(CPS(I)*K(I))
481 :
482 : end if
483 :
484 0 : dC_dr_00(I) =dsrc_dr_00(I) -d_damp_dr_00(I) -d_dampR_dr_00(I)
485 0 : dC_dr_out(I) =dsrc_dr_out(I) -d_damp_dr_out(I) -d_dampR_dr_out(I)
486 0 : dC_dr_in(I) =dsrc_dr_in(I) -d_damp_dr_in(I) -d_dampR_dr_in(I)
487 0 : dC_dr_in2(I)=dsrc_dr_in2(I)-d_damp_dr_in2(I)-d_dampR_dr_in2(I)
488 0 : dC_dT_in(I) =dsrc_dT_in(I) -d_damp_dT_in(I) -d_dampR_dT_in(I)
489 0 : dC_dT_00(I) =dsrc_dT_00(I) -d_damp_dT_00(I) -d_dampR_dT_00(I)
490 0 : dC_dT_out(I) =dsrc_dT_out(I) -d_damp_dT_out(I) -d_dampR_dT_out(I)
491 0 : dC_dw_00(I) =dsrc_dw_00(I) -d_damp_dw_00(I) -d_dampR_dw_00(I)
492 :
493 : end do
494 :
495 : !call mesa_error(__FILE__,__LINE__,'LINA')
496 :
497 0 : do I=IBOTOM,NZN-1
498 : ! CONVECTIVE LUMINOSITY
499 : POM=4.d0*PI*(R(I)**2)*(T(I)/Vol(I)+T(I+1)/Vol(I+1))*0.5d0* &
500 0 : (ALFAC/ALFAS)
501 0 : POM3=(sqrt(Et(I))+sqrt(Et(I+1)))*0.5d0
502 0 : Lc(I)=POM*PII(I)*POM3
503 0 : DLCZ0(I)=0d0
504 0 : DLCZP(I)=0d0
505 0 : if (Et(I) /= 0d0) DLCZ0(I)=POM*PII(I)*0.25d0/sqrt(Et(I))
506 0 : if (Et(I+1) /= 0d0) DLCZP(I)=POM*PII(I)*0.25d0/sqrt(Et(I+1))
507 0 : POM2=4.d0*PI*(R(I)**2)*PII(I)*0.5d0*(ALFAC/ALFAS)*POM3
508 0 : POM=POM*POM3
509 : DLCX0(I)=POM*dPII_dr_00(I)+2.d0*Lc(I)/R(I) &
510 : -POM2*(T(I) /(Vol(I)**2 )*DVR(I)+ &
511 0 : T(I+1)/(Vol(I+1)**2)*DVRM(I+1))
512 0 : DLCXM(I)=POM*dPII_dr_in(I)-POM2*T(I) /(Vol(I)**2 )*DVRM(I)
513 0 : DLCXP(I)=POM*dPII_dr_out(I)-POM2*T(I+1)/(Vol(I+1)**2)*DVR(I+1)
514 0 : DLCY0(I)=POM*dPII_dT_00(I)+POM2/Vol(I)
515 0 : DLCYP(I)=POM*dPII_dT_out(I)+POM2/Vol(I+1)
516 :
517 0 : if(I==IBOTOM) DLCZ0(I)=0.d0
518 0 : if(I==NZN-1) DLCZP(I)=0.d0
519 0 : if(Et(I)<EFL02*1d-10)then
520 0 : Lc(I)=0.d0
521 0 : DLCX0(I)=0.d0
522 0 : DLCXM(I)=0.d0
523 0 : DLCXP(I)=0.d0
524 0 : DLCY0(I)=0.d0
525 0 : DLCYP(I)=0.d0
526 0 : DLCZ0(I)=0.d0
527 0 : DLCZP(I)=0.d0
528 : end if
529 :
530 : ! if(PII(I)<0.d0.or.ALFA==0.d0)then
531 : ! Lc(I)=0.d0
532 : ! DLCX0(I)=0.d0
533 : ! DLCXM(I)=0.d0
534 : ! DLCXP(I)=0.d0
535 : ! DLCY0(I)=0.d0
536 : ! DLCYP(I)=0.d0
537 : ! DLCZ0(I)=0.d0
538 : ! DLCZP(I)=0.d0
539 : ! end if
540 :
541 : ! TURBULENT LUMINOSITY
542 0 : if(ALFAT==0.d0.or.ALFA==0.d0)then
543 0 : Lt(I)=0.d0
544 0 : DLTX0(I)=0.d0
545 0 : DLTXM(I)=0.d0
546 0 : DLTXP(I)=0.d0
547 0 : DLTY0(I)=0.d0
548 0 : DLTYP(I)=0.d0
549 0 : DLTZ0(I)=0.d0
550 0 : DLTZP(I)=0.d0
551 : else
552 0 : POM=-2.d0/3.d0*ALFA*ALFAT*(4.d0*PI*(R(I)**2))**2
553 0 : POM2=Hp_face(I)*(1.d0/Vol(I)**2+1.d0/Vol(I+1)**2)*0.5d0
554 0 : POM3=(Et(I+1)**1.5d0-Et(I)**1.5d0)/dm_bar(I)
555 0 : Lt(I)=POM*POM2*POM3
556 : DLTX0(I)=4.d0*Lt(I)/R(I) &
557 : +Lt(I)/POM2*Hp_face(I)*(-1.d0/Vol(I)**3*DVR(I) &
558 : -1.d0/Vol(I+1)**3*DVRM(I+1)) &
559 0 : +Lt(I)/Hp_face(I)*dHp_dr_00(I)
560 :
561 : DLTXM(I)=Lt(I)/POM2*Hp_face(I)*(-1.d0/Vol(I)**3*DVRM(I)) &
562 0 : +Lt(I)/Hp_face(I)*dHp_dr_in(I)
563 : DLTXP(I)=Lt(I)/POM2*Hp_face(I)*(-1.d0/Vol(I+1)**3*DVR(I+1)) &
564 0 : +Lt(I)/Hp_face(I)*dHp_dr_out(I)
565 0 : DLTY0(I)=Lt(I)/Hp_face(I)*dHp_dT_00(I)
566 0 : DLTYP(I)=Lt(I)/Hp_face(I)*dHp_dT_out(I)
567 0 : DLTZ0(I)=-POM*POM2*1.5d0*sqrt(Et(I) )/dm_bar(I)
568 0 : DLTZP(I)= POM*POM2*1.5d0*sqrt(Et(I+1))/dm_bar(I)
569 : end if
570 : end do
571 :
572 : ! TURBULENT PRESSURE (ZONE)
573 0 : do I=IBOTOM+1,NZN-1
574 0 : if(ALFAP==0.d0)then
575 0 : PTURB(I) = 0.d0
576 0 : dPtrb_dw_00(I) = 0.d0
577 0 : dPtrb_dr_00(I) = 0.d0
578 0 : dPtrb_dr_in(I) = 0.d0
579 : else
580 0 : PTURB(I) = ALFAP*Et(I)/Vol(I)
581 0 : dPtrb_dw_00(I) = ALFAP/Vol(I)
582 0 : TEM1=-ALFAP*Et(I)/Vol(I)**2
583 0 : dPtrb_dr_00(I) = TEM1*DVR(I)
584 0 : dPtrb_dr_in(I) = TEM1*DVRM(I)
585 : end if
586 : end do
587 :
588 : ! EDDY VISCOSITY
589 0 : do I=IBOTOM+1,NZN-1
590 0 : if(ALFAM>=0d0) then
591 : ! Kuhfuss (1986) tensor EDDY VISCOSITY
592 0 : POM=16.d0/3.d0*PI*ALFA*ALFAM*sqrt(Et(I))
593 0 : POM1=1.d0/Vol(I)**2/dm(I)
594 0 : POM2=(R(I)**6+R(I-1)**6)*(Hp_face(I)+Hp_face(I-1))*0.25d0
595 0 : EVUU0(I)= POM*POM1*POM2/R(I)
596 0 : EVUUM(I)=-POM*POM1*POM2/R(I-1)
597 : else
598 : ! Kollath et al. 2002 EDDY VISCOSITY pressure
599 0 : POM=-(16.d0/3.d0)*PI*ALFA*abs(ALFAM)*sqrt(Et(I))
600 0 : POM1=1.d0/Vol(I)**2/dm(I)
601 0 : POM2=(R(I)**3+R(I-1)**3)*(Hp_face(I)+Hp_face(I-1))*0.25d0
602 0 : EVUU0(I)= POM*POM1*POM2/R(I)
603 0 : EVUUM(I)=-POM*POM1*POM2/R(I-1)
604 : end if
605 : end do
606 :
607 0 : do I=1,IBOTOM
608 0 : Lc(I)= 0.d0
609 0 : Lt(I)= 0.d0
610 0 : PTURB(I)= 0.d0
611 0 : dPtrb_dw_00(I)= 0.d0
612 0 : dPtrb_dr_00(I)= 0.d0
613 0 : dPtrb_dr_in(I)= 0.d0
614 0 : dC_dr_00(I) = 0.d0
615 0 : dC_dr_out(I) = 0.d0
616 0 : dC_dr_in(I) = 0.d0
617 0 : dC_dr_in2(I)= 0.d0
618 0 : dC_dT_in(I) = 0.d0
619 0 : dC_dT_00(I) = 0.d0
620 0 : dC_dT_out(I) = 0.d0
621 0 : dC_dw_00(I) = 0.d0
622 0 : EVUU0(I) = 0.d0
623 0 : EVUUM(I) = 0.d0
624 : end do
625 0 : do I=1,IBOTOM-1
626 0 : DLCX0(I)=0.d0
627 0 : DLCXM(I)=0.d0
628 0 : DLCXP(I)=0.d0
629 0 : DLCY0(I)=0.d0
630 0 : DLCYP(I)=0.d0
631 0 : DLCZ0(I)=0.d0
632 0 : DLCZP(I)=0.d0
633 0 : DLTX0(I)=0.d0
634 0 : DLTXM(I)=0.d0
635 0 : DLTXP(I)=0.d0
636 0 : DLTY0(I)=0.d0
637 0 : DLTYP(I)=0.d0
638 0 : DLTZ0(I)=0.d0
639 0 : DLTZP(I)=0.d0
640 : end do
641 0 : Lc(NZN)= 0.d0
642 0 : Lt(NZN)= 0.d0
643 0 : PTURB(NZN)= 0.d0
644 0 : dPtrb_dw_00(NZN)= 0.d0
645 0 : dPtrb_dr_00(NZN)= 0.d0
646 0 : dPtrb_dr_in(NZN)= 0.d0
647 0 : DLCX0(NZN)= 0.d0
648 0 : DLCXM(NZN)= 0.d0
649 0 : DLCXP(NZN)= 0.d0
650 0 : DLCY0(NZN)= 0.d0
651 0 : DLCYP(NZN)= 0.d0
652 0 : DLCZ0(NZN)= 0.d0
653 0 : DLCZP(NZN)= 0.d0
654 0 : DLTX0(NZN)=0.d0
655 0 : DLTXM(NZN)=0.d0
656 0 : DLTXP(NZN)=0.d0
657 0 : DLTY0(NZN)=0.d0
658 0 : DLTYP(NZN)=0.d0
659 0 : DLTZ0(NZN)=0.d0
660 0 : DLTZP(NZN)=0.d0
661 0 : dC_dr_00(NZN) = 0.d0
662 0 : dC_dr_out(NZN) = 0.d0
663 0 : dC_dr_in(NZN) = 0.d0
664 0 : dC_dr_in2(NZN)= 0.d0
665 0 : dC_dT_in(NZN) = 0.d0
666 0 : dC_dT_00(NZN) = 0.d0
667 0 : dC_dT_out(NZN) = 0.d0
668 0 : dC_dw_00(NZN) = 0.d0
669 0 : EVUU0(NZN)= 0.d0
670 0 : EVUUM(NZN)= 0.d0
671 :
672 0 : DLCZP(NZN-1)=0.d0
673 0 : DLTZP(NZN-1)=0.d0
674 :
675 : 999 continue
676 :
677 : ! LOOP 2 .. LUM PLUGS
678 : DLR = 0.d0
679 : DLRP = 0.d0
680 : DLRM = 0.d0
681 : DLT = 0.d0
682 : DLTP = 0.d0
683 : DLR = 0.d0 !-1.d0
684 :
685 : DFCX0 = 0.d0
686 : DFCXM = 0.d0
687 : DFCXP = 0.d0
688 : DFCY0 = 0.d0
689 : DFCYP = 0.d0
690 : DFCZ0 = 0.d0
691 : DFCZP = 0.d0
692 0 : do I=1,NZN
693 : ! SET LUM(I-1)
694 0 : DLMR = DLR
695 0 : DLMRP = DLRP
696 0 : DLMRM = DLRM
697 0 : DLMT = DLT
698 0 : DLMTP = DLTP
699 :
700 0 : DFCMX0 = DFCX0
701 0 : DFCMXM = DFCXM
702 0 : DFCMXP = DFCXP
703 0 : DFCMY0 = DFCY0
704 0 : DFCMYP = DFCYP
705 0 : DFCMZ0 = DFCZ0
706 0 : DFCMZP = DFCZP
707 0 : if(I==NZN) GOTO 6
708 : ! Lr(I)=Eq. A.4, Stellingwerf 1975, Appendix A
709 : ! CALC LUM(I)
710 0 : W_00=T(I)**4
711 0 : W_out=T(I+1)**4
712 0 : BW=dlog(W_out/W_00)
713 0 : BK=dlog(K(I+1)/K(I))
714 0 : T1=-CL*R(I)**4/dm_bar(I)
715 0 : T2=(W_out/K(I+1)-W_00/K(I))/(1.d0-BK/BW)
716 0 : T3=T1/(BW-BK)
717 0 : DLK= (T3/K(I)) *(W_00*BW/K(I) -T2) !dL(i)/dK(i)
718 0 : DLKP=-(T3/K(I+1))*(W_out*BW/K(I+1)-T2) !dL(i)/dK(i+1)
719 0 : DLRP= DLKP*dK_dV_00(I+1)*DVR(I+1)
720 0 : DLRM= DLK *dK_dV_00(I) *DVRM(I)
721 0 : DLR= 4.d0*T1*T2/R(I)+DLK*dK_dV_00(I)*DVR(I)+DLKP*dK_dV_00(I+1)*DVRM(I+1)
722 0 : DLTP=4.d0*(T3/T(I+1))*(W_out*BW/K(I+1)-T2*BK/BW)+DLKP*dK_dT_00(I+1)
723 0 : DLT=-4.d0*(T3/T(I))*(W_00*BW/K(I)-T2*BK/BW)+DLK*dK_dT_00(I)
724 : !-----------------------------
725 0 : DFCX0=DLCX0(I)
726 0 : DFCXM=DLCXM(I)
727 0 : DFCXP=DLCXP(I)
728 0 : DFCY0=DLCY0(I)
729 0 : DFCYP=DLCYP(I)
730 0 : DFCZ0=DLCZ0(I)
731 0 : DFCZP=DLCZP(I)
732 0 : GOTO 7
733 : ! OUTER LUM BOUNDARY CONDITION
734 : 6 continue
735 0 : DLT = 4.d0*L0/T(I) !L=4piR^2sigT^4
736 0 : DLR = 2.d0*L0/R(I) !L=4piR^2sigT^4
737 0 : DLRM = 0.d0
738 0 : DLRP = 0.d0
739 0 : DLTP = 0.d0
740 0 : DFCX0 = 0.d0
741 0 : DFCXM = 0.d0
742 0 : DFCXP = 0.d0
743 0 : DFCY0 = 0.d0
744 0 : DFCYP = 0.d0
745 0 : DFCZ0 = 0.d0
746 0 : DFCZP = 0.d0
747 : 7 continue
748 0 : ELRP(I) = DLRP +DFCXP +DLTXP(I)
749 0 : ELRM(I) = DLRM +DFCXM +DLTXM(I)
750 0 : ELR(I) = DLR +DFCX0 +DLTX0(I)
751 0 : ELTP(I) = DLTP +DFCYP +DLTYP(I)
752 0 : ELT(I) = DLT +DFCY0 +DLTY0(I)
753 0 : ELZ0(I) = DFCZ0 +DLTZ0(I)
754 0 : ELZP(I) = DFCZP +DLTZP(I)
755 :
756 : ! CALC ENERGY EQUATION(I)
757 0 : T2=P4/dm(I)
758 0 : T3=T2*(P(I)+DEV(I))
759 0 : T4=1.d0/dm(I)
760 0 : EX20(I) = -T4*( -DLMRM) -dC_dr_in2(I) -T4*( -DFCMXM)
761 0 : EX10(I) = -T4*(DLRM-DLMR ) -dC_dr_in(I) -T4*(DFCXM-DFCMX0)
762 0 : EX00(I) = -T4*(DLR -DLMRP) -dC_dr_00(I) -T4*(DFCX0-DFCMXP)
763 0 : EX01(I) = -T4*(DLRP ) -dC_dr_out(I) -T4*(DFCXP )
764 0 : EY10(I) = -T4*( -DLMT ) -dC_dT_in(I) -T4*( -DFCMY0)
765 0 : EY00(I) = -T4*(DLT -DLMTP) -dC_dT_00(I) -T4*(DFCY0-DFCMYP)
766 0 : EY01(I) = -T4*(DLTP ) -dC_dT_out(I) -T4*(DFCYP )
767 0 : EZ10(I) = -T4*( -DFCMZ0)
768 0 : EZ00(I) = -dC_dw_00(I) -T4*(DFCZ0-DFCMZP)
769 0 : EZ01(I) = -T4*(DFCZP )
770 0 : if(I==1) then
771 0 : EU10(I) = T3*s% R_center**2
772 : else
773 0 : EU10(I) = T3*R(max(1,I-1))**2
774 : ! bp: max(1,I-1) to prevent bogus warning from gfortran
775 : end if
776 0 : EU00(I) = -T3*R(I)**2
777 :
778 : ! CALC CONVECTIVE ENERGY EQUATION(I)
779 0 : T3=P4/dm(I)*PTURB(I)
780 0 : T4=1.d0/dm(I)
781 0 : if (I == 1) then
782 0 : CX20(I) = dC_dr_in2(I) -T4*( -0)
783 0 : CX10(I) = dC_dr_in(I) -T4*(DLTXM(I)-0)
784 0 : CX00(I) = dC_dr_00(I) -T4*(DLTX0(I)-0)
785 0 : CY10(I) = dC_dT_in(I) -T4*( -0)
786 0 : CY00(I) = dC_dT_00(I) -T4*(DLTY0(I)-0)
787 0 : CZ10(I) = -T4*( -0)
788 0 : CZ00(I) = dC_dw_00(I) -T4*(DLTZ0(I)-0)
789 : else
790 0 : CX20(I) = dC_dr_in2(I) -T4*( -DLTXM(I-1))
791 0 : CX10(I) = dC_dr_in(I) -T4*(DLTXM(I)-DLTX0(I-1))
792 0 : CX00(I) = dC_dr_00(I) -T4*(DLTX0(I)-DLTXP(I-1))
793 0 : CY10(I) = dC_dT_in(I) -T4*( -DLTY0(I-1))
794 0 : CY00(I) = dC_dT_00(I) -T4*(DLTY0(I)-DLTYP(I-1))
795 0 : CZ10(I) = -T4*( -DLTZ0(I-1))
796 0 : CZ00(I) = dC_dw_00(I) -T4*(DLTZ0(I)-DLTZP(I-1))
797 : end if
798 0 : CY01(I) = dC_dT_out(I) -T4*(DLTYP(I) )
799 0 : CX01(I) = dC_dr_out(I) -T4*(DLTXP(I) )
800 0 : CZ01(I) = -T4*(DLTZP(I) )
801 0 : if(I==1) then
802 0 : CU10(I) = T3*s% R_center**2
803 : else
804 0 : CU10(I) = T3*R(max(1,I-1))**2
805 : ! bp: max(1,I-1) to prevent bogus warning from gfortran
806 : end if
807 0 : CU00(I) = -T3*R(I)**2
808 :
809 : ! CALC MOMENTUM EQUATION(I)
810 0 : T1=P4*R(I)**2/dm_bar(I)
811 0 : if(ALFAM>=0.d0) T4=P4/(dm_bar(I)*R(I))
812 0 : if(ALFAM<0.d0) T4=-T1
813 0 : MU10(I) = T4*(-EVUUM(I))
814 0 : MZ00(I) = -T1*(-dPtrb_dw_00(I))
815 0 : MX10(I) = -T1*(-dP_dr_in(I)-dPtrb_dr_in(I))
816 0 : MY00(I) = -T1*(-dP_dT_00(I))
817 0 : if(I/=NZN)then
818 : MX00(I) = 4.d0*G*M(I)/R(I)**3 &
819 0 : -T1*(dP_dr_in(I+1)-dP_dr_00(I)+dPtrb_dr_in(I+1)-dPtrb_dr_00(I))
820 0 : MX01(I) = -T1*(dP_dr_00(I+1) +dPtrb_dr_00(I+1))
821 0 : MY01(I) = -T1*(dP_dT_00(I+1))
822 0 : MU00(I) = T4*(EVUUM(I+1)-EVUU0(I))
823 0 : MU01(I) = T4*(EVUU0(I+1))
824 0 : MZ01(I) = -T1*(dPtrb_dw_00(I+1))
825 : else
826 : MX00(I) = 4.d0*G*M(I)/R(I)**3 &
827 0 : -T1*(-dP_dr_00(I))
828 0 : MX01(I) = 0.d0
829 0 : MY01(I) = 0.d0
830 0 : MU00(I) = T4*(-EVUU0(I))
831 0 : MU01(I) = 0.d0
832 0 : MZ01(I) = 0.d0
833 : end if
834 :
835 : end do
836 :
837 0 : do I=1,NZN3
838 0 : do J=1,NZN3
839 0 : LLL(I,J)=0.d0
840 : end do
841 : end do
842 :
843 : !
844 : ! VELOCITY DEFINITION
845 : ! (dR/dT) = u
846 : ! MOMENTUM EQUATION
847 : ! (dU/dt) = - (4 PI R^2)(dp/dm) - (GM)/R^2
848 : ! ENERGY EQUATION
849 : ! (c_v)(dT/dt) = - (p+(de/dV)_T)(dV/dR)U - (dLr/dm)
850 : ! TURBULENT ENERGY EQUATION
851 : ! (de_t/dt) =
852 : ! SEE CODE DOCUMENTATION FOR LINEARIZATION
853 : !
854 : ! EIGENVALUE PROBLEM: LLL*X=SIGMA*X
855 : ! X={dR1,dU1,dT1,dw1,...,dRN,dUN,dTN,dwN}
856 : ! VELOCITY DEF. EQ. IN ROWS IG
857 : ! MOMENTUM EQ. IN ROWS IR
858 : ! ENERGY EQ. IN ROWS IE
859 : ! TURBULENT ENERGY EQ. IN ROWS IC
860 : ! NAMING SCHEME FOR ELEMENTS OF LLL:
861 : ! EX00(I) - d(energy==)/dR_i
862 : ! EX01(I) - d(energy==)/dR_i+1
863 : ! EX10(I) - d(energy==)/dR_i-1
864 : ! EY00(I) - d(energy==)/dT_i
865 : ! EU00(I) - d(energy==)/dU_i
866 : ! MY00(I) - d(moment==)/dT_i
867 : ! e.t.c.
868 : ! VELOCITY DEF. AND MOMENTUM EQ. AT THE INTERFACE 1....NZN
869 : ! ENERGY EQUATIONS IN THE ZONE 1....NZN
870 : !
871 :
872 0 : do I=1,NZN
873 0 : IG=4*I-3
874 0 : IR=4*I-2
875 0 : IE=4*I-1
876 0 : IC=4*I
877 :
878 0 : if(IG+1<=NZN3) LLL(IG,IG+1) = 1.d0
879 : !---------------------------------------
880 0 : if(IR-4>=1) LLL(IR,IR-4) = MU10(I)
881 0 : LLL(IR,IR) = MU00(I)
882 0 : if(IR+4<=NZN3) LLL(IR,IR+4) = MU01(I)
883 :
884 0 : if(IR-5>=1) LLL(IR,IR-5) = MX10(I)
885 0 : if(IR-1>=1) LLL(IR,IR-1) = MX00(I)
886 0 : if(IR+3<=NZN3) LLL(IR,IR+3) = MX01(I)
887 :
888 0 : if(IR+1<=NZN3) LLL(IR,IR+1) = MY00(I)
889 0 : if(IR+5<=NZN3) LLL(IR,IR+5) = MY01(I)
890 :
891 0 : if(IR+2<=NZN3) LLL(IR,IR+2) = MZ00(I)
892 0 : if(IR+6<=NZN3) LLL(IR,IR+6) = MZ01(I)
893 : !---------------------------------------
894 0 : if(IE-5>=1) LLL(IE,IE-5) = EU10(I)/dE_dT_00(I)
895 0 : if(IE-1>=1) LLL(IE,IE-1) = EU00(I)/dE_dT_00(I)
896 :
897 0 : if(IE-10>=1) LLL(IE,IE-10) = EX20(I)/dE_dT_00(I)
898 0 : if(IE-6>=1) LLL(IE,IE-6) = EX10(I)/dE_dT_00(I)
899 0 : if(IE-2>=1) LLL(IE,IE-2) = EX00(I)/dE_dT_00(I)
900 0 : if(IE+2<=NZN3) LLL(IE,IE+2) = EX01(I)/dE_dT_00(I)
901 :
902 0 : if(IE-4>=1) LLL(IE,IE-4) = EY10(I)/dE_dT_00(I)
903 0 : LLL(IE,IE) = EY00(I)/dE_dT_00(I)
904 0 : if(IE+4<=NZN3) LLL(IE,IE+4) = EY01(I)/dE_dT_00(I)
905 :
906 0 : if(IE-3>=1) LLL(IE,IE-3) = EZ10(I)/dE_dT_00(I)
907 0 : if(IE+1<=NZN3) LLL(IE,IE+1) = EZ00(I)/dE_dT_00(I)
908 0 : if(IE+5<=NZN3) LLL(IE,IE+5) = EZ01(I)/dE_dT_00(I)
909 : !---------------------------------------
910 0 : if(IC-11>=1) LLL(IC,IC-11) = CX20(I)
911 0 : if(IC-7>=1) LLL(IC,IC-7) = CX10(I)
912 0 : if(IC-3>=1) LLL(IC,IC-3) = CX00(I)
913 0 : if(IC+1<=NZN3) LLL(IC,IC+1) = CX01(I)
914 :
915 0 : if(IC-6>=1) LLL(IC,IC-6) = CU10(I)
916 0 : if(IC-2>=1) LLL(IC,IC-2) = CU00(I)
917 :
918 0 : if(IC-5>=1) LLL(IC,IC-5) = CY10(I)
919 0 : if(IC-1>=1) LLL(IC,IC-1) = CY00(I)
920 0 : if(IC+3<=NZN3) LLL(IC,IC+3) = CY01(I)
921 :
922 0 : if(IC-4>=1) LLL(IC,IC-4) = CZ10(I)
923 0 : LLL(IC,IC) = CZ00(I)
924 0 : if(IC+4<=NZN3) LLL(IC,IC+4) = CZ01(I)
925 :
926 0 : IF (IE+4 <= NZN3) then
927 : if(LLL(IE,IE+4)<0.d0)then
928 : !write(*,*) 'rerrrrrrrrrrrrrrrrrrrrrrrr',i
929 : end if
930 : end if
931 : end do
932 :
933 0 : if (s% RSP_trace_RSP_build_model) &
934 0 : write(*,*) 'waiting for DGEEV to solve eigenvalue problem....'
935 : call DGEEV('n','v',NZN3,LLL,LD_LLL,WRx,WIx,VLx,LD_VL,VRx,LD_VR, &
936 0 : WORKx,4*NZN3,INFO)
937 0 : if(INFO/=0)then
938 0 : write(*,*) 'FAILED!'
939 0 : write(*,*) 'LAPACK/DGEEV error, ierr= ',INFO
940 0 : ierr = -1
941 0 : return
942 : stop
943 : end if
944 :
945 : ! THIS IS A MODIFIED "NUMERICAL RECIPES" SORTING SUBROUTINE
946 : ! IT SORTS THE VECTOR WI (DIMENSION NZN3) IN ASCENDING ORDER
947 : ! AND IN THE SAME WAY REARRANGES THE ELEMENTS OF WR (WR IS NOT SORTED)
948 : ! THE INTEGER VECTOR ISORT CONTAINS INFORMATION ABOUT CHANGES DONE
949 : ! NAMELY ELEMENT I OF SORTED WI (AND REARRANGED WR) WAS ISORT(I) ELEMENT
950 : ! OF UNSORTED WI (AND NOT REARANGED WR)
951 0 : call SORT(NZN3,WIx,WRx,ISORTx)
952 :
953 : ! THIS LOOP FINDS THE SMALLEST BUT POSITIVE VALUE OF VECTOR WI (MINI)
954 : ! AND RETURNS THE CORRESPONDING INDEX (IMI)
955 0 : FILENAME=trim(s% log_directory) // '/' // 'LINA_period_growth_info.data'
956 : !open(15,file=trim(FILENAME),status='unknown')
957 0 : MINI=5.d0
958 0 : IMI=0
959 : !write(15,'(a)') ' I R PERIOD'
960 0 : do I=1,NZN3
961 : ! if(WIx(I)<MINI.and.WIx(I)>1d-9)then
962 0 : if((WIx(I)<MINI) .and.(WIx(I)>1.d-9))then
963 0 : if(P4*WRx(I)/WIx(I)>-.3d+1)then
964 0 : MINI=WIx(I)
965 0 : IMI=I
966 : end if
967 : end if
968 0 : if (abs(WIx(I)) > 1d-50) then
969 : !write(15,'(2(d14.8,tr2),f11.6)') &
970 : ! WIx(I),WRx(I),2.d0*PI/WIx(I)/86400d0
971 : else
972 : !write(15,'(2(d14.8,tr2),f11.6)') &
973 : ! 0d0,WRx(I),0d0
974 : end if
975 : end do
976 : !close(15)
977 :
978 0 : do J=1,NMODES
979 : 444 continue
980 0 : if(P4*WRx(IMI+J-1)/WIx(IMI+J-1)<-.5d+1)then
981 0 : IMI=IMI+1
982 0 : GOTO 444
983 : end if
984 : ! VRRS(J) IS THE MODULI OF THE SUTFACE R-EIGENVECTOR OF THE MODE J
985 : VRRS(J)=sqrt(VRx(4*NZN-3,ISORTx(IMI+J-1))**2+ &
986 0 : VRx(4*NZN-3,ISORTx(IMI+J-1)+1)**2) !surface value
987 : VTTS(J)=VRx(4*NZN-3,ISORTx(IMI+J-1))+(0.d0,1.d0)* &
988 0 : VRx(4*NZN-3,ISORTx(IMI+J-1)+1)
989 :
990 0 : SCALE(J)=R(NZN)/VTTS(J)
991 : ! PERS(J) IS THE PERIOD OF THE MODE J (IN SECONDS)
992 : OMEG(J)=WIx(IMI+J-1)
993 0 : PERS(J)=2.d0*PI/OMEG(J)
994 0 : Q(J)=PERS(J)*SQRT((M(NZN)/SUNM)*(SUNR/R(NZN))**3)/86400.d0
995 : ! ETO(J) IS THE GROWTH RATE OF MODE J
996 0 : ETO(J)= P4*WRx(IMI+J-1)/OMEG(J)
997 0 : EK(J)=0.d0
998 0 : SGRP=0.d0
999 0 : SGRM=0.d0
1000 0 : NORMC=-1.d50
1001 0 : do I=1,NZN
1002 : ! SEE LAPACK USERS GUIDE FOR CONSTRUCTION OF EIGENVECTORS
1003 :
1004 : ! VRR(I,J) IS THE dR EIGENVECTOR OF THE MODE J
1005 : ! dR_i
1006 : VRR(I,J)=VRx(4*I-3,ISORTx(IMI+J-1))+(0.d0,1.d0)* &
1007 0 : VRx(4*I-3,ISORTx(IMI+J-1)+1)
1008 : ! DVRR(I,J) IS SCALED dR/R EIGENVECTOR OF THE MODE (J)
1009 : ! (dR_i/R_i)/(dR_NZN/R_NZN)
1010 0 : DVRR(I,J)=VRR(I,J)/R(I)*SCALE(J)
1011 0 : PHR(I,J)=datan2(aimag(DVRR(I,J)),dble(DVRR(I,J)))
1012 :
1013 : ! VRT(I,J) IS THE dT EIGENVECTOR OF THE MODE J
1014 : ! dT_i
1015 : VRT(I,J)=VRx(4*I-1,ISORTx(IMI+J-1))+(0.d0,1.d0)* &
1016 0 : VRx(4*I-1,ISORTx(IMI+J-1)+1)
1017 : ! DVRT(I,J) IS SCALED dT/T EIGENVECTOR OF THE MODE (J)
1018 : ! (dT_i/T_i)/(dR_NZN/R_NZN)
1019 0 : DVRT(I,J)=VRT(I,J)/T(I)*SCALE(J)
1020 0 : PHT(I,J)=datan2(aimag(DVRT(I,J)),dble(DVRT(I,J)))
1021 :
1022 : ! VRC(I,J) IS THE dT EIGENVECTOR OF THE MODE J
1023 : ! dOMEGA_i
1024 : VRC(I,J)=VRx(4*I,ISORTx(IMI+J-1))+(0.d0,1.d0)* &
1025 0 : VRx(4*I,ISORTx(IMI+J-1)+1)
1026 : ! DVRC(I,J) IS SCALED dOMEGA/OMEGA EIGENVECTOR OF THE MODE (J)
1027 : ! (dOMEGA_i/OMEGA_i)/(dR_NZN/R_NZN)
1028 0 : DVRC(I,J)=VRC(I,J)
1029 0 : if(NORMC<abs(DVRC(I,J))) NORMC=abs(DVRC(I,J))
1030 0 : PHC(I,J)=datan2(aimag(DVRC(I,J)),dble(DVRC(I,J)))
1031 :
1032 : ! VRU(I,J) IS THE dU EIGENVECTOR OF THE MODE J
1033 : ! dU_i
1034 : VRU(I,J)=VRx(4*I-2,ISORTx(IMI+J-1))+(0.d0,1.d0)* &
1035 0 : VRx(4*I-2,ISORTx(IMI+J-1)+1)
1036 0 : PHU(I,J)=datan2(aimag(VRU(I,J)),dble(VRU(I,J)))
1037 :
1038 : ! KINETIC ENERGY OF THE MODE
1039 0 : EK(J)=EK(J)+0.5d0*dm_bar(I)*(OMEG(J)*abs(VRR(I,J)*SCALE(J)))**2
1040 :
1041 : ! WORK DONE IN ZONE I (FOR THE MODE J)
1042 0 : if(I==1) then
1043 0 : DV_0=DVR(I)*VRR(I,J)*SCALE(J)
1044 : else
1045 0 : DV_0=(DVR(I)*VRR(I,J)+DVRM(I)*VRR(I-1,J))*SCALE(J)
1046 : end if
1047 0 : DP_0=(DPV(I)*DV_0+dP_dT_00(I)*VRT(I,J)*SCALE(J))
1048 :
1049 0 : DPEV=EVUU0(I)*VRU(I,J)
1050 0 : if(I>=2)DPEV=DPEV+EVUUM(I)*VRU(I-1,J)
1051 0 : DPEV=DPEV*SCALE(J)
1052 :
1053 0 : dP_dT_00URB=dPtrb_dr_00(I)*VRR(I,J)
1054 0 : if(I>=2) dP_dT_00URB=dP_dT_00URB+dPtrb_dr_in(I)*VRR(I-1,J)
1055 0 : dP_dT_00URB=dP_dT_00URB+dPtrb_dw_00(I)*VRC(I,J)
1056 0 : dP_dT_00URB=dP_dT_00URB*SCALE(J)
1057 :
1058 0 : QWK(I,J)=-PI*dm(I)*aimag(conjg(DP_0)*DV_0)
1059 0 : if(ALFAM<0.d0)QWKEV(I,J)=-PI*dm(I)*aimag(conjg(DPEV)*DV_0)
1060 0 : QWKPT(I,J)=-PI*dm(I)*aimag(conjg(dP_dT_00URB)*DV_0)
1061 0 : if(ALFAM>0.d0)then
1062 : QWKEV(I,J)=PI*dm(I)*aimag(conjg(DPEV)*(DV_0/R(I)**3- &
1063 0 : 3.d0*Vol(I)/R(I)**4*VRR(I,J)*SCALE(J)))
1064 : end if
1065 :
1066 0 : if(QWK(I,J)+QWKEV(I,J)+QWKPT(I,J)>=0.d0) &
1067 : SGRP=SGRP+QWK(I,J)+QWKEV(I,J)+QWKPT(I,J)
1068 : if(QWK(I,J)+QWKEV(I,J)+QWKPT(I,J)<0.d0) &
1069 : SGRM=SGRM+abs(QWK(I,J)+QWKEV(I,J)+QWKPT(I,J))
1070 :
1071 0 : VEL(I,J)=abs(VRR(I,J))/VRRS(J)
1072 0 : if(abs(PHR(I,J))>1.57d0)VEL(I,J)=-VEL(I,J)
1073 : end do
1074 :
1075 : ! WRITE WORK-INTEGRALS INTO FILE
1076 0 : if(J<=9)then
1077 0 : write(NUMER1,'(I1)') J
1078 0 : FILENAME=trim(s% log_directory) // '/' // 'LINA_work'//NUMER1//'.data'
1079 : end if
1080 0 : if(J>=10)then
1081 0 : write(NUMER2,'(I2)') J
1082 0 : FILENAME=trim(s% log_directory) // '/' // 'LINA_work'//NUMER2//'.data'
1083 : end if
1084 :
1085 0 : open(57,file=trim(FILENAME),status='unknown')
1086 : write(57,'(a)') &
1087 : '#ZONE log(T) X WORK(P)' // &
1088 : ' WORK(P_NU) WORK(P_T) CWORK(P)' // &
1089 0 : ' CWORK(P_NU) CWORK(P_T)'
1090 0 : ETOI(J)=0.d0
1091 0 : ETOIEV(J)=0.d0
1092 0 : ETOIPT(J)=0.d0
1093 0 : do I=1,NZN
1094 0 : ETOI(J) =ETOI(J) +QWK(I,J)
1095 0 : ETOIEV(J)=ETOIEV(J)+QWKEV(I,J)
1096 0 : ETOIPT(J)=ETOIPT(J)+QWKPT(I,J)
1097 : write(57,'(I3,2(tr1,e15.8),6(tr1,e15.8))') &
1098 0 : NZN+1-I,dlog10(T(I)),R(I)/R(NZN), &
1099 0 : QWK(I,J)/EK(J), QWKEV(I,J)/EK(J), QWKPT(I,J)/EK(J), &
1100 0 : ETOI(J)/EK(J),ETOIEV(J)/EK(J),ETOIPT(J)/EK(J)
1101 : end do
1102 0 : write(57,'("#KINETIC ENERGY:",e15.8)') EK(J)
1103 0 : close(57)
1104 :
1105 : ! CALCULATE LUMINOSITY EIGENFUNCTIONS
1106 0 : do I=1,NZN
1107 : ! VRL(I,J) IS THE dL EIGENVECTOR OF THE MODE J
1108 : ! dL_i
1109 : VRL(I,J)= ELT(I)*VRT(I,J) &
1110 : +ELR(I)*VRR(I,J) &
1111 0 : +ELZ0(I)*VRC(I,J)
1112 0 : if(I/=1) VRL(I,J)=VRL(I,J)+ELRM(I)*VRR(I-1,J)
1113 0 : if(I/=NZN) VRL(I,J)=VRL(I,J)+ELTP(I)*VRT(I+1,J) &
1114 : +ELRP(I)*VRR(I+1,J) &
1115 0 : +ELZP(I)*VRC(I+1,J)
1116 : ! DVRL(I,J) IS SCALED dL/L EIGENVECTOR OF THE MODE (J)
1117 : ! (dL_i/L0)/(dR_NZN/R_NZN)
1118 0 : DVRL(I,J)=VRL(I,J)/L0*SCALE(J)
1119 0 : PHL(I,J)=datan2(aimag(DVRL(I,J)),dble(DVRL(I,J)))
1120 : end do
1121 :
1122 : ! WRITE EIGENVECTORS TO FILE
1123 0 : if(J<=9)then
1124 0 : write(NUMER1,'(I1)') J
1125 0 : FILENAME=trim(s% log_directory) // '/' // 'LINA_eigen'//NUMER1//'.data'
1126 : end if
1127 0 : if(J>=10)then
1128 0 : write(NUMER2,'(I2)') J
1129 0 : FILENAME=trim(s% log_directory) // '/' // 'LINA_eigen'//NUMER2//'.data'
1130 : end if
1131 0 : open(56,file=trim(FILENAME),status='unknown')
1132 : write(56,'(a)') &
1133 : '#ZONE TEMP. FRAC. RADIUS ABS(dR/R) ' // &
1134 : 'PH(dR/R) ABS(dT/T) PH(dT/T) ' // &
1135 0 : 'ABS(dL/L) PH(dL/L) ABS(dE_T) PH(dE_T)'
1136 0 : do I=1,NZN
1137 : write(56,'(I3,tr1,e15.6,tr1,e15.6,8(tr1,e15.8))') &
1138 0 : NZN+1-i,T(I),R(I)/R(NZN),abs(DVRR(I,J)),PHR(I,J), &
1139 0 : abs(DVRT(I,J)),PHT(I,J), &
1140 0 : abs(DVRL(I,J)),PHL(I,J), &
1141 0 : abs(DVRC(I,J))/NORMC,PHC(I,J)
1142 : end do
1143 0 : close(56)
1144 :
1145 0 : SGR(J)=(SGRP-SGRM)/(SGRP+SGRM)
1146 :
1147 0 : PSIG=M(NZN)/(P43*R(NZN)**3)
1148 : PSIG=sqrt(P4*G*PSIG)
1149 :
1150 : QCHECK(J)=100.d0*(ETO(J)-(ETOI(J)+ETOIEV(J)+ETOIPT(J))/EK(J)) &
1151 0 : /ETO(J)
1152 : 19 format('nonadiabatic solution, MODE: ',I2)
1153 : 20 format('eigenvalue: (',1P,D15.8,' , ',D15.8,')')
1154 : 21 format(14X,'freq.[Hz]: ',D11.5,' , sigma: ',D12.6)
1155 : 22 format(14X,'period[d]:',F11.6,1X,' , Q:',F9.6)
1156 : 23 format(9X,'KE growte rate:',F13.9,2X,', KE: ',D12.6)
1157 : 24 format('control: KE growte rate:',F13.9)
1158 : 25 format(' f: (',1P,D15.8,' , ',D15.8,'), abs(f):',D15.8)
1159 : 26 format('control: f: (',1P,D15.8,' , ',D15.8,'), abs(f):',D15.8)
1160 :
1161 : end do
1162 :
1163 : !write(*,'(a55,i12,99(1pd26.16))') 'end LINA s% w(2)**2 Et', &
1164 : ! 2, s% w(2)**2, Et(NZN-1)
1165 :
1166 : return
1167 0 : end subroutine do_LINA
1168 :
1169 :
1170 0 : SUBROUTINE mesa_eos_kap (s,k,G,H, & !input: temp,volume &
1171 : P,PV,PT,E,EV,ET,CP,CPV,dCp_dT_00, &
1172 : Q,QV,QT,OP,OPV,OPT,ierr)
1173 : use rsp_eval_eos_and_kap, only : eval_mesa_eos_and_kap
1174 : type (star_info), pointer :: s
1175 : integer, intent(out) :: ierr
1176 : integer :: k, j
1177 : real(8) :: G,H,P,PV,PT, &
1178 : E,EV,ET,CP,CPV,dCp_dT_00, &
1179 0 : Q,QV,QT,OP,OPV,OPT,cs, &
1180 0 : Pgas,d_Pg_dV,d_Pg_dT,Prad,d_Pr_dT, &
1181 0 : egas,d_egas_dV,d_egas_dT,erad,d_erad_dV,d_erad_dT
1182 : include 'formats'
1183 0 : if (k <= 0 .or. k > NZN) then
1184 0 : j = 0
1185 : else
1186 0 : j = NZN+1-k
1187 : end if
1188 0 : if (is_bad(G+H)) then
1189 0 : write(*,2) 'LINA mesa_eos_kap G H', k, G, H
1190 0 : call mesa_error(__FILE__,__LINE__,'mesa_eos_kap')
1191 : end if
1192 : call eval_mesa_eos_and_kap(s,j,G,H, &
1193 : Pgas,d_Pg_dV,d_Pg_dT,Prad,d_Pr_dT,&
1194 : egas,d_egas_dV,d_egas_dT,erad,d_erad_dV,d_erad_dT, &
1195 : cs,CP,CPV,dCp_dT_00, &
1196 0 : Q,QV,QT,OP,OPV,OPT,ierr)
1197 0 : if (ierr /= 0) return
1198 0 : E = egas + erad
1199 0 : EV = d_egas_dV + d_erad_dV
1200 0 : ET = d_egas_dT + d_erad_dT
1201 0 : P = Pgas + Prad
1202 0 : PV = d_Pg_dV
1203 0 : PT = d_Pg_dT + d_Pr_dT
1204 0 : end SUBROUTINE mesa_eos_kap
1205 :
1206 :
1207 : ! THIS IS A MODIFIED "NUMERICAL RECIPES" SORTING SUBROUTINE
1208 : ! IT SORTS THE VECTOR RA (DIMENSION N) IN ASCENDING ORDER
1209 : ! AND IN THE SAME WAY REARRANGES THE ELEMENTS OF RB (RB IS NOT SORTED)
1210 : ! THE INTEGER VECTOR ISORT CONTAINS INFORMATION ABOUT CHANGES DONE
1211 : ! NAMELY ELEMENT I OF SORTED RA (AND REARRANGED RB) WAS ISORT(I) ELEMENT
1212 : ! OF UNSORTED RA (AND NOT REARANGED RB)
1213 0 : subroutine SORT(N,RA,RB,ISORT)
1214 : integer :: N,ISORT(N)
1215 : real(dp) :: RA(N),RB(N)
1216 : integer :: L,IR,I,J,RRI
1217 0 : real(dp) :: RRA,RRB
1218 :
1219 0 : do I=1,N
1220 0 : ISORT(I)=I
1221 : end do
1222 :
1223 0 : L=N/2+1
1224 0 : IR=N
1225 : 10 continue
1226 0 : if(L>1)then
1227 0 : L=L-1
1228 0 : RRA=RA(L)
1229 0 : RRB=RB(L)
1230 0 : RRI=ISORT(L)
1231 : else
1232 0 : RRA=RA(IR)
1233 0 : RRB=RB(IR)
1234 0 : RRI=ISORT(IR)
1235 0 : RA(IR)=RA(1)
1236 0 : RB(IR)=RB(1)
1237 0 : ISORT(IR)=ISORT(1)
1238 0 : IR=IR-1
1239 0 : if(IR==1)then
1240 0 : RA(1)=RRA
1241 0 : RB(1)=RRB
1242 0 : ISORT(1)=RRI
1243 0 : return
1244 : end if
1245 : end if
1246 0 : I=L
1247 0 : J=L+L
1248 0 : 20 if(J<=IR)then
1249 0 : if(J<IR)then
1250 0 : if(RA(J)<RA(J+1))J=J+1
1251 : end if
1252 0 : if(RRA<RA(J))then
1253 0 : RA(I)=RA(J)
1254 0 : RB(I)=RB(J)
1255 0 : ISORT(I)=ISORT(J)
1256 0 : I=J
1257 0 : J=J+J
1258 : else
1259 0 : J=IR+1
1260 : end if
1261 : GOTO 20
1262 : end if
1263 0 : RA(I)=RRA
1264 0 : RB(I)=RRB
1265 0 : ISORT(I)=RRI
1266 0 : GOTO 10
1267 0 : end subroutine SORT
1268 :
1269 : end module rsp_lina
|