如何在fortran中定义二维数组

时间:2013-08-29 17:21:06

标签: fortran

我有一个目录,我需要在数组中对其值进行分类:
使用此代码

       ii=1      
 101   read(20,*,end=102)ra(ii),dec(ii),mag_g(ii),mag_r(ii),mag_i(ii),redshift(ii)   
       do i=1,n
          z(i)=zmin+(i-1)*step   
          zup(i)=z(i)+step
          do j=1,b      !mag loop
             mag(j)=mag_min+(j-1)*bin
             magup(j)=mag(j)+bin
             if (z(i) >= redshift(ii).and.redshift(ii) <= zup(i).and.mag(j) >= mag_i(ii).and.mag_i(ii) <= magup(j) ) then
                array(i,j)=mag_i(ii)
                write(4,'(2x,3f10.5,2x,4f10.5)')z(i),zup(i),redshift(ii),mag(j),magup(j),mag_i(ii),array(i,j)
             else 
                goto 103
             end if
          end do 
       end do   
 103   ii=ii+1  
       goto 101   
 102   total=ii-1

当我运行此代码时,它会覆盖每个维度中的所有值。 如何定义一个秩为s的二维数组(所有对象都适合if条件)。

谢谢

1 个答案:

答案 0 :(得分:0)

像斯特凡说的那样 - 你需要一个3D阵列。我发现您的代码存在一些可能的问题:

  • 行长(我不确定gfortran会使用默认设置编译它)
  • Gotos而不是循环
  • 界限/尺寸不清楚
  • 并非每个元素都可以设置
  • 维度的顺序(Fortran是专栏专业)

如果元素数量(索引ii)先验已知,我会建议以下内容:

! Allocate array
allocate( array( n, b, nElements ), stat=ierr )
if ( ierr .ne. 0 ) stop 'Cannot allocate memory!'
! Initialize array
array = 0

! Main loop
do ii=1,nElements
  read(20,*,iostat=ierr)ra(ii),dec(ii),mag_g(ii),mag_r(ii),mag_i(ii),redshift(ii)
  if ( ierr .ne. 0 ) stop 'Cannot read from unit 20!'

  ! Original loop 
  do i=1,n
    z(i)=zmin+(i-1)*step   
    zup(i)=z(i)+step
    do j=1,b      !mag loop
      mag(j)=mag_min+(j-1)*bin
      magup(j)=mag(j)+bin
      if (z(i) >= redshift(ii) .and.&
          redshift(ii) <= zup(i).and. &
          mag(j) >= mag_i(ii).and. &
          mag_i(ii) <= magup(j) ) then
        ! Write value
        array(i,j,ii)=mag_i(ii)
        write(4,'(2x,3f10.5,2x,4f10.5)') z(i),zup(i),redshift(ii), &
          mag(j),magup(j),mag_i(ii),array(i,j,ii)
      end if
    end do ! j
   end do ! i    
enddo ! ii

! [...]
! Clean up
if ( allocated(array) ) deallocate(array)

当然,这是Fortran 90/95,因此如果需要,您需要将其转换为Fortran 77。

如果元素的数量已知,您可以使用链式列表(根据问题可能会超大),或者定义上限并使用上面的代码。然后,您需要将循环中的stop语句更改为exit语句并存储实际的元素数。

如果您正在处理大型数组,我强烈建议您更改维度的顺序:

! Allocate array
allocate( array( b, n, nElements ), stat=ierr )
if ( ierr .ne. 0 ) stop 'Cannot allocate memory!'
! [...]
array(j,i,ii)  = mag_i(ii)