Удалить все строки после значения индекса из массива в Фортране - PullRequest
0 голосов
/ 21 ноября 2018

Я хочу, чтобы массив удалял все строки после определенного значения индекса из массива в Фортране.Это означает, что если размер массива изначально равен p, он должен стать q, где q - индекс, после которого все должно быть удалено.

Вот соответствующий бит кода:

real(8), allocatable :: circlesx(:),circlesy(:)
allocate(circlesx(n**2-n))
allocate(circlesy(n**2-n))

do i=1,n-1
    do j=i+1,n
        call intersect2circles(stlo(i),stla(i),distance(i),stlo(j),stla(j),distance(j),ax,ay,bx,by,flag)
        if (flag==0) then
            circlesx(k)=ax
            circlesy(k)=ay
            circlesx(k+1)=bx
            circlesy(k+1)=by
            k=k+2
        endif
    enddo
enddo

Флаг в основном проверяет, пересекаются ли две окружности или нет.Поэтому, если пересечения нет, значения не присваиваются массивам circlesx и circlesy.Размер массивов, которые я выделяю сначала, это максимальное количество точек пересечения n окружностей = n^2-n.Я получаю ошибку сегментации, если я не выделяю их.

Reshape также не работал, хотя я мог сделать что-то не так.Это дало неклассифицируемую ошибку оператора: -

reshape(circlesx,[ n**2-n-1 ])

Я хочу, чтобы размер круговых массивов изменился на k-2 после выполнения циклов

Так что мне нужно, если n= 2, так что circlex и circley имеют размер 2, тогда

circlesx=[0,0]
.
.
some calculations
.
.
circlesx=[1.2,0] ! only one value has been allocated
.
.
reshape the array accordingly
.
.
circlesx=[1.2]

Есть ли способ сделать это в Фортране?Я использую расширение файла f90 и использую gfortran v7.3.0

1 Ответ

0 голосов
/ 22 ноября 2018

Здесь вопросы о динамическом изменении размера массива, как правило, заботятся о расширении массива.Это более сложная проблема. 1

Однако фундаментальные соображения практически совпадают.Рассмотрим

integer, allocatable :: arr(:)
allocate(arr(3))
arr = [1, 2, 3]

end

При внутреннем присваивании мы видим из других источников, что мы могли бы просто написать

integer, allocatable :: arr(:)
arr = [1, 2, 3]

end

и выделить arr правильной фигуре как часть присваивания.

Мы видели это, чтобы: увеличить массив

arr = [arr, 4]

удалить «плохие значения»:

arr = PACK(arr, arr>1.and.arr<4)

Выбор только первых нескольких элементов так же прост, как

arr = arr(:q)

Дни, когда компиляторам требуются специальные флаги для правильной компиляции такого кода, медленно проходят, но (особенно если вы используете старую версию) проверяйте документацию вашего компилятора на предмет того, как обеспечить автоматическое распределение при внутреннем назначении.


1 Даже в те дни, когда не было динамического выделения памяти, один обрабатывал «более короткие» массивы просто.Возьмите статический размер массива, который вам когда-либо понадобится, и постарайтесь определить, сколько элементов используется.В современном коде вы можете увидеть такие артефакты при использовании старых библиотек.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...