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

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

Циклы в UDF

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

Доброго времени суток, уважаемые форумчане. Прошу вас оказать помощь с моим проектом. Мне нужно задать источник теплоты функцией, в которой нужно указать координату наиболее удаленной точки моей геометрической модели. Я не нашел для этого другого способа кроме как просто перебрать все точки моей модели. При попытке интерпритировать код Fluent выводит следующее сообщение: 

line 17: structure reference not implemented

Ниже приведен код.

  1. #include "udf.h"
  2. #include "metric.h"
  3. #include "mem.h"
  4.  
  5. DEFINE_SOURCE(heat_source2, cell, thread, dS, eqn)
  6. {
  7.     real x[ND_ND];
  8.     real source;
  9.     real PI = 4.*atan(1.);
  10.     cell_t c;
  11.     int n;
  12.     Node *node;
  13.     
  14.     real maxX = 0;
  15.     real maxY = 0;
  16.     begin_c_loop(c, thread) {
  17.         f_node_loop(c, thread, n) {
  18.             node = C_NODE(c, thread, n);
  19.             if (NODE_X(node) > maxX) maxX = NODE_X;
  20.             if (NODE_Y(node) > maxY) maxY = NODE_Y;
  21.         }
  22.     }
  23.     end_c_loop(cell, thread);
  24.      C_CENTROID (x, cell, thread);
  25.      source = 450000000.*(1-(2.405*sqrt(x[1]*x[1]+x[0]*x[0])/maxX)*(2.405*sqrt(x[1]*x[1]+x[0]*x[0])/maxX)/4+(2.405*sqrt(x[1]*x[1]+x[0]*x[0])/maxX)*(2.405*sqrt(x[1]*x[1]+x[0]*x[0])/maxX)*(2.405*sqrt(x[1]*x[1]+x[0]*x[0])/maxX)*(2.405*sqrt(x[1]*x[1]+x[0]*x[0])/maxX)/64);
  26.      dS[eqn] = 0.;
  27.     return source;
  28.  }
     
dvolkind
Аватар пользователя dvolkind

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

У вас реализован цикл перебора узлов граней внутри цикла перебора ячеек. Должно быть

thread_loop_f(ft,d)

{

     begin_f_loop(f,ft)

    {

        f_node_loop(f,t,n)

        {

            ...

        }

    }

    end_f_loop(f,ft)

}

т.е. три вложенных цикла.

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

Припопытке интерпретации все равно ругается на строку f_node_loop(f,t,n) и выдает structure reference not implemented

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

попробуйте скомпилить

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

Хорошо. Попробую

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

К сожалению, при попытке скомпилировать при нажатии клавиши load Fluent Выводит следующее:

Opening library "C:\Doc\Ansys Documents\1mTVEL2mm_files\dp0\FFF\Fluent\C:\Doc\Ansys Documents\1mTVEL2mm_files\dp0\FFF\Fluent\libudf"...RPC RCX_SC_SET_ERR_MSG failed: RPC: Can't encode arguments


Error: The UDF library you are trying to load (C:\Doc\Ansys Documents\1mTVEL2mm_files\dp0\FFF\Fluent\libudf) is not compiled for 3d on the current platform (win64).

Не удается найти указанный файл.

C:\Doc\Ansys Documents\1mTVEL2mm_files\dp0\FFF\Fluent\C:\Doc\Ansys Documents\1mTVEL2mm_files\dp0\FFF\Fluent\libudf\win64\3d\libudf.dll

Error: EOF in string read
Error Object: ()
 

Не подскажете как решить эту проблему?

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

Он не находит нужную dll. Либо вы компилировали в 2d, а загружаете в 3d, либо компилировали с другой точностью (single/double), либо компиляция вообще не прошла. Если хотите, могу у себя попробовать.

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

Я подозреваю, компиляция прошла, так как при нажатии клавишь build в командной строке выводится следующее сообщение: 

Copied C:\Doc\Ansys Documents    vel_energy.c to libudf55\src
Creating user_nt.udf file for 3d ...
(system "copy "C:\PROGRA~1\ANSYSI~1\v162\fluent"\fluent16.2.0\src\udf\makefile_nt.udf "libudf55\win64\3d\makefile" ")
‘Є®ЇЁа®ў ­® д ©«®ў:         1.
(chdir "libudf55")(chdir "win64\3d")"nmake" ­Ґ пў«пҐвбп ў­гв७­Ґ© Ё«Ё ў­Ґи­Ґ©
Є®¬ ­¤®©, ЁбЇ®«­пҐ¬®© Їа®Ја ¬¬®© Ё«Ё Ї ЄҐв­л¬ д ©«®¬.

Done.
 

Если не трудно, можете попробовать скомпилировать у себя?

 

#include "udf.h"
#include "metric.h"
#include "mem.h"

 

DEFINE_SOURCE(heat_source2, cell, thread, dS, eqn)
{
    real x[ND_ND];
    real source;
    real PI = 4.*atan(1.);

    face_t c;
    int n;
    Node *node;
    Domain *d;
    //Thread *c_thread = DT_THREAD(thread);
    real maxX = 0;
    real maxY = 0;

    thread_loop_f(thread, d)
    {
        begin_f_loop(c, thread)
        {
            f_node_loop(c, thread, n)
            {
                node = F_NODE(c, thread, n);
                if (NODE_X(node) > maxX) maxX = NODE_X;
                if (NODE_Y(node) > maxY) maxY = NODE_Y;
            }
        }
        end_f_loop(cс, thread)
    }

     C_CENTROID (x, cell, thread);
     source = 450000000.*(1 - (2.405*sqrt(x[1] * x[1] + x[0] * x[0]) / maxX)*(2.405*sqrt(x[1] * x[1] + x[0] * x[0]) / maxX) / 4 + (2.405*sqrt(x[1] * x[1] + x[0] * x[0]) / maxX)*(2.405*sqrt(x[1] * x[1] + x[0] * x[0]) / maxX)*(2.405*sqrt(x[1] * x[1] + x[0] * x[0]) / maxX)*(2.405*sqrt(x[1] * x[1] + x[0] * x[0]) / maxX) / 64);
     dS[eqn] = 0.;
    return source;
 }

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

Компиляция не прошла, т.к. флюент у вас не находит nmake. В этом можно убедиться, скопировав странные символы в виндовый notepad и поменяв шрифт на Terminal. Возможные причины:

1) у вас не стоит Visual Studio;

2) вы сняли в лаунчере галку set up compilation environment for UDF;

3) VS стоит, но у неё слишком новая/старая версия, либо она установлена в нестандартную директорию.

В первых двух случаях решение очевидно. В третьем случае проще всего запустить лаунчер (...\ANSYS Inc\v181\fluent\fluent18.1.0\launcher\win64\launcher1.exe) из-под командной строки VS (напр. x64 Native Tools Command Prompt for VS 2017), тогда флюенту будут видны все нужные пути в переменных. Для удобства постоянного использования можно отредактировать скрипт udf.bat, чтобы он искал пути в правильных местах (либо вообще их туда захардкодить). Также можно прописать все нужные пути в PATH - смотрите, на какие исполняемые файлы ругается флюент (первый из них - nmake.exe), ищите их в директории установки и добавляйте пути в переменную. Чтобы искать быстрее, можно, например, в командной строке VS написать "where nmake". Вообще тут много способов.

Когда ваши флюент и компилятор подружатся, последний при нажатии Build выдаст ошибку c2065, т.к. у вас косяк в строках 28 и 29. Должно быть

                if (NODE_X(node) > maxX) maxX = NODE_X(node);
                if (NODE_Y(node) > maxY) maxY = NODE_Y(node);

С этим исправлением у меня всё скомпилилось и загрузилось.

Такие дела.

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

Спасибо за помощь. У меня как раз третий случай. Я прописал все нужные пути в PATH, исправил код и все заработало.

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

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

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