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

Не работает UDF

8 сообщений / 0 новое
Последняя публикация
orion
Аватар пользователя orion

Здравтвуйте, уважаемые форумчане. Пытаюсь решить задачу с внутренним источником теплоты. При начале расчета 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;
 }

 

Прошу подсказать где я был не прав.

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

Цитата:
end_f_loop(cс, thread)

навскидку тут вижу опечатку

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

Опечатку исправил, но ошибка все равно осталась

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

Вы ещё определитесь с переменными. А то у вас "c" означает грань, в циклах thread, который изначально означает ячеечный тред и передаётся аргументом в DEFINE_SOURCE, подменяется на тред граней. Используйте в циклах вместо thread другое имя, например, f_thread, предварительно объявив соответствующий указатель (Thread *f_thread). Не уверен, решит ли это все проблемы, т.к. не могу сейчас проверить. Если не решит, вышлите какой-нибудь простой case для тестирования. Попозже смогу глянуть.

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

Я исправил, но не помогло, так что высылаю архив для тестирования. К сожалению раньше отправить не смог.

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

После внесения отмеченного жирным шрифтом исправления у меня считает без ошибок. За физичность не отвечаю, т.к. формулу устал читать. Вообще читайте сообщения компилятора в консоли - они указывают, в какой строке ошибка. У вас он ругался на неинициализированную переменную 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;
}

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

PS Единица в качестве идентификатора домена канает в любой однофазной задаче. В многофазной задаче каждой фазе соответствует свой домен.

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

благодарю за помощь

Тема закрыта