How to prescribe a jump at contact elements for esys.finley

Asked by Sebastian Langer

I am using esys.finley to solve the elastic deformation equation for displacement. Currently I am "welding" the two sides of the interface together. I get good results for the displacement field. The two sides of the discontinuity have zero displacement in normal and tangential direction.

I am doing that like this:

loadingPDE=LinearPDE(domain)
loadingPDE.setSymmetryOn()
kron=escript.kronecker(escript.FunctionOnContactOne(domain))
En=Etau=escript.sup(self.lam+2/3.*self.mu)
normal=escript.FunctionOnContactOne(domain).getNormal()
dfactor=En*escript.outer(normal,normal)+Etau*(kron-escript.outer(normal,normal))
force=numpy.array([0.,0.])
loadingPDE.setValue(A=hookesTensor,d_contact=dfactor,X=self.properties['appliedStress'])
self.displacement=loadingPDE.getSolution()
for i in range(ITERATIONS):
    jmp=escript.jump(self.displacement)
    force=escript.matrix_mult(dfactor,jmp)+force
    loadingPDE.setValue(y_contact=-force)
    self.displacement=loadingPDE.getSolution()

However I would like to be able to prescribe a non-zero jump tangential to the discontinuity. As a workaround I could weld the interface, solve for displacement and then fix the displacement using loadingPDE.setValue(r=<displacement from resulting self.displacement above plus jump>) at the contact elements to set the jump to a fixed value. However then I'd fix the absolute location of the discontinuity as well where ideally I would want the discontinuity as a whole being able to move.

Would anybody know of way how to set the jump - in the user guide denoted as [u] - in escript?

Question information

Language:
English Edit question
Status:
Solved
For:
esys-escript Edit question
Assignee:
No assignee Edit question
Solved by:
Lutz Gross
Solved:
Last query:
Last reply:
Revision history for this message
Best Lutz Gross (l-gross) said :
#1

Unfortunately there is no direct way to set the displacement jump over a contact element (one could add this functioninality). But you can just extend your iteration scheme:

if d_n and d_tau are the normal and tangential displacement you want to set for jmp you set

force=force + (escript.matrix_mult(dfactor,jmp)- En* d_n*normal - Etau * d_t*tangential )

with tangential=normal[0]*[0,1]-normal[1] * [1,0]

and

loadingPDE.setValue(y_contact=force + ( En* d_n*normal + Etau * d_t*tangential)

When you have convergence in the i loop (force does not change) you have "escript.matrix_mult(dfactor,jmp)- En* d_n*normal - Etau * d_t*tangential " which translates into jump = d_n*normal + d_t*tangential which is what you want. moreover in the PDE you have on contact elements

escript.matrix_mult(dfactor,jmp) and force + ( En* d_n*normal + Etau * d_t*tangential)

where escript.matrix_mult(dfactor,jmp) and ( En* d_n*normal + Etau * d_t*tangential) are cancelling and so force gives you the traction vector on the contact.

Revision history for this message
Sebastian Langer (s-langer) said :
#2

Thanks, Lutz! It works. This solved my question.