2017-05-26 2 views
1

Ich versuche, das zuweisbare Array an die Subroutine übergeben. Wenn ich die serielle Version verwende, wie in How to pass allocatable arrays to subroutines in Fortran erwähnt, funktioniert es gut. Unten ist meine serielle Version des Codes.Übergeben des zuweisbaren Array zu Unterprogramm in Fortran mit MPI

module test 
contains 
subroutine func(a,sqa,n) 
    implicit none 
    integer, intent(in) :: n 
    integer, intent(in), dimension(:,:) :: a 
    integer, intent(out), dimension(:,:):: sqa 
    !local variables 
    integer :: i,j 
    do i= 1,n 
     do j = 1,2 
      sqa(i,j) = a(i,j)*a(i,j) 
      print *, 'i',i, 'j', j,'sqa(i,j)',sqa(i,j) 
     end do 
    end do 
end subroutine func 
end module test 

program main 
use test 
implicit none 
integer :: n,i,j 
integer, dimension(:,:), allocatable :: a, sqa 
print *, 'enter no of rows' 
read *, n 

allocate(a(1:n,2)) 
allocate(sqa(1:n,2)) 
do i = 1,n 
    do j = 1, 2 
     a(i,j) = i +j 
     print *, 'i =',i,'j =',j, a(i,j) 
    end do 
end do 
call func(a, sqa,n) 
deallocate(a,sqa) 
end program main 

Wenn ich beginnen mit MPI, meine parallele Version von Code zu implementieren ist

module test 
contains 
subroutine func(a,sqa,istart,iend) 
    implicit none 
    integer, intent(in) :: istart, iend 
    integer, intent(in), dimension(:,:) :: a 
    integer, intent(out),dimension(:,:) :: sqa 
    !local variables 
    integer :: i,j 
    do i= istart, iend 
     do j = 1,2 
      sqa(i,j) = a(i,j)*a(i,j) 
      print *, 'i',i, 'j', j,'sqa(i,j)',sqa(i,j) 
     end do 
    end do 
end subroutine func 
end module test 

program main 
use test 
use mpi 
implicit none 
integer :: istart, iend, ierr,nproc, procnum, n,& 
points_per_thread, i,j 
integer, dimension(:,:), allocatable :: a, sqa 
integer,dimension(mpi_status_size) :: status 
call mpi_init(ierr) 
call mpi_comm_size(mpi_comm_world, nproc, ierr) 
call mpi_comm_rank(mpi_comm_world,procnum, ierr) 
if(procnum == 0)then 
    print *, 'enter no of rows' 
    read *, n 
end if 
call mpi_bcast(n,1,mpi_integer,0,mpi_comm_world, ierr) 
points_per_thread = (n + nproc - 1)/nproc 
istart = procnum*points_per_thread + 1 
iend = min((procnum + 1)*points_per_thread,n) 
print *, 'istart ', istart, 'iend', iend, 'procnum', procnum 
call mpi_barrier(mpi_comm_world, ierr) 
allocate(a(istart:iend,2)) 
allocate(sqa(istart:iend,2)) 
do i = istart,iend 
    do j = 1, 2 
     a(i,j) = i +j 
     print *, 'i =',i,'j =',j, a(i,j) 
    end do 
end do 
call mpi_barrier(mpi_comm_world, ierr) 
call func(a(istart:iend,:), sqa(istart:iend,:),istart,iend) 
deallocate(a,sqa) 
call mpi_finalize(ierr) 
end program main 

Der obige Code den Segmentierungsfehler Fehler gibt. Ich verstehe den Grund dafür nicht.

Wenn als nächstes in meinem Unterprogramm func ich die Deklaration von Arrays ein und sqa zu

integer,intent(in):: a(istart:iend,2) 
integer, intent(out)::sqa(istart:iend,2) 

Jetzt ändern funktioniert es gut. Ich bitte darum, mir zu helfen, den Grund für den Fehler zu verstehen.

+0

Willkommen. Verwenden Sie tag [tag: fortran] für apl Fortran Fragen. –

+0

In welcher Zeile stürzt es ab? Was druckt es? Lernen Sie die Debugging-Funktionen Ihres Compilers kennen (zB '-g -fbacktrace -fcheck = all 'in gfortran und' -g -traceback -check' in ifort). –

+0

Die untere Grenze eines angenommenen Shape-Arrays ist standardmäßig 1. Wenn Sie möchten, dass es istart ist, müssen Sie es als 'array (istart:)' deklarieren. Siehe den doppelten Link für mehr. Oder ändern Sie einfach die Schleife zu 'i = 1, Größe (a, 1)' –

Antwort

1

Angenommene Form-Dummy-Arrays stellen die Erweiterung der tatsächlichen Argumente innerhalb der Funktion zur Verfügung, nicht aber ihre Grenzen. Wenn die tatsächlichen Grenzen innerhalb der Funktion benötigt werden, müssen Dummy-Arrays mit expliziter Form verwendet werden.

+0

Ich verstehe nicht, was Sie sagen. –

+0

Jetzt habe ich es, aber es ist nicht sehr klar. Wir sollten ein Duplikat haben. –

+0

Es ist nicht wahr, dass explizite Shape-Arrays verwendet werden müssen, damit gebundene Informationen verfügbar sind. – francescalus

Verwandte Themen