blob: 360f8c1387bce09082edf3a5616ee38317545950 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
function [w0, z0] = cavity_optics2its_waist_and_position( cavity_optics, lambda )
abcd_cavity = optics2abcd( cavity_optics );
cavity_length = cavity_optics{end}.x;
N=length(cavity_optics);
if ~isCavityStable(abcd_cavity)
display('Cavity is unstable !');
display('We should stop now. There is no stable mode in this cavity');
error('Not possible to calculate a cavity mode in the unstable cavity');
end
zstart = 0;
qstart = abcd2self_repeating_q( abcd_cavity );
% waist location of this particular Gaussian beam
% which disregards other optical elements
z0 = - real (qstart);
i = 1;
if ( (z0 > cavity_optics{1}.x) || (z0 < 0) )
% waist is to the left of the cavity or beyond first reflective/refractive element
% we need to swap cavity elements by one
% in attempt to find waist in between optics elements
x1 = cavity_optics{i}.x;
for i=2:N
cavity_optics_transpose{i-1} = cavity_optics{ i };
cavity_optics_transpose{i-1}.x = cavity_optics{ i }.x - x1;
end
cavity_optics_transpose{N} = cavity_optics{1};
cavity_optics_transpose{N}.x = cavity_length;
[w0, z0] = cavity_optics2its_waist_and_position( cavity_optics_transpose, lambda );
z0 = cavity_optics{1}.x + z0;
else
q0 = gbeam_propagation ( z0, qstart, zstart, cavity_optics );
[w0, r0 ] = q2wr( q0, lambda );
end
end
|