Skip to main content

SCIA Engineer

New in v13.1.0

Several new objects can be constructed:

  • SolverSetup to configure (general) solver settings
  • ProjectData to set basic project information
  • Library cross-sections using Model.create_library_cross_section()
  • Cross-links using Model.create_cross_link()
New in v12.4.0

A NonLinearLoadCombination can be used in a ResultClass.

Decimal separator

The XML representation of the SCIA model generated by VIKTOR's SCIA binding represents floating point numbers using the ,-character as decimal separator. Please make sure to set the (worker) machine's decimal separator to , before importing the file in SCIA, to prevent numbers being stripped of their decimals.

Supported (tested) SCIA versions:

  • v21
  • v20
  • v19

VIKTOR's SCIA integration requires a specific SCIA worker which can be downloaded here.

Creating and analyzing a SCIA model in VIKTOR consists of the following steps:

  1. Create the empty model.
  2. Fill the model with the desired parts (e.g. nodes, beams, load cases, forces, etc.), by calling the corresponding create_xxx() methods.
  3. Generate the XML representation of the SCIA model.
  4. Run the SCIA analysis with the generated XML input file and a user-created esa template file.
  5. Obtain the results

In code this looks like:

from viktor.external.scia import SciaAnalysis, Material, Model# 1. Create the empty modelmodel = Model()# 2. Fill the model with the parts (to be extended as desired)cross_section = model.create_rectangular_cross_section('rectangular_section', Material(455, 'test_material'), 100, 100)n1 = model.create_node('n1', 0, 0, 0)n2 = model.create_node('n2', 1, 0, 0)model.create_beam(n1, n2, cross_section, name='test_beam')# 3. Generate the XML input filexml_file, def_file = model.generate_xml_input()# 4. Run the SCIA analysisesa_file = File.from_path('my_template.esa')scia_analysis = SciaAnalysis(xml_file, def_file, esa_file)scia_analysis.execute(300)# Obtain the resultsanalysis_result = scia_analysis.get_xml_output_file()

The ESA template file

The ESA file must be created by the user by using the SCIA interface. It functions as the template to which the model is added. The materials used in the VIKTOR model must exist in the ESA template file: both the name and id of the material must match. The SCIA version in which the template file was created must match the SCIA version called by the worker.

note

An I/O document has to be defined in the .esa file, which has to be named "output". If not defined, the worker will not be able to write this expected document and fails to execute.

Example I/O document of the esa model

Supported parts

Currently, the creation of the following SCIA parts is (fully, or partially) supported in VIKTOR:

Libraries:

Structure:

Results:

Supports:

Sets:

Loads:

Misc.:

Testing

New in v13.3.0

mock_SciaAnalysis decorator for easier testing of SciaAnalysis

Model.generate_xml_input and SciaAnalysis.execute need to be mocked within the context of (automated) testing.

The viktor.testing module provides the mock_SciaAnalysis decorator that facilitate mocking of workers:

import unittestfrom viktor.core import Filefrom viktor.testing import mock_SciaAnalysisfrom app.my_entity_type.controller import MyEntityTypeControllerclass TestMyEntityTypeController(unittest.TestCase):    @mock_SciaAnalysis(        get_engineering_report=File.from_path('test_file.pdf'),        get_updated_esa_model=File.from_path('test_file.esa'),        get_xml_output_file=File.from_path('test_file.xml'),    )    def test_scia_analysis(self):        MyEntityTypeController().scia_analysis()

For the decorator's input parameters the following holds:

  • If a Sequence type is provided, the next entry is returned for each corresponding method call. When a call is performed on a depleted iterable, an Exception is raised.
  • If a single object is provided, the object is returned each time the corresponding method is called (endlessly).
  • If None is provided (default), a default File/BytesIO object (with empty content) is returned each time the corresponding method is called (endlessly).