CFD Online Logo CFD Online URL
www.cfd-online.com
[Sponsors]
Home > Forums > General Forums > Main CFD Forum

Simple Riemann solver for elastic waves?

Register Blogs Community New Posts Updated Threads Search

Reply
 
LinkBack Thread Tools Search this Thread Display Modes
Old   November 12, 2024, 13:36
Default Simple Riemann solver for elastic waves?
  #1
New Member
 
martin
Join Date: Nov 2024
Posts: 4
Rep Power: 2
martinsshorts is on a distinguished road
I am writing a FVM solver in C++ for elastic waves. I've got most of it working, but I cannot seem to get the Riemann solver to work. It is so unstable the flux values will blow up in just a few time steps.



The Riemann solver I am implementing can be seen here:

https://nbviewer.org/github/maojrs/i..._riemann.ipynb

It is from a Randy Leveque book.


For my own sanity, I need to switch to a simpler version of the Riemann solver so I can get it working. This project is just a proof of concept, so it doesn't need to be the most cutting edge solver ever. It should just be very simple, and work for linear elastic waves on an unstructured mesh with heterogeneous material. This is for learning purposes so I want to code it myself. I don't want to use a library that already has a Riemann solver in it.

Does anyone have any resources that could help me find a simple Riemann solver for elastic waves? Thank you very much.


================================================== ================================================== ==


For reference, here is my current Riemann solver:
Code:
static void ElasticRiemann(
    PetscInt dim, PetscInt Nf, const PetscReal *qp, const PetscReal *n,
    const PetscScalar *uL, const PetscScalar *uR, PetscInt numConstants,
    const PetscScalar constants[], PetscScalar *flux, void *ctx)
{
  /* Input Parameters:
       dim          - The spatial dimension
       Nf           - The number of fields
       x            - The coordinates at a point on the interface
       n            - The normal vector to the interface
       uL           - The state vector to the left of the interface
       uR           - The state vector to the right of the interface
       numConstants - number of constant parameters
       constants    - constant parameters
       ctx          - optional user context
       flux         - output array of flux through the interface
  */

  Physics phys = (Physics) ctx;  // Cast context to phys struct
  
  PetscReal du[5]; // difference in stress and velocity values between the sides
  PetscReal detP, detS;
  PetscReal nn[dim];
  PetscReal a1, a2, a3, a4; // alpha values
  
  // Compute jumps in the states (uL is left, uR is right)
  // and store in du

  /* Normalize the normal vector */
  nn[0] = n[0];
  nn[1] = n[1];
  Normalize2Real(nn);

  for (PetscInt i = 0; i < 5; ++i) {
      du[i] = uR[i] - uL[i];
  }

  // obtain material paramter values for L and R sides
  // these are currently part of the solution field because PETSc doesn't 
  // support auxiliary fields for FVM. I realize this is not ideal.

  PetscReal lambdaL = uL[5];
  PetscReal muL = uL[6];
  PetscReal densityL = uL[7];
  PetscReal lambdaR = uR[5];
  PetscReal muR = uR[6];
  PetscReal densityR = uR[7];

  // Calculate cp (P-wave speed) and cs (S-wave speed)
  PetscReal bulkL = lambdaL + 2.0 * muL;
  PetscReal bulkR = lambdaR + 2.0 * muR;
  PetscReal cpL = PetscSqrtReal(bulkL / densityL);
  PetscReal csL = PetscSqrtReal(muL / densityL);
  PetscReal cpR = PetscSqrtReal(bulkR / densityR);
  PetscReal csR = PetscSqrtReal(muR / densityR);

  // Calculate useful multiples of the norm vector components
  PetscReal nx = nn[0];
  PetscReal ny = nn[1];
  PetscReal nx2 = nx * nx;
  PetscReal ny2 = ny * ny;
  PetscReal nxy = nx * ny;
  
  // Define Eigenvalues (wave speeds)
  PetscReal s[4] = {-cpL, cpR, -csL, csR};

  // Define the 4 eigenvectors (from columns of Matrix R)
  PetscReal r1[5] = {lambdaL + 2 * muL * nx2, lambdaL + 2 * muL * ny2,
                     2 * muL * nxy, nx * cpL, ny * cpL};
  PetscReal r2[5] = {lambdaR + 2 * muR * nx2, lambdaR + 2 * muR * ny2,
                     2 * muR * nxy, -nx * cpR, -ny * cpR};
  PetscReal r3[5] = {-2 * muL * nxy, 2 * muL * nxy, muL * (nx2 - ny2),
                     -ny * csL, nx * csL};
  PetscReal r4[5] = {-2 * muR * nxy, 2 * muR * nxy, muR * (nx2 - ny2), ny * csR,
                     -nx * csR};

  // Compute the 4 alphas
  detP = cpR * bulkL + cpL * bulkR;
  detS = csR * muL + csL * muR;

  // P wave strengths
  a1 = (cpR * (du[0] * nx2 + du[1] * ny2 + 2 * nxy * du[2]) +
         bulkR * (nx * du[3] + ny * du[4])) / detP;
  a2 = (cpL * (du[0] * nx2 + du[1] * ny2 + 2 * nxy * du[2]) -
         bulkL * (nx * du[3] + ny * du[4])) / detP;
  // S wave strengths
  a3 = (csR * (du[2] * (nx2 - ny2) + nxy * (du[1] - du[0])) +
         muR * (nx * du[4] - ny * du[3])) / detS;
  a4 = (csL * (du[2] * (nx2 - ny2) + nxy * (du[1] - du[0])) -
         muL * (nx * du[4] - ny * du[3])) / detS;

// Compute the waves
  PetscReal W1[5], W2[5], W3[5], W4[5];
  for (int i = 0; i < 5; ++i) {
      W1[i] = a1 * r1[i];
      W2[i] = a2 * r2[i];
      W3[i] = a3 * r3[i];
      W4[i] = a4 * r4[i];
  }
  // First wave (P-wave, left-going)
  // Second wave (P-wave, right-going)
  // Third wave (S-wave, left-going)
  // Fourth wave (S-wave, right-going)
  // Use the waves to update the flux
  flux[0] = s[1] * W2[0] + s[3] * W4[0] + s[0] * W1[0] + s[2] * W3[0];
  flux[1] = s[1] * W2[1] + s[3] * W4[1] + s[0] * W1[1] + s[2] * W3[1];
  flux[2] = s[1] * W2[2] + s[3] * W4[2] + s[0] * W1[2] + s[2] * W3[2];
  flux[3] = s[1] * W2[3] + s[3] * W4[3] + s[0] * W1[3] + s[2] * W3[3];
  flux[4] = s[1] * W2[4] + s[3] * W4[4] + s[0] * W1[4] + s[2] * W3[4];
  flux[5] =0;
  flux[6] =0;
  flux[7] =0;
}
martinsshorts is offline   Reply With Quote

Reply

Tags
elastic, fvm, riemann, solvers, waves


Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are Off
Pingbacks are On
Refbacks are On


Similar Threads
Thread Thread Starter Forum Replies Last Post
Divergence detected in AMG solver. VOF. Mr.Mister Fluent Multiphase 5 November 22, 2024 07:32
Fail to converge when solving with a fabricated solution zizhou FLUENT 0 March 22, 2021 07:33
PEMFC model with FLUENT brahimchoice FLUENT 22 April 19, 2020 16:44
fluent divergence for no reason sufjanst FLUENT 2 March 23, 2016 17:08
Spectral LES solver, 2h waves ( wiggles ) kaya Main CFD Forum 3 September 9, 2015 09:14


All times are GMT -4. The time now is 15:20.