Все ответы об инженерном анализе

Перед началом работы настоятельно рекомендуем ознакомиться с правилами форума.

Пользовательский коэф. диф. C_UDSI_DIFF(c,t,i) для многофазных течений.

EvgeniiRylkov
Аватар пользователя EvgeniiRylkov

Добрый день.
Решаю задачу течения двух жидкостей, 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.
Спасибо.

ershovmih
Аватар пользователя ershovmih

Здравствуйте!


Вопрос про букву 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.

EvgeniiRylkov
Аватар пользователя EvgeniiRylkov

Доброе утро.
Если написать так, то при в 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)
    }
}

ershovmih
Аватар пользователя ershovmih

Дак может быть у вас скаляр для второй фазы?

EvgeniiRylkov
Аватар пользователя EvgeniiRylkov

Скаляр определен для mixture.
У каждой фазы свой коэф.диф.
 

ershovmih
Аватар пользователя ershovmih

И даже вставлен для Cell Zone на уровне mixture? Но ведь в VOF как бы нет смеси как таковой. Там чёткий интерфейс

Очень мутная задача, очень мало инфы

EvgeniiRylkov
Аватар пользователя EvgeniiRylkov

Да, вставлен для Cell Zone на уровне mixture. В VOF вроде UDS можно задать только для уровня mixture в cell zone. ( в eulerian vof можно для каждой фазы задать).
Если выводить контуры UDS-Diff.coef of Scalar - выводит все коректно, у фаз разные коэф. диффузии.
Если выводить контуры UDMI 0 - выводит все только для одной фазы (почему-то для 2).

EvgeniiRylkov
Аватар пользователя EvgeniiRylkov

Вроде через, mp_thread_loop_c получилось сделать.

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

Войдите или зарегистрируйтесь, чтобы отправлять комментарии
Приложить файл

Максимальный размер файла: 999 МБ.
Допустимые типы файлов: txt doc docx xls xlsx pdf rar zip 7zip tar.