@@ -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