Функция sqrt fortran 90 error
Я пытаюсь обработать sqrt, но почему-то не могу понять, почему при компиляции этой программы возникает ошибка ошибки сегментации. Я обнаружил, что это из-за sqrt. Но как я могу использовать sqrt в таких формулировках, не ошибаясь?
SUBROUTINE constructImages(image,w,w_b,x_w)
USE cellConst
USE simParam, ONLY: xDim, yDim, obstX, obstY, obstR,L_max
USE D2Q9Const, ONLY: v
implicit none
integer, INTENT(INOUT):: image(yDim,xDim),w_b(yDim,xDim),w(yDim,xDim)
double precision, dimension(L_max,0:1), INTENT(INOUT):: x_w
integer:: x,y,i,cont_L
double precision::x2,y2
!Disk Shape
do x = 1, xDim
do y = 1, yDim
if (((x-obstX)**2.0d0 + (y-obstY)**2.0d0) <= (obstR**2.0d0) ) then
image(y,x) = wall
w(y,x) = wall
end if
end do
end do
do x = 1, xDim
do y = 3, yDim-2
do i= 1,8
if ((w(y,x) == fluid) .and. (w(y+v(i,1),x+v(i,0)) == wall)) then
w_b(y,x) = 2
end if
end do
end do
end do
do x = 1,xDim
do y = 3, yDim-2
if (w_b(y,x) == 2) then
w_b(y,x) = wall
w(y,x) = wall
image(y,x) = wall
end if
end do
end do
x_w = 0.0d0 !Lagrangian vector for boundary exact position
cont_L = 0
do x = 1, xDim
do y = 1, yDim
do i = 1, 8
if ((w(y+v(i,1),x+v(i,0)) == fluid) .and. (w_b(y,x) == wall)) then
cont_L = cont_L +1
, x_w (cont_L, 0) = x2 - ((x-obstX) ^ 2.0d0 + (y-obstY) ^ 2.0d0)^ 0.5d0 - obstR
, x_w (cont_L, 1) = y2 - ((x-obstX) ^ 2.0d0 + (y-obstY) ^ 2.0d0)^ 0.5d0 - obstR
! write(*,*) x2,y2
! write(*,*) x_w(cont_L,0),x_w(cont_L,1)
end if
end do
end do
end do
END SUBROUTINE constructImages
Пожалуйста, дайте мне знать, если потребуется дополнительная информация,
С уважением,
Альберт П
PD, 3 целочисленных эйлеровых сетки - это 0 / 1 2D сетки, где 1 назначается стене, которая ограничена закругленным диском, w_b(y,x) - граничные точки, w (y, x) - весь диск points and x_w Я хочу установить лангранжев вектор точной дискретизированной позиции для препятствия. На самом деле не нужно это понимать.
1 ответ
Проблема заключалась в том, что индекс массива был меньше 1 в w, и было несколько проблем, которые каким-то образом возникали из-за этой ошибки при установке sqrt.
do x = 1, xDim
do y = 1, yDim
do i = 1, 8
if ((w(y,x) == fluid) .and. (w(y+v(i,1),x+v(i,0)) == wall))
.....
здесь я утверждаю, что w идет>1, а затем выходит за пределы. Я решил проблему, не позволяя целым числам опуститься ниже 1 и выше yDim, и это со всеми подпрограммами, и я обнаружил эту проблему с помощью check-bounce при выполнении кода.
Спасибо всем вам в любом случае. Это было сложно!
Альберт П