Здравтвуйте, уважаемые форумчане. Пытаюсь решить задачу с внутренним источником теплоты. При начале расчета fluent выдает следующее:
Error: received a fatal signal (Segmentation fault).
Error: received a fatal signal (Segmentation fault).
Error Object: #f
Вот при помощи чего задал источник теплоты:
#include "udf.h"
#define PI 3.1416
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(node);
if (NODE_Y(node) > maxY) maxY = NODE_Y(node);
}
}
end_f_loop(cс, thread)
}
FILE *fp;
fp = fopen("g.txt", "w");
fprintf(fp, "%g", maxX);
fprintf(fp, "\n%g", maxY);
fclose(fp);
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;
}
Прошу подсказать где я был не прав.
навскидку тут вижу опечатку
Опечатку исправил, но ошибка все равно осталась
Вы ещё определитесь с переменными. А то у вас "c" означает грань, в циклах thread, который изначально означает ячеечный тред и передаётся аргументом в DEFINE_SOURCE, подменяется на тред граней. Используйте в циклах вместо thread другое имя, например, f_thread, предварительно объявив соответствующий указатель (Thread *f_thread). Не уверен, решит ли это все проблемы, т.к. не могу сейчас проверить. Если не решит, вышлите какой-нибудь простой case для тестирования. Попозже смогу глянуть.
Я исправил, но не помогло, так что высылаю архив для тестирования. К сожалению раньше отправить не смог.
После внесения отмеченного жирным шрифтом исправления у меня считает без ошибок. За физичность не отвечаю, т.к. формулу устал читать. Вообще читайте сообщения компилятора в консоли - они указывают, в какой строке ошибка. У вас он ругался на неинициализированную переменную d.
#include "udf.h"
DEFINE_SOURCE(heat_source2, cell, thread, dS, eqn)
{
real x[ND_ND];
real source;
face_t ff;
int n;
Node *node;
Domain *d;
Thread *f_thread;
real maxX = 0;
real maxY = 0;
d = Get_Domain(1);
thread_loop_f(f_thread, d)
{
begin_f_loop(ff, f_thread)
{
f_node_loop(ff, f_thread, n)
{
node = F_NODE(ff, f_thread, n);
if (NODE_X(node) > maxX) maxX = NODE_X(node);
if (NODE_Y(node) > maxY) maxY = NODE_Y(node);
}
}
end_f_loop(ff, f_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;
}
PS Единица в качестве идентификатора домена канает в любой однофазной задаче. В многофазной задаче каждой фазе соответствует свой домен.
благодарю за помощь
Добавить комментарий