Error in loop calculation via API

I am using MATLAB to run a Python script in a loop that performs RSTAB calculations. However, after a certain number of iterations, RSTAB always crashes. At the moment, the calculation can no longer be started at all. My error message is:

Python Error: RuntimeError: gRPC connection check failed (UNAVAILABLE). Cannot connect to 'localhost:9000'. Check that RSTAB is running and that URL/port are correct. Original gRPC details: failed to
connect to all addresses; last error: UNAVAILABLE: ipv4:127.0.0.1:9000: ConnectEx: Connection refused (No connection could be made because the target machine actively refused it.

-- 10061)

I would appreciate your help.
Thank you very much,
Best regards,
Alex Müllner

Hi alex.muellner,

Without seeing the script, it’s naturally difficult to give a definite answer. But one possible cause could be connection management: if a new gRPC connection to RSTAB is established on every MATLAB iteration but not fully closed, resources could accumulate over time and eventually cause a crash. The UNAVAILABLE / Connection refused (10061) error would then occur as well. So it’s worth checking whether the connection is properly released after each iteration and whether a new connection is even needed for every loop iteration.

Happy coding.

Best regards,
Robert Milrath

Hello Robert,

Thanks for the information. The Python code currently looks as shown in the attachment. I set up the connection according to your webinar. Would it make sense to add something at the end of the script to close the connection? If so, how would I do that?

import dlubal.api
from dlubal.api import rstab, common
from math import inf
from dlubal.api.rstab.types_for_members import MemberDefinableStiffness
from dlubal.api.rstab.structure_core import Node
from dlubal.api.rstab.loads import MemberLoad
import dlubal.api.rstab.loads as loads
import inspect

with rstab.Application(api_key_value="Hier mein Key", url="localhost", port=9000) as rstab_app:

model = rstab_app.get_active_model()

# Definition Z Knoten Obergurt---------------------------------------------------------------------------
nodes_to_update = []

node_numbers = [int(n) for n in NodeNo_Obergurt]

for node_no in node_numbers:

    my_node = Node(
        no=node_no,
        coordinate_3=float(Z_Obergurt)
    )

    nodes_to_update.append(my_node)

rstab_app.update_object_list(nodes_to_update)

# Definition Z Knoten Querstaebe---------------------------------------------------------------------------
nodes_to_update = []

node_numbers = [int(n) for n in NodeNo_Querstaebe_Pendel]

for node_no in node_numbers:

    my_node = Node(
        no=node_no,
        coordinate_3=float(Z_Querstaebe)
    )

    nodes_to_update.append(my_node)

rstab_app.update_object_list(nodes_to_update)

# Definition Querstaebe Pendel--------------------------------------------------------------------------------
stiff_quer_pendel = MemberDefinableStiffness()
stiff_quer_pendel.no = 1
stiff_quer_pendel.assigned_to.extend([int(x) for x in Member_Querstaebe_Pendel])

stiff_quer_pendel.bending_stiffness_y = Querstaebe_Pendel_EIy
stiff_quer_pendel.axial_stiffness = Querstaebe_Pendel_EA
stiff_quer_pendel.shear_stiffness_z = Querstaebe_Pendel_GAz
stiff_quer_pendel.torsional_stiffness = 0
stiff_quer_pendel.bending_stiffness_z = 0

rstab_app.update_object(stiff_quer_pendel)

# Definition Kerven--------------------------------------------------------------------------------
stiff_quer = MemberDefinableStiffness()
stiff_quer.no = 2
stiff_quer.assigned_to.extend([int(x) for x in Member_Kerven])

stiff_quer.bending_stiffness_y = Kerven_EIy
stiff_quer.axial_stiffness = Kerven_EA
stiff_quer.shear_stiffness_z = Kerven_GAz
stiff_quer.torsional_stiffness = 0
stiff_quer.bending_stiffness_z = 0

rstab_app.update_object(stiff_quer)


# Definition Untergurt--------------------------------------------------------------------------------
stiff_unter = MemberDefinableStiffness()
stiff_unter.no = 3
stiff_unter.assigned_to.extend([int(x) for x in Member_Untergurt_Holz])

stiff_unter.bending_stiffness_y = Untergurt_EIy
stiff_unter.axial_stiffness = Untergurt_EA
stiff_unter.shear_stiffness_z = Untergurt_GAz
stiff_unter.torsional_stiffness = 0
stiff_unter.bending_stiffness_z = 0

rstab_app.update_object(stiff_unter)


# Definition Obergurt--------------------------------------------------------------------------------
stiff_ober = MemberDefinableStiffness()
stiff_ober.no = 4
stiff_ober.assigned_to.extend([int(x) for x in Member_Obergurt_Beton])

stiff_ober.bending_stiffness_y = Obergurt_EIy
stiff_ober.axial_stiffness = Obergurt_EA
stiff_ober.shear_stiffness_z = Obergurt_GAz
stiff_ober.torsional_stiffness = 0
stiff_ober.bending_stiffness_z = 0

rstab_app.update_object(stiff_ober)


# Definition Last-------------------------------------------------------------------------------------
# retrieve existing load
load = rstab_app.get_object(
    MemberLoad(no=1, load_case=1)
)

# change members
load.members.clear()
load.members.extend([int(x) for x in LoadMembers])

# change magnitude
load.magnitude = float(LoadValue)

# update existing object
rstab_app.update_object(load)

# Calculate--------------------------------------------------------------------------------------
rstab_app.calculate_all(skip_warnings=True)


# Ergebnisse Kerve1--------------------------------------------------------------------------------------
members = [int(x) for x in Member_Kerve1]

filter_expression = ",".join(str(m) for m in members)

results = rstab_app.get_results(
    results_type=rstab.results.ResultsType.STATIC_ANALYSIS_MEMBERS_INTERNAL_FORCES,
    filters=[
        rstab.results.ResultsFilter(
            column_id="loading",
            filter_expression="LC1"
        ),
        rstab.results.ResultsFilter(
            column_id="member_no",
            filter_expression=filter_expression
        )
    ]
)

df = results.data

Kerve1_Querkraft = df[
    ["member_no", "v_z"]
].astype("float64").to_numpy()

# Ergebnisse Kerve2--------------------------------------------------------------------------------------
members = [int(x) for x in Member_Kerve2]

filter_expression = ",".join(str(m) for m in members)

results = rstab_app.get_results(
    results_type=rstab.results.ResultsType.STATIC_ANALYSIS_MEMBERS_INTERNAL_FORCES,
    filters=[
        rstab.results.ResultsFilter(
            column_id="loading",
            filter_expression="LC1"
        ),
        rstab.results.ResultsFilter(
            column_id="member_no",
            filter_expression=filter_expression
        )
    ]
)

df = results.data

Kerve2_Querkraft = df[
    ["member_no", "v_z"]
].astype("float64").to_numpy()

# Ergebnisse Kerve3--------------------------------------------------------------------------------------
members = [int(x) for x in Member_Kerve3]

filter_expression = ",".join(str(m) for m in members)

results = rstab_app.get_results(
    results_type=rstab.results.ResultsType.STATIC_ANALYSIS_MEMBERS_INTERNAL_FORCES,
    filters=[
        rstab.results.ResultsFilter(
            column_id="loading",
            filter_expression="LC1"
        ),
        rstab.results.ResultsFilter(
            column_id="member_no",
            filter_expression=filter_expression
        )
    ]
)

df = results.data

Kerve3_Querkraft = df[
    ["member_no", "v_z"]
].astype("float64").to_numpy()    

# Ergebnisse Untergurt--------------------------------------------------------------------------------------
members = [int(x) for x in Member_Untergurt_Holz]

filter_expression = ",".join(str(m) for m in members)

deformations = rstab_app.get_results(
    results_type=rstab.results.ResultsType.STATIC_ANALYSIS_MEMBERS_GLOBAL_DEFORMATIONS,
    filters=[
        rstab.results.ResultsFilter(
            column_id="loading",
            filter_expression="LC1"
        ),
        rstab.results.ResultsFilter(
            column_id="member_no",
            filter_expression=filter_expression
        )
    ]
)

df_disp = deformations.data

Untergurt_Verformung = df_disp[
["member_no", "u_z"]
].astype("float64").to_numpy()

members = [int(x) for x in Member_Untergurt_Holz]

filter_expression = ",".join(str(m) for m in members)

results = rstab_app.get_results(
    results_type=rstab.results.ResultsType.STATIC_ANALYSIS_MEMBERS_INTERNAL_FORCES,
    filters=[
        rstab.results.ResultsFilter(
            column_id="loading",
            filter_expression="LC1"
        ),
        rstab.results.ResultsFilter(
            column_id="member_no",
            filter_expression=filter_expression
        )
    ]
)

df = results.data

Untergurt_Moment = df[
    ["member_no", "m_y"]
].astype("float64").to_numpy()

Untergurt_Normalkraft = df[
    ["member_no", "n"]
].astype("float64").to_numpy()

# Ergebnisse Obergurt--------------------------------------------------------------------------------------
members = [int(x) for x in Member_Obergurt_Beton]

filter_expression = ",".join(str(m) for m in members)

results = rstab_app.get_results(
    results_type=rstab.results.ResultsType.STATIC_ANALYSIS_MEMBERS_INTERNAL_FORCES,
    filters=[
        rstab.results.ResultsFilter(
            column_id="loading",
            filter_expression="LC1"
        ),
        rstab.results.ResultsFilter(
            column_id="member_no",
            filter_expression=filter_expression
        )
    ]
)

df = results.data

Obergurt_Moment = df[
    ["member_no", "m_y"]
].astype("float64").to_numpy()

Obergurt_Normalkraft = df[
    ["member_no", "n"]
].astype("float64").to_numpy()

#results.data.to_excel("member_forces.xlsx", index=False)

Hello @alex.muellner,

We are currently investigating the problem. I’m in contact with the developer responsible for it.

My current understanding is that the problem is related to uploading API usage data to our server. There is probably another issue causing this crash as well. The problem occurs sporadically, which makes the analysis more difficult.

Unfortunately, we currently don’t know of any way to work around the problem. As soon as I have any new findings, I’ll post them here.

Best regards,
Frank

Dear Dlubal team,

Are there any proposed solutions to the problem yet? It has now been two weeks, and the current situation is making it extremely difficult to work with the software.

Best regards,
Alex Müllner

Hello @alex.muellner,

The issue is still being worked on. I’ll have to ask you to be patient a little longer.

Best regards,
Frank Faulstich