Добрый день.
Решаю задачу течения двух жидкостей, VOF. Также определены несколько UDS.
Проблема записи в UDMI и вывода значений пользовательского коэф. диф.( C_UDSI_DIFF(c,t,i) ).
Подскажите, пожалуйста, для многофазных задачь, в функции C_UDMI_DIFF(c,t,i) t- это указатель на mixture_thread или на phase_thread ?
Также не до конца понятно, как в DEFINE_ADJUST(name, mixture_domain) обойти все ячейки, и записать значения пользовательского коэф. диф в С_UDMI.
Спасибо.
Перед началом работы настоятельно рекомендуем ознакомиться с правилами форума.
Пользовательский коэф. диф. C_UDSI_DIFF(c,t,i) для многофазных течений.
16 марта, 2021 - 19:05
#1
Здравствуйте!
Вопрос про букву t, как указатель на тред смеси или фазы не совсем корректен. Указатель может быть на что угодно, в зависимости либо от переменных главного макроса, либо от того, какие указатели ввели вы сами. Механика макроса C_UDSI_DIFF(c,t,i) должна быть аналогична C_UDSI(c,t,i) и C_UDMI(c,t,i).
Примеров по применению C_UDMI(c,t,i) в том числе и в многофазке - просто тьма во Fluent Customization Manual.
В частности, 2.3.43.4. Example 2 - Degassing Boundary Condition
/*******************************************************************
This UDF is an implementation of the degassing boundary condition
*******************************************************************/
#include "udf.h"
#include "sg.h"
#include "sg_mphase.h"
#include "flow.h"
#include "mem.h"
#include "metric.h"
DEFINE_SOURCE(degassing_source, cell, thread, dS, eqn)
{
real source;
Thread *tm = THREAD_SUPER_THREAD(thread);
source = -C_R(cell,thread)*C_VOF(cell,thread)/CURRENT_TIMESTEP ;
C_UDMI(cell,tm,0) = source;
dS[eqn] = -C_R(cell,thread)/CURRENT_TIMESTEP;
return source;
}
Используя указатель на тред фазы получили тред смеси и использовали для смеси C_UDMI
Ещё могу подсказать лайфхак - вам не обязательно использовать именно DEFINE_ADJUST для записи значений в ячейках в память. Просто там придётся самостоятельно циклы перебора граней и ячеек прописывать. Пример учебный для расчёта максимальной и минимальной температуры:
DEFINE_ADJUST(post_adjust, d)
{
real T_min = REAL_MAX, T_max = 0.0;
Thread *t;
cell_t c;
/* Check for UDMs */
if (N_UDM < 1) {
Message("\n Error: No UDM defined! Abort UDF execution.\n");
return;
}
/* Loop over all cell threads */
thread_loop_c(t, d)
{
/* Loop over all cells */
begin_c_loop(c, t)
{
/* Calculate and store °C temperature in first UDM */
C_UDMI(c, t, 0) = C_T(c, t) - 273.15;
/* Check for min/max */
if (C_T(c, t) < T_min) T_min = C_T(c, t);
if (C_T(c, t) > T_max) T_max = C_T(c, t);
}
end_c_loop(c, t)
}
/* Convert to °C just before printing min/max, */
T_min -= 273.15;
T_max -= 273.15;
Message(" Minimum temperature = %.1f degC\tMaximum temperature = %.1f degC\n", T_min, T_max);
}
Вы можете использовать это в рамках другого макроса, который сам ходит по ячейкам, например, DEFINE_SOURCE.
Доброе утро.
Если написать так, то при в UDMI запишется только значения дифф. для 2ой фазы (во всех ячейках жидкостного домена будет одно значение). Аналогично получится если использовать цикл mt_thread_loop_c().
DEFINE_ADJUST(my_adjust, mixture_domain)
{
real diff;
Thread *cell_thread;
cell_t c;
thread_loop_c (cell_thread,mixture_domain)
{
begin_c_loop_all (c,cell_thread)
{
diff=C_UDSI_DIFF(c,cell_thread,0);
C_UDMI(c,cell_thread,0)=diff;
}
end_c_loop_all (c,cell_thread)
}
}
Дак может быть у вас скаляр для второй фазы?
Скаляр определен для mixture.
У каждой фазы свой коэф.диф.
И даже вставлен для Cell Zone на уровне mixture? Но ведь в VOF как бы нет смеси как таковой. Там чёткий интерфейс
Очень мутная задача, очень мало инфы
Да, вставлен для Cell Zone на уровне mixture. В VOF вроде UDS можно задать только для уровня mixture в cell zone. ( в eulerian vof можно для каждой фазы задать).
Если выводить контуры UDS-Diff.coef of Scalar - выводит все коректно, у фаз разные коэф. диффузии.
Если выводить контуры UDMI 0 - выводит все только для одной фазы (почему-то для 2).
Вроде через, mp_thread_loop_c получилось сделать.
Добавить комментарий