Joint Surface Area

Hello all, new user here. I would like to kindly ask for advice on how to obtain the total surface area of all the joints in my 3DEC model.

Thank you in advance.

Hi!

The area of contacts is held in the subcontacts.

Quoting 3DEC documentation:

The sub-contact area is obtained by assigning to the point a region formed by 1/3 of the areas of the triangular faces containing the sub-contact and lying on the c-p. The area of the intersection of this region with the other block’s faces lying on the c-p is then calculated.
For face-to-face contact, [the area] is taken as one-half of this area, in order to account for the fact that the sub-contacts are established for vertices of both blocks, therefore resulting in two sets of parallel “springs.”

So, for getting the total area, you simply have to loop over all subcontacts in the model and sum up their areas:

Using Fish:

fish define joints_total_area
    local area
    loop foreach local subcontact block.subcontact.list()
        area += block.subcontact.area(subcontact)
    end_loop
    joints_total_area = area
end

Finally, A Python alternative would be:

def joints_total_area():
    return sum([subcontact.area() for subcontact in it.block.subcontact.list()])

:wrapped_gift: Bonus!
If you like the Pyhon-style one-liner solution but want to stick to Fish, you can take advantage of Fish splitting formulation:

fish define joints_total_area_split
    joints_total_area_split = list.sum(block.subcontact.area(::block.subcontact.list))

Cheers!

Theophile

1 Like

Thanks Theophile, really appreciate it!

I’ll give it a try :slight_smile:

Hi @Theophile

Can I please ask for your advice?

I’ve tried the FISH code on a simple UCS specimen with a saw-cut joint through the centre.

However, the I’m getting the area value of 0. Here is my script below and I am using 3DEC 7.0

Many thanks once again, I really appreciate your help! :grinning_face:

model new

block create drum center-1 = 0 0 0 center-2 = 0 0 10.5 edges = 50 radius-1 = 2.1 radius-2 = 2.1

; Assign joint through centre

block cut joint-set dip 0 dip-direction 90 origin 0 0 5.25

block zone generate edgelength 0.5

model save ‘UCS geometry’

fish define joints_total_area
local area
loop foreach local subcontact block.subcontact.list()
area += block.subcontact.area(subcontact)
end_loop
joints_total_area = area
end

image

Hi, @FauzanYudho !

I am truly sorry I missed your post :grimacing: (plus, I was on holidays).

You might have solved your issue since.
Just in case: when running your code, and calling [joints_total_area], I get a correct value corresponding to the expected area of a 2.1 m disk (~13.8 m²).

Cheers!

Theophile

Hi @Theophile ,

Thank you for your reply! Thankfully I noticed what was missing not long after I replied to your comment :smile:

Anyway, I really appreciated your help as it meant a lot in helping the work I am doing as a PhD student starting to learn 3DEC from scratch.

All the best!

Fauzan