LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
MG1_RR_BtempFFT.m
1% computes product B*temp with B = L(b)+L(c1)L(Zr1)'+L(c2)L(Zr2)'
2% temp has m columns, the result is stored in temp.
3% STEP 1: L(Zr1)'*temp in temp1a, thus (temp'*L(Zr1))'
4
5temp=temp';
6
7% preparing for FFT
8temp1t=reshape(temp,m^2,N)';
9temp1b=[zeros(m,m); r1(1:m*(N-1),:)]'; % Zr1'
10temp1b=reshape(temp1b,m^2,N)';
11temp1b=flipud(temp1b); % termen in omgekeerde volgorde
12
13dim=2*2^ceil(log2(size(temp1t,1)));
14temp1t=fft(temp1t,dim).';
15temp1b=fft(temp1b,dim).';
16
17% now reblock for products
18temp1t=reshape(temp1t,m,m*dim);
19temp1b=reshape(temp1b,m,m*dim).';
20
21for i=1:dim
22 temp1b((i-1)*m+1:i*m,1:m)=temp1t(1:m,(i-1)*m+1:i*m)*...
23 temp1b((i-1)*m+1:i*m,1:m);
24end
25% prepare for IFFT
26temp1b=temp1b.';
27temp1b=reshape(temp1b,m^2,dim).';
28
29temp1b=real(ifft(temp1b))';
30temp1b=reshape(temp1b,m,m*dim)';
31lushelp=N;
32for lus1=1:lushelp
33 temp1a(1:m,(lus1-1)*m+1:lus1*m)=temp1b((lushelp-2+lus1)*m+1:(lushelp-1+lus1)*m,:);
34end
35
36temp1a=temp1a';
37
38% STEP 2: L(c1)L(Zr1)'temp in temp1a
39
40% preparing for FFT
41temp1t=temp1a';
42temp1t=reshape(temp1t,m^2,N)';
43temp1b=c1';
44temp1b=reshape(temp1b,m^2,N)';
45
46dim=2*2^ceil(log2(size(temp1t,1)));
47temp1t=fft(temp1t,dim).';
48temp1b=fft(temp1b,dim).';
49
50% now reblock for products
51temp1t=reshape(temp1t,m,m*dim).';
52temp1b=reshape(temp1b,m,m*dim).';
53
54for i=1:dim
55 temp1b((i-1)*m+1:i*m,1:m)=temp1b((i-1)*m+1:i*m,1:m)*...
56 temp1t((i-1)*m+1:i*m,1:m);
57end
58clear temp1t;
59% prepare for IFFT
60temp1b=temp1b.';
61temp1b=reshape(temp1b,m^2,dim).';
62
63temp1b=real(ifft(temp1b))';
64temp1b=reshape(temp1b,m,m*dim)';
65
66temp1a=temp1b(1:m*N,:);
67clear temp1b;
68
69% STEP 3: LZr2'*temp in temp2a
70
71% preparing for FFT
72temp1t=reshape(temp,m^2,N)';
73temp1b=[zeros(m,m); r2(1:m*(N-1),:)]'; % Zr1'
74temp1b=reshape(temp1b,m^2,N)';
75temp1b=flipud(temp1b); % termen in omgekeerde volgorde
76
77dim=2*2^ceil(log2(size(temp1t,1)));
78temp1t=fft(temp1t,dim).';
79temp1b=fft(temp1b,dim).';
80
81% now reblock for products
82temp1t=reshape(temp1t,m,m*dim);
83temp1b=reshape(temp1b,m,m*dim).';
84
85for i=1:dim
86 temp1b((i-1)*m+1:i*m,1:m)=temp1t(1:m,(i-1)*m+1:i*m)*...
87 temp1b((i-1)*m+1:i*m,1:m);
88end
89% prepare for IFFT
90temp1b=temp1b.';
91temp1b=reshape(temp1b,m^2,dim).';
92
93temp1b=real(ifft(temp1b))';
94temp1b=reshape(temp1b,m,m*dim)';
95lushelp=N;
96for lus1=1:lushelp
97 temp2a(1:m,(lus1-1)*m+1:lus1*m)=temp1b((lushelp-2+lus1)*m+1:(lushelp-1+lus1)*m,:);
98end
99
100temp2a=temp2a';
101
102% STEP 4: (L(c1)*L(Zr1)'+L(c2)*L(Zr2)')*temp in temp1a
103
104% preparing for FFT
105temp1t=temp2a';
106clear temp2a;
107temp1t=reshape(temp1t,m^2,N)';
108temp1b=c2';
109temp1b=reshape(temp1b,m^2,N)';
110
111dim=2*2^ceil(log2(size(temp1t,1)));
112temp1t=fft(temp1t,dim).';
113temp1b=fft(temp1b,dim).';
114
115% now reblock for products
116temp1t=reshape(temp1t,m,m*dim).';
117temp1b=reshape(temp1b,m,m*dim).';
118
119for i=1:dim
120 temp1b((i-1)*m+1:i*m,1:m)=temp1b((i-1)*m+1:i*m,1:m)*...
121 temp1t((i-1)*m+1:i*m,1:m);
122end
123clear temp1t;
124% prepare for IFFT
125temp1b=temp1b.';
126temp1b=reshape(temp1b,m^2,dim).';
127
128temp1b=real(ifft(temp1b))';
129temp1b=reshape(temp1b,m,m*dim)';
130
131temp1a=temp1a+temp1b(1:m*N,:);
132clear temp1b;
133
134% STEP 5: B*temp in temp.
135
136temp=temp'; % transposing of step 1 is restored
137
138% preparing for FFT
139temp1t=temp';
140temp1t=reshape(temp1t,m^2,size(temp,1)/m)';
141temp1b=b';
142temp1b=reshape(temp1b,m^2,size(b,1)/m)';
143
144dim=2*2^ceil(log2(size(temp1t,1)));
145temp1t=fft(temp1t,dim).';
146temp1b=fft(temp1b,dim).';
147
148% now reblock for products
149temp1t=reshape(temp1t,m,m*dim).';
150temp1b=reshape(temp1b,m,m*dim).';
151
152for i=1:dim
153 temp1b((i-1)*m+1:i*m,1:m)=temp1b((i-1)*m+1:i*m,1:m)*...
154 temp1t((i-1)*m+1:i*m,1:m);
155end
156clear temp1t;
157% prepare for IFFT
158temp1b=temp1b.';
159temp1b=reshape(temp1b,m^2,dim).';
160
161temp1b=real(ifft(temp1b))';
162temp1b=reshape(temp1b,m,m*dim)';
163
164temp=temp1a+temp1b(1:size(temp,1),:);
165clear temp1b;
166clear temp1a;