Fortran Coder

标题: Unclassifiable statement 错误 [打印本页]

作者: sqs    时间: 2021-11-25 21:12
标题: Unclassifiable statement 错误
本帖最后由 sqs 于 2021-11-25 21:14 编辑

请问在这个地方为什么关于这个k(x,y)会报错呢,报错如下“Unclassifialbe statement at (1)”
我这一步的目的是想要得到每一个k值,如果可以使用k(x,y)表示更好,应该如何实现呢


QQ图片20211125211345.png (59.59 KB, 下载次数: 154)

QQ图片20211125211345.png

作者: necrohan    时间: 2021-11-26 08:22
k声明为变量没有声明为二维数组,不能当数组用
(x/n)b1里,b1前缺运算符
两个整数除法会自动取整,可能你要的是x*1.0/n
b1,b2都是有2个元素的数组,如果不指定元素,计算结果也是2个元素的数组
作者: sqs    时间: 2021-11-26 10:51
necrohan 发表于 2021-11-26 08:22
k声明为变量没有声明为二维数组,不能当数组用
(x/n)b1里,b1前缺运算符
两个整数除法会自动取整,可能你要 ...

好的,那这个地方就相当于如果需要两个整数相除得到的是一个浮点数,需要给整数乘上一个浮点数是吧
另外
我不是很清楚,这个地方b1,b2都是具有两个元素的数组,但是我通过分割计算后,需要得到的k也要是一个两个元素的数组,但是怎么通过把这个k(2)和分割的指标x,y联系起来呢,取地址吗?
(其实我本来想着,因为下x,y=1,999嘛,b1,2又是两个元素的数组,而如果这样的话,k会是一个1998*999的矩阵吗,但是这样的话,每一个k值对应的是1,3,5...的奇数,似乎不太好定义k矩阵的指标)
大佬看能有什么办法嘛
作者: 胡文刚    时间: 2021-11-26 22:28
本帖最后由 胡文刚 于 2021-11-26 22:44 编辑

这样是你想要的吗?

[Fortran] 纯文本查看 复制代码
Program workfile
  Implicit None
  integer , parameter :: n = 1000
  real , parameter :: PI = acos(-1.0) , a = 1.42e-10
  real :: b1(2), b2(2)
  real , allocatable :: k(:,:,:)
  integer :: x , y
  allocate(k(2,n-1,n-1))
  b1 = [ 2*PI/a*sqrt(3.0) , 2*PI/a ]
  b2 = [ 2*PI/a*sqrt(3.0) ,-2*PI/a ]
  Forall(x=1:size(k,2) , y=1:size(k,3))
    k(:,x,y) = (b1*x+b2*y)/n
  End Forall
End Program workfile



作者: sqs    时间: 2021-11-28 10:44
胡文刚 发表于 2021-11-26 22:28
这样是你想要的吗?

[mw_shl_code=fortran,true]Program workfile

是的是的,十分感谢您了
作者: sqs    时间: 2021-12-8 21:09
胡文刚 发表于 2021-11-26 22:28
这样是你想要的吗?

[mw_shl_code=fortran,true]Program workfile

您好,我刚刚上手Fortran,这个地方可能还有几个问题需要询问一下,
1.allocate分配动态数组的时候,这个地方数组的三个参数是什么意思呢,是k数组的三个维数的上限值吗。
2.这个地方的size(k,2)和size(k,3)是什么意思呢,对应k的行数,或者列数?
3.如果我需要单独输出每一个K值需要怎么输出呢,如print *,'',k(2,1,3),这样的吗?
感谢

作者: vvt    时间: 2021-12-9 12:24
1. 是的,三个维度的上限。(下限默认为1)
2. size(k,2) 是 k 数组第二个维度的大小。(上限-下线+1)
同理,size(k,3) 是 k 数组第三个维度的大小。
3. write(*,*) k 即可输出所有的 k 值。单独输出某一个,用 k(某个,某个,某个)

作者: sqs    时间: 2021-12-9 21:24
vvt 发表于 2021-12-9 12:24
1. 是的,三个维度的上限。(下限默认为1)
2. size(k,2) 是 k 数组第二个维度的大小。(上限-下线+1)
同 ...

您好,我还有一个问题,在这个地方我得到了三维K数组后,应该为K(2,999,999)或K(2,x,y)。然后我需要调用x,y数值相同时的k(1,x,y)与k(2,x,y)的数值组成一个新的二元数组,进行后续的计算,在整个过程中需要对所有的x,y值的组合得到的新数组进行计算。
那这个地方在程序实现的时候,我是可以再次使用一个forall来实现双循环得到新数组吗?可不可以我在一开始使用forall循环对赋值k数组的时候就调用每一个k数组,如k(:,x,y),应该就对应上面的二元数组,进行后续的计算,最后得到每一个新数组对应的结果后结束循环呢。谢谢






欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2