summaryrefslogtreecommitdiff
path: root/faraday/faraday_vs_B.m
blob: 733657e17178454928efadcefeeb05c2da82abd6 (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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
function [psr_rad]=faraday_vs_B(detuning_freq, Ep, psi_el, B_fields, theta, phi) 
% calculates transmission  if light polarizations  vs B field in the cell
% for given laser probe and B fields array
% Probe field defined by field strength (Ep) and ellipticity angle (pse_el)
% Magnetic field defined by magnitude (B_field) and angles theta and phi. 
%
% Note: it is expensive to recalculate atom property for each given B_field strength
% so run as many calculation for constant magnetic field as possible

t0 = clock (); % we will use this latter to calculate elapsed time

%tune probe frequency
detuning_p=0;
N_steps=length(B_fields)
kappa_p      =zeros(1,N_steps+1);
kappa_m      =zeros(1,N_steps+1);
xi_linear=zeros(1,N_steps);
xi_left  =zeros(1,N_steps);
xi_right =zeros(1,N_steps);

% load useful functions;
useful_functions;

% some physical constants
useful_constants;

basis_transformation; % load subroutines

fprintf (stderr, "tuning laser in forloop to set conditions vs detuning\n");
fflush (stderr);
for B_field_cntr=1:N_steps;
	B_field=B_fields(B_field_cntr)

	% load atom energy levels and decay description
	rb87_D1_line;


	fprintf (stderr, "calculating atom properties\n");
	fflush (stderr);
	pfile='atomic_B_field.mat'; % the parent file where B_field is stored. This is the parameter for calculated L0_and_polarization_submatrices 
	cfile='L0m_and_polarizability_calculated.mat'; % the child  file to which calculated matrices are  written 
	need_update=false;
	[s, err_p, msg] = stat (pfile); 
	if(err_p)
		%file does not exist
		need_update=true;
	else
		B_field_cur=B_field;
		load (pfile); % loading old B_field value
		if (B_field ~= B_field_cur)
			% old and current B field are different
			B_field=B_field_cur;
			need_update=true;
		else
			need_update=false;
		endif
	endif

	[s, err, msg] = stat (cfile); 
	if(err) 
		%file does not exist
		need_update=true; 
	endif; 

	if ( !need_update)
		% matrices already calculated and up to date, all we need to load them
		load(cfile);
	else
		% calculate E_field independent properties of the atom
		% to be used as sub matrix templates for Liouville operator matrix
		[L0m, polarizability_m]=L0_and_polarization_submatrices( ...
		Nlevels, ...
		H0, g_decay, g_dephasing, dipole_elements ...
		);
		save(pfile, 'B_field');
		save(cfile, 'L0m', 'polarizability_m');
	endif

	elapsed_time = etime (clock (), t0);
	fprintf (stderr, "elapsed time so far is %.3f sec\n",elapsed_time);
	fflush (stderr);

	global atom_properties;
	atom_properties.L0m=L0m;
	atom_properties.polarizability_m=polarizability_m;
	atom_properties.dipole_elements=dipole_elements;

	%light_positive_freq  = [wp];
	E_field_drive         = [0    ];
	E_field_probe         = [Ep   ];
	E_field_zero          = [0    ];
	E_field_lab_pos_freq.linear = E_field_zero + (1.00000+0.00000i)*E_field_probe  + (1.00000+0.00000i)*E_field_drive; 

	% phi is angle between linear polarization and axis x
	%phi=pi*2/8;
	% theta is angle between lab z axis (light propagation direction) and magnetic field axis (z')
	%theta=0;
	% psi_el is the ellipticity parameter (phase difference between left and right polarization)
	%psi_el=-30/180*pi;

	% we define light as linearly polarized 
	% where phi is angle between light polarization and axis x
	% only sign of modulation frequency is important now
	% we define actual frequency later on
	[E_field_lab_pos_freq.x, E_field_lab_pos_freq.y] = rotXpolarization(phi, E_field_lab_pos_freq.linear);
	% we add required ellipticity
	E_field_lab_pos_freq.x*=exp(I*psi_el);
	E_field_lab_pos_freq.y*=exp(-I*psi_el);
	E_field_lab_pos_freq.z=E_field_zero;

	E_field_pos_freq=xyz_lin2atomic_axis_polarization(theta, E_field_lab_pos_freq);


	wp0=w_pf1-w_sf2;  %Fg=2 -> Fe=1
	wp=wp0;
	light_positive_freq=[ wp];
	% we calculate dc and negative frequencies as well as amplitudes
	[modulation_freq, E_field] = ...
	light_positive_frequencies_and_amplitudes2full_set_of_modulation_frequencies_and_amlitudes(...
	light_positive_freq, E_field_pos_freq);
	freq_index=freq2index(wp,modulation_freq);

	atom_field_problem.E_field          = E_field;
	atom_field_problem.modulation_freq  = modulation_freq;
	atom_field_problem.freq_index       = freq_index;

	problems_cell_array=atom_field_problem;
	
save '/tmp/problem_definition.mat' problems_cell_array atom_properties  detuning_freq ;
fprintf (stderr, "now really hard calculations begin\n");
fflush (stderr);
	[xi_linear_i, xi_left_i, xi_right_i]=susceptibility_steady_state_at_freq( problems_cell_array);
	%[xi_linear, xi_left, xi_right]=cellfun( @susceptibility_steady_state_at_freq, problems_cell_array);
	xi_left(B_field_cntr)=xi_left_i;
	xi_right(B_field_cntr)=xi_right_i;
	xi_linear(B_field_cntr)=xi_linear_i;

endfor

save '/tmp/xi_vs_B.mat' detuning_freq xi_linear xi_left xi_right  E_field_pos_freq E_field_probe B_fields psi_el;

psr_rad=output_faraday_results_vs_B;

elapsed_time = etime (clock (), t0)
return

% vim: ts=2:sw=2:fdm=indent