Convert Fortran to MATLAB

조회 수: 12 (최근 30일)
Geopaul
Geopaul 2021년 8월 28일
답변: Ben Barrowes 2022년 11월 18일
I like to convert the following fortran code to matlab, I need help please:
!*PROGRAM TO COVERT SOUNDING DATA TO 2D RESISTIVITY DATA FILE *!
!------------------------------------------------------------------------!
IMPLICIT NONE
REAL::A,X,R,L,LN,N1,N2,LT
CHARACTER :: HEAD
CHARACTER(Len = 20) :: FNI,FNO,LOC
INTEGER :: I,N,SP,SPN, AT
!------------------------------------------------------------------------!
WRITE(*,*) ENTER INPUT FILE NAME (CASE SENSITIVE):’
READ(*,*) FNI
WRITE(*,*) ENTER OUTPUT FILE NAME:’
READ(*,*) FNO
WRITE(*,*)For Wenner=1;DipoleDipole=3,Schlumberger=7
WRITE(*,*)ENTER ARRAY TYPE:’
READ(*,*) AT
WRITE(*,*) ENTER NO OF DATA POINTS:’
READ(*,*) N
WRITE(*,*) ENTER MINIMUM SPACING:’
READ(*,*) A
OPEN (1,FILE=FNI,STATUS=OLD)
OPEN(2,FILE=FNO,STATUS=NEW)
READ(1,(A)) LOC
WRITE(2,*) LOC
READ(1,(A)) HEAD
WRITE(2,*) A
WRITE(2,*) AT
WRITE(2,*) N
WRITE(2,*) 1
WRITE(2,*) 0
SP=0
N2=0
DO 10 I=1,N
READ (1,*) LT,LN,X,R
N1=X/A
IF (N1.LT.N2) THEN
SP=SP+1
ENDIF
L=SP*A
N2=N1
IF (AT.EQ.1) THEN
WRITE(2,*) L,A,R
ENDIF
IF (AT.GT.1) THEN
WRITE(2,*) L,A,N2,R
ENDIF
10 CONTINUE
WRITE(2,*) 0
WRITE(2,*) 0
WRITE(2,*) 0
CLOSE(1)
CLOSE(2)
END
!------------------------------------------------------------------------!

채택된 답변

Image Analyst
Image Analyst 2021년 8월 28일
DO 10 I=1,N
goes to
for i = 1 : N
Replace
  1. READ with input,
  2. WRITE with fprintf,
  3. endif with end,
  4. .EQ. with ==,
  5. .GT. with >.
  6. ! with %
and so on. Here's a start (not working yet). I trust you'll be able to finish it
% PROGRAM TO COVERT SOUNDING DATA TO 2D RESISTIVITY DATA FILE
%------------------------------------------------------------------------
FNI = input('ENTER INPUT FILE NAME (CASE SENSITIVE):', 's')
FNO = input('ENTER OUTPUT FILE NAME:', 's')
fprintf('For Wenner=1;DipoleDipole=3,Schlumberger=7\n');
AT = input('ENTER ARRAY TYPE:')
N = input('ENTER NO OF DATA POINTS:')
A = input('ENTER MINIMUM SPACING:')
fh1 = fopen(FNI,'rt')
fh2 = fopen(FNO,'wt')
fread(fh1,'(A) %f\n', LOC)
fprintf(fh2, '%f\n', LOC)
fread(fh1, '(A) %f\n', HEAD)
fprintf(fh2, '%f\n', A)
fprintf(fh2, '%f\n', AT)
fprintf(fh2, '%f\n', N)
fprintf(fh2, '%f\n', 1)
fprintf(fh2, '%f\n', 0)
SP = 0
N2 = 0
for I = 1 : N
fread(fh1, '%f',LT,LN,X,R);
N1 = X / A
if (N1 < N2)
SP=SP+1
end
L = SP*A
N2 = N1
if (AT == 1)
fprintf(fh2, '%f, ', L,A,R)
end
if (AT > 1)
fprintf(fh2, '%f,', L,A,N2,R)
end
end
fprintf(fh2, '0\n0\n0\n')
fclose(fh1)
fclose(fh2)
I didn't do it all for you, so don't say "It doesn't work" because I know it doesn't work. Just run it and fix all remaining errors as they occur. A good way to learn MATLAB (well at least A way to learn MATLAB).

추가 답변 (1개)

Ben Barrowes
Ben Barrowes 2022년 11월 18일
Geopaul,
I used my f2matlab on your code to convert the fortran to matlab code. There are a few helper functions (like writeFmt) which are included in the attached zip file. Here is the resulting matlab code below.
%
%*PROGRAM TO COVERT SOUNDING DATA TO 2D RESISTIVITY DATA FILE *!
%------------------------------------------------------------------------!
function sound2d(varargin)
%
%
clear global;
clear functions;
global GlobInArgs nargs
GlobInArgs={mfilename,varargin{:}};
nargs=nargin+1;
global unit2fid;
if ~isempty(unit2fid);
unit2fid={};
end
persistent a at firstCall fni fno head i l ln loc_ml lt_fv n n1 n2 r sp spn x
;
if isempty(firstCall);
firstCall=1;
end;
if firstCall;
a=0.0;
at=0;
fni=blanks(20);
fno=blanks(20);
head=blanks(1);
i=0;
l=0.0;
ln=0.0;
loc_ml=blanks(20);
lt_fv=0.0;
n=0;
n1=0.0;
n2=0.0;
r=0.0;
sp=0;
spn=0;
x=0.0;
end
firstCall=0;
%------------------------------------------------------------------------!
[writeErrFlag,wfso]=writeFmt(1,['%v'],'''ENTER INPUT FILE NAME (CASE SENSITIVE):''');
eval(wfso);
fni=strAssign(fni,[],[],input('','s'));
[writeErrFlag,wfso]=writeFmt(1,['%v'],'''ENTER OUTPUT FILE NAME:''');
eval(wfso);
fno=strAssign(fno,[],[],input('','s'));
[writeErrFlag,wfso]=writeFmt(1,['%v'],'''For Wenner=1;DipoleDipole=3,Schlumberger=7''');
eval(wfso);
[writeErrFlag,wfso]=writeFmt(1,['%v'],'''ENTER ARRAY TYPE:''');
eval(wfso);
at=fix(str2num(input('','s')));
[writeErrFlag,wfso]=writeFmt(1,['%v'],'''ENTER NO OF DATA POINTS:''');
eval(wfso);
n=fix(str2num(input('','s')));
[writeErrFlag,wfso]=writeFmt(1,['%v'],'''ENTER MINIMUM SPACING:''');
eval(wfso);
a=str2num(input('','s'));
thismlfid=fopen(strtrim(fni),'r+');
unit2fid{end+1,1}=1001;
unit2fid{end,2}=thismlfid;
unit2fid{end,3}=0;
unit2fid{end,4}=strtrim(fni);
unit2fid{end,5}=0;
unit2fid{end,6}=0;
% unit2fid maps fortran unit numbers to matlab fid numbers
thismlfid=fopen(strtrim(fno),'w+');
unit2fid{end+1,1}=2;
unit2fid{end,2}=thismlfid;
unit2fid{end,3}=0;
unit2fid{end,4}=strtrim(fno);
unit2fid{end,5}=0;
unit2fid{end,6}=0;
% unit2fid maps fortran unit numbers to matlab fid numbers
[readErrFlag,readEndFlag,rfso,iostatdum]=readFmt(1001,['%c'],'loc_ml');
eval(rfso);
[writeErrFlag,wfso]=writeFmt(2,['%r'],'loc_ml');
eval(wfso);
[readErrFlag,readEndFlag,rfso,iostatdum]=readFmt(1001,['%c'],'head');
eval(rfso);
[writeErrFlag,wfso]=writeFmt(2,['%w'],'a');
eval(wfso);
[writeErrFlag,wfso]=writeFmt(2,['%w'],'at');
eval(wfso);
[writeErrFlag,wfso]=writeFmt(2,['%w'],'n');
eval(wfso);
[writeErrFlag,wfso]=writeFmt(2,['%v'],'''1''');
eval(wfso);
[writeErrFlag,wfso]=writeFmt(2,['%v'],'''0''');
eval(wfso);
sp = 0;
n2 = 0;
for i = 1: n
[readErrFlag,readEndFlag,rfso,iostatdum]=readFmt(1001,['%w','%w','%w','%w'],'lt_fv','ln','x','r');
eval(rfso);
n1 = x./a;
if(n1 < n2)
sp = fix(sp + 1);
end
l = sp.*a;
n2 = n1;
if(at == 1)
[writeErrFlag,wfso]=writeFmt(2,['%w','%w','%w'],'l','a','r');
eval(wfso);
end
if(at > 1)
[writeErrFlag,wfso]=writeFmt(2,['%w','%w','%w','%w'],'l','a','n2','r');
eval(wfso);
end
end
i = fix(n+1);
[writeErrFlag,wfso]=writeFmt(2,['%v'],'''0''');
eval(wfso);
[writeErrFlag,wfso]=writeFmt(2,['%v'],'''0''');
eval(wfso);
[writeErrFlag,wfso]=writeFmt(2,['%v'],'''0''');
eval(wfso);
try %try closing the file
fclose(unit2fid{[unit2fid{:,1}]==1,2});
if iscell(unit2fid{[unit2fid{:,1}]==1,6}) % is this a direct access file?
writecell(strtrim(unit2fid{[unit2fid{:,1}]==1,6}),'zztempfile.txt');
movefile('zztempfile.txt',strtrim(unit2fid{[unit2fid{:,1}]==1,4}));
end
unit2fid=unit2fid([unit2fid{:,1}]~=1,:);
catch
end
try %try closing the file
fclose(unit2fid{[unit2fid{:,1}]==2,2});
if iscell(unit2fid{[unit2fid{:,1}]==2,6}) % is this a direct access file?
writecell(strtrim(unit2fid{[unit2fid{:,1}]==2,6}),'zztempfile.txt');
movefile('zztempfile.txt',strtrim(unit2fid{[unit2fid{:,1}]==2,4}));
end
unit2fid=unit2fid([unit2fid{:,1}]~=2,:);
catch
end
closeAllOpenFiles(unit2fid);
end %program sound2d
%------------------------------------------------------------------------!

카테고리

Help CenterFile Exchange에서 Fortran with MATLAB에 대해 자세히 알아보기

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by