У меня есть структура массивов, использующая объявленный тип в Fortran
e.g.
type t_data
integer :: N
real, allocatable :: x(:)
real, allocatable :: z(:)
real, allocatable :: y(:)
contains
procedure :: copy
procedure :: SWAP
procedure :: copy_element
end type
! constructor
interface t_data
module procedure constructor
end interface
contains
subroutine copy(this, old)
class(t_data), intent(inout) :: this
type(t_data), intent(in) :: old
do i = 1, old% N
this% x(i) = old% x(i)
etc ..
end do
end subroutine
subroutine copy(this, old)
class(t_data), intent(inout) :: this
type(t_data), intent(in) :: old
do i = 1, old% N
this% x(i) = old% x(i)
etc ..
end do
end subroutine
function constructor(size_)
integer, intent(in) :: size_
type(t_data), :: constructor
allocate(constructor% x(size_))
allocate(constructor% y(size_) )
! etc
end function
subroutine swap(this, from, i1,i2)
class(t_particle_data), intent(inout) :: this
type(t_particle_data), intent(in) :: from
integer, intent(in) :: i1, i2
this% x(i1) = from% x(i2)
! etc
end subroutine
Это набор примеров процедур, которые должны выполнять одинаковые операции со всеми массивами объявленного типа t_data
. Мой вопрос заключается в том, как сделать его более удобным для решения ситуации, когда мы, например, позже хотим добавить новый компонент в объявленный тип. В настоящее время, когда я добавляю новый массив в свой t_data
, мне нужно пройти через все эти процедуры, конструкторы, деконструкторы и добавить компонент.
Я спрашиваю, есть ли способ сделать это более легким.
МОЯ ЗАЯВКА
Обратите внимание, что этот тип данных используется для моделирования частиц. Изначально я выделяю t_data большим числом. Однако позже во время моделирования мне может понадобиться больше частиц. Следовательно, я выделяю новый t_data с большим объемом памяти и копирую старый t_data
до его старого размера.
subroutine NEW_ALLOC(new, old)
type(t_data), intent(out) :: new
type(t_data), intent(inout) :: old
nsize = old% N * 2 ! allocate twice the old size
new = T_DATA(nsize)
call new% copy(old)
!DEALLCOte OLD
end subroutine
У кого-нибудь есть/можно ли сделать это более умным способом. Я не против смешать это с C/C++?
copy
, что отличается от внутреннего присваивания? Почему это связано с типом? Зачем использовать цикл для назначения массива? Как переход к массиву структур упрощает задачу? Вы спрашиваете, как последовательно применить некоторую операцию ко всем компонентам производного типа? - person IanH   schedule 05.09.2019