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

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

Расчет с UDF вылетает

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

Добрый день уважаемые форумчане! 

История такая: есть 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 пробовал, одно  и то же. 

 

Очень надеюсь на Вашу помощь, заранее спасибо за ответы!

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

Какая-то абсолютная мистика... Я сталкивался с кодом, где оба эти макроса работали нормально. 
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


 

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

Какая-то абсолютная мистика... Я сталкивался с кодом, где оба эти макроса работали нормально. 

Да и компиляция проходит без ошибок, и даже на этапе инициализации проблем нет. 

Интересно, а что делает
 

DEFINE_EXECUTE_ON_LOADING(on_loading, libudf)
{
    Set_User_Memory_Name(0,"S");  
    Set_User_Memory_Name(1,"PV");            

}

Сразу выделяет две ячейки памяти перед расчётом? Может вы память не выделяли...

Ну, насколько я понял, это первичное выделение этих ячеек памяти + придание им названий для упрощения постобработки.

 

А как вы подключали оба макроса сразу? Через два разных исходных кода или объединив в один текстовый исходный код? Я лично всегда все в один файл кидаю и подключаю только нужные макросы, и всё работает

И оба по отдельности с компиляцией в разные libudf, и в одном файле, итог один. 

Единственно, могу ещё сказать, что DEFINE_MASS_TRANSFER не является самым точным и надёжным макросом для задач с фазовым переходом (в ссылке на тему форума этот момент описан). Дело в том, что так будет неточность в расчёте источников. Надёжный вариант - прописать источники массы и энергии для фаз через DEFINE_SOURCE

Об этом не знал, спасибо. Не подскажете, может есть какие-то примеры DEFINE_SOURSE для массы и энергии? в Документации, вроде, нет такого примера. и еще вопрос, если не трудно, как в таком случае сделать, чтобы на основании условий рождалась новая фаза?

 

Заранее спасибо! 

 

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

Спасибо, с DEFINE_SOURCE разобрался) буду пробовать собрать такую конструкцию. 

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

Просто пишите в гугле (это важно): DEFINE_SOURCE pdf и вы найдёте кучу примеров с применением в многофазке

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

Спасибо еще раз!

Кстати, хотел сказать, что конструкция 

/* Allocates memory for gradient calculation */
  {
  Alloc_Storage_Vars(pDomain,SV_VOF_RG,SV_VOF_G,SV_NULL);

/* gets storage for volume of fluid, gradients */

  Scalar_Reconstruction(pDomain, SV_VOF,-1,SV_VOF_RG,&accfunc);

  Scalar_Derivatives(pDomain,SV_VOF,-1,SV_VOF_G,SV_VOF_RG,&Vof_Deriv_Accumulate);
  }

для определения производной при компиляции выдает ошибку, на версиях начиная с 19.1 - ниже не проверял, нет к ним доступа. 

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

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

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