Функция 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 при выполнении кода.

Спасибо всем вам в любом случае. Это было сложно!

Альберт П

Другие вопросы по тегам