JuliaFEM / JuliaFEM.jl

The JuliaFEM software library is a framework that allows for the distributed processing of large Finite Element Models across clusters of computers using simple programming models. It is designed to scale up from single servers to thousands of machines, each offering local computation and storage.
http://juliafem.github.io/JuliaFEM.jl/latest/
MIT License
252 stars 66 forks source link

Modifications to contact segmentation #101

Open ahojukka5 opened 7 years ago

ahojukka5 commented 7 years ago

See pull request #100. Currently contact is created

interface = Problem(Contact, "LOWER_TO_UPPER", 3, "displacement")
interface_slave_elements = create_surface_elements(mesh, "LOWER_TO_UPPER")
interface_master_elements = create_surface_elements(mesh, "UPPER_TO_LOWER")
update!(interface_slave_elements, "master elements", interface_master_elements)
interface.elements = [interface_slave_elements; interface_master_elements]

We should change this such a way only slave elements are in interface.elements and master elements are defined some other way, for example interface.master_elements. Original reason why master elements are in interface.elements is that displacement field must be updated to all elements to get gap calculation working as expected, so we need to figure out a way to update master elements also, maybe overriding some default problem update functions. Benefits:

  1. more clear postprocessing, master elements are not having Lagrange multipliers, in postprocess we have two surfaces overlapping and another is not having a surface pressure. Without any special treatment end result is something like this:

image

  1. doing something like
    pres = contact("contact pressure", time)
    avg_pres = mean(values(pres))
    std_pres = std(values(pres))

    gives wrong result, avg_pres takes also master side nodes with zero pressure and causing average surface pressure to be lower than it should be. std_pres is something nonzero even with constant pressure, see here:

13-Mar 12:18:03:INFO:root:max(abs(u3)) = 0.30000000000000027, std(abs(u3)) = 2.0788907607676161e-16
13-Mar 12:18:03:INFO:root:max(contact_pressure) = 172.80000000000163, std(contact_pressure) = 85.33983715052486

So this is potentially causing wrong interpretation of contact.