Fortran - 构造函数



下表描述了构造函数

函数 描述
merge(tsource, fsource, mask) 此函数连接两个数组。如果 mask 中的条件为 .true.,则它给出 tsource 中的元素;如果 mask 中的条件为 .false.,则给出 fsource 中的元素。两个字段 tsource 和 fsource 必须具有相同的类型和相同的形状。结果也具有此类型和形状。此外,mask 必须具有相同的形状。
pack(array, mask, vector) 它在 mask 的控制下将数组打包到向量中。逻辑数组 mask 的形状必须与数组的形状一致,否则 mask 必须是标量。如果包含 vector,它必须是秩为 1(即向量)的数组,其元素至少与 mask 中为真的元素一样多,并且与数组具有相同的类型。如果 mask 是值为 .true. 的标量,则 vector 必须具有与数组相同数量的元素。
spread(source, dim, ncopies) 它返回一个与参数 source 类型相同的数组,其秩增加一。参数 dim 和 ncopies 为整数。如果 ncopies 为负数,则改为使用零。如果 source 是标量,则 spread 变为一个向量,其中包含 ncopies 个元素,所有这些元素都与 source 的值相同。参数 dim 指示要扩展哪个索引。它必须在 1 和 1+(source 的秩) 之间,如果 source 是标量,则 dim 必须为 1。参数 ncopies 是新维度中元素的数量。
unpack(vector, mask, array)

它在 mask 的控制下将向量分散到数组中。逻辑数组 mask 的形状必须与数组的形状一致。数组 vector 必须具有秩 1(即它是一个向量),其元素至少与 mask 中为真的元素一样多,并且还必须与数组具有相同的类型。如果 array 给定为标量,则将其视为与 mask 形状相同且在所有位置都具有相同标量元素的数组。

结果将是一个与 mask 形状相同且与 vector 类型相同的数组。值将是来自 vector 的那些被接受的值,而在数组中的其余位置将保留旧值。

示例

以下示例演示了该概念

program arrayConstruction
implicit none
   interface
      subroutine write_array (a)
         real :: a(:,:)
      end subroutine write_array
      
      subroutine write_l_array (a)
         logical :: a(:,:)
      end subroutine write_l_array
   end interface

   real, dimension(2,3) :: tsource, fsource, result
   logical, dimension(2,3) :: mask
   
   tsource = reshape( (/ 35, 23, 18, 28, 26, 39 /), &
                    (/ 2, 3 /) )
   fsource = reshape( (/ -35, -23, -18, -28, -26, -39 /), &
                    (/ 2,3 /) )
   mask = reshape( (/ .true., .false., .false., .true., &
                 .false., .false. /), (/ 2,3 /) )

   result = merge(tsource, fsource, mask)
   call write_array(tsource)
   call write_array(fsource)
   call write_l_array(mask)
   call write_array(result)
   
end program arrayConstruction



subroutine write_array (a)

   real :: a(:,:)
   do i = lbound(a,1), ubound(a,1)
      write(*,*) (a(i, j), j = lbound(a,2), ubound(a,2) )
   end do
   return
   
end subroutine write_array


subroutine write_l_array (a)

   logical :: a(:,:)
   do i = lbound(a,1), ubound(a,1)
      write(*,*) (a(i, j), j= lbound(a,2), ubound(a,2))
   end do
   return
   
end subroutine write_l_array

当以上代码编译并执行时,会产生以下结果

35.0000000   18.0000000   26.0000000    
23.0000000   28.0000000   39.0000000    
-35.0000000  -18.0000000  -26.0000000    
-23.0000000  -28.0000000  -39.0000000    
T F F
F T F
35.0000000   -18.0000000  -26.0000000    
-23.0000000  28.0000000   -39.0000000    
fortran_arrays.htm
广告