Fortran90でmoduleを使ってみました。Makefileもあります。
注意としては、最後に実行ファイルをコンパイルする際に、モジュールのオブジェクトファイル.oも一緒にリンクしないといけないという事です。そうしないと、
undefined reference to `matrix_mp_print_matrix_'
のようなエラーがでます。
main.f90
program main use matrix implicit none real(kind=8), allocatable, dimension(:,:):: a integer(kind=8), parameter :: d = 5 allocate(a(d,d)) a(:,:) = 0.1d0 call print_matrix(a) call set_matrix(a) call print_matrix(a) call set_matrix(a) call print_matrix(a) deallocate(a) end program main
matrix.f90
module matrix implicit none integer(kind=8), private :: iarg = 1 public set_matrix, print_matrix contains subroutine set_matrix(rarg) implicit none real(kind=8), intent(inout), dimension(:,:) :: rarg integer(kind=8) :: d1, d2 integer(kind=8) :: n, m d1 = size(rarg, 1) d2 = size(rarg, 2) do n=1, d1 do m=1, d2 rarg(n, m) = (m*n+1)*rarg(n,m) enddo enddo end subroutine set_matrix subroutine print_matrix(rarg) implicit none real(kind=8), intent(in), dimension(:,:) :: rarg integer(kind=8) :: d1, d2 integer(kind=8) :: n, m d1 = size(rarg, 1) d2 = size(rarg, 2) write(*, fmt='(a)') "matrix = " do n=1, d1 do m=1, d2 write(*, fmt='(f10.5)', advance='no') rarg(n, m) enddo write(*, *) enddo write(*, fmt='(a, i5)') "factor = ", iarg write(*, *) end subroutine print_matrix end module matrix
FC=ifort FCFLAGS=-O3 TRG=main OBJS=matrix.o MODULES=matrix.mod all: $(MODULES) main main: main.o $(OBJS) $(FC) $(FCFLAGS) -o $@ $^ ./$@ clean: $(RM) -f $(TRG) $(RM) -f *.o *.mod .SUFFIXES: .mod .f90 .o .f90.mod: $(FC) $(FCFLAGS) -c $< .f90.o: $(FC) $(FCFLAGS) -c -o $@ $<
Makefileは、拡張子mod用にSUFFIXSを指定してあげる必要があります。