Karamba utilization results are higher than the OptiCroSec target utilization value

Hi there.

I’ve been working on a rather large GH definition for a timber building for which I am using a custom material csv-file and custom trapezoid cross sections to represent the squared solid timber members. The model worked well when I specified the cross sections for each element group. The resulting utilization for shell and beam elements were well below 100%.

In a next step, I wanted to test if the structure could be optimized using the OptiCroSec component. This is now the part that is giving me a headache. I defined a range of cross sections for each element group that I fed into the OptiCroSec component and specified a “start cross section” that I fed into the Assemble Model component. Further, I limited the displacement and set the target max. utilization to 0.7 (70%). The OptiCroSec component is not returning any error and the resulting cross sections per element are the same or larger than the start values I defined. However, the utilization values are way above the target value of 70%, both in the Beam/ShellView component and the UtilizationOfElements component. There are larger cross sections available in the lists I defined.
What could be the cause for this? Any help would be greatly appreciated; I am attaching some screenshots for clarification.

Oh, and I am working with Karamba 1.3.2 for Rhino6. Thanks a lot!!

Hi, are you able to share your definition so that we can take a look at it.


Hi Matthew,
Yes, of course. I’m attaching the GH file as well as the custom material table I’ve used. Since I didn’t find a way to internalize the table, you would have to load it into the file and adjust the two materials as indicated in the screenshot. Thanks a lot for looking into this.

200321_OptiCroSec_problem.gh (199.8 KB) MaterialProperties_custom.zip (1.6 KB)

Hi @KatharinaK,

sorry for the late reply. There are a couple of things to take note of:

I would not put your concrete slab in the definition. If you really want to place it in, then is it really only supported at the core and the column positions? However, one error is that your family for the cross section for the concrete slab and timber panels are the same, and it mixes this up in the optimisation process.

When I removed the concrete from the definition, I seem to meet the optimisation criteria as set.

Another issue to take note of is that Karamba3D does not automatically connect beams and shells if they simply lie on the same geometry. If you wish to model them as beams that support the slab, you should split all the beams at the mesh points so that the beams and slabs are really connected. You can see in the deformation image that they currently deform at different scales.

200321_OptiCroSec_problem_mt.gh (222.6 KB)

Hi Matthew,

Thanks for the reply. I changed the support points to the ground floor mesh vertices, which makes much more sense. I also tested the CroSec Optimization without the concrete slab and it seems to work fine.

Anyway, even if the optimization results are within the set displacement and utilization range now, the cross-section output for the shell elements is unclear, when I check the assigned cross-sections using the DisassembleElement component. The name (e.g. t=30cm for the slabs) does not correspond with the height (e.g. 20cm), even if the input list seems to be correct here (t=30 is 30cm height, t=20 is 20cm height etc).

Any idea where this is coming from? Is there anything wrong with my cross-section input?
I am also attaching the gh-file (you would need to load the material-csv file again).

Thanks for your help!

200401_OptiCroSec_output.gh (474.0 KB)


this is one thing that unfortunately doesnt update in the cros section names after optimising shells. The name is the original cross section that you set, but it optimises to a different height. You can bake the geometry and measure it or use the cross section render output to see the colour mapping to thickness.

We will see if we can resolve the naming issue in further updates. Thank you

Hi Matthew,
Following up on the previous post: I am using a C# component to retrieve the weight per material but can’t access the optimized cross section heights. When I try to access it through Karamba.CrossSections.CroSec_Shell.crosec.getHeight I am given the wrong thickness (the thickness that is shown in the ”CroSec names“ tag) instead of the actual thicknesses that I get through disassemble model, element and cross-sections. The value must be stored somewhere since it’s used for the total mass calculation within the OptiCroSec component, but I have trouble finding it. Any help would be greatly appreciated! Thanks!

Hi @KatharinaK,
if you need the mass try this: iterate through the elements of the model and call elem.weight(model.nodes()). In order to get from the weight to the mass on needs to do unit conversion. See here how it is done inside the Model-class:

    public double mass() 
        double e_mass = 0;
        foreach (ModelElement elem in elems)
            if (elem.is_active)
                e_mass += elem.weight(nodes);

        var g = INIReader.Instance().asDouble("gravity", 10.0);
        var cross_ucf = UnitsConversionFactories.CrossConvToBase();
        var cross_m = cross_ucf.m();
        e_mass /= cross_m.toBase(g);

        double p_mass = 0;
        foreach (PointMass pm in pmass)
            p_mass += pm.mass();

        return e_mass + p_mass;

Include Karamba.Utilities to get access to UnitsConversionFactories and INIReader. Inside the first loop you could differentiate between the materials.

– Clemens