C++程序的结果与Matlab代码不同

问题描述 投票:0回答:0

我编写了 C++ 代码来替换 Matlab 代码: 检查freedofs结果时出现问题。

我发现C++的结果和Matlab有点不同。

例如Matlab中freedofs的第一个元素值为28,第二个元素值为29。 然而,在 C++ 中,第一个元素值为 0,第二个元素值为 28,第三个元素值为 29。

我不知道哪个部分导致了这样的问题。

有人可以提供任何提示或建议吗?

提前致谢!

Matlab代码:

    nelx=16;
    nely=8;
    nelz=8;
    [iif,jf,kf] = meshgrid(0,0:nely,0:nelz);                  % Coordinates
    fixednid = kf*(nelx+1)*(nely+1)+iif*(nely+1)+(nely+1-jf); % Node IDs
    fixeddof = [3*fixednid(:); 3*fixednid(:)-1; 3*fixednid(:)-2]; % DOFs
    nele = nelx*nely*nelz;
    ndof = 3*(nelx+1)*(nely+1)*(nelz+1);
    F = sparse(loaddof,1,-1,ndof,1);
    U = zeros(ndof,1);
    freedofs = setdiff(1:ndof,fixeddof);

C++代码:

#include <iostream>
#include <vector>
#include <Eigen/Dense>
#include <Eigen/SparseLU>
#include <Eigen/Sparse>

int main() {
    int nelx = 16;
    int nely = 8;
    int nelz = 8;

    Eigen::VectorXd fixednid_1((nelz + 1) * (nely + 1));
    Eigen::VectorXd fixednid_2((nelz + 1) * (nely + 1));
    Eigen::VectorXd fixednid_3((nelz + 1) * (nely + 1));
    Eigen::VectorXd fixeddof(3 * (nelz + 1) * (nely + 1));

    int fix_counter = 0;

#pragma omp parallel for sum(+:fix_counter)
    for (int k = 0; k <= nelz; ++k) {
        for (int j = 0; j <= nely; ++j) {
            iif[j][0][k] = 0;
            jf[j][0][k] = j;
            kf[j][0][k] = k;
            fixednid[j][0][k] = kf[j][0][k] * (nelx + 1) * (nely + 1) + iif[j][0][k] * (nely + 1) + (nely + 1 - jf[j][0][k]);
            fixednid_1[fix_counter] = 3 * fixednid[j][0][k];
            fixednid_2[fix_counter] = 3 * fixednid[j][0][k] - 1;
            fixednid_3[fix_counter] = 3 * fixednid[j][0][k] - 2;
            fix_counter++;
        }
    }
    fixeddof << fixednid_1, fixednid_2, fixednid_3;

    Eigen::VectorXi fixeddof_xi(3 * (nelz + 1) * (nely + 1));

    fixeddof_xi << fixednid_1.cast<int>(), fixednid_2.cast<int>(), fixednid_3.cast<int>();

    int nele = nelx * nely * nelz;
    int ndof = 3 * (nelx + 1) * (nely + 1) * (nelz + 1);

    Eigen::SparseMatrix<int> F(ndof, 1);
    F.reserve(loaddof.size());
    for (int i = 0; i < loaddof.size(); ++i) {
        F.insert(loaddof(i), 0) = -1;
    }
    F.makeCompressed();

    Eigen::VectorXd U = Eigen::VectorXd::Zero(ndof);

    Eigen::VectorXi freedofs = Eigen::VectorXi::Constant(ndof, 1);
    for (int i = 0; i < fixeddof_xi.size(); ++i) {
        freedofs(fixeddof_xi(i)) = 0;
    }
    Eigen::VectorXi freeIndices;
    freeIndices.resize(freedofs.count());
    int index = 0;
    for (int i = 0; i < freedofs.size(); ++i) {
        if (freedofs(i) > 0) {
            freeIndices(index) = i;
            ++index;
        }
    }
    std::cout << freeIndices.transpose() << std::endl;
}

我尝试更改索引值并在

i=1
中设置
for(int i=1;i<=freedofs.size();i++)
。但它不起作用。

来自 C++ 结果的图像。

这是Matlab代码的结果:

c++ matlab eigen
© www.soinside.com 2019 - 2024. All rights reserved.