source: source/class/pf/Plasma.js @ 364:5443fc795688

Last change on this file since 364:5443fc795688 was 364:5443fc795688, checked in by Evgeny Stambulchik <Evgeny.Stambulchik@…>, 9 years ago

Added per-species getStarkHwhm().

File size: 11.5 KB
Line 
1qx.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});
Note: See TracBrowser for help on using the repository browser.