我正在写一段C++代码,并用gcc 4.7.1编译它。我正在编写一段代码,使用表达式模板来组装矩阵和向量,它们的类型是Trilinos中的MatrixEpetra或VectorEpetra。
我的问题如下:代码应该使用我定义的表达式组装一个向量(对于有限元问题),并将值放在我给他的向量中。使用boost::shared_ptr将向量提供给组装方法。当我在调试模式下编译代码时,代码运行得非常好,但是当我使用opt模式编译时,向量根本不会被填充。可能的问题是什么?
我知道我没有张贴代码片段,但这只是因为我不知道我应该在这里使用哪个级别的细节…我的意思是,我会张贴很多行,这可能是不合适的。
发布于 2013-01-14 22:23:04
在没有更多代码的情况下,我的心理调试技能告诉我,您没有使用resize或push_back来增加向量的大小,而只是使用operator[]将项添加到保留内存中。
发布于 2013-01-15 02:16:26
代码如下:
integrate( integrationOverSelectedVolumes( this->M_FESpace->mesh(), this->M_markerFunctorPtr ) ,
this->M_FESpace->qr(),
this->M_ETFESpace,
value(bulk / 2.0) * ( pow( J ,2.0) - J + log(J)) * dot( F_T, grad(phi_i) )
) >> M_stiff;其中M_stiff是指向VectorEpetra的boost::shared指针,第四行是我需要计算和集成的表达式。函数integrate (这是一个名为IntegrateVectorVolumeID的类的构造函数)的第一个参数解释了必须在何处集成表达式。请注意,我已经用另一种类型的集成策略替换了integrationOverSelectedVolumes() (我认为它不起作用),并且我得到了相同的行为,所以问题不会出现在购买那个策略上。M_stiff就是我所说的指针。我不认为(但我可能错了)我忘记了初始化,因为在类的setup方法中,我重置了指向该类型的对象的所有指针。一旦我想出一个例子(这对我来说并不容易,因为我是表达式模板的新手,我仍然有很多疑问),我就会把它贴出来。
谢谢,波尔
https://stackoverflow.com/questions/14320103
复制相似问题