Добрый день уважаемые форумчане!
История такая: есть 2 udf. Один DEFINE_ADJUST и DEFINE_MASS_TRANSFER (в консоли указал, что используется другой тип MASS_TRANSFER, тут все норм).
В первом udf считается всякая полезная фигня, а потом, по идее, передается в DEFINE_MASS_TRANSFER через C_UDMI - так оно выглядит в проекте.
Если загружать udf по отдельности и подключать по одной, то есть либо adjust, либо mass_transfer, то после инициализации и запуска решения все считается. А если подключить обе сразу, то после инициализации и запуска решения происходит ЭТО:
Node 999999: Process 10536: Received signal SIGSEGV.
==============================================================================
MPI Application rank 0 exited before MPI_Finalize() with status 2
The fl process could not be started.
Задача считается в 3d, Steady, VOF, laminar.
Вот урезанный udf #1 (тестовый)
#include "udf.h"
DEFINE_EXECUTE_ON_LOADING(on_loading, libudf)
{
Set_User_Memory_Name(0,"S");
Set_User_Memory_Name(1,"PV");
}
real Ps(real T_vap) /* Добавлена 21.07.2020 */
{
real Ps=101325.0*exp(14.08713-5272.12/T_vap); /* ДЛЯ ТЯЖЕЛОЙ ВОДЫ */
return Ps;
}
real Sup(real P_vap, real Psat) /* Добавлена 21.07.2020 */
{
real SupSat=P_vap/Psat;
}
DEFINE_ADJUST(adjust_condens, mixture_domain)
{
int phase_domain_index;
cell_t cell;
Thread *thread;
Domain *subdomain;
real P_SAT;
real P_VAP;
P_SAT=0.0;
P_VAP=0.0;
sub_domain_loop(subdomain, mixture_domain, phase_domain_index)
{
if (DOMAIN_ID(subdomain) == 3)
{
thread_loop_c(thread, subdomain)
{
begin_c_loop_all(cell, thread)
{
P_SAT=Ps(C_T(cell,thread));
P_VAP=C_P(cell,thread)*C_VOF(cell, thread);
C_UDMI(cell,thread,1)=P_VAP;
C_UDMI(cell,thread,0)=Sup(P_VAP, P_SAT);
}
end_c_loop_all (cell, thread)
}
}
}
}
Вот урезанный udf#2 (тож тестовый, от наполнения особо ничего не менялось. Сейчас связки через C_UDMI еще нет)
#include "udf.h"
DEFINE_MASS_TRANSFER(liq_gas_source, cell, thread, from_index, from_species_index, to_index, to_species_index)
{
real m_lg;
m_lg=0.;
return (m_lg);
}
Внимание, вопрос: подскажите пожалуйста, в чем может быть причина? Может ли как-то DEFINE_MASS_TRANSFER не нравиться что-то? Или, может, я как-то не так обращаюсь к thread? Если они выполняются в разное время, то как они могут конфликтовать? В режиме Serial пробовал, одно и то же.
Очень надеюсь на Вашу помощь, заранее спасибо за ответы!
Какая-то абсолютная мистика... Я сталкивался с кодом, где оба эти макроса работали нормально.
https://cae-club.ru/forum/modelirovanie-kondensacii-vodyanogo-para-na-stenke-iz
Интересно, а что делает
DEFINE_EXECUTE_ON_LOADING(on_loading, libudf)
{
Set_User_Memory_Name(0,"S");
Set_User_Memory_Name(1,"PV");
}
Сразу выделяет две ячейки памяти перед расчётом? Может вы память не выделяли...
А как вы подключали оба макроса сразу? Через два разных исходных кода или объединив в один текстовый исходный код? Я лично всегда все в один файл кидаю и подключаю только нужные макросы, и всё работает.
Единственно, могу ещё сказать, что DEFINE_MASS_TRANSFER не является самым точным и надёжным макросом для задач с фазовым переходом (в ссылке на тему форума этот момент описан). Дело в том, что так будет неточность в расчёте источников. Надёжный вариант - прописать источники массы и энергии для фаз через DEFINE_SOURCE
Да и компиляция проходит без ошибок, и даже на этапе инициализации проблем нет.
Ну, насколько я понял, это первичное выделение этих ячеек памяти + придание им названий для упрощения постобработки.
И оба по отдельности с компиляцией в разные libudf, и в одном файле, итог один.
Об этом не знал, спасибо. Не подскажете, может есть какие-то примеры DEFINE_SOURSE для массы и энергии? в Документации, вроде, нет такого примера. и еще вопрос, если не трудно, как в таком случае сделать, чтобы на основании условий рождалась новая фаза?
Заранее спасибо!
Спасибо, с DEFINE_SOURCE разобрался) буду пробовать собрать такую конструкцию.
Просто пишите в гугле (это важно): DEFINE_SOURCE pdf и вы найдёте кучу примеров с применением в многофазке
Спасибо еще раз!
Кстати, хотел сказать, что конструкция
для определения производной при компиляции выдает ошибку, на версиях начиная с 19.1 - ниже не проверял, нет к ним доступа.
Добавить комментарий