Fortran - 构造函数

  • 简述

    下表描述了构造函数:
    函数 描述
    merge(tsource, fsource, mask) 此函数连接两个数组。如果掩码中的条件为 .true,它会给出 tsource 中的元素。如果掩码中的条件为 .false,则为 fsource。两个字段 tsource 和 fsource 必须是相同的类型和相同的形状。结果也是这种类型和形状。面具也必须具有相同的形状。
    pack(array, mask, vector) 它通过掩码的控制将一个数组打包到一个向量中。逻辑数组掩码的形状,必须与数组的形状一致,否则掩码必须是标量。如果包含向量,则它必须是秩为 1 的数组(即向量),其元素数量至少与掩码中为真的元素一样多,并且与数组具有相同的类型。如果掩码是值为 .true 的标量。那么向量必须具有与数组相同数量的元素。
    spread(source, dim, ncopies) 它返回一个与参数源相同类型的数组,其等级增加一。参数 dim 和 ncopies 是整数。如果 ncopies 为负数,则使用零值。如果 source 是一个标量,则 spread 成为一个向量,其中包含所有与 source 具有相同值的 ncopies 元素。参数 dim 指示要扩展哪个索引。它必须在 1 和 1+(源等级)的范围内,如果源是标量,则 dim 必须为 1。参数 ncopies 是新维度中的元素数。
    unpack(vector, mask, array)
    它在掩码的控制下将一个向量分散到一个数组中。逻辑数组掩码的形状必须与数组的形状一致。数组向量必须具有秩 1(即它是一个向量),其元素数量至少与掩码中为真的元素一样多,并且还必须具有与数组相同的类型。如果数组作为标量给出,那么它被认为是一个与掩码具有相同形状且到处都有相同标量元素的数组。
    结果将是一个与掩码具有相同形状和与向量相同类型的数组。这些值将是来自向量的那些被接受的值,而在数组中的其余位置,旧值将被保留。
    Example
    以下示例演示了该概念:
    
    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