Как скомпилировать с / bigobj в Dymola (Modelica)

Я интегрирую относительно небольшую модель конечных элементов (FE) в Modelica. При этом я создал модель (класс Modelica), которая может считывать матрицу массы (M) и жесткости (K) в формате двоичного файла Matlab. Я соединил модель FE с некоторыми компонентами из стандартной библиотеки Modelica (Modelica.Mechanics.MultiBody). Если M и K очень малы (скажем, 20x20), то Dymola может запускать модель и дает довольно точные результаты по сравнению с Abaqus (но вычисления не так эффективны). Однако, если я увеличиваю сложность модели FE, которая включает в себя большие M и K (например, size (M) = [200,200]), то Dymola выдает следующую ошибку:

Компиляция и компоновка модели (Visual C ++).

Настройка среды для использования инструментов Microsoft Visual Studio 2010 x86. dsmodel.c dsmodelext1.c dsmodelext10.c dsmodelext11.c dsmodelext12.c dsmodelext13.c dsmodelext14.c dsmodelext15.c dsmodelext16.c dsmodelext2. c

Генерация кода ...

c: \ sentient \ src \ gll \ gearlibrary \ dsmodel.c (185115): фатальная ошибка C1128: количество разделов превысило ограничение формата объектного файла: скомпилировать с / bigobj

Ошибка создания Dymosim.

Я подключил Visual Studio C ++ Express Edition (10.0) к Dymola.

Мне кажется, что Dymola предоставляет имя переменной для каждого объекта M и K. Это превышает максимальный предел объектов для компилятора C ++.

Как я могу предотвратить это от Димолы? Как я могу установить / bigobj в среде Dymola?


person AdrijanR    schedule 09.08.2013    source источник


Ответы (2)


Это правда, что Димола присвоит имя каждому элементу массива. Здесь вы можете попробовать две вещи. Первый простой, но я не могу сказать, поможет ли он на самом деле. Visual C ++ намекает, что включение переключателя /bigobj в командной строке может помочь. Если вы хотите это сделать, вам следует просмотреть различные сценарии сборки в каталоге /bin, где бы вы ни установили Dymola. Вы можете изменить эти сценарии, чтобы изменить команды, используемые для компиляции моделей. Однако я бы обязательно сделал резервную копию этих скриптов, прежде чем вы начнете с ними связываться, иначе вы можете попасть в ситуацию, когда вы больше не сможете компилировать ни одну из своих моделей. Я думаю, что основной сценарий - build.bat (хотя есть и другие, и я не знаю, что определяет, какие из них вызываются).

Если это не сработает, другой способ работать с большими объемами данных - использовать функцию ExternalObject в Modelica. Это позволяет загружать данные на C уровне языка, а не на уровне Modelica. Это можно использовать, например, для загрузки таблиц интерполяции в память, не забивая пространство имен Modelica тысячами точек данных, используемых в интерполяции. Однако я скептически отношусь к этому, поскольку кажется, что вам потребуется Димола для решения уравнений, созданных на основе ваших матриц массы и жесткости. Таким образом, делать их внешними не поможет. Это работает в случае интерполяции, потому что Dymola на самом деле не нужно знать все эти данные (они нужны только функции интерполяции). Но если вы используете (все) эти данные для решения системы уравнений, я не думаю, что вам действительно удастся скрыть их от Димолы.

person Michael Tiller    schedule 10.08.2013
comment
Как правильно указал Майкл, мне пришлось изменить основной сценарий <Dymola install dir>\bin\build.bat. Поскольку я использую Visual C ++ Express 2010, мой компилятор установлен на 32-разрядный. Поэтому мне пришлось изменить строку 173 cl /Od /Fe"dymosim.exe" %1.c %1ext*.c %2 %3 %4 %5 >> dslog.txt 2>>&1 на cl /bigobj /Od /Fe"dymosim.exe" %1.c %1ext*.c %2 %3 %4 %5 >> dslog.txt 2>>&1 и строку 177 cl /Od /Fe"dymosim.exe" %1.c %2 %3 %4 %5 >> dslog.txt 2>>&1 на cl /bigobj /Od /Fe"dymosim.exe" %1.c %2 %3 %4 %5 >> dslog.txt 2>>&1. - person AdrijanR; 12.08.2013

Начиная с Dymola 2015 FD01, вы можете установить Advanced.CompileBigObject=true; внутри Dymola - т.е. изменять bat-файлы не нужно.

Это не сработало, когда был задан исходный вопрос, но если у кого-то есть такая же проблема, это должно быть более удобным.

person Hans Olsson    schedule 21.02.2017