1 | qx.Class.define("pf.Plasma", |
---|
2 | { |
---|
3 | extend: qx.core.Object, |
---|
4 | |
---|
5 | members: |
---|
6 | { |
---|
7 | R0: 0.5, // 0.3/0.7/1 ? |
---|
8 | |
---|
9 | e: null, |
---|
10 | i: null, |
---|
11 | r: null, |
---|
12 | P_r: 0, |
---|
13 | B : 0, |
---|
14 | |
---|
15 | getMicrofieldFrequency: function(s) |
---|
16 | { |
---|
17 | var r = s.getTypicalDistance(); |
---|
18 | var v_r = this.r.getThermalVelocity(); |
---|
19 | var v_s = s.getThermalVelocity(); |
---|
20 | var v = Math.sqrt(v_r*v_r + v_s*v_s); |
---|
21 | |
---|
22 | return v/r; |
---|
23 | }, |
---|
24 | |
---|
25 | getFullDebyeLength: function(s) |
---|
26 | { |
---|
27 | var tmp = 0; |
---|
28 | var m = s.getM(); |
---|
29 | |
---|
30 | var sa = new Array(this.e, this.i, this.r); |
---|
31 | for (var i = 0; i < 3; i++) { |
---|
32 | var os = sa[i]; |
---|
33 | if (os.getM() <= m) { |
---|
34 | var ld = os.getDebyeLength(); |
---|
35 | if (ld) { |
---|
36 | tmp += 1/(ld*ld); |
---|
37 | } |
---|
38 | } |
---|
39 | |
---|
40 | } |
---|
41 | |
---|
42 | return 1/Math.sqrt(tmp); |
---|
43 | }, |
---|
44 | |
---|
45 | getPpiFactor: function(s) |
---|
46 | { |
---|
47 | var dl = this.getFullDebyeLength(s); |
---|
48 | var r1 = s.getTypicalDistance(); |
---|
49 | var r; |
---|
50 | if (isFinite(dl) && isFinite(r1)) { |
---|
51 | r = r1/dl; |
---|
52 | } else { |
---|
53 | r = 0; |
---|
54 | } |
---|
55 | |
---|
56 | return (1 + r)*Math.exp(-r); |
---|
57 | // return 1 - 0.6*r |
---|
58 | }, |
---|
59 | |
---|
60 | getRpiFactor: function(s) |
---|
61 | { |
---|
62 | var r1 = s.getTypicalDistance(); |
---|
63 | var q_r = this.r.getQ(); |
---|
64 | var q_s = s.getQ(); |
---|
65 | if (q_r == 0 || q_s == 0) { |
---|
66 | return 1; |
---|
67 | } |
---|
68 | |
---|
69 | var r_m = s.getMinApproachDistance()*q_r/q_s; |
---|
70 | return Math.exp(-r_m/r1); |
---|
71 | }, |
---|
72 | |
---|
73 | getDelta0: function(s) |
---|
74 | { |
---|
75 | var n_u = this.r.getN_u(); |
---|
76 | var n_l = this.r.getN_l(); |
---|
77 | var Z_core = this.r.getZcore(); |
---|
78 | var ef = s.getHoltsmarkField(); |
---|
79 | |
---|
80 | return 3/2*(n_u*n_u - n_l*n_l)/Z_core*ef; |
---|
81 | }, |
---|
82 | |
---|
83 | getQsHwhm: function(s) |
---|
84 | { |
---|
85 | var n_u = this.r.getN_u(); |
---|
86 | var n_l = this.r.getN_l(); |
---|
87 | |
---|
88 | var ppi = this.getPpiFactor(s); |
---|
89 | var rpi = this.getRpiFactor(s); |
---|
90 | |
---|
91 | // 1.4385 is S_1 HWHM |
---|
92 | var hwhm = 1.4385*this.getDelta0(s)*ppi*rpi; |
---|
93 | |
---|
94 | // rude correction for alpha lines |
---|
95 | if (n_u - n_l == 1) { |
---|
96 | hwhm /= 2; |
---|
97 | } |
---|
98 | |
---|
99 | return hwhm; |
---|
100 | }, |
---|
101 | |
---|
102 | getDynHwhm: function(s) |
---|
103 | { |
---|
104 | // neglect dynamic PP effects |
---|
105 | var ppi = 1.0; |
---|
106 | // assume dynamic RP effect == static one |
---|
107 | var rpi = this.getRpiFactor(s); |
---|
108 | |
---|
109 | var fwhm = this.getMicrofieldFrequency(s)*ppi*rpi; |
---|
110 | |
---|
111 | return fwhm/2; |
---|
112 | }, |
---|
113 | |
---|
114 | getStarkRatio: function(s) |
---|
115 | { |
---|
116 | var R; |
---|
117 | var w_qs = this.getQsHwhm(s); |
---|
118 | if (w_qs == 0) { |
---|
119 | R = 0; |
---|
120 | } else { |
---|
121 | var w_dyn = this.getDynHwhm(s); |
---|
122 | R = w_qs/w_dyn; |
---|
123 | } |
---|
124 | |
---|
125 | return R; |
---|
126 | }, |
---|
127 | |
---|
128 | getStarkQuasistaticity: function(s) |
---|
129 | { |
---|
130 | var R = this.getStarkRatio(s); |
---|
131 | return R/(R + this.R0); |
---|
132 | }, |
---|
133 | |
---|
134 | getStarkHwhm: function(s) |
---|
135 | { |
---|
136 | var w_qs = this.getQsHwhm(s); |
---|
137 | var f = this.getStarkQuasistaticity(s); |
---|
138 | |
---|
139 | return f*w_qs; |
---|
140 | }, |
---|
141 | |
---|
142 | getTotalStarkHwhm: function() |
---|
143 | { |
---|
144 | var w = 0; |
---|
145 | |
---|
146 | var sa = new Array(this.e, this.i, this.r); |
---|
147 | for (var i = 0; i < 3; i++) { |
---|
148 | var s = sa[i]; |
---|
149 | var w_s = this.getStarkHwhm(s); |
---|
150 | |
---|
151 | w += Math.pow(w_s, 3/2); |
---|
152 | } |
---|
153 | |
---|
154 | return Math.pow(w, 2/3); |
---|
155 | }, |
---|
156 | |
---|
157 | getZeemanSplitting: function() |
---|
158 | { |
---|
159 | return pf.base.Bohr.mu_B*this.B; |
---|
160 | }, |
---|
161 | |
---|
162 | getTotalFwhm: function() |
---|
163 | { |
---|
164 | var s_hwhm = this.getTotalStarkHwhm(); |
---|
165 | var z_hwhm = this.getZeemanSplitting(); |
---|
166 | var d_hwhm = this.r.getDopplerHwhm(); |
---|
167 | return 2*Math.sqrt(s_hwhm*s_hwhm + z_hwhm*z_hwhm + d_hwhm*d_hwhm); |
---|
168 | }, |
---|
169 | |
---|
170 | getBremsstrahlungLosses: function() |
---|
171 | { |
---|
172 | var z_i = this.i.getQ(); |
---|
173 | var z_r = this.r.getQ(); |
---|
174 | var v_e = this.e.getThermalVelocity(); |
---|
175 | |
---|
176 | return 8*Math.PI*pf.base.Bohr.alpha3/3*v_e*this.e.getN()* |
---|
177 | (this.i.getN()*z_i*z_i + this.r.getN()*z_r*z_r); |
---|
178 | }, |
---|
179 | |
---|
180 | getBremsstrahlungSpectralDensity: function() |
---|
181 | { |
---|
182 | var photon_en = this.r.getTransitionEnergy(); |
---|
183 | return this.getBremsstrahlungLosses()/this.e.getT()* |
---|
184 | Math.exp(-photon_en/this.e.getT()); |
---|
185 | }, |
---|
186 | |
---|
187 | getFreeBoundLosses: function() |
---|
188 | { |
---|
189 | var T_e = this.e.getT(); |
---|
190 | var v_e = this.e.getThermalVelocity(); |
---|
191 | var N_e = this.e.getN(); |
---|
192 | |
---|
193 | var sum = 0; |
---|
194 | |
---|
195 | var sa = [this.i, this.r]; |
---|
196 | for (var i = 0; i < sa.length; i++) { |
---|
197 | var s = sa[i]; |
---|
198 | var N_s = s.getN(); |
---|
199 | if (!N_s) { |
---|
200 | continue; |
---|
201 | } |
---|
202 | |
---|
203 | var z_s = s.getQ(); |
---|
204 | var m_s = s.getM(); |
---|
205 | |
---|
206 | var Eb = -pf.base.Bohr.bindingEnergy(z_s, m_s, 1); |
---|
207 | |
---|
208 | sum += N_s*z_s*z_s*(Eb/T_e); |
---|
209 | } |
---|
210 | |
---|
211 | return 8*Math.PI*pf.base.Bohr.alpha3/3*N_e*v_e*sum; |
---|
212 | }, |
---|
213 | |
---|
214 | getFreeBoundSpectralDensity: function() |
---|
215 | { |
---|
216 | var photon_en = this.r.getTransitionEnergy(); |
---|
217 | var T_e = this.e.getT(); |
---|
218 | var v_e = this.e.getThermalVelocity(); |
---|
219 | var N_e = this.e.getN(); |
---|
220 | |
---|
221 | var sum = 0; |
---|
222 | |
---|
223 | var sa = [this.i, this.r]; |
---|
224 | for (var i = 0; i < sa.length; i++) { |
---|
225 | var s = sa[i]; |
---|
226 | var N_s = s.getN(); |
---|
227 | if (!N_s) { |
---|
228 | continue; |
---|
229 | } |
---|
230 | |
---|
231 | var z_s = s.getQ(); |
---|
232 | var m_s = s.getM(); |
---|
233 | |
---|
234 | var Eb = -pf.base.Bohr.bindingEnergy(z_s, m_s, 1); |
---|
235 | |
---|
236 | if (photon_en < Eb) { |
---|
237 | continue; |
---|
238 | } |
---|
239 | |
---|
240 | sum += N_s*z_s*z_s*(Eb/T_e)*Math.exp(-(photon_en - Eb)/T_e); |
---|
241 | } |
---|
242 | |
---|
243 | return 8*Math.PI*pf.base.Bohr.alpha3/3*N_e/v_e*sum; |
---|
244 | }, |
---|
245 | |
---|
246 | getPressure: function() |
---|
247 | { |
---|
248 | return this.e.getPressure() + |
---|
249 | this.i.getPressure() + |
---|
250 | this.r.getPressure(); |
---|
251 | }, |
---|
252 | |
---|
253 | getMagneticFieldPressure: function() |
---|
254 | { |
---|
255 | return this.B*this.B/(8*Math.PI); |
---|
256 | }, |
---|
257 | |
---|
258 | getBeta: function() |
---|
259 | { |
---|
260 | return this.getPressure()/this.getMagneticFieldPressure(); |
---|
261 | }, |
---|
262 | |
---|
263 | getFermiEnergy: function() |
---|
264 | { |
---|
265 | return pf.base.Thermo.fermiEnergy(this.e.getN()); |
---|
266 | }, |
---|
267 | |
---|
268 | getFermiVelocity: function() |
---|
269 | { |
---|
270 | return Math.sqrt(2*this.getFermiEnergy()); |
---|
271 | }, |
---|
272 | |
---|
273 | getFermiLength: function() |
---|
274 | { |
---|
275 | var n_e = this.e.getN(); |
---|
276 | var E_F = this.getFermiEnergy(); |
---|
277 | return Math.sqrt(E_F/(6*Math.PI*n_e)); |
---|
278 | }, |
---|
279 | |
---|
280 | getAlfvenVelocity: function() |
---|
281 | { |
---|
282 | var v_m1; |
---|
283 | |
---|
284 | v_m1 = 1/this.e.getAlfvenVelocity(this.B) + |
---|
285 | 1/this.i.getAlfvenVelocity(this.B); |
---|
286 | |
---|
287 | if (this.r.getQ() != 0) { |
---|
288 | v_m1 += 1/this.r.getAlfvenVelocity(this.B); |
---|
289 | } |
---|
290 | |
---|
291 | return 1/v_m1; |
---|
292 | }, |
---|
293 | |
---|
294 | getCoulombLog: function(s1, s2) |
---|
295 | { |
---|
296 | var lambda; |
---|
297 | |
---|
298 | var m1 = s1.getM(); |
---|
299 | var m2 = s2.getM(); |
---|
300 | var v1 = s1.getThermalVelocity(); |
---|
301 | var v2 = s2.getThermalVelocity(); |
---|
302 | var q1 = s1.getQ(); |
---|
303 | var q2 = s2.getQ(); |
---|
304 | |
---|
305 | // kinetic energy in the CoM frame |
---|
306 | var Kp = 3*m1*m2/(2*(m1 + m2))*(v1 + v2)*(v1 + v2); |
---|
307 | |
---|
308 | var b_min = Math.abs(q1*q1/Kp); |
---|
309 | var b_max = this.getFullDebyeLength(s1) + |
---|
310 | this.getFullDebyeLength(s2); |
---|
311 | |
---|
312 | lambda = Math.log(b_max/b_min); |
---|
313 | if (lambda < 1.0) { |
---|
314 | lambda = 1.0; |
---|
315 | } |
---|
316 | |
---|
317 | return lambda; |
---|
318 | }, |
---|
319 | |
---|
320 | getRelaxationRate: function(s1, s2) |
---|
321 | { |
---|
322 | var m1 = s1.getM(); |
---|
323 | var m2 = s2.getM(); |
---|
324 | var v1 = s1.getThermalVelocity(); |
---|
325 | var v2 = s2.getThermalVelocity(); |
---|
326 | var q1 = s1.getQ(); |
---|
327 | var q2 = s2.getQ(); |
---|
328 | |
---|
329 | var n2 = s2.getN(); |
---|
330 | |
---|
331 | var lambda = this.getCoulombLog(s1, s2); |
---|
332 | |
---|
333 | // LL X (42,5) with the missing factor of 3 |
---|
334 | return Math.sqrt(128*Math.PI)/3*q1*q1*q2*q2*n2*lambda/ |
---|
335 | (Math.pow(v1*v1 + v2*v2, 3/2)*m1*m2); |
---|
336 | }, |
---|
337 | |
---|
338 | getDreicerField: function() |
---|
339 | { |
---|
340 | var n_e = this.e.getN(); |
---|
341 | var T_e = this.e.getT(); |
---|
342 | var lambda = this.getCoulombLog(this.e, this.e); |
---|
343 | |
---|
344 | return 4*Math.PI*lambda*n_e/T_e; |
---|
345 | }, |
---|
346 | |
---|
347 | getMassDensity: function() |
---|
348 | { |
---|
349 | return this.e.getMassDensity() + |
---|
350 | this.i.getMassDensity() + |
---|
351 | this.r.getMassDensity(); |
---|
352 | }, |
---|
353 | |
---|
354 | // griem:1997a, Eq (7.75) |
---|
355 | getLteNe: function() |
---|
356 | { |
---|
357 | var Z_core = this.r.getZcore(); |
---|
358 | var E12 = 3.0/8.0*Z_core*Z_core; |
---|
359 | return 5/Math.sqrt(Math.PI)*pf.base.Bohr.alpha3* |
---|
360 | Math.pow(E12, 3)*Math.sqrt(2*this.e.getT()); |
---|
361 | }, |
---|
362 | |
---|
363 | dE2dWl: function(dE) |
---|
364 | { |
---|
365 | var E = this.r.getTransitionEnergy(); |
---|
366 | return (2*Math.PI)*pf.base.Bohr.c*dE/(E*E); |
---|
367 | }, |
---|
368 | |
---|
369 | checkParameters: function() |
---|
370 | { |
---|
371 | if ((this.P_r < 0.0 || this.P_r > 1.0) || |
---|
372 | this.i.getQ() < 1 || |
---|
373 | this.P_r == 1.0 && this.r.getQ() == 0) { |
---|
374 | return false; |
---|
375 | } else { |
---|
376 | return true; |
---|
377 | } |
---|
378 | }, |
---|
379 | |
---|
380 | updateParameters: function() |
---|
381 | { |
---|
382 | // Safety measures |
---|
383 | if (this.checkParameters() != true) { |
---|
384 | return false; |
---|
385 | } |
---|
386 | |
---|
387 | var N_e = this.e.getN(); |
---|
388 | var N_i, N_r; |
---|
389 | |
---|
390 | if (this.P_r < 1.0) { |
---|
391 | N_i = N_e*(1.0 - this.P_r)/ |
---|
392 | (this.i.getQ()*(1.0 - this.P_r) + this.r.getQ()*this.P_r); |
---|
393 | |
---|
394 | N_r = N_i*this.P_r/(1.0 - this.P_r); |
---|
395 | } else { |
---|
396 | N_i = 0.0; |
---|
397 | N_r = N_e/this.r.getQ(); |
---|
398 | } |
---|
399 | |
---|
400 | this.i.setN(N_i); |
---|
401 | this.r.setN(N_r); |
---|
402 | |
---|
403 | return true; |
---|
404 | } |
---|
405 | }, |
---|
406 | |
---|
407 | construct: function() |
---|
408 | { |
---|
409 | var m_p = pf.base.Bohr.m_p; |
---|
410 | var V0 = pf.base.Bohr.V0; |
---|
411 | var E0 = pf.base.Bohr.E0; |
---|
412 | |
---|
413 | // Defaults: 1e16 1/cc, 1 eV |
---|
414 | this.e = new pf.base.Species ("e", 1.0, -1, 1e16*V0, 1.0/E0); |
---|
415 | this.i = new pf.base.Species ("i", m_p, +1, 1e16*V0, 1.0/E0); |
---|
416 | this.r = new pf.base.Radiator("r", m_p, 0, 0, 1.0/E0); |
---|
417 | |
---|
418 | this.P_r = 0; |
---|
419 | |
---|
420 | this.B = 0; |
---|
421 | } |
---|
422 | }); |
---|