Fortran - Funciones de construcción

La siguiente tabla describe las funciones de construcción:

Función Descripción
fusionar (tsource, fsource, mask) Esta función une dos matrices. Da los elementos en tsource si la condición en la máscara es .true. y fsource si la condición en la máscara es .false. Los dos campos tsource y fsource deben ser del mismo tipo y de la misma forma. El resultado también es de este tipo y forma. Además, la máscara debe tener la misma forma.
paquete (matriz, máscara, vector) Empaqueta una matriz en un vector con el control de máscara. La forma de la máscara de la matriz lógica debe coincidir con la de la matriz o, de lo contrario, la máscara debe ser un escalar. Si se incluye vector, tiene que ser una matriz de rango 1 (es decir, un vector) con al menos tantos elementos como los que son verdaderos en la máscara y tener el mismo tipo que la matriz. Si la máscara es un escalar con el valor .true. entonces el vector en su lugar debe tener el mismo número de elementos que la matriz.
spread (fuente, tenue, ncopies) Devuelve una matriz del mismo tipo que la fuente del argumento con el rango aumentado en uno. Los parámetros dim y ncopies son enteros. si ncopies es negativo, se utiliza el valor cero en su lugar. Si la fuente es un escalar, spread se convierte en un vector con ncopies elementos que tienen el mismo valor que la fuente. El parámetro dim indica qué índice se va a ampliar. tiene que estar dentro del rango 1 y 1+ (rango de fuente), si la fuente es un escalar, entonces tenue debe ser uno. El parámetro ncopies es el número de elementos en las nuevas dimensiones.
desempaquetar (vector, máscara, matriz)

Dispersa un vector a una matriz bajo el control de la máscara. La forma de la máscara de matriz lógica debe coincidir con la de la matriz. El vector de matriz debe tener el rango 1 (es decir, es un vector) con al menos tantos elementos como los que son verdaderos en la máscara, y también debe tener el mismo tipo que la matriz. Si la matriz se da como un escalar, se considera que es una matriz con la misma forma que la máscara y los mismos elementos escalares en todas partes.

El resultado será una matriz con la misma forma que la máscara y el mismo tipo que el vector. Los valores serán los del vector que se acepten, mientras que en las posiciones restantes de la matriz se mantienen los valores antiguos.

Example

El siguiente ejemplo demuestra el concepto:

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

Cuando el código anterior se compila y ejecuta, produce el siguiente resultado:

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