24小时热门版块排行榜    

查看: 671  |  回复: 1

xcid

银虫 (小有名气)

[求助] 大家能不能帮我看看这个程序,我用的是DEV-C++,但是一运行就报错

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <iostream.h>
#include <fstream.h>


#define NKPTS_MAX 10000
#define NBANDS_MAX 200


int main ( int argc, char *argv[])
{
  if( argc < 4)
  {
    printf("should be like: \n";
    printf("./a.out nkx nky nkz \n";
    exit(0);
  }
  int nkx, nky,nkz;
  nkx=atoi(argv[1]);
  nky=atoi(argv[2]);
  nkz=atoi(argv[3]);


  fstream fid;
  fid.open("OUTCAR",ios::in);
  if ( !fid  )
  {
printf("cant open OUTCAR\n";
       exit(0);
  }


char str[255], stmp[255];


//keyword1[]="NKPTS";
int NKPTS,NBANDS;
do {
   fid.getline(str,255);
   if(strstr(str,"NKPTS" != NULL )
   {
printf("str=%s\n", str);
      sscanf(str,"%s%s%s%d",stmp,stmp,stmp,&NKPTS);
      sscanf(str,"%s%s%s%s%s%s%s%s%s%s%s%s%s%s%d",stmp,stmp,stmp,stmp,stmp,stmp,stmp,stmp,stmp,stmp,stmp,stmp,stmp,stmp,&NBANDS);
      printf("NKPTS: %d, NBANDS: %d\n",NKPTS,NBANDS);
      break;
   }
}while( !fid.eof()) ;






float A[3][3], B[3][3];
do {
   fid.getline(str,255);
   if(strstr(str,"reciprocal lattice vectors" != NULL )
   {
      for(int i=0;i<3;i++)
      {
   fid.getline(str,255);
        sscanf(str,"%f%f%f%f%f%f",&A[0],&A[1],&A[2],&B[0],&B[1],&B[2]);
      }  
      printf("A1: %f %f %f \n",A[0][0],A[0][1],A[0][2]);
      printf("A2: %f %f %f \n",A[1][0],A[1][1],A[1][2]);
      printf("A3: %f %f %f \n",A[2][0],A[2][1],A[2][2]);
      printf("B1: %f %f %f \n",B[0][0],B[0][1],B[0][2]);
      printf("B2: %f %f %f \n",B[1][0],B[1][1],B[1][2]);
      printf("B3: %f %f %f \n",B[2][0],B[2][1],B[2][2]);


     break;
   }
}while( !fid.eof());






float Ef;
do {
   fid.getline(str,255);
   if(strstr(str,"E-fermi" != NULL )
   {
        printf("str=%s\n", str);
      sscanf(str,"%s%s%f",stmp,stmp,&Ef);
      printf("Ef: %f\n",Ef);
      break;
   }
}while( !fid.eof()) ;






   fid.getline(str,255);
   fid.getline(str,255);


float kpt[NKPTS_MAX][3];
float Egv[NKPTS_MAX][NBANDS_MAX];
for(int ik =0; ik < NKPTS; ik++)
{
        // k-point 1: kx ky kz
        fid.getline(str,255);
        sscanf(str,"%s%s%s%f%f%f",stmp,stmp,stmp,&kpt[ik][0],&kpt[ik][1],&kpt[ik][2]);
        fid.getline(str,255);


for(int ib=0;ib<NBANDS;ib++)
{
int bandno,occ;
         fid.getline(str,255);
                sscanf(str,"%d%f%f",&bandno,&Egv[ik][ib],&occ);
       //         printf("%d %d : %f\n", ik,ib,Egv[ik][ib]);
}


        fid.getline(str,255);
}


  fid.close();




  // find those cross Ef


   int Nf=0;
   static int nstore[NBANDS_MAX];
   for( int ib =0 ; ib < NBANDS; ib ++)
  {
float vmin=10000, vmax=-10000;
        for( int ik =0 ; ik < NKPTS ; ik++ )
        {
if ( Egv[ik][ib] < vmin)
                   { vmin = Egv[ik][ib];}
if( Egv[ik][ib] > vmax )
  { vmax= Egv[ik][ib];}
}
if( vmax > Ef && vmin < Ef)
{ nstore[Nf++]=ib; }


  }
  int ib;
  float Egvf[NKPTS][Nf];
  for(int i=0; i<Nf; i++)
  {
ib=nstore;
        for( int ik=0 ; ik < NKPTS ; ik ++ )
{
         Egvf[ik]=Egv[ik][ib];
}
  }


//save to bxsf


   FILE *fid2;
   fid2=fopen("FS.bsxf","w";
   if( fid2 == NULL)
   {
       printf( "can't create fout: FS.bsxf\n";
       exit(0);
   }  


fprintf(fid2,"BEGIN_INFO\n";
fprintf(fid2,"  Fermi Energy: %7.5f\n",Ef);
fprintf(fid2,"END_INFO\n";




fprintf(fid2,"\n";


fprintf(fid2,"BEGIN_BLOCK_BANDGRID_3D\n";
fprintf(fid2,"  one_word_comment \n";
fprintf(fid2,"  BEGIN_BANDGRID_3D\n";
fprintf(fid2,"  %d \n",Nf);
fprintf(fid2," %d %d %d \n",nkx,nky,nkz);
fprintf(fid2," 0 0 0\n"; // origin Gamma
fprintf(fid2," %f %f %f \n", B[0][0],B[0][1],B[0][2]);//Vec(1,);
fprintf(fid2," %f %f %f \n", B[1][0],B[1][1],B[1][2]);
fprintf(fid2," %f %f %f \n", B[2][0],B[2][1],B[2][2]);


int ik = 0;
for(int i=0; i < Nf; i++)
{
    fprintf(fid2, " BAND: %d \n",nstore+1);
    for(int ix=0 ; ix < nkx; ix ++)
    {
for(int  iy=0 ; iy < nky; iy ++)
         {
            for(int iz=0 ; iz <nkz; iz++)
   {
                fprintf(fid2,"  %f  ",Egvf[ik++]);
            }
            fprintf(fid2,"\n";
        }
         fprintf(fid2,"\n";
    }
   
}


fprintf(fid2,"  END_BANDGRID_3D\n";
fprintf(fid2,"END_BLOCK_BANDGRID_3D\n";




    fclose(fid2);


}
回复此楼

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

小菜一碟
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

ioadong

木虫 (著名写手)

【答案】应助回帖

感谢参与,应助指数 +1
main函数这么长?尝试先拆成功能小函数,这样好定位错误。
以科学的理性代替天然的非理性。
2楼2013-05-24 21:53:44
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 xcid 的主题更新
信息提示
请填处理意见