Tips&Tricks: Решение нестационарных задач в ANSYS CFD

timeУ Джефри Чосера — «любимого» поэта английских королей — есть хороший афоризм про время: «Time and tide wait for no man». Тема скоротечности времени всплывает и в речи M, которая дает достойный отпор всем недоброжелателям МИ-6 в зале суда.

Что объединяет корифеев английской поэзии с вычислительной гидродинамикой? Ответ простой. Любая задача, которая решается в нестационарной постановке, т. е. в которой дискретизации подвергаются не только независимые переменные, относящиеся к пространству, но и переменная время. Поэтому сегодня мы рассмотрим с вами различные вопросы, связанные с решением нестационарных задач в газодинамических пакетах ANSYS CFX и ANSYS Fluent. Мы поговорим об обработке результатов нестационарных расчетов, программировании и многом другом. Большая часть материалов данного поста основана на реальных запросах пользователей в службу технической поддержки компаний ANSYS и КАДФЕМ.

quotefancy-357338-3840x2160

Вопрос 1. Как остановить нестационарный расчет в ANSYS Fluent, например, если температура в заданной точке (узле, средняя по объему, поверхности и пр.) достигла пороговой величины? Для этого можно использовать следующий UDF-макрос.

Код UDF (Stop Solver)

# include "udf.h"
/*********************************************************************************************/
/********************************* User input starts *****************************************/
real xmin=0.04, xmax=0.041, ymin=0.01, ymax=0.011, zmin=0.002, zmax=0.003;
real limit=340;
/********************************** User input ends ******************************************/
/*********************************************************************************************/

DEFINE_EXECUTE_AT_END(execute_at_end)
{

Domain *d;
Thread *t;
real sum_tempvol=0., sum_vol=0, vol_avg_temp;
real sum_tempmass=0., sum_mass=0, mass_avg_temp;
cell_t c;
real xc[ND_ND];

d = Get_Domain(1);
#if !RP_HOST /*serial or node*/
thread_loop_c(t,d)
{
if (FLUID_THREAD_P(t))
{
begin_c_loop_int(c,t)
C_CENTROID(xc,c,t);
if (xc[0] > xmin && xc[0] < xmax) { if (xc[1] > ymin && xc[1] < ymax) { if (xc[2] > zmin && xc[2] < zmax)
{
sum_tempvol += C_T(c,t) * C_VOLUME(c,t);
sum_tempmass += C_T(c,t) * C_R(c,t) * C_VOLUME(c,t);
sum_vol += C_VOLUME(c,t);
sum_mass += C_R(c,t) * C_VOLUME(c,t);
}
}
}
end_c_loop_int(c,t)
}
}
#endif

#if !RP_HOST /* not host */
vol_avg_temp = PRF_GRSUM1(sum_tempvol)/PRF_GRSUM1(sum_vol) ;
mass_avg_temp = PRF_GRSUM1(sum_tempmass)/PRF_GRSUM1(sum_mass) ;
#endif

node_to_host_real_2(vol_avg_temp,mass_avg_temp);

#if !RP_NODE
Message("Volume Averaged Temperature (K): %gn", vol_avg_temp);
Message("Mass Averaged Temperature (K): %gn", mass_avg_temp);

if (mass_avg_temp < limit)
{
RP_Set_Integer("converged",1);
Message("Temperature has dropped below limit %g n", limit);
}
#endif

}

Для использования данного макроса вам необходимо его откомпилировать (проверено для версии не ниже 17.0). И определить следующую команду (в строке exceute command): (if (= (%rpgetvar ‘converged) 1) (begin (ti-menu-load-string «/file/wcd low-temp-trig-%t.cas») (ti-menu-load-string «exit»))).

Как работает данный UDF-макрос? В процессе итераций выполняется проверка на достижении выбранной переменной заданного порогового значения. Если условие выполняется, то записываются *.cas и *.dat файлы.  И выполняется команда выхода.

Сегодня я успел рассмотреть только один вопрос. Но это только начало. В следующем году обязательно продолжим.

Всех с наступающим Новым годом и Рождеством!

С уважением, Денис П. Хитрых,
Директор АО «СимуЛабс».
2016-11-21_16-58-13

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *