LoginSignup
kisara11235
@kisara11235

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

コアダンプする箇所がわからない。

Q&AClosed

解決したいこと

コアダンプしていると出るが、その原因がわからない。

発生している問題・エラー

Segmentation fault (コアダンプ)

 

該当するソースコード

//グラフェンナノリボンエネルギーバンド 相互作用 反強磁性
#include <stdio.h>
#include <math.h>
#include <complex.h>
#include <stdlib.h>

#define M  10	// 存在するサイト数 
#define N  20	//サイト数×2 A+Bの個数
#define P  100	//リボン長 全電子数 P*L
#define Q  1 //回数

double b_pi,N_c;
double complex t_1, t_2, t_3, t_4, t_5, t_6, t_7, t_8, T_1, T_2;	//t_方向
double k_x[P+1];
double n_2[2*N];		//代入する値
double meow_updw;		//up&dwのフェルミ

double Energy[P+1][2*N];
double complex u[P+1][2*N][2*N];	//固有ベクトル
double complex fermi_1[P+1][2*N];
double gap[P+1];       //Eg,フェルミエネルギーバンド

double u_5_1[P+1][2*N][2*N],u_6_1[P+1][2*N],u_7_1[2*N],u_8_1[2*N]; 

void zheev_( char*, char*, int*, double _Complex*, int*, double*, double _Complex*, int*, double*, int* );

int main(void)
{
	FILE* fp;
	FILE* fp_1;
	FILE* fp_2;

	if ((fp = fopen("ziginteneantiferromagnetism M=4.txt", "w")) == NULL)
	{
		printf("Cannot open the file\n");
		exit(1);
	}
	if ((fp_1 = fopen("zigintantiferromagnetism.txt", "w")) == NULL)
	{
		printf("Cannot open the file\n");
		exit(1);
	}
	if ((fp_2 = fopen("zigintantiferromagnetism_1.txt", "w")) == NULL)
	{
		printf("Cannot open the file\n");
		exit(1);
	}

	b_pi=M_PI;
	N_c=(P+1)*N;
    double k_xx = -b_pi; 
	double kt=0.00001*8.6171*pow(10,-5);		//-273℃*ボルツマン定数(eV/K)
	double U=4.32;		//相互作用エネルギーの平均(eV)
	double t=2.75;		//飛び移り積分(eV)
	double ribbon_length;		//リボン幅
	double Energy_all[(P+1)*2*N];		//全エネルギー

	//刻み幅
    for(int i=0;i<=P;i++){
        k_x[i]=k_xx+2.0*b_pi/P*i;
    }
	//リボン幅
	ribbon_length=0.246/pow(3,0.5)/2*(3*M-2);		//0.0710140

	//初期条件
	for(int i=0;i<2*N;i++){
		n_2[i]=0.4; 
	} 

	int z=0;
    while(z<Q){

    //行列計算
    for(int r=0;r<=P;r++){
		// 複素行列(エルミート)の対角化 (入力行列の配列は対角化後にユニタリ行列になる)
  		char   jobz = 'V'           ;// 固有ベクトルを計算する
  		char   uplo = 'U'           ;// Aに上三角行列を格納
  		int    n    = 2*N             ;// 対角化する正方行列のサイズ
		double _Complex A[2*N*2*N]		;// 対角化する行列。対角化後は固有ベクトルが並ぶ

        t_4 = 1;
	    t_5 = cexp(-1 * I * -1/ 2 * k_x[r]);			
        t_6 = cexp(-1 * I * 1/2 * k_x[r]);		
        t_1 =1;
    	t_2 = cexp(I * -1 / 2 * k_x[r]);
	    t_3 = cexp(I * 1 / 2 * k_x[r]);
    	T_1 = t_5 + t_6;
     	T_2 = t_2 + t_3;

		for(int i=0;i<2*N*2*N;i++){
			A[i]=0;
		}
		for(int i=0;i<2*N;i++){
			if(i<N){
				A[i*2*N+N+i]=U/t*n_2[i];
			}
			else{
				A[2*N*(i+N)+i]=U/t*n_2[i];
			}
		}
		for(int j=1;j<M-1;j++){
			A[2*N*j+M+j-1]=t_4;   A[j*2*N+M+j]=T_1;
			A[(j+M)*2*N+j]=T_2; A[(j+M)*2*N+j+1]=t_1;

			A[2*N*(j+N)+N+M+j-1]=t_4;   A[2*N*(j+N)+N+M+j]=T_1;
			A[(j+N+M)*2*N+N+j]=T_2; A[(j+N+M)*2*N+N+j+1]=t_1;
		}
		A[M]=T_1;
		A[2*N*(M-1)+N-2]=t_4; A[2*N*(M-1)+N-1]=T_1;
		A[2*N*(N+1)-M]=T_1; 
		A[2*N*(N+M)-2]=t_4; A[2*N*(M+N)-1]=T_1;

		A[2*N*M]=T_2;  A[2*N*M+1]=t_1; 
		A[2*N*(N-1)+M-1]=T_2;
		A[2*N*(N+M)+N]=T_2; A[2*N*(N+M)+N+1]=t_1; 
		A[2*N*2*N-M-1]=T_2;

		/*for(int i=0;i<2*N*2*N;i++){	
			fprintf(fp_2,"%2f\n",A[i]);	
		}*/

  		double w[2*N]              	;// 実固有値が小さい順に入る
	
 		int    lda  = 2*N	            ;// 対角化する正方行列のサイズ
  		double _Complex work[6*2*N]	;// 対角化する際に使用するメモリ
  		int    lwork = 6*2*N		    ;// workの次元
  		double rwork[3*2*N-2]      	;// 3*SIZE-2で固定
  		int    info                 ;// 成功すれば0、失敗すれば0以外を返す

  		zheev_( &jobz, &uplo, &n, A, &lda, w, work, &lwork, rwork, &info );

    	for(int i=0;i<2*N;i++){
			for(int j=0;j<2*N;j++){
				u[r][i][j]=0.0;
				u_5_1[r][i][j]=0.0; 
			}
			u_6_1[r][i]=0.0;
			u_7_1[i]=0.0;
			u_8_1[i]=0.0; 
		}
		for(int j=0;j<2*N;j++){
			Energy[r][j]=w[j];
		}
		for(int i=0;i<2*N;i++){
			for(int j=0;j<2*N;j++){
				u[r][i][j]=A[i*2*N+j];
			}	
		}
	}
	//フェルミエネルギー up&dw
	for(int i=0;i<=P;i++){
			for(int j=0;j<2*N;j++){
				Energy_all[i*2*N+j]=Energy[i][j];
			}
		}
		double tmp_ene;
		for (int i=0; i<=P*2*N; i++) {
   		 	for (int j=i+1; j<=P*2*N; j++) {
				if (Energy_all[i] > Energy_all[j]) {
	    			tmp_ene =  Energy_all[i];
    	    		Energy_all[i] = Energy_all[j];
        			Energy_all[j] = tmp_ene;
				}
			}
    	}
		meow_updw=(Energy_all[(P+1)*N]+Energy_all[(P+1)*N-2])/2;
		/*for(int i=0;i<=P*N*2;i++){
			printf("%f\n",Energy_all[i]);
		}
		printf("%f\n",meow_updw);*/
			
	//Eg
	double tmp;
	for (int i=0; i<=P; i++) {
		gap[i]=Energy[i][N]-Energy[i][N-1];
	}
 	for (int i=0; i<=P; ++i) {
    	for (int j=i+1; j<=P; ++j) {
      		if (gap[i] > gap[j]) {
        	tmp =  gap[i];
        	gap[i] = gap[j];
        	gap[j] = tmp;
    	  	}
    	}
  	}
	for(int l=0;l<=P;l++){
		for(int i=0;i<2*N;i++){
			fermi_1[l][i]=1/(1+exp((Energy[l][i]-meow_updw)/kt)); 
		}
	}
	for(int i=0;i<2*N;i++){
		for(int l=0;l<=P;l++){
			for(int j=0;j<2*N;j++){
				u_5_1[l][i][j]=pow(cabs(u[l][j][i]),2)*fermi_1[l][j];
				u_6_1[l][i]+=u_5_1[l][i][j];
			}
			u_7_1[i]+=u_6_1[l][i]; 
		}
		u_8_1[i]=u_7_1[i]/(P+1);
	}	
	for(int i=0;i<2*N;i++){
		n_2[i]=u_8_1[i];
	}

    z++;
    }

	for(int i=0;i<=P;i++){
    	for(int j=0;j<2*N;j++){
			fprintf(fp, "%2f %lf %lf %lf\n",k_x[i],Energy[i][j]-meow_updw,Energy[i][N]-meow_updw,Energy[i][N-1]-meow_updw);
			// fprintf(fp, "%2f %lf %lf\n",k_x[i],Energy[i][N+1]-meow_updw,Energy[i][N-2]-meow_updw);
		}   
	}
	for(int i=0;i<2*N;i++){	
		fprintf(fp_2,"%2f\n",n_2[i]);	
	}
	for(int i=0;i<M;i++){	
		fprintf(fp_1,"%2f\n",n_2[i]);
		fprintf(fp_1,"%2f\n",n_2[i+M]);
	}
	printf("リボン長:%2f\n", ribbon_length);
    printf("最小ギャップ:%f\n",gap[0]/(U/t));
    
    
 	fclose(fp);
	fclose(fp_1);
	fclose(fp_2);
	return 0;
}

自分で試したこと

その前にn_2[2*N]をn_2[N]としたときはコンパイルが通ったのですが、意味として合うのは前者です。

n のところを変えると、別のエラーが出ました。

0

2Answer

環境はiccをお使いでしたっけ?デバッガで動かしたら一撃と思います。ご自身のためにもそれがよろしいかと。。。
#直接的な回答でなくてすみません

0

Comments

  1. @kisara11235

    Questioner
    回答ありがとうございます。おっしゃるとおりなのですが、例えばicc -g でcore.XXXファイルを作ったりしましたが全くうまく行かなかったので質問させていただきました。
    具体的にはcore.XXXファイルができなかったです。

    デバッガでもやりましたがやはりnのところがおかしいことしかわからなかったです。
  2. 「デバッガでもやりましたがやはりnのところがおかしいことしかわからなかったです。」

    なら、ここが頑張りどころかと。「nがおかしい」ことに加え、発生した行もわかったのですよね。それだけで十分解析できませんか?
  3. @kisara11235

    Questioner
    それもそうなんですが、nの配列の個数を確認したところ
    subscripted value is not an array, pointer, or vector
    というエラーが出ているところで頑張っています。
    他力本願ですが、外から見たほうがエラーがわかりやすいかなと甘く考えています。
  4. 解決したようでよかったです。今後は、投稿前にもうひと頑張りするとよいかと。。。

自己解決です。
具体的にはnが原因であることがわかっているのでnを分割しました。

0

Your answer might help someone💌