Исходя из N2, я думаю , что я согласен с вашей стратегией установки прямого решателя только вокруг муфты. Это должно работать нормально, однако похоже, что вы реализуете линейный оператор в своем компоненте на основе:
File "...\Thermal_Cycle.py", line 51, in compute_jacvec_product d_inputs['T'] = slope * deff_dT / alp_sc
Вы не должны использовать прямой решатель с частями без матрицы. Прямой решатель вычисляет обратное, что требует полной сборки матрицы. Единственная причина, по которой он работает, заключается в том, что OM обладает некоторой резервной функциональностью для ручной сборки якобиана, пропуская столбцы матрицы тождеств через метод compute_jacvec_product
. Этот резервный механизм призван заставить все работать, но он очень медленный (в итоге вы вызываете compute_jacvec_product
A LOT).
Ошибка, которую вы получаете, и почему она работает, когда вы поднимаете прямой решатель выше в модели, возможно, из-за отсутствия необходимых if
условий в вашей реализации compute_jacvec_product
. См. документы по явному компоненту для некоторых примеров , но ключевой момент заключается в том, чтобы понять, что не каждая отдельная переменная будет присутствовать при выполнении продукта jacve c (это зависит от того, какое решение делается --- то есть один для Ньютона против одного для полных производных всей модели). Таким образом, эти if-проверки необходимы для проверки релевантности переменных. Это сделано, потому что для дорогих кодов (например, CFD) некоторые из этих операций довольно дороги, и вы не хотите делать их без необходимости.
Ваши компоненты настолько велики, что вы не можете использовать функцию compute_partials
? Вы пытались указать редкость в вашем якобиане ? Обычно безматричные методы с частными производными не нужны, пока вы не начнете работать с действительно большими решателями PDE с 1e6 или более неявными выходными переменными.
Не видя некоторого кода, трудно комментировать более подробно, но в итоге: вы не должны использовать compute_jacvec_product
в сочетании с прямым решателем. Если вам действительно нужны безматричные матрицы, то вам нужно переключиться на итеративные линейные решатели liket PetscKrylov .
Если вы можете опубликовать код для компонента в Thermal_Cycle.py
, который имеет compute_jacvec_product
, я мог бы дать более подробную рекомендацию о том, как обрабатывать частные производные в этом случае.