在粒子束中定义用户编码的能量源
在简单案例中,可使用场函数对颗粒的内部加热进行建模,但可使用用户编码对更复杂的案例建模。 此示例比较将铝颗粒喷射到方盒中的两种瞬态模拟方法。
1.0E8 W/m3 的恒定能量源可在 0.05 秒的模拟时间内加热颗粒,将其温度从 300 度升高到 301.12 度。 由于热源恒定,因此温度随停留时间而线性增加。
由于在拉格朗日求解步骤的子步期间发生其他物理过程,因此部分粒子束分布可能会失效。 在分布上运行之前,用户程序必须检查 parcelId(粒子束 ID) 的有效性。 除了计算热源所需的参数之外,分布还必须将 parcelId(粒子束 ID) 作为参数传入。
子例程 uflib.f 将注册 parcelId(粒子束 ID) 和温度:
subroutine uflib()
use StarRealMod
implicit none
c Register user functions
external parcelQdot
call uffunc(parcelQdot,
& "ParcelProfile",
& "Parcel Heat Source")
call ufarg(parcelQdot,
& "Parcel",
& "ParcelId",
& StarInt)
return
end
将热源应用到域中的粒子束的用户程序如下:
subroutine parcelQdot(result,size,Id)
c parcel heat source example
use StarRealMod
integer, intent(in) :: size
real(StarReal), intent(out) :: result(size)
real(StarInt), intent(in) :: Id(*)
real(StarInt), parameter :: NULL_INDEX = -1
integer i
do i = 1, size
if (Id(i) .gt. NULL_INDEX) then
result(i) = 1e8
endif
end do
return
end
与用户自定义的内部热源相比,上述场函数和用户程序可产生相同的结果:
在上图中,相 1 对应于内部计算的粒子束热通量,相 2 对应于用户编码的粒子束热通量。 对于这种情况,由于颗粒时间在喷射过程中略微错开,因此停留时间稍有不同。 但是,在这两种情况下,颗粒温度与停留时间成线性比例。