How exactly is the Center of Mass caculated in eel2d?

19 views
Skip to first unread message

X A

unread,
Nov 23, 2021, 11:17:42 AM11/23/21
to IBAMR Developers
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

Boyce Griffith

unread,
Nov 23, 2021, 11:26:16 AM11/23/21
to IBAMR Developers
Take a look at ConstraintIBMethod::calculateCOMandMOIOfStructures().

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

--
You received this message because you are subscribed to the Google Groups "IBAMR Developers" group.
To unsubscribe from this group and stop receiving emails from it, send an email to ibamr-dev+...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/ibamr-dev/87840c82-b37c-4ac3-9de7-2638e7d2f782n%40googlegroups.com.

X A

unread,
Nov 24, 2021, 12:03:41 AM11/24/21
to IBAMR Developers
Thank you very much!

Mike

Reply all
Reply to author
Forward
0 new messages