We are developing C++ UDM to model nonlinear stress-strain behaviour including the unload-reload hysteresis using the Mohr-coulomb (or elastic) model as the basis. This was achieved by updating the shear modulus (shear) as a function of strain.

We employ this UDM in a 1-column model with free field and quiet boundary, applying a single shear wave at the base of the model and run dynamic analysis to model shear wave propagation. We managed to obtain stress-strain hysteresis response that match the prescribed backbone curve, however it doesnât show any/little damped response.
For comparison, the same 1-column model was analysed using FLAC âdefaultâ hysteresis model (ini dy_damp hyst default L1 L3) which represent comparable backbone curve. In addition, the UDM was also written for FLAC3D. Both models show comparable result with damped response i.e with significantly smaller reflected (2nd) wave indicating some degree of energy loss.

The figures below plot the calculated results (shear stress vs shear strain, shear stress vs time, acceleration vs time from the element at the base) from the 1-Column model with different material models:

Linear elastic

Elastic with Default hysteretic damping

FLAC2D UDM

FLAC3D UDM

The responses from the FLAC2D UDM is very similar to those from the linear elastic material (i.e no damping).

Our questions are:

Is it possible that the nonlinear stress-strain behaviour input is not directly accounted for by FLAC in the calculation of damping?

Comparing the UDM template for FLAC2D and FLAC3D, it seems the variable âhysteretic_damping_â in FLA2D (state.h) is replaced by âmodulus_reduction_factor_â in FLAC3D. Is there more fundamental implication than the variable name itself? In general, we found the scripts worked in FLAC3D require some changes. And in this case, we cannot make it work for FLAC.

How can we assure that hysteretic damping will be accounted for following the prescribed stress-strain behaviour in FLAC?

First of all, FLAC v8.1 and FLAC3D v7 are based on different libs. Separate DLLs are required to be built in the specified development environments for FLAC and FLAC3D. Just follow the correct instruction in that software. In other words, if you build DLL in FLAC, follow FLAC instruction, not FLAC3D, and vise versa.

Second, we do not know what codes you wrote so it is hard for us to tell what exactly occurred.

Go back to your questions:

Usually the hysteretic damping is for models with the constant modulus G0. The implemented would be a factor that multiplicated to G0 and give a new and reduced G. For nonlinear stress-strain behavior, there are two cases: caused by yielding or cased by nonlinear elasticity. Case #1 by yielding, FLAC/FLAC3D will turn off hysteretic damping if material is in yielding because the energy dissipation from the plasticity is big enough and thus extra hysteretic damping is unnecessary. Case #2 by nonlinear elasticity, it depends how you return the function getShearModulus() and how you reduce the modulus. for example, multiplication to the initial G0 or the updated G due to nonlinear elasticity. Things would be messed in this case because both reduction factor and G are changing. In sum, the hysteretic damping is supposed for models with a constant modulus.

Again, follow the instruction in the designated software.

We do not understand this question. Could you please explain more?

Hi Cheng, Thanks for looking into this! Please find our response below to each point:

#1. What we want to achieve is comparable to Case #2 (nonlinear elasticity), but without using the built-in âhysteretic dampingâ. Instead, our UDM will provide the stiffness reduction factor and we want to pass this reduction factor back to FLAC.

#2. Our UDM was written for FLAC810 using the C++ template for FLAC and is an extension of mohr-coulomb model. (In parallel, we have also written the UDM for FLAC3D separately using the C++ template for FLAC3D, which works.)
Here, we are focusing on FLAC810.

#3. As mentioned in the initial query, the UDM is aimed for dynamic analysis and with the capability to update the âtangent shear modulusâ following a set of unload-reload hysteresis rule. This is achieved without using the built-in âhysteretic dampingâ command. So far, the UDM has been able to produce the hysteresis loop (as shown by figures in the first thread), but no damping.
Our UDM subroutine run() includes the following lines:

reduction_factor = newG / shear_; // newG is the new tangent shear modulus calculated by the UDM as a function of shear strain
HDampInit(reduction_factor); // same as HDampInit() in FINN to update the stiffness
s->hysteretic_damping = reduction_factor;

The newG is also returned by the function getShearModulus()

Our expectation was that by passing the calculated âreduction_factorâ to s->hysteretic_damping, FLAC810 will handle further calculation of energy dissipation.

Possibly, we are missing some steps to communicate the change in shear stiffness to FLAC810 (Note: we have also tried to set s->modulus_changed_ = true; )
Or maybe there are further steps necessary in the UDM to model the energy dissipation due to the hysteresis?

If the UDM has taken care of the modulus reduction in the constitutive relationship calculation, generally no extra reduction for hysteretic damping is required.