Skip to content

Commit 2a0b2f8

Browse files
committed
Optimising DDA run-time
1 parent 471d548 commit 2a0b2f8

File tree

1 file changed

+65
-18
lines changed

1 file changed

+65
-18
lines changed

+ott/TmatrixDda.m

Lines changed: 65 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -957,29 +957,76 @@ function DefaultProgressCallback(data)
957957
% Find which modes we should calculate
958958
ournmodes = nmodes(mmodes == m).';
959959

960-
for n = ournmodes
961-
962-
% Calculate fields (Cartesian coordinates)
963-
[Ei_TE, Ei_TM] = ott.utils.vswfcart(n, m, ...
964-
rtp(:, 1)*k, rtp(:, 2), rtp(:, 3), 'regular');
965-
Ei_TE = Ei_TE.';
966-
Ei_TM = Ei_TM.';
960+
if ~use_iterative
961+
% Not supported by gmres
962+
963+
% Pre-calculate all fields
964+
Ei_TE = zeros(3*size(rtp, 1), numel(ournmodes));
965+
Ei_TM = Ei_TE;
966+
for ii = 1:numel(ournmodes)
967+
[E, M] = ott.utils.vswfcart(ournmodes(ii), m, ...
968+
rtp(:, 1)*k, rtp(:, 2), rtp(:, 3), 'regular');
969+
E = E.';
970+
M = M.';
971+
Ei_TE(:, ii) = E(:);
972+
Ei_TM(:, ii) = M(:);
973+
end
967974

968-
% Evaluate PM fields (Cartesian coordinates)
975+
% Solve all n-modes together
969976
if z_mirror
970-
if mod(m + n, 2) == 0
971-
E_TE = ott.TmatrixDda.solve_and_evaluate(Aodd, Fodd, Ei_TE(:), use_iterative);
972-
E_TM = ott.TmatrixDda.solve_and_evaluate(Aeven, Feven, Ei_TM(:), use_iterative);
973-
else
974-
E_TE = ott.TmatrixDda.solve_and_evaluate(Aeven, Feven, Ei_TE(:), use_iterative);
975-
E_TM = ott.TmatrixDda.solve_and_evaluate(Aodd, Fodd, Ei_TM(:), use_iterative);
976-
end
977+
evn = mod(m+ournmodes, 2) == 0;
978+
979+
E_odd = ott.TmatrixDda.solve_and_evaluate(Aodd, Fodd, ...
980+
[Ei_TE(:, evn), Ei_TM(:, ~evn)], use_iterative);
981+
E_evn = ott.TmatrixDda.solve_and_evaluate(Aeven, Feven, ...
982+
[Ei_TM(:, evn), Ei_TE(:, ~evn)], use_iterative);
983+
984+
En_TE = zeros(size(E_odd, 1), numel(ournmodes));
985+
En_TM = En_TE;
986+
987+
En_TE(:, evn) = E_odd(:, 1:sum(evn));
988+
En_TE(:, ~evn) = E_evn(:, sum(evn)+1:end);
989+
En_TM(:, evn) = E_evn(:, 1:sum(evn));
990+
En_TM(:, ~evn) = E_odd(:, sum(evn)+1:end);
977991
else
978992
% Solve both at the same time (to save time)
979993
E_EM = ott.TmatrixDda.solve_and_evaluate(Aeven, Feven, ...
980-
[Ei_TE(:), Ei_TM(:)], use_iterative);
981-
E_TE = E_EM(:, 1);
982-
E_TM = E_EM(:, 2);
994+
[Ei_TE, Ei_TM], use_iterative);
995+
En_TE = E_EM(:, 1:end/2);
996+
En_TM = E_EM(:, end/2+1:end);
997+
end
998+
end
999+
1000+
for n = ournmodes
1001+
1002+
if ~use_iterative
1003+
E_TE = En_TE(:, ournmodes == n);
1004+
E_TM = En_TM(:, ournmodes == n);
1005+
1006+
else
1007+
1008+
% Calculate fields (Cartesian coordinates)
1009+
[Ei_TE, Ei_TM] = ott.utils.vswfcart(n, m, ...
1010+
rtp(:, 1)*k, rtp(:, 2), rtp(:, 3), 'regular');
1011+
Ei_TE = Ei_TE.';
1012+
Ei_TM = Ei_TM.';
1013+
1014+
% Evaluate PM fields (Cartesian coordinates)
1015+
if z_mirror
1016+
if mod(m + n, 2) == 0
1017+
E_TE = ott.TmatrixDda.solve_and_evaluate(Aodd, Fodd, Ei_TE(:), use_iterative);
1018+
E_TM = ott.TmatrixDda.solve_and_evaluate(Aeven, Feven, Ei_TM(:), use_iterative);
1019+
else
1020+
E_TE = ott.TmatrixDda.solve_and_evaluate(Aeven, Feven, Ei_TE(:), use_iterative);
1021+
E_TM = ott.TmatrixDda.solve_and_evaluate(Aodd, Fodd, Ei_TM(:), use_iterative);
1022+
end
1023+
else
1024+
% Solve both at the same time (to save time)
1025+
E_EM = ott.TmatrixDda.solve_and_evaluate(Aeven, Feven, ...
1026+
[Ei_TE(:), Ei_TM(:)], use_iterative);
1027+
E_TE = E_EM(:, 1);
1028+
E_TM = E_EM(:, 2);
1029+
end
9831030
end
9841031

9851032
ci = ott.utils.combined_index(n,m);

0 commit comments

Comments
 (0)