function [U,V,W] = wire3Field(r, M, B_0, X, Y, supMagParams)
%%% Calcul du champ de fuite d'un fil en tout point de l'espace
% Aimantation sous forme de vortex avec un certain décalage de dans la
% direction de M
%
%
% $Revision: 14 $
% $Author: lenertz $
% $Date: 2015-07-27 18:22:01 +0200 (lun., 27 juil. 2015) $

    %mu_0  = 4 * pi * 1e-7;
    %global mu_wire
    
    %misalignmentRatio = sin(0.5*pi/180); 
    misalignmentRatio = 0.10; 
    
    %H = M / mu_0;
    % Champ mag forcément selon x
    B_abs = -norm(M);
    % fonction de rotation du reférenciel à rajouter
    %angle = atan2(norm(cross([1,0,0],H)),dot([1,0,0],H));
    
    % if x is given as an array and not y or the opposit
    if numel(X) ~= numel(Y); 
        if numel(Y) == 1;
            y = Y;
            Y = X;
            Y(:) = y;
        elseif numel(X) == 1;
            x = X;
            X = Y;
            X(:) = x; 
        end
    end
    
    % initialisation des matrices de champs
    U = X;
    U(:)=0;
    V = U;
    W = U;
    U_temp = U;
    V_temp = U;
    
    % On cherche les positions dans et hors du fil
    position_r = (X.^2 + Y.^2).^(1/2);
    in_position = find(position_r <= r);
    out_position = find(position_r > r);
    
    % Dans le fil
    U(in_position) = M(1)*(1-misalignmentRatio) - misalignmentRatio * B_abs .* Y(in_position) ./ position_r(in_position);
    V(in_position) = M(2)*(1-misalignmentRatio) + misalignmentRatio * B_abs .* X(in_position) ./ position_r(in_position);
    W(in_position) = M(3)*(1-misalignmentRatio);

    % Hors du fil
    % On calcule d'abord dans un repère ou le champ Mxy est selon x
    U_temp(out_position) = (X(out_position).^2 - Y(out_position).^2) .* norm(M(1:2))* misalignmentRatio * (r^2) ./ ((X(out_position).^2 + Y(out_position).^2).^2);
    V_temp(out_position) = 2 .* X(out_position) .* Y(out_position) .* norm(M(1:2)) * misalignmentRatio * (r^2) ./ ((X(out_position).^2 + Y(out_position).^2).^2);
    % puis on procède à un changement de base
    theta = atan2(M(2),M(1)); % angle entre le champ M dans le plan xy avec l'axe x
    U(out_position) = cos(theta) * U_temp(out_position) + sin(theta) * V_temp(out_position);
    V(out_position) = cos(theta) * V_temp(out_position) - sin(theta) * U_temp(out_position); 
    
    U(in_position) = -B_abs .* Y(in_position) ./ position_r(in_position);
    V(in_position) = B_abs .* X(in_position) ./ position_r(in_position);
    W(in_position) = 0;
    
    % On ajoute le champ appliqué
    U = U + B_0(1);
    V = V + B_0(2);
    W = W + B_0(3);
end