2014-12-01 3 views
0

У меня очень простая петля do, в которой я хочу сохранить (хранить) элементы вектора, который вычисляется в цикле на другой, например, я могу вспомнить элементы этого второй вектор вне цикла. Моей наивности тест следующим образом: тест программыХранить элементы в векторе Fortran

implicit none 
integer :: num,i 
real*8, DIMENSION(3, 1) :: pos 
real*8, dimension(:),allocatable :: x(:) 
real*8 :: step,delta 


pos = 0.0 ! clear the vector all components are equal to zero 
pos(1,1)=1. ! only first elements of the vector 'pos' of object 1 is diff. from zero 

num=1000 
delta = 1. 
step = 0. 

allocate(x(num)) ! allocate a vector with dimension equal to num 
x=0. 
do while (step < num) 
      pos(1,1) = pos(1,1) + 0.5d0 ! move the objects      
      x=pos(1,1) ! store the elements of vector 'pos' in vector 'x' 
      step = step + delta 
end do 

print*, x(120) ! print the 120th elements of the vector x 

end program test 

Я думаю, что проблема в том, как я передать элементы из «поз» до «х» вектора.

Большое спасибо за помощь.

ответ

1

Это утверждение

allocate(x(num)) ! allocate a vector with dimension equal to num 

делает x вектор с num (т.е. 1000) элементов. Следующее заявление

x=0. 

устанавливает каждый элемент x к 0.0. Все идет нормально. Затем код входит в цикл, где это утверждение

x=pos(1,1) ! store the elements of vector 'pos' in vector 'x' 

неоднократно устанавливает каждый элемент x до последнего значения pos(1,1). Это, вероятно, не то, что вы хотите сделать. Я думаю, что проще всего исправить было бы переписать цикл вроде этого

do step = 1,1000 
    pos(1,1) = pos(1,1) + 0.5d0 ! move the objects      
    x(step) = pos(1,1) ! store the elements of vector 'pos' in vector 'x' 
end do 

я не уверен точно, что вы пытаетесь сделать, это выглядит так, как будто вы пытаетесь заполнить x с условиями в арифметической серии 1 + n*0.5, n = [0,999]. Аккуратнее способ сделать это может быть, чтобы изменить то, что у вас есть, так что x индексируется от 0, возможно

allocate(x(0:num-1)) 

, а затем просто использовать цикл, такие как

do step = 1,999 
    x(step) = x(step-1)+0.5 
end do 

Я не знаю, почему вы устанавливаете pos при настройке значений x.

+0

МНОГО СПАСИБО !!! У меня была гораздо более сложная программа, которая вычисляет «pos» с длинной функцией, и мне нравится хранить в x результаты для повторного использования их вне цикла, в другом цикле в другой части программы. Здесь я публикую только тестовую программу, которая имитирует мою более сложную. –

Смежные вопросы