-
Notifications
You must be signed in to change notification settings - Fork 0
/
rightnormA.m
33 lines (30 loc) · 1 KB
/
rightnormA.m
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
function [mps,Vmat,para,results] = rightnormA(mps,Vmat,para,results)
% adjust Bond dimension D to optimum
% sweeps to left only!
%
% Modified:
% FS 03/02/2014: - added abs() for calculation of D_change, as this prevents elimination of positive and negative contributions.
% FS 20/10/2014: - updated usage of prepare_onesite() with sweepdirection
if (para.logging == 1) && (para.adjust == 1)
results.D{para.loop-1} = para.D;
end
D_old=para.D;
N = length(mps);
for i = N:-1:2
if para.adjust==1
[mps{i}, U,para,results] = prepare_onesite_truncate(mps{i},para,i,results); % expand or truncate A in D
else
[mps{i}, U] = prepare_onesite(mps{i}, para, i);
end
mps{i-1} = contracttensors(mps{i-1}, 3, 2, U, 2, 1);
mps{i-1} = permute(mps{i-1}, [1, 3, 2]);
end
if para.adjust==1
dispif('(para.D-D_old)./para.D = ',para.logging)
disp(mat2str((para.D-D_old)./para.D,2));
para.D_change=mean(abs(para.D-D_old)./para.D);
if para.logging == 1
results.D{para.loop}=para.D;
end
end
end