Доброго времени суток, уважаемые форумчане. Прошу вас оказать помощь с моим проектом. Мне нужно задать источник теплоты функцией, в которой нужно указать координату наиболее удаленной точки моей геометрической модели. Я не нашел для этого другого способа кроме как просто перебрать все точки моей модели. При попытке интерпритировать код Fluent выводит следующее сообщение:
line 17: structure reference not implemented
Ниже приведен код.
- #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.);
- cell_t c;
- int n;
- Node *node;
- real maxX = 0;
- real maxY = 0;
- begin_c_loop(c, thread) {
- f_node_loop(c, thread, n) {
- node = C_NODE(c, thread, n);
- if (NODE_X(node) > maxX) maxX = NODE_X;
- if (NODE_Y(node) > maxY) maxY = NODE_Y;
- }
- }
- end_c_loop(cell, 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;
-
}
Здравствуйте!
У вас реализован цикл перебора узлов граней внутри цикла перебора ячеек. Должно быть
thread_loop_f(ft,d)
{
begin_f_loop(f,ft)
{
f_node_loop(f,t,n)
{
...
}
}
end_f_loop(f,ft)
}
т.е. три вложенных цикла.
Припопытке интерпретации все равно ругается на строку f_node_loop(f,t,n) и выдает structure reference not implemented
попробуйте скомпилить
Хорошо. Попробую
К сожалению, при попытке скомпилировать при нажатии клавиши 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: ()
Не подскажете как решить эту проблему?
Он не находит нужную dll. Либо вы компилировали в 2d, а загружаете в 3d, либо компилировали с другой точностью (single/double), либо компиляция вообще не прошла. Если хотите, могу у себя попробовать.
Я подозреваю, компиляция прошла, так как при нажатии клавишь 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;
}
Компиляция не прошла, т.к. флюент у вас не находит 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);
С этим исправлением у меня всё скомпилилось и загрузилось.
Такие дела.
Спасибо за помощь. У меня как раз третий случай. Я прописал все нужные пути в PATH, исправил код и все заработало.
Добавить комментарий