| [out,maxmxinputs,maxmxinputs0,needed_interfaces,libraries,suborfun]=matlab2fmex(filename_al,tempflagin_al,varargin)
|
function [out,maxmxinputs,maxmxinputs0,needed_interfaces,libraries,suborfun]=matlab2fmex(filename_al,tempflagin_al,varargin)
% matlab2fmex(filename,tempflag,varargin)
% There are 2 steps required to convert a Matlab m-file to a mex-able
%Fortran90 file using matlab2fmex.
%
% 1) matlab2fmex needs to find a *.mat data file which contains a
%typical workspace generated by the function which is being converted.
%This is easily constructed by inserting a keyboard command at the end
%of the *.m file, then, at the k>> promt simply type "save *" where *
%is the name of the *.m file without the .m extension.
% matlab2fmex uses this workspace to make decisions which depend on
%the variables in the *.m file, such as real or complex. Accordingly, if
%an input variable may be complex, it is best to submit a complex input
%when the workspace is saved so that the *.f90 file will be as robust as
%possible.
% When converting multiple *.m files (a main function and helper
%functions), a separate *.mat file must exist for each function.
% 2) The second step is to call matlab2fmex. The format is the following:
%matlab2fmex(filename,[options],{'first' 0or1},{'second' 0or1},...,
% ['local',{'first_l' 'input_l'},...]);
%
%After the filename to be converted (with no .m extension), there must
%be a cell such as {'first' 0or1} for _each_ output variable. Each output
%variable (in order) is the same size as as the input variable 'first'
%(input as a string). This tells the converter what size to make the output
%as a function of the input. If your function does not have an input
%function which is the same size as a given output, use a dummy input
%variable specified with zeros(m,n).
% The second part of each cell specifies whether that output should
%be declared complex (1) or not (0). If there is a chance it may become
%complex, it is best to specify it as a 1. For multiple function conversion,
%input a cell array for each output variable in order: e.g.
%{{'first_of_fun1' 0or1} {'first_of_fun2' 0or1}}
%then a comma and the next output variable (if any). For an complete example,
%see below.
%
% Optionally, the user may specify the size of the local variables to
%be the same size as any of the input variables. After the cell
%specifications for the output variables are given, the string 'local'
%is followed by a cell array specifying first which local variable you
%want to assign, in this case 'first_l', and then by the input variable
%name this local variable should be the same size as; in this case
%'input_l'. See the EXAMPLES section for more information. If the size
%of the local variables is not specified in this way, the converter
%looks for input variables which happen to be the same size as each
%local variables. That local variable is then assigned the size of that
%input variable. Upon failing to find an input variable wiht the same
%size, the converted declares that local variable to be the _static_
%size it is is the saved workspace.
%
% Some example calls are:
%matlab2fmex('myfunc');
%matlab2fmex('fibocon');
%matlab2fmex('gasket');
%etc.
declare_globals
filename_all=filename_al;
if nargin>1,tempflagin_all=tempflagin_al;else tempflagin_al=[]; tempflagin_all=[];end
%There are a few parameters which the user can adjust as well:
%These can be input as flags in the function call.
% The default behavior is below:
%Converter Parameters
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
want_kb=0;%want_kb --> 0 Do not stop after each step, compile file. (default)
%--> 1 Enter Matlab keyboard after each step.(for debugging)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
want_ss=0;%want_ss%-->-1 No subscript vectorization. (for mostly scalar operations)
%--> 0 Relaxed subscript interpreting. (default)
%--> 1 Stricter subscripting (slower, for variable subscripts) obsolete -- not used
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
want_op=0;%want_op%-->-1 No operator replacement (use when want_ss=-1)
%--> 0 Don't replace +, -, or scalar * and / operators. (default)
%--> 1 Replace all math operators with interface calls. (slower)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
want_fb=1;%want_fb --> 0 Don't display progress throughout compilation. (default)
%--> 1 Display feedback information. (potentially annoying)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
want_ct=1;%want_ct --> 0 Don't mex *.f90 upon completion.
%--> 1 mex the resulting *.f90 file. (default)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
want_0=0;%want_0 --> 0 Don't zero all vars (default
%--> 1 Set all vars = 0 before computational routine
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
want_br=1;%want_br --> 0 Use (/ and /) instead of [ and ] (all Fortran 90's)
%--> 1 Use [ and ] (Some Fortran 90's)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
want_sb=0;%want_sb --> 0 Convert as a full mex-file
%--> 1 Convert as a subroutine (sets want_ct to 0).
%--> 2 Convert as a function (one output, sets want_ct to 0).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
want_in=0;%want_in --> 0 Don't allow local vars to be integers
%--> 1 Allow local vars to be integers (default)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
want_cs=0;%want_cs --> 0 Assume all sqrt's are of real, positive numbers
%--> 1 Assume all sqrt's are complex
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%See README file for further documentation
want_al=1; %if 1, then do allocatable local variables
%%%try
% We need to parse varargin for output specs, possible local and input specs
if nargin<2, tempflagin_all=[];end
[vararginout,vararginin,vararginlocal]=parsevarargin(varargin);
if iscell(filename_al), filename=filename_al{1}; else filename=filename_al; end
if iscell(tempflagin_all), tempflagin=tempflagin_all{1}; else tempflagin=tempflagin_all; end
vararginout_all=vararginout;
if length(vararginout)>0
if iscell(vararginout{1}{1})
for i=1:size(vararginout_all,2)
if iscell(vararginout{i}{1})
vararginout{i}=vararginout_all{i}{1};
else
vararginout{i}=vararginout_all{i};
end
end
end
end
if iscell(filename_al)
suborfun=ones(max(size(filename_al)),1);
suborfun(1)=0;
else
if want_sb~=0
suborfun=want_sb-1;
else
suborfun=0;
end
end
if exist([filename,'.mat'],'file')
cw=load(filename);
else
error(['Couldn''t find ',filename,'.mat workspace file!']);
end
if ~isempty(tempflagin)
for i=1:length(tempflagin)
switch i
case 1
want_kb=tempflagin(1);
case 2
want_ss=tempflagin(2);
case 3
want_op=tempflagin(3);
case 4
want_fb=tempflagin(4);
case 5
want_ct=tempflagin(5);
case 6
want_0=tempflagin(6);
case 7
want_br=tempflagin(7);
case 8
want_sb=tempflagin(8);
if want_sb~=0
disp('Making subroutine');
want_ct=0;
end
case 9
want_in=tempflagin(9);
case 10
want_cs=tempflagin(10);
end
end
end
for i=length(tempflagin)+1:11
switch i
case 1
tempflagin(1)=want_kb;
case 2
tempflagin(2)=want_ss;
case 3
tempflagin(3)=want_op;
case 4
tempflagin(4)=want_fb;
case 5
tempflagin(5)=want_ct;
case 6
tempflagin(6)=want_0;
case 7
tempflagin(7)=want_br;
case 8
tempflagin(8)=want_sb;
case 9
tempflagin(9)=want_in;
case 10
tempflagin(10)=want_cs;
end
end
if want_sb==0
disp(['Converting --- ',filename,'.m ==> ',filename,'.f90 ==> ',filename,'.mex']);
else
disp(['Converting --- ',filename,'.m ==(added to)==> mexfunctions.f90']);
end
%%%catch
%%% error(['Couldn''t load the workspace file for ',filename,'.m. Exiting...'])
%%%end
% Load keywords and function words.
keywords={'case';'select';'else';'elseif';'for';'function';'if';'otherwise';'profile';'switch';'while';'call';'then';'and';'or';'not';'inf';'endif';'do';'enddo';'exit'};
keywordsbegin={'for';'while';'switch';'if';'do';'elseif';'case'};
operators={'.''' 'mxtr';'''' 'mxctr';'.^' 'mxdpow';'^' 'mxpow';'*' 'matmul';'/' 'mxdiv';'.*' 'mxdmult';'./' 'mxddiv';'+' 'mxplus';'-' 'mxsub'};
logicalops={'~' '.not.';'&' '.and.';'|' '.or.'};
loglist={'~';'==',;'&';'|';'>';'<';'xor';'any';'all';'isnan';'isinf';'isfinite'};
mxwords={'mxGetM';'mxGetN';'mxCreateFull';'mxGetPr';'mxGetPi';'mxSetM';'mxSetN';'mexCallMATLAB';'mxs';'mxi';'mlcall';'mlcall0';'%val';'real';'aimag';'cmplx';'rhs';'lhs';'allocate';'deallocate';'num2str';'mxTR1';'mxTR2';'mxTR3';'mxTR4';'mxTR5';'mxTR6';'mxTR7';'mxTR8';'mxTR9';'mxTC1';'mxTC2';'mxTC3';'mxTC4';'mxTC5';'mxTC6';'mxTC7';'mxTC8';'mxTC9';'mxTI1';'mxTI2';'mxTI3';'mxTI4';'mxTI5';'mxTI6';'mxTI7';'mxTI8';'mxTI9'};
for i=1:size(operators,1), mxwords{size(mxwords,1)+1}=operators{i,2}; end
if ~want_sb,needed_interfaces=cell(1,2);libraries=' ';end
%if you do put libraries in, make sure -lslatec is before -llapack
funwords=getfunwordsmlonly;
mexoperatorinterfaces=getmexoperators;mexfunctions='';
r=char(10);b=char(8);needpi=0;needeps=0;maxTRC=[0 0 0];
typs{1}={'r';'c';'i';'l'}; %General 2-D arrays
typs{3}={'c';'t';'x';'d';'m'}; %Complex
typs{4}={'w';'x';'y';'z'}; %1-D arrays in fortran
typs{5}={'s';'t';'u';'v'}; %scalar
typs{6}={'r';'s';'w';'e';'n'}; %real
typs{7}={'i';'u';'y';'f';'o'}; %integer
typs{8}={'l';'v';'z';'g';'p'}; %logical
typs{9}={'d';'e';'f';'g'}; %2-D row vectors
typs{10}={'m';'n';'o';'p'}; %2-D column vectors
typs{11}={typs{1}{:},typs{9}{:},typs{10}{:}}; %Any 2-D array
typs{12}={typs{11}{:},typs{4}{:}}; %non scalar
typs{2}={typs{6}{:},typs{3}{:}}; %All but integers and logicals
typs{13}={'c';'d';'m'}; %2-D complex
typs{14}={'r';'e';'n'}; %2-D real
typs{15}={'i';'f';'o'}; %2-D integer
typs{16}={'l';'g';'p'}; %2-D logical
typs{17}={'.';'e';'E';'d';'D'}; %2-D logical
fortranfunwords={'dble';'aimag';'do';'enddo';'endif';'int';'nint';'iji';'conjg';'minval';'minloc';'maxval';'maxloc';'spread';'shape';'ubound';'product'};
make_words={'dot1f','dot2f','sizef','lengthf','sumf','zerosf','onesf','minf','maxf','prodf','reshapef','repmatf','linspacef','diagf','normf','eigf','svdf','besseljf','besselyf','besselif','besselkf','besselhf','airyf','gammaf','gammalnf','gammaincf','medianf','meanf','acosf','acoshf','acotf','acothf','acscf','acschf','asecf','asechf','asinf','asinhf','atanf','atanhf','cothf','cschf','sechf','findf','fliplrf','flipudf','isnanf','ss2inf','isinff'};
make_words2={'dot1','dot2','length','zeros','ones','prod','repmat','linspace','diag','norm','eig','svd','besselj','bessely','besseli','besselk','besselh','airy','gamma','gammaln','gammainc','median','mean','acosh','acot','acoth','acsc','acsch','asec','asech','asinh','atanh','coth','csch','sech','find','fliplr','flipud','ss2in','isinf'};
intrinsics={'abs','acos','aimag','aint','all','anint','any','asin','atan','atan2','ceiling','cmplx','conjg','cos','cosh','cotan','count','dble','dot_product','exit','exp','floor','huge','int','isnan','log','log10','logical','matmul','max','maxloc','maxval','min','minloc','minval','mod','modulo','nint','not','pack','product','real','reshape','shape','sign','sin','sinh','size','spread','sqrt','sum','tan','tanh','tiny','transpose','ubound','unpack','mxs','mxi','dot_product'};
barr={'c','r','i','l';'x','w','y','z';'t','s','u','v'}';
barr2={'d','e','f','g';'m','n','o','p'}';
alpha=isalpha; zzz=0;
ticker={'m','a','t','l','a','b','2','f','m','e','x','.','m'};
explicitinterfaces={'acosh','acoth','acsch','asech','asinh','atanh','coth','csch','log2','rem','sech','find'};
% First read the function into funstr.
filenamem=[filename,'.m'];
funstr=cell(1,1);
if exist(filenamem)==2
fid=fopen(filenamem); filestr=fscanf(fid,'%c'); fclose(fid);
if ~strcmp(filestr(length(filestr)),r), filestr=[filestr,r]; end
rets=findstr(r,filestr);
rets=[0 rets];
temp=findstr(';',filestr);
for i=1:length(temp)
temp3=rets(rets>temp(i));temp3=temp3(1);
goonimag=rets(rets<temp(i));goonimag=goonimag(length(goonimag));
if length(find(~isspace(filestr(temp(i)+1:temp3-1))))>0
goon(1)=length(findstr('[',filestr(temp(i)+1:temp3-1)));
goon(2)=length(findstr(']',filestr(temp(i)+1:temp3-1)));
if ~(goon(1)<goon(2))
if length(findstr('%',filestr(goonimag+1:temp(i)-1)))==0
filestr(temp(i))=r;
end
end
end
end
rets=findstr(r,filestr);
rets=[0 rets];
count=1;
temp2='';
for i=1:length(rets)-1
tempstr=[temp2,filestr(1+rets(i):rets(i+1)-1)];
if length(find(~isspace(tempstr)))>0
temp3=find(~isspace(tempstr));
if ((tempstr(1)~=r)&(tempstr(temp3(1))~='%'))
goon=1;
if length(findstr('...',tempstr))>0, goon=0; end
temp3=tempstr(~isspace(tempstr));
if ((strncmp(temp3,'disp',4))|(strncmp(temp3,'error',5))), goon=1; end
if goon
funstr{count}=tempstr;
temp1=findstr('%',funstr{count});
if ~isempty(temp1)
funstr{count}=funstr{count}(1:temp1(1)-1);
end
temp2='';
count=count+1;
else
temp=findstr('...',tempstr);temp=temp(1);
temp2=[tempstr(1:(temp-1))];
end
end
end
end
else
error(['I can''t find the file ',filenamem,'...']);
end
funstr=funstr';
s=size(funstr,1);
if want_kb|want_fb
disp([r,'Original:']);
if s<20
showall(funstr)
else
showall(funstr(1:20),1);
disp([' . . .'])
end
disp(' ')
end
if want_kb,disp('Just read the function in'); showall(funstr), keyboard, end
% Deblank. Find the words and numbers with start and endpoints
for i=1:s
%Misc tasks
% ------------ Insert -- RJHP 27Nov01 -----------------
funstr{i}(findstr(char(13),funstr{i}))=[]; %Remove CRs
% -----------------------------------------------------
%Deblank front and back
funstr{i}=deblank(funstr{i});
funstr{i}=fliplr(deblank(fliplr(funstr{i})));
%Ensure semilcolon at end
if funstr{i}(end)~=';', funstr{i}=[funstr{i} ';']; end
end
updatefunstr;
% OK;now find the inputs, outputs, and other vars to the function
%Inputs first.
inoutother=cell(4,1);
temp=find(funstr{1}=='(');
if ~isempty(temp)
dummy=find(funstrwords_b{1}>temp(1));
for j=1:length(dummy), inoutother{1}(j)=funstrwords{1}(dummy(j)); end
else
error('you have to have some inputs');
end
inoutother{1}=inoutother{1}';
%Outputs next
temp=find(funstr{1}=='=');
if ~isempty(temp)
dummy=find(funstrwords_b{1}<temp(1));
for j=2:length(dummy), inoutother{2}(j-1)=funstrwords{1}(dummy(j)); end
else
error('you have to have some outputs');
end
inoutother{2}=inoutother{2}';
%Now other vars from cw
temp=fieldnames(cw);count=1;
for i=1:length(temp)
if ((~isin(temp(i),inoutother{1}))&(~isin(temp(i),inoutother{2})))
inoutother{3}(count)=temp(i);
count=count+1;
end
end
inoutother{3}=inoutother{3}';
%And other things I don't want to be counted as regular vars
inoutother{4}(1)={'lhs'};
inoutother{4}(2)={'rhs'};
inoutother{4}(3)={'nlhs'};
inoutother{4}(4)={'nrhs'};
count=5;
for i=1:length(inoutother{1})
if ~isreal(getfield(cw,inoutother{1}{i}))
inoutother{4}(count)={[inoutother{1}{i},'_r']};
inoutother{4}(count+1)={[inoutother{1}{i},'_i']};
count=count+2;
end
end
for i=1:length(inoutother{2})
if ~isreal(getfield(cw,inoutother{2}{i}))
inoutother{4}(count)={[inoutother{2}{i},'_r']};
inoutother{4}(count+1)={[inoutother{2}{i},'_i']};
count=count+2;
end
end
inoutother{4}=inoutother{4}';
if length(inoutother{3})>0
inoutother3={inoutother{1}{:},inoutother{2}{:},inoutother{3}{:}};
else
inoutother3={inoutother{1}{:},inoutother{2}{:}};
end
%we need to decide whether the local vars are complex, real, or integer.
localvartype=cell(length(inoutother{3}),1);
for i=1:length(inoutother{3})
if ~isreal(getfield(cw,inoutother{3}{i}))
localvartype{i}='complex';
elseif islogical(getfield(cw,inoutother{3}{i}))
localvartype{i}='logical';
else
if nnz(getfield(cw,inoutother{3}{i})~=round(getfield(cw,inoutother{3}{i})))>0
localvartype{i}='real';
else
if want_in==1
localvartype{i}='integer';
else
localvartype{i}='real';
end
end
end
end
%Let's decide whether this routine is recursive or not.
recursive=0;
for i=1:s
temp=strcmp(filename,funstrwords{i});
if any(temp)&~strcmp(funstrwords{i}{1},'function')
temp1=findstr('%',funstr{i});
if isempty(temp1)
recursive=1;
else
temp2=find(temp);
if funstrwords_b{i}(temp2(1))<temp1(1)
recursive=1;
end
end
end
end
% So, now we start the macros to changeover.
tickercount=1;pticker=0;
%First, get rid of the first line of function definition.
for i=1:s-1
funstr{i}=funstr{i+1};
end
funstr={funstr{1:s-1}}';
updatefunstr;
%Save all the original stuff for shape determination later.
funstr1=funstr;
funstrnumbers1=funstrnumbers;
funstrnumbers_b1=funstrnumbers_b;funstrnumbers_e1=funstrnumbers_e;
funstrwords1=funstrwords;
funstrwords_b1=funstrwords_b;funstrwords_e1=funstrwords_e;
%Put a decimal point on many numbers which have none.
%try
fprintf(1,' ');pticker=pticker+1;
if want_fb&(~want_kb),fprintf(1,' putting decimal points etc. ....................... 1');end
count=1;gotto=1;gotto2=1;
while count==1
count=0;
for i=gotto:s
fprintf(1,b);fprintf(1,ticker{tickercount});
tickercount=tickercount+1;if tickercount>11, tickercount=1; end
if i==s, fprintf(1,b);fprintf(1,ticker{pticker}); end
fid=0;
for j=gotto2:length(funstrnumbers{i})
if count==0
goon=1;
temp1=inmlcall(i,funstrnumbers_b{i}(j),funstr,funstrwords,funstrwords_b);
[temp2,howmany2,subscripts2,centercomma2,parens2]=inwhichlast(i,funstrnumbers_b{i}(j));
temp3=0;
if temp2==1 %In bracket last
[temp3,howmany,subscripts,centercomma,parens,foo]=inwhichlast(i,parens2(1));
if ~(parens(1)==fid)
tempstr=makeMATLABcallstring(1,{funstr{i}(parens2(1):parens2(2))},[],parens2,i,j);
fid=parens(1);
end
if temp3==2 %In subscript
;%don't add if is a bracket in a subscript
goon=0;
end
if any(strcmp(tempstr(1),typs{7})) % We have a bracketed expression full of integers
goon=0;
end
end
if goon|temp1
if temp2==5|temp2==6|temp3==5|temp3==6 %In intrinsics last
temp5=find(funstrwords_b{i}<parens2(1));
if ~isempty(temp5)
temp5=temp5(end);
if temp3==5
temp5=foo;
end
if any(strcmp(funstrwords{i}{temp5},{'sum';'reshape';'min';'max';'size';'prod';'mean';'dot'})) %Don't need them on dimensions for some
[howmany3,subscripts3,centercomma3,parens3]=hassubscript(i,temp5);
if howmany3>1
if funstrnumbers_b{i}(j)>centercomma3(1) & funstrnumbers_b{i}(j)<parens3(2)
goon=0;
if length(funstrnumbers{i}{j})>1
if strcmp(funstrnumbers{i}{j}(end-1:end),'.0') %Remove .0 from these places
funstr{i}=[funstr{i}(1:funstrnumbers_e{i}(j)-2),funstr{i}((funstrnumbers_e{i}(j)+1):(end))];
updatefunstr(i); count=1;gotto=i;gotto2=j+1;
end
end
end
end
end
end
end
%%% if any(strcmp(funstrnumbers{i},'1.0'))
%%% funstr{i},goon,j,temp2,temp1,kb
%%% end
if goon
if temp2==0|temp2==1|temp2==4|temp2==5|temp2==6|temp1
if ~any(strcmp({'for';'while'},funstrwords{i}{1}))
%%% if length(find(findstr(funstrnumbers{i}{j},'.')))==0
%funstr{i},funstrnumbers{i}{j},intersect([typs{17}{:}],funstrnumbers{i}{j})
if length(intersect([typs{17}{:}],funstrnumbers{i}{j}))==0
funstr{i}=[funstr{i}(1:(funstrnumbers_e{i}(j))),'.0',funstr{i}((funstrnumbers_e{i}(j)+1):(end))];
updatefunstr(i); count=1;gotto=i;gotto2=j+1;
%funstr{i},kb
end
%%% end
end
end
end
end
%%% if any(strcmp(funstrwords{i},'reshape'))
%%% funstr{i},tempstr,'ddddddddddddddd4',kb
%%% end
end
if count==1, break; end
end
if count==0, gotto2=1; end
if count==1, break; end
end
end
if want_kb,disp('finished with putting decimal points etc.'),disp(r),showall(funstr),disp(r),keyboard,end
if want_fb&(~want_kb),fprintf(1,' finished \n');end
%%%catch
%%% disp(r);disp(funstr{i});disp(['line number ',num2str(i)]);disp(lasterr);disp(r);
%%% disp('Conversion error in preceeding line.');
%%% disp('Try to continue? [y,<return>]');
%%% tempans=input('or enter keyboard mode? [n,k]','s');
%%% if ~isempty(tempans), if ((strcmp(tempans,'n'))|(strcmp(tempans,'k'))), keyboard, end, end
%%%end
%Changed bracketed expressions
%try
fprintf(1,' ');pticker=pticker+1;
if want_fb&(~want_kb),fprintf(1,' fixing bracketed assignments ...................... 1');end
count=1;gotto=1;
while count==1
count=0;
for i=gotto:s
fprintf(1,b);fprintf(1,ticker{tickercount});
tickercount=tickercount+1;if tickercount>11, tickercount=1; end
if i==s, fprintf(1,b);fprintf(1,ticker{pticker}); end
if count==0;
temp=findstr('[',funstr{i}); fid=0;
if ~isempty(temp)
for k=1:length(temp)
if count==0
temp=findstr('[',funstr{i}); temp=temp(k);
temp1=findrights(temp,funstr{i});
goon=find(funstrwords_b{i}(funstrwords_b{i}<temp));
goonimag=0;
% funstr{i},'stoppppppppp222222',kb
if isempty(goon)
goonimag=0;
% funstr{i},'stoppppppppp',kb
else
if temp>4
goonimag=(~(strcmp('spread(',funstr{i}(temp-4:temp-1)))&(length(find(strcmpi('int',funstrwords{i}{goon(length(goon))})))==0)&(length(find(strcmp('reshape',funstrwords{i}{goon(length(goon))})))==0)&(length(find(strcmp('disp',funstrwords{i}{1})))==0));
else
goonimag=((length(find(strcmpi('int',funstrwords{i}{goon(end)})))==0)&(length(find(strcmp('reshape',funstrwords{i}{goon(end)})))==0)&(length(find(strcmp('disp',funstrwords{i}{1})))==0));
end
end
if (goonimag)
temp2=1;%temp2=commas/spaces
temp3=1;%temp3=m-size
for j=(temp+1):(temp1-1)
if strcmp(funstr{i}(j),' ')
if ((~insubscript(i,temp))|(inwhichlast(i,j)==1))
if ((~isspace(funstr{i}(j-1)))&(~strcmp(funstr{i}(j-1),','))&(~strcmp(funstr{i}(j+1),','))&(~strcmp(funstr{i}(j-1),'['))&(~strcmp(funstr{i}(j+1),']')))
temp2=temp2+1;
funstr{i}(j)=',';
end
end
elseif strcmp(funstr{i}(j),',')
if ~insubscript(i,j,temp,temp1)
temp2=temp2+1;
end
end
if strcmp(funstr{i}(j),';')
fid=1;
temp2=1;
temp3=temp3+1;
funstr{i}(j)=',';
end
end
if fid
if ~insubscript(i,temp)
funstr{i}=[funstr{i}(1:(temp-1)),'reshape(',funstr{i}(temp:temp1),',[',num2str(temp2),',',num2str(temp3),']).''',funstr{i}((temp1+1):end)];count=1;gotto=i;
else
funstr{i}=[funstr{i}(1:(temp-1)),'[transpose(reshape(',funstr{i}(temp:temp1),',[',num2str(temp2),',',num2str(temp3),']))]',funstr{i}((temp1+1):end)];count=1;gotto=i;
end
else
[outflag,howmany,subscripts,centercomma,parens]=inwhichlast(i,temp);
%funstr{i},kb
tempstr=0;
if outflag==5
temp4=find(~isspace(funstr{i}));
temp4=temp4(temp4<parens(1)); temp4=temp4(end);
temp5=find(funstrwords_e{i}==temp4(end));
if ~isempty(temp5)
if any(strcmp(funstrwords{i}{temp5},{'logical'}))
tempstr=1;
end
end
end
%if ((~insubscript(i,temp))&(~inbracket(i,temp,funstr))&~(strcmp('[',funstr{i}(1))))
if outflag==0|tempstr
if ((strcmp(funstrwords{i}{1},'disp'))|(strcmp(funstrwords{i}{1},'for'))|(strcmp(funstrwords{i}{1},'call')))
funstr{i}=[funstr{i}(1:(temp-1)),funstr{i}(temp+1:temp1-1),funstr{i}((temp1+1):end)];count=1;gotto=i;
else
if ~any(':'==funstr{i}(temp:temp1))
%funstr{i}
funstr{i}=[funstr{i}(1:(temp-1)),'spread(',funstr{i}(temp:temp1),',1,1)',funstr{i}((temp1+1):end)];count=1;gotto=i;
%'[[[[[[[[[[[[[[[',funstr{i},kb
end
end
else
%Do nothing
end
end
if count==1
updatefunstr(i);
end
end
end
end
end
end
end
end
if want_kb,disp('finished fixing bracketed assignments'),disp(r),showall(funstr),disp(r),keyboard,end
if want_fb&(~want_kb),fprintf(1,' finished \n');end
%%%catch
%%% disp(r);disp(funstr{i});disp(['line number ',num2str(i)]);disp(lasterr);disp(r);
%%% disp('Conversion error in preceeding line.');
%%% disp('Try to continue? [y,<return>]');
%%% tempans=input('or enter keyboard mode? [n,k]','s');
%%% if ~isempty(tempans), if ((strcmp(tempans,'n'))|(strcmp(tempans,'k'))), keyboard, end, end
%%%end
%Change things about the math (matrix mult, /, .*, +, etc.), in cell 'operators'.
%try
fprintf(1,' ');pticker=pticker+1;
if want_fb&(~want_kb),fprintf(1,' operator changeover ............................... 1');end
for j=1:length(operators)
gotto=1;count=1;
while count==1
count=0;
for i=gotto:s
fprintf(1,b);fprintf(1,ticker{tickercount});
tickercount=tickercount+1;if tickercount>11, tickercount=1; end
if i==s, fprintf(1,b);fprintf(1,ticker{pticker}); end
dummy=findstr(operators{j,1},funstr{i});
if ~isempty(dummy)
for k=1:length(dummy)
temp=dummy(k);
if ~strcmp(funstrwords{i}{1},'error')&~strcmp(funstrwords{i}{1},'print')
goon=1;
if strcmp(funstrwords{i}{1},'disp')
temp1=find(''''==funstr{i});
if ~isempty(temp1)
if ((temp==temp1(1))|(temp==temp1(end)))
goon=0;
end
end
end
if strcmp(funstr{i}(temp-1),'.'), goon=0; end
if strcmp(funstr{i}(temp-1),'*'), goon=0; end
if strcmp(funstr{i}(temp+length(operators{j,1})),'*')&strcmp('*',operators{j,1})
goon=0;
end
if goon
goonimag=0;
if ((want_op==1)|(~((strcmp(operators{j,1},'+'))|(strcmp(operators{j,1},'-')))))
[temp1,temp2]=changeoperator(i,operators{j,1},temp);
if temp1
updatefunstr(i);
end
if ((want_op==1)|(length(temp2{1}>0))|(temp1==1))
updatefunstr(i);
% if tempflag==0
if length(temp2{1}>0)
if length(findstr(temp2{1},mexoperatorinterfaces{1}))==0
mexoperatorinterfaces{1}=[mexoperatorinterfaces{1} temp2{1}];
mexoperatorinterfaces{2}=[mexoperatorinterfaces{2} temp2{2}];
end
end
% end
count=1;gotto=i;
end
end
end
end
if count~=0
break
end
end
end
if count~=0
break
end
end
end
end
if want_kb,disp('finished with operator changeover'),disp(r),showall(funstr),disp(r),keyboard,end
if want_fb&(~want_kb),fprintf(1,' finished \n');end
%%%catch
%%% disp(r);disp(funstr{i});disp(['line number ',num2str(i)]);disp(lasterr);disp(r);
%%% disp('Conversion error in preceeding line.');
%%% disp('Try to continue? [y,<return>]');
%%% tempans=input('or enter keyboard mode? [n,k]','s');
%%% if ~isempty(tempans), if ((strcmp(tempans,'n'))|(strcmp(tempans,'k'))), keyboard, end, end
%%%end
%Fix subscripts for in/out vars because everything 2-dim now (except in brackets).
%try
fprintf(1,' ');pticker=pticker+1;
if want_fb&(~want_kb),fprintf(1,' making 2 subscripts ............................... 1');end
%First make sure everythings has 2 subscripts
count=1;gotto=1;gotto2=0;
while count==1
count=0;
for i=gotto:s
fprintf(1,b);fprintf(1,ticker{tickercount});
tickercount=tickercount+1;if tickercount>11, tickercount=1; end
if i==s, fprintf(1,b);fprintf(1,ticker{pticker}); end
temp3=length(funstrwords{i});
for j=(temp3-gotto2):-1:1
if ~inastring(funstrwords_b{i}(j),funstr{i})
if count==0
if (length(find(strcmp(funstrwords{i}(j),inoutother3)))>0)
[howmany,subscripts,centercomma,parens]=hassubscript(i,j);
goonimag=0;%set to be just a pack unless goonimag=>1;
temp1=findstr('=',funstr{i});
if ~isempty(temp1) %only test if there is an = sign
temp2=1;
for k=1:length(temp1)
if temp2==1
if ~insubscript(i,temp1(k))
temp2=temp1(k);break
end
end
end
if temp2==1 %No equals sign, goonimag already =0
else %Here, we have a main equals sign, is our word before or after?
if funstrwords_b{i}(j)<temp2 %Need a where statement
goonimag=1;
end
end
end
switch howmany %Number of subscripts for this var
case 0 %Do nothing
case 1
tempstr=makeMATLABcallstring(howmany,subscripts,centercomma,parens,i,j);
fid=need_ss2in(howmany,subscripts,centercomma,parens,i,j,tempstr);
temp=funstr{i}((parens(1)+1):(parens(2)-1));
%Is it before or after the main = sign?
if any(strcmp(tempstr,typs{8}))
if goonimag==0 %Pack
funstr{i}=[funstr{i}(1:(funstrwords_b{i}(j)-1)),'ss2in(',funstrwords{i}{j},',',subscripts{1},')',funstr{i}((parens(2)+1):end)];
else %where
fortranfunwords{length(fortranfunwords)+1}='where';
funstr{i}=['where(',subscripts{1},') ',funstrwords{i}{j},funstr{i}((parens(2)+1):end)];
end
updatefunstr(i);
count=1;gotto=i;gotto2=temp3-j;
else
if goonimag==0 %after main equals sign
if size(getfield(cw,funstrwords{i}{j}),1)==1 %row vector var, test for ss2in
if fid(1) %add a ss2in
funstr{i}=[funstr{i}(1:(funstrwords_b{i}(j)-1)),'ss2in(',funstrwords{i}{j},',',subscripts{1},')',funstr{i}((parens(2)+1):end)];
else %place a 1 there and index normally
funstr{i}=[funstr{i}(1:parens(1)),'1,',funstr{i}((parens(1)+1):end)];
end
elseif size(getfield(cw,funstrwords{i}{j}),2)==1 %column vector var, test for ss2in
if fid(1) %add a ss2in
funstr{i}=[funstr{i}(1:(funstrwords_b{i}(j)-1)),'ss2in(',funstrwords{i}{j},',',subscripts{1},')',funstr{i}((parens(2)+1):end)];
else %place a 1 there and index normally
funstr{i}=[funstr{i}(1:(parens(2)-1)),',1',funstr{i}(parens(2):end)];
end
else
if strcmp(temp(~isspace(temp)),':') %If a colon is the entire subscript, then columnize
fortranfunwords{length(fortranfunwords)+1}='reshape';
fortranfunwords{length(fortranfunwords)+1}='int';
funstr{i}=[funstr{i}(1:(funstrwords_b{i}(j)-1)),'reshape(',funstrwords{i}{j},',[size(',funstrwords{i}{j},'),int(1)])',funstr{i}((parens(2)+1):end)];
else %This should be a ss2in
funstr{i}=[funstr{i}(1:(funstrwords_b{i}(j)-1)),'ss2in(',funstrwords{i}{j},',',subscripts{1},')',funstr{i}((parens(2)+1):end)];
end
end
updatefunstr(i);
count=1;gotto=i;gotto2=temp3-j;
else %subscript on lhs, add 1 if needed
if size(getfield(cw,funstrwords{i}{j}),1)==1 %row vector var, test for ss2in
funstr{i}=[funstr{i}(1:parens(1)),'1,',funstr{i}((parens(1)+1):end)];
elseif size(getfield(cw,funstrwords{i}{j}),2)==1 %column vector var, test for ss2in
funstr{i}=[funstr{i}(1:(parens(2)-1)),',1',funstr{i}(parens(2):end)];
end
updatefunstr(i);
count=1;gotto=i;gotto2=temp3-j;
end
end
case 2
tempstr=makeMATLABcallstring(howmany,subscripts,centercomma,parens,i,j);
fid=need_ss2in(howmany,subscripts,centercomma,parens,i,j,tempstr);
if goonimag==0 %after main equals sign
if all(fid) %This should not happen ... ?
elseif fid(1) %ss2in only that dim
funstr{i}=[funstr{i}(1:(funstrwords_b{i}(j)-1)),'ss2in(',funstrwords{i}{j},'(:,',subscripts{2},'),',subscripts{1},')',funstr{i}((parens(2)+1):end)];
elseif fid(2)
funstr{i}=[funstr{i}(1:(funstrwords_b{i}(j)-1)),'ss2in(',funstrwords{i}{j},'(',subscripts{1},',:),',subscripts{2},')',funstr{i}((parens(2)+1):end)];
end
if any(fid)&~all(fid)
updatefunstr(i);
count=1;gotto=i;gotto2=temp3-j;
end
end
end %switch
end
%funstr{i},funstrwords{i}{j},kb
end
end
if count==1, break; end
end
if count==0, gotto2=0; end
if count==1, break; end
end
end
if want_kb,disp('finished with making 2 subscripts'),disp(r),showall(funstr),disp(r),keyboard,end
if want_fb&(~want_kb),fprintf(1,' finished \n');end
%%%catch
%%% disp(r);disp(funstr{i});disp(['line number ',num2str(i)]);disp(lasterr);disp(r);
%%% disp('Conversion error in preceeding line.');
%%% disp('Try to continue? [y,<return>]');
%%% tempans=input('or enter keyboard mode? [n,k]','s');
%%% if ~isempty(tempans), if ((strcmp(tempans,'n'))|(strcmp(tempans,'k'))), keyboard, end, end
%%%end
%Fix logical operators such as &, |, and ~ (and ~= ==> /=)
%try
fprintf(1,' ');pticker=pticker+1;
if want_fb&(~want_kb),fprintf(1,' fixing logical operators .......................... 1');end
count=1;gotto=1;
while count==1
count=0;
for i=gotto:s
fprintf(1,b);fprintf(1,ticker{tickercount});
tickercount=tickercount+1;if tickercount>11, tickercount=1; end
if i==s, fprintf(1,b);fprintf(1,ticker{pticker}); end
for j=1:size(logicalops,1)
if count==0
temp=findstr(funstr{i},logicalops{j,1});
if ~isempty(temp)
for k=1:size(temp)
if count==0
if strcmp('~',logicalops{j,1})
temp1=find(~isspace(funstr{i}));
temp1=temp1(temp1>temp(k));temp1=temp1(1);
if ~strcmp('=',funstr{i}(temp1))
funstr{i}=[funstr{i}(1:(temp(k)-1)),logicalops{j,2},funstr{i}((temp(k)+length(logicalops{j,1})):end)];
updatefunstr(i);
count=1;gotto=i;
else
funstr{i}=[funstr{i}(1:(temp(k)-1)),'/',funstr{i}((temp(k)+length(logicalops{j,1})):end)];
end
else
funstr{i}=[funstr{i}(1:(temp(k)-1)),logicalops{j,2},funstr{i}((temp(k)+length(logicalops{j,1})):end)];
updatefunstr(i);
count=1;gotto=i;
end
end
end
end
end
end
end
end
if want_kb,disp('finished fixing logical operators'),disp(r),showall(funstr),disp(r),keyboard,end
if want_fb&(~want_kb),fprintf(1,' finished \n');end
%%%catch
%%% disp(r);disp(funstr{i});disp(['line number ',num2str(i)]);disp(lasterr);disp(r);
%%% disp('Conversion error in preceeding line.');
%%% disp('Try to continue? [y,<return>]');
%%% tempans=input('or enter keyboard mode? [n,k]','s');
%%% if ~isempty(tempans), if ((strcmp(tempans,'n'))|(strcmp(tempans,'k'))), keyboard, end, end
%%%end
%Fix all subscripts, possibly add mxi
%try
fprintf(1,' ');pticker=pticker+1;
if want_fb&(~want_kb),fprintf(1,' subscript vectorizing ............................. 1');end
count=1;gotto=1;gotto2=1;
while count==1
count=0;
for i=gotto:s
fprintf(1,b);fprintf(1,ticker{tickercount});
tickercount=tickercount+1;if tickercount>11, tickercount=1; end
if i==s, fprintf(1,b);fprintf(1,ticker{pticker}); end
for j=length(funstrwords{i}):-1:1
if count==0
if (length(find(strcmp(funstrwords{i}(j),inoutother3)))>0)
[howmany,subscripts,centercomma,parens]=hassubscript(i,j);
if howmany==2
tempstr=makeMATLABcallstring(howmany,subscripts,centercomma,parens,i,j);
if any(strcmp(tempstr(1),typs{12})),temp3(1)=0;else temp3(1)=1;end
if any(strcmp(tempstr(2),typs{12})),temp3(2)=0;else temp3(2)=1;end
if ((temp3(1)==1)&(temp3(2)==1))
%Do nothing
elseif ((temp3(1)==1)&(temp3(2)==0))
%Vectorize then let 0,0 take care of mxi if needed
temp1(1)=parens(1);temp1(2)=centercomma(1);
funstr{i}=[funstr{i}(1:temp1(1)),'[',funstr{i}(temp1(1)+1:temp1(2)-1),']',funstr{i}(temp1(2):end)];
count=1;gotto=i;
elseif ((temp3(1)==0)&(temp3(2)==1))
%Vectorize then let 0,0 take care of mxi if needed
temp1(1)=centercomma(1);temp1(2)=parens(2);
funstr{i}=[funstr{i}(1:temp1(1)),'[',funstr{i}(temp1(1)+1:temp1(2)-1),']',funstr{i}(temp1(2):end)];
count=1;gotto=i;
elseif ((temp3(1)==0)&(temp3(2)==0))
%Add mxi if needed
for k=1:howmany
if count==0
if strncmp(subscripts{k}(1),'[',1),goonimag=0;else;goonimag=1;end
if length(find(subscripts{k}==':'))>0,goonimag=0;end
%%% if length(subscripts{k})>3
%%% if strcmp(subscripts{k}(1:4),'mxv(')
%%% goonimag=0;
%%% end
%%% end
if goonimag
if k==1,temp1(1)=parens(1);temp1(2)=centercomma(1); end
if k==2,temp1(1)=centercomma(1);temp1(2)=parens(2); end
funstr{i}=[funstr{i}(1:temp1(1)),'[',funstr{i}(temp1(1)+1:temp1(2)-1),']',funstr{i}(temp1(2):end)];
count=1;gotto=i;
end
end
end
end
end
if count==1
updatefunstr(i);
end
end
end
if count==1, break; end
end
if count==1, break; end
end
end
if want_kb,disp('finished with subscript vectorizing'),disp(r),showall(funstr),disp(r),keyboard,end
if want_fb&(~want_kb),fprintf(1,' finished \n');end
%%%catch
%%% disp(r);disp(funstr{i});disp(['line number ',num2str(i)]);disp(lasterr);disp(r);
%%% disp('Conversion error in preceeding line.');
%%% disp('Try to continue? [y,<return>]');
%%% tempans=input('or enter keyboard mode? [n,k]','s');
%%% if ~isempty(tempans), if ((strcmp(tempans,'n'))|(strcmp(tempans,'k'))), keyboard, end, end
%%%end
%Fix for, while, if, keywords groups
%try
fprintf(1,' ');pticker=pticker+1;
if want_fb&(~want_kb),fprintf(1,' fixing if, for, etc keywords ...................... 1');end
for i=1:s
fprintf(1,b);fprintf(1,ticker{tickercount});
tickercount=tickercount+1;if tickercount>11, tickercount=1; end
if i==s, fprintf(1,b);fprintf(1,ticker{pticker}); end
switch funstrwords{i}{1}
case 'call'
case 'case'
funstr{i}=[funstr{i}(1:funstrwords_e{i}(1)+1),'(int(',convertconditional(funstr{i}(funstrwords_e{i}(1)+2:end-1)),'));'];
case 'else'
case 'elseif'
funstr{i}=['elseif (',convertconditional(funstr{i}(funstrwords_e{i}(1)+2:end-1)),') then;'];
case 'for'
temp=findend(i,s,funstr,funstrwords,keywords,keywordsbegin);
fid=find(funstr{i}=='=');fid=fid(fid>funstrwords_e{i}(1));fid=fid(1);
temp4=find(funstrwords_b{i}<fid); temp4=temp4(end); %make index var an integer if a local var
if ~isempty(find(strcmp(inoutother{3},funstrwords{i}{temp4})))
temp5=find(strcmp(inoutother{3},funstrwords{i}{temp4}));temp5=temp5(1);
localvartype{temp5}='integer';
end
temp2=find(funstr{i}==':');
parens=[fid+1 length(funstr{i})-1];
tempstr=makeMATLABcallstring(length(temp2)+1,cell(1,length(temp2)+1),temp2,parens,i,j);
%funstr{i},kb
temp3=cell(0);
temp3{1,1}=''; temp3{1,2}=''; temp3{1,3}=''; temp3{1,4}=''; temp3{1,5}=''; temp3{1,6}='';
temp3{2,1}=''; temp3{2,2}=''; temp3{2,3}=''; temp3{2,4}=''; temp3{2,5}=''; temp3{2,6}='';
if any(strcmp(tempstr(1),typs{2})), temp3{1,1}='nint(';temp3{1,2}=')'; end
if any(strcmp(tempstr(2),typs{2})), temp3{1,3}='nint(';temp3{1,4}=')'; end
if any(strcmp(tempstr(1),typs{1})), temp3{2,1}='mxs('; temp3{2,2}=')'; end
if any(strcmp(tempstr(2),typs{1})), temp3{2,3}='mxs('; temp3{2,4}=')'; end
if length(temp2)==1
funstr{i}=['do',funstr{i}(funstrwords_e{i}(1)+1:fid),temp3{1,1},temp3{2,1},funstr{i}(fid+1:temp2-1),temp3{1,2},temp3{2,2},',',temp3{1,3},temp3{2,3},funstr{i}(temp2+1:end-1),temp3{1,4},temp3{2,4},';'];
elseif length(find(funstr{i}==':'))==2
if any(strcmp(tempstr(3),typs{2})), temp3{1,5}='nint(';temp3{1,6}=')'; end
if any(strcmp(tempstr(3),typs{1})), temp3{2,5}='mxs('; temp3{2,6}=')'; end
funstr{i}=['do',funstr{i}(funstrwords_e{i}(1)+1:fid),temp3{1,1},temp3{2,1},funstr{i}(fid+1:temp2(1)-1),temp3{1,2},temp3{2,2},',',temp3{1,3},temp3{2,3},funstr{i}(temp2(2)+1:end-1),temp3{1,4},temp3{2,4},',',temp3{1,5},temp3{2,5},funstr{i}(temp2(1)+1:temp2(2)-1),temp3{1,6},temp3{2,6},';'];
end
funstr{temp}=['enddo',funstr{temp}(funstrwords_e{temp}(1)+1:length(funstr{temp}))];
case 'if'
funstr{i}=[funstr{i}(1:funstrwords_e{i}(1)+1),'(',convertconditional(funstr{i}(funstrwords_e{i}(1)+2:end-1)),') then;'];
temp=findend(i,s,funstr,funstrwords,keywords,keywordsbegin);
funstr{temp}=['endif',funstr{temp}(funstrwords_e{temp}(1)+1:length(funstr{temp}))];
case 'otherwise'
funstr{i}=['case default',funstr{i}(funstrwords_e{i}(1)+1:end)];
case 'switch'
funstr{i}=['select case (int(',convertconditional(funstr{i}(funstrwords_e{i}(1)+2:end-1)),'));'];
temp=findend(i,s,funstr,funstrwords,keywords,keywordsbegin);
funstr{temp}=['end select',funstr{temp}(funstrwords_e{temp}(1)+1:length(funstr{temp}))];
case 'while'
funstr{i}=['do while ',convertconditional(funstr{i}(funstrwords_e{i}(1)+2:end-1)),';'];
temp=findend(i,s,funstr,funstrwords,keywords);
funstr{temp}=['enddo',funstr{temp}(funstrwords_e{temp}(1)+1:length(funstr{temp}))];
end
end
updatefunstr;
if want_kb,disp('finished fixing if, for, etc keywords.'),disp(r),showall(funstr),disp(r),keyboard,end
if want_fb&(~want_kb),fprintf(1,' finished \n');end
%%%catch
%%% disp(r);disp(funstr{i});disp(['line number ',num2str(i)]);disp(lasterr);disp(r);
%%% disp('Conversion error in preceeding line.');
%%% disp('Try to continue? [y,<return>]');
%%% tempans=input('or enter keyboard mode? [n,k]','s');
%%% if ~isempty(tempans), if ((tempans=='n')|(tempans=='k')), keyboard, end, end
%%%end
%Changed non-integral expressions in subscripts
%try
fprintf(1,' ');pticker=pticker+1;
if want_fb&(~want_kb),fprintf(1,' fixing bracketed assignments II ................... 1');end
count=1;gotto=1;gotto2=1;
while count==1
count=0;
for i=gotto:s
fprintf(1,b);fprintf(1,ticker{tickercount});
tickercount=tickercount+1;if tickercount>11, tickercount=1; end
if i==s, fprintf(1,b);fprintf(1,ticker{pticker}); end
for j=gotto2:length(funstrwords{i})
if count==0
if (length(find(strcmp(funstrwords{i}(j),inoutother3)))>0)
if insubscript(i,funstrwords_b{i}(j))
[temp2,howmany2,subscripts2,centercomma2,parens2]=inwhichlast(i,funstrwords_b{i}(j));
if ((temp2==1)|(temp2==2))
goon=1;
if temp2==1
[outflag,howmany,subscripts,centercomma,parens]=inbracket(i,funstrwords_b{i}(j),funstr);
if howmany>=3
goon=0;
end
end
if length(find(strcmp(funstrwords{i}{j},inoutother{3})))>0
temp1=find(strcmp(funstrwords{i}{j},inoutother{3}));
if strcmp(localvartype{temp1},'integer')
goon=0;
end
end
if funstrwords_b{i}(j)>4
if strcmp(funstr{i}(funstrwords_b{i}(j)-4:funstrwords_b{i}(j)-1),'int(')
goon=0;
end
end
%Which subscript are we in?
if howmany2==1
fid=1;
elseif howmany2==2
if ((funstrwords_b{i}(j)>parens2(1))&(funstrwords_b{i}(j)<centercomma2))
fid=1; else, fid=2;
end
end
for k=1:length(loglist)
temp3=findstrexact(loglist{k},subscripts2{fid});
if ~isempty(temp3)
temp4=findstrexact(subscripts2{fid},funstr{i});
for temp=1:length(temp3)
[outflag,howmany,subscripts,centercomma,parens]=inwhichlast(i,temp4+temp3(temp)-1);
if ~isempty(parens)
if parens(1)==parens2(1) %parens we are in match parens that relop is in
goon=0;
end
end
end
end
end
if goon==1
if strcmp(funstrwords{i}{1},'qm')
funstr{i},'wwwwwwwwwwwww',kb
end
[howmany,subscripts,centercomma,parens]=hassubscript(i,j);
if howmany==0
funstr{i}=[funstr{i}(1:funstrwords_b{i}(j)-1),'int(',funstrwords{i}{j},')',funstr{i}(funstrwords_e{i}(j)+1:end)];
else
funstr{i}=[funstr{i}(1:funstrwords_b{i}(j)-1),'int(',funstr{i}(funstrwords_b{i}(j):parens(2)),')',funstr{i}(parens(2)+1:end)];
end
if length(find(strcmp('int',fortranfunwords)))==0
fortranfunwords{length(fortranfunwords)+1}='int';
end
updatefunstr(i);
count=1;gotto=i;gotto2=j+1;
end
end
end
end
end
if count==1, break; end
end
if count==0, gotto2=1; end
if count==1, break; end
end
end
if want_kb,disp('finished fixing bracketed assignments II'),disp(r),showall(funstr),disp(r),keyboard,end
if want_fb&(~want_kb),fprintf(1,' finished \n');end
%%%catch
%%% disp(r);disp(funstr{i});disp(['line number ',num2str(i)]);disp(lasterr);disp(r);
%%% disp('Conversion error in preceeding line.');
%%% disp('Try to continue? [y,<return>]');
%%% tempans=input('or enter keyboard mode? [n,k]','s');
%%% if ~isempty(tempans), if ((strcmp(tempans,'n'))|(strcmp(tempans,'k'))), keyboard, end, end
%%%end
%Change colon expressions
%try
fprintf(1,' ');pticker=pticker+1;
if want_fb&(~want_kb),fprintf(1,' fixing colon expressons ........................... 1');end
for i=1:s
fprintf(1,b);fprintf(1,ticker{tickercount});
tickercount=tickercount+1;if tickercount>11, tickercount=1; end
if i==s, fprintf(1,b);fprintf(1,ticker{pticker}); end
temp=findstr(':',funstr{i});
if ~isempty(temp)
j=1;
while j<=length(temp)
if ((strcmp(funstrwords{i}{1},'disp'))|(strcmp(funstrwords{i}{1},'for')))
break
else
% if i>186
% 'oooooooooooo',funstr{i},kb
% end
temp1=temp(j);
[tempflag,howmany,subscripts,centercomma,parens]=inbracket(i,temp1,funstr);
if tempflag % In a bracket
[temp2,howmany2,subscripts2,centercomma2,parens2]=inwhichlast(i,parens(1));
tempstr=makeMATLABcallstring(howmany,subscripts,centercomma,parens,i,j);
%funstr{i},temp1,j,'33333333332',kb
temp3={'','','';'','',''};
for k=1:howmany
if ~any(strcmp(tempstr(k),typs{7}))
if length(find(strncmp('int',subscripts{k},3)))==0
temp3{1,k}=[temp3{1,k},'int(']; temp3{2,k}=[temp3{2,k},')'];
end
end
if any(strcmp(tempstr(k),typs{1}))
if length(find(strncmp('mxs',subscripts{k},3)))==0
temp3{1,k}=[temp3{1,k},'mxs(']; temp3{2,k}=[temp3{2,k},')'];
end
end
end
if howmany==3
if temp2==2 % bracketed expression is in subscript, 2 colons, switch order
fid={};
fid{1}=(~isspace(funstr{i}))&(find(funstr{i})>parens(2));
fid{2}=(~isspace(funstr{i}))&(find(funstr{i})<parens(1));
if (length(find(fid{1}(1)==[parens2 centercomma2]))>0) & (length(find(fid{2}(end)==[parens2 centercomma2]))>0) %Then we dont need (/ /) in fortran
funstr{i}=[funstr{i}(1:parens(1)-1),temp3{1,1},subscripts{1},temp3{2,1},':',temp3{1,3},subscripts{3},temp3{2,3},':',temp3{1,2},subscripts{2},temp3{2,2},funstr{i}(parens(2)+1:end)];
else %we do
funstr{i}=[funstr{i}(1:parens(1)-1),'[(iji,iji=',temp3{1,1},subscripts{1},temp3{2,1},',',temp3{1,3},subscripts{3},temp3{2,3},',',temp3{1,2},subscripts{2},temp3{2,2},')]',funstr{i}(parens(2)+1:end)];
end
j=j+howmany-1;
elseif temp2==1 % Bracketed expression nested in another bracket
funstr{i}=[funstr{i}(1:parens(1)-1),'[linspace((',subscripts{1},'),fix(((',subscripts{3},')-(',subscripts{1},'))/(',subscripts{2},'))*(',subscripts{2},')+(',subscripts{1},'),fix(((',subscripts{3},')-(',subscripts{1},'))/(',subscripts{2},'))+1)]',funstr{i}(parens(2)+1:end)];
else % Bracketed expression by itself or in another context, return array
funstr{i}=[funstr{i}(1:parens(1)-1),'linspace((',subscripts{1},'),fix(((',subscripts{3},')-(',subscripts{1},'))/(',subscripts{2},'))*(',subscripts{2},')+(',subscripts{1},'),fix(((',subscripts{3},')-(',subscripts{1},'))/(',subscripts{2},'))+1)',funstr{i}(parens(2)+1:end)];
end
elseif howmany==2 % bracketed expression, 1 colon, not in subscript. Must return array
if ~insubscript(i,temp(j))
funstr{i}=[funstr{i}(1:parens(1)-1),'spread(',subscripts{1},'+[(iji,iji=int(0),int(mxs(floor(dble(',subscripts{2},'-(',subscripts{1},'))))))],1,1)',funstr{i}(parens(2)+1:end)];
end
if temp2==2 % bracketed expression, 1 colon, in subscript. add int() if needed
fid={};
fid{1}=find((~isspace(funstr{i}))&(find(funstr{i})>parens(2)));
fid{2}=find((~isspace(funstr{i}))&(find(funstr{i})<parens(1)));
if (length(find(fid{1}(1)==[parens2 centercomma2]))>0) & (length(find(fid{2}(end)==[parens2 centercomma2]))>0) %Then we dont need (/ /) in fortran
funstr{i}=[funstr{i}(1:parens(1)-1),temp3{1,1},subscripts{1},temp3{2,1},':',temp3{1,2},subscripts{2},temp3{2,2},funstr{i}(parens(2)+1:end)];
else %we do
funstr{i}=[funstr{i}(1:parens(1)-1),'[(iji,iji=',temp3{1,1},subscripts{1},temp3{2,1},',',temp3{1,2},subscripts{2},temp3{2,2},')]',funstr{i}(parens(2)+1:end)];
end
j=j+howmany-1;
end
else
%then this looks like this is a colon only subscript. Do nothing, right?
j=j+1;
end
updatefunstr(i);
else % Not in a bracket
[tempflag,howmany,subscripts,centercomma,parens]=inwhichlast(i,temp1);
if tempflag==2 % But we are in a subscript last
temp2=[]; temp3=[];
for k=1:howmany % Find which subscript (k) this colon expression is in, should be 2 subs
if k==1
temp2(1)=parens(1); temp2(2)=centercomma(1);
elseif k==howmany
temp2(1)=centercomma(end); temp2(2)=parens(2);
else
temp2(1)=centercomma(k-1); temp2(2)=centercomma(k);
end
if ((temp1>temp2(1))&(temp1<temp2(2)))
temp3=k;
break
end
end
fid=find(((temp>temp2(1))&(temp<temp2(2))));
tempstr='';
howmany=length(fid)+1;
%here next, there has to be a better way
for k=1:howmany
if k==1
temp3(1)=temp2(1); temp3(2)=temp(fid(1));
elseif k==length(fid)+1
temp3(1)=temp(fid(end)); temp3(2)=temp2(2);
else
temp3(1)=temp(fid(k-1)); temp3(2)=temp(fid(k));
end
tempstr=[tempstr,makeMATLABcallstring(1,{funstr{i}(temp3(1)+1:temp3(2)-1)},[],[temp3(1)+1 temp3(2)-1],i,inf)];
subscripts{k}=funstr{i}(temp3(1)+1:temp3(2)-1);
end
temp3={'','','';'','',''};
for k=1:howmany
if ~any(strcmp(tempstr(k),typs{7}))
if length(find(strncmp('int',subscripts{k},3)))==0
temp3{1,k}=[temp3{1,k},'int(']; temp3{2,k}=[temp3{2,k},')'];
end
end
if ~any(strcmp(tempstr(k),typs{5}))
if length(find(strncmp('mxs',subscripts{k},3)))==0
temp3{1,k}=[temp3{1,k},'mxs(']; temp3{2,k}=[temp3{2,k},')'];
end
end
end
if howmany==3 % colon expression is in subscript, 2 colons, switch order
funstr{i}=[funstr{i}(1:temp2(1)),temp3{1,1},subscripts{1},temp3{2,1},':',temp3{1,3},subscripts{3},temp3{2,3},':',temp3{1,2},subscripts{2},temp3{2,2},funstr{i}(temp2(2):end)];
j=j+howmany-1;
elseif howmany==2 % colon expression is in subscript, 1 colon
funstr{i}=[funstr{i}(1:temp2(1)),temp3{1,1},subscripts{1},temp3{2,1},':',temp3{1,2},subscripts{2},temp3{2,2},funstr{i}(temp2(2):end)];
j=j+howmany-1;
end
updatefunstr(i);
else
if ~strcmp(funstrwords{i}{1},'for')
disp(['Encountered a colon expression not enclosed in brackets outside ',r,'a subscript. Put brackets around this colon expression. *error*',r,' ',funstr{i}]);keyboard
else
j=inf;
end
end
end
end
temp=findstr(':',funstr{i});
end
%funstr{i},'3333333333',kb
end
end
if want_kb,disp('finished fixing colon expressions'),disp(r),showall(funstr),disp(r),keyboard,end
if want_fb&(~want_kb),fprintf(1,' finished \n');end
%%%catch
%%% disp(r);disp(funstr{i});disp(['line number ',num2str(i)]);disp(lasterr);disp(r);
%%% disp('Conversion error in preceeding line.');
%%% disp('Try to continue? [y,<return>]');
%%% tempans=input('or enter keyboard mode? [n,k]','s');
%%% if ~isempty(tempans), if ((strcmp(tempans,'n'))|(strcmp(tempans,'k'))), keyboard, end, end
%%%end
%Change calls to matlab function with no fortran equivalent (user m-files).
%try
fprintf(1,' ');pticker=pticker+1;
if want_fb&(~want_kb),fprintf(1,' performing word conversion ........................ 1');end
count=1;gotto=1;maxmxinputs={'r'};maxmxinputs0={'r'};multinum=1;
while count==1
count=0;
for i=gotto:s
fprintf(1,b);fprintf(1,ticker{tickercount});
tickercount=tickercount+1;if tickercount>11, tickercount=1; end
if i==s, fprintf(1,b);fprintf(1,ticker{pticker}); end
if count==0
goon='';goonimag='';fid='';
for j=length(funstrwords{i}):-1:1
if count==0
dummy=[keywords' inoutother{1}' inoutother{2}' inoutother{3}' inoutother{4}' mxwords' fortranfunwords']';
%%% if any(strcmp('i',funstrwords{i}))
%%% 'wqord',funstr{i},funstrwords{i}{j},kb
%%% end
if ((length(find(strcmpi(funstrwords{i}(j),dummy)))==0)&~(inastring(funstrwords_b{i}(j),funstr{i}))&(~strcmpi(funstrwords{i}(1),'call'))&(~strcmpi(funstrwords{i}(1),'rhs')))
%%% if any(strcmp('prod',funstrwords{i}{j}))
%%% 'wqord',funstr{i},funstrwords{i}{j},kb
%%% end
foo=1;
if strcmpi(funstrwords{i}(j),'j')
if ~(length(find(strcmpi('j',inoutother3))))
funstr{i}=[funstr{i}(1:funstrwords_b{i}(j)-1),'cmplx(0.0,1.0)',funstr{i}(funstrwords_e{i}(j)+1:end)];
foo=0; updatefunstr(i); count=1;gotto=i;
end
end
if strcmpi(funstrwords{i}(j),'i')
if ~(length(find(strcmpi('i',inoutother3))))
funstr{i}=[funstr{i}(1:funstrwords_b{i}(j)-1),'cmplx(0.0,1.0)',funstr{i}(funstrwords_e{i}(j)+1:end)];
foo=0; updatefunstr(i); count=1;gotto=i;
end
end
if strcmpi(funstrwords{i}(j),'pi')
if ~(length(find(strcmpi('pi',inoutother3))))
needpi=1; foo=0;
end
end
if strcmpi(funstrwords{i}(j),'eps')
if ~(length(find(strcmpi('eps',inoutother3))))
needeps=1; foo=0;
end
end
if foo
foo3=0;
if any(strcmp(funstrwords{i}{j},'dot1f'))
foo3=1,funstr{i},kb
end
[tempflag,temp2,suborfun]=wordconverter(i,j,suborfun);
%%% if foo3
%%% zzz=1;
%%% tempflag,funstr{i},funstrwords{i}{j},'converter',kb
%%% end
if tempflag(3)==1 %Newer interface by call if ==1
updatefunstr(i);
[howmany,subscripts,centercomma,parens]=hassubscript(i,j);
%'before',funstr{i},funstrwords{i}{j},kb
tempstr=makeMATLABcallstring(howmany,subscripts,centercomma,parens,i,j);
temp3=cell(1,3);
%%% if any(strcmp(funstrwords{i}{j},'rand'))
%%% funstr{i},howmany,subscripts,centercomma,parens,tempstr,kb
%%% end
try
eval(['[temp3{1},temp3{2},temp3{3}]=',funstrwords{i}{j}(1:length(funstrwords{i}{j})-1),'_make(''',tempstr,''');']);
catch
'caught after wordconverter',funstr{i},kb
end
tempstr2=tempstr;
for m=1:length(tempstr)
temp=any(strcmp(tempstr2(m),{'d','m'})); if temp,tempstr2(m)='c';end
temp=any(strcmp(tempstr2(m),{'e','n'})); if temp,tempstr2(m)='r';end
temp=any(strcmp(tempstr2(m),{'f','o'})); if temp,tempstr2(m)='i';end
temp=any(strcmp(tempstr2(m),{'g','p'})); if temp,tempstr2(m)='l';end
end
if length(find(strcmpi(funstrwords{i}(j),needed_interfaces{1,1})))==0
temp5=length(needed_interfaces{1,1})+1;
needed_interfaces{1,1}{temp5}=funstrwords{i}{j};
needed_interfaces{1,2}{temp5}{1,1}=tempstr2;
needed_interfaces{1,2}{temp5}{1,2}=temp3{3}{1};
needed_interfaces{1,2}{temp5}{1,3}=temp3{3}{2};
else
temp2=find(strcmpi(funstrwords{i}(j),needed_interfaces{1,1}));
if length(find(strcmpi(tempstr2,needed_interfaces{1,2}{temp2}(:,1))))==0
temp5=size(needed_interfaces{1,2}{temp2},1)+1;
needed_interfaces{1,2}{temp2}{temp5,1}=tempstr2;
needed_interfaces{1,2}{temp2}{temp5,2}=temp3{3}{1};
needed_interfaces{1,2}{temp2}{temp5,3}=temp3{3}{2};
end
end
%needed_interfaces{1,1},kb
%%% if strcmpi(funstrwords{i}(j),'findf')
%%% funstr{i},needed_interfaces{1,1},needed_interfaces{1,2}{4},kb
%%% end
if temp3{3}{1}==1
%Here we have to remake a few lines with the mxTR# and mxTC#
%First, what is the highest count of mxTRC# on this line
if strcmp(funstrwords{i-1}{1},'deallocate')
temp1=gethighesttemp(funstr{i},temp3{3}{2});
else
temp1=gethighesttemp([funstr{i-1},funstr{i}],temp3{3}{2});
end
for k=size(funstr,1)+2:-1:i+2
funstr{k}=funstr{k-2};
end
maxTRC=updatetemp(maxTRC,temp1+1,temp3{3}{2});
funstr{i}=['call ',funstr{i+2}(funstrwords_b{i}(j):parens(1)),'mxT',upper(temp3{3}{2}),num2str(temp1+1),',',funstr{i+2}(parens(1)+1:parens(2)),';'];
if length(find(strcmp(keywordsbegin,funstrwords{i}{j})))==0
funstr{i+1}=[funstr{i+2}(1:funstrwords_b{i}(j)-1),'mxT',upper(temp3{3}{2}),num2str(temp1+1),funstr{i+2}(parens(2)+1:length(funstr{i+2}))];
else
funstr{i+1}=[funstr{i+2}(1:funstrwords_b{i}(j)-1),'mxs(mxT',upper(temp3{3}{2}),num2str(temp1+1),')',funstr{i+2}(parens(2)+1:length(funstr{i+2}))];
end
funstr{i+2}=['deallocate(mxT',upper(temp3{3}{2}),num2str(temp1+1),');'];
updatefunstr;
end
else
if length(temp2{1})>0
if length(findstr(temp2{1},mexoperatorinterfaces{1}))==0
mexoperatorinterfaces{1}=[mexoperatorinterfaces{1} temp2{1}];
mexoperatorinterfaces{2}=[mexoperatorinterfaces{2} temp2{2}];
end
end
end
if ~tempflag(1)
[howmany,subscripts,centercomma,parens]=hassubscript(i,j);
[howmany2,subscripts2,centercomma2,parens2]=hasoutput(i,j);
temp3=0;
%%% funstr{i},howmany2,kb
switch howmany2
case 0
temp='call mlcall0(';
tempstr=makeMATLABcallstring(howmany,subscripts,centercomma,parens,i,j);
if length(find(strcmp(maxmxinputs0,tempstr)))==0
maxmxinputs0{length(maxmxinputs0)+1}=tempstr;
end
count=1;gotto=i;
case 1
tempstr=makeMATLABcallstring(howmany,subscripts,centercomma,parens,i,j);
if length(find(strcmp(maxmxinputs,tempstr)))==0
maxmxinputs{length(maxmxinputs)+1}=tempstr;
end
%Here we have to remake a few lines with the mxTR# and mxTC#
%First, what is the highest count of mxTRC# on this line
temp4='r';if sum(length(find(tempstr=='c'))+length(find(tempstr=='t')))>0, temp4='c'; end
if i>1
if strcmp(funstrwords{i-1}{1},'deallocate')
temp1=gethighesttemp(funstr{i},temp4);
else
temp1=gethighesttemp([funstr{i-1},funstr{i}],temp4);
end
else
temp1=0;
end
for k=size(funstr,1)+2:-1:i+2
funstr{k}=funstr{k-2};
end
maxTRC=updatetemp(maxTRC,temp1+1,temp4);
try
funstr{i}=['call mlcall(mxT',upper(temp4),num2str(temp1+1),',',funstr{i+2}(parens(1)+1:parens(2)-1),',''',funstrwords{i}{j},''');'];
catch %catch this
disp([r,'Here are the contents of ',filename,'_save.m. Is ',funstrwords{i}{j},' here?'])
cw
disp(['You may have a variable in ',filename,'.m file which is not in ',filename,'_save.m file.']);
funstr{i},keyboard
end
if length(find(strcmp(keywordsbegin,funstrwords{i}{j})))==0
funstr{i+1}=[funstr{i+2}(1:funstrwords_b{i}(j)-1),'mxT',upper(temp4),num2str(temp1+1),funstr{i+2}(parens(2)+1:length(funstr{i+2}))];
else
funstr{i+1}=[funstr{i+2}(1:funstrwords_b{i}(j)-1),'mxs(mxT',upper(temp4),num2str(temp1+1),')',funstr{i+2}(parens(2)+1:length(funstr{i+2}))];
end
funstr{i+2}=['deallocate(mxT',upper(temp4),num2str(temp1+1),');'];
updatefunstr;
count=1;gotto=i;
temp3=2;
otherwise %multioutput
temp=['call mlcallm',num2str(multinum),'('];
temp2=makemultioutput(i,j,funstr,funstrnumbers,funstrnumbers_b,funstrnumbers_e,funstrwords,funstrwords_b,funstrwords_e,funwords,inoutother,keywords,localvartype,needed_interfaces,filename_al,make_words,cw,multinum,howmany,subscripts,centercomma,parens,howmany2,subscripts2,centercomma2,parens2);
if length(temp2{1})>0
if length(findstr(temp2{1},mexoperatorinterfaces{1}))==0
mexoperatorinterfaces{1}=[mexoperatorinterfaces{1} temp2{1}];
mexoperatorinterfaces{2}=[mexoperatorinterfaces{2} temp2{2}];
end
end
multinum=multinum+1;
temp3=1;
end
if temp3==0
tempstr=makeMATLABcallstring(howmany,subscripts,centercomma,parens,i,j);
if ~isempty(tempstr)
if length(find(strcmp(maxmxinputs,tempstr)))==0
maxmxinputs{length(maxmxinputs)+1}=tempstr;
end
end
if howmany==0
temp=[temp,'''',funstrwords{i}{j},''')'];
else
for k=1:howmany
if k==howmany,
temp=[temp,subscripts{k},',''',funstrwords{i}{j},''')'];
else
temp=[temp,subscripts{k},','];
end
end
end
if funstrwords_b{i}(j)==1
if howmany==0
funstr{i}=[temp,funstr{i}((funstrwords_e{i}(j)+1):end)];
else
funstr{i}=[temp,funstr{i}(parens(2)+1:end)];
end
else
try %This catches some common mistakes
funstr{i}=[funstr{i}(1:(funstrwords_b{i}(j)-1)),temp,funstr{i}((parens(2)+1):end)];
% end
catch%Finish try block
disp(['Do you have a string someplace it shouldnlt be?',r,'Are all variables saved in ',filename,'.mat?']);
funstr{i}
kb
end
end
%showall(funstr),i,j,'Either you left the keyboard command there, or you haven't saved some variable in the workspace file.',keyboard
updatefunstr(i);
count=1;gotto=i;
elseif temp3==1 %0 output mlcall0 case
for k=1:howmany, temp=[temp,subscripts{k},',']; end
for k=1:howmany2
if k==howmany2,
rightside=parens2(2);leftside=centercomma2(k-1);
fid=find((funstrwords_b{i}<rightside)&(funstrwords_b{i}>leftside));
[howmany3,subscripts3,centercomma3,parens3]=hassubscript(i,fid(1));
if howmany3==2
temp=[temp,funstrwords{i}{fid(1)},',[',subscripts3{1},'],[',subscripts3{2},'],''',funstrwords{i}{j},''')'];
else
temp=[temp,subscripts2{k},',''',funstrwords{i}{j},''')'];
end
elseif k==1
rightside=centercomma2(1);leftside=parens2(1);
fid=find((funstrwords_b{i}<rightside)&(funstrwords_b{i}>leftside));
[howmany3,subscripts3,centercomma3,parens3]=hassubscript(i,fid(1));
if howmany3==2
temp=[temp,funstrwords{i}{fid(1)},',[',subscripts3{1},'],[',subscripts3{2},'],'];
else
temp=[temp,subscripts2{k},','];
end
else
rightside=centercomma2(k);leftside=centercomma2(k-1);
fid=find((funstrwords_b{i}<rightside)&(funstrwords_b{i}>leftside));
[howmany3,subscripts3,centercomma3,parens3]=hassubscript(i,fid(1));
if howmany3==2
temp=[temp,funstrwords{i}{fid(1)},',[',subscripts3{1},'],[',subscripts3{2},'],'];
else
temp=[temp,subscripts2{k},','];
end
end
end
funstr{i}=[temp,';'];
updatefunstr(i);
count=1;gotto=i;
end
else
updatefunstr(i);
if tempflag(2), count=1;gotto=i+tempflag(2)-1; end
end
%%% if strcmp(funstrwords{i}{1},'k')
%%% '===========22',funstr{i},gotto,funstrwords{i}{j},count,kb
%%% end
end
%%% else
%%% if ~any(strcmpi(funstrwords{i}(1),{'print';'deallocate';'call';'error'}))
%%% goon=1;
%%% temp=findstr('=',funstr{i});
%%% if ~isempty(temp)
%%% for fid=1:length(temp)
%%% if inwhichlast(i,temp(fid))==0
%%% goon=0;
%%% end
%%% end
%%% end
%%% if (goon&(length(find(strcmp(funstrwords{i}{1},keywords)))==0)&(length(find(strcmp(funstrwords{i}{1},funwords)))==0))
%%% funstr{i}=['print *,',funstr{i}];
%%% updatefunstr(i);
%%% count=1;gotto=i;
%%% if length(find(strcmp('print',fortranfunwords)))==0
%%% fortranfunwords{length(fortranfunwords)+1}='print';
%%% end
%%% end
%%% end
end
end
end
end
if count==1, break; end
end
end
if want_kb,disp('finished word conversions'),disp(r),showall(funstr),disp(r),keyboard,end
if want_fb&(~want_kb),fprintf(1,' finished \n');end
%%%catch
%%% disp(r);disp(funstr{i});disp(['line number ',num2str(i)]);disp(lasterr);disp(r);
%%% disp('Conversion error in preceeding line.');
%%% disp('Try to continue? [y,<return>]');
%%% tempans=input('or enter keyboard mode? [n,k]','s');
%%% if ~isempty(tempans), if ((tempans=='n')|(tempans=='k')), keyboard, end, end
%%%end
%We need to change = assignments.
%try
fprintf(1,' ');pticker=pticker+1;
if want_fb&(~want_kb),fprintf(1,' fixing assignments ................................ 1');end
count=1;gotto=1;
while count==1
count=0;
for i=gotto:s
fprintf(1,b);fprintf(1,ticker{tickercount});
tickercount=tickercount+1;if tickercount>11, tickercount=1; end
if i==s, fprintf(1,b);fprintf(1,ticker{pticker}); end
if count==0;
dummy=findstr('=',funstr{i});
fid=1;
if count==0
if ~isempty(dummy)
for j=1:length(dummy)
temp=dummy(j);
if inwhichlast(i,temp)==0
fid=0;
if length(find(strcmp(funstrwords{i}{1},keywordsbegin)))==0
if (length(find(strcmp(funstrwords{i}(1),inoutother3)))>0)
%'got1111111111111a',funstr{i},funstr{i}(1:temp)
tempstr='';
tempstr(2)=makeMATLABcallstring(1,{funstr{i}(temp:length(funstr{i}))},[],[temp length(funstr{i})],i,inf);
if ~any(strcmp(tempstr(2),typs{5})) %scalars on the right will be promoted to anything
tempstr(1)=makeMATLABcallstring(1,{funstr{i}(1:temp)},[],[1 temp-1],i,inf);
temp1=[]; temp2=[]; temp3=[];
for k=1:length(tempstr)
if ~isempty(find(strcmp(tempstr(k),barr)))
[temp1(k),temp2(k)]=find(strcmp(tempstr(k),barr)); temp3(k)=0;
else
[temp1(k),temp2(k)]=find(strcmp(tempstr(k),barr2));temp3(k)=1;
end
end
%%% if any(strcmp('kk',funstrwords{i}{1}))
%%% 'got111111111111122',funstr{i},funstr{i}(1:temp),tempstr,kb
%%% end
if ~((temp3(1)==temp3(2))&(temp2(1)==temp2(2))) %So we need to math up the shapes
%funstr{i}
if any(strcmp(tempstr(1),typs{5}))
funstr{i}=[funstr{i}(1:temp),'mxs(',funstr{i}(temp+1:end-1),');'];
elseif any(strcmp(tempstr(1),typs{4}))
if any(strcmp(tempstr(2),typs{11}))
funstr{i}=[funstr{i}(1:temp),'[',funstr{i}(temp+1:end-1),'];'];
end
elseif any(strcmp(tempstr(1),typs{1})) %Can't do much for a mismatch
elseif any(strcmp(tempstr(1),typs{9})) %row on left
if any(strcmp(tempstr(2),typs{4})) %1-D on right
funstr{i}=[funstr{i}(1:temp),'spread(',funstr{i}(temp+1:end-1),',1,1);'];
elseif any(strcmp(tempstr(2),typs{10}))%col on right, transpose
funstr{i}=[funstr{i}(1:temp),'transpose(',funstr{i}(temp+1:end-1),');'];
end
elseif any(strcmp(tempstr(1),typs{10}))%col on left
if any(strcmp(tempstr(2),typs{4})) %1-D on right
funstr{i}=[funstr{i}(1:temp),'transpose(spread(',funstr{i}(temp+1:end-1),',1,1));'];
elseif any(strcmp(tempstr(2),typs{9}))%row on right, transpose
funstr{i}=[funstr{i}(1:temp),'transpose(',funstr{i}(temp+1:end-1),');'];
end
end
%funstr{i},%kb
end
end
%%% if any(strcmp('kk',funstrwords{i}{1}))
%%% 'got1111111111111',funstr{i},funstr{i}(1:temp),tempstr,kb
%%% end
end
end
count=1;gotto=i+1; break
end
end
end
if length(find(strcmp(funstrwords{i}{1},keywords)))~=0 | any(strcmpi(funstrwords{i}(1),{'print';'deallocate';'call';'error';'return';'allocate'}))
fid=0;
end
if fid
funstr{i}=['print *,''',funstr{i}(1:end-1),''',',funstr{i}];
updatefunstr(i);
if length(find(strcmp('print',fortranfunwords)))==0
fortranfunwords{length(fortranfunwords)+1}='print';
end
end
end
end
if count==1, break; end
end
end
if want_kb,disp('finished fixing scalar assignments'),disp(r),showall(funstr),disp(r),keyboard,end
if want_fb&(~want_kb),fprintf(1,' finished \n');end
%%%catch
%%% disp(r);disp(funstr{i});disp(['line number ',num2str(i)]);disp(lasterr);disp(r);
%%% disp('Conversion error in preceeding line.');
%%% disp('Try to continue? [y,<return>]');
%%% tempans=input('or enter keyboard mode? [n,k]','s');
%%% if ~isempty(tempans), if ((tempans=='n')|(tempans=='k')), keyboard, end, end
%%%end
fprintf(1,[' ',num2str(s),' lines',r]);
%showall(funstr),keyboard
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% Done with swithover routines %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Switch brackets if want_br==0
if want_br==0
for i=1:s
temp=findstr('[',funstr{i});
count=0;
for j=1:length(temp)
funstr{i}=[funstr{i}(1:temp(j)-1+count),'(/',funstr{i}(temp(j)+1+count:end)];
count=count+1;
end
updatefunstr(i);
end
for i=1:s
temp=findstr(']',funstr{i});
count=0;
for j=1:length(temp)
funstr{i}=[funstr{i}(1:temp(j)-1+count),'/)',funstr{i}(temp(j)+1+count:end)];
count=count+1;
end
updatefunstr(i);
end
end
% Now make the call to make_mex_gateway
if ~want_sb
if want_kb, disp([' Calling make_mex_gateway']);end
make_mex_gateway(filename,inoutother,cw,vararginout,localvartype,want_fb,want_kb,alpha);
else
if want_kb, disp([' Calling make_mex_subroutine']);end
make_mex_subroutine(filename,inoutother,cw,vararginout,localvartype,want_sb-1,want_fb,want_kb,recursive);
end
% Add other variables (inoutother{3}) to fortran declaration list with sizes
filenamef=[filename,'.f90'];
if exist(filenamef)==2
fid=fopen(filenamef);
filestr=fscanf(fid,'%c');
fclose(fid);
else
error('Didn''t produce a gateway fortran file for some reason...');
end
if want_al
% intial allocatable var decs
temp=['All other local variables',r];
dummy=findstr(temp,filestr);
%First we need to decide whether the local vars are complexes or reals.
for i=1:length(inoutother{3})
goon=0;
if ~isempty(vararginlocal)
temp2=0;
for k=1:length(vararginlocal)
if length(find(strcmp(vararginlocal{k}{1},inoutother{3}{i})))>0
temp2=find(strcmp(vararginlocal{k}{2},inoutother{1}));
temp3=k;
end
end
%If the size was specified as an input...
if temp2>0
if prod(size(getfield(cw,inoutother{1}{temp2})))>1
%%% if want_sb==0
%%% tempstr=['',localvartype{i},', allocatable :: ',inoutother{3}{i},'(',vararginlocal{temp3}{2},'_m,',vararginlocal{temp3}{2},'_n)',r];
%%% else
tempstr=['',localvartype{i},', allocatable :: ',inoutother{3}{i},'(size(',vararginlocal{temp3}{2},',1),size(',vararginlocal{temp3}{2},',2))',r];
%%% end
else
tempstr=['',localvartype{i},', allocatable :: ',inoutother{3}{i},r];
end
goon=1;
end
end
%If we have to decide its size dynamically
if goon==0
temp3=0;temp2=[0 0];clear temp5;temp5{1}='';temp5{2}='';
for j=1:length(inoutother{1})
if ((size(getfield(cw,inoutother{3}{i}),1)==size(getfield(cw,inoutother{1}{j}),1))&(size(getfield(cw,inoutother{3}{i}),2)==size(getfield(cw,inoutother{1}{j}),2)))
temp3=j;temp2=[0 0];temp5{1}='_m';temp5{2}='_n';
if want_fb|want_kb
if i<11
disp([' Setting the size of local var ',inoutother{3}{i},' equal to the size of input var ',inoutother{1}{j},'.']);
end
end
break
end
if size(getfield(cw,inoutother{3}{i}),1)==size(getfield(cw,inoutother{1}{j}),1)
if size(getfield(cw,inoutother{3}{i}),1)~=1
temp3=inf;temp2(1)=j;temp5{1}='_m';temp5{3}='1';
end
end
if size(getfield(cw,inoutother{3}{i}),1)==size(getfield(cw,inoutother{1}{j}),2)
if size(getfield(cw,inoutother{3}{i}),1)~=1
temp3=inf;temp2(1)=j;temp5{1}='_n';temp5{3}='2';
end
end
if size(getfield(cw,inoutother{3}{i}),2)==size(getfield(cw,inoutother{1}{j}),1)
if size(getfield(cw,inoutother{3}{i}),2)~=1
temp3=inf;temp2(2)=j;temp5{2}='_m';temp5{4}='1';
end
end
if size(getfield(cw,inoutother{3}{i}),2)==size(getfield(cw,inoutother{1}{j}),2)
if size(getfield(cw,inoutother{3}{i}),2)~=1
temp3=inf;temp2(2)=j;temp5{2}='_n';temp5{4}='2';
end
end
end
if temp3~=0
if ~isinf(temp3)
%This local var's dimensions matches axactly with an input var's
if prod(size(getfield(cw,inoutother{1}{temp3})))>1
%%% if want_sb==0
%%% tempstr=['',localvartype{i},', allocatable :: ',inoutother{3}{i},'(',inoutother{1}{temp3},'_m,',inoutother{1}{temp3},'_n)',r];
%%% else
tempstr=['',localvartype{i},', allocatable :: ',inoutother{3}{i},'(:,:)',r];
%%% end
else
if ~isreal(getfield(cw,inoutother{1}{temp3}))
tempstr=['complex ',inoutother{3}{i},r];
else
tempstr=['',localvartype{i},' ',inoutother{3}{i},r];
end
end
else
%This local var size matches some dimensions but not exactly w/ one input
temp1=size(getfield(cw,inoutother{3}{i}));
if ((temp1(1)==1)&(temp1(2)==1))
tempstr=['',localvartype{i},' ',inoutother{3}{i},r];
else
tempstr=['',localvartype{i},', allocatable :: ',inoutother{3}{i},'(:,:)',r];
end
end
else
%So this local var matches none of the inputs
temp1=size(getfield(cw,inoutother{3}{i}));
if ((temp1(1)==1)&(temp1(2)==1))
tempstr=['',localvartype{i},' ',inoutother{3}{i},r];
else
tempstr=['',localvartype{i},' ',inoutother{3}{i},'(',num2str(temp1(1)),',',num2str(temp1(2)),')',r];
end
end
end
filestr=[filestr(1:dummy+length(temp)-1),tempstr,filestr(dummy+length(temp):length(filestr))];
end
%now for the allocation line
tempstr_al='allocate(';temp6='';
for i=1:length(inoutother{3})
goon=0;
if ~isempty(vararginlocal)
temp2=0;
for k=1:length(vararginlocal)
if length(find(strcmp(vararginlocal{k}{1},inoutother{3}{i})))>0
temp2=find(strcmp(vararginlocal{k}{2},inoutother{1}));
temp3=k;
end
end
%If the size was specified as an input...
if temp2>0
if prod(size(getfield(cw,inoutother{1}{temp2})))>1
tempstr_al=[tempstr_al,temp6,'',' ',inoutother{3}{i},'(size(',vararginlocal{temp3}{2},',1),size(',vararginlocal{temp3}{2},',2))'];
temp6=',';
else
%tempstr_al=[tempstr_al,'',' ',inoutother{3}{i}];
end
goon=1;
end
end
%If we have to decide its size dynamically
if goon==0
temp3=0;temp2=[0 0];clear temp5;temp5{1}='';temp5{2}='';
for j=1:length(inoutother{1})
if ((size(getfield(cw,inoutother{3}{i}),1)==size(getfield(cw,inoutother{1}{j}),1))&(size(getfield(cw,inoutother{3}{i}),2)==size(getfield(cw,inoutother{1}{j}),2)))
temp3=j;temp2=[0 0];temp5{1}='_m';temp5{2}='_n';
if want_fb|want_kb
if i<11
disp([' Setting the size of local var ',inoutother{3}{i},' equal to the size of input var ',inoutother{1}{j},'.']);
end
end
break
end
if size(getfield(cw,inoutother{3}{i}),1)==size(getfield(cw,inoutother{1}{j}),1)
if size(getfield(cw,inoutother{3}{i}),1)~=1
temp3=inf;temp2(1)=j;temp5{1}='_m';temp5{3}='1';
end
end
if size(getfield(cw,inoutother{3}{i}),1)==size(getfield(cw,inoutother{1}{j}),2)
if size(getfield(cw,inoutother{3}{i}),1)~=1
temp3=inf;temp2(1)=j;temp5{1}='_n';temp5{3}='2';
end
end
if size(getfield(cw,inoutother{3}{i}),2)==size(getfield(cw,inoutother{1}{j}),1)
if size(getfield(cw,inoutother{3}{i}),2)~=1
temp3=inf;temp2(2)=j;temp5{2}='_m';temp5{4}='1';
end
end
if size(getfield(cw,inoutother{3}{i}),2)==size(getfield(cw,inoutother{1}{j}),2)
if size(getfield(cw,inoutother{3}{i}),2)~=1
temp3=inf;temp2(2)=j;temp5{2}='_n';temp5{4}='2';
end
end
end
%%% if strcmp(inoutother{3}{i},'yout')
%%% 'eeeeeeeeeeeeee',kb
%%% end
if temp3~=0
fid=1;
if ~isinf(temp3)
%This local var's dimensions matches axactly with an input var's
if prod(size(getfield(cw,inoutother{1}{temp3})))>1
tempstr_al=[tempstr_al,temp6,'',' ',inoutother{3}{i},'(size(',inoutother{1}{temp3},',1),size(',inoutother{1}{temp3},',2))'];
temp6=',';
else
%%% if ~isreal(getfield(cw,inoutother{1}{temp3}))
%%% tempstr_al=[tempstr_al,'complex ',inoutother{3}{i}];
%%% else
%%% tempstr_al=[tempstr_al,'',' ',inoutother{3}{i}];
%%% end
end
else
%This local var size matches some dimensions but not exactly w/ one input
temp1=size(getfield(cw,inoutother{3}{i}));
if ((temp1(1)==1)&(temp1(2)==1))
%tempstr_al=[tempstr_al,'',' ',inoutother{3}{i}];
else
if all(temp2)
tempstr_al=[tempstr_al,temp6,'',' ',inoutother{3}{i},'(size(',inoutother{1}{temp2(1)},',',temp5{3},'),size(',inoutother{1}{temp2(2)},',',temp5{4},'))'];
temp6=',';
elseif temp2(1)
tempstr_al=[tempstr_al,temp6,'',' ',inoutother{3}{i},'(size(',inoutother{1}{temp2(1)},',',temp5{3},'),',num2str(temp1(2)),')'];
temp6=',';
elseif temp2(2)
tempstr_al=[tempstr_al,temp6,'',' ',inoutother{3}{i},'(',num2str(temp1(1)),',size(',inoutother{1}{temp2(2)},',',temp5{4},'))'];
temp6=',';
end
end
end
else
fid=0;
%So this local var matches none of the inputs, for this, do nothing
temp1=size(getfield(cw,inoutother{3}{i}));
if ((temp1(1)==1)&(temp1(2)==1))
%tempstr_al=[tempstr_al,'',' ',inoutother{3}{i}];
else
%tempstr_al=[tempstr_al,'',' ',inoutother{3}{i},'(',num2str(temp1(1)),',',num2str(temp1(2)),')'];
end
end
end
%%% if i~=length(inoutother{3}) & prod(size(getfield(cw,inoutother{3}{i})))>1 & fid
%%% tempstr_al=[tempstr_al,','];
%%% end
end
if length(inoutother{3})>0
tempstr_al=[tempstr_al,')'];
else
tempstr_al='';
end
%now for the deallocation line
tempstr_de='deallocate(';temp6='';
for i=1:length(inoutother{3})
goon=0;
if ~isempty(vararginlocal)
temp2=0;
for k=1:length(vararginlocal)
if length(find(strcmp(vararginlocal{k}{1},inoutother{3}{i})))>0
temp2=find(strcmp(vararginlocal{k}{2},inoutother{1}));
temp3=k;
end
end
%If the size was specified as an input...
if temp2>0
if prod(size(getfield(cw,inoutother{1}{temp2})))>1
tempstr_de=[tempstr_de,temp6,'',' ',inoutother{3}{i}];
temp6=',';
else
%tempstr_de=[tempstr_de,'',' ',inoutother{3}{i}];
end
goon=1;
end
end
%If we have to decide its size dynamically
if goon==0
temp3=0;temp2=[0 0];clear temp5;temp5{1}='';temp5{2}='';
for j=1:length(inoutother{1})
if ((size(getfield(cw,inoutother{3}{i}),1)==size(getfield(cw,inoutother{1}{j}),1))&(size(getfield(cw,inoutother{3}{i}),2)==size(getfield(cw,inoutother{1}{j}),2)))
temp3=j;temp2=[0 0];temp5{1}='_m';temp5{2}='_n';
if want_fb|want_kb
if i<11
disp([' Setting the size of local var ',inoutother{3}{i},' equal to the size of input var ',inoutother{1}{j},'.']);
end
end
break
end
if size(getfield(cw,inoutother{3}{i}),1)==size(getfield(cw,inoutother{1}{j}),1)
if size(getfield(cw,inoutother{3}{i}),1)~=1
temp3=inf;temp2(1)=j;temp5{1}='_m';temp5{3}='1';
end
end
if size(getfield(cw,inoutother{3}{i}),1)==size(getfield(cw,inoutother{1}{j}),2)
if size(getfield(cw,inoutother{3}{i}),1)~=1
temp3=inf;temp2(1)=j;temp5{1}='_n';temp5{3}='2';
end
end
if size(getfield(cw,inoutother{3}{i}),2)==size(getfield(cw,inoutother{1}{j}),1)
if size(getfield(cw,inoutother{3}{i}),2)~=1
temp3=inf;temp2(2)=j;temp5{2}='_m';temp5{4}='1';
end
end
if size(getfield(cw,inoutother{3}{i}),2)==size(getfield(cw,inoutother{1}{j}),2)
if size(getfield(cw,inoutother{3}{i}),2)~=1
temp3=inf;temp2(2)=j;temp5{2}='_n';temp5{4}='2';
end
end
end
if temp3~=0
fid=1;
if ~isinf(temp3)
%This local var's dimensions matches axactly with an input var's
if prod(size(getfield(cw,inoutother{1}{temp3})))>1
tempstr_de=[tempstr_de,temp6,'',' ',inoutother{3}{i}];
temp6=',';
else
%%% if ~isreal(getfield(cw,inoutother{1}{temp3}))
%%% tempstr_de=[tempstr_de,'complex ',inoutother{3}{i}];
%%% else
%%% tempstr_de=[tempstr_de,'',' ',inoutother{3}{i}];
%%% end
end
else
%This local var size matches some dimensions but not exactly w/ one input
temp1=size(getfield(cw,inoutother{3}{i}));
if ((temp1(1)==1)&(temp1(2)==1))
%tempstr_de=[tempstr_de,'',' ',inoutother{3}{i}];
else
if all(temp2)
tempstr_de=[tempstr_de,temp6,'',' ',inoutother{3}{i}];
temp6=',';
elseif temp2(1)
tempstr_de=[tempstr_de,temp6,'',' ',inoutother{3}{i}];
temp6=',';
elseif temp2(2)
tempstr_de=[tempstr_de,temp6,'',' ',inoutother{3}{i}];
temp6=',';
end
end
end
else
fid=0;
%So this local var matches none of the inputs, do nothing
temp1=size(getfield(cw,inoutother{3}{i}));
if ((temp1(1)==1)&(temp1(2)==1))
%tempstr_de=[tempstr_de,'',' ',inoutother{3}{i}];
else
%tempstr_de=[tempstr_de,'',' ',inoutother{3}{i}];
end
end
end
%%% if i~=length(inoutother{3}) & prod(size(getfield(cw,inoutother{3}{i})))>1 & fid
%%% tempstr_de=[tempstr_de,','];
%%% end
end
if length(inoutother{3})>0
tempstr_de=[tempstr_de,')'];
else
tempstr_de='';
end
else
%old way
temp=['All other local variables',r];
dummy=findstr(temp,filestr);
%First we need to decide whether the local vars are complexes or reals.
for i=1:length(inoutother{3})
goon=0;
if ~isempty(vararginlocal)
temp2=0;
for k=1:length(vararginlocal)
if length(find(strcmp(vararginlocal{k}{1},inoutother{3}{i})))>0
temp2=find(strcmp(vararginlocal{k}{2},inoutother{1}));
temp3=k;
end
end
%If the size was specified as an input...
if temp2>0
if prod(size(getfield(cw,inoutother{1}{temp2})))>1
%%% if want_sb==0
%%% tempstr=['',localvartype{i},' ',inoutother{3}{i},'(',vararginlocal{temp3}{2},'_m,',vararginlocal{temp3}{2},'_n)',r];
%%% else
tempstr=['',localvartype{i},' ',inoutother{3}{i},'(size(',vararginlocal{temp3}{2},',1),size(',vararginlocal{temp3}{2},',2))',r];
%%% end
else
tempstr=['',localvartype{i},' ',inoutother{3}{i},r];
end
goon=1;
end
end
%If we have to decide its size dynamically
if goon==0
temp3=0;temp2=[0 0];clear temp5;temp5{1}='';temp5{2}='';
for j=1:length(inoutother{1})
if ((size(getfield(cw,inoutother{3}{i}),1)==size(getfield(cw,inoutother{1}{j}),1))&(size(getfield(cw,inoutother{3}{i}),2)==size(getfield(cw,inoutother{1}{j}),2)))
temp3=j;temp2=[0 0];temp5{1}='_m';temp5{2}='_n';
if want_fb|want_kb
if i<11
disp([' Setting the size of local var ',inoutother{3}{i},' equal to the size of input var ',inoutother{1}{j},'.']);
end
end
break
end
if size(getfield(cw,inoutother{3}{i}),1)==size(getfield(cw,inoutother{1}{j}),1)
if size(getfield(cw,inoutother{3}{i}),1)~=1
temp3=inf;temp2(1)=j;temp5{1}='_m';temp5{3}='1';
end
end
if size(getfield(cw,inoutother{3}{i}),1)==size(getfield(cw,inoutother{1}{j}),2)
if size(getfield(cw,inoutother{3}{i}),1)~=1
temp3=inf;temp2(1)=j;temp5{1}='_n';temp5{3}='2';
end
end
if size(getfield(cw,inoutother{3}{i}),2)==size(getfield(cw,inoutother{1}{j}),1)
if size(getfield(cw,inoutother{3}{i}),2)~=1
temp3=inf;temp2(2)=j;temp5{2}='_m';temp5{4}='1';
end
end
if size(getfield(cw,inoutother{3}{i}),2)==size(getfield(cw,inoutother{1}{j}),2)
if size(getfield(cw,inoutother{3}{i}),2)~=1
temp3=inf;temp2(2)=j;temp5{2}='_n';temp5{4}='2';
end
end
end
if temp3~=0
if ~isinf(temp3)
%This local var's dimensions matches axactly with an input var's
if prod(size(getfield(cw,inoutother{1}{temp3})))>1
%%% if want_sb==0
%%% tempstr=['',localvartype{i},' ',inoutother{3}{i},'(',inoutother{1}{temp3},'_m,',inoutother{1}{temp3},'_n)',r];
%%% else
tempstr=['',localvartype{i},' ',inoutother{3}{i},'(size(',inoutother{1}{temp3},',1),size(',inoutother{1}{temp3},',2))',r];
%%% end
else
if ~isreal(getfield(cw,inoutother{1}{temp3}))
tempstr=['complex ',inoutother{3}{i},r];
else
tempstr=['',localvartype{i},' ',inoutother{3}{i},r];
end
end
else
%This local var size matches some dimensions but not exactly w/ one input
temp1=size(getfield(cw,inoutother{3}{i}));
if ((temp1(1)==1)&(temp1(2)==1))
tempstr=['',localvartype{i},' ',inoutother{3}{i},r];
else
if all(temp2)
%%% if want_sb==0
%%% tempstr=['',localvartype{i},' ',inoutother{3}{i},'(',inoutother{1}{temp2(1)},temp5{1},',',inoutother{1}{temp2(2)},temp5{2},')',r];
%%% else
tempstr=['',localvartype{i},' ',inoutother{3}{i},'(size(',inoutother{1}{temp2(1)},',',temp5{3},'),size(',inoutother{1}{temp2(2)},',',temp5{4},'))',r];
%%% end
elseif temp2(1)
%%% if want_sb==0
%%% tempstr=['',localvartype{i},' ',inoutother{3}{i},'(',inoutother{1}{temp2(1)},temp5{1},',',num2str(temp1(2)),')',r];
%%% else
tempstr=['',localvartype{i},' ',inoutother{3}{i},'(size(',inoutother{1}{temp2(1)},',',temp5{3},'),',num2str(temp1(2)),')',r];
%%% end
elseif temp2(2)
%%% if want_sb==0
%%% tempstr=['',localvartype{i},' ',inoutother{3}{i},'(',num2str(temp1(1)),',',inoutother{1}{temp2(2)},temp5{2},')',r];
%%% else
tempstr=['',localvartype{i},' ',inoutother{3}{i},'(',num2str(temp1(1)),',size(',inoutother{1}{temp2(2)},',',temp5{4},'))',r];
%%% end
end
end
end
else
%So this local var matches none of the inputs
temp1=size(getfield(cw,inoutother{3}{i}));
if ((temp1(1)==1)&(temp1(2)==1))
tempstr=['',localvartype{i},' ',inoutother{3}{i},r];
else
tempstr=['',localvartype{i},' ',inoutother{3}{i},'(',num2str(temp1(1)),',',num2str(temp1(2)),')',r];
end
end
end
filestr=[filestr(1:dummy+length(temp)-1),tempstr,filestr(dummy+length(temp):length(filestr))];
end
end
if want_fb|want_kb
if i>10
disp(' . . .');
end
end
%Add pim eps, and iji if we need them.
temp=['! All other local variables'];
dummy=findstr(temp,filestr);
if length(findstr([funstr{:}],'iji='))>0
temp2=['integer iji',r];
else
temp2='';
end
if needpi==1
if needeps==1
temp1=['! Matlab function pointers',r,...
'real, parameter :: pi=3.141592653589793238',r,...
'real, parameter :: eps=2.220446049250313e-16',r,temp2];
else
temp1=['! Matlab function pointers',r,...
'real, parameter :: pi=3.141592653589793238',r,temp2];
end
else
if needeps==1
temp1=['! Matlab function pointers',r,...
'real, parameter :: eps=2.220446049250313e-16',r,temp2];
else
temp1=['! Matlab function pointers',r,temp2];
end
end
filestr=[filestr(1:(dummy-1)),temp1,filestr(dummy:length(filestr)),r];
%Add the pointer vars for m-file calls.
temp=['! All other local variables'];
dummy=findstr(temp,filestr);
temp1='';
if maxTRC(1)>0
temp1=[temp1,'real, pointer, dimension(:,:) :: '];
for i=1:maxTRC(1)
if i~=maxTRC(1)
temp1=[temp1,'mxTR',num2str(i),', '];
else
temp1=[temp1,'mxTR',num2str(i),r];
end
end
end
if maxTRC(2)>0
temp1=[temp1,'complex, pointer, dimension(:,:) :: '];
for i=1:maxTRC(2)
if i~=maxTRC(2)
temp1=[temp1,'mxTC',num2str(i),', '];
else
temp1=[temp1,'mxTC',num2str(i),r];
end
end
end
if maxTRC(3)>0
temp1=[temp1,'integer, pointer, dimension(:,:) :: '];
for i=1:maxTRC(3)
if i~=maxTRC(3)
temp1=[temp1,'mxTI',num2str(i),', '];
else
temp1=[temp1,'mxTI',num2str(i),r];
end
end
end
filestr=[filestr(1:(dummy-1)),temp1,filestr(dummy:length(filestr)),r];
%Add the use command for what we need.
temp=['! size variables'];
dummy=findstr(temp,filestr);
if want_sb==0
temp1=['! Before anything, list what modules we will use.',r,...
'use mexfunctions; use mexoperators; use mexcallback',r];
else
temp1=['! Before anything, list what modules we will use.',r,...
'use mexoperators; use mexcallback',r];
end
filestr=[filestr(1:(dummy-1)),temp1,filestr(dummy:length(filestr)),r];
%We must change the file a bit to allow for scalars.
% First make the var declaration scalar if need be for ins and outs
if want_sb==0
temp1=['! Input/Output local mirrors'];
temp2=['! Matlab function pointers'];
dummy(1)=findstr(temp1,filestr);
dummy(2)=findstr(temp2,filestr);
tempstr=filestr((dummy(1)+length(temp1)+1):(dummy(2)-1));
for i=1:length(inoutother{2})
if prod(size(getfield(cw,inoutother{2}{i})))==1
rets=findstr(r,tempstr);
temp3=findstr([' ',inoutother{2}{i},''],tempstr);
temp=rets(rets>temp3);temp=temp(1);
tempstr=[tempstr(1:(temp3+length([' ',inoutother{2}{i},''])-1)),tempstr(temp:length(tempstr))];
end
end
filestr=[filestr(1:(dummy(1)+length(temp1))),tempstr,filestr((dummy(2)):length(filestr))];
for i=1:length(inoutother{2})
if prod(size(getfield(cw,inoutother{2}{i})))==1
rets=findstr(r,filestr);
temp3=findstr(['call ',filename,'('],filestr);
temp1=rets(rets<temp3);temp1=temp1(end);
temp=rets(rets>temp3);temp=temp(1);
tempstr=filestr((temp1)+1:(temp)-1);
tempstr=regexprep(tempstr,['(\W)(',inoutother{2}{i},')(\W)'],'$1$2(1,1)$3');
filestr=[filestr(1:(temp1)),tempstr,filestr((temp):end)];
end
end
for i=1:length(inoutother{1})
if prod(size(getfield(cw,inoutother{1}{i})))==1
rets=findstr(r,filestr);
temp3=findstr(['call ',filename,'('],filestr);
temp1=rets(rets<temp3);temp1=temp1(end);
temp=rets(rets>temp3);temp=temp(1);
tempstr=filestr((temp1)+1:(temp)-1);
tempstr=regexprep(tempstr,['(\W)(',inoutother{1}{i},')(\W)'],'$1$2(1,1)$3');
filestr=[filestr(1:(temp1)),tempstr,filestr((temp):end)];
end
end
end
%Set all local and output variables = 0 if want_0 is 1
if want_0
temp=['! Fill in vars going in and out'];
dummy=findstr(temp,filestr);
count=1;temp1='';
for i=1:length(inoutother{2})
temp1=[temp1,inoutother{2}{i},'=0;'];
count=count+1;
end
for i=1:length(inoutother{3})
temp1=[temp1,inoutother{3}{i},'=0;'];
count=count+1;
end
if temp1(length(temp1))~=r, temp1=[temp1,r]; end
filestr=[filestr(1:(dummy-1)),temp1,filestr(dummy:length(filestr)),r];
end
%And finally the main interpreted body of the function
temp= ['! --- Main computational routine. ---------------------------------!',r];
dummy=findstr(temp,filestr);
%test to see if we need to include the de/allocate statements
fid=0;
for i=1:length(inoutother{3})
if prod(size(getfield(cw,inoutother{3}{i})))>1
fid=1;
end % if prod(size(getfield(cw,
end % for i=1:length(inoutother{3})
if want_al & fid
filestr=[filestr(1:(dummy-1)),tempstr_al,r,filestr(dummy:length(filestr)),r];
dummy=findstr(temp,filestr);
filestr=[filestr(1:dummy+length(temp)),tempstr_de,filestr(dummy+length(temp):length(filestr))];
end
updatefunstr;
for i=s:-1:1
filestr=[filestr(1:dummy+length(temp)-1),...
'',funstr{i}(1:end-1),r...
,filestr(dummy+length(temp):length(filestr))];
end
dummy=length(varargin);
if want_sb==0
filestr=[filestr,...
'!------------------------------------------------------------------!',r,...
'! This file generated by matlab2fmex: ',datestr(now),' !'];
filestr=[filestr,r,...
'!------------------------------------------------------------------!'];
filestr=[filestr,r];
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Steps precursing compilation
%First thing is to convert and add all the subroutines
if ((~want_sb)&(iscell(filename_al)))
for i=2:max(size(filename_al))
if ((iscell(tempflagin_all))&(max(size(tempflagin_all))>(i-1)))
tempstr=tempflagin_all{i};
else
tempstr=tempflagin;
end
tempstr(8)=suborfun(i)+1;
fid=['[temp,temp1,temp2,temp3,tempflag,temp4]=matlab2fmex({filename_al{i} filename_al{1:i-1} filename_al{i+1:max(size(filename_al))}},tempstr'];
for j=1:max(size(vararginout_all))
if ((max(size(vararginout_all{j}))>=i)&(iscell(vararginout_all{j}{i})))
fid=[fid,',vararginout_all{',num2str(j),'}{',num2str(i),'}'];
end
end
fid=[fid,');'];
eval(fid);
%Set suborfun as the result of this conversion
suborfun=suborfun&temp4;
%Now add those subroutines procedures and code to the main mex file
mexfunctions=[mexfunctions,temp{1}];
%mexfunctions,suborfun,kb
end
end
%Now make the modules
if ((want_fb|want_kb)&(want_ct)), disp([' Creating mexcallback module...']); end
dummy=makeMexcallbackmodule(maxmxinputs,maxmxinputs0,alpha);
out{3}=dummy;
if ((want_fb|want_kb)&(want_ct)), disp([' Creating mexoperators module...']); end
for i=1:length(needed_interfaces{1,1})
if strcmp(needed_interfaces{1,1}{i}(1:2),'mx')
eval(['[temp1,temp2,temp3]=',needed_interfaces{1,1}{i}(1:length(needed_interfaces{1,1}{i})),'_make(needed_interfaces{1,2}{i}(:,1));']);
else
eval(['[temp1,temp2,temp3]=',needed_interfaces{1,1}{i}(1:length(needed_interfaces{1,1}{i})-1),'_make(needed_interfaces{1,2}{i}(:,1));']);
end
mexoperatorinterfaces{1}=[mexoperatorinterfaces{1} temp1];
mexoperatorinterfaces{2}=[mexoperatorinterfaces{2} temp2 r];
end
dummy=[mexoperatorinterfaces{1} mexoperatorinterfaces{2} mexoperatorinterfaces{3}];
if alpha==1
temp=findstr('integer lhs(50), rhs(50)',dummy);
if ~isempty(temp)
for i=1:length(temp)
temp=findstr('integer lhs(50), rhs(50)',dummy);temp=temp(1);
dummy=[dummy(1:temp+6),'*8',dummy(temp+7:length(dummy))];
end
end
end
out{4}=dummy;
if want_ct
mexfunctions=['module mexfunctions',r,...
'contains',r,...
'subroutine placeholder(m)',r,...
'integer m',r,...
'end subroutine placeholder',r,r,...
mexfunctions,r,...
'end module mexfunctions',r];
if ((want_fb|want_kb)&(want_ct)), disp([' Creating mexfunctions module...']); end
out{2}=mexfunctions;
end
%Write converted file out
fid=fopen(filenamef,'w');
filestr=filestr(find(filestr~=char(9))); %Remove tabs from the file
%filestr=justify(filestr);
out{1}=filestr;
filestr=justify([out{4},r,r,r,out{3},r,r,r,out{2},r,r,r,out{1}],85);
% replace real and complex declarations with real(8) and complex(8)
filestr=regexprep(filestr, 'real(,*)(\s+)([\w:])','real(8)$1 $3','ignorecase');
filestr=regexprep(filestr, 'complex(,*)(\s+)([\w:])','complex(8)$1 $3','ignorecase');
%%%temp='\<(\d+\.\d+|\d+\.|\.\d+|\d+)([eE])([+-]?\d+)';
%%%filestr=regexprep(filestr,temp,'$1d$3');
%%%temp='\<(\d+\.\d+|\d+\.|\.\d+)([^0-9eEdD])';
%%%filestr=regexprep(filestr,temp,'$1d0$2');
fprintf(fid,'%c',filestr);
fclose(fid);
if want_fb|want_kb
disp([' ']);
disp(['Finished writing ',filenamef,':'])
if size(funstr,1)<20
showall(funstr,1);
else
showall(funstr(1:20),1);
disp([' . . .'])
end
disp([' ']);
if want_ct|want_fb
disp(['Starting compilation of ',filenamef])
end
end
if want_ct
if want_fb|want_kb
disp(['Calling mex to compile the output at ',filenamef]);
end
temp1=''; if want_fb, temp1=' -v'; end
disp([' ==> mex',temp1,' ',filenamef,' ',libraries]);
eval(['mex',temp1,' ',filenamef,' ',libraries]);
end
if want_kb,'At the end.',keyboard; end
warning on
%To run the following 4 examples as well as internew.m and internew_sep.m,
% run TESTING.m from the fulldistribution.
% This script needs ~300MB of RAM to run!
% Adjust variable sizes in TESTING.m for smaller amounts of RAM.
%
% For additional tests, run TESTING_uoi.m from the testsuite_m2f directory.
% This translates the same *.m files used in the Majic project at:
% http://polaris.cs.uiuc.edu/~galmasi/majic/majic.html
% and then compares matlab2fmex results with those of Majic.
%myfunc example statements
% matlab2fmex('myfunc');
% mex -v myfunc.f90
% x=rand(2);t=cputime;z=myfunc(x);cputime-t
% x=rand(550);t=cputime;z=myfunc(x);cputime-t
% x=rand(2000);t=cputime;z=myfunc(x);cputime-t
%zsdmn2 example statements
% matlab2fmex('zsdmn2',[0 0 0 0 1 0 0 0 0 0]);
% tt=cputime;out=zsdmn2(0,10,200+200i,500,1,10000,zeros(10002,1));cputime-tt
%gasket example statements
% matlab2fmex('gasket');
% n=5000000;g=zeros(1000,1000);t=cputime;g=gasket(n,g,ones(n,1));cputime-t
%nibble
%Other examples:
% load internew;Z=ones(length(bf),length(bf));vs=zeros(pos^2,pos^2);as=zeros(1,pos+1);t=cputime;Z=internew(v,c,bf,bfdir,clim,E0,k,pos,omega,mu0,epsilon0,vs,as,Z);cputime-t
% matlab2fmex('internew',[0 0 0 0 1 0 0 0 0 0]);
% load internew;Z=ones(length(bf),length(bf));vs=zeros(pos^2,pos^2);as=zeros(1,pos+1);t=cputime;Z=internew(v,c,bf,bfdir,clim,E0,k,pos,omega,mu0,epsilon0,vs,as,Z);cputime-t
% load internew_sep;Z=ones(length(bf),length(bf));vs=zeros(pos^2,pos^2);as=zeros(1,pos+1);t=cputime;Z=internew_sep(v,c,bf,bfdir,clim,E0,k,pos,omega,mu0,epsilon0,vs,as,Z);cputime-t
% matlab2fmex({'internew_sep' 'internew_pad'},[0 0 0 0 1 0 0 0 0 0]);
% load internew_sep;Z=ones(length(bf),length(bf));vs=zeros(pos^2,pos^2);as=zeros(1,pos+1);t=cputime;Z=internew_sep(v,c,bf,bfdir,clim,E0,k,pos,omega,mu0,epsilon0,vs,as,Z);cputime-t
% [Bn]=vsph_pro(40,3,0,0,zeros(70,1));
% matlab2fmex({'vsph_pro' 'dgauleg' 'lqmns' 'lpmns' 'spheigen' 'zsdmn' 'sphr1rat' 'sphang' 'MNcoef' 'MNsub' 'intang'});
% [Bn]=vsph_pro(40,3,0,0,zeros(70,1));
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%End matlab2fmex.
|
|