用户自定义反应率源项

可以修正内部计算出的反应率源项、单独的反应率,或者定义全新的反应率源项。

有三种用户编程的反应率函数。
  • 自定义反应源项

    Simcenter STAR-CCM+ 不初始化函数参数中传递的源组分表。在以下部分中,此用户函数称为 wdotCalculate()(虽然可以在用户程序中给定任何名称)。当计算的反应组分源不单是内部阿列纽斯率源的倍数时,自定义反应源项较为适用。

  • 已修改的反应源项

    Simcenter STAR-CCM+ 最初计算内部阿列纽斯组分源,并将其复制到函数参数列表中传递的源组分表。在以下示例中,此用户函数称为 wdotModify()(虽然可以在用户程序中给定任何名称)。当通过因子(通常是常数)修改内部阿列纽斯组分源时,已修改的反应源项较为适用。

  • 单独反应的修正内部速率

    Simcenter STAR-CCM+ 初始通过 Eqn. (3363) / Eqn. (3394) 计算内部正向和逆向反应率,然后将结果复制到在函数自变量列表中传递的源组分。在下文中,此用户函数称为 reactionRateModify()(虽然可以在用户程序中给定任意名称)。修正反应率适合用于修正化学机制中所有反应的内部计算出的反应率。

    对于不可逆反应,内部计算出的逆反应率为 0。
wdotModify()wdotCalculate() 的用户自定义反应率源项的函数签名为:
 void wdotModify(double *omega, double T, unsigned int nSpe, double *zi, void *data)

用于修正单个反应率 reactionRateModify() 的函数签名为:

void reactionRateModify(double *reacRateForward, double *reacRateBackward, double T, unsigned int nSpe, double *zi, void *data)

其中,

气相中的反应 表面反应
nSpe(类型为无符号整数) 混合物中组分的量。 nSpe = nGas + nSite + nBulk(其中 nGasnSitenBulk 分别为气相组分、表面点位组分和主要组分的数量)。
zi 比摩尔分数(等于第 i 个组分的质量分数除以第 i 个组分的分子量,其中分子量单位为 kg/kmol)的矢量(类型为双精度,大小为 nSpe)的指针。 气相比摩尔分数、表面点位分数、总体活性和网格单元温度的矢量(类型为双精度、大小为 nSpe)的指针。
omega

默认单位为 kmol/kg-s。

组分源项的输出矢量(类型为双精度,大小为 nSpe)的指针,组分源项是比摩尔分数(第 i 个组分的质量分数除以第 i 个组分的分子量)的变化率。 气相组分比摩尔分数、表面点位分数和总体活性的源项的输出矢量(类型为双、大小为 nSpe)的指针。

对于多孔化学,omega 还具有网格单元焓源项 (J/kg-s)(作为最后一个元素)。

reacRateForward 所有正向反应率的组分(类型为双精度、大小为 nReactions)的指针。

默认单位为 kmol/kg-s。

所有正向表面反应率的组分(类型为双精度、大小为 nReactions)的指针。

默认单位为 mol/cm2-s。

reacRateBackward 所有逆向反应率的组分(类型为双精度、大小为 nReactions)的指针。

默认单位为 kmol/kg-s。

所有逆向表面反应率的数组(类型为双精度、大小为 nReactions)的指针。

默认单位为 mol/cm2-s。

T(类型为双精度) 温度 (K) 壁面温度 (K)
data UserAccessibleData 中定义的 UserAccessibleData struct 的指针。

UserAccessibleData

UserAccessibleData 用于将数据从 Simcenter STAR-CCM+ 传输到用户程序。要启用用户编码,将以下文本复制到文件并另存为 UserAccessibleData.h。然后,可使用 include 语句将可由用户访问的数据提供给包含用户编码的文件。

组分和反应名称作为 UserAccessibleData 结构的一部分进行传递。UserAccessibleData 中的值具有 SI 单位。
#ifndef _UserAccessibleData_h
#define _UserAccessibleData_h

struct UserAccessibleData {
   double _pressure; // absolute pressure (Pa)
   double _dt; // time step size (s)
   double _volume; // (m^3)
   double _volumeFraction; // liquid volume fraction of VOF model
   double _turbLen; // (m)
   double _turbTime; // (s)
   double _totalTime; // for unsteady simulations, current total time (s)

   struct FluidFilmData {
     double _fluidFilmThick; // (m)
     double _shellArea; // (m^2)
   } _fluidFilmData;

   struct SurfaceChemistryData {
     double _area; // (m^2)
     unsigned int _nGas;
     unsigned int _nBulk;
     unsigned int _nSite;
     unsigned int _isPorousRegion;
     unsigned int _nSiteMaterials;
     unsigned int _nBulkMaterials;
     unsigned int *_nSitePerMaterial;
     unsigned int *_nBulkPerMaterial;
   } _surfaceChemistryData;

   struct ReactingChannelData {
     double _massFlow; // (kg/s)
     double _velocity; // (m/s)
   } _reactingChannelData;

   struct ReactionData {
     unsigned int _nReactions;

     unsigned int *_nGasReactants;
     unsigned int *_nGasProducts;
     unsigned int *_nSiteReactants;
     unsigned int *_nSiteProducts;
     unsigned int *_nBulkReactants;
     unsigned int *_nBulkProducts;
  
     double **_gasStoichiometryReactants; 
     double **_bulkStoichiometryReactants; 
     double **_siteStoichiometryReactants; 
     double **_bulkReactantRateExponents; 
     double **_siteReactantRateExponents; 
     double **_gasReactantRateExponents;
     unsigned int **_gasReactantSpeciesIndex;
     unsigned int **_siteReactantSpeciesIndex;
     unsigned int **_bulkReactantSpeciesIndex;
  
     double **_gasStoichiometryProducts; 
     double **_bulkStoichiometryProducts; 
     double **_siteStoichiometryProducts; 
     double **_bulkProductRateExponents; 
     double **_siteProductRateExponents; 
     double **_gasProductRateExponents;
     unsigned int **_gasProductSpeciesIndex;
     unsigned int **_siteProductSpeciesIndex;
     unsigned int **_bulkProductSpeciesIndex;
   } _reactionData;

   struct ReactionPropertyDataGeneral {
     double *_lnA; // depends on reaction order (cm, mol, s, K)
     double *_b; 
     double *_E; // Ea/Ru (universal gas constant) (K)
     double *_lnA_REV; // depends on reaction order (cm, mol, s, K)
     double *_b_REV;
     double *_E_REV;  // Ea/Ru (universal gas constant) (K)
     unsigned int *_isReversible;
     unsigned int *_isREVreaction;
     char **_reactionName;
  } _reactionPropertyDataGeneral;

   struct ReactionPropertyDataFluid {
     double *_lnA_low; // depends on reaction order (cm, mol, s, K)
     double *_b_low;
     double *_E_low; // Ea/Ru (universal gas constant) (K)
     unsigned int *_hasPlog;
     unsigned int *_hasThirdBody;
     unsigned int *_hasCabm;
     unsigned int *_isBathGasReaction;
     unsigned int *_PressDepType; // 0 - no, 1-general, 2-Troe, 3-sri
     int *_bathGasMaterialIndex;
     unsigned int *_ThirdBodyCoeffSize;
     unsigned int *_PlogSize;
     unsigned int *_TroeSRISize;

     unsigned int **_ThirdBodyIndex;
     double **_ThirdBodyCoeff;
     double **_TroeSRICoeffs;
     double **_PlogCoeffs;

     unsigned int *_useElectronTemp;
     unsigned int *_isExciRxn;
     double *_exciValue; // (J)
   } _reactionPropertyDataFluid;

   struct ReactionPropertyDataSurface {
     double *_bohmCoefficient;
     unsigned int *_isReactionBohm;
     double *_stickyCoefficient;
     unsigned int *_isReactionSticky;
     unsigned int *_isMotzWiseOff;
     unsigned int *_isReactionLangmuir;
     unsigned int *_reactionCoverageFactorsSize;

     unsigned int **_coverageFactorIndex;
     double **_coverageFactorEta;  
     double **_coverageFactorMu;  
     double **_coverageFactorEaR;  
     double **_langmuirCoeffs;
   } _reactionPropertyDataSurface;
   
   struct FluidPhaseProperties {
     unsigned int _nGas;
     double *_molecularWeight; // (kg/kmol)
     double *_Tmin; // (K)
     double *_Tmid;  // (K)
     double *_Tmax; // (K)
     unsigned int *_cpHiSicoeffsSize;
     unsigned int *_cpHiSiTrangeSize;
     double **_cpHiSicoeffs; // nasa polynomial coefficients
     double **_cpHiSiTrange; // (K)
     char **_speciesName;
   } _fluidPhaseProperties;

   struct SurfaceMaterialProperties {
     double *_siteMolecularWeight; // (kg/kmol)
     double *_siteOccupancies;
     double *_siteDensity; // (kmol/m^2)
     unsigned int *_isOpenSite;
     double *_TminSite; // (K)
     double *_TmidSite; // (K)
     double *_TmaxSite; // (K)
     unsigned int*_cpHiSicoeffsSiteSize;
     unsigned int*_cpHiSiTrangeSiteSize;
     double **_cpHiSicoeffsSite; // nasa polynomial coefficients
     double **_cpHiSiTrangeSite; // (K)
     double *_bulkMolecularWeight; // (kg/kmol)
     double *_bulkDensity; // (kg/m^3)
     double *_TminBulk; // (K)
     double *_TmidBulk; // (K)
     double *_TmaxBulk; // (K)
     unsigned int*_cpHiSicoeffsBulkSize;
     unsigned int*_cpHiSiTrangeBulkSize;
     double **_cpHiSicoeffsBulk; // nasa polynomial coefficients
     double **_cpHiSiTrangeBulk; // (K)
     char **_siteSpeciesName;
     char **_bulkSpeciesName;
   } _surfaceMaterialProperties;

   struct ElectronTemperature {
     double _electronTemp;
   } _electronTemperature; 

   struct FieldFunctionsData {
     unsigned int _nFF;
     double *_ffVal;
     char **_ffName;
   } _fieldFunctionsData;
};

#endif
为向后兼容,之前版本中保存的 UserAccessibleData 仍可用于当前版本的 Simcenter STAR-CCM+

修改反应源项

以下文本是用户编程反应率函数的示例,该函数可修改内部阿列纽斯组分源,方法是将其乘以与每个网格单元中的压力成比例的常数因子。
 
#include "UserAccessibleData.h"

	void wdotModify(double *omega, double T, unsigned int nSpe, double *zi, void *data)
	{
			// modify the internal Arrhenius reaction rate to be p / pref
			struct UserAccessibleData *udata = (struct UserAccessibleData *)data;
 		double const factor = udata->_pressure / 101325.;

			for( unsigned int i=0; i<nSpe +1; i++ )
				omega[i] *= factor;
	}

	void wdotJacModify(double *jac, double T, unsigned int nSpe, double *zi, void *data)
	{
 		// modify the internal Arrhenius reaction rate to be p / pref
 		struct UserAccessibleData *udata = (struct UserAccessibleData *)data;
			double const factor = data->_pressure / 101325.;

		 for( unsigned int i=0; i<(nSpe+1)*(nSpe+1); i++ )
				jac[i] *= factor;
	}

	void uclib()
	{

 	ucfunc(wdotModify, "ReactionRate", "wdot");
 	ucfunc(wdotJacModify, "ReactionRate", "wdotJac");
	}

修正单独反应的内部速率

以下文本是用户编程反应率函数的示例以修正所有单独反应的速率,方法是将其乘以每个网格单元中的常数因子。
 #include "UserAccessibleData.h"

	void reactionRateModify(double *reacRateForward, double *reacRateBackward, double T, unsigned int nSpe, double *zi, void *data)
{
 	 struct UserAccessibleData *udata = (struct UserAccessibleData *)data;
  	unsigned int nReactions = udata->_reactionData._nReactions;
  	int i;
 
 		 for (i = 0; i < nReactions; ++i) 
  {
 		 reacRateForward[i] *= 2.0;
  		reacRateBackward[i] *= 2.0;
  }

}
/*
 	Register user-code functions
*/
	void uclib()
{
   	ucfunc(reactionRateModify, "IndividualReactionRate", "reacRateModify");
  		


}

创建自定义反应源项

当使用用户编程反应率时,强烈建议对“组分反应源雅可比”使用(默认)“数字”选项(在反应 > 反应系统属性节点下)。请参见反应系统属性。必须使用以下签名提供函数 wdotJacCalculate()wdotJacModify()

 void wdotJacModify(double *jac, double T, unsigned int nSpe, double *zi, void *data)

大小为 (nSpe+1)2 的双精度组分表雅可比是组分源项加上温度源项的矢量的雅可比。组分源项是特定摩尔分数的变化率。