Hi,
It is a beginner problem.
I am trying to understand how the Center of Mass (COM) is calculated in eel2d case.
So we can see it is done by this line:
std::vector<std::vector<double> > structure_COM = ib_method_ops->getCurrentStructureCOM();
Tracing "getCurrentStructureCOM();"
It comes from the header file:
inline const std::vector<std::vector<double> >& getCurrentStructureCOM()
{
return d_center_of_mass_current;
}
I tried to find how it is calculated:
$ grep -r -i d_center_of_mass_current .
./ibamr/IBAMR/include/ibamr/BrinkmanPenalizationRigidBodyDynamics.h: return d_center_of_mass_current;
./ibamr/IBAMR/include/ibamr/BrinkmanPenalizationRigidBodyDynamics.h: d_center_of_mass_current = Eigen::Vector3d::Zero(), d_center_of_mass_new = Eigen::Vector3d::Zero();
./ibamr/IBAMR/include/ibamr/CIBStrategy.h: IBTK::EigenAlignedVector<Eigen::Vector3d> d_center_of_mass_initial, d_center_of_mass_current, d_center_of_mass_half,
./ibamr/IBAMR/include/ibamr/ConstraintIBMethod.h: return d_center_of_mass_current;
./ibamr/IBAMR/include/ibamr/ConstraintIBMethod.h: std::vector<std::vector<double> > d_center_of_mass_current, d_center_of_mass_new;
./ibamr/IBAMR/include/ibamr/IBFEDirectForcingKinematics.h: return d_center_of_mass_current;
./ibamr/IBAMR/include/ibamr/IBFEDirectForcingKinematics.h: d_center_of_mass_current = Eigen::Vector3d::Zero(), d_center_of_mass_half = Eigen::Vector3d::Zero(),
./ibamr/IBAMR/include/ibamr/IBInterpolantMethod.h: IBTK::EigenAlignedVector<Eigen::Vector3d> d_center_of_mass_initial, d_center_of_mass_current, d_center_of_mass_new;
./ibamr/IBAMR/src/IB/BrinkmanPenalizationRigidBodyDynamics.cpp: d_center_of_mass_current = X_com;
./ibamr/IBAMR/src/IB/BrinkmanPenalizationRigidBodyDynamics.cpp: d_center_of_mass_new = d_center_of_mass_current;
./ibamr/IBAMR/src/IB/BrinkmanPenalizationRigidBodyDynamics.cpp: d_center_of_mass_new = d_center_of_mass_current + dt * d_trans_vel_new;
./ibamr/IBAMR/src/IB/BrinkmanPenalizationRigidBodyDynamics.cpp: d_center_of_mass_current = d_center_of_mass_new;
./ibamr/IBAMR/src/IB/BrinkmanPenalizationRigidBodyDynamics.cpp: db->putDoubleArray(C, &d_center_of_mass_current[0], 3);
./ibamr/IBAMR/src/IB/BrinkmanPenalizationRigidBodyDynamics.cpp: db->getDoubleArray(C, &d_center_of_mass_current[0], 3);
./ibamr/IBAMR/src/IB/CIBMethod.cpp: d_center_of_mass_current = d_center_of_mass_new;
./ibamr/IBAMR/src/IB/CIBMethod.cpp: d_center_of_mass_current = d_center_of_mass_initial;
./ibamr/IBAMR/src/IB/CIBMethod.cpp: X_half[d] = d_center_of_mass_current[struct_handle][d] + R_dr[d] +
./ibamr/IBAMR/src/IB/CIBMethod.cpp: d_center_of_mass_current[struct_no][d] + 0.5 * dt * d_trans_vel_current[struct_no][d];
./ibamr/IBAMR/src/IB/CIBMethod.cpp: d_center_of_mass_current[struct_handle][d] + R_dr[d] +
./ibamr/IBAMR/src/IB/CIBMethod.cpp: Eigen::Vector3d& current_com = d_center_of_mass_current[struct_no];
./ibamr/IBAMR/src/IB/CIBMethod.cpp: db->putDoubleArray("C_" + struct_no_str, &d_center_of_mass_current[struct_no][0], 3);
./ibamr/IBAMR/src/IB/CIBMethod.cpp: db->getDoubleArray("C_" + struct_no_str, &d_center_of_mass_current[struct_no][0], 3);
./ibamr/IBAMR/src/IB/CIBStrategy.cpp: d_center_of_mass_current.resize(d_num_rigid_parts, Eigen::Vector3d::Zero());
./ibamr/IBAMR/src/IB/CIBStrategy.cpp: return d_center_of_mass_current[part];
./ibamr/IBAMR/src/IB/ConstraintIBMethod.cpp: d_center_of_mass_current(d_no_structures, std::vector<double>(3, 0.0)),
./ibamr/IBAMR/src/IB/ConstraintIBMethod.cpp: db->putDoubleArray("POSN_COM_STRUCT_" + struct_no_str, &d_center_of_mass_current[struct_no][0], 3);
./ibamr/IBAMR/src/IB/ConstraintIBMethod.cpp: db->getDoubleArray("POSN_COM_STRUCT_" + struct_no_str, &d_center_of_mass_current[struct_no][0], 3);
./ibamr/IBAMR/src/IB/ConstraintIBMethod.cpp: d_center_of_mass_current[struct_no],
./ibamr/IBAMR/src/IB/ConstraintIBMethod.cpp: d_center_of_mass_current[struct_no][d] = 0.0;
./ibamr/IBAMR/src/IB/ConstraintIBMethod.cpp: d_center_of_mass_current[struct_no][i] = d_center_of_mass_unshifted_current[struct_no][i];
./ibamr/IBAMR/src/IB/ConstraintIBMethod.cpp: while (d_center_of_mass_current[struct_no][i] < domain_x_lower[i])
./ibamr/IBAMR/src/IB/ConstraintIBMethod.cpp: d_center_of_mass_current[struct_no][i] += domain_length[i];
./ibamr/IBAMR/src/IB/ConstraintIBMethod.cpp: while (d_center_of_mass_current[struct_no][i] >= domain_x_upper[i])
./ibamr/IBAMR/src/IB/ConstraintIBMethod.cpp: d_center_of_mass_current[struct_no][i] -= domain_length[i];
./ibamr/IBAMR/src/IB/ConstraintIBMethod.cpp: << d_FuRMoRP_current_time << '\t' << d_center_of_mass_current[struct_no][0] << '\t'
./ibamr/IBAMR/src/IB/ConstraintIBMethod.cpp: << d_center_of_mass_current[struct_no][1] << '\t' << d_center_of_mass_current[struct_no][2]
./ibamr/IBAMR/src/IB/ConstraintIBMethod.cpp: X_half[d] = d_center_of_mass_current[location_struct_handle][d] +
./ibamr/IBAMR/src/IB/ConstraintIBMethod.cpp: X_new[d] = d_center_of_mass_current[location_struct_handle][d] +
./ibamr/IBAMR/src/IB/IBFEDirectForcingKinematics.cpp: d_center_of_mass_current = d_center_of_mass_initial;
./ibamr/IBAMR/src/IB/IBFEDirectForcingKinematics.cpp: d_center_of_mass_current[d] + Rxdr_half[d] + 0.5 * dt * d_trans_vel_current[d]);
./ibamr/IBAMR/src/IB/IBFEDirectForcingKinematics.cpp: d_center_of_mass_current[d] + Rxdr_new[d] + dt * d_trans_vel_current[d]);
./ibamr/IBAMR/src/IB/IBFEDirectForcingKinematics.cpp: d_center_of_mass_half = d_center_of_mass_current + 0.5 * dt * d_trans_vel_current;
./ibamr/IBAMR/src/IB/IBFEDirectForcingKinematics.cpp: d_center_of_mass_new = d_center_of_mass_current + dt * d_trans_vel_current;
./ibamr/IBAMR/src/IB/IBFEDirectForcingKinematics.cpp: X_half_petsc.set(nodal_X_indices[d][k], d_center_of_mass_current[d] + Rxdr[d] + dt * d_trans_vel_half[d]);
./ibamr/IBAMR/src/IB/IBFEDirectForcingKinematics.cpp: d_center_of_mass_half = d_center_of_mass_current + dt * d_trans_vel_half;
./ibamr/IBAMR/src/IB/IBFEDirectForcingKinematics.cpp: d_center_of_mass_current = d_center_of_mass_new;
./ibamr/IBAMR/src/IB/IBFEDirectForcingKinematics.cpp: db->putDoubleArray("C", &d_center_of_mass_current[0], 3);
./ibamr/IBAMR/src/IB/IBFEDirectForcingKinematics.cpp: db->getDoubleArray("C", &d_center_of_mass_current[0], 3);
./ibamr/IBAMR/src/IB/IBInterpolantMethod.cpp: d_center_of_mass_current.resize(d_num_rigid_parts, Eigen::Vector3d::Zero());
./ibamr/IBAMR/src/IB/IBInterpolantMethod.cpp: d_center_of_mass_current = d_center_of_mass_new;
./ibamr/IBAMR/src/IB/IBInterpolantMethod.cpp: X_new[d] = d_center_of_mass_current[struct_handle][d] + R_dr[d] + dt * U[struct_handle][d];
./ibamr/IBAMR/src/IB/IBInterpolantMethod.cpp: d_center_of_mass_new[struct_no][d] = d_center_of_mass_current[struct_no][d] + dt * U[struct_no][d];
./ibamr/IBAMR/src/IB/IBInterpolantMethod.cpp: d_center_of_mass_current = d_center_of_mass_initial;
./ibamr/IBAMR/src/IB/IBInterpolantMethod.cpp: db->putDoubleArray(C.str(), &d_center_of_mass_current[struct_no][0], 3);
./ibamr/IBAMR/src/IB/IBInterpolantMethod.cpp: db->getDoubleArray(C.str(), &d_center_of_mass_current[struct_no][0], 3);
But still it seems it is often used, but I just could not find where it is calculated (would expect something like Volume integration).
So I would just like to enquire how to trace the actual calculation of COM. The method may also be important to understand other parts of the library.
I am now just trying to piece everything together in the gdb debugger, but I do not know if it will work.
Appreciate any comment.
With best wishes,
Mike