Skip to content

Viscoelastic history: timestep from the wall strain rate, and a conformation health check #768

Description

@lmoresi

On the confined cylinder (Oldroyd-B, beta 0.59) every stress history loses positive-definiteness of the conformation c = tau*/G + I in the first step at dt 0.4 (Courant 1 on the far-field mesh): the wall strain rate is about 7, so the local lambda|D| is about 3 and the explicit stretching term over one step is far outside its range. The nodal history then runs away and hangs (with or without DEVSS); the IP history holds the defect bounded and gives out at Wi 0.6. At dt 0.04 the IP history is admissible everywhere to Wi 0.6 and the drag lands at 119.3 / 114.4 (references 120.6 / 117.8) on the coarse mesh.

Two things the model should provide:

  1. max_elastic_timestep(safety=0.3): safety / max over the domain of the strain-rate magnitude, so a run can take dt = min(courant_dt, model.max_elastic_timestep()). The Courant number on the far-field mesh is the wrong criterion for the stretching term.
  2. conformation_min_eigenvalue(): the smallest eigenvalue of tau*/G + I on the carried polymer stress (nodal or integration-point storage), with its location and the fraction of points below zero. This is the health line that separates a preconditioner failure from a lost conformation; the per-step check that found the problem lives only in a run script so far (~/+Simulations/stress_transport/cylinder_ob/ob_cylinder.py, CONF lines).

Both with hard-baseline tests on a simple shear box (one BDF-1 step from rest at dt = lambda gives min eigenvalue 1 - lambda/2 exactly).

Underworld development team with AI support from Claude Code

Activity

  1. lmoresi commented on Sep 20, 2026

    @lmoresi
    MemberAuthor

    Implemented on feature/stress-transport-ddt (71bb82d): IntegrationPointSemiLagrangian.store_smoothing (alpha = c·h², c ≈ 0.03–0.07), ViscoElasticPlasticFlowModel.max_elastic_timestep(safety) and conformation_min_eigenvalue(), hard-baseline tests, and docs/developer/subsystems/stress-transport.md. Closes with the branch PR.

    Underworld development team with AI support from Claude Code

  2. lmoresi commented on Oct 8, 2026

    @lmoresi
    MemberAuthor

    Fixed by #833, merged to development (f4733d4f).

    Both halves this issue asked for are there:

    • max_elastic_timestep(safety) on the viscoelastic model — the safety factor over the largest strain rate, which is the timestep-from-the-wall-strain-rate half;
    • conformation_min_eigenvalue() — the health line that tells a lost preconditioner from a lost problem.

    Both trace-back histories expose carried_tensors() so the check can read what they hold.

    The motivating measurement, kept here: on the confined cylinder every history lost positive-definiteness of tau*/G + I in the first step at Courant one on the far-field mesh, because the wall shear rate is ten times the far-field one and the explicit stretching term cannot span dt*gammadot ~ 3. A far-field Courant number is the wrong guide when the wall sets the rate — which is what max_elastic_timestep now answers.

    Hard baselines rather than a method comparison: one BDF-1 step from rest at dt = lambda gives eigenvalues 1 -+ 1/2 exactly, and a wall four times faster gives -1 everywhere.

    Closing manually: Closes lines here fire when development reaches main.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions