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

Рекомендации по DEBUG 'инку UDF.

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

Добрый день. 
Подскажите, порекомендуйте средства для debug'a функций UDF. Хотелось бы отслеживать значения переменных, моменты когда крашется fluent и тп.
Спасибо) 

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

Приветствую, Евгений.

Рекомендую записывать отслеживаемые величины в различные ячейки пользовательской памяти UDM.

Для начала не используйте макросы, которые воздействуют на поля величин (DEFINE_PROFILE, DEFINE_SOURCE...)
Вместо этого отследите, какие цифры код использует в памяти в рамках макросов общего назначения DEFINE_ADJUST, DEFINE_EXECUTE_AT_END и DEFINE_ON_DEMAND.

Привожу пример кода, который выводит максимальную и минимальную температуру в домене:

 

#include "udf.h"

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;
  Message0(" Minimum temperature = %.1f degC\tMaximum temperature = %.1f degC\n", T_min, T_max);
}

Макрос Message0 удобнее использовать, так как он выводит информацию с хост-процесса. Макрос Message выводит информацию с узлов и может быть неудобен при использовании нескольких ядер.

В более трудных случаях может потребоваться распараллеливание при постобаботке.

 

 

 

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

Спасибо! Запись в UDM практикую, помогает. Мессаджи использую реже, возьму на вооружение.
Но Fluent любит вылетать, не объясняя причин, например когда указатель на thread определен не верно / равен NULL.  Особенно когда работаешь с мультифазными течениями. В таких случаях debug превращается в мучение. Иногда даже сложно понять на какой строчке все крашется.

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

Коллега, я Вас понимаю! Прям боль. Один вариант, которым пользуюсь и работает: добавлять по одной-две строчки... ничего другого не придумал. 

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

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

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