4. Artificial damping

The MDL command residue_function_type artificial_damping specifies that artificial damping should be performed. The artificial damping method performs viscous damping. The "velocities" are defined by the ratio of the last converged step's incremental displacements and the size of the last converged step's load increment.

The global viscous damping matrix can be constructed in two ways. By default, the global viscosity matrix C is computed from the global mass matrix M:

C = α M

The coefficient α is determined in the first load step, and such that the ratio of dissipated energy (due to the artificial damping) and of the total strain energy will be equal to the value of the parameter dissipated_energy_fraction (default 1.0e-4). During all subsequent load steps, the coefficient α is kept constant.

If, on the other hand, one or both of the coefficients rayleigh_alpha and rayleigh_beta are set, Rayleigh damping will be performed where the global viscosity matrix C is a linear combination of the global mass and linear global stiffness matrices M and K:

C = α M + β K

[Note] Note

The densities of the materials used must not be zero, otherwise the global mass matrix will evaluate to zero. The global mass and global linear stiffness matrices are constant and are evaluated only in the first load step.

The coefficients rayleigh_alpha and rayleigh_beta can be estimated from the first two (free-)vibration eigenmodes, based on percentages of critical damping of the associated linear vibration problem (see also [Bathe96]). Note that, if the circular frequencies of the two modes are close, the critical damping ratios should be close as well.

The b2print_rayleigh_damping_coefficients tool can be used to extract the coefficients from a database containing a free-vibration analysis. Example:

$ b2print_rayleigh_damping_coefficients demo.b2m

The equivalent is achieved with the following Python function, which takes the circular frequencies of the first two eigenmodes and the ratios of critical damping, and calculates and prints the coefficient values.

def get_alpha_and_beta(omega_1, omega_2, zeta_1=0.001, zeta_2=0.001):
    n = (omega_1**2 - omega_2**2)
    alpha = 2.0 * omega_1 * omega_2 * (omega_1 * zeta_2 - omega_2 * zeta_1) / n
    beta  = 2.0 * (omega_1 * zeta_1 - omega_2 * zeta_2) / n
    print 'rayleigh_alpha ', alpha
    print 'rayleigh_beta  ', beta