CFD Online Logo CFD Online URL
www.cfd-online.com
[Sponsors]
Home > Forums > Software User Forums > OpenFOAM > OpenFOAM Community Contributions > OpenFOAM CC Toolkits for Fluid-Structure Interaction

[solidMechanics] Coulomb friction boundary condition without contactModels

Register Blogs Community New Posts Updated Threads Search

Reply
 
LinkBack Thread Tools Search this Thread Display Modes
Old   August 29, 2019, 11:18
Default Coulomb friction boundary condition without contactModels
  #1
New Member
 
Denis Maier
Join Date: Aug 2019
Posts: 17
Rep Power: 7
DOMaier is on a distinguished road
Hey all,

I am working on the poro-elastoplasitc solvers by Tian Tang.
For a multitude if situations concerning geotechnical problems I need to specify a friction boundary condition.

The BC should either specify the displacement or traction (depending on the situation) for the normal component of the DU field.
For the tangential component DU should be 0 as long as the resulting shear stress doesn't exceed the maximum value given by Coulomb's friction law (maxShear proportional to normal traction).
If it does exceed, it should chance to a fixed (tangential) traction BC for that face and iteration.

I was looking at the solidContact Boundary condition, but i think it is a bit overkill for what i need, since i dont need the ability of detachment and re-attachment of the material (yet).

So i was thinking, I should be able to build on the fixedDisplacementZeroShear BC.
However i can not seem to find where the tangential components are specified.
I think the confusion stems from the whole valueFraction-issue that is quite hard to get the head around at the start.

Can someone point me to the right lines in the fixedDisplacementZeroShear to modify?

Greetings
Denis
DOMaier is offline   Reply With Quote

Old   August 29, 2019, 11:22
Default Update on coulombFrictionBC
  #2
New Member
 
Denis Maier
Join Date: Aug 2019
Posts: 17
Rep Power: 7
DOMaier is on a distinguished road
I managed to gain a little bit more insight in how the boundary condition works, in that i now understand that valueFraction is a Tensor(Field) that tells me the mixture of fixedValue and fixedGradient in all directions. (I dont know if thats common practice but thats a beautiful solution)

so then I altered the updateCoeffs() function like this:




void fixedSoilDisplacementCoulombShearFvPatchVectorFiel d::updateCoeffs()
{
if (this->updated())
{
return;
}

vectorField n = patch().nf(); //face normals

const fvMesh& mesh = patch().boundaryMesh().mesh(); //mesh reference

const volSymmTensorField& sigmaV =
mesh.objectRegistry::lookupObject<volSymmTensorFie ld>("sigma"); // (effective) stress field

label patchID = patch().index();

symmTensorField sigmaP = sigmaV.boundaryField()[patchID]; // stress boundary field

vectorField t = sigmaP & n; // traction on boundary
scalarField smallField = scalarField(SMALL, sigmaP.size()) ;
scalarField nt = (t & n) + smallField ; // normal traction magnitude
vectorField st = t - ((t & n) * n) ; // shear traction

vectorField tt ;

forAll(patch(),iface)
{
if (mag(st[iface]) > (muFric_ * nt[iface]))
{
this->valueFraction()[iface] = sqr(n[iface]); // fixedValue only in n-direction
tt[iface] = (st[iface]/mag(st[iface])) * (muFric_ * nt[iface]); // friction traction
}
else
{ this->valueFraction()[iface] = I; // fixedValue in all directions
tt[iface] =0; // won't get used
}
}

bool incremental_ = 1;
scalarField pp = scalarField(sigmaP.size(), 0.0);


// gradient in DU for given traction
refGrad() = soilTractionBoundaryGradient::snGrad
(
tt, //traction
pp, //pressure
fieldName_,
"U",
patch(),
orthotropic_,
nonLinear_,
incremental_
);

directionMixedFvPatchVectorField::updateCoeffs();
}


What do u think about that, would that give me what i want or am I on a wrong track?
the scalar muFrac is read from dictionary as private data


It complies nicely but i get a segmentation error when running a simple case with the BC..
Probably i missed a pointer to data conversion somewhere?
DOMaier is offline   Reply With Quote

Old   August 29, 2019, 14:00
Default
  #3
Super Moderator
 
bigphil's Avatar
 
Philip Cardiff
Join Date: Mar 2009
Location: Dublin, Ireland
Posts: 1,097
Rep Power: 34
bigphil will become famous soon enoughbigphil will become famous soon enough
Hi,

I can see one possible cause of the segmentation fault, coming from the following line:
Code:
vectorField tt ;
You should initialise the size of the array otherwise the null constructor will set the size to zero i.e. it should be:
Code:
vectorField tt(sigmaP.size(), vector::zero);
Also, the following line:
Code:
scalarField smallField = scalarField(SMALL, sigmaP.size()) ;
should be changed to be:
Code:
scalarField smallField = scalarField(sigmaP.size(), SMALL) ;
as the field constructor requires SIZE as the first argument and the VALUE as the second.

I would also add a SMALL to the division when calculating the shear traction direction to avoid a floating point, and change "= 0" to "= vector::zero":
Code:
forAll(patch(),iface)
{
    if (mag(st[iface]) > (muFric_ * nt[iface])) 
    { 
    this->valueFraction()[iface] = sqr(n[iface]); // fixedValue only in n-direction
    tt[iface] = (st[iface]/(mag(st[iface]) + SMALL)) * (muFric_ * nt[iface]); // friction traction
}
else 
{
    this->valueFraction()[iface] = I; // fixedValue in all directions
    tt[iface] = vector::zero; // won't get used
}
}
Apart from that, it makes sense to me.

Philip
bigphil is offline   Reply With Quote

Old   September 5, 2019, 10:29
Default
  #4
New Member
 
Denis Maier
Join Date: Aug 2019
Posts: 17
Rep Power: 7
DOMaier is on a distinguished road
thank you a lot for the helpful remarks!


the last few days i was testing out the BC and i was making some minor changes.


The problem i have right now is that i get a snapping behavior of the friction boundary.
I think it comes from the fact, that i use the stress field from the old time step to determine the frictional stresses.
However, in the meantime i solved the DU-Eqn which is leading to a knew stress field.


Calculating an intermediate stress field and using that one to determine the frictional stresses destroys convergence of the solution completely.


Underrelaxation of the "intermediate" stress field doesn't help either.



Do you know how that problem is solved or different in the solidContact boundary?
DOMaier is offline   Reply With Quote

Old   September 5, 2019, 10:51
Default
  #5
Super Moderator
 
bigphil's Avatar
 
Philip Cardiff
Join Date: Mar 2009
Location: Dublin, Ireland
Posts: 1,097
Rep Power: 34
bigphil will become famous soon enoughbigphil will become famous soon enough
Hi Denis,

solidContact calculates the current stress and the friction condition is based on this; however, it uses a so-called penalty formulation (even stuck faces slip a small numerical amount) and does not use the valueFraction field.

But my feeling is that it should be possible to get it to converge using your approach; you may need to relax the valueFraction field as well as the value of the friction stress. Small under-relaxation values may be needed e.g. 0.01.

Philip
bigphil is offline   Reply With Quote

Reply

Tags
geotech, solid


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
sliding mesh problem in CFX Saima CFX 46 September 11, 2021 08:38
Centrifugal fan j0hnny CFX 13 October 1, 2019 14:55
Basic Nozzle-Expander Design karmavatar CFX 20 March 20, 2016 09:44
Accessing multiple boundary patches from a custom boundary condition file ripudaman OpenFOAM Programming & Development 0 October 22, 2014 19:34
Radiation interface hinca CFX 15 January 26, 2014 18:11


All times are GMT -4. The time now is 16:18.