回 帖 发 新 帖 刷新版面

主题:jstzhurj老师,我又将程序简化了,能否看下?

还是上次那代码。我想了下,由于相邻的两个特征值之间可能有好几个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

回复列表 (共58个回复)

沙发

出现一个错误
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]出现一个错误
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 楼

还是上次那代码。我想了下,由于相邻的两个特征值之间可能有好几个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 楼

老师您好,谢谢您。程序运行通过了。但是有个问题还要麻烦 您下,我想把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 楼

加入exit之后应该是:如果p突然不满足i条件,程序回到do i=1,4*m*n-1的位置继续下一个i的循环吧?我想把上一个i包含的Ef(p),conr(p)值都记录下来然后再进行下一个i值的循环,但是加入exit之后文件里就没内容了,去掉exit之后又有内容了。不知道怎么回事,恳请老师指导下,谢谢

6 楼


你把程序打包吧,一时不知道怎么回事。

7 楼

好的,谢谢了!我已经把附件放到第一个帖子里了。程序里有三个矩阵,第一个是自身哈密顿矩阵,另外两个分别是它在x,y方向的分量构成的矩阵。我要求的矩阵再第181行,我求特征值和特征向量调用的是imsl数据库

8 楼

[em2]

9 楼


问题在于你擅自把k=0放到了不合适的位置!

10 楼

[quote]加入exit之后应该是:如果p突然不满足i条件,程序回到do i=1,4*m*n-1的位置继续下一个i的循环吧?我想把上一个i包含的Ef(p),conr(p)值都记录下来然后再进行下一个i值的循环,但是加入exit之后文件里就没内容了,去掉exit之后又有内容了。不知道怎么回事,恳请老师指导下,谢谢[/quote]


谁说加入exit文件没内容了?我这儿怎么有?

我来回复

您尚未登录,请登录后再回复。点此登录或注册