Terms & Conditions


Go to -> Company Details

Go to -> Licensing of Oasys software – Licensing Documentation PDF

Go to -> Help with ordering

Privacy and Cookies

Data Security

Website Terms and Conditions

Software Licensing Terms

Privacy and Cookies

We may change this privacy notice from time to time by updating this page.

What information do we collect?

When you use this website, we may collect the following information:

  • the areas of the website that you visit
  • information about your computer, such as which browser you are using, your network location, the type of connection you are using (e.g. broadband, ADSL etc) and your IP address

We do this by using cookies, which are small files that help us track how our visitors use the website and enable us to understand where we can improve your experience. If you would like to find out which cookies we use and the information they track see our Cookies Policy.

Once you submit or register information through our website we will know who you are and your activities on this website and information about you and/or your company may be recorded on our systems. For example, we may ask for personal information when you download our software including:

  • your name
  • company name
  • email address
  • postal address
  • telephone number
  • country where you are based
  • Social media ID
  • your comments/questions
  • services/markets you are interested in

We may also collect personal information from telephone calls and/or other correspondence with you.

What do we do with the information we collect?

The information we capture is used for various purposes. The main purpose is to provide you with our services (whether available via the website or offline). We also use the information for:

  • website development
  • understanding how our visitors interact on the website
  • understanding what our clients are interested in
  • understanding what potential clients are interested in
  • dealing with enquiries/concerns
  • marketing our services and people to you
  • market research
  • service development
  • internal record keeping


We would like to provide you with information about our services and other information which we think you may find interesting. We may send you such information by post, email and/or telephone, unless you have asked us not to do so.

We will not provide your personal information to other organisations for marketing purposes without your explicit consent.

If at any time you do not want your information used for direct marketing purposes, please contact us or follow the unsubscribe link in our marketing email messages.

Who do we share this information with?

We may share your personal information with companies acting on our behalf who will only use the information to provide that service. However, we will retain control of your data and any third party service provider that we use must act in accordance with our instructions. We may also share your personal information with a purchaser or potential purchaser of our business.

In some circumstances, we may have to disclose your personal information by law, because a court or the police or other law enforcement agency has asked us for it.

How to get copies of or amend the information we have collected

You may request details of the personal information that we hold about you under data protection laws. If you would like a copy of the information held about you please write to us at oasys@arup.com or at: Data Protection Officer, 13 Fitzroy Street, London, UK, W1T 4BQ. Please note that we may charge a small £10 administration fee for information requests.

If you think any information we have about you is incorrect or incomplete, please email us as soon as possible. We will correct or update any information as soon as we can.

top ]

Data Security

We are committed to ensuring that your information is secure. In order to prevent unauthorised access or disclosure we have put in place suitable physical, electronic and managerial procedures to safeguard and secure the information we collect, including locked cabinets, electronic password protection and pass card access to buildings.

If at any point you suspect or receive a suspicious communication from someone suggesting they work for Oasys or a website claiming to be affiliated with Oasys, please forward the communication to us or report the incident by email to oasys@arup.com or in writing to Oasys, 13 Fitzroy Street, London, UK, W1T 4BQ as soon as possible.

top ]

Website Terms and Conditions

The contents of this web site are protected by copyright and other intellectual property rights under international conventions. No copying of any words, images, graphic representations or other information contained in this web site is permitted without the prior written permission of the webmaster for this site.

Oasys accepts no responsibility for the content of any external site that links to or from this site.

top ]

Software Licensing Terms

Terms and Conditions of Purchase

The full conditions of purchase and maintenance for all Oasys software are set out in the Oasys Software Licence and Support Agreement. All prices are subject to TAX at the current rate.

Prices and specifications are subject to change without notice – please ask for a written quotation.

Although every care has been taken to ensure the accuracy of all information contained herein, the contents do not form or constitute a representation, warranty, or part of any contract.

Superseded Versions of Terms and Conditions

Oasys keeps copies of all superseded versions of its terms and conditions.

Maintenance & Support Services

Twelve months support and maintenance is included with most products. Thereafter maintenance is typically 20% of the current sales price.

An annual maintenance service is available for most programs after the first year.

This service includes:

  • telephone/fax/email/web based support
  • free software updates available via internet download
  • personalised output header for many products

Exploring the Design Space

By Peter Debney

For the last few years I have been giving a lecture at Leeds University on design optimisation techniques, but the one thing that always bothered me was a sketch that I did of an example design space. This sketch was just that, a simple block diagram indicating what I assumed it would look like. When I had the opportunity to write the lecture up for a paper in The Structural Engineer, I realised that the time had come to do it properly.

First, some background: what is it that we mean by a Design Space? It is essentially a very useful way to think about the design options, and can consider things like steel or concrete, flat slab or beam and slab, column spacing, etc. down to what beam sizes to choose. It is sometimes also called the Search Space or Phase Space. If we consider each option type is a dimension then the result is a plane (2 options), a cube (3 options), or a hypercube (4 or more options) where all the possibilities exist. The trick is to find where our economical yet functional design sits in this space.

For this example I wanted a structure that had just two dimensions of choice, so that I could draw it, yet also exhibited interesting or complex behaviour. I chose two beams of equal length joined to each other mid span, with a central point load. Obviously one design result is that the two beams are the same size and they carry the load equally. The other is that one beam does all the work while its partner just gives restraint.

The design principle was simple too: analyse the beams, determine the moments, and choose the lightest or cheapest beam that can carry the load. In design space terms, we start from one location (the two analysed beam sizes) and jump to another (the two sections from the design). You might refer to this as a quasi-Newton heuristic, if you were so inclined.

Two solutions

The problem with this this method on this structure is one of moment interaction. The moments are proportional to the beams’ relative stiffnesses, with the stiffer beam attracting more moment. When we design the beams, the stiffer beam can thus increase in size more than the lighter one, attracting more moment, and so on. The result is that it can take several steps to converge on a stable answer (the analysed sections are the same ones found in the design).

There are nearly 100 universal beam sections in the UK catalogue, giving us close on 10,000 possible locations in the design space for this simple structure. Normally we might just make a good guess at the initial sizes and take it from there, but for this exercise I wanted to map every point of the design space.

To do all 10,000 calculations by hand would be tedious, even if we halved it by taking the problem’s symmetry into account. Instead I wrote a Python script to work with the model, testing each option and outputting the results to a spreadsheet-friendly csv file.

As this script was to work with a single model I could afford to take some shortcuts. For example as I know that there are only two members then I don’t need the script to either count them or check for their existence when looping through the list. Neither do I need to read the design properties so that I can update them; instead I can hard code the design values into the script. Also, if this script was actually optimizing the structure we would get it to update the analysed sections with the ones found by the design, then repeat until no sections changed. So instead of a quasi-Newton optimisation we will get a map of how the quasi-Newton method would traverse the space.

In this model I placed all the section sizes I wanted to check, placing them into weight order. Price order was another option, combining TATA’s published price modifiers with the current base price. By doing this, then always working upwards through the list during the design check, we will either get the lightest or cheapest section that can carry the load.

The first version of this script works through all the possible pairs of beams, then determines the new pair that will carry the moment. In this instance I first reduced the section list by removing any section that has a lower moment capacity (effective length 5 m) than a lighter section. This reduced the section list down to a third, and thus the design space by a factor of nine to just over 1,000. Apart from greatly speeding up the investigation, it should also remove any sections that would not be chosen anyway: a double advantage. It is almost always worth the effort to remove the options that cannot be chosen, and the advantage grows with the dimensions of the design space. With two beams the reduction was to (1/3)2, with three beams (1/3)3, and so on.

Looking at the results we can see that if the initial sections are the same then the resulting beams will also be, as we would expect. If the sections are reasonably light then the self-weight does not play a significant part in the moment and we jump straight to the final answer. If we start at the heavy end then it can take a couple of iterations to converge.

Deviating a little from this symmetry takes us to a nearly symmetrical solution, which I did not expect. Make the starting point a little more uneven and we diverge off to the extremes, where one beam does all the work. Because the ratio of stiffnesses is changing so radically, it can take over half a dozen steps to converge. An especially interesting aspect is that the quasi-Newton method would not actually converge in this instance, as we get an oscillation between two sections for the restraining beam. A robust optimisation routine will have to watch out for this and fix on the one option that can carry the load.

The next stage was to investigate the question of design fitness. Fitness, or how close the answer is to the ideal, or how much better is an answer is compared to another, is a key metric in a number of optimisation routines, such as genetic algorithms and particle swarms. The problem is how can we define the fitness of a structural design solution? Weight or cost needs to be one aspect, but the lightest beams are no good if they cannot carry the load. Thus we also need to take capacity or utilisation into account. Also, because a beam that is not quite strong enough can be the gateway to one that it, we cannot simply exclude all beams that fail, but we should penalise them. Thus a beam at 95% utilisation is clearly better than one at 105%, but how do we compare one just over at 105% to an inefficient one at 5%? In this example I chose to measure the fitness as the unity factor if it is equal or below 1.0, and one over twice the unity factor if it is over.

Once we have the fitness of every beam pair we can then use them to contour the design space. If we take just the reduced section selection from above then we get a reasonable ridge that includes the results found by the quasi-Newton method.

Optimised design space terrain

On the other hand if we take all the 96 UB sections then the picture is not quite so clear. We still get a ridge but the terrain is considerably rougher. If we were using a gradient method then we might struggle to get all the way to the highest peak.

Unoptimised design space terrain

My Python 3.5 code is included below, plus the original GSA file. Please feel free to improve it and don’t forget to change the directory path to match your own!

## GSA Steel Design ##
import win32com.client
import pythoncom
import csv

# functions
def util(n):  # calculate how close the section design is to unity
    if n > 1:
        result = 1 / (2*n)  # penalise beams that fail
        result = n
    return result

# variables - edit the directory to suit !
directory = "C:\\Users\\peter.debney\\Documents\\Visual Studio projects\\PythonSteelDesign\\"
model = "Cruciform.gwb"   # GSA file
sect_min = 1   # number of first section profile
sect_max = 32   # number of last section profile

# open GSA model
gsa_obj = win32com.client.Dispatch("Gsa_8_7.ComAuto")  # early binding
gsa_obj.Open(directory + model)

# create output file
with open('results.csv', 'w', newline = '') as csv_data:
    output_file = csv.writer(csv_data)

    for i in range(sect_min, sect_max + 1):   # loop through steel beams
        row_array = []   # create empty row array
        for j in range(sect_min, sect_max + 1):   # loop through steel beams
            # set new member sections
            MembText1 = ("MEMB	1		NO_RGB	MT_STEEL	MB_BEAM	" + str(i) +
                        "	1	1	1	4	2	0.000000	0	0.000000	NO_RLS	NO_OFFSET	")
            MembText2 = ("MEMB	2		NO_RGB	MT_STEEL	MB_BEAM	" + str(j) +
                         "	1	1	1	5	3	0.000000	0	0.000000	NO_RLS	NO_OFFSET	")

            gsa_obj.Delete("RESULTS")  # delete analysis results
            gsa_obj.Tool_UpdateElemSections()   # set element sections to match members
            gsa_obj.Analyse()  # run analysis

            for ii in range(sect_min, sect_max + 1):  # find section for member 1
                MembText1 = ("MEMB	1		NO_RGB	MT_STEEL	MB_BEAM	" + str(ii) +
                                "	1	1	1	4	2	0.000000	0	0.000000	NO_RLS	NO_OFFSET	")
                # design check - OP_INIT_1D_AUTO_PTS = 0x20 (32) calculate 1D results at interesting points
                iStat = gsa_obj.Output_Init(0x20, "default", "A1", 14006001, 0)
                if gsa_obj.Output_Extract(1, 0) < 1:  # stop when suitable section found

            for jj in range(sect_min, sect_max + 1):  # find section for member 2
                MembText1 = ("MEMB	2		NO_RGB	MT_STEEL	MB_BEAM	" + str(jj) +
                             "	1	1	1	5	3	0.000000	0	0.000000	NO_RLS	NO_OFFSET	")
                # design check - OP_INIT_1D_AUTO_PTS = 0x20 (32) calculate 1D results at interesting points
                iStat = gsa_obj.Output_Init(0x20, "default", "A1", 14006001, 0)
                if gsa_obj.Output_Extract(2, 0) < 1:  # stop when suitable section found

            # output the resulting member sizes
            row_array.append(str(ii) + " + " + str(jj))
            ## calculate average efficiency of structure and add to the results array
            #row_array.append((util(gsa_obj.Output_Extract(1, 0)) + util(gsa_obj.Output_Extract(2, 0))) / 2)

        output_file.writerow(row_array)   # add results array to output csv file



Following on from conversations with various readers concerning changing the above code to work with Python 2.7, substituting the following line to open the CSV results file seems to work:

# create output file
with open('results.csv', 'w') as csv_data:
    output_file = csv.writer(csv_data, lineterminator='\n')

Require more information?

  • This field is for validation purposes and should be left unchanged.

Newsletter Sign up

Please fill out your details below to receive the latest oasys news.
  • This field is for validation purposes and should be left unchanged.