我正在将一个相对较小的有限元(FE)模型集成到Modelica中。在这样做的过程中,我创建了一个Model(Modelica类),它可以用Matlab二进制文件格式读取质量(M)和刚度(K)矩阵。我将FE模型与Modelica标准库(Modelica.Mechanics.MultiBody)中的一些组件连接起来。如果M和K非常小(例如20x20),那么Dymola能够运行模型并提供与Abaqus相比非常准确的结果(但计算效率不高)。但是,如果我增加包含较大M和K(例如尺寸(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 dsmodelext3.c dsmodelext4.c dsmodelext5.c dsmodelext6.c dsmodelext7.c dsmodelext8.c dsmodelext9.c
生成代码......
c:\ sentient \ src \ gll \ gearlibrary \ dsmodel.c(185115):致命错误C1128:超出目标文件格式限制的部分数:使用/ bigobj编译
生成Dymosim时出错。
我将Visual Studio C ++ Express Edition(10.0)与Dymola连接。
在我看来,Dymola为M和K的每个实体提供了一个变量名。这超出了C ++编译器对象的最大限制。
如何防止Dymola这样做? 如何在Dymola环境中设置/ bigobj?
答案 0 :(得分:2)
Dymola确实会为数组的每个元素指定一个名称。你可以在这里尝试两件事。第一个是简单的,但我不能说它是否真的有用。 Visual C ++暗示在命令行中包含/bigobj
开关可能有所帮助。如果你想这样做,你应该查看安装了Dymola的/bin
目录中的各种构建脚本。您可以修改这些脚本以更改用于编译模型的命令。但是,在你弄乱它们之前我肯定会备份这些脚本,否则你可能会遇到无法再编译任何模型的情况。我认为主要脚本是build.bat
(虽然还有其他的,我不知道是什么决定了哪些被调用)。
如果这不起作用,处理大量数据的另一种方法是使用Modelica中的ExternalObject
工具。这允许您以C
语言级别而不是Modelica级别加载数据。例如,这可以用于将插值表加载到存储器中,而不会在插值中使用数千个数据点来堵塞Modelica命名空间。 然而,我怀疑这对你真的有帮助,因为你似乎需要Dymola来解决你的质量和刚度矩阵产生的方程式。因此,将它们制作成外部将无济于事。它适用于插值情况,因为Dymola并不需要知道所有这些数据(只有插值函数需要它)。但是如果你使用(全部)那些数据来解决一个方程组,我认为你不能真的把它从Dymola中隐藏起来。
答案 1 :(得分:0)
从Dymola 2015 FD01开始,您可以在Dymola中设置Advanced.CompileBigObject=true;
- 即无需修改bat文件。
当提出原始问题时,它没有工作,但如果其他人有同样的问题应该更方便。