У меня есть набор кодов .f, написанных для компиляции в gfortran, и Makefile, который создает программу.
Я хотел бы использовать в качестве дополнительного кода NewCode.f90 в этой программе, но это .f90, и он написан для компиляции с использованием Ifort. Я написал файл make, чтобы он компилировал все коды в ifort, поскольку это необходимо для NewCode.f90:
FC=ifort
ARCH = linux
include SYS.$(ARCH)
MYFLGS = -O0 -pg -g -fbounds-check -Wall -fbacktrace -finit-real=nan
LINKFLAGS = -L$(MKLROOT)
FFLAGS = $(MYFLGS) -I$(INCDIR) -static
.SUFFIXES: .o .f .c .f90
.f.o:
$(FC) $(FFLAGS) -c $*.f
NewCode.o NewCode.f90:
$(FC) $(FFLAGS) -ffree-form NewCode.f90 -c
.c.o:
$(CC) $(CFLAGS) -c $*.c
OBJ = code1.o code2.o code3.o NewCode.o
default: nonlinear
nonlinear: setnl Program
setnl:
/bin/rm -f *.o *.bak core par.h
/bin/ln -sf INCLUDE/nonlinear.par par.h
clean:
/bin/rm -f *.o *.bak core par.h
/bin/rm -rf ../bin/*
cleanarch:
/bin/rm -f *.o *.bak core par.h
/bin/rm -f $(INSTDIR)/program
program: program.f program.o $(OBJ) par.h
$(FC) $(FFLAGS) $(LINKFLAGS) -o $@ program.o $(OBJ) $(LIBS) -Wl,--start-group -L$(MKLROOT)/lib/intel64 -lmkl_gf_ilp64 -lmkl_core -lmkl_sequential -Wl,--end-group -lpthread
Когда я создаю этот файл, он сталкивается с проблемами компиляции файлов, написанных (я думаю) на fortran 70, с использованием компилятора ifort. Например, программа вызывает функцию IPARITY:
FUNCTION IPARITY(l)
IMPLICIT REAL*4 (A-H, O-Z)
k = l/2
kk = 2*k - l
IF ( kk.EQ.0 ) THEN
IPARITY = 1
ELSE
IPARITY = -1
END IF
RETURN
END
Называя это, например:
PRINT *,IPARITY(1)
Когда я компилирую эту программу с помощью gfortran, эта функция компилируется и вызывается без каких-либо проблем, однако, когда я компилирую ее с помощью ifort, возникают проблемы. Похоже, компилятор ожидает, что IPARITY будет массивом:
An array-valued argument is required in this context.
Я попытался скомпилировать файлы, написанные на fortran 70, используя gfortran, и файлы в fortran 90, используя ifort, но мне не удалось получить это правильно:
COMP=ifort
ARCH=linux
...
...
.f.o:
$(FC) $(FFLAGS) -c $*.f
NewCode.o NewCode.f90:
$(COMP) $(FFLAGS) -ffree-form NewCode.f90 -c
.c.o:
$(CC) $(CFLAGS) -c $*.c
...
...
...
program: program.f program.o $(OBJ) par.h
$(FC) $(FFLAGS) $(LINKFLAGS) -o $@ program.o $(OBJ) $(LIBS) -Wl,--start-group -L$(MKLROOT)/lib/intel64 -lmkl_gf_ilp64 -lmkl_core -lmkl_sequential -Wl,--end-group -lpthread
Как бы то ни было, сумматор я поставил так:
program: program.f program.o $(OBJ) par.h
$(FC) ...
Or
program: program.f program.o $(OBJ) par.h
$(COMP) ...
Я получаю ошибки в кодах .f90 и .f соответственно.
Я думаю, что нужен либо тег в make-файле:
.f.o:
$(FC) $(FFLAGS) -c $*.f
Это сообщит компилятору, что он читает код fortran 70, но при этом компилируется правильно. Или флаг в строке комбайнера, который позволит разным кодам, скомпилированным с использованием разных компиляторов, составлять программу вместе.
Любой совет будет очень кстати.
Большое Вам спасибо
Джеймс
implicit none
и объявите все переменные. - person M. S. B.   schedule 25.07.2014implicit none
не доступен в стандарте. - person Vladimir F   schedule 25.07.2014