我正在尝试处理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
如果需要更多信息,请告诉我,
真诚地,
Albert P
PD,3个整数欧拉网格是0/1 2D网格,其中1分配给一个墙,由一个圆形圆盘分隔,w_b(y,x)是边界点,w(y,x)是整个磁盘点和x_w我想为障碍物设置离散精确位置的langrangian向量。真的不需要理解这一点。
答案 0 :(得分:0)
问题实际上是一个低于1 in 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的问题,以及所有例程,我在执行代码时检测到了这个问题。
无论如何,谢谢大家。那是一个艰难的决定!!
Albert P