我编写了 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++)
。但它不起作用。