主题:jstzhurj老师,我又将程序简化了,能否看下?
tianhy2010
[专家分:60] 发布于 2010-08-28 22:18:00
还是上次那代码。我想了下,由于相邻的两个特征值之间可能有好几个p,比如在eigenvalue(4)和eigenvalue(5)之间有8个p,分别是23、24、25、。。。、30,他们的conr值相同,我只要算一个就可以了,然后把这个值赋给其他的conr,比如得到了conr(23),可以把conr(23)直接赋给conr(24、25、26、...、30),这样就不用再重复计算了,我改了下程序,帮忙看下吧?呵呵
q=1
do i=1,4*m*n-1 !每个i找满足的p,先对i循环
conduc=0.0
k=0
do p=q,450000
if((eigenvalue(i)<=Ef(p)).and.(eigenvalue(i+1)>Ef(p))) then !如果p满足条件,就执行下面的操作,再看下满足这个条件的p有几个
q=p+1 !p+1看下还能否满足条件,如果能那就k+1,直到不能满足条件跳出if语句
k=k+1 !计算总的能满足i条件的p的个数
end if
do temp=1,i
do j=i+1,4*m*n
ea=matmul(traneigv(temp,:),hx)
ec=matmul(traneigv(temp,:),hy)
eb=matmul(traneigv(j,:),hx)
ed=matmul(traneigv(j,:),hy)
conduc=conduc+(dot_product(ea,eigenvector(:,j))*dot_product(ed,eigenvector(:,temp))
end do
end do
conr(p)=2*pi*aimag(conduc)/S
!将能满足i条件的所有conr(p)都赋值,如果k>1,那就说明不止一个能满足条件了
if(k>1) then
do ii=1,k
conr(p+ii)=conr(p)
end do
end if
q=p
exit !退到计算下一个i的地方
end do
end do
最后更新于:2010-08-30 22:21:00
回复列表 (共58个回复)
沙发
tianhy2010 [专家分:60] 发布于 2010-08-28 22:20:00
出现一个错误
Error: An assignment to a DO variable within a DO body is invalid. [P]
if((eigenvalue(i)<=Ef(p)).and.(eigenvalue(i+1)>Ef(p))) then
p=p+1 !这里出错了
k=k+1
end if
板凳
jstzhurj [专家分:4680] 发布于 2010-08-28 22:27:00
[quote]出现一个错误
Error: An assignment to a DO variable within a DO body is invalid. [P]
if((eigenvalue(i)<=Ef(p)).and.(eigenvalue(i+1)>Ef(p))) then
p=p+1 !这里出错了
k=k+1
end if[/quote]
循环体内怎么能改变循环变量的值呢?
3 楼
jstzhurj [专家分:4680] 发布于 2010-08-28 23:09:00
还是上次那代码。我想了下,由于相邻的两个特征值之间可能有好几个p,比如在eigenvalue(4)和eigenvalue(5)之间有8个p,分别是23、24、25、。。。、30,他们的conr值相同,我只要算一个就可以了,然后把这个值赋给其他的conr,比如得到了conr(23),可以把conr(23)直接赋给conr(24、25、26、...、30),这样就不用再重复计算了,我改了下程序,帮忙看下吧?呵呵
q=1
do i=1,4*m*n-1 !每个i找满足的p,先对i循环
conduc=0.0
k=0
do p=q,450000
if((eigenvalue(i)<=Ef(p)).and.(eigenvalue(i+1)>Ef(p))) then !如果p满足条件,就执行下面的操作,再看下满足这个条件的p有几个
q=p+1 !p+1看下还能否满足条件,如果能那就k+1,直到不能满足条件跳出if语句
k=k+1 !计算总的能满足i条件的p的个数
end if
do temp=1,i
do j=i+1,4*m*n
ea=matmul(traneigv(temp,:),hx)
ec=matmul(traneigv(temp,:),hy)
eb=matmul(traneigv(j,:),hx)
ed=matmul(traneigv(j,:),hy)
conduc=conduc+(dot_product(ea,eigenvector(:,j))*dot_product(ed,eigenvector(:,temp))
end do
end do
conr(p)=2*pi*aimag(conduc)/S
!将能满足i条件的所有conr(p)都赋值,如果k>1,那就说明不止一个能满足条件了
if(k>1) then
do ii=1,k
conr(p+ii)=conr(p)
end do
end if
q=p
exit !退到计算下一个i的地方
end do
end do
----------------------------------------------------------
上面相当混乱!我懒得分析了,按照你的意思,我给出下面的程序,由于没法编译运行,不知是否存在错误。
q=1
do i=1,4*m*n-1
conduc=0.0
k=0
do p=q,450000
if((eigenvalue(i)<=Ef(p)).and.(eigenvalue(i+1)>Ef(p))) then
q=p+1
k=k+1 !对于i,能满足条件的Ef(p)的个数!
if (k==1) then
do temp=1,i
do j=i+1,4*m*n
ea=matmul(traneigv(temp,:),hx)
ec=matmul(traneigv(temp,:),hy)
eb=matmul(traneigv(j,:),hx)
ed=matmul(traneigv(j,:),hy)
conduc=conduc+(dot_product(ea,eigenvector(:,j))*dot_product(ed,eigenvector(:,temp))
end do
end do
conr(p)=2*pi*aimag(conduc)/S
conrtmp=conr(p) !conrtmp 存放第一个满足条件的conr(p)值!
else
if (k>1) then
conr(p)=conrtmp
endif
endif
else
if (k>0) then
exit !k>0 有Ef(p)满足过条件,突然不满足了就退出(再找也是白找);否则一直循环到底(k=0)!
endif
end if
end do
end do
4 楼
tianhy2010 [专家分:60] 发布于 2010-08-29 20:25:00
老师您好,谢谢您。程序运行通过了。但是有个问题还要麻烦 您下,我想把Ef(p)、conr(p)的值写到文件里,为什么加入exit之后文件里没东西了呢?
open(10,file='tuxing.txt')
q=1
do i=1,4*m*n-1
conduc=0.0
k=0
do p=q,450000
if((eigenvalue(i)<=Ef(p)).and.(eigenvalue(i+1)>Ef(p))) then
q=p+1
k=k+1 !对于i,能满足条件的Ef(p)的个数!
if (k==1) then
do temp=1,i
do j=i+1,4*m*n
ea=matmul(traneigv(temp,:),hx)
ec=matmul(traneigv(temp,:),hy)
eb=matmul(traneigv(j,:),hx)
ed=matmul(traneigv(j,:),hy)
conduc=conduc+(dot_product(ea,eigenvector(:,j))*dot_product(ed,eigenvector(:,temp))
end do
end do
conr(p)=2*pi*aimag(conduc)/S
conrtmp=conr(p) !conrtmp 存放第一个满足条件的conr(p)值!
else
if (k>1) then
conr(p)=conrtmp
endif
endif
write(10,*) Ef(p),conr(p) !把k=1,k>1对应的Ef(p),conr(p)都 记录到文件里
else
if (k>0) then
exit !k>0 有Ef(p)满足过条件,突然不满足了就退出(再找也是白找);否则一直循环到底(k=0)!
endif
end if
end do
end do
close(10)
我试了下,如果不加exit语句,文件里就有内容,加了之后反而没内容了!
5 楼
tianhy2010 [专家分:60] 发布于 2010-08-29 20:30:00
加入exit之后应该是:如果p突然不满足i条件,程序回到do i=1,4*m*n-1的位置继续下一个i的循环吧?我想把上一个i包含的Ef(p),conr(p)值都记录下来然后再进行下一个i值的循环,但是加入exit之后文件里就没内容了,去掉exit之后又有内容了。不知道怎么回事,恳请老师指导下,谢谢
6 楼
jstzhurj [专家分:4680] 发布于 2010-08-29 22:07:00
你把程序打包吧,一时不知道怎么回事。
7 楼
tianhy2010 [专家分:60] 发布于 2010-08-30 09:04:00
好的,谢谢了!我已经把附件放到第一个帖子里了。程序里有三个矩阵,第一个是自身哈密顿矩阵,另外两个分别是它在x,y方向的分量构成的矩阵。我要求的矩阵再第181行,我求特征值和特征向量调用的是imsl数据库
8 楼
tianhy2010 [专家分:60] 发布于 2010-08-30 10:45:00
[em2]
9 楼
jstzhurj [专家分:4680] 发布于 2010-08-30 11:29:00
问题在于你擅自把k=0放到了不合适的位置!
10 楼
jstzhurj [专家分:4680] 发布于 2010-08-30 11:39:00
[quote]加入exit之后应该是:如果p突然不满足i条件,程序回到do i=1,4*m*n-1的位置继续下一个i的循环吧?我想把上一个i包含的Ef(p),conr(p)值都记录下来然后再进行下一个i值的循环,但是加入exit之后文件里就没内容了,去掉exit之后又有内容了。不知道怎么回事,恳请老师指导下,谢谢[/quote]
谁说加入exit文件没内容了?我这儿怎么有?
我来回复