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

Помогите пожалуйста с UDF и UDM

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

Добрый вечер,
есть ряд вопросов по User Defined Function и User Defined Memory, читал хелп, но до конца разобраться не смог.

Вопрос 1. Возможно ли использовать внутри функции DEFINE_PROFILE(user_variable,face,var), указатель на cell и функции доступные для cell? Если, то как?
Постараюсь более подробнее объяснить на примере:
Необходимо задать тепловой поток, который зависит от strain_rate. Для ячейки (cell) есть функция C_STRAIN_RATE_MAG(c,t). Я пытался написать так:

DEFINE_PROFILE(heat,ft,var)
{
    real ...........;
    face_t f;
    cell_t c;
    
    begin_f_loop(f,ft)
    {    
            c = F_C0(f,ft);
            strain_rate = C_STRAIN_RATE_MAG(c,ft);
            F_PROFILE(f,ft,var) = strain_rate*какой-нибудь коэфф;
    }
    end_f_loop(f,ft)
}
В таком случае код интерпритируется, но как только начинаешь расчет флюет просто закрывается. Подскажите как правильно написать.

Вопрос 2. Можно ли в файле UDF просто писать сторонние (любые) функции, с аргументами cell_t или face_t, для последующего вызова в других функциях, например DEFINE_PROFILE.
Пример: 

void user_function(cell_t, t){

          double var1;

          var1= C_STRAIN_RATE_MAG(cell_t, t)*100500; (любая формула)

}

DEFINE_PROFILE(heat,ft,var)
{
    real ...........;
    face_t f;
    cell_t c;
    begin_f_loop(f,ft)
    {    

           var = user_function(c,ft);
           F_PROFILE(f,ft,var) = var;
    }
    end_f_loop(f,ft)
}

Вопрос 3. Подскажите, как работает UDM ? Правильно ли я понимаю, что там можно хранить любые данные расчета, а потом к ним обращаться?
Пример:
Допустим в теле функции DEFINE_PROPERTY(viscosity, c, t), есть некоторый промежуточный результат, который потом нужен например в DEFINE_PROFILE. Можно ли этот результат куда-то записать, чтобы потом его вызвать?

Заранее большое СПАСИБО за помощь.

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

Здравствуйте!

1. Не знаю, как у вас фактический код выглядит, но в приведенной части на глаз вижу одну ошибку:

strain_rate = C_STRAIN_RATE_MAG(c,ft);

То есть вы ищете ячейку с индексом "c" в треде граней. Нужно запилить так:

...

Thread *ct;

...

ct = THREAD_T0(ft);

strain_rate = C_STRAIN_RATE_MAG(c,ct);

...

Нужно тестить, конечно, но должно работать, как вам надо.

2. Можно, че нет-то. Только в вашем примере функция ничего не возвращает (void), а в пишете var = user_function(c,ft).

3.

Цитата:
Правильно ли я понимаю, что там можно хранить любые данные расчета, а потом к ним обращаться?

Да.

Цитата:
Допустим в теле функции DEFINE_PROPERTY(viscosity, c, t), есть некоторый промежуточный результат, который потом нужен например в DEFINE_PROFILE. Можно ли этот результат куда-то записать, чтобы потом его вызвать?

Если результат привязан к конкретной ячейке, то да, подойдет UDM.

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

Спасибо, буду пробовать.

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

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

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