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
function status = linesearch_for_energy_decrease(M, b, Jp, z, delta, Eg, energy_type, status)
    delta_norm = norm(delta);
    dot_delta_g = dot(delta, Eg);
    delta = reshape(delta,[],3);
    E = status(2);
    E_next = E;
    ls = 1;
    ls_alpha = 0.2;
    ls_beta = 0.5;
    while ls * delta_norm > 1e-6
        z_next = z - ls*delta;
        Eq_next = trace(z_next'*M*z_next) - 2 * dot(z_next(:),b(:));
        J_next = z_next' * Jp;
        [~,s,~] = svdJacobian(J_next);
        
        
        switch energy_type
            case 1
                s = s(:);
                Ed_next = sum(s.^2 + s.^(-2) - 2) / size(Jp,2) * 3;
            case 2
                s = s(:);
                Ed_next = sum((s-1).^2) / size(Jp,2) * 3;
        end
        E_next = Eq_next + Ed_next;
        if E_next < E - ls * ls_alpha * dot_delta_g
            break;
        end
        ls = ls * ls_beta;
    end 
    status(1) = ls;
    status(3) = E_next;
    status(8) = delta_norm;
    if energy_type == 2
        status(4) = max(s);
        status(6) = min(s);        
    end
end