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

📄 tempf3d.h

📁 是一个结构试验设计的加工曲线的跟踪实现 没有密码。第一次
💻 H
📖 第 1 页 / 共 5 页
字号:
					if(*(TBorderCon+loop*(TElem_node+3)+10)!=4 && *(TBorderCon+loop*(TElem_node+3)+10)!=5)
					{
						Bord6_b=fabs(*(Node_Coor+3*Enode3+2)-*(Node_Coor+3*Enode1+2))/2.0;
						Bord6_a=fabs(*(Node_Coor+3*Enode2+1)-*(Node_Coor+3*Enode1+1))/2.0;	
						if(fabs(*(Node_Coor+3*Enode2)-*(Node_Coor+3*Enode1))/2.0>Bord6_a)
						{
							Bord6_a=fabs(*(Node_Coor+3*Enode2)-*(Node_Coor+3*Enode1))/2.0;
						}
					} 
					//受火面上单元温度取4个节点的平均温度,且将温度化为绝对温度		
					TempAverage=(*(Temp1+Enode1)+*(Temp1+Enode2)+*(Temp1+Enode3)+*(Temp1+Enode4))/4.0+273.15;
					
					if(*(TBorderCon+loop*(TElem_node+3)+9)==2)  //常温边界条件的处理
					{					
						ChangHeatCT=hc_Nort+hr_Nort*Ste_Bol*(TempAverage*TempAverage+(iniT0+273.0)*(iniT0+273.0))*(TempAverage+(iniT0+273.0));
					}
					if(*(TBorderCon+loop*(TElem_node+3)+9)==3)  //受火边界条件的处理;过镇海书.P93,(6-38b),综述P8,式(7)		
					{
						ChangHeatCT=hr_Heat*Ste_Bol*(TempAverage*TempAverage+(Envtemper+273.15)*Defer*(Envtemper+273.15)*Defer)*(TempAverage+(Envtemper+273.15)*Defer);
					}		                   
					//单元传热矩阵有4×4个元素;只有4个代表性的元素
					CKBe[0][0]=4.0*Bord6_a*Bord6_b*ChangHeatCT/9.0;
	                CKBe[0][1]=4.0*Bord6_a*Bord6_b*ChangHeatCT/18.0;
                    CKBe[0][2]=4.0*Bord6_a*Bord6_b*ChangHeatCT/18.0;
                    CKBe[0][3]=4.0*Bord6_a*Bord6_b*ChangHeatCT/36.0;
                    //第二行
			        CKBe[1][0]=CKBe[0][1];
					CKBe[1][1]=CKBe[0][0];
					CKBe[1][2]=CKBe[0][3];
				    CKBe[1][3]=CKBe[0][1];
					//第二行
					CKBe[2][0]=CKBe[0][2];
					CKBe[2][1]=CKBe[1][2];
					CKBe[2][2]=CKBe[0][0];
					CKBe[2][3]=CKBe[0][1];
					//第二行
					CKBe[3][0]=CKBe[0][3];
					CKBe[3][1]=CKBe[1][3];
					CKBe[3][2]=CKBe[2][3];
					CKBe[3][3]=CKBe[0][0];					 
     				    
					//六面体单元的传热荷载向量 
					if(*(TBorderCon+loop*(TElem_node+3)+9)==2)//常温边界条件的处理
					{
						PBe[0]=Bord6_a*Bord6_b*ChangHeatCT*iniT0;
						PBe[1]=Bord6_a*Bord6_b*ChangHeatCT*iniT0;
						PBe[2]=Bord6_a*Bord6_b*ChangHeatCT*iniT0;
						PBe[3]=Bord6_a*Bord6_b*ChangHeatCT*iniT0;
					}
					if(*(TBorderCon+loop*(TElem_node+3)+9)==3)  //受火边界条件的处理;过镇海书.P93,(6-38b),综述P8,式(7)		
					{
						PBe[0]=Bord6_a*Bord6_b*hc_Heat*Envtemper+Bord6_a*Bord6_b*ChangHeatCT*Envtemper*Defer; //?
						PBe[1]=PBe[0];
						PBe[2]=PBe[0];
						PBe[3]=PBe[0];
					}
				}
				
				for(loop1=0; loop1<TElem_node; loop1++) //组装边界刚度矩阵和传热荷载向量
				{ 
					iRow=*(TCElemNode_Info+TElem_node*loop+loop1);
					for(loop2=0; loop2<=loop1; loop2++)
					{
						iCol=*(TCElemNode_Info+TElem_node*loop+loop2);
						if(iRow>=iCol)
							ibuf=DiagAddress[iRow]-(iRow-iCol);
						else 
							ibuf=DiagAddress[iCol]-(iCol-iRow);
						KBG[ibuf]=KBG[ibuf]+CKBe[loop1][loop2];
					}
					PBG[iRow]=PBG[iRow]+PBe[loop1];
				}
			}//!!!边界单元的和传热刚度矩阵和传热荷载向量组装完毕!!!!!

			if(SteelExit==1)   //三维温度场分析时考虑钢筋的影响;
			{
				;
			}
			for(loop=0; loop<TotalLen; loop++)
				KG[loop]=KBG[loop]+KTG[loop];

			//备份t0时刻第一次迭代的刚度矩阵,质量热容矩阵和热荷载向量
			if(ComputeMethod==1 && IterCount==1)//1表示权函数按Galerkin取值时得到的隐格式
			{
				for(loop=0;loop<TotalLen;loop++)
				{
					*(KG0+loop)=*(KG+loop);              //t0时刻的总刚度矩阵;
					*(CcG0+loop)=*(CcG+loop);            //t0时刻的质量热容矩阵
				}
				for(loop=0;loop<TNode_num;loop++)
				{
					*(PBG0+loop)=*(PBG+loop);            //t0时刻的总热荷载向量
				}		   
			}

			if(ComputeMethod==1)   //1表示权函数按Galerkin取值时得到的隐格式     
			{
				if(IterCount==1)
				{
					for(loop=0;loop<TotalLen;loop++)
					{
						A[loop]=CcG0[loop]/TimeStep+KG0[loop]*2.0/3.0;
						C[loop]=CcG0[loop]/TimeStep-KG0[loop]/3.0;
					}
					Multiply_1D(B,C,Temp0);	

					for(loop=0; loop<TNode_num; loop++)
						B[loop]=B[loop]+PBG0[loop];  
		
					Gauss_1D(A,B,Temp); //高斯法解方程组Ax=B
				}
				if(IterCount!=1)
				{
					for(loop=0; loop<TotalLen; loop++)
					{
						A[loop]=(CcG0[loop]/3+CcG[loop]*2.0/3.0)/TimeStep+KG0[loop]/6+KG[loop]/2.0; 
						C[loop]=(CcG0[loop]/3+CcG[loop]*2.0/3.0)/TimeStep-KG0[loop]/6-KG[loop]/6.0;
					}
			
					Multiply_1D(B,C,Temp0);
					for(loop=0; loop<TNode_num; loop++)
						B[loop] +=PBG0[loop]/3.0+PBG[loop]*2.0/3.0;  			
				
					Gauss_1D(A,B,Temp);	//高斯法解方程组Ax=B
				}
			}
			if(ComputeMethod==2)       //1表示采用两点后差分格式
			{
				for(loop=0; loop<TotalLen; loop++)
				{
					A[loop]=CcG0[loop]/TimeStep+KG0[loop];
				}
			
				Multiply_1D(B,KG0,Temp0);	
				for(loop=0; loop<TNode_num; loop++)
					B[loop]=-B[loop]+PBG0[loop];  
		
				Gauss_1D(A,B,Linshi); //高斯法解方程组Ax=B
			
				for(loop=0; loop<TNode_num; loop++)
					Temp[loop]=Temp0[loop]+Linshi[loop];
			}
     
			cout<<"    第 "<<NumTime<<" 次时间步,第 "<<IterCount<<" 子步计算完成\n"<<endl;
			WResult<<"    第 "<<NumTime<<" 次时间步,第 "<<IterCount<<" 子步计算完成\n"<<endl;
	           
			if(IterCount!=1) //下面判断迭代是否收敛
			{
				IterStop=0;	   error=0.0;
				for(loop=0;loop<TNode_num;loop++)  
				{
					if(fabs(*(Temp+loop)-*(Temp1+loop))>FNMaxErr)
					{
						IterStop=1;
					}
					if(fabs(*(Temp1+loop)-*(Temp+loop))>error)
					{
						error=fabs(*(Temp1+loop)-*(Temp+loop));
					}
				}
			}	   
			cout<<"    第 "<<NumTime<<" 次时间步,第 "<<IterCount<<" 子步的最大收敛误差为:"<<error<<",容许误差为:"<<FNMaxErr<<endl;
			WResult<<"    第 "<<NumTime<<" 次时间步,第 "<<IterCount<<" 子步的最大收敛误差为:"<<error<<",容许误差为:"<<FNMaxErr<<endl;	      
			//超过最大允许迭代次数
			if(IterCount>IterMax)
			{
				IterStop=0;
			}

			for(loop=0;loop<TNode_num;loop++)  //计算t+delt时刻的温度
			{
				*(Temp1+loop)=*(Temp+loop);
			}
		}while(IterStop==1);

		if(IterCount<=IterMax)
		{
			cout<<"********第 "<<NumTime<<" 次时间步计算成功收敛! ********\n"<<endl;
			WResult<<"********第 "<<NumTime<<" 次时间步计算成功收敛! ********\n"<<endl;
		}
		if(IterCount>IterMax)
		{
			cout<<"********第 "<<NumTime<<" 次时间步超过最大迭代次数 "<<IterMax<<" ********\n"<<endl;
			WResult<<"********第 "<<NumTime<<" 次时间步超过最大迭代次数 "<<IterMax<<" ********\n"<<endl;
		}
		for(loop=0;loop<TNode_num;loop++)  //计算t+delt时刻的温度
		{
			if(TemperAlsub==1)//子空间过滤
			{			
				if(*(Temp1+loop)>=*(Temp0+loop))//最小值过滤
				{
					*(Temp0+loop)=*(Temp1+loop);
				}
				else
					*(Temp1+loop)=*(Temp0+loop);
			 
				if(*(Temp1+loop)>=Envtemper)//最大值过滤
				{
					*(Temp0+loop)=Envtemper;
					*(Temp1+loop)=Envtemper;
				}
			}
		}

		//********************输出结果***节点温度****************
		OutResults<<"\n"<<"时间="<<Time/60.0<<"温度="<<Envtemper<<"\n";
		for(loop=0; loop<TNode_num; loop++)
		{
			ibuf=loop+1;
			OutResults<<setiosflags(ios::fixed);
			OutResults<<setprecision(3)<<Temp0[loop]<<" ";
			OutResults<<Temp0[loop]<<endl;
			if((ibuf%(Tdiv1+divProt*2+1))==0)  OutResults<<"\n";
		}
		//**********************输出***提取点的温度*********************
		OutTemp<<setiosflags(ios::fixed)<<setprecision(5)<<Time/60<<",";
		Cal_Temp_TiQu(Num_TiQu,CorX_TiQu,CorY_TiQu,Temp0,Temp_TiQu);
		for(loop=0; loop<Num_TiQu; loop++)
		{
			OutTemp<<setiosflags(ios::fixed);
			OutTemp<<setprecision(6)<<*(Temp_TiQu+loop)<<",";
		}
		OutTemp<<"\n";

		for(loop=0; loop<Points; loop++)
		{
			for(loop1=0; loop1<TNode_num; loop1++)
			{
				if(*(PointsNum+loop)==loop1)
					PointsTemp[loop]=Temp0[loop1];
			}
		}
		Temperp<<setiosflags(ios::fixed)<<setprecision(5)<<Time/60<<",";
		for(loop=0; loop<Points; loop++)
		{
			Temperp<<setiosflags(ios::fixed);
			Temperp<<setprecision(5)<<*(PointsTemp+loop)<<",";
		}
		Temperp<<"\n";

		//*******************指定时刻的云图***************
		for(loop=0; loop<ContourNum; loop++)
		{
			if(Contour[loop]==Time)
			{
				YunTu<<"t= "<<Time<<"  时刻的云图 "<<endl;
				for(loop=0; loop<Tdiv2+divProt*2+1; loop++)
				{
					for(loop1=0; loop1<Tdiv1+divProt*2+1; loop1++)
						YunTu<<setw(8)<<Temp0[loop*(Tdiv1+divProt*2+1)+loop1]<<" ";
					YunTu<<"\n";
				}
			}			
		}
	}   
}

//***********钢筋的体积比热随温度的变化**************//
double CalcuSSpecilHeat(int SSpecilHeat_Type,double Temp)      
{
	double SSpecilHeat;
    if(SSpecilHeat_Type==1)       //按Lie的建议公式取值
	{
		if(Temp<=650.0)
		   SSpecilHeat=(0.004*Temp+3.3)*1.0e6;
        else if(Temp>=650.0 && Temp<=725.0)
			SSpecilHeat=(0.0680*Temp-38.3)*1.0e6;
		else if(Temp>=725.0 && Temp<=800.0)
			SSpecilHeat=(-0.0860*Temp+73.35)*1.0e6;
        else if(Temp>=800.0)
			SSpecilHeat=4.55*1.0e6;
	}
    else if(SSpecilHeat_Type==2)    //2表示按同济大学陆州导建议公式取
	{
        if(Temp<=500.0)
		   SSpecilHeat=7850.0*(4.77*Temp/10000+0.48)*1.0e3;
        else if(Temp>=5

⌨️ 快捷键说明

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