Home > solver > TEBD_ops.m

TEBD_ops

PURPOSE ^

Basic Operations: Perform various basic operations for block structured elements

SYNOPSIS ^

function [Z,Z2,Z3] = TEBD_ops(X,operand,Y,alpha,X2,Y2,alpha2,X3,Y3)

DESCRIPTION ^

Basic Operations: Perform various basic operations for block structured elements
%******************************************************************
% ops:
%
%   [Z,Z2,Z3] = TEBD_ops(X,operand,Y,alpha);
%
%  INPUT:        X = a matrix or a scalar
%                    or a CELL ARRAY consisting only of matrices
%          operand = sym, transpose, triu, tril,
%                    real, imag, sqrt, abs, max, min, nnz,
%                    spdiags, ones, norm, sum, row-norm,
%                    rank1, rank1inv, inv
%                    +,  -, *, .*,  ./, .^
%     Y (optional) = a matrix or a scalar
%                    or a CELL ARRAY consisting only of matrices
%  alpha(optional) = a matrix or a scalar
%                    or a CELL ARRAY consisting only of matrices
%    X2 (optional) = a matrix or a scalar
%                    or a CELL ARRAY consisting only of matrices
%    Y2 (optional) = a matrix or a scalar
%                    or a CELL ARRAY consisting only of matrices
% alpha2(optional) = a matrix or a scalar
%                    or a CELL ARRAY consisting only of matrices
%    X3 (optional) = a matrix or a scalar
%                    or a CELL ARRAY consisting only of matrices
%    Y3 (optional) = a matrix or a scalar
%                    or a CELL ARRAY consisting only of matrices
%***********************************************************
% DSA_BD:
% Modified by C.Ortiz 3/31/2011
% 2EBD-HPE:
% Modified by C.Ortiz
% Last Modified: 6/15/2012

CROSS-REFERENCE INFORMATION ^

This function calls: This function is called by:

SOURCE CODE ^

0001 %Basic Operations: Perform various basic operations for block structured elements
0002 %%******************************************************************
0003 %% ops:
0004 %%
0005 %%   [Z,Z2,Z3] = TEBD_ops(X,operand,Y,alpha);
0006 %%
0007 %%  INPUT:        X = a matrix or a scalar
0008 %%                    or a CELL ARRAY consisting only of matrices
0009 %%          operand = sym, transpose, triu, tril,
0010 %%                    real, imag, sqrt, abs, max, min, nnz,
0011 %%                    spdiags, ones, norm, sum, row-norm,
0012 %%                    rank1, rank1inv, inv
0013 %%                    +,  -, *, .*,  ./, .^
0014 %%     Y (optional) = a matrix or a scalar
0015 %%                    or a CELL ARRAY consisting only of matrices
0016 %%  alpha(optional) = a matrix or a scalar
0017 %%                    or a CELL ARRAY consisting only of matrices
0018 %%    X2 (optional) = a matrix or a scalar
0019 %%                    or a CELL ARRAY consisting only of matrices
0020 %%    Y2 (optional) = a matrix or a scalar
0021 %%                    or a CELL ARRAY consisting only of matrices
0022 %% alpha2(optional) = a matrix or a scalar
0023 %%                    or a CELL ARRAY consisting only of matrices
0024 %%    X3 (optional) = a matrix or a scalar
0025 %%                    or a CELL ARRAY consisting only of matrices
0026 %%    Y3 (optional) = a matrix or a scalar
0027 %%                    or a CELL ARRAY consisting only of matrices
0028 %%***********************************************************
0029 %% DSA_BD:
0030 %% Modified by C.Ortiz 3/31/2011
0031 %% 2EBD-HPE:
0032 %% Modified by C.Ortiz
0033 %% Last Modified: 6/15/2012
0034 
0035 function [Z,Z2,Z3] = TEBD_ops(X,operand,Y,alpha,X2,Y2,alpha2,X3,Y3)
0036 
0037 
0038 if (nargin == 2)
0039     if strcmp(operand,'norm');
0040         if ~iscell(X);
0041             Z = full(norm(X,'fro'));%full(sqrt(sum(sum(X.*X))));
0042         else
0043             Z = 0;
0044             for p = 1:length(X); Z = Z + norm(X{p},'fro')^2;end;%sum(sum(X{p}.*X{p})); end;
0045             Z = sqrt(Z);
0046         end
0047         
0048     elseif strcmp(operand,'zeros')
0049         if ~iscell(X)
0050             Z = zeros(size(X,1),size(X,2));
0051         else
0052             Z = cell(size(X));
0053             for p = 1:length(X)
0054                 Z{p} = zeros(size(X{p},1),size(X{p},2));
0055             end
0056         end
0057     
0058         
0059     elseif strcmp(operand,'eye')
0060         if ~iscell(X)
0061             Z = eye(size(X,1),size(X,2));
0062         else
0063             Z = cell(size(X));
0064             for p = 1:length(X)
0065                 Z{p} = eye(size(X{p},1),size(X{p},2));
0066             end
0067         end
0068     elseif strcmp(operand,'ones')
0069         if ~iscell(X)
0070             Z = ones(size(X,1),size(X,2));
0071         else
0072             Z = cell(size(X));
0073             for p = 1:length(X)
0074                 Z{p} = ones(size(X{p},1),size(X{p},2));
0075             end
0076         end
0077     end
0078 elseif (nargin == 3)
0079     if strcmp(operand,'+') || strcmp(operand,'-') || ...
0080             strcmp(operand,'/') || strcmp(operand,'./') || ...
0081             strcmp(operand,'*') || strcmp(operand,'.*') || ...
0082             strcmp(operand,'.^')
0083         if (~iscell(X) && ~iscell(Y))
0084             eval(['Z = X',operand,'Y;']);
0085         elseif (iscell(X) && iscell(Y))
0086             Z = cell(size(X));
0087             for p = 1:length(X)
0088                 if (size(X{p},2) == 1) && (size(Y{p},2) == 1) && ...
0089                         (strcmp(operand,'*') || strcmp(operand,'/'))
0090                     eval(['Z{p} = X{p}.',operand,'Y{p};']);
0091                 else
0092                     eval(['Z{p} = X{p} ',operand,'Y{p};']);
0093                 end;
0094             end;
0095         elseif (iscell(X) && ~iscell(Y))
0096             Z = cell(size(X));
0097             for p = 1:length(X);
0098                 eval(['Z{p} = X{p}',operand,'Y;']);
0099             end
0100         elseif (~iscell(X) && iscell(Y))
0101             Z = cell(size(Y));
0102             for p = 1:length(Y);
0103                 eval(['Z{p} = X',operand,'Y{p};']);
0104             end
0105         end
0106     elseif strcmp(operand,'diffnorm')
0107         if ~iscell(X);
0108             Z = full(norm(X-Y,'fro'));%full(sqrt(sum(sum(X.*X))));
0109         else
0110             Z = 0;
0111             for p = 1:length(X); Z = Z + norm(X{p}-Y{p},'fro')^2;end;%sum(sum(X{p}.*X{p})); end;
0112             Z = sqrt(Z);
0113         end
0114     else
0115         error([operand,' is not available, check input arguments']);
0116     end
0117 elseif (nargin == 4)
0118     if strcmp(operand,'+') || strcmp(operand,'-')
0119         if ~iscell(X) && ~iscell(Y)
0120             eval(['Z = X',operand,'alpha*Y;']);
0121         elseif (iscell(X) && iscell(Y))
0122             Z = cell(size(X));
0123             for p = 1:length(X)
0124                 if (~iscell(X{p}) )
0125                     eval(['Z{p} = X{p}',operand,'alpha*Y{p};']);
0126                 else
0127                     Z{p} = TEBD_ops(X{p},operand,Y{p},alpha);
0128                 end
0129             end
0130         else
0131             error('X, Y are different objects');
0132         end
0133     elseif strcmp(operand,'calc2')
0134         if (~iscell(X) )
0135             Z = -X+Y+alpha;
0136         else 
0137             Z = cell(size(X));
0138             for p = 1:length(X)
0139                 Z{p} = -X{p}+Y{p}+alpha{p};
0140             end;
0141         end
0142         
0143     elseif strcmp(operand,'(X-Y)/alpha')
0144         if (~iscell(X) )
0145             Z = (X-Y)/alpha;
0146         else 
0147             Z = cell(size(X));
0148             for p = 1:length(X)
0149                 Z{p} = (X{p}-Y{p})/alpha;
0150             end;
0151         end
0152     elseif strcmp(operand,'(X+Y*alpha)/alpha')
0153         if (~iscell(X) )
0154             Z2 = (X+Y*alpha);
0155             Z = Z2/alpha;
0156         else
0157             Z = cell(size(X));
0158             Z2 = cell(size(X));
0159             for p = 1:length(X)
0160                 Z2{p} = (X{p}+Y{p}*alpha);
0161                 Z{p} = Z2{p}/alpha;
0162             end;
0163         end
0164     elseif strcmp(operand,'X-Y-alpha')
0165         if (~iscell(X) )
0166             Z = (X-Y-alpha);
0167         else
0168             Z = cell(size(X));
0169             for p = 1:length(X)
0170                 Z{p} = (X{p}-Y{p}-alpha{p});
0171             end;
0172         end
0173     else 
0174         error([operand,' is not available']);
0175     end
0176 elseif (nargin == 5)
0177     if strcmp(operand,'calc3')
0178        if (~iscell(X) )
0179             Z = X-((Y-X2)*alpha);
0180         else 
0181             Z = cell(size(X));
0182             for p = 1:length(X)
0183                 Z{p} = X{p}-((Y{p}-X2{p})*alpha);
0184             end;
0185         end 
0186     
0187     elseif strcmp(operand,'calc5')
0188        if (~iscell(X) )
0189             Z = X-((Y-X2)*alpha);
0190         else 
0191             Z = cell(size(X));
0192             for p = 1:length(X)
0193                 Z{p} = X{p}-((Y{p}-X2{p})*alpha);
0194             end;
0195         end 
0196 
0197     elseif strcmp(operand,'calc7')
0198        if (~iscell(X) )
0199             Z = (1-Y/alpha)*X+(Y/alpha)*X2;
0200         else 
0201             Z = cell(size(X));
0202             for p = 1:length(X)
0203                 Z{p} = (1-Y/alpha)*X{p}+(Y/alpha)*X2{p};
0204             end;
0205         end 
0206 
0207     elseif strcmp(operand,'X-alpha*(Y+X2)')
0208        if (~iscell(X) )
0209             Z = X-alpha*(Y+X2);
0210         else 
0211             Z = cell(size(X));
0212             for p = 1:length(X)
0213                 Z{p} = X{p}-alpha*(Y{p}+X2{p});
0214             end;
0215         end 
0216 
0217     elseif strcmp(operand,'(X-Y)/alpha+X2')
0218        if (~iscell(X) )
0219             Z = (X-Y)/alpha;
0220             Z2 = Z+X2;
0221         else 
0222             Z = cell(size(X));
0223             Z2 = cell(size(X));
0224             for p = 1:length(X)
0225                 Z{p} = (X{p}-Y{p})/alpha;
0226                 Z2{p} = Z{p}+X2{p};
0227             end;
0228         end 
0229 
0230     end
0231     
0232     
0233 elseif (nargin == 6)
0234     if strcmp(operand,'calc1')
0235         if (~iscell(X) )
0236             Z = (((X-Y)/alpha) + X2-Y2);
0237         else 
0238             Z = cell(size(X));
0239             for p = 1:length(X)
0240                 Z{p} = (((X{p}-Y{p})/alpha)+X2{p}-Y2{p});
0241             end;
0242         end
0243     elseif strcmp(operand,'calc4')
0244         if (~iscell(X) )
0245             Z = (X/Y)+(((X2-Y2)/alpha));
0246         else 
0247             Z = cell(size(X));
0248             for p = 1:length(X)
0249                 Z{p} = (X{p}/Y)+(((X2{p}-Y2{p})/alpha));
0250             end;
0251         end
0252     elseif strcmp(operand,'(X-Y)/alpha+X2-Y2')
0253        if (~iscell(X) )
0254             Z = (X-Y)/alpha+X2;
0255             Z2 = Z-Y2;
0256         else 
0257             Z = cell(size(X));
0258             Z2 = cell(size(X));
0259             for p = 1:length(X)
0260                 Z{p} = (X{p}-Y{p})/alpha++X2{p};
0261                 Z2{p} = Z{p}-Y2{p};
0262             end;
0263         end 
0264     end
0265 elseif (nargin == 7)
0266     if strcmp(operand,'calc6')
0267         if (~iscell(X) )
0268             Z = ((X*(1-Y/alpha))+((X2*Y/alpha)-(Y2*alpha2)));
0269         else
0270             Z = cell(size(X));
0271             for p = 1:length(X)
0272                 Z{p} = ((X{p}*(1-Y/alpha))+((X2{p}*Y/alpha)-(Y2{p}*alpha2)));
0273             end;
0274         end
0275     elseif strcmp(operand,'[(X-Y)/alpha]/alpha2-X2-Y2')
0276         if (~iscell(X) )
0277             Z = (X-Y)/alpha;
0278             Z2 = Z/alpha2;
0279             Z3 = Z2-X2-Y2;
0280         else
0281             Z = cell(size(X));
0282             Z2 = cell(size(X));
0283             Z3 = cell(size(X));
0284             for p = 1:length(X)
0285                 Z{p} = (X{p}-Y{p})/alpha;
0286                 Z2{p} = Z{p}/alpha2;
0287                 Z3{p} = Z2{p}-X2{p}-Y2{p};
0288             end;
0289         end
0290     end
0291 elseif (nargin == 9)
0292     if strcmp(operand,'[(X-Y)/alpha +(X2-Y2)*alpha2]/alpha2-X3-Y3')
0293        if (~iscell(X) )
0294             Z = (X-Y)/alpha +(X2-Y2)*alpha2;
0295             Z2 = Z/alpha2;
0296             Z3 = Z2-X3-Y3;
0297         else 
0298             Z = cell(size(X));
0299             Z2 = cell(size(X));
0300             Z3 = cell(size(X));
0301             for p = 1:length(X)
0302                 Z{p} = (X{p}-Y{p})/alpha +(X2{p}-Y2{p})*alpha2;
0303                 Z2{p} = Z{p}/alpha2;
0304                 Z3{p} = Z2{p}-X3{p}-Y3{p};
0305             end;
0306         end 
0307 
0308     end
0309 end
0310 %%******************************************************************

Generated on Tue 06-Aug-2013 17:07:59 by m2html © 2005