⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 autotors.c

📁 c++编写的并行拉马克遗传算法的程序。实现分析对接程序
💻 C
📖 第 1 页 / 共 5 页
字号:
int key1,key2;{	TORS_ANGLE *temp1;	int result;	result=0;	temp1=head_tors;	while(temp1&&temp1->id1&&temp1->id2){		if(((key1==temp1->id1&&key2==temp1->id2)||		    (key1==temp1->id2&&key2==temp1->id1))&&temp1->status=='A') {			result=1;		};		if(temp1->next){			temp1=temp1->next;		}else temp1=NULL;	};	return(result);}TORS_ANGLE *   add_tors(key1,key2,head)int key1,key2;TORS_ANGLE * head;{    	TORS_ANGLE * temp;	if(!key1||!key2){		printf("in add_tors with key error\n");		exit(1);	};	ntors++;	if(!head){		head=get_new_tors(key1,key2);		next_tors=head;	} else {		if(!check_tors(key1,key2)||(head!=head_tors)){			temp=get_new_tors(key1,key2);			next_tors->next=temp;			next_tors=temp;		};	};	return(head);}int  delete_tors(num)int num;{    	TORS_ANGLE * temp1, *temp2;	int result;	result=0;	temp1=head_tors;	while(temp1){		if(num==temp1->num) {			temp1->status='I';			result=1;			return(result);		};		temp2=temp1;		temp1=temp1->next;	};/*while*/	printf("didn't find tors %d to delete\n",num);	return(result);}int check_aromatic(con_num){int i,j,k;char line[LINE_LEN];ATOM_NODE *temp;int m,n,o;		/*counters for neighbor search*/int cnum;int csize;int counter;int member[MAX_RECORD];		/*which cycle different atoms belong to*/float norms[MAX_RECORD][3];		/*these will be the normals*/float neighbornorms[MAX_RECORD][3];		/*these will be the normals*/float sizes[MAX_RECORD];float nsizes[MAX_RECORD]; 	/*sizes of the neighboring atoms normals*/float x1,y1,z1,x2,y2,z2;	/*these will be for the length of the sides*/float ax,ay,az;		/*temporary variables for calculations*/float x3,y3,z3,x4,y4,z4;	/*these will be for the length of the sides*/float bx,by,bz;		/*temporary variables for calculations*/float cx,cy,cz;		/*temporary variables for calculations*/float px,py,pz,qx,qy,qz;/*various vector coeffs*/float p[3];float psize,qsize,theta;/*for each cycle check for aromaticity*/for(i=1;i<cycle_count+1;i++){fprintf(stderr, "checking cycle %d\n",i);	counter=1;	csize=cycle_size[i];	for(j=0;j<csize;j++)member[j]=-1;for(j=0;j<csize;j++){	m=j+csize-1;	n=m%csize;	strncpy(line,atmptr+cycles[i][n]*LINE_LEN,LINE_LEN);	sscanf(line+31,"%f",&x1);	sscanf(line+39,"%f",&y1);	sscanf(line+47,"%f",&z1);	strncpy(line,atmptr+cycles[i][j]*LINE_LEN,LINE_LEN);	sscanf(line+31,"%f",&x2);	sscanf(line+39,"%f",&y2);	sscanf(line+47,"%f",&z2);	ax=x2-x1;	ay=y2-y1;	az=z2-z1;	strncpy(line,atmptr+cycles[i][(j+1)%csize]*LINE_LEN,LINE_LEN);	sscanf(line+31,"%f",&x3);	sscanf(line+39,"%f",&y3);	sscanf(line+47,"%f",&z3);	bx=x3-x2;	by=y3-y2;	bz=z3-z2;	px=ay*bz-az*by;	py=az*bx-ax*bz;	pz=ax*by-ay*bx;	p[0]=px;	p[1]=py;	p[2]=pz;	for(k=0;k<3;k++){		norms[j][k]=p[k];	};	psize=sqrt(px*px+py*py+pz*pz);	sizes[j]=psize;};/*after computing the normals, test for planarity by computing cos(theta)*/for(j=0;j<csize;j++){	for(k=j+1;k<csize;k++){		px=norms[j][0];			py=norms[j][1];			pz=norms[j][2];			qx=norms[k][0];			qy=norms[k][1];			qz=norms[k][2];			psize=sizes[j];		qsize=sizes[k];		theta=(px*qx+py*qy+pz*qz)/(psize*qsize);		if((theta>=0.996||theta<=-0.996) && member[k]==-1){			if(member[j]==-1){				member[j]=j;			};			member[k]=member[j];			counter++;/*this keeps track of which cycle pt at k belongs to*/					};	};};	if(counter==csize){		for(j=0;j<csize;j++){			if(*(atmptr+cycles[i][j]*LINE_LEN+13)=='C'){				strncpy(atmptr+cycles[i][j]*LINE_LEN+13,"A",1);				fprintf(stderr,"1->changed C to A for atom #%d \n",cycles[i][j]);			};			if(*(atmptr+cycles[i][j]*LINE_LEN+12)=='C'){				strncpy(atmptr+cycles[i][j]*LINE_LEN+12,"A",1);				fprintf(stderr,"2->changed C to A for atom #%d \n",cycles[i][j]);			};		};	};}}void print_out(key1,key2,neighbors)int key1,key2,neighbors;{    	int i,j;	char rec[7],*chptr;	for(j=0;j<7;j++){		rec[j]=0;	};	for(j=0;j<7;j++){		rec[j]=*(atmptr+LINE_LEN*key1+j);	};	rec[7]='\0';	chptr=rec;	if(!key1||!key2){		printf("in print_out with null key\n");if(key1)printf("key1=%d\n",key1);if(key2)printf("key2=%d\n",key2);		exit(1);	};	if(cflag) sprintf(atmptr+LINE_LEN*key1+offset+6," %3d\n",neighbors);	/*printf("%6s%4d %-4s",chptr,key2,atmptr+LINE_LEN*key1+12);*/	fprintf(outfile,"%6s%4d %-4s",chptr,key2,atmptr+LINE_LEN*key1+12);}int check_h(node)ATOM_NODE *node;{	int i,j,k;	int nnum;	int prevH,prevprevH;	int nextH,nextnextH;	char rec[7],*chptr;	double mk;	double mmk;	TORS_ANGLE *tmp,*tmp2;	prevH=0;	nextH=0;	mk=atof(atmptr+LINE_LEN*node->id+offset);	if(traverse_num==3)node->new_id=outatom++;	if(hflag){	for(i=0;i<node->prev_num;i++){if(!num_cycle(node->prev[i])&&!on_list(node->prev[i]->id,rootlist,rootnum)){		mmk=atof(atmptr+LINE_LEN*node->prev[i]->id+offset);		prevprevH=0;		nextnextH=0;	for(j=0;j<node->prev[i]->prev_num;j++){	if((*(atmptr+LINE_LEN*node->prev[i]->id+13)=='C')&&	   ((*(atmptr+LINE_LEN*node->prev[i]->prev[j]->id+12)=='H')||	   (*(atmptr+LINE_LEN*node->prev[i]->prev[j]->id+13)=='H'))){		mmk=mmk+atof(atmptr+LINE_LEN*node->prev[i]->prev[j]->id+offset);		nonpolarH++;		prevprevH++;		node->prev[i]->prev[j]=NULL;	};/*if non-polar prev-H*/	};/*for all the prev's prev's*/	for(j=0;j<node->prev[i]->next_num;j++){	if((*(atmptr+LINE_LEN*node->prev[i]->id+13)=='C')&&	   ((*(atmptr+LINE_LEN*node->prev[i]->next[j]->id+12)=='H')||	   (*(atmptr+LINE_LEN*node->prev[i]->next[j]->id+13)=='H'))){		mmk=mmk+atof(atmptr+LINE_LEN*node->prev[i]->next[j]->id+offset);		nonpolarH++;		nextnextH++;		node->prev[i]->next[j]=NULL;	};/*if non-polar next-H*/	};/*for all the prev's next's*/	if(traverse_num==1){		for(j=0;j<node->prev[i]->prev_num;j++){			if(!node->prev[i]->prev[j]){				for(k=j+1;k<node->prev[i]->prev_num;k++){					if(node->prev[i]->prev[k]){					node->prev[i]->prev[j]=node->prev[i]->prev[k];					node->prev[i]->prev[k]=NULL;					break;					};/*if*/				};/*for*/			};/*if*/		};/*for*/		for(j=0;j<node->prev[i]->next_num;j++){			if(!node->prev[i]->next[j]){				for(k=j+1;k<node->prev[i]->next_num;k++){					if(node->prev[i]->next[k]){					node->prev[i]->next[j]=node->prev[i]->next[k];					node->prev[i]->next[k]=NULL;					break;					};/*if*/				};/*for*/			};/*if*/		};/*for*/		node->prev[i]->prev_num=node->prev[i]->prev_num-prevprevH;		node->prev[i]->next_num=node->prev[i]->next_num-nextnextH;		if((node->prev[i]->next_num+node->prev[i]->prev_num)==1){			tmp=head_tors;			while(tmp){				if((node->prev[i]->id==tmp->id1)||(node->prev[i]->id==tmp->id2)){					if(tmp==head_tors){						head_tors=tmp->next;					}else{						tmp2->next=tmp->next;						if(tmp==next_tors)next_tors=tmp2;						tmp->next=NULL;					};				};				tmp2=tmp;				tmp=tmp->next;			};		};	if(prevprevH+nextnextH){		sprintf(atmptr+LINE_LEN*node->prev[i]->id+offset,"% 4.3f\n",mmk);		if(debug)printf("new charge on %d =% 4.3f\n",node->prev[i]->id,mmk);	};/*if traverse_num==1*/	};/*for all of current nodes's prev of i-j prevs*/		if((*(atmptr+LINE_LEN*node->id+13)=='C')&&	   ((*(atmptr+LINE_LEN*node->prev[i]->id+12)=='H')||	   (*(atmptr+LINE_LEN*node->prev[i]->id+13)=='H'))){		if(traverse_num==1){			nonpolarH++;			prevH++;	   		mk=mk+atof(atmptr+LINE_LEN*node->prev[i]->id+offset);			node->prev[i]=NULL;		};	};	};/*if not cycle or on rootlist*/	};/*for all i-prev's*/	for(i=0;i<node->next_num;i++){if(!(num_cycle(node->next[i]))&&!(on_list(node->next[i]->id,rootlist,rootnum))){		mmk=atof(atmptr+LINE_LEN*node->next[i]->id+offset);		prevprevH=0;		nextnextH=0;	for(j=0;j<node->next[i]->prev_num;j++){	if((*(atmptr+LINE_LEN*node->next[i]->id+13)=='C')&&	   ((*(atmptr+LINE_LEN*node->next[i]->prev[j]->id+12)=='H')||	   (*(atmptr+LINE_LEN*node->next[i]->prev[j]->id+13)=='H'))){		mmk=mmk+atof(atmptr+LINE_LEN*node->next[i]->prev[j]->id+offset);		nonpolarH++;		prevprevH++;		node->next[i]->prev[j]=NULL;	};/*if non-polar prev-H*/	};/*for all the next's prev's*/	for(j=0;j<node->next[i]->next_num;j++){	if((*(atmptr+LINE_LEN*node->next[i]->id+13)=='C')&&	   ((*(atmptr+LINE_LEN*node->next[i]->next[j]->id+12)=='H')||	   (*(atmptr+LINE_LEN*node->next[i]->next[j]->id+13)=='H'))){		mmk=mmk+atof(atmptr+LINE_LEN*node->next[i]->next[j]->id+offset);		nonpolarH++;		nextnextH++;		node->next[i]->next[j]=NULL;	};/*if non-polar next-H*/	};/*for all the next's next's*/	if(traverse_num==1){		for(j=0;j<node->next[i]->prev_num;j++){			if(!node->next[i]->prev[j]){				for(k=j+1;k<node->next[i]->prev_num;k++){					if(node->next[i]->prev[k]){					node->next[i]->prev[j]=node->next[i]->prev[k];					node->next[i]->prev[k]=NULL;					break;					};/*if*/				};/*for*/			};/*if*/		};/*for*/		for(j=0;j<node->next[i]->next_num;j++){			if(!node->next[i]->next[j]){				for(k=j+1;k<node->next[i]->next_num;k++){					if(node->next[i]->next[k]){					node->next[i]->next[j]=node->next[i]->next[k];					node->next[i]->next[k]=NULL;					break;					};/*if*/				};/*for*/			};/*if*/		};/*for*/		node->next[i]->prev_num=node->next[i]->prev_num-prevprevH;		node->next[i]->next_num=node->next[i]->next_num-nextnextH;		if((node->next[i]->next_num+node->next[i]->prev_num)==1){			tmp=head_tors;			while(tmp){				if((node->next[i]->id==tmp->id1)||(node->next[i]->id==tmp->id2)){					if(tmp==head_tors){						head_tors=tmp->next;					}else{						tmp2->next=tmp->next;						if(tmp==next_tors)next_tors=tmp2;						tmp->next=NULL;					};				};				tmp2=tmp;				tmp=tmp->next;			};		};	if(prevprevH+nextnextH){		sprintf(atmptr+LINE_LEN*node->next[i]->id+offset,"% 4.3f\n",mmk);		if(debug)printf("new charge on %d =% 4.3f\n",node->next[i]->id,mmk);	};/*if traverse_num==1*/	};/*for all of current nodes's prev of i-j prevs*/	nnum=node->next[i]->next_num+node->next[i]->prev_num;	if((*(atmptr+LINE_LEN*node->id+13)=='C')&&	   ((*(atmptr+LINE_LEN*node->next[i]->id+12)=='H')||	   (*(atmptr+LINE_LEN*node->next[i]->id+13)=='H'))){		if(traverse_num==1){			nonpolarH++;			nextH++;	   		mk=mk+atof(atmptr+LINE_LEN*node->next[i]->id+offset);			node->next[i]=NULL;		};	};/*if non-polar H*/	};/*if not on rootlist or cycle*/	};/*for all next's*/	if(traverse_num==1){		for(j=0;j<node->prev_num;j++){			if(!node->prev[j]){				for(k=j+1;k<node->prev_num;k++){					if(node->prev[k]){					node->prev[j]=node->prev[k];					node->prev[k]=NULL;					break;					};/*if*/				};/*for*/			};/*if*/		};/*for*/		for(j=0;j<node->next_num;j++){			if(!node->next[j]){				for(k=j+1;k<node->next_num;k++){					if(node->next[k]){					node->next[j]=node->next[k];					node->next[k]=NULL;					break;					};/*if*/				};/*for*/			};/*if*/		};/*for*/		node->prev_num=node->prev_num-prevH;		node->next_num=node->next_num-nextH;		if((node->next_num+node->prev_num)==1){			tmp=head_tors;			while(tmp){				if((node->id==tmp->id1)||(node->id==tmp->id2)){					if(tmp==head_tors){						head_tors=tmp->next;					}else{						tmp2->next=tmp->next;						if(tmp==next_tors)next_tors=tmp2;						tmp->next=NULL;					};				};				tmp2=tmp;				tmp=tmp->next;			};		};		if(prevH+nextH){			sprintf(atmptr+LINE_LEN*node->id+offset,"% 4.3f\n",mk);			if(debug)printf("new charge on %d =% 4.3f\n",node->id,mk);		};	};	for(j=0;j<7;j++){		rec[j]=0;	};	for(j=0;j<7;j++){		rec[j]=*(atmptr+LINE_LEN*node->id+j);	};	rec[7]='\0';	chptr=rec;	if(traverse_num==4){		if(cflag)sprintf(atmptr+LINE_LEN*node->id+offset+6," %3d\n",node->next_num+node->prev_num);		printf("%6s%4d %-4s",chptr,node->new_id,atmptr+LINE_LEN*node->id+12);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -