Fortran 90 не сохраняет нижние / верхние границы массива после копирования в другой размещаемый массив - PullRequest
3 голосов
/ 01 февраля 2020

Это не работает

program main
   implicit none
   integer :: nx = 3
   integer :: ny = 5
   integer :: nz = 8

   real, allocatable, dimension(:,:,:) :: A
   real, allocatable, dimension(:,:) :: B

   allocate(A(nx,0:ny,nz) )
   ! ...do something with array A and at some point cope a slice of A to B:
   B = A(:,:,1)
   ! in this case B is (1:nx, 1: ny+1) 
end program main

Приведенный выше код автоматически выделяет B и копирует A (:,:, 1) в B. Однако он не сохраняет нижнюю / верхнюю границу 0 / ny, вместо этого B имеет нижнюю границу 1 и верхнюю границу ny + 1.

Единственный способ сохранить нижнюю / верхнюю границу A 2dn-dim - это явно выделить B как:

   allocate(B(nx, 0:ny))
   B = A(:,:,1)
   ! in this case B is (1:nx, 0:ny)

Учитывая, что у меня намного больше переменных, чем в этом простом примере, есть ли способ присвоить как B = A (:,:, 1), а также сохранить границы A без явного выделения B?

Ответы [ 2 ]

2 голосов
/ 01 февраля 2020

A(:,:,1) является выражением. Он имеет границы (1:nx, 1:ny), ОБА ранги начинаются с 1. Это не исходный массив, это новое выражение.

Однако, даже если это был массив с другими нижними границами, автомати c Выделение всегда выделяет индексы, начиная с 1. По сути, правая часть снова является выражением.

Для вашего случая вам нужно явно выделить.

0 голосов
/ 11 апреля 2020

Вы можете использовать:

allocate(B(lbound(A,1):ubound(A,1), lbound(A,2):ubound(A,2)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...