温度场有限容积法程序入门之七:相变过程温度场的数值计算

11 篇文章 1 订阅
9 篇文章 3 订阅

       当研究的温度变化过程伴有相变时,如何计算温度场?比如:连铸过程钢液由液态冷却到固态时,除了释放显热,也会释放潜热,而且通常显热量很大,将相变热忽略不计显然不是明智之举。

       没有相变时H=H0+Cp×T,H0为参考温度下的热焓,H为热焓,Cp为热容、T为温度,热量传输控制微分方程如下(不知道字母意义的同志不用看了,随便拷贝过来的公式,包含对流项,这里我们假设速度为0,即没有对流项,纯导热问题):

 

       无相变情形,已做介绍。而根据热焓定义我们知道,无论导热方式传热抑或对流方式传热,都会引起物质焓变,即使物质温度未尝变化,热焓可以更好描述物质内含热量的变化。 有相变时,,将Cp×T的地方用H代替,使用如下控制微分方程:

 

       热焓的计算公式,仅仅适用于固液转变一个相变点的情形:

 

       其中fl为所谓的液相率,一个比较粗糙的计算公式如下(Ts和Tl分别是固相线和液相线温度,话说这个公式是根本不存在的,是个坑,很多人跳进来出不去了;其实热焓与温度关系最简单粗暴的方法是多项式拟合,而不是被吹的神乎其神但华而不实的余弦升降函数,这是后话):

 

       显而易见,热焓是温度的函数,已知某温度值就会知道其对应温度下的热焓值,知道热焓亦可知温度值,两者为一一对应的关系,就像人和身份证ID一样一一对应。

       如以一维非稳态无热源导热显示为例,则求解如下微分方程:

 

       根据初始温度可以计算得到方程右边值,即四周向控制体包围节点的传递的热量(W/m3),计算方法同前;方程左边离散后,根据右边计算值可以计算得到下一时刻节点的热焓,根据热焓温度关系公式计算其对应温度值,该温度值作为下一时刻迭代的温度初值和热焓初值,继续迭代计算。显式算法中热焓与温度的相互转换显得十分重要,根据公式可以方便由温度计算得到热焓,然而热焓公式非线性时,根据热焓计算温度场就不那么容易了,根据非线性方程求根得到,我试过Steffensen's Accelerating Convergence (Richard L. Burden & J. Douglas Faires: Numerical Analysis (7th Edition) P89),求解速度很快,适用于导数亦连续函数,而若函数表达式中包含上述液相线的表达式时,求解往往以震荡而失败,如下Demo求解3*x^2+exp(x)=0:

// fastSolve.cpp : Defines the entry point for the console application.
//


#include "stdafx.h"

#include <IOSTREAM.H>
#include <MATH.H>

#define eps 1E-6f
#define REAL float

REAL Fun(REAL x=0)
{
	return 2*log(x)+log(3);
}

REAL fsolve(REAL x=0)
{
	REAL root,y,z;

	for (int i=0;i<100;i++)
	{
		y=Fun(x);
		z=Fun(y);

		REAL divisor=(z+x-2*y);
		if (fabs(divisor)<eps)
		{
			cout<<"Two Small Divisor"<<endl;
			return root;
		}

		root=x-(y-x)*(y-x)/divisor;

		cout<<x<<";"<<root<<endl;

		if (fabs(root-x)<eps)
		{
			return root;
		}
		else
		{
			x=root;
		}
	}

	return 0;
}

int main(int argc, char* argv[])
{
	printf("Hello World!\n");

	fsolve(3.5);

	return 0;
}

       对于有多个根的情形,初值选取就必须合理,不然求解得到可能不是想要的情形,如上Demo,初值取3.5和1.1可以得到截然不同的两个正确解,以为该算法不行呢,后证明是自己不行,论证如下:

根据如下脚本对该函数绘图:

# -*- coding: utf-8 -*-
"""
Created on Wed Dec 11 09:51:49 2012

@author: Richard Jones Soong
"""

import numpy as np
import matplotlib.pyplot as plt


x=np.linspace(0,4,1000)

plt.plot(x,3*x*x-np.exp(x),label="Q")    
    
plt.xlabel("x")
plt.ylabel("y")

plt.title("Equal")
#plt.ylim(0,0.1)

#Place the Legend to ‘upper left’
plt.legend(loc=1) 

plt.show()

得到该函数形状如下,确有多重根:



       热焓方法如何使用隐式求解呢?远比显式的复杂,大家不妨尝试想想。

       很多方法可以考虑相变热,如等效比热法、温度回升法。其中温度回升法,物理意义明晰,易于理解。


  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是一个简单的Fortran程序,用于计算混凝土温度场有限元模拟: ``` ! 程序名称:混凝土温度场有限元模拟 ! 作者:Your Name ! 日期:当前日期 program concrete_temperature implicit none ! 声明变量 integer :: n_nodes, n_elements, i, j, k, node1, node2, node3, node4 real :: x, y, z, t, dt, conductivity, density, specific_heat, temp, residual real, dimension(:,:), allocatable :: conductivity_matrix, capacity_matrix, temperature, temperature_new, force_vector, stiffness_matrix ! 输入参数 n_nodes = 100 ! 节点数 n_elements = 200 ! 单元数 dt = 1.0 ! 时间步长(秒) conductivity = 1.0 ! 热导 density = 1.0 ! 密度 specific_heat = 1.0 ! 比热容 ! 动态分配内存 allocate(conductivity_matrix(n_nodes, n_nodes)) allocate(capacity_matrix(n_nodes, n_nodes)) allocate(temperature(n_nodes)) allocate(temperature_new(n_nodes)) allocate(force_vector(n_nodes)) allocate(stiffness_matrix(n_nodes, n_nodes)) ! 初始化矩阵 conductivity_matrix = 0.0 capacity_matrix = 0.0 temperature = 0.0 temperature_new = 0.0 force_vector = 0.0 stiffness_matrix = 0.0 ! 循环读取节点坐标和节点编号 do i = 1, n_nodes read(*,*) x, y, z ! 存储节点坐标 ! ... end do ! 循环读取单元编号和节点编号 do i = 1, n_elements read(*,*) j, node1, node2, node3, node4 ! 存储单元信息 ! ... end do ! 循环计算初始温度场 do i = 1, n_nodes temperature(i) = 20.0 ! 初始温度为20度 end do ! 循环计算刚度矩阵和载荷向量 do i = 1, n_elements ! 计算本地刚度矩阵和载荷向量 ! ... ! 将本地矩阵和向量组装成全局矩阵和向量 ! ... end do ! 循环计算温度场 do k = 1, 1000 ! 迭代1000次 residual = 0.0 do i = 1, n_nodes force_vector(i) = 0.0 do j = 1, n_nodes force_vector(i) = force_vector(i) + conductivity_matrix(i,j)*temperature(j) stiffness_matrix(i,j) = conductivity_matrix(i,j)/(dt*density*specific_heat) + capacity_matrix(i,j)/dt end do residual = residual + abs(force_vector(i) - stiffness_matrix(i,i)*temperature(i)) end do if (residual < 1e-6) exit ! 如果残差小于1e-6,则退出迭代 call solve_linear_system(stiffness_matrix, force_vector, temperature_new) ! 解线性方程组 temperature = temperature_new ! 更新温度场 end do ! 输出结果 do i = 1, n_nodes write(*,*) temperature(i) end do ! 释放内存 deallocate(conductivity_matrix) deallocate(capacity_matrix) deallocate(temperature) deallocate(temperature_new) deallocate(force_vector) deallocate(stiffness_matrix) end program concrete_temperature subroutine solve_linear_system(matrix, vector, solution) ! 解线性方程组 end subroutine solve_linear_system ``` 这是一个基本的有限程序,可以根据您的具体需求进行修改和优化。如果您需要更详细的帮助,请提供更多的信息,我会尽力帮助您。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值